From b78480a4c10e5fbcc0a01c084d5b670e9ece3c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Wed, 1 Nov 2023 23:53:02 +0000 Subject: [PATCH 01/48] =?UTF-8?q?=E2=9C=A8=20implement=20fp-ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package-lock.json | 6 +++ package.json | 3 +- .../core/angular/getResponseBody.hbs | 31 +++++++++++++++- src/templates/core/angular/request.hbs | 27 ++++++++++++++ src/templates/core/axios/getResponseBody.hbs | 33 +++++++++++++++-- src/templates/core/axios/request.hbs | 27 ++++++++++++++ src/templates/core/fetch/getResponseBody.hbs | 33 +++++++++++++++-- src/templates/core/fetch/request.hbs | 27 ++++++++++++++ src/templates/core/node/getResponseBody.hbs | 33 +++++++++++++++-- src/templates/core/node/request.hbs | 27 ++++++++++++++ src/templates/core/xhr/getResponseBody.hbs | 37 ++++++++++++++++--- src/templates/core/xhr/request.hbs | 27 ++++++++++++++ src/templates/exportService.hbs | 9 +++-- src/templates/partials/exportInterface.hbs | 2 +- src/templates/partials/header.hbs | 3 ++ src/templates/partials/isNullable.hbs | 2 +- src/templates/partials/isRequired.hbs | 6 +-- src/templates/partials/parameters.hbs | 4 +- src/templates/partials/typeArray.hbs | 4 +- src/templates/partials/typeDictionary.hbs | 4 +- src/templates/partials/typeEnum.hbs | 3 +- src/templates/partials/typeGeneric.hbs | 2 +- src/templates/partials/typeInterface.hbs | 8 ++-- src/templates/partials/typeIntersection.hbs | 2 +- src/templates/partials/typeReference.hbs | 2 +- src/templates/partials/typeUnion.hbs | 2 +- 26 files changed, 321 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32c4bc4b9..39759e672 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "camelcase": "^6.3.0", "commander": "^11.0.0", + "fp-ts": "^2.16.1", "fs-extra": "^11.1.1", "handlebars": "^4.7.7", "json-schema-ref-parser": "^9.0.9" @@ -9369,6 +9370,11 @@ "node": ">= 0.6" } }, + "node_modules/fp-ts": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.1.tgz", + "integrity": "sha512-by7U5W8dkIzcvDofUcO42yl9JbnHTEDBrzu3pt5fKT+Z4Oy85I21K80EYJYdjQGC2qum4Vo55Ag57iiIK4FYuA==" + }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", diff --git a/package.json b/package.json index 2b3afa696..687ed6def 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "dependencies": { "camelcase": "^6.3.0", "commander": "^11.0.0", + "fp-ts": "^2.16.1", "fs-extra": "^11.1.1", "handlebars": "^4.7.7", "json-schema-ref-parser": "^9.0.9" @@ -121,7 +122,7 @@ "typescript": "5.1.6", "zone.js": "0.13.3" }, - "overrides" : { + "overrides": { "node-fetch": "2.6.9", "rollup": "3.26.1", "typescript": "5.1.6" diff --git a/src/templates/core/angular/getResponseBody.hbs b/src/templates/core/angular/getResponseBody.hbs index 73653784c..91d5c424c 100644 --- a/src/templates/core/angular/getResponseBody.hbs +++ b/src/templates/core/angular/getResponseBody.hbs @@ -1,6 +1,33 @@ +const createOptionProxy = (value: T): O.Option => + value === undefined || value === null ? { '_tag': 'None' } + : new Proxy>>({ + '_tag': 'Some', + value, + }, { + get: (target, prop) => { + if (prop === '_tag') { + return target._tag; + } + if (prop === 'value') { + return target.value; + } + const val = target.value[prop]; + if (val === undefined || val === null) { + return createOptionProxy(val); + } + return typeof val === 'function' ? val.bind(target.value) : val; + } + }); + +const convertResponseBody = (body: unknown): any => + body === undefined || body === null ? { '_tag': 'None' } + : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) + : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : createOptionProxy(body); + export const getResponseBody = (response: HttpResponse): T | undefined => { if (response.status !== 204 && response.body !== null) { - return response.body; + return convertResponseBody(response.body); } - return undefined; + return convertResponseBody(undefined); }; diff --git a/src/templates/core/angular/request.hbs b/src/templates/core/angular/request.hbs index 57c98516e..fc413feb3 100644 --- a/src/templates/core/angular/request.hbs +++ b/src/templates/core/angular/request.hbs @@ -58,6 +58,32 @@ import type { OpenAPIConfig } from './OpenAPI'; {{>functions/catchErrorCodes}} +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(value => convertRequestBody(value)); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; /** * Request method @@ -68,6 +94,7 @@ import type { OpenAPIConfig } from './OpenAPI'; * @throws ApiError */ export const request = (config: OpenAPIConfig, http: HttpClient, options: ApiRequestOptions): Observable => { + options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); diff --git a/src/templates/core/axios/getResponseBody.hbs b/src/templates/core/axios/getResponseBody.hbs index c73057c3c..a35fbf32c 100644 --- a/src/templates/core/axios/getResponseBody.hbs +++ b/src/templates/core/axios/getResponseBody.hbs @@ -1,6 +1,33 @@ -export const getResponseBody = (response: AxiosResponse): any => { +const createOptionProxy = (value: T): O.Option => + value === undefined || value === null ? { '_tag': 'None' } + : new Proxy>>({ + '_tag': 'Some', + value, + }, { + get: (target, prop) => { + if (prop === '_tag') { + return target._tag; + } + if (prop === 'value') { + return target.value; + } + const val = target.value[prop]; + if (val === undefined || val === null) { + return createOptionProxy(val); + } + return typeof val === 'function' ? val.bind(target.value) : val; + } + }); + +const convertResponseBody = (body: unknown): any => + body === undefined || body === null ? { '_tag': 'None' } + : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) + : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : createOptionProxy(body); + +export const getResponseBody = (response: HttpResponse): T | undefined => { if (response.status !== 204) { - return response.data; + return convertResponseBody(response.data); } - return undefined; + return convertResponseBody(undefined); }; diff --git a/src/templates/core/axios/request.hbs b/src/templates/core/axios/request.hbs index 6612f1614..8e6f15e83 100644 --- a/src/templates/core/axios/request.hbs +++ b/src/templates/core/axios/request.hbs @@ -61,6 +61,32 @@ import type { OpenAPIConfig } from './OpenAPI'; {{>functions/catchErrorCodes}} +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(value => convertRequestBody(value)); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; /** * Request method @@ -73,6 +99,7 @@ import type { OpenAPIConfig } from './OpenAPI'; export const request = (config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { + options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 1011380ee..cda3c0fd9 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -1,3 +1,30 @@ +const createOptionProxy = (value: T): O.Option => + value === undefined || value === null ? { '_tag': 'None' } + : new Proxy>>({ + '_tag': 'Some', + value, + }, { + get: (target, prop) => { + if (prop === '_tag') { + return target._tag; + } + if (prop === 'value') { + return target.value; + } + const val = target.value[prop]; + if (val === undefined || val === null) { + return createOptionProxy(val); + } + return typeof val === 'function' ? val.bind(target.value) : val; + } + }); + +const convertResponseBody = (body: unknown): any => + body === undefined || body === null ? { '_tag': 'None' } + : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) + : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : createOptionProxy(body); + export const getResponseBody = async (response: Response): Promise => { if (response.status !== 204) { try { @@ -6,14 +33,14 @@ export const getResponseBody = async (response: Response): Promise => { const jsonTypes = ['application/json', 'application/problem+json'] const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { - return await response.json(); + return convertResponseBody(await response.json()); } else { - return await response.text(); + return convertResponseBody(await response.text()); } } } catch (error) { console.error(error); } } - return undefined; + return convertResponseBody(undefined); }; diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index 4af6f9440..e0e713b0f 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -54,6 +54,32 @@ import type { OpenAPIConfig } from './OpenAPI'; {{>functions/catchErrorCodes}} +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(value => convertRequestBody(value)); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; /** * Request method @@ -65,6 +91,7 @@ import type { OpenAPIConfig } from './OpenAPI'; export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { + options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index 1011380ee..cda3c0fd9 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -1,3 +1,30 @@ +const createOptionProxy = (value: T): O.Option => + value === undefined || value === null ? { '_tag': 'None' } + : new Proxy>>({ + '_tag': 'Some', + value, + }, { + get: (target, prop) => { + if (prop === '_tag') { + return target._tag; + } + if (prop === 'value') { + return target.value; + } + const val = target.value[prop]; + if (val === undefined || val === null) { + return createOptionProxy(val); + } + return typeof val === 'function' ? val.bind(target.value) : val; + } + }); + +const convertResponseBody = (body: unknown): any => + body === undefined || body === null ? { '_tag': 'None' } + : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) + : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : createOptionProxy(body); + export const getResponseBody = async (response: Response): Promise => { if (response.status !== 204) { try { @@ -6,14 +33,14 @@ export const getResponseBody = async (response: Response): Promise => { const jsonTypes = ['application/json', 'application/problem+json'] const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { - return await response.json(); + return convertResponseBody(await response.json()); } else { - return await response.text(); + return convertResponseBody(await response.text()); } } } catch (error) { console.error(error); } } - return undefined; + return convertResponseBody(undefined); }; diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index 8e6f6110e..16bb64e62 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -59,6 +59,32 @@ import type { OpenAPIConfig } from './OpenAPI'; {{>functions/catchErrorCodes}} +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(value => convertRequestBody(value)); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; /** * Request method @@ -70,6 +96,7 @@ import type { OpenAPIConfig } from './OpenAPI'; export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { + options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index ccf83b1ff..fbbe77088 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -1,19 +1,46 @@ -export const getResponseBody = (xhr: XMLHttpRequest): any => { - if (xhr.status !== 204) { +const createOptionProxy = (value: T): O.Option => + value === undefined || value === null ? { '_tag': 'None' } + : new Proxy>>({ + '_tag': 'Some', + value, + }, { + get: (target, prop) => { + if (prop === '_tag') { + return target._tag; + } + if (prop === 'value') { + return target.value; + } + const val = target.value[prop]; + if (val === undefined || val === null) { + return createOptionProxy(val); + } + return typeof val === 'function' ? val.bind(target.value) : val; + } + }); + +const convertResponseBody = (body: unknown): any => + body === undefined || body === null ? { '_tag': 'None' } + : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) + : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : createOptionProxy(body); + +export const getResponseBody = async (response: Response): Promise => { + if (response.status !== 204) { try { const contentType = xhr.getResponseHeader('Content-Type'); if (contentType) { const jsonTypes = ['application/json', 'application/problem+json'] const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { - return JSON.parse(xhr.responseText); + return convertResponseBody(JSON.parse(xhr.responseText)); } else { - return xhr.responseText; + return convertResponseBody(xhr.responseText); } } } catch (error) { console.error(error); } } - return undefined; + return convertResponseBody(undefined); }; diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 47f92870b..6a89bc975 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -57,6 +57,32 @@ import type { OpenAPIConfig } from './OpenAPI'; {{>functions/catchErrorCodes}} +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(value => convertRequestBody(value)); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; /** * Request method @@ -68,6 +94,7 @@ import type { OpenAPIConfig } from './OpenAPI'; export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { + options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index d6bccbbeb..3ff899467 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -11,6 +11,9 @@ import type { Observable } from 'rxjs'; {{/if}} {{/equals}} +import { either } from 'fp-ts'; +import type { Either } from 'fp-ts/Either'; +import type { ApiError } from '../core/ApiError'; {{#if imports}} {{#each imports}} import type { {{{this}}} } from '../models/{{{this}}}'; @@ -75,7 +78,7 @@ export class {{{name}}}{{{@root.postfix}}} { public {{{name}}}({{>parameters}}): Observable<{{>result}}> { return this.httpRequest.request({ {{else}} - public {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { + public {{{name}}}({{>parameters}}): CancelablePromiseresult}}>> { return this.httpRequest.request({ {{/equals}} {{else}} @@ -83,7 +86,7 @@ export class {{{name}}}{{{@root.postfix}}} { public {{{name}}}({{>parameters}}): Observable<{{>result}}> { return __request(OpenAPI, this.http, { {{else}} - public static {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> { + public static {{{name}}}({{>parameters}}): CancelablePromiseresult}}>> { return __request(OpenAPI, { {{/equals}} {{/if}} @@ -145,7 +148,7 @@ export class {{{name}}}{{{@root.postfix}}} { {{/each}} }, {{/if}} - }); + }){{#equals @root.httpClient 'angular'}}{{else}}.then(either.right).catch(either.left) as CancelablePromiseresult}}>>{{/equals}}; } {{/each}} diff --git a/src/templates/partials/exportInterface.hbs b/src/templates/partials/exportInterface.hbs index b61e26441..c15e458ed 100644 --- a/src/templates/partials/exportInterface.hbs +++ b/src/templates/partials/exportInterface.hbs @@ -20,7 +20,7 @@ export type {{{name}}} = { {{/if}} */ {{/ifdef}} - {{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type parent=../name}}; + {{>isReadOnly}}{{{name}}}: {{#>isRequired}}{{>type parent=../name}}{{/isRequired}}; {{/each}} }; {{#if enums}} diff --git a/src/templates/partials/header.hbs b/src/templates/partials/header.hbs index 94249f58b..23b66f929 100644 --- a/src/templates/partials/header.hbs +++ b/src/templates/partials/header.hbs @@ -2,3 +2,6 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +// biome-ignore lint: generated +// biome-ignore format: generated +import * as O from 'fp-ts/Option'; diff --git a/src/templates/partials/isNullable.hbs b/src/templates/partials/isNullable.hbs index 7ef73e3d0..d88bcb50f 100644 --- a/src/templates/partials/isNullable.hbs +++ b/src/templates/partials/isNullable.hbs @@ -1 +1 @@ -{{#if isNullable}} | null{{/if}} +{{#if isNullable}}O.Option<{{> @partial-block }}>{{else}}{{> @partial-block }}{{/if}} diff --git a/src/templates/partials/isRequired.hbs b/src/templates/partials/isRequired.hbs index b829272b9..0dba713bf 100644 --- a/src/templates/partials/isRequired.hbs +++ b/src/templates/partials/isRequired.hbs @@ -1,5 +1 @@ -{{~#if @root.useOptions~}} -{{#unless isRequired}}?{{else if default}}?{{/unless}} -{{~else~}} -{{#unless isRequired}}{{#unless default}}?{{/unless}}{{/unless}} -{{~/if~}} +{{#unless isRequired}}{{#unless default}}O.Option<{{> @partial-block }}>{{else}}{{> @partial-block }}{{/unless}}{{else}}{{> @partial-block }}{{/unless}} diff --git a/src/templates/partials/parameters.hbs b/src/templates/partials/parameters.hbs index 57ab5a7d1..f77c3ca5f 100644 --- a/src/templates/partials/parameters.hbs +++ b/src/templates/partials/parameters.hbs @@ -16,13 +16,13 @@ {{/if}} */ {{/ifdef}} -{{{name}}}{{>isRequired}}: {{>type}}, +{{{name}}}{{#unless isRequired}}?{{else if default}}?{{/unless}}: {{>type}}, {{/each}} } {{~else}} {{#each parameters}} -{{{name}}}{{>isRequired}}: {{>type}}{{#if default}} = {{{default}}}{{/if}}, +{{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}{{#if default}} = {{{default}}}{{/if}}, {{/each}} {{/if}} {{/if}} diff --git a/src/templates/partials/typeArray.hbs b/src/templates/partials/typeArray.hbs index c3d44374f..e1e2bf7aa 100644 --- a/src/templates/partials/typeArray.hbs +++ b/src/templates/partials/typeArray.hbs @@ -1,5 +1,5 @@ {{~#if link~}} -Array<{{>type link}}>{{>isNullable}} +{{#>isNullable}}Array<{{>type link}}>{{/isNullable}} {{~else~}} -Array<{{>base}}>{{>isNullable}} +{{#>isNullable}}Array<{{>base}}>{{/isNullable}} {{~/if~}} diff --git a/src/templates/partials/typeDictionary.hbs b/src/templates/partials/typeDictionary.hbs index 12d57036c..43cb6b47b 100644 --- a/src/templates/partials/typeDictionary.hbs +++ b/src/templates/partials/typeDictionary.hbs @@ -1,5 +1,5 @@ {{~#if link~}} -Recordtype link}}>{{>isNullable}} +{{#>isNullable}}Recordtype link}}>{{/isNullable}} {{~else~}} -Recordbase}}>{{>isNullable}} +{{#>isNullable}}Recordbase}}>{{/isNullable}} {{~/if~}} diff --git a/src/templates/partials/typeEnum.hbs b/src/templates/partials/typeEnum.hbs index 781fd5ec5..8e1b13c13 100644 --- a/src/templates/partials/typeEnum.hbs +++ b/src/templates/partials/typeEnum.hbs @@ -1,2 +1 @@ -{{#enumerator enum parent name}}{{this}}{{/enumerator}}{{>isNullable}} - +{{#>isNullable}}{{#enumerator enum parent name}}{{this}}{{/enumerator}}{{/isNullable}} diff --git a/src/templates/partials/typeGeneric.hbs b/src/templates/partials/typeGeneric.hbs index 0ac6aea3b..16302c7cf 100644 --- a/src/templates/partials/typeGeneric.hbs +++ b/src/templates/partials/typeGeneric.hbs @@ -1 +1 @@ -{{>base}}{{>isNullable}} +{{#>isNullable}}{{>base}}{{/isNullable}} diff --git a/src/templates/partials/typeInterface.hbs b/src/templates/partials/typeInterface.hbs index 3d5acad07..238a72a38 100644 --- a/src/templates/partials/typeInterface.hbs +++ b/src/templates/partials/typeInterface.hbs @@ -1,5 +1,5 @@ {{~#if properties~}} -{ +{{#>isNullable}}{ {{#each properties}} {{#ifdef description deprecated}} /** @@ -12,12 +12,12 @@ */ {{/ifdef}} {{#if ../parent}} -{{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type parent=../parent}}; +{{>isReadOnly}}{{{name}}}: {{#>isRequired}}{{>type parent=../parent}}{{/isRequired}}; {{else}} -{{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type}}; +{{>isReadOnly}}{{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}; {{/if}} {{/each}} -}{{>isNullable}} +}{{/isNullable}} {{~else~}} any {{~/if~}} diff --git a/src/templates/partials/typeIntersection.hbs b/src/templates/partials/typeIntersection.hbs index 031896f7c..2b56d24dc 100644 --- a/src/templates/partials/typeIntersection.hbs +++ b/src/templates/partials/typeIntersection.hbs @@ -1 +1 @@ -{{#intersection properties parent}}{{this}}{{/intersection}}{{>isNullable}} +{{#>isNullable}}{{#intersection properties parent}}{{this}}{{/intersection}}{{/isNullable}} diff --git a/src/templates/partials/typeReference.hbs b/src/templates/partials/typeReference.hbs index 0ac6aea3b..16302c7cf 100644 --- a/src/templates/partials/typeReference.hbs +++ b/src/templates/partials/typeReference.hbs @@ -1 +1 @@ -{{>base}}{{>isNullable}} +{{#>isNullable}}{{>base}}{{/isNullable}} diff --git a/src/templates/partials/typeUnion.hbs b/src/templates/partials/typeUnion.hbs index 59371dfe4..a644628f8 100644 --- a/src/templates/partials/typeUnion.hbs +++ b/src/templates/partials/typeUnion.hbs @@ -1 +1 @@ -{{#union properties parent}}{{this}}{{/union}}{{>isNullable}} +{{#>isNullable}}{{#union properties parent}}{{this}}{{/union}}{{/isNullable}} From e22884de967eb629eb54ab97b64c8b747ae479db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Thu, 2 Nov 2023 00:35:29 +0000 Subject: [PATCH 02/48] =?UTF-8?q?=F0=9F=90=9B=20linter=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 16 ++++++++-------- src/templates/partials/header.hbs | 3 +-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 687ed6def..c13478e40 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { - "name": "openapi-typescript-codegen", - "version": "0.25.0", + "name": "@majkit/openapi", + "version": "0.25.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", - "author": "Ferdi Koomen", - "homepage": "https://github.com/ferdikoomen/openapi-typescript-codegen", + "author": "Majkit", + "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", "repository": { "type": "git", - "url": "git+https://github.com/ferdikoomen/openapi-typescript-codegen.git" + "url": "git+https://github.com/maxa-ondrej/openapi-typescript-codegen.git" }, "bugs": { - "url": "https://github.com/ferdikoomen/openapi-typescript-codegen/issues" + "url": "https://github.com/maxa-ondrej/openapi-typescript-codegen/issues" }, "license": "MIT", "keywords": [ @@ -27,8 +27,8 @@ ], "maintainers": [ { - "name": "Ferdi Koomen", - "email": "info@madebyferdi.com" + "name": "Ondrej Maxa", + "email": "info@majksa.cz" } ], "main": "dist/index.js", diff --git a/src/templates/partials/header.hbs b/src/templates/partials/header.hbs index 23b66f929..99ea488e4 100644 --- a/src/templates/partials/header.hbs +++ b/src/templates/partials/header.hbs @@ -2,6 +2,5 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -// biome-ignore lint: generated -// biome-ignore format: generated +// @ts-ignore: Does not need to be used import * as O from 'fp-ts/Option'; From 3da61cea4eabbc8799944fdc03abcfd73d1922a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Thu, 2 Nov 2023 00:40:04 +0000 Subject: [PATCH 03/48] =?UTF-8?q?=F0=9F=9A=A8=20ts=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- src/templates/core/angular/getResponseBody.hbs | 2 +- src/templates/core/axios/getResponseBody.hbs | 2 +- src/templates/core/fetch/getResponseBody.hbs | 2 +- src/templates/core/node/getResponseBody.hbs | 2 +- src/templates/core/xhr/getResponseBody.hbs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index c13478e40..f9fee16ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.25.2", + "version": "0.25.3", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/core/angular/getResponseBody.hbs b/src/templates/core/angular/getResponseBody.hbs index 91d5c424c..119c8bb30 100644 --- a/src/templates/core/angular/getResponseBody.hbs +++ b/src/templates/core/angular/getResponseBody.hbs @@ -11,7 +11,7 @@ const createOptionProxy = (value: T): O.Option => if (prop === 'value') { return target.value; } - const val = target.value[prop]; + const val = target.value[prop as keyof T]; if (val === undefined || val === null) { return createOptionProxy(val); } diff --git a/src/templates/core/axios/getResponseBody.hbs b/src/templates/core/axios/getResponseBody.hbs index a35fbf32c..49bfbad03 100644 --- a/src/templates/core/axios/getResponseBody.hbs +++ b/src/templates/core/axios/getResponseBody.hbs @@ -11,7 +11,7 @@ const createOptionProxy = (value: T): O.Option => if (prop === 'value') { return target.value; } - const val = target.value[prop]; + const val = target.value[prop as keyof T]; if (val === undefined || val === null) { return createOptionProxy(val); } diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index cda3c0fd9..077131ae8 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -11,7 +11,7 @@ const createOptionProxy = (value: T): O.Option => if (prop === 'value') { return target.value; } - const val = target.value[prop]; + const val = target.value[prop as keyof T]; if (val === undefined || val === null) { return createOptionProxy(val); } diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index cda3c0fd9..077131ae8 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -11,7 +11,7 @@ const createOptionProxy = (value: T): O.Option => if (prop === 'value') { return target.value; } - const val = target.value[prop]; + const val = target.value[prop as keyof T]; if (val === undefined || val === null) { return createOptionProxy(val); } diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index fbbe77088..6a62d3a15 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -11,7 +11,7 @@ const createOptionProxy = (value: T): O.Option => if (prop === 'value') { return target.value; } - const val = target.value[prop]; + const val = target.value[prop as keyof T]; if (val === undefined || val === null) { return createOptionProxy(val); } From c2cfbe2621c744bb85844a29d597a6b3bf05ba73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Thu, 2 Nov 2023 14:02:39 +0000 Subject: [PATCH 04/48] =?UTF-8?q?=F0=9F=90=9B=20console=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .../core/angular/getResponseBody.hbs | 19 ++++++++++++++----- src/templates/core/axios/getResponseBody.hbs | 19 ++++++++++++++----- src/templates/core/fetch/getResponseBody.hbs | 19 ++++++++++++++----- src/templates/core/node/getResponseBody.hbs | 19 ++++++++++++++----- src/templates/core/xhr/getResponseBody.hbs | 19 ++++++++++++++----- src/templates/index.hbs | 8 ++++++++ 6 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/templates/core/angular/getResponseBody.hbs b/src/templates/core/angular/getResponseBody.hbs index 119c8bb30..45df170b9 100644 --- a/src/templates/core/angular/getResponseBody.hbs +++ b/src/templates/core/angular/getResponseBody.hbs @@ -1,8 +1,17 @@ -const createOptionProxy = (value: T): O.Option => - value === undefined || value === null ? { '_tag': 'None' } - : new Proxy>>({ +type Loggable = { + toLog: () => unknown, + toString: () => string, +} + +const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; + +const createOptionProxy = (value: T): O.Option & Loggable => + value === undefined || value === null ? none + : new Proxy> & Loggable>({ '_tag': 'Some', value, + toLog: () => value, + toString: () => value.toString(), }, { get: (target, prop) => { if (prop === '_tag') { @@ -20,9 +29,9 @@ const createOptionProxy = (value: T): O.Option => }); const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? { '_tag': 'None' } + body === undefined || body === null ? none : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) : createOptionProxy(body); export const getResponseBody = (response: HttpResponse): T | undefined => { diff --git a/src/templates/core/axios/getResponseBody.hbs b/src/templates/core/axios/getResponseBody.hbs index 49bfbad03..e289c2cb8 100644 --- a/src/templates/core/axios/getResponseBody.hbs +++ b/src/templates/core/axios/getResponseBody.hbs @@ -1,8 +1,17 @@ -const createOptionProxy = (value: T): O.Option => - value === undefined || value === null ? { '_tag': 'None' } - : new Proxy>>({ +type Loggable = { + toLog: () => unknown, + toString: () => string, +} + +const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; + +const createOptionProxy = (value: T): O.Option & Loggable => + value === undefined || value === null ? none + : new Proxy> & Loggable>({ '_tag': 'Some', value, + toLog: () => value, + toString: () => value.toString(), }, { get: (target, prop) => { if (prop === '_tag') { @@ -20,9 +29,9 @@ const createOptionProxy = (value: T): O.Option => }); const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? { '_tag': 'None' } + body === undefined || body === null ? none : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) : createOptionProxy(body); export const getResponseBody = (response: HttpResponse): T | undefined => { diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 077131ae8..87cf515f7 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -1,8 +1,17 @@ -const createOptionProxy = (value: T): O.Option => - value === undefined || value === null ? { '_tag': 'None' } - : new Proxy>>({ +type Loggable = { + toLog: () => unknown, + toString: () => string, +} + +const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; + +const createOptionProxy = (value: T): O.Option & Loggable => + value === undefined || value === null ? none + : new Proxy> & Loggable>({ '_tag': 'Some', value, + toLog: () => value, + toString: () => value.toString(), }, { get: (target, prop) => { if (prop === '_tag') { @@ -20,9 +29,9 @@ const createOptionProxy = (value: T): O.Option => }); const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? { '_tag': 'None' } + body === undefined || body === null ? none : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) : createOptionProxy(body); export const getResponseBody = async (response: Response): Promise => { diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index 077131ae8..87cf515f7 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -1,8 +1,17 @@ -const createOptionProxy = (value: T): O.Option => - value === undefined || value === null ? { '_tag': 'None' } - : new Proxy>>({ +type Loggable = { + toLog: () => unknown, + toString: () => string, +} + +const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; + +const createOptionProxy = (value: T): O.Option & Loggable => + value === undefined || value === null ? none + : new Proxy> & Loggable>({ '_tag': 'Some', value, + toLog: () => value, + toString: () => value.toString(), }, { get: (target, prop) => { if (prop === '_tag') { @@ -20,9 +29,9 @@ const createOptionProxy = (value: T): O.Option => }); const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? { '_tag': 'None' } + body === undefined || body === null ? none : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) : createOptionProxy(body); export const getResponseBody = async (response: Response): Promise => { diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index 6a62d3a15..d03e0e2e7 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -1,8 +1,17 @@ -const createOptionProxy = (value: T): O.Option => - value === undefined || value === null ? { '_tag': 'None' } - : new Proxy>>({ +type Loggable = { + toLog: () => unknown, + toString: () => string, +} + +const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; + +const createOptionProxy = (value: T): O.Option & Loggable => + value === undefined || value === null ? none + : new Proxy> & Loggable>({ '_tag': 'Some', value, + toLog: () => value, + toString: () => value.toString(), }, { get: (target, prop) => { if (prop === '_tag') { @@ -20,9 +29,9 @@ const createOptionProxy = (value: T): O.Option => }); const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? { '_tag': 'None' } + body === undefined || body === null ? none : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy(Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)]))) + : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) : createOptionProxy(body); export const getResponseBody = async (response: Response): Promise => { diff --git a/src/templates/index.hbs b/src/templates/index.hbs index 6f5b27d8c..7fa97a223 100644 --- a/src/templates/index.hbs +++ b/src/templates/index.hbs @@ -45,3 +45,11 @@ export { {{{name}}}{{{@root.postfixServices}}} } from './services/{{{name}}}{{{@ {{/each}} {{/if}} {{/if}} + +const toLog = (d: unknown) => { + const fun = (d as any)?.toLog; + return typeof fun === 'function' ? fun() : d; +}; + +const oldLog = console.log; +console.log = (...data: unknown[]) => oldLog(...data.map(toLog)); From 33c93f2d3b393795be375e58b859468cf8866eae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Thu, 2 Nov 2023 14:03:08 +0000 Subject: [PATCH 05/48] =?UTF-8?q?=F0=9F=94=96=20v=200.25.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f9fee16ca..ed959c5ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.25.3", + "version": "0.25.4", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", From d988358de5b60605e9298645302565d8747f5463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Fri, 3 Nov 2023 12:21:22 +0000 Subject: [PATCH 06/48] =?UTF-8?q?=E2=9C=A8=20optional=20values=20inside=20?= =?UTF-8?q?requests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- src/templates/partials/isRequired.hbs | 2 +- src/templates/partials/parameters.hbs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ed959c5ef..1e90ab217 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.25.4", + "version": "0.25.5", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/partials/isRequired.hbs b/src/templates/partials/isRequired.hbs index 0dba713bf..e7f853f5f 100644 --- a/src/templates/partials/isRequired.hbs +++ b/src/templates/partials/isRequired.hbs @@ -1 +1 @@ -{{#unless isRequired}}{{#unless default}}O.Option<{{> @partial-block }}>{{else}}{{> @partial-block }}{{/unless}}{{else}}{{> @partial-block }}{{/unless}} +{{#unless isRequired}}O.Option<{{> @partial-block }}>{{else}}{{> @partial-block }}{{/unless}} diff --git a/src/templates/partials/parameters.hbs b/src/templates/partials/parameters.hbs index f77c3ca5f..16f287cfc 100644 --- a/src/templates/partials/parameters.hbs +++ b/src/templates/partials/parameters.hbs @@ -2,7 +2,7 @@ {{#if @root.useOptions~}} { {{#each parameters}} -{{{name}}}{{#if default}} = {{{default}}}{{/if}}, +{{{name}}}{{#if default}} = O.some({{{default}}}){{else}}{{#unless isRequired}} = O.none{{/unless}}{{/if}}, {{/each}} }: { {{#each parameters}} @@ -16,13 +16,13 @@ {{/if}} */ {{/ifdef}} -{{{name}}}{{#unless isRequired}}?{{else if default}}?{{/unless}}: {{>type}}, +{{{name}}}{{#unless isRequired}}?{{/unless}}: {{#>isRequired}}{{>type}}{{/isRequired}}, {{/each}} } {{~else}} {{#each parameters}} -{{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}{{#if default}} = {{{default}}}{{/if}}, +{{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}{{#if default}} = O.some({{{default}}}){{else}}{{#unless isRequired}} = O.none{{/unless}}{{/if}}, {{/each}} {{/if}} {{/if}} From 0b0041452ba57d43341895bd9999a352f7cb5898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Fri, 3 Nov 2023 22:31:27 +0000 Subject: [PATCH 07/48] =?UTF-8?q?=E2=9C=A8=20generate=20result=20mappers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- src/HttpClient.ts | 1 - src/templates/core/angular/getHeaders.hbs | 44 ------ src/templates/core/angular/getRequestBody.hbs | 12 -- .../core/angular/getResponseBody.hbs | 42 ------ .../core/angular/getResponseHeader.hbs | 9 -- src/templates/core/angular/request.hbs | 137 ------------------ src/templates/core/angular/sendRequest.hbs | 16 -- src/templates/core/axios/getResponseBody.hbs | 42 +----- src/templates/core/axios/request.hbs | 4 +- src/templates/core/fetch/getResponseBody.hbs | 42 +----- src/templates/core/fetch/request.hbs | 4 +- src/templates/core/node/getResponseBody.hbs | 42 +----- src/templates/core/node/request.hbs | 4 +- src/templates/core/request.hbs | 1 - src/templates/core/xhr/getResponseBody.hbs | 46 +----- src/templates/core/xhr/request.hbs | 4 +- src/templates/exportMapper.hbs | 10 ++ src/templates/exportService.hbs | 56 ++----- src/templates/index.hbs | 8 - src/templates/partials/resultMapper.hbs | 19 +++ src/templates/partials/resultMapperArray.hbs | 1 + src/templates/partials/resultMapperBase.hbs | 1 + .../partials/resultMapperDictionary.hbs | 4 + src/templates/partials/resultMapperEnum.hbs | 1 + .../partials/resultMapperGeneric.hbs | 1 + .../partials/resultMapperInterface.hbs | 11 ++ .../partials/resultMapperIntersection.hbs | 1 + .../partials/resultMapperIsNullable.hbs | 1 + .../partials/resultMapperIsRequired.hbs | 1 + .../partials/resultMapperReference.hbs | 1 + src/templates/partials/resultMapperUnion.hbs | 1 + src/templates/partials/typeInterface.hbs | 6 +- src/utils/getHttpRequestName.ts | 2 - src/utils/registerHandlebarTemplates.ts | 41 ++++-- src/utils/writeClient.spec.ts | 1 + src/utils/writeClient.ts | 8 + src/utils/writeClientClass.spec.ts | 1 + src/utils/writeClientCore.spec.ts | 1 + src/utils/writeClientIndex.spec.ts | 1 + src/utils/writeClientMappers.ts | 37 +++++ src/utils/writeClientModels.spec.ts | 1 + src/utils/writeClientSchemas.spec.ts | 1 + src/utils/writeClientServices.spec.ts | 1 + 44 files changed, 174 insertions(+), 496 deletions(-) delete mode 100644 src/templates/core/angular/getHeaders.hbs delete mode 100644 src/templates/core/angular/getRequestBody.hbs delete mode 100644 src/templates/core/angular/getResponseBody.hbs delete mode 100644 src/templates/core/angular/getResponseHeader.hbs delete mode 100644 src/templates/core/angular/request.hbs delete mode 100644 src/templates/core/angular/sendRequest.hbs create mode 100644 src/templates/exportMapper.hbs create mode 100644 src/templates/partials/resultMapper.hbs create mode 100644 src/templates/partials/resultMapperArray.hbs create mode 100644 src/templates/partials/resultMapperBase.hbs create mode 100644 src/templates/partials/resultMapperDictionary.hbs create mode 100644 src/templates/partials/resultMapperEnum.hbs create mode 100644 src/templates/partials/resultMapperGeneric.hbs create mode 100644 src/templates/partials/resultMapperInterface.hbs create mode 100644 src/templates/partials/resultMapperIntersection.hbs create mode 100644 src/templates/partials/resultMapperIsNullable.hbs create mode 100644 src/templates/partials/resultMapperIsRequired.hbs create mode 100644 src/templates/partials/resultMapperReference.hbs create mode 100644 src/templates/partials/resultMapperUnion.hbs create mode 100644 src/utils/writeClientMappers.ts diff --git a/package.json b/package.json index 1e90ab217..7e1c96bd6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.25.5", + "version": "0.26.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/HttpClient.ts b/src/HttpClient.ts index 40c77c7c9..9b3f9010b 100644 --- a/src/HttpClient.ts +++ b/src/HttpClient.ts @@ -3,5 +3,4 @@ export enum HttpClient { XHR = 'xhr', NODE = 'node', AXIOS = 'axios', - ANGULAR = 'angular', } diff --git a/src/templates/core/angular/getHeaders.hbs b/src/templates/core/angular/getHeaders.hbs deleted file mode 100644 index 57495a578..000000000 --- a/src/templates/core/angular/getHeaders.hbs +++ /dev/null @@ -1,44 +0,0 @@ -export const getHeaders = (config: OpenAPIConfig, options: ApiRequestOptions): Observable => { - return forkJoin({ - token: resolve(options, config.TOKEN), - username: resolve(options, config.USERNAME), - password: resolve(options, config.PASSWORD), - additionalHeaders: resolve(options, config.HEADERS), - }).pipe( - map(({ token, username, password, additionalHeaders }) => { - const headers = Object.entries({ - Accept: 'application/json', - ...additionalHeaders, - ...options.headers, - }) - .filter(([_, value]) => isDefined(value)) - .reduce((headers, [key, value]) => ({ - ...headers, - [key]: String(value), - }), {} as Record); - - if (isStringWithValue(token)) { - headers['Authorization'] = `Bearer ${token}`; - } - - if (isStringWithValue(username) && isStringWithValue(password)) { - const credentials = base64(`${username}:${password}`); - headers['Authorization'] = `Basic ${credentials}`; - } - - if (options.body) { - if (options.mediaType) { - headers['Content-Type'] = options.mediaType; - } else if (isBlob(options.body)) { - headers['Content-Type'] = options.body.type || 'application/octet-stream'; - } else if (isString(options.body)) { - headers['Content-Type'] = 'text/plain'; - } else if (!isFormData(options.body)) { - headers['Content-Type'] = 'application/json'; - } - } - - return new HttpHeaders(headers); - }), - ); -}; diff --git a/src/templates/core/angular/getRequestBody.hbs b/src/templates/core/angular/getRequestBody.hbs deleted file mode 100644 index 891150edf..000000000 --- a/src/templates/core/angular/getRequestBody.hbs +++ /dev/null @@ -1,12 +0,0 @@ -export const getRequestBody = (options: ApiRequestOptions): any => { - if (options.body) { - if (options.mediaType?.includes('/json')) { - return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body; - } else { - return JSON.stringify(options.body); - } - } - return undefined; -}; diff --git a/src/templates/core/angular/getResponseBody.hbs b/src/templates/core/angular/getResponseBody.hbs deleted file mode 100644 index 45df170b9..000000000 --- a/src/templates/core/angular/getResponseBody.hbs +++ /dev/null @@ -1,42 +0,0 @@ -type Loggable = { - toLog: () => unknown, - toString: () => string, -} - -const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; - -const createOptionProxy = (value: T): O.Option & Loggable => - value === undefined || value === null ? none - : new Proxy> & Loggable>({ - '_tag': 'Some', - value, - toLog: () => value, - toString: () => value.toString(), - }, { - get: (target, prop) => { - if (prop === '_tag') { - return target._tag; - } - if (prop === 'value') { - return target.value; - } - const val = target.value[prop as keyof T]; - if (val === undefined || val === null) { - return createOptionProxy(val); - } - return typeof val === 'function' ? val.bind(target.value) : val; - } - }); - -const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? none - : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) - : createOptionProxy(body); - -export const getResponseBody = (response: HttpResponse): T | undefined => { - if (response.status !== 204 && response.body !== null) { - return convertResponseBody(response.body); - } - return convertResponseBody(undefined); -}; diff --git a/src/templates/core/angular/getResponseHeader.hbs b/src/templates/core/angular/getResponseHeader.hbs deleted file mode 100644 index fcb7ba830..000000000 --- a/src/templates/core/angular/getResponseHeader.hbs +++ /dev/null @@ -1,9 +0,0 @@ -export const getResponseHeader = (response: HttpResponse, responseHeader?: string): string | undefined => { - if (responseHeader) { - const value = response.headers.get(responseHeader); - if (isString(value)) { - return value; - } - } - return undefined; -}; diff --git a/src/templates/core/angular/request.hbs b/src/templates/core/angular/request.hbs deleted file mode 100644 index fc413feb3..000000000 --- a/src/templates/core/angular/request.hbs +++ /dev/null @@ -1,137 +0,0 @@ -{{>header}} - -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import type { HttpResponse, HttpErrorResponse } from '@angular/common/http'; -import { forkJoin, of, throwError } from 'rxjs'; -import { catchError, map, switchMap } from 'rxjs/operators'; -import type { Observable } from 'rxjs'; - -import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import type { OpenAPIConfig } from './OpenAPI'; - -{{>functions/isDefined}} - - -{{>functions/isString}} - - -{{>functions/isStringWithValue}} - - -{{>functions/isBlob}} - - -{{>functions/isFormData}} - - -{{>functions/base64}} - - -{{>functions/getQueryString}} - - -{{>functions/getUrl}} - - -{{>functions/getFormData}} - - -{{>functions/resolve}} - - -{{>angular/getHeaders}} - - -{{>angular/getRequestBody}} - - -{{>angular/sendRequest}} - - -{{>angular/getResponseHeader}} - - -{{>angular/getResponseBody}} - - -{{>functions/catchErrorCodes}} - -const flattenOption = (body: unknown): any => - typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' - && (body._tag === 'None' || body._tag === 'Some') - ? body._tag === 'Some' && 'value' in body - ? body.value : undefined - : body; - -const convertRequestBody = (body: unknown): any => - typeof body === 'object' && body !== null - ? (() => { - const flattened = flattenOption(body); - if (flattened === undefined) { - return undefined; - } - if (Array.isArray(flattened)) { - return flattened.map(value => convertRequestBody(value)); - } - if (isBlob(flattened) || isFormData(flattened)) { - return flattened; - } - if (typeof flattened === 'object' && flattened !== null) { - return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); - } - return flattened; - })() - : body; - -/** - * Request method - * @param config The OpenAPI configuration object - * @param http The Angular HTTP client - * @param options The request options from the service - * @returns Observable - * @throws ApiError - */ -export const request = (config: OpenAPIConfig, http: HttpClient, options: ApiRequestOptions): Observable => { - options = convertRequestBody(options); - const url = getUrl(config, options); - const formData = getFormData(options); - const body = getRequestBody(options); - - return getHeaders(config, options).pipe( - switchMap(headers => { - return sendRequest(config, options, http, url, formData, body, headers); - }), - map(response => { - const responseBody = getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - return { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - } as ApiResult; - }), - catchError((error: HttpErrorResponse) => { - if (!error.status) { - return throwError(error); - } - return of({ - url, - ok: error.ok, - status: error.status, - statusText: error.statusText, - body: error.error ?? error.statusText, - } as ApiResult); - }), - map(result => { - catchErrorCodes(options, result); - return result.body as T; - }), - catchError((error: ApiError) => { - return throwError(error); - }), - ); -}; diff --git a/src/templates/core/angular/sendRequest.hbs b/src/templates/core/angular/sendRequest.hbs deleted file mode 100644 index ad73d8332..000000000 --- a/src/templates/core/angular/sendRequest.hbs +++ /dev/null @@ -1,16 +0,0 @@ -export const sendRequest = ( - config: OpenAPIConfig, - options: ApiRequestOptions, - http: HttpClient, - url: string, - body: any, - formData: FormData | undefined, - headers: HttpHeaders -): Observable> => { - return http.request(options.method, url, { - headers, - body: body ?? formData, - withCredentials: config.WITH_CREDENTIALS, - observe: 'response', - }); -}; diff --git a/src/templates/core/axios/getResponseBody.hbs b/src/templates/core/axios/getResponseBody.hbs index e289c2cb8..c73057c3c 100644 --- a/src/templates/core/axios/getResponseBody.hbs +++ b/src/templates/core/axios/getResponseBody.hbs @@ -1,42 +1,6 @@ -type Loggable = { - toLog: () => unknown, - toString: () => string, -} - -const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; - -const createOptionProxy = (value: T): O.Option & Loggable => - value === undefined || value === null ? none - : new Proxy> & Loggable>({ - '_tag': 'Some', - value, - toLog: () => value, - toString: () => value.toString(), - }, { - get: (target, prop) => { - if (prop === '_tag') { - return target._tag; - } - if (prop === 'value') { - return target.value; - } - const val = target.value[prop as keyof T]; - if (val === undefined || val === null) { - return createOptionProxy(val); - } - return typeof val === 'function' ? val.bind(target.value) : val; - } - }); - -const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? none - : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) - : createOptionProxy(body); - -export const getResponseBody = (response: HttpResponse): T | undefined => { +export const getResponseBody = (response: AxiosResponse): any => { if (response.status !== 204) { - return convertResponseBody(response.data); + return response.data; } - return convertResponseBody(undefined); + return undefined; }; diff --git a/src/templates/core/axios/request.hbs b/src/templates/core/axios/request.hbs index 8e6f15e83..bc88496fd 100644 --- a/src/templates/core/axios/request.hbs +++ b/src/templates/core/axios/request.hbs @@ -96,7 +96,7 @@ const convertRequestBody = (body: unknown): any => * @returns CancelablePromise * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise => { +export const request = (config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { options = convertRequestBody(options); @@ -120,7 +120,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions, ax catchErrorCodes(options, result); - resolve(result.body); + resolve([result.body, response.status] as const); } } catch (error) { reject(error); diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 87cf515f7..1011380ee 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -1,39 +1,3 @@ -type Loggable = { - toLog: () => unknown, - toString: () => string, -} - -const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; - -const createOptionProxy = (value: T): O.Option & Loggable => - value === undefined || value === null ? none - : new Proxy> & Loggable>({ - '_tag': 'Some', - value, - toLog: () => value, - toString: () => value.toString(), - }, { - get: (target, prop) => { - if (prop === '_tag') { - return target._tag; - } - if (prop === 'value') { - return target.value; - } - const val = target.value[prop as keyof T]; - if (val === undefined || val === null) { - return createOptionProxy(val); - } - return typeof val === 'function' ? val.bind(target.value) : val; - } - }); - -const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? none - : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) - : createOptionProxy(body); - export const getResponseBody = async (response: Response): Promise => { if (response.status !== 204) { try { @@ -42,14 +6,14 @@ export const getResponseBody = async (response: Response): Promise => { const jsonTypes = ['application/json', 'application/problem+json'] const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { - return convertResponseBody(await response.json()); + return await response.json(); } else { - return convertResponseBody(await response.text()); + return await response.text(); } } } catch (error) { console.error(error); } } - return convertResponseBody(undefined); + return undefined; }; diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index e0e713b0f..9604fd564 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -88,7 +88,7 @@ const convertRequestBody = (body: unknown): any => * @returns CancelablePromise * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { options = convertRequestBody(options); @@ -112,7 +112,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C catchErrorCodes(options, result); - resolve(result.body); + resolve([result.body, response.status] as const); } } catch (error) { reject(error); diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index 87cf515f7..1011380ee 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -1,39 +1,3 @@ -type Loggable = { - toLog: () => unknown, - toString: () => string, -} - -const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; - -const createOptionProxy = (value: T): O.Option & Loggable => - value === undefined || value === null ? none - : new Proxy> & Loggable>({ - '_tag': 'Some', - value, - toLog: () => value, - toString: () => value.toString(), - }, { - get: (target, prop) => { - if (prop === '_tag') { - return target._tag; - } - if (prop === 'value') { - return target.value; - } - const val = target.value[prop as keyof T]; - if (val === undefined || val === null) { - return createOptionProxy(val); - } - return typeof val === 'function' ? val.bind(target.value) : val; - } - }); - -const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? none - : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) - : createOptionProxy(body); - export const getResponseBody = async (response: Response): Promise => { if (response.status !== 204) { try { @@ -42,14 +6,14 @@ export const getResponseBody = async (response: Response): Promise => { const jsonTypes = ['application/json', 'application/problem+json'] const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { - return convertResponseBody(await response.json()); + return await response.json(); } else { - return convertResponseBody(await response.text()); + return await response.text(); } } } catch (error) { console.error(error); } } - return convertResponseBody(undefined); + return undefined; }; diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index 16bb64e62..2c06fe9ec 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -93,7 +93,7 @@ const convertRequestBody = (body: unknown): any => * @returns CancelablePromise * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { options = convertRequestBody(options); @@ -117,7 +117,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C catchErrorCodes(options, result); - resolve(result.body); + resolve([result.body, response.status] as const); } } catch (error) { reject(error); diff --git a/src/templates/core/request.hbs b/src/templates/core/request.hbs index c4e2478dd..53a5ec064 100644 --- a/src/templates/core/request.hbs +++ b/src/templates/core/request.hbs @@ -1,4 +1,3 @@ -{{~#equals @root.httpClient 'fetch'}}{{>fetch/request}}{{/equals~}} {{~#equals @root.httpClient 'xhr'}}{{>xhr/request}}{{/equals~}} {{~#equals @root.httpClient 'axios'}}{{>axios/request}}{{/equals~}} {{~#equals @root.httpClient 'angular'}}{{>angular/request}}{{/equals~}} diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index d03e0e2e7..ccf83b1ff 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -1,55 +1,19 @@ -type Loggable = { - toLog: () => unknown, - toString: () => string, -} - -const none = { '_tag': 'None', toString () { return "undefined"; }, toLog () { return "undefined"; } } as const; - -const createOptionProxy = (value: T): O.Option & Loggable => - value === undefined || value === null ? none - : new Proxy> & Loggable>({ - '_tag': 'Some', - value, - toLog: () => value, - toString: () => value.toString(), - }, { - get: (target, prop) => { - if (prop === '_tag') { - return target._tag; - } - if (prop === 'value') { - return target.value; - } - const val = target.value[prop as keyof T]; - if (val === undefined || val === null) { - return createOptionProxy(val); - } - return typeof val === 'function' ? val.bind(target.value) : val; - } - }); - -const convertResponseBody = (body: unknown): any => - body === undefined || body === null ? none - : typeof body === 'number' || typeof body === 'string' || typeof body === 'boolean' ? createOptionProxy(body) - : typeof body === 'object' ? createOptionProxy({...Object.fromEntries(Object.entries(body).map(([key, value]) => [key, convertResponseBody(value)])), toString () { return JSON.stringify(body); }, toLog () { return body; }}) - : createOptionProxy(body); - -export const getResponseBody = async (response: Response): Promise => { - if (response.status !== 204) { +export const getResponseBody = (xhr: XMLHttpRequest): any => { + if (xhr.status !== 204) { try { const contentType = xhr.getResponseHeader('Content-Type'); if (contentType) { const jsonTypes = ['application/json', 'application/problem+json'] const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { - return convertResponseBody(JSON.parse(xhr.responseText)); + return JSON.parse(xhr.responseText); } else { - return convertResponseBody(xhr.responseText); + return xhr.responseText; } } } catch (error) { console.error(error); } } - return convertResponseBody(undefined); + return undefined; }; diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 6a89bc975..2fc934572 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -91,7 +91,7 @@ const convertRequestBody = (body: unknown): any => * @returns CancelablePromise * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { options = convertRequestBody(options); @@ -115,7 +115,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C catchErrorCodes(options, result); - resolve(result.body); + resolve([result.body, response.status] as const); } } catch (error) { reject(error); diff --git a/src/templates/exportMapper.hbs b/src/templates/exportMapper.hbs new file mode 100644 index 000000000..fb32ba207 --- /dev/null +++ b/src/templates/exportMapper.hbs @@ -0,0 +1,10 @@ +{{>header}} + +{{#if imports}} + +{{#each imports}} +import { {{{this}}}Mapper } from './{{{this}}}Mapper'; +{{/each}} +{{/if}} + +export const {{{name}}}Mapper = (a: any) => {{>resultMapper}}(a); diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 3ff899467..343ac7a17 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -1,16 +1,5 @@ {{>header}} -{{#equals @root.httpClient 'angular'}} -{{#if @root.exportClient}} -import { Injectable } from '@angular/core'; -import type { Observable } from 'rxjs'; -{{else}} -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import type { Observable } from 'rxjs'; -{{/if}} - -{{/equals}} import { either } from 'fp-ts'; import type { Either } from 'fp-ts/Either'; import type { ApiError } from '../core/ApiError'; @@ -18,36 +7,23 @@ import type { ApiError } from '../core/ApiError'; {{#each imports}} import type { {{{this}}} } from '../models/{{{this}}}'; {{/each}} +{{#each imports}} +import { {{{this}}}Mapper } from '../mappers/{{{this}}}Mapper'; +{{/each}} {{/if}} -{{#notEquals @root.httpClient 'angular'}} import type { CancelablePromise } from '../core/CancelablePromise'; -{{/notEquals}} {{#if @root.exportClient}} -{{#equals @root.httpClient 'angular'}} -import { BaseHttpRequest } from '../core/BaseHttpRequest'; -{{else}} import type { BaseHttpRequest } from '../core/BaseHttpRequest'; -{{/equals}} {{else}} import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; {{/if}} -{{#equals @root.httpClient 'angular'}} -@Injectable({ - providedIn: 'root', -}) -{{/equals}} export class {{{name}}}{{{@root.postfix}}} { {{#if @root.exportClient}} constructor(public readonly httpRequest: BaseHttpRequest) {} - {{else}} - {{#equals @root.httpClient 'angular'}} - - constructor(public readonly http: HttpClient) {} - {{/equals}} {{/if}} {{#each operations}} @@ -69,26 +45,15 @@ export class {{{name}}}{{{@root.postfix}}} { {{/if}} {{/unless}} {{#each results}} - * @returns {{{type}}} {{#if description}}{{{escapeComment description}}}{{/if}} + * @returns Either {{#if description}}{{{escapeComment description}}}{{/if}} {{/each}} - * @throws ApiError */ {{#if @root.exportClient}} - {{#equals @root.httpClient 'angular'}} - public {{{name}}}({{>parameters}}): Observable<{{>result}}> { - return this.httpRequest.request({ - {{else}} public {{{name}}}({{>parameters}}): CancelablePromiseresult}}>> { return this.httpRequest.request({ - {{/equals}} - {{else}} - {{#equals @root.httpClient 'angular'}} - public {{{name}}}({{>parameters}}): Observable<{{>result}}> { - return __request(OpenAPI, this.http, { {{else}} public static {{{name}}}({{>parameters}}): CancelablePromiseresult}}>> { return __request(OpenAPI, { - {{/equals}} {{/if}} method: '{{{method}}}', url: '{{{path}}}', @@ -148,7 +113,18 @@ export class {{{name}}}{{{@root.postfix}}} { {{/each}} }, {{/if}} - }){{#equals @root.httpClient 'angular'}}{{else}}.then(either.right).catch(either.left) as CancelablePromiseresult}}>>{{/equals}}; + }){{~#if results~}} + .then(([r, code]) => { + {{#each results}} + if ({{{code}}} === code) { + return {{>resultMapper}}(r); + } + {{/each}} + return r as never; + }) + {{~/if~}} + .then(either.right) + .catch(either.left) as CancelablePromiseresult}}>>; } {{/each}} diff --git a/src/templates/index.hbs b/src/templates/index.hbs index 7fa97a223..6f5b27d8c 100644 --- a/src/templates/index.hbs +++ b/src/templates/index.hbs @@ -45,11 +45,3 @@ export { {{{name}}}{{{@root.postfixServices}}} } from './services/{{{name}}}{{{@ {{/each}} {{/if}} {{/if}} - -const toLog = (d: unknown) => { - const fun = (d as any)?.toLog; - return typeof fun === 'function' ? fun() : d; -}; - -const oldLog = console.log; -console.log = (...data: unknown[]) => oldLog(...data.map(toLog)); diff --git a/src/templates/partials/resultMapper.hbs b/src/templates/partials/resultMapper.hbs new file mode 100644 index 000000000..637a37584 --- /dev/null +++ b/src/templates/partials/resultMapper.hbs @@ -0,0 +1,19 @@ +{{#equals export 'interface'}} +{{>resultMapperInterface}} +{{else equals export 'reference'}} +{{>resultMapperReference}} +{{else equals export 'enum'}} +{{>resultMapperEnum}} +{{else equals export 'array'}} +{{>resultMapperArray}} +{{else equals export 'dictionary'}} +{{>resultMapperDictionary}} +{{else equals export 'one-of'}} +{{>resultMapperUnion}} +{{else equals export 'any-of'}} +{{>resultMapperUnion}} +{{else equals export 'all-of'}} +{{>resultMapperIntersection}} +{{else}} +{{>resultMapperGeneric}} +{{/equals}} diff --git a/src/templates/partials/resultMapperArray.hbs b/src/templates/partials/resultMapperArray.hbs new file mode 100644 index 000000000..3aedeec2e --- /dev/null +++ b/src/templates/partials/resultMapperArray.hbs @@ -0,0 +1 @@ +((result) => {{#>resultMapperIsNullable}}result.map({{~#if link~}}{{>resultMapper link}}{{~else~}}{{>resultMapperBase}}{{~/if~}}){{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperBase.hbs b/src/templates/partials/resultMapperBase.hbs new file mode 100644 index 000000000..e371f4688 --- /dev/null +++ b/src/templates/partials/resultMapperBase.hbs @@ -0,0 +1 @@ +{{~#equals base 'binary'~}}((result) => result){{~else~}}{{{base}}}Mapper{{~/equals~}} diff --git a/src/templates/partials/resultMapperDictionary.hbs b/src/templates/partials/resultMapperDictionary.hbs new file mode 100644 index 000000000..2837e5518 --- /dev/null +++ b/src/templates/partials/resultMapperDictionary.hbs @@ -0,0 +1,4 @@ +((result) => {{#>resultMapperIsNullable}}{{~#if link~}}Object.fromEntries( +Object.entries(result) + .map(([key, value]) => [key, {{~#if link~}}{{>resultMapper link}}{{~else~}}{{>resultMapperBase}}{{~/if~}}(value)] as const) +){{~else~}}result{{~/if~}}{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperEnum.hbs b/src/templates/partials/resultMapperEnum.hbs new file mode 100644 index 000000000..9cddeecad --- /dev/null +++ b/src/templates/partials/resultMapperEnum.hbs @@ -0,0 +1 @@ +((result) => {{#>resultMapperIsNullable}}result{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperGeneric.hbs b/src/templates/partials/resultMapperGeneric.hbs new file mode 100644 index 000000000..9cddeecad --- /dev/null +++ b/src/templates/partials/resultMapperGeneric.hbs @@ -0,0 +1 @@ +((result) => {{#>resultMapperIsNullable}}result{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperInterface.hbs b/src/templates/partials/resultMapperInterface.hbs new file mode 100644 index 000000000..d0c2d726e --- /dev/null +++ b/src/templates/partials/resultMapperInterface.hbs @@ -0,0 +1,11 @@ +((result) => {{#>resultMapperIsNullable}}(() => { +{{~#if properties~}} + const obj = result; +{{#each properties}} + obj["{{{name}}}"] = {{#>resultMapperIsRequired}}({{#if ../parent}}{{>resultMapper parent=../parent}}{{else}}{{>resultMapper}}{{/if}})(result["{{{name}}}"]){{#if isReadOnly}} as const{{/if}}{{/resultMapperIsRequired}}; +{{/each}} + return obj; +{{~else~}} + return result; +{{~/if~}} +})(){{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperIntersection.hbs b/src/templates/partials/resultMapperIntersection.hbs new file mode 100644 index 000000000..9cddeecad --- /dev/null +++ b/src/templates/partials/resultMapperIntersection.hbs @@ -0,0 +1 @@ +((result) => {{#>resultMapperIsNullable}}result{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperIsNullable.hbs b/src/templates/partials/resultMapperIsNullable.hbs new file mode 100644 index 000000000..8429ba70e --- /dev/null +++ b/src/templates/partials/resultMapperIsNullable.hbs @@ -0,0 +1 @@ +{{#if isNullable}}O.fromNullable({{> @partial-block }}){{else}}{{> @partial-block }}{{/if}} diff --git a/src/templates/partials/resultMapperIsRequired.hbs b/src/templates/partials/resultMapperIsRequired.hbs new file mode 100644 index 000000000..f488df3be --- /dev/null +++ b/src/templates/partials/resultMapperIsRequired.hbs @@ -0,0 +1 @@ +{{#unless isRequired}}O.fromNullable({{> @partial-block }}){{else}}{{> @partial-block }}{{/unless}} diff --git a/src/templates/partials/resultMapperReference.hbs b/src/templates/partials/resultMapperReference.hbs new file mode 100644 index 000000000..8cfd36f71 --- /dev/null +++ b/src/templates/partials/resultMapperReference.hbs @@ -0,0 +1 @@ +((result) => {{#>resultMapperIsNullable}}{{>resultMapperBase}}(result){{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperUnion.hbs b/src/templates/partials/resultMapperUnion.hbs new file mode 100644 index 000000000..9cddeecad --- /dev/null +++ b/src/templates/partials/resultMapperUnion.hbs @@ -0,0 +1 @@ +((result) => {{#>resultMapperIsNullable}}result{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/typeInterface.hbs b/src/templates/partials/typeInterface.hbs index 238a72a38..db5cba37e 100644 --- a/src/templates/partials/typeInterface.hbs +++ b/src/templates/partials/typeInterface.hbs @@ -1,5 +1,5 @@ {{~#if properties~}} -{{#>isNullable}}{ +{{#>isNullable}} {{#each properties}} {{#ifdef description deprecated}} /** @@ -17,7 +17,7 @@ {{>isReadOnly}}{{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}; {{/if}} {{/each}} -}{{/isNullable}} +{{/isNullable}} {{~else~}} -any +unknown {{~/if~}} diff --git a/src/utils/getHttpRequestName.ts b/src/utils/getHttpRequestName.ts index 53b7ad05a..b69062092 100644 --- a/src/utils/getHttpRequestName.ts +++ b/src/utils/getHttpRequestName.ts @@ -14,7 +14,5 @@ export const getHttpRequestName = (httpClient: HttpClient): string => { return 'NodeHttpRequest'; case HttpClient.AXIOS: return 'AxiosHttpRequest'; - case HttpClient.ANGULAR: - return 'AngularHttpRequest'; } }; diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..0660730a1 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -2,12 +2,6 @@ import Handlebars from 'handlebars/runtime'; import { HttpClient } from '../HttpClient'; import templateClient from '../templates/client.hbs'; -import angularGetHeaders from '../templates/core/angular/getHeaders.hbs'; -import angularGetRequestBody from '../templates/core/angular/getRequestBody.hbs'; -import angularGetResponseBody from '../templates/core/angular/getResponseBody.hbs'; -import angularGetResponseHeader from '../templates/core/angular/getResponseHeader.hbs'; -import angularRequest from '../templates/core/angular/request.hbs'; -import angularSendRequest from '../templates/core/angular/sendRequest.hbs'; import templateCoreApiError from '../templates/core/ApiError.hbs'; import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs'; import templateCoreApiResult from '../templates/core/ApiResult.hbs'; @@ -55,6 +49,7 @@ import xhrSendRequest from '../templates/core/xhr/sendRequest.hbs'; import templateExportModel from '../templates/exportModel.hbs'; import templateExportSchema from '../templates/exportSchema.hbs'; import templateExportService from '../templates/exportService.hbs'; +import templateExportMapper from '../templates/exportMapper.hbs'; import templateIndex from '../templates/index.hbs'; import partialBase from '../templates/partials/base.hbs'; import partialExportComposition from '../templates/partials/exportComposition.hbs'; @@ -67,6 +62,18 @@ import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; import partialIsRequired from '../templates/partials/isRequired.hbs'; import partialParameters from '../templates/partials/parameters.hbs'; import partialResult from '../templates/partials/result.hbs'; +import partialResultMapper from '../templates/partials/resultMapper.hbs'; +import partialResultMapperBase from '../templates/partials/resultMapperBase.hbs'; +import partialResultMapperArray from '../templates/partials/resultMapperArray.hbs'; +import partialResultMapperDictionary from '../templates/partials/resultMapperDictionary.hbs'; +import partialResultMapperEnum from '../templates/partials/resultMapperEnum.hbs'; +import partialResultMapperGeneric from '../templates/partials/resultMapperGeneric.hbs'; +import partialResultMapperInterface from '../templates/partials/resultMapperInterface.hbs'; +import partialResultMapperIntersection from '../templates/partials/resultMapperIntersection.hbs'; +import partialResultMapperReference from '../templates/partials/resultMapperReference.hbs'; +import partialResultMapperUnion from '../templates/partials/resultMapperUnion.hbs'; +import partialResultMapperIsRequired from '../templates/partials/resultMapperIsRequired.hbs'; +import partialResultMapperIsNullable from '../templates/partials/resultMapperIsNullable.hbs'; import partialSchema from '../templates/partials/schema.hbs'; import partialSchemaArray from '../templates/partials/schemaArray.hbs'; import partialSchemaComposition from '../templates/partials/schemaComposition.hbs'; @@ -92,6 +99,7 @@ export interface Templates { model: Handlebars.TemplateDelegate; schema: Handlebars.TemplateDelegate; service: Handlebars.TemplateDelegate; + mapper: Handlebars.TemplateDelegate; }; core: { settings: Handlebars.TemplateDelegate; @@ -124,6 +132,7 @@ export const registerHandlebarTemplates = (root: { model: Handlebars.template(templateExportModel), schema: Handlebars.template(templateExportSchema), service: Handlebars.template(templateExportService), + mapper: Handlebars.template(templateExportMapper), }, core: { settings: Handlebars.template(templateCoreSettings), @@ -148,6 +157,18 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); Handlebars.registerPartial('result', Handlebars.template(partialResult)); + Handlebars.registerPartial('resultMapper', Handlebars.template(partialResultMapper)); + Handlebars.registerPartial('resultMapperBase', Handlebars.template(partialResultMapperBase)); + Handlebars.registerPartial('resultMapperArray', Handlebars.template(partialResultMapperArray)); + Handlebars.registerPartial('resultMapperDictionary', Handlebars.template(partialResultMapperDictionary)); + Handlebars.registerPartial('resultMapperEnum', Handlebars.template(partialResultMapperEnum)); + Handlebars.registerPartial('resultMapperGeneric', Handlebars.template(partialResultMapperGeneric)); + Handlebars.registerPartial('resultMapperInterface', Handlebars.template(partialResultMapperInterface)); + Handlebars.registerPartial('resultMapperIntersection', Handlebars.template(partialResultMapperIntersection)); + Handlebars.registerPartial('resultMapperReference', Handlebars.template(partialResultMapperReference)); + Handlebars.registerPartial('resultMapperUnion', Handlebars.template(partialResultMapperUnion)); + Handlebars.registerPartial('resultMapperIsNullable', Handlebars.template(partialResultMapperIsNullable)); + Handlebars.registerPartial('resultMapperIsRequired', Handlebars.template(partialResultMapperIsRequired)); Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); Handlebars.registerPartial('schemaDictionary', Handlebars.template(partialSchemaDictionary)); @@ -212,13 +233,5 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('axios/sendRequest', Handlebars.template(axiosSendRequest)); Handlebars.registerPartial('axios/request', Handlebars.template(axiosRequest)); - // Specific files for the angular client implementation - Handlebars.registerPartial('angular/getHeaders', Handlebars.template(angularGetHeaders)); - Handlebars.registerPartial('angular/getRequestBody', Handlebars.template(angularGetRequestBody)); - Handlebars.registerPartial('angular/getResponseBody', Handlebars.template(angularGetResponseBody)); - Handlebars.registerPartial('angular/getResponseHeader', Handlebars.template(angularGetResponseHeader)); - Handlebars.registerPartial('angular/sendRequest', Handlebars.template(angularSendRequest)); - Handlebars.registerPartial('angular/request', Handlebars.template(angularRequest)); - return templates; }; diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 3c06a95a5..9f4d6f6df 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -23,6 +23,7 @@ describe('writeClient', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', + mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index cea2f3d88..30f5a177e 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -13,6 +13,7 @@ import { writeClientIndex } from './writeClientIndex'; import { writeClientModels } from './writeClientModels'; import { writeClientSchemas } from './writeClientSchemas'; import { writeClientServices } from './writeClientServices'; +import { writeClientMappers } from './writeClientMappers'; /** * Write our OpenAPI client, using the given templates at the given output @@ -53,6 +54,7 @@ export const writeClient = async ( const outputPath = resolve(process.cwd(), output); const outputPathCore = resolve(outputPath, 'core'); const outputPathModels = resolve(outputPath, 'models'); + const outputPathMappers = resolve(outputPath, 'mappers'); const outputPathSchemas = resolve(outputPath, 'schemas'); const outputPathServices = resolve(outputPath, 'services'); @@ -94,6 +96,12 @@ export const writeClient = async ( await writeClientModels(client.models, templates, outputPathModels, httpClient, useUnionTypes, indent); } + if (exportModels) { + await rmdir(outputPathMappers); + await mkdir(outputPathMappers); + await writeClientMappers(client.models, templates, outputPathMappers, httpClient, useUnionTypes, indent); + } + if (isDefined(clientName)) { await mkdir(outputPath); await writeClientClass(client, templates, outputPath, httpClient, clientName, indent, postfixServices); diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts index 102f2eb57..2b32a1ae6 100644 --- a/src/utils/writeClientClass.spec.ts +++ b/src/utils/writeClientClass.spec.ts @@ -23,6 +23,7 @@ describe('writeClientClass', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', + mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index 7db71f59b..be30094b2 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -26,6 +26,7 @@ describe('writeClientCore', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', + mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index a7d5b610a..b660b3b31 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -23,6 +23,7 @@ describe('writeClientIndex', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', + mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientMappers.ts b/src/utils/writeClientMappers.ts new file mode 100644 index 000000000..546bc78fd --- /dev/null +++ b/src/utils/writeClientMappers.ts @@ -0,0 +1,37 @@ +import { resolve } from 'path'; + +import type { Model } from '../client/interfaces/Model'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import { formatCode as f } from './formatCode'; +import { formatIndentation as i } from './formatIndentation'; +import type { Templates } from './registerHandlebarTemplates'; + +/** + * Generate Models using the Handlebar template and write to disk. + * @param models Array of Models to write + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param useUnionTypes Use union types instead of enums + * @param indent Indentation options (4, 2 or tab) + */ +export const writeClientMappers = async ( + models: Model[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + useUnionTypes: boolean, + indent: Indent +): Promise => { + for (const model of models) { + const file = resolve(outputPath, `${model.name}Mapper.ts`); + const templateResult = templates.exports.mapper({ + ...model, + httpClient, + useUnionTypes, + }); + await writeFile(file, i(f(templateResult), indent)); + } +}; diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index ee0f2b4f6..7774219f5 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -39,6 +39,7 @@ describe('writeClientModels', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', + mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index e75928b8c..dff39dbc5 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -39,6 +39,7 @@ describe('writeClientSchemas', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', + mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index f936d6609..18185e59e 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -27,6 +27,7 @@ describe('writeClientServices', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', + mapper: () => 'mapper', }, core: { settings: () => 'settings', From d1bc98e64c799e8aa8b9b411b6125b187ed98fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Fri, 3 Nov 2023 22:41:50 +0000 Subject: [PATCH 08/48] =?UTF-8?q?=F0=9F=9A=91=20request=20class=20generati?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- src/templates/core/request.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7e1c96bd6..5b5702489 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.26.0", + "version": "0.26.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/core/request.hbs b/src/templates/core/request.hbs index 53a5ec064..6c3920733 100644 --- a/src/templates/core/request.hbs +++ b/src/templates/core/request.hbs @@ -1,4 +1,4 @@ {{~#equals @root.httpClient 'xhr'}}{{>xhr/request}}{{/equals~}} {{~#equals @root.httpClient 'axios'}}{{>axios/request}}{{/equals~}} -{{~#equals @root.httpClient 'angular'}}{{>angular/request}}{{/equals~}} +{{~#equals @root.httpClient 'fetch'}}{{>fetch/request}}{{/equals~}} {{~#equals @root.httpClient 'node'}}{{>node/request}}{{/equals~}} From a2d3102ce728c0145ddc9317115d9c128a495f3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Fri, 3 Nov 2023 23:18:49 +0000 Subject: [PATCH 09/48] =?UTF-8?q?=F0=9F=90=9B=20use=20correct=20module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- src/templates/exportService.hbs | 2 +- src/templates/partials/header.hbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5b5702489..b92b95eeb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.26.1", + "version": "0.26.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 343ac7a17..55b1d8369 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -1,7 +1,7 @@ {{>header}} import { either } from 'fp-ts'; -import type { Either } from 'fp-ts/Either'; +import type { Either } from 'fp-ts/lib/Either'; import type { ApiError } from '../core/ApiError'; {{#if imports}} {{#each imports}} diff --git a/src/templates/partials/header.hbs b/src/templates/partials/header.hbs index 99ea488e4..58009d560 100644 --- a/src/templates/partials/header.hbs +++ b/src/templates/partials/header.hbs @@ -3,4 +3,4 @@ /* tslint:disable */ /* eslint-disable */ // @ts-ignore: Does not need to be used -import * as O from 'fp-ts/Option'; +import * as O from 'fp-ts/lib/Option'; From 6f7aac577e15944425666c4701499eec919a05c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 6 Nov 2023 23:29:54 +0000 Subject: [PATCH 10/48] =?UTF-8?q?=E2=9C=A8=20response=20mapper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- README.md | 5 +- package-lock.json | 1814 +++++++++++++---- package.json | 6 +- src/openApi/v2/parser/getMappedType.spec.ts | 4 +- src/openApi/v2/parser/getMappedType.ts | 4 +- src/openApi/v3/parser/getOperation.ts | 18 +- src/templates/core/ApiRequestOptions.hbs | 12 +- src/templates/core/BaseHttpRequest.hbs | 19 - src/templates/core/fetch/request.hbs | 6 +- src/templates/exportMapper.hbs | 10 - src/templates/exportModel.hbs | 25 +- src/templates/exportService.hbs | 57 +- src/templates/index.hbs | 10 +- src/templates/partials/base.hbs | 35 +- src/templates/partials/header.hbs | 2 - src/templates/partials/isNullable.hbs | 2 +- src/templates/partials/isRequired.hbs | 2 +- src/templates/partials/parameters.hbs | 20 +- src/templates/partials/result.hbs | 2 +- src/templates/partials/resultMapper.hbs | 19 - src/templates/partials/resultMapperArray.hbs | 1 - src/templates/partials/resultMapperBase.hbs | 1 - .../partials/resultMapperDictionary.hbs | 4 - src/templates/partials/resultMapperEnum.hbs | 1 - .../partials/resultMapperGeneric.hbs | 1 - .../partials/resultMapperInterface.hbs | 11 - .../partials/resultMapperIntersection.hbs | 1 - .../partials/resultMapperIsNullable.hbs | 1 - .../partials/resultMapperIsRequired.hbs | 1 - .../partials/resultMapperReference.hbs | 1 - src/templates/partials/resultMapperUnion.hbs | 1 - src/templates/partials/typeArray.hbs | 6 +- src/templates/partials/typeDictionary.hbs | 6 +- src/templates/partials/typeEnum.hbs | 2 +- src/templates/partials/typeInterface.hbs | 26 +- src/templates/partials/typeIntersection.hbs | 2 +- src/templates/partials/typeReference.hbs | 2 +- src/templates/partials/typeUnion.hbs | 2 +- src/utils/registerHandlebarTemplates.ts | 27 - src/utils/writeClient.spec.ts | 1 - src/utils/writeClient.ts | 8 - src/utils/writeClientClass.spec.ts | 1 - src/utils/writeClientCore.spec.ts | 1 - src/utils/writeClientIndex.spec.ts | 1 - src/utils/writeClientMappers.ts | 37 - src/utils/writeClientModels.spec.ts | 1 - src/utils/writeClientSchemas.spec.ts | 1 - src/utils/writeClientServices.spec.ts | 1 - 48 files changed, 1553 insertions(+), 668 deletions(-) delete mode 100644 src/templates/exportMapper.hbs delete mode 100644 src/templates/partials/resultMapper.hbs delete mode 100644 src/templates/partials/resultMapperArray.hbs delete mode 100644 src/templates/partials/resultMapperBase.hbs delete mode 100644 src/templates/partials/resultMapperDictionary.hbs delete mode 100644 src/templates/partials/resultMapperEnum.hbs delete mode 100644 src/templates/partials/resultMapperGeneric.hbs delete mode 100644 src/templates/partials/resultMapperInterface.hbs delete mode 100644 src/templates/partials/resultMapperIntersection.hbs delete mode 100644 src/templates/partials/resultMapperIsNullable.hbs delete mode 100644 src/templates/partials/resultMapperIsRequired.hbs delete mode 100644 src/templates/partials/resultMapperReference.hbs delete mode 100644 src/templates/partials/resultMapperUnion.hbs delete mode 100644 src/utils/writeClientMappers.ts diff --git a/README.md b/README.md index b851329a8..4c662b50e 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,9 @@ $ openapi --help -V, --version output the version number -i, --input OpenAPI specification, can be a path, url or string content (required) -o, --output Output directory (required) - -c, --client HTTP client to generate [fetch, xhr, node, axios, angular] (default: "fetch") + -c, --client HTTP client to generate [fetch, xhr, node, axios] (default: "fetch") --name Custom client class name --useOptions Use options instead of arguments - --useUnionTypes Use union types instead of enums --exportCore Write core files to disk (default: true) --exportServices Write services to disk (default: true) --exportModels Write models to disk (default: true) @@ -78,7 +77,6 @@ Documentation - [OpenAPI object](docs/openapi-object.md) - [Client instances](docs/client-instances.md) `--name` - [Argument vs. Object style](docs/arguments-vs-object-style.md) `--useOptions` -- [Enums vs. Union types](docs/enum-vs-union-types.md) `--useUnionTypes` - [Runtime schemas](docs/runtime-schemas.md) `--exportSchemas` - [Enum with custom names and descriptions](docs/custom-enums.md) - [Nullable props (OpenAPI v2)](docs/nullable-props.md) @@ -91,7 +89,6 @@ Support === - [Babel support](docs/babel-support.md) - [Axios support](docs/axios-support.md) -- [Angular support](docs/angular-support.md) - [Node-Fetch support](docs/node-fetch-support.md) [npm-url]: https://npmjs.org/package/openapi-typescript-codegen diff --git a/package-lock.json b/package-lock.json index 39759e672..d70d4027f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { - "name": "openapi-typescript-codegen", - "version": "0.25.0", + "name": "@majkit/openapi", + "version": "0.26.2", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "openapi-typescript-codegen", - "version": "0.25.0", + "name": "@majkit/openapi", + "version": "0.26.2", "license": "MIT", "dependencies": { + "@majkit/fp-ts-schema": "^1.1.0", "camelcase": "^6.3.0", "commander": "^11.0.0", - "fp-ts": "^2.16.1", "fs-extra": "^11.1.1", "handlebars": "^4.7.7", "json-schema-ref-parser": "^9.0.9" @@ -20,7 +20,7 @@ "openapi": "bin/index.js" }, "devDependencies": { - "@angular-devkit/build-angular": "16.1.3", + "@angular-devkit/build-angular": "^16.2.9", "@angular/animations": "16.1.3", "@angular/cli": "16.1.3", "@angular/common": "16.1.3", @@ -113,40 +113,40 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.3.tgz", - "integrity": "sha512-1scrdUdKRa9TkJ9jev/KRzFttbLUVACQvVRL0G67nUAdtJ/bQX8eui85axpCNPFihK4ReSW3R4lrgcVC2NUSoA==", + "version": "16.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.9.tgz", + "integrity": "sha512-S1C4UYxRVyNt3C0wCxbT2jZ1dN5i37kS0mol3PQjbR8gQ0GQzHmzhjTBl1oImo8aouET9yhrk9etk65oat4mBQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.3", - "@angular-devkit/build-webpack": "0.1601.3", - "@angular-devkit/core": "16.1.3", - "@babel/core": "7.22.5", - "@babel/generator": "7.22.5", + "@angular-devkit/architect": "0.1602.9", + "@angular-devkit/build-webpack": "0.1602.9", + "@angular-devkit/core": "16.2.9", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", "@babel/plugin-proposal-async-generator-functions": "7.20.7", "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.22.5", - "@babel/preset-env": "7.22.5", - "@babel/runtime": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.1.3", + "@ngtools/webpack": "16.2.9", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", - "babel-loader": "9.1.2", + "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", - "cacache": "17.1.3", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.19", + "critters": "0.0.20", "css-loader": "6.8.1", - "esbuild-wasm": "0.17.19", - "fast-glob": "3.2.12", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", @@ -155,31 +155,31 @@ "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.0", + "magic-string": "0.30.1", "mini-css-extract-plugin": "2.7.6", "mrmime": "1.0.1", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "2.3.1", - "piscina": "3.2.0", - "postcss": "8.4.24", - "postcss-loader": "7.3.2", + "piscina": "4.0.0", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.63.2", - "sass-loader": "13.3.1", - "semver": "7.5.3", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "terser": "5.17.7", + "terser": "5.19.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.5.3", - "vite": "4.3.9", - "webpack": "5.86.0", + "tslib": "2.6.1", + "vite": "4.4.7", + "webpack": "5.88.2", "webpack-dev-middleware": "6.1.1", - "webpack-dev-server": "4.15.0", + "webpack-dev-server": "4.15.1", "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, @@ -189,7 +189,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.17.19" + "esbuild": "0.18.17" }, "peerDependencies": { "@angular/compiler-cli": "^16.0.0", @@ -234,27 +234,69 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1602.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.9.tgz", + "integrity": "sha512-U3vfb/e2sFfg0D9FyyRBXRPP7g4FBFtGK8Q3JPmvAVsHHwi5AUFRNR7YBChB/T5TMNY077HcTyEirVh2FeUpdA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.9", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "16.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.9.tgz", + "integrity": "sha512-dcHWjHBNGm3yCeNz19y8A1At4KgyC6XHNnbFL0y+nnZYiaESXjUoXJYKASedI6A+Bpl0HNq2URhH6bL6Af3+4w==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.8", "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -274,13 +316,13 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/preset-env": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", - "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", @@ -305,13 +347,13 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", "@babel/plugin-transform-block-scoping": "^7.22.5", "@babel/plugin-transform-class-properties": "^7.22.5", "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", "@babel/plugin-transform-computed-properties": "^7.22.5", "@babel/plugin-transform-destructuring": "^7.22.5", "@babel/plugin-transform-dotall-regex": "^7.22.5", @@ -336,7 +378,7 @@ "@babel/plugin-transform-object-rest-spread": "^7.22.5", "@babel/plugin-transform-object-super": "^7.22.5", "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", "@babel/plugin-transform-parameters": "^7.22.5", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.5", @@ -354,11 +396,11 @@ "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "core-js-compat": "^3.30.2", - "semver": "^6.3.0" + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -376,19 +418,454 @@ "semver": "bin/semver.js" } }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1601.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.3.tgz", - "integrity": "sha512-744+72vi/Vx010VxizGgilhpnDCOG29qyhMmu7BkUhtpq8E8eQn2HU3nPpxAqrg3bKVAwD7v3F111MVIhub8kA==", + "version": "0.1602.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.9.tgz", + "integrity": "sha512-+3IxovfBPR2Vy730mGa0SVKkd5LQVom85gjXOs7WcnnnZmfc1q/BtFlqTgW1UWvTxP8IQdm7UYWVclQfL/WExw==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.3", + "@angular-devkit/architect": "0.1602.9", "rxjs": "7.8.1" }, "engines": { @@ -401,6 +878,48 @@ "webpack-dev-server": "^4.0.0" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1602.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.9.tgz", + "integrity": "sha512-U3vfb/e2sFfg0D9FyyRBXRPP7g4FBFtGK8Q3JPmvAVsHHwi5AUFRNR7YBChB/T5TMNY077HcTyEirVh2FeUpdA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.9", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "16.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.9.tgz", + "integrity": "sha512-dcHWjHBNGm3yCeNz19y8A1At4KgyC6XHNnbFL0y+nnZYiaESXjUoXJYKASedI6A+Bpl0HNq2URhH6bL6Af3+4w==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular-devkit/core": { "version": "16.1.3", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.3.tgz", @@ -883,9 +1402,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { "@babel/types": "^7.22.5", @@ -966,19 +1485,7 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { @@ -1123,18 +1630,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", @@ -1215,9 +1710,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -1401,6 +1896,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -1826,18 +2322,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", @@ -2336,17 +2820,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", - "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "semver": "^6.3.0" + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2680,9 +3164,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -2741,18 +3225,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", @@ -2805,9 +3277,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ "arm" ], @@ -2821,9 +3293,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ "arm64" ], @@ -2837,9 +3309,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "cpu": [ "x64" ], @@ -2853,9 +3325,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], @@ -2869,9 +3341,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "cpu": [ "x64" ], @@ -2885,9 +3357,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "cpu": [ "arm64" ], @@ -2901,9 +3373,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "cpu": [ "x64" ], @@ -2917,9 +3389,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "cpu": [ "arm" ], @@ -2933,9 +3405,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "cpu": [ "arm64" ], @@ -2949,9 +3421,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "cpu": [ "ia32" ], @@ -2965,9 +3437,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" ], @@ -2981,9 +3453,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "cpu": [ "mips64el" ], @@ -2997,9 +3469,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "cpu": [ "ppc64" ], @@ -3013,9 +3485,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "cpu": [ "riscv64" ], @@ -3029,9 +3501,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ "s390x" ], @@ -3045,9 +3517,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ "x64" ], @@ -3061,9 +3533,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" ], @@ -3077,9 +3549,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "cpu": [ "x64" ], @@ -3093,9 +3565,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" ], @@ -3109,9 +3581,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" ], @@ -3125,9 +3597,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" ], @@ -3141,9 +3613,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -4265,10 +4737,19 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@majkit/fp-ts-schema": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@majkit/fp-ts-schema/-/fp-ts-schema-1.1.0.tgz", + "integrity": "sha512-UDGzg7rwPpIp3MQ5E1vyHR6fwuUz2pmboA4nRNzUxf3APpO1tjHYyhz4vuC3UOBmMDZXq9ws7Y3V9GmmteN2vw==", + "dependencies": { + "fp-ts": "^2.16.1", + "schemawax": "^1.0.12" + } + }, "node_modules/@ngtools/webpack": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.3.tgz", - "integrity": "sha512-YTL1RzP7ErJqskx+ZwdC/nWsOSBfC4yYWmMyWL2J0d+oJ3N2XIzrKVoDcZ4IVzv3Du+3zoGp0ups/wWXvfzM/Q==", + "version": "16.2.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.9.tgz", + "integrity": "sha512-rOclD7FfT4OSwVA0nDnULbJS6TORJ0+sQiuT2ebaNFErYr3LOm6Zut05tnmzFw8q1cePrILbG+xpnbggNr9Pyw==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -4503,22 +4984,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@pkgr/utils/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/@pkgr/utils/node_modules/open": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", @@ -4945,9 +5410,9 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", + "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", "dev": true, "dependencies": { "@types/node": "*" @@ -4963,9 +5428,9 @@ } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", + "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -5067,9 +5532,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "version": "1.17.13", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", + "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", "dev": true, "dependencies": { "@types/node": "*" @@ -5168,6 +5633,15 @@ "node": ">= 6" } }, + "node_modules/@types/node-forge": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", + "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.9", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", @@ -5209,9 +5683,9 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", + "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", "dev": true, "dependencies": { "@types/express": "*" @@ -5229,9 +5703,9 @@ } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.35", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", + "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", "dev": true, "dependencies": { "@types/node": "*" @@ -5244,9 +5718,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", + "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", "dev": true, "dependencies": { "@types/node": "*" @@ -5836,6 +6310,99 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" + }, + "peerDependencies": { + "typescript": ">=3.2.x || >= 4.x" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5903,6 +6470,37 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", @@ -6339,12 +6937,12 @@ } }, "node_modules/babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.2", + "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "engines": { @@ -6664,6 +7262,12 @@ "node": ">=8" } }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "node_modules/browserslist": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", @@ -7151,6 +7755,12 @@ "node": ">=16" } }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -7316,34 +7926,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -7540,9 +8122,9 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.19", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", - "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -7713,6 +8295,30 @@ "node": ">=4" } }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, "node_modules/data-uri-to-buffer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", @@ -7722,6 +8328,55 @@ "node": ">= 14" } }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -7739,6 +8394,12 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -8057,9 +8718,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -8106,6 +8767,27 @@ } ] }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -8290,9 +8972,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -8302,34 +8984,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/esbuild-wasm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", - "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -9050,9 +9732,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -9204,44 +9886,116 @@ "dev": true }, "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-up": { @@ -9699,6 +10453,18 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "dependencies": { + "@wessberg/ts-evaluator": "0.0.27" + }, + "peerDependencies": { + "typescript": ">=3.7.5" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -9864,6 +10630,18 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -10496,6 +11274,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -12343,9 +13127,9 @@ } }, "node_modules/jiti": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", - "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -12370,6 +13154,151 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "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/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -12487,13 +13416,13 @@ } }, "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, "dependencies": { "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "shell-quote": "^1.8.1" } }, "node_modules/less": { @@ -13403,9 +14332,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", "dev": true, "optional": true, "bin": { @@ -13677,6 +14606,12 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -13686,6 +14621,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true, + "engines": { + "node": ">= 10.12.0" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -14286,9 +15230,9 @@ } }, "node_modules/piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, "dependencies": { "eventemitter-asyncresource": "^1.0.0", @@ -14312,9 +15256,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -14340,14 +15284,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", - "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "dependencies": { - "cosmiconfig": "^8.1.3", + "cosmiconfig": "^8.2.0", "jiti": "^1.18.2", - "klona": "^2.0.6", "semver": "^7.3.8" }, "engines": { @@ -14676,6 +15619,12 @@ "dev": true, "optional": true }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -14766,6 +15715,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -15311,9 +16266,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.63.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", - "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -15328,12 +16283,11 @@ } }, "node_modules/sass-loader": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz", - "integrity": "sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "dependencies": { - "klona": "^2.0.6", "neo-async": "^2.6.2" }, "engines": { @@ -15372,6 +16326,18 @@ "dev": true, "optional": true }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -15391,6 +16357,11 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schemawax": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/schemawax/-/schemawax-1.0.12.tgz", + "integrity": "sha512-1N6jkJHStJs24CRSb5UGgye83wxQAx3bOeJ8zaJ+QXBcUyd+xxSgZ6H9GlpYxqlddeXgOmamxS+afYZGNKWsCw==" + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -15398,11 +16369,12 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -16101,6 +17073,12 @@ "node": ">=0.10" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/synckit": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", @@ -16235,9 +17213,9 @@ } }, "node_modules/terser": { - "version": "5.17.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", - "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -16491,6 +17469,30 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -16803,6 +17805,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/urlgrey": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", @@ -16888,14 +17900,14 @@ } }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.18.10", + "postcss": "^8.4.26", + "rollup": "^3.25.2" }, "bin": { "vite": "bin/vite.js" @@ -16903,12 +17915,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -16921,6 +17937,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -16935,6 +17954,28 @@ } } }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -16982,9 +18023,9 @@ "dev": true }, "node_modules/webpack": { - "version": "5.86.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", - "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -16996,7 +18037,7 @@ "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -17006,7 +18047,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -17057,9 +18098,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -17068,7 +18109,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -17319,6 +18360,21 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -17511,6 +18567,18 @@ } } }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index b92b95eeb..fc50f123b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.26.2", + "version": "0.27.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", @@ -60,15 +60,15 @@ "docker": "docker build -t eeelenbaas/openapi-typescript-codegen ." }, "dependencies": { + "@majkit/fp-ts-schema": "^1.1.0", "camelcase": "^6.3.0", "commander": "^11.0.0", - "fp-ts": "^2.16.1", "fs-extra": "^11.1.1", "handlebars": "^4.7.7", "json-schema-ref-parser": "^9.0.9" }, "devDependencies": { - "@angular-devkit/build-angular": "16.1.3", + "@angular-devkit/build-angular": "^16.2.9", "@angular/animations": "16.1.3", "@angular/cli": "16.1.3", "@angular/common": "16.1.3", diff --git a/src/openApi/v2/parser/getMappedType.spec.ts b/src/openApi/v2/parser/getMappedType.spec.ts index 8dd847c91..f6d7886c6 100644 --- a/src/openApi/v2/parser/getMappedType.spec.ts +++ b/src/openApi/v2/parser/getMappedType.spec.ts @@ -4,8 +4,8 @@ describe('getMappedType', () => { it('should map types to the basics', () => { expect(getMappedType('file')).toEqual('binary'); expect(getMappedType('string')).toEqual('string'); - expect(getMappedType('date')).toEqual('string'); - expect(getMappedType('date-time')).toEqual('string'); + expect(getMappedType('date')).toEqual('date'); + expect(getMappedType('date-time')).toEqual('date'); expect(getMappedType('float')).toEqual('number'); expect(getMappedType('double')).toEqual('number'); expect(getMappedType('short')).toEqual('number'); diff --git a/src/openApi/v2/parser/getMappedType.ts b/src/openApi/v2/parser/getMappedType.ts index a7c32fd84..74806f1ce 100644 --- a/src/openApi/v2/parser/getMappedType.ts +++ b/src/openApi/v2/parser/getMappedType.ts @@ -13,8 +13,8 @@ const TYPE_MAPPINGS = new Map([ ['long', 'number'], ['number', 'number'], ['char', 'string'], - ['date', 'string'], - ['date-time', 'string'], + ['date', 'date'], + ['date-time', 'date'], ['password', 'string'], ['string', 'string'], ['void', 'void'], diff --git a/src/openApi/v3/parser/getOperation.ts b/src/openApi/v3/parser/getOperation.ts index aee4bd0c2..96c84770a 100644 --- a/src/openApi/v3/parser/getOperation.ts +++ b/src/openApi/v3/parser/getOperation.ts @@ -75,10 +75,20 @@ export const getOperation = ( operation.errors = getOperationErrors(operationResponses); operation.responseHeader = getOperationResponseHeader(operationResults); - operationResults.forEach(operationResult => { - operation.results.push(operationResult); - operation.imports.push(...operationResult.imports); - }); + const types = { + 'application/json': 1, + 'x-www-form-urlencoded': 2, + 'application/xml': 3, + } as const; + + operationResults + .sort((a, b) => (types[a.type as keyof typeof types] ?? 4) - (types[b.type as keyof typeof types] ?? 4)) + .filter(($, i1, arr) => arr.filter(({ code }, i2) => i1 > i2 && code === $.code).length === 0) + .sort((a, b) => a.code - b.code) + .forEach(operationResult => { + operation.results.push(operationResult); + operation.imports.push(...operationResult.imports); + }); } operation.parameters = operation.parameters.sort(sortByRequired); diff --git a/src/templates/core/ApiRequestOptions.hbs b/src/templates/core/ApiRequestOptions.hbs index 355929a71..834823f88 100644 --- a/src/templates/core/ApiRequestOptions.hbs +++ b/src/templates/core/ApiRequestOptions.hbs @@ -1,6 +1,15 @@ {{>header}} -export type ApiRequestOptions = { +import type * as D from '@majkit/fp-ts-schema'; + +export type ApiResponse>> = { + [key in keyof T]: { + readonly status: key; + readonly body: D.Output; + }; +}[keyof T]; + +export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; readonly path?: Record; @@ -10,6 +19,7 @@ export type ApiRequestOptions = { readonly formData?: Record; readonly body?: any; readonly mediaType?: string; + readonly responseDecoders?: T; readonly responseHeader?: string; readonly errors?: Record; }; diff --git a/src/templates/core/BaseHttpRequest.hbs b/src/templates/core/BaseHttpRequest.hbs index 43ff79cbb..c4c992a82 100644 --- a/src/templates/core/BaseHttpRequest.hbs +++ b/src/templates/core/BaseHttpRequest.hbs @@ -1,31 +1,12 @@ {{>header}} -{{#equals @root.httpClient 'angular'}} -import type { HttpClient } from '@angular/common/http'; -import type { Observable } from 'rxjs'; - -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { OpenAPIConfig } from './OpenAPI'; -{{else}} import type { ApiRequestOptions } from './ApiRequestOptions'; import type { CancelablePromise } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; -{{/equals}} export abstract class BaseHttpRequest { - {{#equals @root.httpClient 'angular'}} - constructor( - public readonly config: OpenAPIConfig, - public readonly http: HttpClient, - ) {} - {{else}} constructor(public readonly config: OpenAPIConfig) {} - {{/equals}} - {{#equals @root.httpClient 'angular'}} - public abstract request(options: ApiRequestOptions): Observable; - {{else}} public abstract request(options: ApiRequestOptions): CancelablePromise; - {{/equals}} } diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index 9604fd564..2c6f1cfa9 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -1,11 +1,13 @@ {{>header}} import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import { CancelablePromise } from './CancelablePromise'; import type { OnCancel } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; +import type * as D from '@majkit/fp-ts-schema'; +import type { Either } from 'fp-ts/lib/Either'; {{>functions/isDefined}} @@ -88,7 +90,7 @@ const convertRequestBody = (body: unknown): any => * @returns CancelablePromise * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { options = convertRequestBody(options); diff --git a/src/templates/exportMapper.hbs b/src/templates/exportMapper.hbs deleted file mode 100644 index fb32ba207..000000000 --- a/src/templates/exportMapper.hbs +++ /dev/null @@ -1,10 +0,0 @@ -{{>header}} - -{{#if imports}} - -{{#each imports}} -import { {{{this}}}Mapper } from './{{{this}}}Mapper'; -{{/each}} -{{/if}} - -export const {{{name}}}Mapper = (a: any) => {{>resultMapper}}(a); diff --git a/src/templates/exportModel.hbs b/src/templates/exportModel.hbs index 7ddb2c3e8..abe8d2c55 100644 --- a/src/templates/exportModel.hbs +++ b/src/templates/exportModel.hbs @@ -1,26 +1,13 @@ {{>header}} -{{#if imports}} +import * as D from '@majkit/fp-ts-schema'; +{{#if imports}} {{#each imports}} -import type { {{{this}}} } from './{{{this}}}'; +import { {{{this}}} } from './{{{this}}}'; {{/each}} {{/if}} -{{#equals export 'interface'}} -{{>exportInterface}} -{{else equals export 'one-of'}} -{{>exportComposition}} -{{else equals export 'any-of'}} -{{>exportComposition}} -{{else equals export 'all-of'}} -{{>exportComposition}} -{{else equals export 'enum'}} -{{#if @root.useUnionTypes}} -{{>exportType}} -{{else}} -{{>exportEnum}} -{{/if}} -{{else}} -{{>exportType}} -{{/equals}} +export const {{{name}}} = {{>type}}; + +export type {{{name}}}Type = D.Output; diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 55b1d8369..0f7d6df32 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -1,18 +1,13 @@ {{>header}} -import { either } from 'fp-ts'; -import type { Either } from 'fp-ts/lib/Either'; -import type { ApiError } from '../core/ApiError'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; {{#if imports}} {{#each imports}} -import type { {{{this}}} } from '../models/{{{this}}}'; -{{/each}} -{{#each imports}} -import { {{{this}}}Mapper } from '../mappers/{{{this}}}Mapper'; +import { {{{this}}} } from '../models/{{{this}}}'; {{/each}} {{/if}} -import type { CancelablePromise } from '../core/CancelablePromise'; {{#if @root.exportClient}} import type { BaseHttpRequest } from '../core/BaseHttpRequest'; {{else}} @@ -27,32 +22,20 @@ export class {{{name}}}{{{@root.postfix}}} { {{/if}} {{#each operations}} - /** - {{#if deprecated}} - * @deprecated - {{/if}} - {{#if summary}} - * {{{escapeComment summary}}} - {{/if}} - {{#if description}} - * {{{escapeComment description}}} - {{/if}} - {{#unless @root.useOptions}} + {{#if parameters}} + private static {{{name}}}Decoder = D.object({ {{#each parameters}} - * @param {{{name}}} {{#if description}}{{{escapeComment description}}}{{/if}} + {{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}, {{/each}} + }); {{/if}} - {{/unless}} - {{#each results}} - * @returns Either {{#if description}}{{{escapeComment description}}}{{/if}} - {{/each}} - */ + {{#if @root.exportClient}} - public {{{name}}}({{>parameters}}): CancelablePromiseresult}}>> { + public {{{name}}}({{>parameters}}) { return this.httpRequest.request({ {{else}} - public static {{{name}}}({{>parameters}}): CancelablePromiseresult}}>> { + public static {{{name}}}({{>parameters}}) { return __request(OpenAPI, { {{/if}} method: '{{{method}}}', @@ -106,6 +89,13 @@ export class {{{name}}}{{{@root.postfix}}} { {{#if responseHeader}} responseHeader: '{{{responseHeader}}}', {{/if}} + {{~#if results~}} + responseDecoders: { + {{#each results}} + {{{code}}}: {{>type}}, + {{/each}} + }, + {{~/if~}} {{#if errors}} errors: { {{#each errors}} @@ -113,18 +103,7 @@ export class {{{name}}}{{{@root.postfix}}} { {{/each}} }, {{/if}} - }){{~#if results~}} - .then(([r, code]) => { - {{#each results}} - if ({{{code}}} === code) { - return {{>resultMapper}}(r); - } - {{/each}} - return r as never; - }) - {{~/if~}} - .then(either.right) - .catch(either.left) as CancelablePromiseresult}}>>; + }); } {{/each}} diff --git a/src/templates/index.hbs b/src/templates/index.hbs index 6f5b27d8c..176dcc3d6 100644 --- a/src/templates/index.hbs +++ b/src/templates/index.hbs @@ -17,15 +17,7 @@ export type { OpenAPIConfig } from './core/OpenAPI'; {{#if models}} {{#each models}} -{{#if @root.useUnionTypes}} -export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; -{{else if enum}} -export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; -{{else if enums}} -export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; -{{else}} -export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; -{{/if}} +export type { {{{name}}}Type as {{{name}}}{{#if @root.postfixModels}}{{{@root.postfixModels}}}{{/if}} } from './models/{{{name}}}'; {{/each}} {{/if}} {{/if}} diff --git a/src/templates/partials/base.hbs b/src/templates/partials/base.hbs index 1799e7d2a..a10dc45e0 100644 --- a/src/templates/partials/base.hbs +++ b/src/templates/partials/base.hbs @@ -1,9 +1,34 @@ {{~#equals base 'binary'~}} -{{~#equals @root.httpClient 'fetch'}}Blob{{/equals~}} -{{~#equals @root.httpClient 'xhr'}}Blob{{/equals~}} -{{~#equals @root.httpClient 'axios'}}Blob{{/equals~}} -{{~#equals @root.httpClient 'angular'}}Blob{{/equals~}} -{{~#equals @root.httpClient 'node'}}Blob{{/equals~}} +D.createDecoder({ + forceDecode: (data) => { + if (data instanceof Blob) { + return data; + } + throw new D.DecoderError('Expected Blob'); + }, +}) +{{~else equals base 'number'~}} +D.number +{{~else equals base 'string'~}} +D.string +{{~else equals base 'void'~}} +D.succeed(undefined) +{{~else equals base 'any'~}} +D.createDecoder({ + forceDecode: (data) => data, +}) +{{~else equals base 'date'~}} +D.createDecoder({ + forceDecode: (data) => { + const result = D.string.decode(data); + if (either.isLeft(result)) throw result.left; + const date = new Date(result.right); + if (isNaN(date)) throw new D.DecoderError('${result.right} is not a valid date'); + return date; + }, +}) +{{~else equals base 'boolean'~}} +D.boolean {{~else~}} {{{base}}} {{~/equals~}} diff --git a/src/templates/partials/header.hbs b/src/templates/partials/header.hbs index 58009d560..94249f58b 100644 --- a/src/templates/partials/header.hbs +++ b/src/templates/partials/header.hbs @@ -2,5 +2,3 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -// @ts-ignore: Does not need to be used -import * as O from 'fp-ts/lib/Option'; diff --git a/src/templates/partials/isNullable.hbs b/src/templates/partials/isNullable.hbs index d88bcb50f..c3280db76 100644 --- a/src/templates/partials/isNullable.hbs +++ b/src/templates/partials/isNullable.hbs @@ -1 +1 @@ -{{#if isNullable}}O.Option<{{> @partial-block }}>{{else}}{{> @partial-block }}{{/if}} +{{#if isNullable}}D.nullable({{> @partial-block }}){{else}}{{> @partial-block }}{{/if}} diff --git a/src/templates/partials/isRequired.hbs b/src/templates/partials/isRequired.hbs index e7f853f5f..a47dbb777 100644 --- a/src/templates/partials/isRequired.hbs +++ b/src/templates/partials/isRequired.hbs @@ -1 +1 @@ -{{#unless isRequired}}O.Option<{{> @partial-block }}>{{else}}{{> @partial-block }}{{/unless}} +{{#unless isRequired}}D.optional({{> @partial-block }}){{else}}{{> @partial-block }}{{/unless}} diff --git a/src/templates/partials/parameters.hbs b/src/templates/partials/parameters.hbs index 16f287cfc..2089370cf 100644 --- a/src/templates/partials/parameters.hbs +++ b/src/templates/partials/parameters.hbs @@ -2,27 +2,13 @@ {{#if @root.useOptions~}} { {{#each parameters}} -{{{name}}}{{#if default}} = O.some({{{default}}}){{else}}{{#unless isRequired}} = O.none{{/unless}}{{/if}}, +{{{name}}}{{#if default}} = option.some({{{default}}}){{else}}{{#unless isRequired}} = option.none{{/unless}}{{/if}}, {{/each}} -}: { -{{#each parameters}} -{{#ifdef description deprecated}} -/** -{{#if description}} - * {{{escapeComment description}}} -{{/if}} -{{#if deprecated}} - * @deprecated -{{/if}} - */ -{{/ifdef}} -{{{name}}}{{#unless isRequired}}?{{/unless}}: {{#>isRequired}}{{>type}}{{/isRequired}}, -{{/each}} -} +}: D.Output {{~else}} {{#each parameters}} -{{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}{{#if default}} = O.some({{{default}}}){{else}}{{#unless isRequired}} = O.none{{/unless}}{{/if}}, +{{{name}}}: D.Output['{{{name}}}']{{#if default}} = option.some({{{default}}}){{else}}{{#unless isRequired}} = option.none{{/unless}}{{/if}}, {{/each}} {{/if}} {{/if}} diff --git a/src/templates/partials/result.hbs b/src/templates/partials/result.hbs index c8f4770fd..7703ca1fd 100644 --- a/src/templates/partials/result.hbs +++ b/src/templates/partials/result.hbs @@ -1,5 +1,5 @@ {{~#if results~}} {{#each results}}{{>type}}{{#unless @last}} | {{/unless}}{{/each}} {{~else~}} -void +D.succeed(undefined) {{~/if~}} diff --git a/src/templates/partials/resultMapper.hbs b/src/templates/partials/resultMapper.hbs deleted file mode 100644 index 637a37584..000000000 --- a/src/templates/partials/resultMapper.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#equals export 'interface'}} -{{>resultMapperInterface}} -{{else equals export 'reference'}} -{{>resultMapperReference}} -{{else equals export 'enum'}} -{{>resultMapperEnum}} -{{else equals export 'array'}} -{{>resultMapperArray}} -{{else equals export 'dictionary'}} -{{>resultMapperDictionary}} -{{else equals export 'one-of'}} -{{>resultMapperUnion}} -{{else equals export 'any-of'}} -{{>resultMapperUnion}} -{{else equals export 'all-of'}} -{{>resultMapperIntersection}} -{{else}} -{{>resultMapperGeneric}} -{{/equals}} diff --git a/src/templates/partials/resultMapperArray.hbs b/src/templates/partials/resultMapperArray.hbs deleted file mode 100644 index 3aedeec2e..000000000 --- a/src/templates/partials/resultMapperArray.hbs +++ /dev/null @@ -1 +0,0 @@ -((result) => {{#>resultMapperIsNullable}}result.map({{~#if link~}}{{>resultMapper link}}{{~else~}}{{>resultMapperBase}}{{~/if~}}){{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperBase.hbs b/src/templates/partials/resultMapperBase.hbs deleted file mode 100644 index e371f4688..000000000 --- a/src/templates/partials/resultMapperBase.hbs +++ /dev/null @@ -1 +0,0 @@ -{{~#equals base 'binary'~}}((result) => result){{~else~}}{{{base}}}Mapper{{~/equals~}} diff --git a/src/templates/partials/resultMapperDictionary.hbs b/src/templates/partials/resultMapperDictionary.hbs deleted file mode 100644 index 2837e5518..000000000 --- a/src/templates/partials/resultMapperDictionary.hbs +++ /dev/null @@ -1,4 +0,0 @@ -((result) => {{#>resultMapperIsNullable}}{{~#if link~}}Object.fromEntries( -Object.entries(result) - .map(([key, value]) => [key, {{~#if link~}}{{>resultMapper link}}{{~else~}}{{>resultMapperBase}}{{~/if~}}(value)] as const) -){{~else~}}result{{~/if~}}{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperEnum.hbs b/src/templates/partials/resultMapperEnum.hbs deleted file mode 100644 index 9cddeecad..000000000 --- a/src/templates/partials/resultMapperEnum.hbs +++ /dev/null @@ -1 +0,0 @@ -((result) => {{#>resultMapperIsNullable}}result{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperGeneric.hbs b/src/templates/partials/resultMapperGeneric.hbs deleted file mode 100644 index 9cddeecad..000000000 --- a/src/templates/partials/resultMapperGeneric.hbs +++ /dev/null @@ -1 +0,0 @@ -((result) => {{#>resultMapperIsNullable}}result{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperInterface.hbs b/src/templates/partials/resultMapperInterface.hbs deleted file mode 100644 index d0c2d726e..000000000 --- a/src/templates/partials/resultMapperInterface.hbs +++ /dev/null @@ -1,11 +0,0 @@ -((result) => {{#>resultMapperIsNullable}}(() => { -{{~#if properties~}} - const obj = result; -{{#each properties}} - obj["{{{name}}}"] = {{#>resultMapperIsRequired}}({{#if ../parent}}{{>resultMapper parent=../parent}}{{else}}{{>resultMapper}}{{/if}})(result["{{{name}}}"]){{#if isReadOnly}} as const{{/if}}{{/resultMapperIsRequired}}; -{{/each}} - return obj; -{{~else~}} - return result; -{{~/if~}} -})(){{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperIntersection.hbs b/src/templates/partials/resultMapperIntersection.hbs deleted file mode 100644 index 9cddeecad..000000000 --- a/src/templates/partials/resultMapperIntersection.hbs +++ /dev/null @@ -1 +0,0 @@ -((result) => {{#>resultMapperIsNullable}}result{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperIsNullable.hbs b/src/templates/partials/resultMapperIsNullable.hbs deleted file mode 100644 index 8429ba70e..000000000 --- a/src/templates/partials/resultMapperIsNullable.hbs +++ /dev/null @@ -1 +0,0 @@ -{{#if isNullable}}O.fromNullable({{> @partial-block }}){{else}}{{> @partial-block }}{{/if}} diff --git a/src/templates/partials/resultMapperIsRequired.hbs b/src/templates/partials/resultMapperIsRequired.hbs deleted file mode 100644 index f488df3be..000000000 --- a/src/templates/partials/resultMapperIsRequired.hbs +++ /dev/null @@ -1 +0,0 @@ -{{#unless isRequired}}O.fromNullable({{> @partial-block }}){{else}}{{> @partial-block }}{{/unless}} diff --git a/src/templates/partials/resultMapperReference.hbs b/src/templates/partials/resultMapperReference.hbs deleted file mode 100644 index 8cfd36f71..000000000 --- a/src/templates/partials/resultMapperReference.hbs +++ /dev/null @@ -1 +0,0 @@ -((result) => {{#>resultMapperIsNullable}}{{>resultMapperBase}}(result){{/resultMapperIsNullable}}) diff --git a/src/templates/partials/resultMapperUnion.hbs b/src/templates/partials/resultMapperUnion.hbs deleted file mode 100644 index 9cddeecad..000000000 --- a/src/templates/partials/resultMapperUnion.hbs +++ /dev/null @@ -1 +0,0 @@ -((result) => {{#>resultMapperIsNullable}}result{{/resultMapperIsNullable}}) diff --git a/src/templates/partials/typeArray.hbs b/src/templates/partials/typeArray.hbs index e1e2bf7aa..3f11f09ec 100644 --- a/src/templates/partials/typeArray.hbs +++ b/src/templates/partials/typeArray.hbs @@ -1,5 +1 @@ -{{~#if link~}} -{{#>isNullable}}Array<{{>type link}}>{{/isNullable}} -{{~else~}} -{{#>isNullable}}Array<{{>base}}>{{/isNullable}} -{{~/if~}} +{{#>isNullable}}D.array({{~#if link~}}{{>type link}}{{~else~}}{{>base}}{{~/if~}}){{/isNullable}} diff --git a/src/templates/partials/typeDictionary.hbs b/src/templates/partials/typeDictionary.hbs index 43cb6b47b..a3e39b71e 100644 --- a/src/templates/partials/typeDictionary.hbs +++ b/src/templates/partials/typeDictionary.hbs @@ -1,5 +1 @@ -{{~#if link~}} -{{#>isNullable}}Recordtype link}}>{{/isNullable}} -{{~else~}} -{{#>isNullable}}Recordbase}}>{{/isNullable}} -{{~/if~}} +{{#>isNullable}}D.record({{~#if link~}}{{>type link}}{{~else~}}{{>base}}{{~/if~}}){{/isNullable}} diff --git a/src/templates/partials/typeEnum.hbs b/src/templates/partials/typeEnum.hbs index 8e1b13c13..4c9fac806 100644 --- a/src/templates/partials/typeEnum.hbs +++ b/src/templates/partials/typeEnum.hbs @@ -1 +1 @@ -{{#>isNullable}}{{#enumerator enum parent name}}{{this}}{{/enumerator}}{{/isNullable}} +{{#>isNullable}}D.literalUnion({{#each enum}}{{{value}}}{{#unless @last}}, {{/unless}}{{/each}}){{/isNullable}} diff --git a/src/templates/partials/typeInterface.hbs b/src/templates/partials/typeInterface.hbs index db5cba37e..5010d1a78 100644 --- a/src/templates/partials/typeInterface.hbs +++ b/src/templates/partials/typeInterface.hbs @@ -1,23 +1,13 @@ {{~#if properties~}} {{#>isNullable}} -{{#each properties}} -{{#ifdef description deprecated}} -/** -{{#if description}} - * {{{escapeComment description}}} -{{/if}} -{{#if deprecated}} - * @deprecated -{{/if}} - */ -{{/ifdef}} -{{#if ../parent}} -{{>isReadOnly}}{{{name}}}: {{#>isRequired}}{{>type parent=../parent}}{{/isRequired}}; -{{else}} -{{>isReadOnly}}{{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}; -{{/if}} -{{/each}} +D.object({ + {{#each properties}} + {{{name}}}: {{#>isRequired}}{{#if ../parent}}{{>type parent=../parent}}{{else}}{{>type}}{{/if}}{{/isRequired}}, + {{/each}} +}) {{/isNullable}} {{~else~}} -unknown +D.createDecoder({ + forceDecode: (data) => data, +}) {{~/if~}} diff --git a/src/templates/partials/typeIntersection.hbs b/src/templates/partials/typeIntersection.hbs index 2b56d24dc..5ac67ea62 100644 --- a/src/templates/partials/typeIntersection.hbs +++ b/src/templates/partials/typeIntersection.hbs @@ -1 +1 @@ -{{#>isNullable}}{{#intersection properties parent}}{{this}}{{/intersection}}{{/isNullable}} +{{#>isNullable}}D.allOf({{#each properties}}{{>type}}{{#unless @last}}, {{/unless}}{{/each}}){{/isNullable}} diff --git a/src/templates/partials/typeReference.hbs b/src/templates/partials/typeReference.hbs index 16302c7cf..f099e56cc 100644 --- a/src/templates/partials/typeReference.hbs +++ b/src/templates/partials/typeReference.hbs @@ -1 +1 @@ -{{#>isNullable}}{{>base}}{{/isNullable}} +{{#>isNullable}}{{~#if link~}}{{>type link}}{{~else~}}{{>base}}{{~/if~}}{{/isNullable}} diff --git a/src/templates/partials/typeUnion.hbs b/src/templates/partials/typeUnion.hbs index a644628f8..e62890c36 100644 --- a/src/templates/partials/typeUnion.hbs +++ b/src/templates/partials/typeUnion.hbs @@ -1 +1 @@ -{{#>isNullable}}{{#union properties parent}}{{this}}{{/union}}{{/isNullable}} +{{#>isNullable}}D.oneOf({{#each properties}}{{>type}}{{#unless @last}}, {{/unless}}{{/each}}){{/isNullable}} diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index 0660730a1..a219b2b06 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -49,7 +49,6 @@ import xhrSendRequest from '../templates/core/xhr/sendRequest.hbs'; import templateExportModel from '../templates/exportModel.hbs'; import templateExportSchema from '../templates/exportSchema.hbs'; import templateExportService from '../templates/exportService.hbs'; -import templateExportMapper from '../templates/exportMapper.hbs'; import templateIndex from '../templates/index.hbs'; import partialBase from '../templates/partials/base.hbs'; import partialExportComposition from '../templates/partials/exportComposition.hbs'; @@ -62,18 +61,6 @@ import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; import partialIsRequired from '../templates/partials/isRequired.hbs'; import partialParameters from '../templates/partials/parameters.hbs'; import partialResult from '../templates/partials/result.hbs'; -import partialResultMapper from '../templates/partials/resultMapper.hbs'; -import partialResultMapperBase from '../templates/partials/resultMapperBase.hbs'; -import partialResultMapperArray from '../templates/partials/resultMapperArray.hbs'; -import partialResultMapperDictionary from '../templates/partials/resultMapperDictionary.hbs'; -import partialResultMapperEnum from '../templates/partials/resultMapperEnum.hbs'; -import partialResultMapperGeneric from '../templates/partials/resultMapperGeneric.hbs'; -import partialResultMapperInterface from '../templates/partials/resultMapperInterface.hbs'; -import partialResultMapperIntersection from '../templates/partials/resultMapperIntersection.hbs'; -import partialResultMapperReference from '../templates/partials/resultMapperReference.hbs'; -import partialResultMapperUnion from '../templates/partials/resultMapperUnion.hbs'; -import partialResultMapperIsRequired from '../templates/partials/resultMapperIsRequired.hbs'; -import partialResultMapperIsNullable from '../templates/partials/resultMapperIsNullable.hbs'; import partialSchema from '../templates/partials/schema.hbs'; import partialSchemaArray from '../templates/partials/schemaArray.hbs'; import partialSchemaComposition from '../templates/partials/schemaComposition.hbs'; @@ -99,7 +86,6 @@ export interface Templates { model: Handlebars.TemplateDelegate; schema: Handlebars.TemplateDelegate; service: Handlebars.TemplateDelegate; - mapper: Handlebars.TemplateDelegate; }; core: { settings: Handlebars.TemplateDelegate; @@ -132,7 +118,6 @@ export const registerHandlebarTemplates = (root: { model: Handlebars.template(templateExportModel), schema: Handlebars.template(templateExportSchema), service: Handlebars.template(templateExportService), - mapper: Handlebars.template(templateExportMapper), }, core: { settings: Handlebars.template(templateCoreSettings), @@ -157,18 +142,6 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); Handlebars.registerPartial('result', Handlebars.template(partialResult)); - Handlebars.registerPartial('resultMapper', Handlebars.template(partialResultMapper)); - Handlebars.registerPartial('resultMapperBase', Handlebars.template(partialResultMapperBase)); - Handlebars.registerPartial('resultMapperArray', Handlebars.template(partialResultMapperArray)); - Handlebars.registerPartial('resultMapperDictionary', Handlebars.template(partialResultMapperDictionary)); - Handlebars.registerPartial('resultMapperEnum', Handlebars.template(partialResultMapperEnum)); - Handlebars.registerPartial('resultMapperGeneric', Handlebars.template(partialResultMapperGeneric)); - Handlebars.registerPartial('resultMapperInterface', Handlebars.template(partialResultMapperInterface)); - Handlebars.registerPartial('resultMapperIntersection', Handlebars.template(partialResultMapperIntersection)); - Handlebars.registerPartial('resultMapperReference', Handlebars.template(partialResultMapperReference)); - Handlebars.registerPartial('resultMapperUnion', Handlebars.template(partialResultMapperUnion)); - Handlebars.registerPartial('resultMapperIsNullable', Handlebars.template(partialResultMapperIsNullable)); - Handlebars.registerPartial('resultMapperIsRequired', Handlebars.template(partialResultMapperIsRequired)); Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); Handlebars.registerPartial('schemaDictionary', Handlebars.template(partialSchemaDictionary)); diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 9f4d6f6df..3c06a95a5 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -23,7 +23,6 @@ describe('writeClient', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', - mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index 30f5a177e..cea2f3d88 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -13,7 +13,6 @@ import { writeClientIndex } from './writeClientIndex'; import { writeClientModels } from './writeClientModels'; import { writeClientSchemas } from './writeClientSchemas'; import { writeClientServices } from './writeClientServices'; -import { writeClientMappers } from './writeClientMappers'; /** * Write our OpenAPI client, using the given templates at the given output @@ -54,7 +53,6 @@ export const writeClient = async ( const outputPath = resolve(process.cwd(), output); const outputPathCore = resolve(outputPath, 'core'); const outputPathModels = resolve(outputPath, 'models'); - const outputPathMappers = resolve(outputPath, 'mappers'); const outputPathSchemas = resolve(outputPath, 'schemas'); const outputPathServices = resolve(outputPath, 'services'); @@ -96,12 +94,6 @@ export const writeClient = async ( await writeClientModels(client.models, templates, outputPathModels, httpClient, useUnionTypes, indent); } - if (exportModels) { - await rmdir(outputPathMappers); - await mkdir(outputPathMappers); - await writeClientMappers(client.models, templates, outputPathMappers, httpClient, useUnionTypes, indent); - } - if (isDefined(clientName)) { await mkdir(outputPath); await writeClientClass(client, templates, outputPath, httpClient, clientName, indent, postfixServices); diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts index 2b32a1ae6..102f2eb57 100644 --- a/src/utils/writeClientClass.spec.ts +++ b/src/utils/writeClientClass.spec.ts @@ -23,7 +23,6 @@ describe('writeClientClass', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', - mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index be30094b2..7db71f59b 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -26,7 +26,6 @@ describe('writeClientCore', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', - mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index b660b3b31..a7d5b610a 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -23,7 +23,6 @@ describe('writeClientIndex', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', - mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientMappers.ts b/src/utils/writeClientMappers.ts deleted file mode 100644 index 546bc78fd..000000000 --- a/src/utils/writeClientMappers.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { resolve } from 'path'; - -import type { Model } from '../client/interfaces/Model'; -import type { HttpClient } from '../HttpClient'; -import type { Indent } from '../Indent'; -import { writeFile } from './fileSystem'; -import { formatCode as f } from './formatCode'; -import { formatIndentation as i } from './formatIndentation'; -import type { Templates } from './registerHandlebarTemplates'; - -/** - * Generate Models using the Handlebar template and write to disk. - * @param models Array of Models to write - * @param templates The loaded handlebar templates - * @param outputPath Directory to write the generated files to - * @param httpClient The selected httpClient (fetch, xhr, node or axios) - * @param useUnionTypes Use union types instead of enums - * @param indent Indentation options (4, 2 or tab) - */ -export const writeClientMappers = async ( - models: Model[], - templates: Templates, - outputPath: string, - httpClient: HttpClient, - useUnionTypes: boolean, - indent: Indent -): Promise => { - for (const model of models) { - const file = resolve(outputPath, `${model.name}Mapper.ts`); - const templateResult = templates.exports.mapper({ - ...model, - httpClient, - useUnionTypes, - }); - await writeFile(file, i(f(templateResult), indent)); - } -}; diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index 7774219f5..ee0f2b4f6 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -39,7 +39,6 @@ describe('writeClientModels', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', - mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index dff39dbc5..e75928b8c 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -39,7 +39,6 @@ describe('writeClientSchemas', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', - mapper: () => 'mapper', }, core: { settings: () => 'settings', diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index 18185e59e..f936d6609 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -27,7 +27,6 @@ describe('writeClientServices', () => { model: () => 'model', schema: () => 'schema', service: () => 'service', - mapper: () => 'mapper', }, core: { settings: () => 'settings', From 5ab75ff644e4109d5fcd9608395ba1ae20d4507a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 6 Nov 2023 23:47:55 +0000 Subject: [PATCH 11/48] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20@majkit/fp-ts-schema?= =?UTF-8?q?=200.27.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d70d4027f..3f3eff152 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@majkit/openapi", - "version": "0.26.2", + "version": "0.27.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@majkit/openapi", - "version": "0.26.2", + "version": "0.27.1", "license": "MIT", "dependencies": { - "@majkit/fp-ts-schema": "^1.1.0", + "@majkit/fp-ts-schema": "^1.1.1", "camelcase": "^6.3.0", "commander": "^11.0.0", "fs-extra": "^11.1.1", @@ -4738,9 +4738,9 @@ "dev": true }, "node_modules/@majkit/fp-ts-schema": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@majkit/fp-ts-schema/-/fp-ts-schema-1.1.0.tgz", - "integrity": "sha512-UDGzg7rwPpIp3MQ5E1vyHR6fwuUz2pmboA4nRNzUxf3APpO1tjHYyhz4vuC3UOBmMDZXq9ws7Y3V9GmmteN2vw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@majkit/fp-ts-schema/-/fp-ts-schema-1.1.1.tgz", + "integrity": "sha512-ldFsUOuBgCjRs872T0/PdLAKA9ZX3M3yuD2nCDIcFDe2HBxG0a4E+O+uiGWLudJkkQdwKXNKdBwzBSGAP5ys9w==", "dependencies": { "fp-ts": "^2.16.1", "schemawax": "^1.0.12" diff --git a/package.json b/package.json index fc50f123b..254fbe2a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.27.0", + "version": "0.27.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", @@ -60,7 +60,7 @@ "docker": "docker build -t eeelenbaas/openapi-typescript-codegen ." }, "dependencies": { - "@majkit/fp-ts-schema": "^1.1.0", + "@majkit/fp-ts-schema": "^1.1.1", "camelcase": "^6.3.0", "commander": "^11.0.0", "fs-extra": "^11.1.1", From 4057aa6f697b7c07839ceeb5c64a8aeaebd55430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Wed, 8 Nov 2023 00:39:06 +0000 Subject: [PATCH 12/48] =?UTF-8?q?=E2=9C=85=20=20add=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- bin/index.js | 4 +- bin/index.spec.js | 1 - docs/babel-support.md | 5 - docs/basic-usage.md | 3 +- docs/enum-vs-union-types.md | 54 - package.json | 2 +- samples/spec/v2.json | 6 +- samples/spec/v3.json | 2 +- src/index.ts | 6 - .../v2/parser/getOperationParameterDefault.ts | 3 +- .../parser/getOperationResponseCode.spec.ts | 2 +- .../v2/parser/getOperationResponseCode.ts | 2 +- .../v2/parser/getOperationResponses.ts | 2 +- src/openApi/v2/parser/getOperationResults.ts | 2 +- src/openApi/v3/parser/getModelDefault.ts | 3 +- .../parser/getOperationResponseCode.spec.ts | 2 +- .../v3/parser/getOperationResponseCode.ts | 4 +- .../v3/parser/getOperationResponses.ts | 2 +- src/openApi/v3/parser/getOperationResults.ts | 2 +- src/templates/client.hbs | 40 - src/templates/core/ApiError.hbs | 7 +- src/templates/core/ApiRequestOptions.hbs | 2 +- src/templates/core/HttpRequest.hbs | 37 - src/templates/core/OpenAPI.hbs | 3 +- src/templates/core/axios/request.hbs | 11 +- src/templates/core/fetch/request.hbs | 7 +- src/templates/core/node/request.hbs | 11 +- src/templates/core/xhr/getHeaders.hbs | 2 +- src/templates/core/xhr/request.hbs | 11 +- src/templates/exportService.hbs | 12 +- src/templates/partials/exportComposition.hbs | 38 - src/templates/partials/exportEnum.hbs | 24 - src/templates/partials/exportInterface.hbs | 47 - src/templates/partials/exportType.hbs | 11 - src/templates/partials/isNullable.hbs | 6 +- src/templates/partials/isRequired.hbs | 6 +- src/templates/partials/parameters.hbs | 10 +- src/templates/partials/typeArray.hbs | 10 +- src/templates/partials/typeDictionary.hbs | 10 +- src/templates/partials/typeEnum.hbs | 9 +- src/templates/partials/typeGeneric.hbs | 4 +- src/templates/partials/typeInterface.hbs | 16 +- src/templates/partials/typeIntersection.hbs | 9 +- src/templates/partials/typeReference.hbs | 8 +- src/templates/partials/typeUnion.hbs | 9 +- src/utils/registerHandlebarHelpers.spec.ts | 4 - src/utils/registerHandlebarHelpers.ts | 53 - src/utils/registerHandlebarTemplates.spec.ts | 1 - src/utils/registerHandlebarTemplates.ts | 9 - src/utils/writeClient.spec.ts | 1 - src/utils/writeClient.ts | 8 +- src/utils/writeClientIndex.spec.ts | 2 +- src/utils/writeClientIndex.ts | 3 - src/utils/writeClientModels.spec.ts | 2 +- src/utils/writeClientModels.ts | 3 - src/utils/writeClientSchemas.spec.ts | 2 +- src/utils/writeClientSchemas.ts | 3 - src/utils/writeClientServices.spec.ts | 2 +- src/utils/writeClientServices.ts | 3 - test/__snapshots__/index.spec.ts.snap | 3299 ++++++++--------- test/e2e/assets/main-angular-module.ts | 76 - test/e2e/assets/main-angular.ts | 91 - test/e2e/client.angular.spec.ts | 158 - test/e2e/scripts/buildAngularProject.ts | 24 - test/e2e/scripts/createAngularProject.ts | 43 - test/e2e/scripts/generateClient.ts | 4 +- test/e2e/v2.angular.spec.ts | 52 - test/e2e/v3.angular.spec.ts | 159 - test/index.js | 1 - test/index.spec.ts | 2 - test/spec/v2.json | 3 +- types/index.d.ts | 4 +- 72 files changed, 1665 insertions(+), 2814 deletions(-) delete mode 100644 docs/enum-vs-union-types.md delete mode 100644 src/templates/partials/exportComposition.hbs delete mode 100644 src/templates/partials/exportEnum.hbs delete mode 100644 src/templates/partials/exportInterface.hbs delete mode 100644 src/templates/partials/exportType.hbs delete mode 100644 test/e2e/assets/main-angular-module.ts delete mode 100644 test/e2e/assets/main-angular.ts delete mode 100644 test/e2e/client.angular.spec.ts delete mode 100644 test/e2e/scripts/buildAngularProject.ts delete mode 100644 test/e2e/scripts/createAngularProject.ts delete mode 100644 test/e2e/v2.angular.spec.ts delete mode 100644 test/e2e/v3.angular.spec.ts diff --git a/bin/index.js b/bin/index.js index 32f2fecbc..299be731b 100755 --- a/bin/index.js +++ b/bin/index.js @@ -12,10 +12,9 @@ const params = program .version(pkg.version) .requiredOption('-i, --input ', 'OpenAPI specification, can be a path, url or string content (required)') .requiredOption('-o, --output ', 'Output directory (required)') - .option('-c, --client ', 'HTTP client to generate [fetch, xhr, node, axios, angular]', 'fetch') + .option('-c, --client ', 'HTTP client to generate [fetch, xhr, node, axios]', 'fetch') .option('--name ', 'Custom client class name') .option('--useOptions', 'Use options instead of arguments') - .option('--useUnionTypes', 'Use union types instead of enums') .option('--exportCore ', 'Write core files to disk', true) .option('--exportServices ', 'Write services to disk', true) .option('--exportModels ', 'Write models to disk', true) @@ -36,7 +35,6 @@ if (OpenAPI) { httpClient: params.client, clientName: params.name, useOptions: params.useOptions, - useUnionTypes: params.useUnionTypes, exportCore: JSON.parse(params.exportCore) === true, exportServices: JSON.parse(params.exportServices) === true, exportModels: JSON.parse(params.exportModels) === true, diff --git a/bin/index.spec.js b/bin/index.spec.js index 6030c07c8..cdcadb5d1 100755 --- a/bin/index.spec.js +++ b/bin/index.spec.js @@ -23,7 +23,6 @@ describe('bin', () => { '--client', 'fetch', '--useOptions', - '--useUnionTypes', '--exportCore', 'true', '--exportServices', diff --git a/docs/babel-support.md b/docs/babel-support.md index def122524..64cc824e9 100644 --- a/docs/babel-support.md +++ b/docs/babel-support.md @@ -1,10 +1,5 @@ # Babel support -If you use enums inside your models / definitions then those enums are by default inside a namespace with the same name -as your model. This is called declaration merging. However, the [@babel/plugin-transform-typescript](https://babeljs.io/docs/en/babel-plugin-transform-typescript) -does not support these namespaces, so if you are using babel in your project please use the `--useUnionTypes` flag -to generate union types instead of traditional enums. More info can be found here: [Enums vs. Union Types](#enums-vs-union-types---useuniontypes). - **Note:** If you are using Babel 7 and Typescript 3.8 (or higher) then you should enable the `onlyRemoveTypeImports` to ignore any 'type only' imports, see https://babeljs.io/docs/en/babel-preset-typescript#onlyremovetypeimports for more info diff --git a/docs/basic-usage.md b/docs/basic-usage.md index d02da0888..2c302f991 100644 --- a/docs/basic-usage.md +++ b/docs/basic-usage.md @@ -9,10 +9,9 @@ $ openapi --help -V, --version output the version number -i, --input OpenAPI specification, can be a path, url or string content (required) -o, --output Output directory (required) - -c, --client HTTP client to generate [fetch, xhr, node, axios, angular] (default: "fetch") + -c, --client HTTP client to generate [fetch, xhr, node, axios] (default: "fetch") --name Custom client class name --useOptions Use options instead of arguments - --useUnionTypes Use union types instead of enums --exportCore Write core files to disk (default: true) --exportServices Write services to disk (default: true) --exportModels Write models to disk (default: true) diff --git a/docs/enum-vs-union-types.md b/docs/enum-vs-union-types.md deleted file mode 100644 index 570aa972a..000000000 --- a/docs/enum-vs-union-types.md +++ /dev/null @@ -1,54 +0,0 @@ -# Enums vs. Union types - -**Flag:** `--useUnionTypes` - -The OpenAPI spec allows you to define [enums](https://swagger.io/docs/specification/data-models/enums/) inside the -data model. By default, we convert these enums definitions to [TypeScript enums](https://www.typescriptlang.org/docs/handbook/enums.html). -However, these enums are merged inside the namespace of the model, this is unsupported by Babel, [see docs](https://babeljs.io/docs/en/babel-plugin-transform-typescript#impartial-namespace-support). -Because we also want to support projects that use Babel [@babel/plugin-transform-typescript](https://babeljs.io/docs/en/babel-plugin-transform-typescript), -we offer the flag `--useUnionTypes` to generate [union types](https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#union-types) -instead of the traditional enums. The difference can be seen below: - -**Enums:** - -```typescript -// Model -export type Order = { - id?: number; - quantity?: number; - status?: Order.status; -}; - -export namespace Order { - export enum status { - PLACED = 'placed', - APPROVED = 'approved', - DELIVERED = 'delivered', - } -} - -// Usage -const order: Order = { - id: 1, - quantity: 40, - status: Order.status.PLACED, -}; -``` - -**Union Types:** - -```typescript -// Model -export type Order = { - id?: number; - quantity?: number; - status?: 'placed' | 'approved' | 'delivered'; -}; - -// Usage -const order: Order = { - id: 1, - quantity: 40, - status: 'placed', -}; -``` diff --git a/package.json b/package.json index 254fbe2a2..8fb0fd8e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.27.1", + "version": "0.27.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/samples/spec/v2.json b/samples/spec/v2.json index 46b4183ac..ca7d3a25c 100644 --- a/samples/spec/v2.json +++ b/samples/spec/v2.json @@ -70,7 +70,9 @@ "in": "formData", "description": "Additional data to pass to server", "required": false, - "type": "string" + "type": "string", + "x-nullable": true, + "default": null }, { "name": "file", @@ -81,7 +83,7 @@ } ], "responses": { - "200": { + "default": { "description": "successful operation", "schema": { "$ref": "#/definitions/ApiResponse" diff --git a/samples/spec/v3.json b/samples/spec/v3.json index 7c39dde22..befc0795b 100644 --- a/samples/spec/v3.json +++ b/samples/spec/v3.json @@ -75,7 +75,7 @@ "required": true }, "responses": { - "200": { + "default": { "description": "Successful operation", "content": { "application/xml": { diff --git a/src/index.ts b/src/index.ts index e63919085..28f1d219d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,7 +18,6 @@ export type Options = { httpClient?: HttpClient; clientName?: string; useOptions?: boolean; - useUnionTypes?: boolean; exportCore?: boolean; exportServices?: boolean; exportModels?: boolean; @@ -39,7 +38,6 @@ export type Options = { * @param httpClient The selected httpClient (fetch, xhr, node or axios) * @param clientName Custom client class name * @param useOptions Use options or arguments functions - * @param useUnionTypes Use union types instead of enums * @param exportCore Generate core client classes * @param exportServices Generate services * @param exportModels Generate models @@ -56,7 +54,6 @@ export const generate = async ({ httpClient = HttpClient.FETCH, clientName, useOptions = false, - useUnionTypes = false, exportCore = true, exportServices = true, exportModels = true, @@ -71,7 +68,6 @@ export const generate = async ({ const openApiVersion = getOpenApiVersion(openApi); const templates = registerHandlebarTemplates({ httpClient, - useUnionTypes, useOptions, }); @@ -86,7 +82,6 @@ export const generate = async ({ output, httpClient, useOptions, - useUnionTypes, exportCore, exportServices, exportModels, @@ -110,7 +105,6 @@ export const generate = async ({ output, httpClient, useOptions, - useUnionTypes, exportCore, exportServices, exportModels, diff --git a/src/openApi/v2/parser/getOperationParameterDefault.ts b/src/openApi/v2/parser/getOperationParameterDefault.ts index 291b3adbb..28e0fff80 100644 --- a/src/openApi/v2/parser/getOperationParameterDefault.ts +++ b/src/openApi/v2/parser/getOperationParameterDefault.ts @@ -8,9 +8,8 @@ export const getOperationParameterDefault = ( if (parameter.default === undefined) { return undefined; } - if (parameter.default === null) { - return 'null'; + return 'option.none'; } const type = parameter.type || typeof parameter.default; diff --git a/src/openApi/v2/parser/getOperationResponseCode.spec.ts b/src/openApi/v2/parser/getOperationResponseCode.spec.ts index 393907090..24e8da39f 100644 --- a/src/openApi/v2/parser/getOperationResponseCode.spec.ts +++ b/src/openApi/v2/parser/getOperationResponseCode.spec.ts @@ -3,7 +3,7 @@ import { getOperationResponseCode } from './getOperationResponseCode'; describe('getOperationResponseCode', () => { it('should produce correct result', () => { expect(getOperationResponseCode('')).toEqual(null); - expect(getOperationResponseCode('default')).toEqual(200); + expect(getOperationResponseCode('default')).toEqual(0); expect(getOperationResponseCode('200')).toEqual(200); expect(getOperationResponseCode('300')).toEqual(300); expect(getOperationResponseCode('400')).toEqual(400); diff --git a/src/openApi/v2/parser/getOperationResponseCode.ts b/src/openApi/v2/parser/getOperationResponseCode.ts index f34c99b75..9f886f3ae 100644 --- a/src/openApi/v2/parser/getOperationResponseCode.ts +++ b/src/openApi/v2/parser/getOperationResponseCode.ts @@ -1,7 +1,7 @@ export const getOperationResponseCode = (value: string | 'default'): number | null => { // You can specify a "default" response, this is treated as HTTP code 200 if (value === 'default') { - return 200; + return 0; } // Check if we can parse the code and return of successful. diff --git a/src/openApi/v2/parser/getOperationResponses.ts b/src/openApi/v2/parser/getOperationResponses.ts index ed628e857..66a980420 100644 --- a/src/openApi/v2/parser/getOperationResponses.ts +++ b/src/openApi/v2/parser/getOperationResponses.ts @@ -17,7 +17,7 @@ export const getOperationResponses = (openApi: OpenApi, responses: OpenApiRespon const response = getRef(openApi, responseOrReference); const responseCode = getOperationResponseCode(code); - if (responseCode) { + if (responseCode !== null) { const operationResponse = getOperationResponse(openApi, response, responseCode); operationResponses.push(operationResponse); } diff --git a/src/openApi/v2/parser/getOperationResults.ts b/src/openApi/v2/parser/getOperationResults.ts index 9d8111fe8..5dde1e60a 100644 --- a/src/openApi/v2/parser/getOperationResults.ts +++ b/src/openApi/v2/parser/getOperationResults.ts @@ -15,7 +15,7 @@ export const getOperationResults = (operationResponses: OperationResponse[]): Op // Filter out success response codes, but skip "204 No Content" operationResponses.forEach(operationResponse => { const { code } = operationResponse; - if (code && code !== 204 && code >= 200 && code < 300) { + if (code !== 204 && (code >= 200 && code < 300 || code === 0)) { operationResults.push(operationResponse); } }); diff --git a/src/openApi/v3/parser/getModelDefault.ts b/src/openApi/v3/parser/getModelDefault.ts index 1736bf1c0..fade1ed7f 100644 --- a/src/openApi/v3/parser/getModelDefault.ts +++ b/src/openApi/v3/parser/getModelDefault.ts @@ -5,9 +5,8 @@ export const getModelDefault = (definition: OpenApiSchema, model?: Model): strin if (definition.default === undefined) { return undefined; } - if (definition.default === null) { - return 'null'; + return 'option.none'; } const type = definition.type || typeof definition.default; diff --git a/src/openApi/v3/parser/getOperationResponseCode.spec.ts b/src/openApi/v3/parser/getOperationResponseCode.spec.ts index 393907090..24e8da39f 100644 --- a/src/openApi/v3/parser/getOperationResponseCode.spec.ts +++ b/src/openApi/v3/parser/getOperationResponseCode.spec.ts @@ -3,7 +3,7 @@ import { getOperationResponseCode } from './getOperationResponseCode'; describe('getOperationResponseCode', () => { it('should produce correct result', () => { expect(getOperationResponseCode('')).toEqual(null); - expect(getOperationResponseCode('default')).toEqual(200); + expect(getOperationResponseCode('default')).toEqual(0); expect(getOperationResponseCode('200')).toEqual(200); expect(getOperationResponseCode('300')).toEqual(300); expect(getOperationResponseCode('400')).toEqual(400); diff --git a/src/openApi/v3/parser/getOperationResponseCode.ts b/src/openApi/v3/parser/getOperationResponseCode.ts index f34c99b75..74b698865 100644 --- a/src/openApi/v3/parser/getOperationResponseCode.ts +++ b/src/openApi/v3/parser/getOperationResponseCode.ts @@ -1,7 +1,7 @@ export const getOperationResponseCode = (value: string | 'default'): number | null => { - // You can specify a "default" response, this is treated as HTTP code 200 + // You can specify a "default" response if (value === 'default') { - return 200; + return 0; } // Check if we can parse the code and return of successful. diff --git a/src/openApi/v3/parser/getOperationResponses.ts b/src/openApi/v3/parser/getOperationResponses.ts index ed628e857..66a980420 100644 --- a/src/openApi/v3/parser/getOperationResponses.ts +++ b/src/openApi/v3/parser/getOperationResponses.ts @@ -17,7 +17,7 @@ export const getOperationResponses = (openApi: OpenApi, responses: OpenApiRespon const response = getRef(openApi, responseOrReference); const responseCode = getOperationResponseCode(code); - if (responseCode) { + if (responseCode !== null) { const operationResponse = getOperationResponse(openApi, response, responseCode); operationResponses.push(operationResponse); } diff --git a/src/openApi/v3/parser/getOperationResults.ts b/src/openApi/v3/parser/getOperationResults.ts index 9d8111fe8..5dde1e60a 100644 --- a/src/openApi/v3/parser/getOperationResults.ts +++ b/src/openApi/v3/parser/getOperationResults.ts @@ -15,7 +15,7 @@ export const getOperationResults = (operationResponses: OperationResponse[]): Op // Filter out success response codes, but skip "204 No Content" operationResponses.forEach(operationResponse => { const { code } = operationResponse; - if (code && code !== 204 && code >= 200 && code < 300) { + if (code !== 204 && (code >= 200 && code < 300 || code === 0)) { operationResults.push(operationResponse); } }); diff --git a/src/templates/client.hbs b/src/templates/client.hbs index 601f27d8f..0408c5930 100644 --- a/src/templates/client.hbs +++ b/src/templates/client.hbs @@ -1,18 +1,8 @@ {{>header}} -{{#equals @root.httpClient 'angular'}} -import { NgModule} from '@angular/core'; -import { HttpClientModule } from '@angular/common/http'; - -import { AngularHttpRequest } from './core/AngularHttpRequest'; -import { BaseHttpRequest } from './core/BaseHttpRequest'; -import type { OpenAPIConfig } from './core/OpenAPI'; -import { OpenAPI } from './core/OpenAPI'; -{{else}} import type { BaseHttpRequest } from './core/BaseHttpRequest'; import type { OpenAPIConfig } from './core/OpenAPI'; import { {{{httpRequest}}} } from './core/{{{httpRequest}}}'; -{{/equals}} {{#if services}} {{#each services}} @@ -20,35 +10,6 @@ import { {{{name}}}{{{@root.postfix}}} } from './services/{{{name}}}{{{@root.pos {{/each}} {{/if}} -{{#equals @root.httpClient 'angular'}} -@NgModule({ - imports: [HttpClientModule], - providers: [ - { - provide: OpenAPI, - useValue: { - BASE: OpenAPI?.BASE ?? '{{{server}}}', - VERSION: OpenAPI?.VERSION ?? '{{{version}}}', - WITH_CREDENTIALS: OpenAPI?.WITH_CREDENTIALS ?? false, - CREDENTIALS: OpenAPI?.CREDENTIALS ?? 'include', - TOKEN: OpenAPI?.TOKEN, - USERNAME: OpenAPI?.USERNAME, - PASSWORD: OpenAPI?.PASSWORD, - HEADERS: OpenAPI?.HEADERS, - ENCODE_PATH: OpenAPI?.ENCODE_PATH, - } as OpenAPIConfig, - }, - { - provide: BaseHttpRequest, - useClass: AngularHttpRequest, - }, - {{#each services}} - {{{name}}}{{{@root.postfix}}}, - {{/each}} - ] -}) -export class {{{clientName}}} {} -{{else}} type HttpRequestConstructor = new (config: OpenAPIConfig) => BaseHttpRequest; export class {{{clientName}}} { @@ -77,4 +38,3 @@ export class {{{clientName}}} { {{/each}} } } -{{/equals}} diff --git a/src/templates/core/ApiError.hbs b/src/templates/core/ApiError.hbs index ab6849d18..3c78b3a1b 100644 --- a/src/templates/core/ApiError.hbs +++ b/src/templates/core/ApiError.hbs @@ -2,15 +2,16 @@ import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; +import type * as D from '@majkit/fp-ts-schema'; -export class ApiError extends Error { +export class ApiError>> extends Error { public readonly url: string; public readonly status: number; public readonly statusText: string; public readonly body: any; - public readonly request: ApiRequestOptions; + public readonly request: ApiRequestOptions; - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { super(message); this.name = 'ApiError'; diff --git a/src/templates/core/ApiRequestOptions.hbs b/src/templates/core/ApiRequestOptions.hbs index 834823f88..f3fedc14c 100644 --- a/src/templates/core/ApiRequestOptions.hbs +++ b/src/templates/core/ApiRequestOptions.hbs @@ -5,7 +5,7 @@ import type * as D from '@majkit/fp-ts-schema'; export type ApiResponse>> = { [key in keyof T]: { readonly status: key; - readonly body: D.Output; + readonly body: key extends number ? D.Output : never; }; }[keyof T]; diff --git a/src/templates/core/HttpRequest.hbs b/src/templates/core/HttpRequest.hbs index e1620a3c0..1e19036ea 100644 --- a/src/templates/core/HttpRequest.hbs +++ b/src/templates/core/HttpRequest.hbs @@ -1,53 +1,17 @@ {{>header}} -{{#equals @root.httpClient 'angular'}} -import { Inject, Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import type { Observable } from 'rxjs'; - -import type { ApiRequestOptions } from './ApiRequestOptions'; -import { BaseHttpRequest } from './BaseHttpRequest'; -import type { OpenAPIConfig } from './OpenAPI'; -import { OpenAPI } from './OpenAPI'; -import { request as __request } from './request'; -{{else}} import type { ApiRequestOptions } from './ApiRequestOptions'; import { BaseHttpRequest } from './BaseHttpRequest'; import type { CancelablePromise } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; import { request as __request } from './request'; -{{/equals}} -{{#equals @root.httpClient 'angular'}} -@Injectable() -{{/equals}} export class {{httpRequest}} extends BaseHttpRequest { - {{#equals @root.httpClient 'angular'}} - constructor( - @Inject(OpenAPI) - config: OpenAPIConfig, - http: HttpClient, - ) { - super(config, http); - } - {{else}} constructor(config: OpenAPIConfig) { super(config); } - {{/equals}} - {{#equals @root.httpClient 'angular'}} - /** - * Request method - * @param options The request options from the service - * @returns Observable - * @throws ApiError - */ - public override request(options: ApiRequestOptions): Observable { - return __request(this.config, this.http, options); - } - {{else}} /** * Request method * @param options The request options from the service @@ -57,5 +21,4 @@ export class {{httpRequest}} extends BaseHttpRequest { public override request(options: ApiRequestOptions): CancelablePromise { return __request(this.config, options); } - {{/equals}} } diff --git a/src/templates/core/OpenAPI.hbs b/src/templates/core/OpenAPI.hbs index 7b9560a26..0ab1e0cfb 100644 --- a/src/templates/core/OpenAPI.hbs +++ b/src/templates/core/OpenAPI.hbs @@ -1,8 +1,9 @@ {{>header}} import type { ApiRequestOptions } from './ApiRequestOptions'; +import type * as D from '@majkit/fp-ts-schema'; -type Resolver = (options: ApiRequestOptions) => Promise; +type Resolver = (options: ApiRequestOptions>>) => Promise; type Headers = Record; export type OpenAPIConfig = { diff --git a/src/templates/core/axios/request.hbs b/src/templates/core/axios/request.hbs index bc88496fd..67bc95d45 100644 --- a/src/templates/core/axios/request.hbs +++ b/src/templates/core/axios/request.hbs @@ -5,11 +5,12 @@ import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } fro import FormData from 'form-data'; import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import { CancelablePromise } from './CancelablePromise'; import type { OnCancel } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; +import { either } from 'fp-ts'; {{>functions/isDefined}} @@ -93,10 +94,8 @@ const convertRequestBody = (body: unknown): any => * @param config The OpenAPI configuration object * @param options The request options from the service * @param axiosClient The axios client instance to use - * @returns CancelablePromise - * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise => { +export const request = (config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise>> => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { options = convertRequestBody(options); @@ -120,10 +119,10 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions, ax catchErrorCodes(options, result); - resolve([result.body, response.status] as const); + resolve(options.responseDecoders[response.status].decode(result.body)); } } catch (error) { - reject(error); + resolve(either.left(error as ApiError)); } }); }; diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index 2c6f1cfa9..7fb4f4346 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -7,6 +7,7 @@ import { CancelablePromise } from './CancelablePromise'; import type { OnCancel } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; import type * as D from '@majkit/fp-ts-schema'; +import { either } from 'fp-ts'; import type { Either } from 'fp-ts/lib/Either'; {{>functions/isDefined}} @@ -87,8 +88,6 @@ const convertRequestBody = (body: unknown): any => * Request method * @param config The OpenAPI configuration object * @param options The request options from the service - * @returns CancelablePromise - * @throws ApiError */ export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { return new CancelablePromise(async (resolve, reject, onCancel) => { @@ -114,10 +113,10 @@ export const request = >>(config: OpenAPI catchErrorCodes(options, result); - resolve([result.body, response.status] as const); + resolve(options.responseDecoders[response.status].decode(result.body)); } } catch (error) { - reject(error); + resolve(either.left(error as ApiError)); } }); }; diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index 2c06fe9ec..163e1f3a9 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -6,11 +6,12 @@ import type { RequestInit, Response } from 'node-fetch'; import type { AbortSignal } from 'node-fetch/externals'; import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import { CancelablePromise } from './CancelablePromise'; import type { OnCancel } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; +import { either } from 'fp-ts'; {{>functions/isDefined}} @@ -90,10 +91,8 @@ const convertRequestBody = (body: unknown): any => * Request method * @param config The OpenAPI configuration object * @param options The request options from the service - * @returns CancelablePromise - * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { options = convertRequestBody(options); @@ -117,10 +116,10 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C catchErrorCodes(options, result); - resolve([result.body, response.status] as const); + resolve(options.responseDecoders[response.status].decode(result.body)); } } catch (error) { - reject(error); + resolve(either.left(error as ApiError)); } }); }; diff --git a/src/templates/core/xhr/getHeaders.hbs b/src/templates/core/xhr/getHeaders.hbs index 3aca7aef3..fe6130d4f 100644 --- a/src/templates/core/xhr/getHeaders.hbs +++ b/src/templates/core/xhr/getHeaders.hbs @@ -1,4 +1,4 @@ -export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { const token = await resolve(options, config.TOKEN); const username = await resolve(options, config.USERNAME); const password = await resolve(options, config.PASSWORD); diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 2fc934572..87aef9e13 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -1,11 +1,12 @@ {{>header}} import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import { CancelablePromise } from './CancelablePromise'; import type { OnCancel } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; +import { either } from 'fp-ts'; {{>functions/isDefined}} @@ -88,10 +89,8 @@ const convertRequestBody = (body: unknown): any => * Request method * @param config The OpenAPI configuration object * @param options The request options from the service - * @returns CancelablePromise - * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { options = convertRequestBody(options); @@ -115,10 +114,10 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C catchErrorCodes(options, result); - resolve([result.body, response.status] as const); + resolve(options.responseDecoders[response.status].decode(result.body)); } } catch (error) { - reject(error); + resolve(either.left(error as ApiError)); } }); }; diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 0f7d6df32..ee1d73578 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -25,9 +25,15 @@ export class {{{name}}}{{{@root.postfix}}} { {{#if parameters}} private static {{{name}}}Decoder = D.object({ + {{#if @root.useOptions~}} {{#each parameters}} {{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}, {{/each}} + {{~else}} + {{#each parameters}} + {{{name}}}: {{#unless isRequired}}{{#unless default}}D.optional({{>type}}){{else}}{{>type}}{{/unless}}{{else}}{{>type}}{{/unless}}, + {{/each}} + {{/if}} }); {{/if}} @@ -89,13 +95,13 @@ export class {{{name}}}{{{@root.postfix}}} { {{#if responseHeader}} responseHeader: '{{{responseHeader}}}', {{/if}} - {{~#if results~}} + {{#if results}} responseDecoders: { {{#each results}} - {{{code}}}: {{>type}}, + {{{code}}}: {{>type}}, {{/each}} }, - {{~/if~}} + {{/if}} {{#if errors}} errors: { {{#each errors}} diff --git a/src/templates/partials/exportComposition.hbs b/src/templates/partials/exportComposition.hbs deleted file mode 100644 index 15bf6f65c..000000000 --- a/src/templates/partials/exportComposition.hbs +++ /dev/null @@ -1,38 +0,0 @@ -{{#ifdef description deprecated}} -/** -{{#if description}} - * {{{escapeComment description}}} -{{/if}} -{{#if deprecated}} - * @deprecated -{{/if}} - */ -{{/ifdef}} -export type {{{name}}} = {{>type parent=name}}; -{{#if enums}} -{{#unless @root.useUnionTypes}} - -export namespace {{{name}}} { - - {{#each enums}} - {{#ifdef description deprecated}} - /** - {{#if description}} - * {{{escapeComment description}}} - {{/if}} - {{#if deprecated}} - * @deprecated - {{/if}} - */ - {{/ifdef}} - export enum {{{name}}} { - {{#each enum}} - {{{name}}} = {{{value}}}, - {{/each}} - } - - {{/each}} - -} -{{/unless}} -{{/if}} diff --git a/src/templates/partials/exportEnum.hbs b/src/templates/partials/exportEnum.hbs deleted file mode 100644 index f47622ef9..000000000 --- a/src/templates/partials/exportEnum.hbs +++ /dev/null @@ -1,24 +0,0 @@ -{{#ifdef description deprecated}} -/** -{{#if description}} - * {{{escapeComment description}}} -{{/if}} -{{#if deprecated}} - * @deprecated -{{/if}} - */ -{{/ifdef}} -export enum {{{name}}} { - {{#each enum}} - {{#if description}} - /** - * {{{escapeComment description}}} - */ - {{/if}} - {{#containsSpaces name}} - '{{{name}}}' = {{{value}}}, - {{else}} - {{{name}}} = {{{value}}}, - {{/containsSpaces}} - {{/each}} -} diff --git a/src/templates/partials/exportInterface.hbs b/src/templates/partials/exportInterface.hbs deleted file mode 100644 index c15e458ed..000000000 --- a/src/templates/partials/exportInterface.hbs +++ /dev/null @@ -1,47 +0,0 @@ -{{#ifdef description deprecated}} -/** -{{#if description}} - * {{{escapeComment description}}} -{{/if}} -{{#if deprecated}} - * @deprecated -{{/if}} - */ -{{/ifdef}} -export type {{{name}}} = { - {{#each properties}} - {{#ifdef description deprecated}} - /** - {{#if description}} - * {{{escapeComment description}}} - {{/if}} - {{#if deprecated}} - * @deprecated - {{/if}} - */ - {{/ifdef}} - {{>isReadOnly}}{{{name}}}: {{#>isRequired}}{{>type parent=../name}}{{/isRequired}}; - {{/each}} -}; -{{#if enums}} -{{#unless @root.useUnionTypes}} - -export namespace {{{name}}} { - - {{#each enums}} - {{#if description}} - /** - * {{{escapeComment description}}} - */ - {{/if}} - export enum {{{name}}} { - {{#each enum}} - {{{name}}} = {{{value}}}, - {{/each}} - } - - {{/each}} - -} -{{/unless}} -{{/if}} diff --git a/src/templates/partials/exportType.hbs b/src/templates/partials/exportType.hbs deleted file mode 100644 index b57790a0b..000000000 --- a/src/templates/partials/exportType.hbs +++ /dev/null @@ -1,11 +0,0 @@ -{{#ifdef description deprecated}} -/** -{{#if description}} - * {{{escapeComment description}}} -{{/if}} -{{#if deprecated}} - * @deprecated -{{/if}} - */ -{{/ifdef}} -export type {{{name}}} = {{>type}}; diff --git a/src/templates/partials/isNullable.hbs b/src/templates/partials/isNullable.hbs index c3280db76..3315b8df5 100644 --- a/src/templates/partials/isNullable.hbs +++ b/src/templates/partials/isNullable.hbs @@ -1 +1,5 @@ -{{#if isNullable}}D.nullable({{> @partial-block }}){{else}}{{> @partial-block }}{{/if}} +{{#if isNullable~}} +D.nullable({{> @partial-block }}) +{{~else~}} +{{> @partial-block }} +{{~/if}} diff --git a/src/templates/partials/isRequired.hbs b/src/templates/partials/isRequired.hbs index a47dbb777..9067bdef0 100644 --- a/src/templates/partials/isRequired.hbs +++ b/src/templates/partials/isRequired.hbs @@ -1 +1,5 @@ -{{#unless isRequired}}D.optional({{> @partial-block }}){{else}}{{> @partial-block }}{{/unless}} +{{#unless isRequired~}} +D.optional({{>@partial-block}}) +{{~else~}} +{{>@partial-block}} +{{~/unless}} diff --git a/src/templates/partials/parameters.hbs b/src/templates/partials/parameters.hbs index 2089370cf..df4b65aa7 100644 --- a/src/templates/partials/parameters.hbs +++ b/src/templates/partials/parameters.hbs @@ -2,13 +2,19 @@ {{#if @root.useOptions~}} { {{#each parameters}} -{{{name}}}{{#if default}} = option.some({{{default}}}){{else}}{{#unless isRequired}} = option.none{{/unless}}{{/if}}, +{{{name}}}{{#if default}} = option.some({{{default}}}) +{{~else~}} + {{~#unless isRequired}} = option.none{{/unless~}} +{{~/if}}, {{/each}} }: D.Output {{~else}} {{#each parameters}} -{{{name}}}: D.Output['{{{name}}}']{{#if default}} = option.some({{{default}}}){{else}}{{#unless isRequired}} = option.none{{/unless}}{{/if}}, +{{{name}}}: D.Output['{{{name}}}']{{#if default}} = {{{default}}} + {{~else~}} + {{~#unless isRequired}} = option.none{{/unless~}} +{{~/if}}, {{/each}} {{/if}} {{/if}} diff --git a/src/templates/partials/typeArray.hbs b/src/templates/partials/typeArray.hbs index 3f11f09ec..8449556c4 100644 --- a/src/templates/partials/typeArray.hbs +++ b/src/templates/partials/typeArray.hbs @@ -1 +1,9 @@ -{{#>isNullable}}D.array({{~#if link~}}{{>type link}}{{~else~}}{{>base}}{{~/if~}}){{/isNullable}} +{{#>isNullable~}} +D.array( + {{~#if link~}} + {{~>type link~}} + {{~else~}} + {{~>base~}} + {{~/if~}} +) +{{~/isNullable}} diff --git a/src/templates/partials/typeDictionary.hbs b/src/templates/partials/typeDictionary.hbs index a3e39b71e..d2aaaa61a 100644 --- a/src/templates/partials/typeDictionary.hbs +++ b/src/templates/partials/typeDictionary.hbs @@ -1 +1,9 @@ -{{#>isNullable}}D.record({{~#if link~}}{{>type link}}{{~else~}}{{>base}}{{~/if~}}){{/isNullable}} +{{#>isNullable~}} +D.record( + {{~#if link~}} + {{~>type link~}} + {{~else~}} + {{~>base~}} + {{~/if~}} +) +{{~/isNullable}} diff --git a/src/templates/partials/typeEnum.hbs b/src/templates/partials/typeEnum.hbs index 4c9fac806..08cb9d3aa 100644 --- a/src/templates/partials/typeEnum.hbs +++ b/src/templates/partials/typeEnum.hbs @@ -1 +1,8 @@ -{{#>isNullable}}D.literalUnion({{#each enum}}{{{value}}}{{#unless @last}}, {{/unless}}{{/each}}){{/isNullable}} +{{#>isNullable~}} +D.literalUnion( + {{~#each enum~}} + {{{value}}} + {{~#unless @last~}}, {{/unless~}} + {{~/each~}} +) +{{~/isNullable}} diff --git a/src/templates/partials/typeGeneric.hbs b/src/templates/partials/typeGeneric.hbs index 16302c7cf..3c312f596 100644 --- a/src/templates/partials/typeGeneric.hbs +++ b/src/templates/partials/typeGeneric.hbs @@ -1 +1,3 @@ -{{#>isNullable}}{{>base}}{{/isNullable}} +{{#>isNullable~}} + {{~>base~}} +{{~/isNullable}} diff --git a/src/templates/partials/typeInterface.hbs b/src/templates/partials/typeInterface.hbs index 5010d1a78..2d00caf21 100644 --- a/src/templates/partials/typeInterface.hbs +++ b/src/templates/partials/typeInterface.hbs @@ -1,11 +1,17 @@ {{~#if properties~}} -{{#>isNullable}} +{{#>isNullable~}} D.object({ - {{#each properties}} - {{{name}}}: {{#>isRequired}}{{#if ../parent}}{{>type parent=../parent}}{{else}}{{>type}}{{/if}}{{/isRequired}}, - {{/each}} +{{#each properties}} + {{{name}}}: {{#>isRequired}} + {{~#if ../parent~}} + {{~>type parent=../parent}} + {{~else~}} + {{~>type}} + {{~/if~}} + {{~/isRequired}}, +{{/each}} }) -{{/isNullable}} +{{~/isNullable}} {{~else~}} D.createDecoder({ forceDecode: (data) => data, diff --git a/src/templates/partials/typeIntersection.hbs b/src/templates/partials/typeIntersection.hbs index 5ac67ea62..869f72747 100644 --- a/src/templates/partials/typeIntersection.hbs +++ b/src/templates/partials/typeIntersection.hbs @@ -1 +1,8 @@ -{{#>isNullable}}D.allOf({{#each properties}}{{>type}}{{#unless @last}}, {{/unless}}{{/each}}){{/isNullable}} +{{#>isNullable~}} +D.allOf( + {{~#each properties~}} + {{~>type~}} + {{~#unless @last~}}, {{/unless~}} + {{~/each~}} +) +{{~/isNullable}} diff --git a/src/templates/partials/typeReference.hbs b/src/templates/partials/typeReference.hbs index f099e56cc..aa3addd15 100644 --- a/src/templates/partials/typeReference.hbs +++ b/src/templates/partials/typeReference.hbs @@ -1 +1,7 @@ -{{#>isNullable}}{{~#if link~}}{{>type link}}{{~else~}}{{>base}}{{~/if~}}{{/isNullable}} +{{#>isNullable}} + {{~#if link~}} + {{~>type link~}} + {{~else~}} + {{~>base~}} + {{~/if~}} +{{/isNullable}} diff --git a/src/templates/partials/typeUnion.hbs b/src/templates/partials/typeUnion.hbs index e62890c36..e5c8d36e3 100644 --- a/src/templates/partials/typeUnion.hbs +++ b/src/templates/partials/typeUnion.hbs @@ -1 +1,8 @@ -{{#>isNullable}}D.oneOf({{#each properties}}{{>type}}{{#unless @last}}, {{/unless}}{{/each}}){{/isNullable}} +{{#>isNullable~}} +D.oneOf( + {{~#each properties~}} + {{~>type~}} + {{~#unless @last~}}, {{/unless~}} + {{~/each~}} +) +{{~/isNullable}} diff --git a/src/utils/registerHandlebarHelpers.spec.ts b/src/utils/registerHandlebarHelpers.spec.ts index f8347abdb..73ff11167 100644 --- a/src/utils/registerHandlebarHelpers.spec.ts +++ b/src/utils/registerHandlebarHelpers.spec.ts @@ -8,16 +8,12 @@ describe('registerHandlebarHelpers', () => { registerHandlebarHelpers({ httpClient: HttpClient.FETCH, useOptions: false, - useUnionTypes: false, }); const helpers = Object.keys(Handlebars.helpers); expect(helpers).toContain('ifdef'); expect(helpers).toContain('equals'); expect(helpers).toContain('notEquals'); expect(helpers).toContain('containsSpaces'); - expect(helpers).toContain('union'); - expect(helpers).toContain('intersection'); - expect(helpers).toContain('enumerator'); expect(helpers).toContain('escapeComment'); expect(helpers).toContain('escapeDescription'); expect(helpers).toContain('camelCase'); diff --git a/src/utils/registerHandlebarHelpers.ts b/src/utils/registerHandlebarHelpers.ts index 88f47c19b..726ac148e 100644 --- a/src/utils/registerHandlebarHelpers.ts +++ b/src/utils/registerHandlebarHelpers.ts @@ -2,15 +2,11 @@ import camelCase from 'camelcase'; import Handlebars from 'handlebars/runtime'; import { EOL } from 'os'; -import type { Enum } from '../client/interfaces/Enum'; -import type { Model } from '../client/interfaces/Model'; import type { HttpClient } from '../HttpClient'; -import { unique } from './unique'; export const registerHandlebarHelpers = (root: { httpClient: HttpClient; useOptions: boolean; - useUnionTypes: boolean; }): void => { Handlebars.registerHelper('ifdef', function (this: any, ...args): string { const options = args.pop(); @@ -41,55 +37,6 @@ export const registerHandlebarHelpers = (root: { } ); - Handlebars.registerHelper( - 'union', - function (this: any, properties: Model[], parent: string | undefined, options: Handlebars.HelperOptions) { - const type = Handlebars.partials['type']; - const types = properties.map(property => type({ ...root, ...property, parent })); - const uniqueTypes = types.filter(unique); - let uniqueTypesString = uniqueTypes.join(' | '); - if (uniqueTypes.length > 1) { - uniqueTypesString = `(${uniqueTypesString})`; - } - return options.fn(uniqueTypesString); - } - ); - - Handlebars.registerHelper( - 'intersection', - function (this: any, properties: Model[], parent: string | undefined, options: Handlebars.HelperOptions) { - const type = Handlebars.partials['type']; - const types = properties.map(property => type({ ...root, ...property, parent })); - const uniqueTypes = types.filter(unique); - let uniqueTypesString = uniqueTypes.join(' & '); - if (uniqueTypes.length > 1) { - uniqueTypesString = `(${uniqueTypesString})`; - } - return options.fn(uniqueTypesString); - } - ); - - Handlebars.registerHelper( - 'enumerator', - function ( - this: any, - enumerators: Enum[], - parent: string | undefined, - name: string | undefined, - options: Handlebars.HelperOptions - ) { - if (!root.useUnionTypes && parent && name) { - return `${parent}.${name}`; - } - return options.fn( - enumerators - .map(enumerator => enumerator.value) - .filter(unique) - .join(' | ') - ); - } - ); - Handlebars.registerHelper('escapeComment', function (value: string): string { return value .replace(/\*\//g, '*') diff --git a/src/utils/registerHandlebarTemplates.spec.ts b/src/utils/registerHandlebarTemplates.spec.ts index 5e1302384..24bdd3d62 100644 --- a/src/utils/registerHandlebarTemplates.spec.ts +++ b/src/utils/registerHandlebarTemplates.spec.ts @@ -6,7 +6,6 @@ describe('registerHandlebarTemplates', () => { const templates = registerHandlebarTemplates({ httpClient: HttpClient.FETCH, useOptions: false, - useUnionTypes: false, }); expect(templates.index).toBeDefined(); expect(templates.exports.model).toBeDefined(); diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index a219b2b06..ee8637976 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -51,10 +51,6 @@ import templateExportSchema from '../templates/exportSchema.hbs'; import templateExportService from '../templates/exportService.hbs'; import templateIndex from '../templates/index.hbs'; import partialBase from '../templates/partials/base.hbs'; -import partialExportComposition from '../templates/partials/exportComposition.hbs'; -import partialExportEnum from '../templates/partials/exportEnum.hbs'; -import partialExportInterface from '../templates/partials/exportInterface.hbs'; -import partialExportType from '../templates/partials/exportType.hbs'; import partialHeader from '../templates/partials/header.hbs'; import partialIsNullable from '../templates/partials/isNullable.hbs'; import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; @@ -106,7 +102,6 @@ export interface Templates { export const registerHandlebarTemplates = (root: { httpClient: HttpClient; useOptions: boolean; - useUnionTypes: boolean; }): Templates => { registerHandlebarHelpers(root); @@ -132,10 +127,6 @@ export const registerHandlebarTemplates = (root: { }; // Partials for the generations of the models, services, etc. - Handlebars.registerPartial('exportEnum', Handlebars.template(partialExportEnum)); - Handlebars.registerPartial('exportInterface', Handlebars.template(partialExportInterface)); - Handlebars.registerPartial('exportComposition', Handlebars.template(partialExportComposition)); - Handlebars.registerPartial('exportType', Handlebars.template(partialExportType)); Handlebars.registerPartial('header', Handlebars.template(partialHeader)); Handlebars.registerPartial('isNullable', Handlebars.template(partialIsNullable)); Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly)); diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 3c06a95a5..7aeb31c03 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -42,7 +42,6 @@ describe('writeClient', () => { './dist', HttpClient.FETCH, false, - false, true, true, true, diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index cea2f3d88..9b3b7261c 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -21,7 +21,6 @@ import { writeClientServices } from './writeClientServices'; * @param output The relative location of the output directory * @param httpClient The selected httpClient (fetch, xhr, node or axios) * @param useOptions Use options or arguments functions - * @param useUnionTypes Use union types instead of enums * @param exportCore Generate core client classes * @param exportServices Generate services * @param exportModels Generate models @@ -39,7 +38,6 @@ export const writeClient = async ( output: string, httpClient: HttpClient, useOptions: boolean, - useUnionTypes: boolean, exportCore: boolean, exportServices: boolean, exportModels: boolean, @@ -74,7 +72,6 @@ export const writeClient = async ( templates, outputPathServices, httpClient, - useUnionTypes, useOptions, indent, postfixServices, @@ -85,13 +82,13 @@ export const writeClient = async ( if (exportSchemas) { await rmdir(outputPathSchemas); await mkdir(outputPathSchemas); - await writeClientSchemas(client.models, templates, outputPathSchemas, httpClient, useUnionTypes, indent); + await writeClientSchemas(client.models, templates, outputPathSchemas, httpClient, indent); } if (exportModels) { await rmdir(outputPathModels); await mkdir(outputPathModels); - await writeClientModels(client.models, templates, outputPathModels, httpClient, useUnionTypes, indent); + await writeClientModels(client.models, templates, outputPathModels, httpClient, indent); } if (isDefined(clientName)) { @@ -105,7 +102,6 @@ export const writeClient = async ( client, templates, outputPath, - useUnionTypes, exportCore, exportServices, exportModels, diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index a7d5b610a..5dfebd29f 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -36,7 +36,7 @@ describe('writeClientIndex', () => { }, }; - await writeClientIndex(client, templates, '/', true, true, true, true, true, 'Service', ''); + await writeClientIndex(client, templates, '/', true, true, true, true, 'Service', ''); expect(writeFile).toBeCalledWith(resolve('/', '/index.ts'), 'index'); }); diff --git a/src/utils/writeClientIndex.ts b/src/utils/writeClientIndex.ts index 5044294d5..4eb1ca250 100644 --- a/src/utils/writeClientIndex.ts +++ b/src/utils/writeClientIndex.ts @@ -14,7 +14,6 @@ import { sortServicesByName } from './sortServicesByName'; * @param client Client object, containing, models, schemas and services * @param templates The loaded handlebar templates * @param outputPath Directory to write the generated files to - * @param useUnionTypes Use union types instead of enums * @param exportCore Generate core * @param exportServices Generate services * @param exportModels Generate models @@ -27,7 +26,6 @@ export const writeClientIndex = async ( client: Client, templates: Templates, outputPath: string, - useUnionTypes: boolean, exportCore: boolean, exportServices: boolean, exportModels: boolean, @@ -41,7 +39,6 @@ export const writeClientIndex = async ( exportServices, exportModels, exportSchemas, - useUnionTypes, postfixServices, postfixModels, clientName, diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index ee0f2b4f6..166ac8f50 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -52,7 +52,7 @@ describe('writeClientModels', () => { }, }; - await writeClientModels(models, templates, '/', HttpClient.FETCH, false, Indent.SPACE_4); + await writeClientModels(models, templates, '/', HttpClient.FETCH, Indent.SPACE_4); expect(writeFile).toBeCalledWith(resolve('/', '/User.ts'), `model${EOL}`); }); diff --git a/src/utils/writeClientModels.ts b/src/utils/writeClientModels.ts index 997569b9f..915c6f7a3 100644 --- a/src/utils/writeClientModels.ts +++ b/src/utils/writeClientModels.ts @@ -14,7 +14,6 @@ import type { Templates } from './registerHandlebarTemplates'; * @param templates The loaded handlebar templates * @param outputPath Directory to write the generated files to * @param httpClient The selected httpClient (fetch, xhr, node or axios) - * @param useUnionTypes Use union types instead of enums * @param indent Indentation options (4, 2 or tab) */ export const writeClientModels = async ( @@ -22,7 +21,6 @@ export const writeClientModels = async ( templates: Templates, outputPath: string, httpClient: HttpClient, - useUnionTypes: boolean, indent: Indent ): Promise => { for (const model of models) { @@ -30,7 +28,6 @@ export const writeClientModels = async ( const templateResult = templates.exports.model({ ...model, httpClient, - useUnionTypes, }); await writeFile(file, i(f(templateResult), indent)); } diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index e75928b8c..c6cb3262d 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -52,7 +52,7 @@ describe('writeClientSchemas', () => { }, }; - await writeClientSchemas(models, templates, '/', HttpClient.FETCH, false, Indent.SPACE_4); + await writeClientSchemas(models, templates, '/', HttpClient.FETCH, Indent.SPACE_4); expect(writeFile).toBeCalledWith(resolve('/', '/$User.ts'), `schema${EOL}`); }); diff --git a/src/utils/writeClientSchemas.ts b/src/utils/writeClientSchemas.ts index e1c885f64..c2456fdd6 100644 --- a/src/utils/writeClientSchemas.ts +++ b/src/utils/writeClientSchemas.ts @@ -14,7 +14,6 @@ import type { Templates } from './registerHandlebarTemplates'; * @param templates The loaded handlebar templates * @param outputPath Directory to write the generated files to * @param httpClient The selected httpClient (fetch, xhr, node or axios) - * @param useUnionTypes Use union types instead of enums * @param indent Indentation options (4, 2 or tab) */ export const writeClientSchemas = async ( @@ -22,7 +21,6 @@ export const writeClientSchemas = async ( templates: Templates, outputPath: string, httpClient: HttpClient, - useUnionTypes: boolean, indent: Indent ): Promise => { for (const model of models) { @@ -30,7 +28,6 @@ export const writeClientSchemas = async ( const templateResult = templates.exports.schema({ ...model, httpClient, - useUnionTypes, }); await writeFile(file, i(f(templateResult), indent)); } diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index f936d6609..3ba5e064c 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -40,7 +40,7 @@ describe('writeClientServices', () => { }, }; - await writeClientServices(services, templates, '/', HttpClient.FETCH, false, false, Indent.SPACE_4, 'Service'); + await writeClientServices(services, templates, '/', HttpClient.FETCH, false, Indent.SPACE_4, 'Service'); expect(writeFile).toBeCalledWith(resolve('/', '/UserService.ts'), `service${EOL}`); }); diff --git a/src/utils/writeClientServices.ts b/src/utils/writeClientServices.ts index 2f95341d2..826257c35 100644 --- a/src/utils/writeClientServices.ts +++ b/src/utils/writeClientServices.ts @@ -15,7 +15,6 @@ import type { Templates } from './registerHandlebarTemplates'; * @param templates The loaded handlebar templates * @param outputPath Directory to write the generated files to * @param httpClient The selected httpClient (fetch, xhr, node or axios) - * @param useUnionTypes Use union types instead of enums * @param useOptions Use options or arguments functions * @param indent Indentation options (4, 2 or tab) * @param postfix Service name postfix @@ -26,7 +25,6 @@ export const writeClientServices = async ( templates: Templates, outputPath: string, httpClient: HttpClient, - useUnionTypes: boolean, useOptions: boolean, indent: Indent, postfix: string, @@ -37,7 +35,6 @@ export const writeClientServices = async ( const templateResult = templates.exports.service({ ...service, httpClient, - useUnionTypes, useOptions, postfix, exportClient: isDefined(clientName), diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index ef6b18554..eff6fd73b 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -7,15 +7,16 @@ exports[`v2 should generate: test/generated/v2/core/ApiError.ts 1`] = ` /* eslint-disable */ import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; +import type * as D from '@majkit/fp-ts-schema'; -export class ApiError extends Error { +export class ApiError>> extends Error { public readonly url: string; public readonly status: number; public readonly statusText: string; public readonly body: any; - public readonly request: ApiRequestOptions; + public readonly request: ApiRequestOptions; - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { super(message); this.name = 'ApiError'; @@ -34,7 +35,16 @@ exports[`v2 should generate: test/generated/v2/core/ApiRequestOptions.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type ApiRequestOptions = { +import type * as D from '@majkit/fp-ts-schema'; + +export type ApiResponse>> = { + [key in keyof T]: { + readonly status: key; + readonly body: key extends number ? D.Output : never; + }; +}[keyof T]; + +export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; readonly path?: Record; @@ -44,6 +54,7 @@ export type ApiRequestOptions = { readonly formData?: Record; readonly body?: any; readonly mediaType?: string; + readonly responseDecoders?: T; readonly responseHeader?: string; readonly errors?: Record; }; @@ -206,8 +217,9 @@ exports[`v2 should generate: test/generated/v2/core/OpenAPI.ts 1`] = ` /* tslint:disable */ /* eslint-disable */ import type { ApiRequestOptions } from './ApiRequestOptions'; +import type * as D from '@majkit/fp-ts-schema'; -type Resolver = (options: ApiRequestOptions) => Promise; +type Resolver = (options: ApiRequestOptions>>) => Promise; type Headers = Record; export type OpenAPIConfig = { @@ -242,11 +254,14 @@ exports[`v2 should generate: test/generated/v2/core/request.ts 1`] = ` /* tslint:disable */ /* eslint-disable */ import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import { CancelablePromise } from './CancelablePromise'; import type { OnCancel } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; +import type * as D from '@majkit/fp-ts-schema'; +import { either } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; export const isDefined = (value: T | null | undefined): value is Exclude => { return value !== undefined && value !== null; @@ -519,17 +534,42 @@ export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): ); } }; +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(value => convertRequestBody(value)); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service - * @returns CancelablePromise - * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { + options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); @@ -550,10 +590,10 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C catchErrorCodes(options, result); - resolve(result.body); + resolve(options.responseDecoders[response.status].decode(result.body)); } } catch (error) { - reject(error); + resolve(either.left(error as ApiError)); } }); }; @@ -570,54 +610,54 @@ export { CancelablePromise, CancelError } from './core/CancelablePromise'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; -export type { _default } from './models/_default'; -export type { ArrayWithArray } from './models/ArrayWithArray'; -export type { ArrayWithBooleans } from './models/ArrayWithBooleans'; -export type { ArrayWithNumbers } from './models/ArrayWithNumbers'; -export type { ArrayWithProperties } from './models/ArrayWithProperties'; -export type { ArrayWithReferences } from './models/ArrayWithReferences'; -export type { ArrayWithStrings } from './models/ArrayWithStrings'; -export type { CommentWithBackticks } from './models/CommentWithBackticks'; -export type { CommentWithBreaks } from './models/CommentWithBreaks'; -export type { CommentWithExpressionPlaceholders } from './models/CommentWithExpressionPlaceholders'; -export type { CommentWithQuotes } from './models/CommentWithQuotes'; -export type { CommentWithReservedCharacters } from './models/CommentWithReservedCharacters'; -export type { CommentWithSlashes } from './models/CommentWithSlashes'; -export type { Date } from './models/Date'; -export type { DictionaryWithArray } from './models/DictionaryWithArray'; -export type { DictionaryWithDictionary } from './models/DictionaryWithDictionary'; -export type { DictionaryWithProperties } from './models/DictionaryWithProperties'; -export type { DictionaryWithReference } from './models/DictionaryWithReference'; -export type { DictionaryWithString } from './models/DictionaryWithString'; -export type { EnumFromDescription } from './models/EnumFromDescription'; -export { EnumWithExtensions } from './models/EnumWithExtensions'; -export { EnumWithNumbers } from './models/EnumWithNumbers'; -export { EnumWithStrings } from './models/EnumWithStrings'; -export type { ModelThatExtends } from './models/ModelThatExtends'; -export type { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; -export type { ModelWithArray } from './models/ModelWithArray'; -export type { ModelWithBoolean } from './models/ModelWithBoolean'; -export type { ModelWithCircularReference } from './models/ModelWithCircularReference'; -export type { ModelWithDictionary } from './models/ModelWithDictionary'; -export type { ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; -export type { ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; -export { ModelWithEnum } from './models/ModelWithEnum'; -export type { ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; -export type { ModelWithInteger } from './models/ModelWithInteger'; -export type { ModelWithNestedEnums } from './models/ModelWithNestedEnums'; -export type { ModelWithNestedProperties } from './models/ModelWithNestedProperties'; -export type { ModelWithNullableString } from './models/ModelWithNullableString'; -export type { ModelWithOrderedProperties } from './models/ModelWithOrderedProperties'; -export type { ModelWithPattern } from './models/ModelWithPattern'; -export type { ModelWithProperties } from './models/ModelWithProperties'; -export type { ModelWithReference } from './models/ModelWithReference'; -export type { ModelWithString } from './models/ModelWithString'; -export type { SimpleBoolean } from './models/SimpleBoolean'; -export type { SimpleFile } from './models/SimpleFile'; -export type { SimpleInteger } from './models/SimpleInteger'; -export type { SimpleReference } from './models/SimpleReference'; -export type { SimpleString } from './models/SimpleString'; -export type { SimpleStringWithPattern } from './models/SimpleStringWithPattern'; +export type { _defaultType as _default } from './models/_default'; +export type { ArrayWithArrayType as ArrayWithArray } from './models/ArrayWithArray'; +export type { ArrayWithBooleansType as ArrayWithBooleans } from './models/ArrayWithBooleans'; +export type { ArrayWithNumbersType as ArrayWithNumbers } from './models/ArrayWithNumbers'; +export type { ArrayWithPropertiesType as ArrayWithProperties } from './models/ArrayWithProperties'; +export type { ArrayWithReferencesType as ArrayWithReferences } from './models/ArrayWithReferences'; +export type { ArrayWithStringsType as ArrayWithStrings } from './models/ArrayWithStrings'; +export type { CommentWithBackticksType as CommentWithBackticks } from './models/CommentWithBackticks'; +export type { CommentWithBreaksType as CommentWithBreaks } from './models/CommentWithBreaks'; +export type { CommentWithExpressionPlaceholdersType as CommentWithExpressionPlaceholders } from './models/CommentWithExpressionPlaceholders'; +export type { CommentWithQuotesType as CommentWithQuotes } from './models/CommentWithQuotes'; +export type { CommentWithReservedCharactersType as CommentWithReservedCharacters } from './models/CommentWithReservedCharacters'; +export type { CommentWithSlashesType as CommentWithSlashes } from './models/CommentWithSlashes'; +export type { DateType as Date } from './models/Date'; +export type { DictionaryWithArrayType as DictionaryWithArray } from './models/DictionaryWithArray'; +export type { DictionaryWithDictionaryType as DictionaryWithDictionary } from './models/DictionaryWithDictionary'; +export type { DictionaryWithPropertiesType as DictionaryWithProperties } from './models/DictionaryWithProperties'; +export type { DictionaryWithReferenceType as DictionaryWithReference } from './models/DictionaryWithReference'; +export type { DictionaryWithStringType as DictionaryWithString } from './models/DictionaryWithString'; +export type { EnumFromDescriptionType as EnumFromDescription } from './models/EnumFromDescription'; +export type { EnumWithExtensionsType as EnumWithExtensions } from './models/EnumWithExtensions'; +export type { EnumWithNumbersType as EnumWithNumbers } from './models/EnumWithNumbers'; +export type { EnumWithStringsType as EnumWithStrings } from './models/EnumWithStrings'; +export type { ModelThatExtendsType as ModelThatExtends } from './models/ModelThatExtends'; +export type { ModelThatExtendsExtendsType as ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; +export type { ModelWithArrayType as ModelWithArray } from './models/ModelWithArray'; +export type { ModelWithBooleanType as ModelWithBoolean } from './models/ModelWithBoolean'; +export type { ModelWithCircularReferenceType as ModelWithCircularReference } from './models/ModelWithCircularReference'; +export type { ModelWithDictionaryType as ModelWithDictionary } from './models/ModelWithDictionary'; +export type { ModelWithDuplicateImportsType as ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; +export type { ModelWithDuplicatePropertiesType as ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; +export type { ModelWithEnumType as ModelWithEnum } from './models/ModelWithEnum'; +export type { ModelWithEnumFromDescriptionType as ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; +export type { ModelWithIntegerType as ModelWithInteger } from './models/ModelWithInteger'; +export type { ModelWithNestedEnumsType as ModelWithNestedEnums } from './models/ModelWithNestedEnums'; +export type { ModelWithNestedPropertiesType as ModelWithNestedProperties } from './models/ModelWithNestedProperties'; +export type { ModelWithNullableStringType as ModelWithNullableString } from './models/ModelWithNullableString'; +export type { ModelWithOrderedPropertiesType as ModelWithOrderedProperties } from './models/ModelWithOrderedProperties'; +export type { ModelWithPatternType as ModelWithPattern } from './models/ModelWithPattern'; +export type { ModelWithPropertiesType as ModelWithProperties } from './models/ModelWithProperties'; +export type { ModelWithReferenceType as ModelWithReference } from './models/ModelWithReference'; +export type { ModelWithStringType as ModelWithString } from './models/ModelWithString'; +export type { SimpleBooleanType as SimpleBoolean } from './models/SimpleBoolean'; +export type { SimpleFileType as SimpleFile } from './models/SimpleFile'; +export type { SimpleIntegerType as SimpleInteger } from './models/SimpleInteger'; +export type { SimpleReferenceType as SimpleReference } from './models/SimpleReference'; +export type { SimpleStringType as SimpleString } from './models/SimpleString'; +export type { SimpleStringWithPatternType as SimpleStringWithPattern } from './models/SimpleStringWithPattern'; export { $_default } from './schemas/$_default'; export { $ArrayWithArray } from './schemas/$ArrayWithArray'; @@ -692,10 +732,11 @@ exports[`v2 should generate: test/generated/v2/models/_default.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type _default = { - name?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const _default = D.object({ + name: D.optional(D.string), +}); +export type _defaultType = D.Output; " `; @@ -704,11 +745,10 @@ exports[`v2 should generate: test/generated/v2/models/ArrayWithArray.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a simple array containing an array - */ -export type ArrayWithArray = Array>; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ArrayWithArray = D.array(D.array(ModelWithString)); +export type ArrayWithArrayType = D.Output; " `; @@ -717,10 +757,9 @@ exports[`v2 should generate: test/generated/v2/models/ArrayWithBooleans.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple array with booleans - */ -export type ArrayWithBooleans = Array; +import * as D from '@majkit/fp-ts-schema'; +export const ArrayWithBooleans = D.array(D.boolean); +export type ArrayWithBooleansType = D.Output; " `; @@ -729,10 +768,9 @@ exports[`v2 should generate: test/generated/v2/models/ArrayWithNumbers.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple array with numbers - */ -export type ArrayWithNumbers = Array; +import * as D from '@majkit/fp-ts-schema'; +export const ArrayWithNumbers = D.array(D.number); +export type ArrayWithNumbersType = D.Output; " `; @@ -741,13 +779,12 @@ exports[`v2 should generate: test/generated/v2/models/ArrayWithProperties.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple array with properties - */ -export type ArrayWithProperties = Array<{ - foo?: string; - bar?: string; -}>; +import * as D from '@majkit/fp-ts-schema'; +export const ArrayWithProperties = D.array(D.object({ + foo: D.optional(D.string), + bar: D.optional(D.string), +})); +export type ArrayWithPropertiesType = D.Output; " `; @@ -756,11 +793,10 @@ exports[`v2 should generate: test/generated/v2/models/ArrayWithReferences.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a simple array with references - */ -export type ArrayWithReferences = Array; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ArrayWithReferences = D.array(ModelWithString); +export type ArrayWithReferencesType = D.Output; " `; @@ -769,10 +805,9 @@ exports[`v2 should generate: test/generated/v2/models/ArrayWithStrings.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple array with strings - */ -export type ArrayWithStrings = Array; +import * as D from '@majkit/fp-ts-schema'; +export const ArrayWithStrings = D.array(D.string); +export type ArrayWithStringsType = D.Output; " `; @@ -781,10 +816,9 @@ exports[`v2 should generate: test/generated/v2/models/CommentWithBackticks.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing backticks in string: \`backticks\` and \`\`\`multiple backticks\`\`\` should work - */ -export type CommentWithBackticks = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithBackticks = D.number; +export type CommentWithBackticksType = D.Output; " `; @@ -793,13 +827,9 @@ exports[`v2 should generate: test/generated/v2/models/CommentWithBreaks.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing multiline comments in string: First line - * Second line - * - * Fourth line - */ -export type CommentWithBreaks = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithBreaks = D.number; +export type CommentWithBreaksType = D.Output; " `; @@ -808,10 +838,9 @@ exports[`v2 should generate: test/generated/v2/models/CommentWithExpressionPlace /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing expression placeholders in string: \${expression} should work - */ -export type CommentWithExpressionPlaceholders = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithExpressionPlaceholders = D.number; +export type CommentWithExpressionPlaceholdersType = D.Output; " `; @@ -820,10 +849,9 @@ exports[`v2 should generate: test/generated/v2/models/CommentWithQuotes.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing quotes in string: 'single quote''' and "double quotes""" should work - */ -export type CommentWithQuotes = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithQuotes = D.number; +export type CommentWithQuotesType = D.Output; " `; @@ -832,10 +860,9 @@ exports[`v2 should generate: test/generated/v2/models/CommentWithReservedCharact /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing reserved characters in string: * inline * and ** inline ** should work - */ -export type CommentWithReservedCharacters = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithReservedCharacters = D.number; +export type CommentWithReservedCharactersType = D.Output; " `; @@ -844,10 +871,9 @@ exports[`v2 should generate: test/generated/v2/models/CommentWithSlashes.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work - */ -export type CommentWithSlashes = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithSlashes = D.number; +export type CommentWithSlashesType = D.Output; " `; @@ -856,10 +882,9 @@ exports[`v2 should generate: test/generated/v2/models/Date.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a type-only model that defines Date as a string - */ -export type Date = string; +import * as D from '@majkit/fp-ts-schema'; +export const Date = D.string; +export type DateType = D.Output; " `; @@ -868,11 +893,10 @@ exports[`v2 should generate: test/generated/v2/models/DictionaryWithArray.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a complex dictionary - */ -export type DictionaryWithArray = Record>; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const DictionaryWithArray = D.record(D.array(ModelWithString)); +export type DictionaryWithArrayType = D.Output; " `; @@ -881,10 +905,9 @@ exports[`v2 should generate: test/generated/v2/models/DictionaryWithDictionary.t /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a string dictionary - */ -export type DictionaryWithDictionary = Record>; +import * as D from '@majkit/fp-ts-schema'; +export const DictionaryWithDictionary = D.record(D.record(D.string)); +export type DictionaryWithDictionaryType = D.Output; " `; @@ -893,13 +916,12 @@ exports[`v2 should generate: test/generated/v2/models/DictionaryWithProperties.t /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a complex dictionary - */ -export type DictionaryWithProperties = Record; +import * as D from '@majkit/fp-ts-schema'; +export const DictionaryWithProperties = D.record(D.object({ + foo: D.optional(D.string), + bar: D.optional(D.string), +})); +export type DictionaryWithPropertiesType = D.Output; " `; @@ -908,11 +930,10 @@ exports[`v2 should generate: test/generated/v2/models/DictionaryWithReference.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a string reference - */ -export type DictionaryWithReference = Record; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const DictionaryWithReference = D.record(ModelWithString); +export type DictionaryWithReferenceType = D.Output; " `; @@ -921,10 +942,9 @@ exports[`v2 should generate: test/generated/v2/models/DictionaryWithString.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a string dictionary - */ -export type DictionaryWithString = Record; +import * as D from '@majkit/fp-ts-schema'; +export const DictionaryWithString = D.record(D.string); +export type DictionaryWithStringType = D.Output; " `; @@ -933,10 +953,9 @@ exports[`v2 should generate: test/generated/v2/models/EnumFromDescription.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Success=1,Warning=2,Error=3 - */ -export type EnumFromDescription = number; +import * as D from '@majkit/fp-ts-schema'; +export const EnumFromDescription = D.number; +export type EnumFromDescriptionType = D.Output; " `; @@ -945,23 +964,9 @@ exports[`v2 should generate: test/generated/v2/models/EnumWithExtensions.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple enum with numbers - */ -export enum EnumWithExtensions { - /** - * Used when the status of something is successful - */ - CUSTOM_SUCCESS = 200, - /** - * Used when the status of something has a warning - */ - CUSTOM_WARNING = 400, - /** - * Used when the status of something has an error - */ - CUSTOM_ERROR = 500, -} +import * as D from '@majkit/fp-ts-schema'; +export const EnumWithExtensions = D.literalUnion(200, 400, 500); +export type EnumWithExtensionsType = D.Output; " `; @@ -970,26 +975,9 @@ exports[`v2 should generate: test/generated/v2/models/EnumWithNumbers.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple enum with numbers - */ -export enum EnumWithNumbers { - '_1' = 1, - '_2' = 2, - '_3' = 3, - '_1.1' = 1.1, - '_1.2' = 1.2, - '_1.3' = 1.3, - '_100' = 100, - '_200' = 200, - '_300' = 300, - '_-100' = -100, - '_-200' = -200, - '_-300' = -300, - '_-1.1' = -1.1, - '_-1.2' = -1.2, - '_-1.3' = -1.3, -} +import * as D from '@majkit/fp-ts-schema'; +export const EnumWithNumbers = D.literalUnion(1, 2, 3, 1.1, 1.2, 1.3, 100, 200, 300, -100, -200, -300, -1.1, -1.2, -1.3); +export type EnumWithNumbersType = D.Output; " `; @@ -998,16 +986,9 @@ exports[`v2 should generate: test/generated/v2/models/EnumWithStrings.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple enum with strings - */ -export enum EnumWithStrings { - SUCCESS = 'Success', - WARNING = 'Warning', - ERROR = 'Error', - _SINGLE_QUOTE_ = '\\'Single Quote\\'', - _DOUBLE_QUOTES_ = '"Double Quotes"', -} +import * as D from '@majkit/fp-ts-schema'; +export const EnumWithStrings = D.literalUnion('Success', 'Warning', 'Error', '\\'Single Quote\\'', '"Double Quotes"'); +export type EnumWithStringsType = D.Output; " `; @@ -1016,15 +997,13 @@ exports[`v2 should generate: test/generated/v2/models/ModelThatExtends.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model that extends another model - */ -export type ModelThatExtends = (ModelWithString & { - propExtendsA?: string; - propExtendsB?: ModelWithString; -}); - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelThatExtends = D.allOf(ModelWithString, D.object({ + propExtendsA: D.optional(D.string), + propExtendsB: D.optional(ModelWithString), +})); +export type ModelThatExtendsType = D.Output; " `; @@ -1033,16 +1012,14 @@ exports[`v2 should generate: test/generated/v2/models/ModelThatExtendsExtends.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelThatExtends } from './ModelThatExtends'; -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model that extends another model - */ -export type ModelThatExtendsExtends = (ModelWithString & ModelThatExtends & { - propExtendsC?: string; - propExtendsD?: ModelWithString; -}); - +import * as D from '@majkit/fp-ts-schema'; +import { ModelThatExtends } from './ModelThatExtends'; +import { ModelWithString } from './ModelWithString'; +export const ModelThatExtendsExtends = D.allOf(ModelWithString, ModelThatExtends, D.object({ + propExtendsC: D.optional(D.string), + propExtendsD: D.optional(ModelWithString), +})); +export type ModelThatExtendsExtendsType = D.Output; " `; @@ -1051,16 +1028,21 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithArray.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with one property containing an array - */ -export type ModelWithArray = { - prop?: Array; - propWithFile?: Array; - propWithNumber?: Array; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelWithArray = D.object({ + prop: D.optional(D.array(ModelWithString)), + propWithFile: D.optional(D.array(D.createDecoder({ + forceDecode: (data) => { + if (data instanceof Blob) { + return data; + } + throw new D.DecoderError('Expected Blob'); + }, + }))), + propWithNumber: D.optional(D.array(D.number)), +}); +export type ModelWithArrayType = D.Output; " `; @@ -1069,16 +1051,11 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithBoolean.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one boolean property - */ -export type ModelWithBoolean = { - /** - * This is a simple boolean property - */ - prop?: boolean; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithBoolean = D.object({ + prop: D.optional(D.boolean), +}); +export type ModelWithBooleanType = D.Output; " `; @@ -1087,13 +1064,11 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithCircularReference /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one property containing a circular reference - */ -export type ModelWithCircularReference = { - prop?: ModelWithCircularReference; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithCircularReference = D.object({ + prop: D.optional(ModelWithCircularReference), +}); +export type ModelWithCircularReferenceType = D.Output; " `; @@ -1102,13 +1077,11 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithDictionary.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one property containing a dictionary - */ -export type ModelWithDictionary = { - prop?: Record; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithDictionary = D.object({ + prop: D.optional(D.record(D.string)), +}); +export type ModelWithDictionaryType = D.Output; " `; @@ -1117,16 +1090,14 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithDuplicateImports. /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with duplicated imports - */ -export type ModelWithDuplicateImports = { - propA?: ModelWithString; - propB?: ModelWithString; - propC?: ModelWithString; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelWithDuplicateImports = D.object({ + propA: D.optional(ModelWithString), + propB: D.optional(ModelWithString), + propC: D.optional(ModelWithString), +}); +export type ModelWithDuplicateImportsType = D.Output; " `; @@ -1135,14 +1106,12 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithDuplicateProperti /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with duplicated properties - */ -export type ModelWithDuplicateProperties = { - prop?: ModelWithString; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelWithDuplicateProperties = D.object({ + prop: D.optional(ModelWithString), +}); +export type ModelWithDuplicatePropertiesType = D.Output; " `; @@ -1151,45 +1120,13 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithEnum.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one enum - */ -export type ModelWithEnum = { - /** - * This is a simple enum with strings - */ - test?: ModelWithEnum.test; - /** - * These are the HTTP error code enums - */ - statusCode?: ModelWithEnum.statusCode; - /** - * Simple boolean enum - */ - bool?: boolean; -}; -export namespace ModelWithEnum { - /** - * This is a simple enum with strings - */ - export enum test { - SUCCESS = 'Success', - WARNING = 'Warning', - ERROR = 'Error', - } - /** - * These are the HTTP error code enums - */ - export enum statusCode { - _100 = '100', - _200_FOO = '200 FOO', - _300_FOO_BAR = '300 FOO_BAR', - _400_FOO_BAR = '400 foo-bar', - _500_FOO_BAR = '500 foo.bar', - _600_FOO_BAR = '600 foo&bar', - } -} - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithEnum = D.object({ + test: D.optional(D.literalUnion('Success', 'Warning', 'Error')), + statusCode: D.optional(D.literalUnion('100', '200 FOO', '300 FOO_BAR', '400 foo-bar', '500 foo.bar', '600 foo&bar')), + bool: D.optional(D.boolean), +}); +export type ModelWithEnumType = D.Output; " `; @@ -1198,16 +1135,11 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithEnumFromDescripti /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one enum - */ -export type ModelWithEnumFromDescription = { - /** - * Success=1,Warning=2,Error=3 - */ - test?: number; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithEnumFromDescription = D.object({ + test: D.optional(D.number), +}); +export type ModelWithEnumFromDescriptionType = D.Output; " `; @@ -1216,16 +1148,11 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithInteger.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one number property - */ -export type ModelWithInteger = { - /** - * This is a simple number property - */ - prop?: number; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithInteger = D.object({ + prop: D.optional(D.number), +}); +export type ModelWithIntegerType = D.Output; " `; @@ -1234,16 +1161,14 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithNestedEnums.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with nested enums - */ -export type ModelWithNestedEnums = { - dictionaryWithEnum?: Record; - dictionaryWithEnumFromDescription?: Record; - arrayWithEnum?: Array<'Success' | 'Warning' | 'Error'>; - arrayWithDescription?: Array; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithNestedEnums = D.object({ + dictionaryWithEnum: D.optional(D.record(D.literalUnion('Success', 'Warning', 'Error'))), + dictionaryWithEnumFromDescription: D.optional(D.record(D.number)), + arrayWithEnum: D.optional(D.array(D.literalUnion('Success', 'Warning', 'Error'))), + arrayWithDescription: D.optional(D.array(D.number)), +}); +export type ModelWithNestedEnumsType = D.Output; " `; @@ -1252,17 +1177,15 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithNestedProperties. /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one nested property - */ -export type ModelWithNestedProperties = { - readonly first: { - readonly second: { - readonly third: string; - }; - }; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithNestedProperties = D.object({ + first: D.object({ + second: D.object({ + third: D.string, + }), + }), +}); +export type ModelWithNestedPropertiesType = D.Output; " `; @@ -1271,20 +1194,12 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithNullableString.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one string property - */ -export type ModelWithNullableString = { - /** - * This is a simple string property - */ - nullableProp?: string | null; - /** - * This is a simple string property - */ - nullableRequiredProp: string | null; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithNullableString = D.object({ + nullableProp: D.optional(D.nullable(D.string)), + nullableRequiredProp: D.nullable(D.string), +}); +export type ModelWithNullableStringType = D.Output; " `; @@ -1293,15 +1208,13 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithOrderedProperties /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with ordered properties - */ -export type ModelWithOrderedProperties = { - zebra?: string; - apple?: string; - hawaii?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithOrderedProperties = D.object({ + zebra: D.optional(D.string), + apple: D.optional(D.string), + hawaii: D.optional(D.string), +}); +export type ModelWithOrderedPropertiesType = D.Output; " `; @@ -1310,19 +1223,17 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithPattern.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model that contains a some patterns - */ -export type ModelWithPattern = { - key: string; - name: string; - readonly enabled?: boolean; - readonly modified?: string; - id?: string; - text?: string; - patternWithSingleQuotes?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithPattern = D.object({ + key: D.string, + name: D.string, + enabled: D.optional(D.boolean), + modified: D.optional(D.string), + id: D.optional(D.string), + text: D.optional(D.string), + patternWithSingleQuotes: D.optional(D.string), +}); +export type ModelWithPatternType = D.Output; " `; @@ -1331,24 +1242,22 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithProperties.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with one nested property - */ -export type ModelWithProperties = { - required: string; - readonly requiredAndReadOnly: string; - string?: string; - number?: number; - boolean?: boolean; - reference?: ModelWithString; - 'property with space'?: string; - default?: string; - try?: string; - readonly '@namespace.string'?: string; - readonly '@namespace.integer'?: number; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelWithProperties = D.object({ + required: D.string, + requiredAndReadOnly: D.string, + string: D.optional(D.string), + number: D.optional(D.number), + boolean: D.optional(D.boolean), + reference: D.optional(ModelWithString), + 'property with space': D.optional(D.string), + default: D.optional(D.string), + try: D.optional(D.string), + '@namespace.string': D.optional(D.string), + '@namespace.integer': D.optional(D.number), +}); +export type ModelWithPropertiesType = D.Output; " `; @@ -1357,14 +1266,12 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithReference.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithProperties } from './ModelWithProperties'; -/** - * This is a model with one property containing a reference - */ -export type ModelWithReference = { - prop?: ModelWithProperties; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithProperties } from './ModelWithProperties'; +export const ModelWithReference = D.object({ + prop: D.optional(ModelWithProperties), +}); +export type ModelWithReferenceType = D.Output; " `; @@ -1373,16 +1280,11 @@ exports[`v2 should generate: test/generated/v2/models/ModelWithString.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one string property - */ -export type ModelWithString = { - /** - * This is a simple string property - */ - prop?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithString = D.object({ + prop: D.optional(D.string), +}); +export type ModelWithStringType = D.Output; " `; @@ -1391,10 +1293,9 @@ exports[`v2 should generate: test/generated/v2/models/SimpleBoolean.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple boolean - */ -export type SimpleBoolean = boolean; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleBoolean = D.boolean; +export type SimpleBooleanType = D.Output; " `; @@ -1403,10 +1304,16 @@ exports[`v2 should generate: test/generated/v2/models/SimpleFile.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple file - */ -export type SimpleFile = Blob; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleFile = D.createDecoder({ + forceDecode: (data) => { + if (data instanceof Blob) { + return data; + } + throw new D.DecoderError('Expected Blob'); + }, +}); +export type SimpleFileType = D.Output; " `; @@ -1415,10 +1322,9 @@ exports[`v2 should generate: test/generated/v2/models/SimpleInteger.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple number - */ -export type SimpleInteger = number; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleInteger = D.number; +export type SimpleIntegerType = D.Output; " `; @@ -1427,11 +1333,10 @@ exports[`v2 should generate: test/generated/v2/models/SimpleReference.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a simple reference - */ -export type SimpleReference = ModelWithString; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const SimpleReference = ModelWithString; +export type SimpleReferenceType = D.Output; " `; @@ -1440,10 +1345,9 @@ exports[`v2 should generate: test/generated/v2/models/SimpleString.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple string - */ -export type SimpleString = string; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleString = D.string; +export type SimpleStringType = D.Output; " `; @@ -1452,10 +1356,9 @@ exports[`v2 should generate: test/generated/v2/models/SimpleStringWithPattern.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple string - */ -export type SimpleStringWithPattern = string; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleStringWithPattern = D.string; +export type SimpleStringWithPatternType = D.Output; " `; @@ -1650,6 +1553,7 @@ exports[`v2 should generate: test/generated/v2/schemas/$Date.ts 1`] = ` export const $Date = { type: 'string', description: \`This is a type-only model that defines Date as a string\`, + format: 'string', } as const; " `; @@ -2333,25 +2237,25 @@ exports[`v2 should generate: test/generated/v2/services/CollectionFormatService. /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class CollectionFormatService { - /** - * @param parameterArrayCsv This is an array parameter that is sent as csv format (comma-separated values) - * @param parameterArraySsv This is an array parameter that is sent as ssv format (space-separated values) - * @param parameterArrayTsv This is an array parameter that is sent as tsv format (tab-separated values) - * @param parameterArrayPipes This is an array parameter that is sent as pipes format (pipe-separated values) - * @param parameterArrayMulti This is an array parameter that is sent as multi format (multiple parameter instances) - * @throws ApiError - */ + private static collectionFormatDecoder = D.object({ + parameterArrayCsv: D.array(D.string), + parameterArraySsv: D.array(D.string), + parameterArrayTsv: D.array(D.string), + parameterArrayPipes: D.array(D.string), + parameterArrayMulti: D.array(D.string), + }); public static collectionFormat( - parameterArrayCsv: Array, - parameterArraySsv: Array, - parameterArrayTsv: Array, - parameterArrayPipes: Array, - parameterArrayMulti: Array, - ): CancelablePromise { + parameterArrayCsv: D.Output['parameterArrayCsv'], + parameterArraySsv: D.Output['parameterArraySsv'], + parameterArrayTsv: D.Output['parameterArrayTsv'], + parameterArrayPipes: D.Output['parameterArrayPipes'], + parameterArrayMulti: D.Output['parameterArrayMulti'], + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/collectionFormat', @@ -2373,27 +2277,26 @@ exports[`v2 should generate: test/generated/v2/services/ComplexService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class ComplexService { - /** - * @param parameterObject Parameter containing object - * @param parameterReference Parameter containing reference - * @returns ModelWithString Successful response - * @throws ApiError - */ - public static complexTypes( - parameterObject: { - first?: { - second?: { - third?: string; - }; - }; - }, + private static complexTypesDecoder = D.object({ + parameterObject: D.object({ + first: D.optional(D.object({ + second: D.optional(D.object({ + third: D.optional(D.string), + })), + })), + }), parameterReference: ModelWithString, - ): CancelablePromise> { + }); + public static complexTypes( + parameterObject: D.Output['parameterObject'], + parameterReference: D.Output['parameterReference'], + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/complex', @@ -2401,6 +2304,9 @@ export class ComplexService { 'parameterObject': parameterObject, 'parameterReference': parameterReference, }, + responseDecoders: { + 200: D.array(ModelWithString), + }, errors: { 400: \`400 server error\`, 500: \`500 server error\`, @@ -2416,14 +2322,12 @@ exports[`v2 should generate: test/generated/v2/services/DefaultService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DefaultService { - /** - * @throws ApiError - */ - public static serviceWithEmptyTag(): CancelablePromise { + public static serviceWithEmptyTag() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/no-tag', @@ -2438,28 +2342,28 @@ exports[`v2 should generate: test/generated/v2/services/DefaultsService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DefaultsService { - /** - * @param parameterString This is a simple string with default value - * @param parameterNumber This is a simple number with default value - * @param parameterBoolean This is a simple boolean with default value - * @param parameterEnum This is a simple enum with default value - * @param parameterModel This is a simple model with default value - * @throws ApiError - */ + private static callWithDefaultParametersDecoder = D.object({ + parameterString: D.string, + parameterNumber: D.number, + parameterBoolean: D.boolean, + parameterEnum: D.literalUnion('Success', 'Warning', 'Error'), + parameterModel: ModelWithString, + }); public static callWithDefaultParameters( - parameterString: string = 'Hello World!', - parameterNumber: number = 123, - parameterBoolean: boolean = true, - parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success', - parameterModel: ModelWithString = { + parameterString: D.Output['parameterString'] = 'Hello World!', + parameterNumber: D.Output['parameterNumber'] = 123, + parameterBoolean: D.Output['parameterBoolean'] = true, + parameterEnum: D.Output['parameterEnum'] = 'Success', + parameterModel: D.Output['parameterModel'] = { "prop": "Hello World!" }, - ): CancelablePromise { + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/defaults', @@ -2472,23 +2376,22 @@ export class DefaultsService { }, }); } - /** - * @param parameterString This is a simple string that is optional with default value - * @param parameterNumber This is a simple number that is optional with default value - * @param parameterBoolean This is a simple boolean that is optional with default value - * @param parameterEnum This is a simple enum that is optional with default value - * @param parameterModel This is a simple model that is optional with default value - * @throws ApiError - */ + private static callWithDefaultOptionalParametersDecoder = D.object({ + parameterString: D.string, + parameterNumber: D.number, + parameterBoolean: D.boolean, + parameterEnum: D.literalUnion('Success', 'Warning', 'Error'), + parameterModel: ModelWithString, + }); public static callWithDefaultOptionalParameters( - parameterString: string = 'Hello World!', - parameterNumber: number = 123, - parameterBoolean: boolean = true, - parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success', - parameterModel: ModelWithString = { + parameterString: D.Output['parameterString'] = 'Hello World!', + parameterNumber: D.Output['parameterNumber'] = 123, + parameterBoolean: D.Output['parameterBoolean'] = true, + parameterEnum: D.Output['parameterEnum'] = 'Success', + parameterModel: D.Output['parameterModel'] = { "prop": "Hello World!" }, - ): CancelablePromise { + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/defaults', @@ -2501,27 +2404,26 @@ export class DefaultsService { }, }); } - /** - * @param parameterStringWithNoDefault This is a string with no default - * @param parameterOptionalStringWithDefault This is a optional string with default - * @param parameterOptionalStringWithEmptyDefault This is a optional string with empty default - * @param parameterOptionalStringWithNoDefault This is a optional string with no default - * @param parameterStringWithDefault This is a string with default - * @param parameterStringWithEmptyDefault This is a string with empty default - * @param parameterStringNullableWithNoDefault This is a string that can be null with no default - * @param parameterStringNullableWithDefault This is a string that can be null with default - * @throws ApiError - */ + private static callToTestOrderOfParamsDecoder = D.object({ + parameterStringWithNoDefault: D.string, + parameterOptionalStringWithDefault: D.string, + parameterOptionalStringWithEmptyDefault: D.string, + parameterOptionalStringWithNoDefault: D.optional(D.string), + parameterStringWithDefault: D.string, + parameterStringWithEmptyDefault: D.string, + parameterStringNullableWithNoDefault: D.optional(D.nullable(D.string)), + parameterStringNullableWithDefault: D.nullable(D.string), + }); public static callToTestOrderOfParams( - parameterStringWithNoDefault: string, - parameterOptionalStringWithDefault: string = 'Hello World!', - parameterOptionalStringWithEmptyDefault: string = '', - parameterOptionalStringWithNoDefault?: string, - parameterStringWithDefault: string = 'Hello World!', - parameterStringWithEmptyDefault: string = '', - parameterStringNullableWithNoDefault?: string | null, - parameterStringNullableWithDefault: string | null = null, - ): CancelablePromise { + parameterStringWithNoDefault: D.Output['parameterStringWithNoDefault'], + parameterOptionalStringWithDefault: D.Output['parameterOptionalStringWithDefault'] = 'Hello World!', + parameterOptionalStringWithEmptyDefault: D.Output['parameterOptionalStringWithEmptyDefault'] = '', + parameterOptionalStringWithNoDefault: D.Output['parameterOptionalStringWithNoDefault'] = option.none, + parameterStringWithDefault: D.Output['parameterStringWithDefault'] = 'Hello World!', + parameterStringWithEmptyDefault: D.Output['parameterStringWithEmptyDefault'] = '', + parameterStringNullableWithNoDefault: D.Output['parameterStringNullableWithNoDefault'] = option.none, + parameterStringNullableWithDefault: D.Output['parameterStringNullableWithDefault'] = option.none, + ) { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/defaults', @@ -2546,30 +2448,27 @@ exports[`v2 should generate: test/generated/v2/services/DescriptionsService.ts 1 /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DescriptionsService { - /** - * @param parameterWithBreaks Testing multiline comments in string: First line - * Second line - * - * Fourth line - * @param parameterWithBackticks Testing backticks in string: \`backticks\` and \`\`\`multiple backticks\`\`\` should work - * @param parameterWithSlashes Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work - * @param parameterWithExpressionPlaceholders Testing expression placeholders in string: \${expression} should work - * @param parameterWithQuotes Testing quotes in string: 'single quote''' and "double quotes""" should work - * @param parameterWithReservedCharacters Testing reserved characters in string: * inline * and ** inline ** should work - * @throws ApiError - */ + private static callWithDescriptionsDecoder = D.object({ + parameterWithBreaks: D.optional(D.string), + parameterWithBackticks: D.optional(D.string), + parameterWithSlashes: D.optional(D.string), + parameterWithExpressionPlaceholders: D.optional(D.string), + parameterWithQuotes: D.optional(D.string), + parameterWithReservedCharacters: D.optional(D.string), + }); public static callWithDescriptions( - parameterWithBreaks?: string, - parameterWithBackticks?: string, - parameterWithSlashes?: string, - parameterWithExpressionPlaceholders?: string, - parameterWithQuotes?: string, - parameterWithReservedCharacters?: string, - ): CancelablePromise { + parameterWithBreaks: D.Output['parameterWithBreaks'] = option.none, + parameterWithBackticks: D.Output['parameterWithBackticks'] = option.none, + parameterWithSlashes: D.Output['parameterWithSlashes'] = option.none, + parameterWithExpressionPlaceholders: D.Output['parameterWithExpressionPlaceholders'] = option.none, + parameterWithQuotes: D.Output['parameterWithQuotes'] = option.none, + parameterWithReservedCharacters: D.Output['parameterWithReservedCharacters'] = option.none, + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/descriptions/', @@ -2592,41 +2491,30 @@ exports[`v2 should generate: test/generated/v2/services/DuplicateService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DuplicateService { - /** - * @throws ApiError - */ - public static duplicateName(): CancelablePromise { + public static duplicateName() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/duplicate', }); } - /** - * @throws ApiError - */ - public static duplicateName1(): CancelablePromise { + public static duplicateName1() { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/duplicate', }); } - /** - * @throws ApiError - */ - public static duplicateName2(): CancelablePromise { + public static duplicateName2() { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/duplicate', }); } - /** - * @throws ApiError - */ - public static duplicateName3(): CancelablePromise { + public static duplicateName3() { return __request(OpenAPI, { method: 'DELETE', url: '/api/v{api-version}/duplicate', @@ -2641,24 +2529,28 @@ exports[`v2 should generate: test/generated/v2/services/ErrorService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class ErrorService { - /** - * @param status Status code to return - * @returns any Custom message: Successful response - * @throws ApiError - */ + private static testErrorCodeDecoder = D.object({ + status: D.string, + }); public static testErrorCode( - status: string, - ): CancelablePromise { + status: D.Output['status'], + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/error', query: { 'status': status, }, + responseDecoders: { + 200: D.createDecoder({ + forceDecode: (data) => data, + }), + }, errors: { 500: \`Custom message: Internal Server Error\`, 501: \`Custom message: Not Implemented\`, @@ -2676,19 +2568,19 @@ exports[`v2 should generate: test/generated/v2/services/HeaderService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class HeaderService { - /** - * @returns string Successful response - * @throws ApiError - */ - public static callWithResultFromHeader(): CancelablePromise { + public static callWithResultFromHeader() { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/header', responseHeader: 'operation-location', + responseDecoders: { + 200: D.string, + }, errors: { 400: \`400 server error\`, 500: \`500 server error\`, @@ -2704,28 +2596,27 @@ exports[`v2 should generate: test/generated/v2/services/MultipleTags1Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class MultipleTags1Service { - /** - * @returns void - * @throws ApiError - */ - public static dummyA(): CancelablePromise { + public static dummyA() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/a', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } - /** - * @returns void - * @throws ApiError - */ - public static dummyB(): CancelablePromise { + public static dummyB() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } } @@ -2737,28 +2628,27 @@ exports[`v2 should generate: test/generated/v2/services/MultipleTags2Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class MultipleTags2Service { - /** - * @returns void - * @throws ApiError - */ - public static dummyA(): CancelablePromise { + public static dummyA() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/a', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } - /** - * @returns void - * @throws ApiError - */ - public static dummyB(): CancelablePromise { + public static dummyB() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } } @@ -2770,18 +2660,18 @@ exports[`v2 should generate: test/generated/v2/services/MultipleTags3Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class MultipleTags3Service { - /** - * @returns void - * @throws ApiError - */ - public static dummyB(): CancelablePromise { + public static dummyB() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } } @@ -2793,18 +2683,18 @@ exports[`v2 should generate: test/generated/v2/services/NoContentService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class NoContentService { - /** - * @returns void - * @throws ApiError - */ - public static callWithNoContentResponse(): CancelablePromise { + public static callWithNoContentResponse() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/no-content', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } } @@ -2816,25 +2706,25 @@ exports[`v2 should generate: test/generated/v2/services/ParametersService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class ParametersService { - /** - * @param parameterHeader This is the parameter that goes into the header - * @param parameterQuery This is the parameter that goes into the query params - * @param parameterForm This is the parameter that goes into the form data - * @param parameterBody This is the parameter that is sent as request body - * @param parameterPath This is the parameter that goes into the path - * @throws ApiError - */ + private static callWithParametersDecoder = D.object({ + parameterHeader: D.string, + parameterQuery: D.string, + parameterForm: D.string, + parameterBody: D.string, + parameterPath: D.string, + }); public static callWithParameters( - parameterHeader: string, - parameterQuery: string, - parameterForm: string, - parameterBody: string, - parameterPath: string, - ): CancelablePromise { + parameterHeader: D.Output['parameterHeader'], + parameterQuery: D.Output['parameterQuery'], + parameterForm: D.Output['parameterForm'], + parameterBody: D.Output['parameterBody'], + parameterPath: D.Output['parameterPath'], + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/parameters/{parameterPath}', @@ -2853,27 +2743,26 @@ export class ParametersService { body: parameterBody, }); } - /** - * @param parameterHeader This is the parameter that goes into the request header - * @param parameterQuery This is the parameter that goes into the request query params - * @param parameterForm This is the parameter that goes into the request form data - * @param parameterBody This is the parameter that is sent as request body - * @param parameterPath1 This is the parameter that goes into the path - * @param parameterPath2 This is the parameter that goes into the path - * @param parameterPath3 This is the parameter that goes into the path - * @param _default This is the parameter with a reserved keyword - * @throws ApiError - */ + private static callWithWeirdParameterNamesDecoder = D.object({ + parameterHeader: D.string, + parameterQuery: D.string, + parameterForm: D.string, + parameterBody: D.string, + parameterPath1: D.optional(D.string), + parameterPath2: D.optional(D.string), + parameterPath3: D.optional(D.string), + _default: D.optional(D.string), + }); public static callWithWeirdParameterNames( - parameterHeader: string, - parameterQuery: string, - parameterForm: string, - parameterBody: string, - parameterPath1?: string, - parameterPath2?: string, - parameterPath3?: string, - _default?: string, - ): CancelablePromise { + parameterHeader: D.Output['parameterHeader'], + parameterQuery: D.Output['parameterQuery'], + parameterForm: D.Output['parameterForm'], + parameterBody: D.Output['parameterBody'], + parameterPath1: D.Output['parameterPath1'] = option.none, + parameterPath2: D.Output['parameterPath2'] = option.none, + parameterPath3: D.Output['parameterPath3'] = option.none, + _default: D.Output['_default'] = option.none, + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', @@ -2904,31 +2793,30 @@ exports[`v2 should generate: test/generated/v2/services/ResponseService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelThatExtends } from '../models/ModelThatExtends'; -import type { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends'; -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelThatExtends } from '../models/ModelThatExtends'; +import { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class ResponseService { - /** - * @returns ModelWithString Message for default response - * @throws ApiError - */ - public static callWithResponse(): CancelablePromise { + public static callWithResponse() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/response', + responseDecoders: { + 0: ModelWithString, + }, }); } - /** - * @returns ModelWithString Message for default response - * @throws ApiError - */ - public static callWithDuplicateResponses(): CancelablePromise { + public static callWithDuplicateResponses() { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/response', + responseDecoders: { + 0: ModelWithString, + }, errors: { 500: \`Message for 500 error\`, 501: \`Message for 501 error\`, @@ -2936,21 +2824,20 @@ export class ResponseService { }, }); } - /** - * @returns any Message for 200 response - * @returns ModelWithString Message for default response - * @returns ModelThatExtends Message for 201 response - * @returns ModelThatExtendsExtends Message for 202 response - * @throws ApiError - */ - public static callWithResponses(): CancelablePromise<{ - readonly '@namespace.string'?: string; - readonly '@namespace.integer'?: number; - readonly value?: Array; - } | ModelWithString | ModelThatExtends | ModelThatExtendsExtends> { + public static callWithResponses() { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/response', + responseDecoders: { + 0: ModelWithString, + 200: D.object({ + '@namespace.string': D.optional(D.string), + '@namespace.integer': D.optional(D.number), + value: D.optional(D.array(ModelWithString)), + }), + 201: ModelThatExtends, + 202: ModelThatExtendsExtends, + }, errors: { 500: \`Message for 500 error\`, 501: \`Message for 501 error\`, @@ -2967,68 +2854,48 @@ exports[`v2 should generate: test/generated/v2/services/SimpleService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class SimpleService { - /** - * @throws ApiError - */ - public static getCallWithoutParametersAndResponse(): CancelablePromise { + public static getCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static putCallWithoutParametersAndResponse(): CancelablePromise { + public static putCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static postCallWithoutParametersAndResponse(): CancelablePromise { + public static postCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static deleteCallWithoutParametersAndResponse(): CancelablePromise { + public static deleteCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'DELETE', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static optionsCallWithoutParametersAndResponse(): CancelablePromise { + public static optionsCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'OPTIONS', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static headCallWithoutParametersAndResponse(): CancelablePromise { + public static headCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'HEAD', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static patchCallWithoutParametersAndResponse(): CancelablePromise { + public static patchCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'PATCH', url: '/api/v{api-version}/simple', @@ -3043,35 +2910,33 @@ exports[`v2 should generate: test/generated/v2/services/TypesService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class TypesService { - /** - * @param parameterArray This is an array parameter - * @param parameterDictionary This is a dictionary parameter - * @param parameterEnum This is an enum parameter - * @param parameterNumber This is a number parameter - * @param parameterString This is a string parameter - * @param parameterBoolean This is a boolean parameter - * @param parameterObject This is an object parameter - * @param id This is a number parameter - * @returns number Response is a simple number - * @returns string Response is a simple string - * @returns boolean Response is a simple boolean - * @returns any Response is a simple object - * @throws ApiError - */ + private static typesDecoder = D.object({ + parameterArray: D.array(D.string), + parameterDictionary: D.record(D.string), + parameterEnum: D.literalUnion('Success', 'Warning', 'Error'), + parameterNumber: D.number, + parameterString: D.string, + parameterBoolean: D.boolean, + parameterObject: D.createDecoder({ + forceDecode: (data) => data, + }), + id: D.optional(D.number), + }); public static types( - parameterArray: Array, - parameterDictionary: Record, - parameterEnum: 'Success' | 'Warning' | 'Error', - parameterNumber: number = 123, - parameterString: string = 'default', - parameterBoolean: boolean = true, - parameterObject: any = null, - id?: number, - ): CancelablePromise { + parameterArray: D.Output['parameterArray'], + parameterDictionary: D.Output['parameterDictionary'], + parameterEnum: D.Output['parameterEnum'], + parameterNumber: D.Output['parameterNumber'] = 123, + parameterString: D.Output['parameterString'] = 'default', + parameterBoolean: D.Output['parameterBoolean'] = true, + parameterObject: D.Output['parameterObject'] = option.none, + id: D.Output['id'] = option.none, + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/types', @@ -3087,6 +2952,14 @@ export class TypesService { 'parameterDictionary': parameterDictionary, 'parameterEnum': parameterEnum, }, + responseDecoders: { + 200: D.number, + 201: D.string, + 202: D.boolean, + 203: D.createDecoder({ + forceDecode: (data) => data, + }), + }, }); } } @@ -3100,15 +2973,16 @@ exports[`v3 should generate: test/generated/v3/core/ApiError.ts 1`] = ` /* eslint-disable */ import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; +import type * as D from '@majkit/fp-ts-schema'; -export class ApiError extends Error { +export class ApiError>> extends Error { public readonly url: string; public readonly status: number; public readonly statusText: string; public readonly body: any; - public readonly request: ApiRequestOptions; + public readonly request: ApiRequestOptions; - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { super(message); this.name = 'ApiError'; @@ -3127,7 +3001,16 @@ exports[`v3 should generate: test/generated/v3/core/ApiRequestOptions.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type ApiRequestOptions = { +import type * as D from '@majkit/fp-ts-schema'; + +export type ApiResponse>> = { + [key in keyof T]: { + readonly status: key; + readonly body: key extends number ? D.Output : never; + }; +}[keyof T]; + +export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; readonly path?: Record; @@ -3137,6 +3020,7 @@ export type ApiRequestOptions = { readonly formData?: Record; readonly body?: any; readonly mediaType?: string; + readonly responseDecoders?: T; readonly responseHeader?: string; readonly errors?: Record; }; @@ -3299,8 +3183,9 @@ exports[`v3 should generate: test/generated/v3/core/OpenAPI.ts 1`] = ` /* tslint:disable */ /* eslint-disable */ import type { ApiRequestOptions } from './ApiRequestOptions'; +import type * as D from '@majkit/fp-ts-schema'; -type Resolver = (options: ApiRequestOptions) => Promise; +type Resolver = (options: ApiRequestOptions>>) => Promise; type Headers = Record; export type OpenAPIConfig = { @@ -3335,11 +3220,14 @@ exports[`v3 should generate: test/generated/v3/core/request.ts 1`] = ` /* tslint:disable */ /* eslint-disable */ import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import { CancelablePromise } from './CancelablePromise'; import type { OnCancel } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; +import type * as D from '@majkit/fp-ts-schema'; +import { either } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; export const isDefined = (value: T | null | undefined): value is Exclude => { return value !== undefined && value !== null; @@ -3612,17 +3500,42 @@ export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): ); } }; +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(value => convertRequestBody(value)); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service - * @returns CancelablePromise - * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { return new CancelablePromise(async (resolve, reject, onCancel) => { try { + options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); @@ -3643,10 +3556,10 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C catchErrorCodes(options, result); - resolve(result.body); + resolve(options.responseDecoders[response.status].decode(result.body)); } } catch (error) { - reject(error); + resolve(either.left(error as ApiError)); } }); }; @@ -3663,75 +3576,75 @@ export { CancelablePromise, CancelError } from './core/CancelablePromise'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; -export type { _default } from './models/_default'; -export type { ArrayWithArray } from './models/ArrayWithArray'; -export type { ArrayWithBooleans } from './models/ArrayWithBooleans'; -export type { ArrayWithNumbers } from './models/ArrayWithNumbers'; -export type { ArrayWithProperties } from './models/ArrayWithProperties'; -export type { ArrayWithReferences } from './models/ArrayWithReferences'; -export type { ArrayWithStrings } from './models/ArrayWithStrings'; -export type { CommentWithBackticks } from './models/CommentWithBackticks'; -export type { CommentWithBreaks } from './models/CommentWithBreaks'; -export type { CommentWithExpressionPlaceholders } from './models/CommentWithExpressionPlaceholders'; -export type { CommentWithQuotes } from './models/CommentWithQuotes'; -export type { CommentWithReservedCharacters } from './models/CommentWithReservedCharacters'; -export type { CommentWithSlashes } from './models/CommentWithSlashes'; -export type { CompositionBaseModel } from './models/CompositionBaseModel'; -export type { CompositionExtendedModel } from './models/CompositionExtendedModel'; -export type { CompositionWithAllOfAndNullable } from './models/CompositionWithAllOfAndNullable'; -export type { CompositionWithAnyOf } from './models/CompositionWithAnyOf'; -export type { CompositionWithAnyOfAndNullable } from './models/CompositionWithAnyOfAndNullable'; -export type { CompositionWithAnyOfAnonymous } from './models/CompositionWithAnyOfAnonymous'; -export type { CompositionWithOneOf } from './models/CompositionWithOneOf'; -export type { CompositionWithOneOfAndComplexArrayDictionary } from './models/CompositionWithOneOfAndComplexArrayDictionary'; -export type { CompositionWithOneOfAndNullable } from './models/CompositionWithOneOfAndNullable'; -export type { CompositionWithOneOfAndSimpleArrayDictionary } from './models/CompositionWithOneOfAndSimpleArrayDictionary'; -export type { CompositionWithOneOfAndSimpleDictionary } from './models/CompositionWithOneOfAndSimpleDictionary'; -export type { CompositionWithOneOfAnonymous } from './models/CompositionWithOneOfAnonymous'; -export type { CompositionWithOneOfDiscriminator } from './models/CompositionWithOneOfDiscriminator'; -export type { DeprecatedModel } from './models/DeprecatedModel'; -export type { DictionaryWithArray } from './models/DictionaryWithArray'; -export type { DictionaryWithDictionary } from './models/DictionaryWithDictionary'; -export type { DictionaryWithProperties } from './models/DictionaryWithProperties'; -export type { DictionaryWithReference } from './models/DictionaryWithReference'; -export type { DictionaryWithString } from './models/DictionaryWithString'; -export type { EnumFromDescription } from './models/EnumFromDescription'; -export { EnumWithExtensions } from './models/EnumWithExtensions'; -export { EnumWithNumbers } from './models/EnumWithNumbers'; -export { EnumWithStrings } from './models/EnumWithStrings'; -export type { File } from './models/File'; -export type { FreeFormObjectWithAdditionalPropertiesEqEmptyObject } from './models/FreeFormObjectWithAdditionalPropertiesEqEmptyObject'; -export type { FreeFormObjectWithAdditionalPropertiesEqTrue } from './models/FreeFormObjectWithAdditionalPropertiesEqTrue'; -export type { FreeFormObjectWithoutAdditionalProperties } from './models/FreeFormObjectWithoutAdditionalProperties'; -export type { ModelCircle } from './models/ModelCircle'; -export type { ModelSquare } from './models/ModelSquare'; -export type { ModelThatExtends } from './models/ModelThatExtends'; -export type { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; -export type { ModelWithArray } from './models/ModelWithArray'; -export type { ModelWithBoolean } from './models/ModelWithBoolean'; -export type { ModelWithCircularReference } from './models/ModelWithCircularReference'; -export type { ModelWithDictionary } from './models/ModelWithDictionary'; -export type { ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; -export type { ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; -export { ModelWithEnum } from './models/ModelWithEnum'; -export type { ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; -export type { ModelWithInteger } from './models/ModelWithInteger'; -export type { ModelWithNestedEnums } from './models/ModelWithNestedEnums'; -export type { ModelWithNestedProperties } from './models/ModelWithNestedProperties'; -export type { ModelWithNullableString } from './models/ModelWithNullableString'; -export type { ModelWithOrderedProperties } from './models/ModelWithOrderedProperties'; -export type { ModelWithPattern } from './models/ModelWithPattern'; -export type { ModelWithProperties } from './models/ModelWithProperties'; -export type { ModelWithReference } from './models/ModelWithReference'; -export type { ModelWithString } from './models/ModelWithString'; -export type { Pageable } from './models/Pageable'; -export type { SimpleBoolean } from './models/SimpleBoolean'; -export type { SimpleFile } from './models/SimpleFile'; -export type { SimpleInteger } from './models/SimpleInteger'; -export type { SimpleParameter } from './models/SimpleParameter'; -export type { SimpleReference } from './models/SimpleReference'; -export type { SimpleString } from './models/SimpleString'; -export type { SimpleStringWithPattern } from './models/SimpleStringWithPattern'; +export type { _defaultType as _default } from './models/_default'; +export type { ArrayWithArrayType as ArrayWithArray } from './models/ArrayWithArray'; +export type { ArrayWithBooleansType as ArrayWithBooleans } from './models/ArrayWithBooleans'; +export type { ArrayWithNumbersType as ArrayWithNumbers } from './models/ArrayWithNumbers'; +export type { ArrayWithPropertiesType as ArrayWithProperties } from './models/ArrayWithProperties'; +export type { ArrayWithReferencesType as ArrayWithReferences } from './models/ArrayWithReferences'; +export type { ArrayWithStringsType as ArrayWithStrings } from './models/ArrayWithStrings'; +export type { CommentWithBackticksType as CommentWithBackticks } from './models/CommentWithBackticks'; +export type { CommentWithBreaksType as CommentWithBreaks } from './models/CommentWithBreaks'; +export type { CommentWithExpressionPlaceholdersType as CommentWithExpressionPlaceholders } from './models/CommentWithExpressionPlaceholders'; +export type { CommentWithQuotesType as CommentWithQuotes } from './models/CommentWithQuotes'; +export type { CommentWithReservedCharactersType as CommentWithReservedCharacters } from './models/CommentWithReservedCharacters'; +export type { CommentWithSlashesType as CommentWithSlashes } from './models/CommentWithSlashes'; +export type { CompositionBaseModelType as CompositionBaseModel } from './models/CompositionBaseModel'; +export type { CompositionExtendedModelType as CompositionExtendedModel } from './models/CompositionExtendedModel'; +export type { CompositionWithAllOfAndNullableType as CompositionWithAllOfAndNullable } from './models/CompositionWithAllOfAndNullable'; +export type { CompositionWithAnyOfType as CompositionWithAnyOf } from './models/CompositionWithAnyOf'; +export type { CompositionWithAnyOfAndNullableType as CompositionWithAnyOfAndNullable } from './models/CompositionWithAnyOfAndNullable'; +export type { CompositionWithAnyOfAnonymousType as CompositionWithAnyOfAnonymous } from './models/CompositionWithAnyOfAnonymous'; +export type { CompositionWithOneOfType as CompositionWithOneOf } from './models/CompositionWithOneOf'; +export type { CompositionWithOneOfAndComplexArrayDictionaryType as CompositionWithOneOfAndComplexArrayDictionary } from './models/CompositionWithOneOfAndComplexArrayDictionary'; +export type { CompositionWithOneOfAndNullableType as CompositionWithOneOfAndNullable } from './models/CompositionWithOneOfAndNullable'; +export type { CompositionWithOneOfAndSimpleArrayDictionaryType as CompositionWithOneOfAndSimpleArrayDictionary } from './models/CompositionWithOneOfAndSimpleArrayDictionary'; +export type { CompositionWithOneOfAndSimpleDictionaryType as CompositionWithOneOfAndSimpleDictionary } from './models/CompositionWithOneOfAndSimpleDictionary'; +export type { CompositionWithOneOfAnonymousType as CompositionWithOneOfAnonymous } from './models/CompositionWithOneOfAnonymous'; +export type { CompositionWithOneOfDiscriminatorType as CompositionWithOneOfDiscriminator } from './models/CompositionWithOneOfDiscriminator'; +export type { DeprecatedModelType as DeprecatedModel } from './models/DeprecatedModel'; +export type { DictionaryWithArrayType as DictionaryWithArray } from './models/DictionaryWithArray'; +export type { DictionaryWithDictionaryType as DictionaryWithDictionary } from './models/DictionaryWithDictionary'; +export type { DictionaryWithPropertiesType as DictionaryWithProperties } from './models/DictionaryWithProperties'; +export type { DictionaryWithReferenceType as DictionaryWithReference } from './models/DictionaryWithReference'; +export type { DictionaryWithStringType as DictionaryWithString } from './models/DictionaryWithString'; +export type { EnumFromDescriptionType as EnumFromDescription } from './models/EnumFromDescription'; +export type { EnumWithExtensionsType as EnumWithExtensions } from './models/EnumWithExtensions'; +export type { EnumWithNumbersType as EnumWithNumbers } from './models/EnumWithNumbers'; +export type { EnumWithStringsType as EnumWithStrings } from './models/EnumWithStrings'; +export type { FileType as File } from './models/File'; +export type { FreeFormObjectWithAdditionalPropertiesEqEmptyObjectType as FreeFormObjectWithAdditionalPropertiesEqEmptyObject } from './models/FreeFormObjectWithAdditionalPropertiesEqEmptyObject'; +export type { FreeFormObjectWithAdditionalPropertiesEqTrueType as FreeFormObjectWithAdditionalPropertiesEqTrue } from './models/FreeFormObjectWithAdditionalPropertiesEqTrue'; +export type { FreeFormObjectWithoutAdditionalPropertiesType as FreeFormObjectWithoutAdditionalProperties } from './models/FreeFormObjectWithoutAdditionalProperties'; +export type { ModelCircleType as ModelCircle } from './models/ModelCircle'; +export type { ModelSquareType as ModelSquare } from './models/ModelSquare'; +export type { ModelThatExtendsType as ModelThatExtends } from './models/ModelThatExtends'; +export type { ModelThatExtendsExtendsType as ModelThatExtendsExtends } from './models/ModelThatExtendsExtends'; +export type { ModelWithArrayType as ModelWithArray } from './models/ModelWithArray'; +export type { ModelWithBooleanType as ModelWithBoolean } from './models/ModelWithBoolean'; +export type { ModelWithCircularReferenceType as ModelWithCircularReference } from './models/ModelWithCircularReference'; +export type { ModelWithDictionaryType as ModelWithDictionary } from './models/ModelWithDictionary'; +export type { ModelWithDuplicateImportsType as ModelWithDuplicateImports } from './models/ModelWithDuplicateImports'; +export type { ModelWithDuplicatePropertiesType as ModelWithDuplicateProperties } from './models/ModelWithDuplicateProperties'; +export type { ModelWithEnumType as ModelWithEnum } from './models/ModelWithEnum'; +export type { ModelWithEnumFromDescriptionType as ModelWithEnumFromDescription } from './models/ModelWithEnumFromDescription'; +export type { ModelWithIntegerType as ModelWithInteger } from './models/ModelWithInteger'; +export type { ModelWithNestedEnumsType as ModelWithNestedEnums } from './models/ModelWithNestedEnums'; +export type { ModelWithNestedPropertiesType as ModelWithNestedProperties } from './models/ModelWithNestedProperties'; +export type { ModelWithNullableStringType as ModelWithNullableString } from './models/ModelWithNullableString'; +export type { ModelWithOrderedPropertiesType as ModelWithOrderedProperties } from './models/ModelWithOrderedProperties'; +export type { ModelWithPatternType as ModelWithPattern } from './models/ModelWithPattern'; +export type { ModelWithPropertiesType as ModelWithProperties } from './models/ModelWithProperties'; +export type { ModelWithReferenceType as ModelWithReference } from './models/ModelWithReference'; +export type { ModelWithStringType as ModelWithString } from './models/ModelWithString'; +export type { PageableType as Pageable } from './models/Pageable'; +export type { SimpleBooleanType as SimpleBoolean } from './models/SimpleBoolean'; +export type { SimpleFileType as SimpleFile } from './models/SimpleFile'; +export type { SimpleIntegerType as SimpleInteger } from './models/SimpleInteger'; +export type { SimpleParameterType as SimpleParameter } from './models/SimpleParameter'; +export type { SimpleReferenceType as SimpleReference } from './models/SimpleReference'; +export type { SimpleStringType as SimpleString } from './models/SimpleString'; +export type { SimpleStringWithPatternType as SimpleStringWithPattern } from './models/SimpleStringWithPattern'; export { $_default } from './schemas/$_default'; export { $ArrayWithArray } from './schemas/$ArrayWithArray'; @@ -3832,10 +3745,11 @@ exports[`v3 should generate: test/generated/v3/models/_default.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type _default = { - name?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const _default = D.object({ + name: D.optional(D.string), +}); +export type _defaultType = D.Output; " `; @@ -3844,11 +3758,10 @@ exports[`v3 should generate: test/generated/v3/models/ArrayWithArray.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a simple array containing an array - */ -export type ArrayWithArray = Array>; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ArrayWithArray = D.array(D.array(ModelWithString)); +export type ArrayWithArrayType = D.Output; " `; @@ -3857,10 +3770,9 @@ exports[`v3 should generate: test/generated/v3/models/ArrayWithBooleans.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple array with booleans - */ -export type ArrayWithBooleans = Array; +import * as D from '@majkit/fp-ts-schema'; +export const ArrayWithBooleans = D.array(D.boolean); +export type ArrayWithBooleansType = D.Output; " `; @@ -3869,10 +3781,9 @@ exports[`v3 should generate: test/generated/v3/models/ArrayWithNumbers.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple array with numbers - */ -export type ArrayWithNumbers = Array; +import * as D from '@majkit/fp-ts-schema'; +export const ArrayWithNumbers = D.array(D.number); +export type ArrayWithNumbersType = D.Output; " `; @@ -3881,13 +3792,12 @@ exports[`v3 should generate: test/generated/v3/models/ArrayWithProperties.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple array with properties - */ -export type ArrayWithProperties = Array<{ - foo?: string; - bar?: string; -}>; +import * as D from '@majkit/fp-ts-schema'; +export const ArrayWithProperties = D.array(D.object({ + foo: D.optional(D.string), + bar: D.optional(D.string), +})); +export type ArrayWithPropertiesType = D.Output; " `; @@ -3896,11 +3806,10 @@ exports[`v3 should generate: test/generated/v3/models/ArrayWithReferences.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a simple array with references - */ -export type ArrayWithReferences = Array; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ArrayWithReferences = D.array(ModelWithString); +export type ArrayWithReferencesType = D.Output; " `; @@ -3909,10 +3818,9 @@ exports[`v3 should generate: test/generated/v3/models/ArrayWithStrings.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple array with strings - */ -export type ArrayWithStrings = Array; +import * as D from '@majkit/fp-ts-schema'; +export const ArrayWithStrings = D.array(D.string); +export type ArrayWithStringsType = D.Output; " `; @@ -3921,10 +3829,9 @@ exports[`v3 should generate: test/generated/v3/models/CommentWithBackticks.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing backticks in string: \`backticks\` and \`\`\`multiple backticks\`\`\` should work - */ -export type CommentWithBackticks = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithBackticks = D.number; +export type CommentWithBackticksType = D.Output; " `; @@ -3933,13 +3840,9 @@ exports[`v3 should generate: test/generated/v3/models/CommentWithBreaks.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing multiline comments in string: First line - * Second line - * - * Fourth line - */ -export type CommentWithBreaks = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithBreaks = D.number; +export type CommentWithBreaksType = D.Output; " `; @@ -3948,10 +3851,9 @@ exports[`v3 should generate: test/generated/v3/models/CommentWithExpressionPlace /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing expression placeholders in string: \${expression} should work - */ -export type CommentWithExpressionPlaceholders = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithExpressionPlaceholders = D.number; +export type CommentWithExpressionPlaceholdersType = D.Output; " `; @@ -3960,10 +3862,9 @@ exports[`v3 should generate: test/generated/v3/models/CommentWithQuotes.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing quotes in string: 'single quote''' and "double quotes""" should work - */ -export type CommentWithQuotes = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithQuotes = D.number; +export type CommentWithQuotesType = D.Output; " `; @@ -3972,10 +3873,9 @@ exports[`v3 should generate: test/generated/v3/models/CommentWithReservedCharact /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing reserved characters in string: * inline * and ** inline ** should work - */ -export type CommentWithReservedCharacters = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithReservedCharacters = D.number; +export type CommentWithReservedCharactersType = D.Output; " `; @@ -3984,10 +3884,9 @@ exports[`v3 should generate: test/generated/v3/models/CommentWithSlashes.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work - */ -export type CommentWithSlashes = number; +import * as D from '@majkit/fp-ts-schema'; +export const CommentWithSlashes = D.number; +export type CommentWithSlashesType = D.Output; " `; @@ -3996,14 +3895,12 @@ exports[`v3 should generate: test/generated/v3/models/CompositionBaseModel.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a base model with two simple optional properties - */ -export type CompositionBaseModel = { - firstName?: string; - lastname?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const CompositionBaseModel = D.object({ + firstName: D.optional(D.string), + lastname: D.optional(D.string), +}); +export type CompositionBaseModelType = D.Output; " `; @@ -4012,16 +3909,14 @@ exports[`v3 should generate: test/generated/v3/models/CompositionExtendedModel.t /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CompositionBaseModel } from './CompositionBaseModel'; -/** - * This is a model that extends the base model - */ -export type CompositionExtendedModel = (CompositionBaseModel & { - firstName: string; - lastname: string; - age: number; -}); - +import * as D from '@majkit/fp-ts-schema'; +import { CompositionBaseModel } from './CompositionBaseModel'; +export const CompositionExtendedModel = D.allOf(CompositionBaseModel, D.object({ + firstName: D.string, + lastname: D.string, + age: D.number, +})); +export type CompositionExtendedModelType = D.Output; " `; @@ -4030,18 +3925,16 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithAllOfAndNul /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithArray } from './ModelWithArray'; -import type { ModelWithDictionary } from './ModelWithDictionary'; -import type { ModelWithEnum } from './ModelWithEnum'; -/** - * This is a model with one property with a 'all of' relationship - */ -export type CompositionWithAllOfAndNullable = { - propA?: ({ - boolean?: boolean; - } & ModelWithEnum & ModelWithArray & ModelWithDictionary) | null; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithArray } from './ModelWithArray'; +import { ModelWithDictionary } from './ModelWithDictionary'; +import { ModelWithEnum } from './ModelWithEnum'; +export const CompositionWithAllOfAndNullable = D.object({ + propA: D.optional(D.nullable(D.allOf(D.object({ + boolean: D.optional(D.boolean), + }), ModelWithEnum, ModelWithArray, ModelWithDictionary))), +}); +export type CompositionWithAllOfAndNullableType = D.Output; " `; @@ -4050,17 +3943,15 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithAnyOf.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithArray } from './ModelWithArray'; -import type { ModelWithDictionary } from './ModelWithDictionary'; -import type { ModelWithEnum } from './ModelWithEnum'; -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with one property with a 'any of' relationship - */ -export type CompositionWithAnyOf = { - propA?: (ModelWithString | ModelWithEnum | ModelWithArray | ModelWithDictionary); -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithArray } from './ModelWithArray'; +import { ModelWithDictionary } from './ModelWithDictionary'; +import { ModelWithEnum } from './ModelWithEnum'; +import { ModelWithString } from './ModelWithString'; +export const CompositionWithAnyOf = D.object({ + propA: D.optional(D.oneOf(ModelWithString, ModelWithEnum, ModelWithArray, ModelWithDictionary)), +}); +export type CompositionWithAnyOfType = D.Output; " `; @@ -4069,18 +3960,16 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithAnyOfAndNul /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithArray } from './ModelWithArray'; -import type { ModelWithDictionary } from './ModelWithDictionary'; -import type { ModelWithEnum } from './ModelWithEnum'; -/** - * This is a model with one property with a 'any of' relationship - */ -export type CompositionWithAnyOfAndNullable = { - propA?: ({ - boolean?: boolean; - } | ModelWithEnum | ModelWithArray | ModelWithDictionary) | null; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithArray } from './ModelWithArray'; +import { ModelWithDictionary } from './ModelWithDictionary'; +import { ModelWithEnum } from './ModelWithEnum'; +export const CompositionWithAnyOfAndNullable = D.object({ + propA: D.optional(D.nullable(D.oneOf(D.object({ + boolean: D.optional(D.boolean), + }), ModelWithEnum, ModelWithArray, ModelWithDictionary))), +}); +export type CompositionWithAnyOfAndNullableType = D.Output; " `; @@ -4089,15 +3978,13 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithAnyOfAnonym /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one property with a 'any of' relationship where the options are not $ref - */ -export type CompositionWithAnyOfAnonymous = { - propA?: ({ - propA?: string; - } | string | number); -}; - +import * as D from '@majkit/fp-ts-schema'; +export const CompositionWithAnyOfAnonymous = D.object({ + propA: D.optional(D.oneOf(D.object({ + propA: D.optional(D.string), + }), D.string, D.number)), +}); +export type CompositionWithAnyOfAnonymousType = D.Output; " `; @@ -4106,17 +3993,15 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOf.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithArray } from './ModelWithArray'; -import type { ModelWithDictionary } from './ModelWithDictionary'; -import type { ModelWithEnum } from './ModelWithEnum'; -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with one property with a 'one of' relationship - */ -export type CompositionWithOneOf = { - propA?: (ModelWithString | ModelWithEnum | ModelWithArray | ModelWithDictionary); -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithArray } from './ModelWithArray'; +import { ModelWithDictionary } from './ModelWithDictionary'; +import { ModelWithEnum } from './ModelWithEnum'; +import { ModelWithString } from './ModelWithString'; +export const CompositionWithOneOf = D.object({ + propA: D.optional(D.oneOf(ModelWithString, ModelWithEnum, ModelWithArray, ModelWithDictionary)), +}); +export type CompositionWithOneOfType = D.Output; " `; @@ -4125,13 +4010,11 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAndCom /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model that contains a dictionary of complex arrays (composited) within composition - */ -export type CompositionWithOneOfAndComplexArrayDictionary = { - propA?: (boolean | Record>); -}; - +import * as D from '@majkit/fp-ts-schema'; +export const CompositionWithOneOfAndComplexArrayDictionary = D.object({ + propA: D.optional(D.oneOf(D.boolean, D.record(D.array(D.oneOf(D.number, D.string))))), +}); +export type CompositionWithOneOfAndComplexArrayDictionaryType = D.Output; " `; @@ -4140,18 +4023,16 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAndNul /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithArray } from './ModelWithArray'; -import type { ModelWithDictionary } from './ModelWithDictionary'; -import type { ModelWithEnum } from './ModelWithEnum'; -/** - * This is a model with one property with a 'one of' relationship - */ -export type CompositionWithOneOfAndNullable = { - propA?: ({ - boolean?: boolean; - } | ModelWithEnum | ModelWithArray | ModelWithDictionary) | null; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithArray } from './ModelWithArray'; +import { ModelWithDictionary } from './ModelWithDictionary'; +import { ModelWithEnum } from './ModelWithEnum'; +export const CompositionWithOneOfAndNullable = D.object({ + propA: D.optional(D.nullable(D.oneOf(D.object({ + boolean: D.optional(D.boolean), + }), ModelWithEnum, ModelWithArray, ModelWithDictionary))), +}); +export type CompositionWithOneOfAndNullableType = D.Output; " `; @@ -4160,13 +4041,11 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAndSim /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model that contains a dictionary of simple arrays within composition - */ -export type CompositionWithOneOfAndSimpleArrayDictionary = { - propA?: (boolean | Record>); -}; - +import * as D from '@majkit/fp-ts-schema'; +export const CompositionWithOneOfAndSimpleArrayDictionary = D.object({ + propA: D.optional(D.oneOf(D.boolean, D.record(D.array(D.boolean)))), +}); +export type CompositionWithOneOfAndSimpleArrayDictionaryType = D.Output; " `; @@ -4175,13 +4054,11 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAndSim /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model that contains a simple dictionary within composition - */ -export type CompositionWithOneOfAndSimpleDictionary = { - propA?: (boolean | Record); -}; - +import * as D from '@majkit/fp-ts-schema'; +export const CompositionWithOneOfAndSimpleDictionary = D.object({ + propA: D.optional(D.oneOf(D.boolean, D.record(D.number))), +}); +export type CompositionWithOneOfAndSimpleDictionaryType = D.Output; " `; @@ -4190,15 +4067,13 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfAnonym /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one property with a 'one of' relationship where the options are not $ref - */ -export type CompositionWithOneOfAnonymous = { - propA?: ({ - propA?: string; - } | string | number); -}; - +import * as D from '@majkit/fp-ts-schema'; +export const CompositionWithOneOfAnonymous = D.object({ + propA: D.optional(D.oneOf(D.object({ + propA: D.optional(D.string), + }), D.string, D.number)), +}); +export type CompositionWithOneOfAnonymousType = D.Output; " `; @@ -4207,13 +4082,11 @@ exports[`v3 should generate: test/generated/v3/models/CompositionWithOneOfDiscri /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelCircle } from './ModelCircle'; -import type { ModelSquare } from './ModelSquare'; -/** - * This is a model with one property with a 'one of' relationship where the options are not $ref - */ -export type CompositionWithOneOfDiscriminator = (ModelCircle | ModelSquare); - +import * as D from '@majkit/fp-ts-schema'; +import { ModelCircle } from './ModelCircle'; +import { ModelSquare } from './ModelSquare'; +export const CompositionWithOneOfDiscriminator = D.oneOf(ModelCircle, ModelSquare); +export type CompositionWithOneOfDiscriminatorType = D.Output; " `; @@ -4222,18 +4095,11 @@ exports[`v3 should generate: test/generated/v3/models/DeprecatedModel.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a deprecated model with a deprecated property - * @deprecated - */ -export type DeprecatedModel = { - /** - * This is a deprecated property - * @deprecated - */ - prop?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const DeprecatedModel = D.object({ + prop: D.optional(D.string), +}); +export type DeprecatedModelType = D.Output; " `; @@ -4242,11 +4108,10 @@ exports[`v3 should generate: test/generated/v3/models/DictionaryWithArray.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a complex dictionary - */ -export type DictionaryWithArray = Record>; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const DictionaryWithArray = D.record(D.array(ModelWithString)); +export type DictionaryWithArrayType = D.Output; " `; @@ -4255,10 +4120,9 @@ exports[`v3 should generate: test/generated/v3/models/DictionaryWithDictionary.t /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a string dictionary - */ -export type DictionaryWithDictionary = Record>; +import * as D from '@majkit/fp-ts-schema'; +export const DictionaryWithDictionary = D.record(D.record(D.string)); +export type DictionaryWithDictionaryType = D.Output; " `; @@ -4267,13 +4131,12 @@ exports[`v3 should generate: test/generated/v3/models/DictionaryWithProperties.t /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a complex dictionary - */ -export type DictionaryWithProperties = Record; +import * as D from '@majkit/fp-ts-schema'; +export const DictionaryWithProperties = D.record(D.object({ + foo: D.optional(D.string), + bar: D.optional(D.string), +})); +export type DictionaryWithPropertiesType = D.Output; " `; @@ -4282,11 +4145,10 @@ exports[`v3 should generate: test/generated/v3/models/DictionaryWithReference.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a string reference - */ -export type DictionaryWithReference = Record; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const DictionaryWithReference = D.record(ModelWithString); +export type DictionaryWithReferenceType = D.Output; " `; @@ -4295,10 +4157,9 @@ exports[`v3 should generate: test/generated/v3/models/DictionaryWithString.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a string dictionary - */ -export type DictionaryWithString = Record; +import * as D from '@majkit/fp-ts-schema'; +export const DictionaryWithString = D.record(D.string); +export type DictionaryWithStringType = D.Output; " `; @@ -4307,10 +4168,9 @@ exports[`v3 should generate: test/generated/v3/models/EnumFromDescription.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Success=1,Warning=2,Error=3 - */ -export type EnumFromDescription = number; +import * as D from '@majkit/fp-ts-schema'; +export const EnumFromDescription = D.number; +export type EnumFromDescriptionType = D.Output; " `; @@ -4319,23 +4179,9 @@ exports[`v3 should generate: test/generated/v3/models/EnumWithExtensions.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple enum with numbers - */ -export enum EnumWithExtensions { - /** - * Used when the status of something is successful - */ - CUSTOM_SUCCESS = 200, - /** - * Used when the status of something has a warning - */ - CUSTOM_WARNING = 400, - /** - * Used when the status of something has an error - */ - CUSTOM_ERROR = 500, -} +import * as D from '@majkit/fp-ts-schema'; +export const EnumWithExtensions = D.literalUnion(200, 400, 500); +export type EnumWithExtensionsType = D.Output; " `; @@ -4344,26 +4190,9 @@ exports[`v3 should generate: test/generated/v3/models/EnumWithNumbers.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple enum with numbers - */ -export enum EnumWithNumbers { - '_1' = 1, - '_2' = 2, - '_3' = 3, - '_1.1' = 1.1, - '_1.2' = 1.2, - '_1.3' = 1.3, - '_100' = 100, - '_200' = 200, - '_300' = 300, - '_-100' = -100, - '_-200' = -200, - '_-300' = -300, - '_-1.1' = -1.1, - '_-1.2' = -1.2, - '_-1.3' = -1.3, -} +import * as D from '@majkit/fp-ts-schema'; +export const EnumWithNumbers = D.literalUnion(1, 2, 3, 1.1, 1.2, 1.3, 100, 200, 300, -100, -200, -300, -1.1, -1.2, -1.3); +export type EnumWithNumbersType = D.Output; " `; @@ -4372,16 +4201,9 @@ exports[`v3 should generate: test/generated/v3/models/EnumWithStrings.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple enum with strings - */ -export enum EnumWithStrings { - SUCCESS = 'Success', - WARNING = 'Warning', - ERROR = 'Error', - _SINGLE_QUOTE_ = '\\'Single Quote\\'', - _DOUBLE_QUOTES_ = '"Double Quotes"', -} +import * as D from '@majkit/fp-ts-schema'; +export const EnumWithStrings = D.literalUnion('Success', 'Warning', 'Error', '\\'Single Quote\\'', '"Double Quotes"'); +export type EnumWithStringsType = D.Output; " `; @@ -4390,14 +4212,15 @@ exports[`v3 should generate: test/generated/v3/models/File.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type File = { - readonly id?: string; - readonly updated_at?: string; - readonly created_at?: string; - mime: string; - readonly file?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const File = D.object({ + id: D.optional(D.string), + updated_at: D.optional(D.string), + created_at: D.optional(D.string), + mime: D.string, + file: D.optional(D.string), +}); +export type FileType = D.Output; " `; @@ -4406,10 +4229,11 @@ exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithAddition /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a free-form object with additionalProperties: {}. - */ -export type FreeFormObjectWithAdditionalPropertiesEqEmptyObject = Record; +import * as D from '@majkit/fp-ts-schema'; +export const FreeFormObjectWithAdditionalPropertiesEqEmptyObject = D.record(D.createDecoder({ + forceDecode: (data) => data, +})); +export type FreeFormObjectWithAdditionalPropertiesEqEmptyObjectType = D.Output; " `; @@ -4418,10 +4242,11 @@ exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithAddition /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a free-form object with additionalProperties: true. - */ -export type FreeFormObjectWithAdditionalPropertiesEqTrue = Record; +import * as D from '@majkit/fp-ts-schema'; +export const FreeFormObjectWithAdditionalPropertiesEqTrue = D.record(D.createDecoder({ + forceDecode: (data) => data, +})); +export type FreeFormObjectWithAdditionalPropertiesEqTrueType = D.Output; " `; @@ -4430,10 +4255,11 @@ exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithoutAddit /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a free-form object without additionalProperties. - */ -export type FreeFormObjectWithoutAdditionalProperties = Record; +import * as D from '@majkit/fp-ts-schema'; +export const FreeFormObjectWithoutAdditionalProperties = D.record(D.createDecoder({ + forceDecode: (data) => data, +})); +export type FreeFormObjectWithoutAdditionalPropertiesType = D.Output; " `; @@ -4442,14 +4268,12 @@ exports[`v3 should generate: test/generated/v3/models/ModelCircle.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Circle - */ -export type ModelCircle = { - kind: 'circle'; - radius?: number; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelCircle = D.object({ + kind: 'circle', + radius: D.optional(D.number), +}); +export type ModelCircleType = D.Output; " `; @@ -4458,14 +4282,12 @@ exports[`v3 should generate: test/generated/v3/models/ModelSquare.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * Square - */ -export type ModelSquare = { - kind: 'square'; - sideLength?: number; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelSquare = D.object({ + kind: 'square', + sideLength: D.optional(D.number), +}); +export type ModelSquareType = D.Output; " `; @@ -4474,15 +4296,13 @@ exports[`v3 should generate: test/generated/v3/models/ModelThatExtends.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model that extends another model - */ -export type ModelThatExtends = (ModelWithString & { - propExtendsA?: string; - propExtendsB?: ModelWithString; -}); - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelThatExtends = D.allOf(ModelWithString, D.object({ + propExtendsA: D.optional(D.string), + propExtendsB: D.optional(ModelWithString), +})); +export type ModelThatExtendsType = D.Output; " `; @@ -4491,16 +4311,14 @@ exports[`v3 should generate: test/generated/v3/models/ModelThatExtendsExtends.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelThatExtends } from './ModelThatExtends'; -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model that extends another model - */ -export type ModelThatExtendsExtends = (ModelWithString & ModelThatExtends & { - propExtendsC?: string; - propExtendsD?: ModelWithString; -}); - +import * as D from '@majkit/fp-ts-schema'; +import { ModelThatExtends } from './ModelThatExtends'; +import { ModelWithString } from './ModelWithString'; +export const ModelThatExtendsExtends = D.allOf(ModelWithString, ModelThatExtends, D.object({ + propExtendsC: D.optional(D.string), + propExtendsD: D.optional(ModelWithString), +})); +export type ModelThatExtendsExtendsType = D.Output; " `; @@ -4509,16 +4327,21 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithArray.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with one property containing an array - */ -export type ModelWithArray = { - prop?: Array; - propWithFile?: Array; - propWithNumber?: Array; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelWithArray = D.object({ + prop: D.optional(D.array(ModelWithString)), + propWithFile: D.optional(D.array(D.createDecoder({ + forceDecode: (data) => { + if (data instanceof Blob) { + return data; + } + throw new D.DecoderError('Expected Blob'); + }, + }))), + propWithNumber: D.optional(D.array(D.number)), +}); +export type ModelWithArrayType = D.Output; " `; @@ -4527,16 +4350,11 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithBoolean.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one boolean property - */ -export type ModelWithBoolean = { - /** - * This is a simple boolean property - */ - prop?: boolean; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithBoolean = D.object({ + prop: D.optional(D.boolean), +}); +export type ModelWithBooleanType = D.Output; " `; @@ -4545,13 +4363,11 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithCircularReference /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one property containing a circular reference - */ -export type ModelWithCircularReference = { - prop?: ModelWithCircularReference; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithCircularReference = D.object({ + prop: D.optional(ModelWithCircularReference), +}); +export type ModelWithCircularReferenceType = D.Output; " `; @@ -4560,13 +4376,11 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithDictionary.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one property containing a dictionary - */ -export type ModelWithDictionary = { - prop?: Record; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithDictionary = D.object({ + prop: D.optional(D.record(D.string)), +}); +export type ModelWithDictionaryType = D.Output; " `; @@ -4575,16 +4389,14 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithDuplicateImports. /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with duplicated imports - */ -export type ModelWithDuplicateImports = { - propA?: ModelWithString; - propB?: ModelWithString; - propC?: ModelWithString; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelWithDuplicateImports = D.object({ + propA: D.optional(ModelWithString), + propB: D.optional(ModelWithString), + propC: D.optional(ModelWithString), +}); +export type ModelWithDuplicateImportsType = D.Output; " `; @@ -4593,14 +4405,12 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithDuplicateProperti /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with duplicated properties - */ -export type ModelWithDuplicateProperties = { - prop?: ModelWithString; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelWithDuplicateProperties = D.object({ + prop: D.optional(ModelWithString), +}); +export type ModelWithDuplicatePropertiesType = D.Output; " `; @@ -4609,45 +4419,13 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithEnum.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one enum - */ -export type ModelWithEnum = { - /** - * This is a simple enum with strings - */ - test?: ModelWithEnum.test; - /** - * These are the HTTP error code enums - */ - statusCode?: ModelWithEnum.statusCode; - /** - * Simple boolean enum - */ - bool?: boolean; -}; -export namespace ModelWithEnum { - /** - * This is a simple enum with strings - */ - export enum test { - SUCCESS = 'Success', - WARNING = 'Warning', - ERROR = 'Error', - } - /** - * These are the HTTP error code enums - */ - export enum statusCode { - _100 = '100', - _200_FOO = '200 FOO', - _300_FOO_BAR = '300 FOO_BAR', - _400_FOO_BAR = '400 foo-bar', - _500_FOO_BAR = '500 foo.bar', - _600_FOO_BAR = '600 foo&bar', - } -} - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithEnum = D.object({ + test: D.optional(D.literalUnion('Success', 'Warning', 'Error')), + statusCode: D.optional(D.literalUnion('100', '200 FOO', '300 FOO_BAR', '400 foo-bar', '500 foo.bar', '600 foo&bar')), + bool: D.optional(D.boolean), +}); +export type ModelWithEnumType = D.Output; " `; @@ -4656,16 +4434,11 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithEnumFromDescripti /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one enum - */ -export type ModelWithEnumFromDescription = { - /** - * Success=1,Warning=2,Error=3 - */ - test?: number; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithEnumFromDescription = D.object({ + test: D.optional(D.number), +}); +export type ModelWithEnumFromDescriptionType = D.Output; " `; @@ -4674,16 +4447,11 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithInteger.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one number property - */ -export type ModelWithInteger = { - /** - * This is a simple number property - */ - prop?: number; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithInteger = D.object({ + prop: D.optional(D.number), +}); +export type ModelWithIntegerType = D.Output; " `; @@ -4692,16 +4460,14 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithNestedEnums.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with nested enums - */ -export type ModelWithNestedEnums = { - dictionaryWithEnum?: Record; - dictionaryWithEnumFromDescription?: Record; - arrayWithEnum?: Array<'Success' | 'Warning' | 'Error'>; - arrayWithDescription?: Array; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithNestedEnums = D.object({ + dictionaryWithEnum: D.optional(D.record(D.literalUnion('Success', 'Warning', 'Error'))), + dictionaryWithEnumFromDescription: D.optional(D.record(D.number)), + arrayWithEnum: D.optional(D.array(D.literalUnion('Success', 'Warning', 'Error'))), + arrayWithDescription: D.optional(D.array(D.number)), +}); +export type ModelWithNestedEnumsType = D.Output; " `; @@ -4710,17 +4476,15 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithNestedProperties. /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one nested property - */ -export type ModelWithNestedProperties = { - readonly first: { - readonly second: { - readonly third: string | null; - } | null; - } | null; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithNestedProperties = D.object({ + first: D.nullable(D.object({ + second: D.nullable(D.object({ + third: D.nullable(D.string), + })), + })), +}); +export type ModelWithNestedPropertiesType = D.Output; " `; @@ -4729,28 +4493,14 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithNullableString.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one string property - */ -export type ModelWithNullableString = { - /** - * This is a simple string property - */ - nullableProp1?: string | null; - /** - * This is a simple string property - */ - nullableRequiredProp1: string | null; - /** - * This is a simple string property - */ - nullableProp2?: string | null; - /** - * This is a simple string property - */ - nullableRequiredProp2: string | null; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithNullableString = D.object({ + nullableProp1: D.optional(D.nullable(D.string)), + nullableRequiredProp1: D.nullable(D.string), + nullableProp2: D.optional(D.nullable(D.string)), + nullableRequiredProp2: D.nullable(D.string), +}); +export type ModelWithNullableStringType = D.Output; " `; @@ -4759,15 +4509,13 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithOrderedProperties /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with ordered properties - */ -export type ModelWithOrderedProperties = { - zebra?: string; - apple?: string; - hawaii?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithOrderedProperties = D.object({ + zebra: D.optional(D.string), + apple: D.optional(D.string), + hawaii: D.optional(D.string), +}); +export type ModelWithOrderedPropertiesType = D.Output; " `; @@ -4776,19 +4524,17 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithPattern.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model that contains a some patterns - */ -export type ModelWithPattern = { - key: string; - name: string; - readonly enabled?: boolean; - readonly modified?: string; - id?: string; - text?: string; - patternWithSingleQuotes?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithPattern = D.object({ + key: D.string, + name: D.string, + enabled: D.optional(D.boolean), + modified: D.optional(D.string), + id: D.optional(D.string), + text: D.optional(D.string), + patternWithSingleQuotes: D.optional(D.string), +}); +export type ModelWithPatternType = D.Output; " `; @@ -4797,25 +4543,23 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithProperties.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a model with one nested property - */ -export type ModelWithProperties = { - required: string; - readonly requiredAndReadOnly: string; - requiredAndNullable: string | null; - string?: string; - number?: number; - boolean?: boolean; - reference?: ModelWithString; - 'property with space'?: string; - default?: string; - try?: string; - readonly '@namespace.string'?: string; - readonly '@namespace.integer'?: number; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const ModelWithProperties = D.object({ + required: D.string, + requiredAndReadOnly: D.string, + requiredAndNullable: D.nullable(D.string), + string: D.optional(D.string), + number: D.optional(D.number), + boolean: D.optional(D.boolean), + reference: D.optional(ModelWithString), + 'property with space': D.optional(D.string), + default: D.optional(D.string), + try: D.optional(D.string), + '@namespace.string': D.optional(D.string), + '@namespace.integer': D.optional(D.number), +}); +export type ModelWithPropertiesType = D.Output; " `; @@ -4824,14 +4568,12 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithReference.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithProperties } from './ModelWithProperties'; -/** - * This is a model with one property containing a reference - */ -export type ModelWithReference = { - prop?: ModelWithProperties; -}; - +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithProperties } from './ModelWithProperties'; +export const ModelWithReference = D.object({ + prop: D.optional(ModelWithProperties), +}); +export type ModelWithReferenceType = D.Output; " `; @@ -4840,16 +4582,11 @@ exports[`v3 should generate: test/generated/v3/models/ModelWithString.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a model with one string property - */ -export type ModelWithString = { - /** - * This is a simple string property - */ - prop?: string; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const ModelWithString = D.object({ + prop: D.optional(D.string), +}); +export type ModelWithStringType = D.Output; " `; @@ -4858,12 +4595,13 @@ exports[`v3 should generate: test/generated/v3/models/Pageable.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type Pageable = { - page?: number; - size?: number; - sort?: Array; -}; - +import * as D from '@majkit/fp-ts-schema'; +export const Pageable = D.object({ + page: D.optional(D.number), + size: D.optional(D.number), + sort: D.optional(D.array(D.string)), +}); +export type PageableType = D.Output; " `; @@ -4872,10 +4610,9 @@ exports[`v3 should generate: test/generated/v3/models/SimpleBoolean.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple boolean - */ -export type SimpleBoolean = boolean; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleBoolean = D.boolean; +export type SimpleBooleanType = D.Output; " `; @@ -4884,10 +4621,16 @@ exports[`v3 should generate: test/generated/v3/models/SimpleFile.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple file - */ -export type SimpleFile = Blob; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleFile = D.createDecoder({ + forceDecode: (data) => { + if (data instanceof Blob) { + return data; + } + throw new D.DecoderError('Expected Blob'); + }, +}); +export type SimpleFileType = D.Output; " `; @@ -4896,10 +4639,9 @@ exports[`v3 should generate: test/generated/v3/models/SimpleInteger.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple number - */ -export type SimpleInteger = number; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleInteger = D.number; +export type SimpleIntegerType = D.Output; " `; @@ -4908,10 +4650,9 @@ exports[`v3 should generate: test/generated/v3/models/SimpleParameter.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a reusable parameter - */ -export type SimpleParameter = string; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleParameter = D.string; +export type SimpleParameterType = D.Output; " `; @@ -4920,11 +4661,10 @@ exports[`v3 should generate: test/generated/v3/models/SimpleReference.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from './ModelWithString'; -/** - * This is a simple reference - */ -export type SimpleReference = ModelWithString; +import * as D from '@majkit/fp-ts-schema'; +import { ModelWithString } from './ModelWithString'; +export const SimpleReference = ModelWithString; +export type SimpleReferenceType = D.Output; " `; @@ -4933,10 +4673,9 @@ exports[`v3 should generate: test/generated/v3/models/SimpleString.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple string - */ -export type SimpleString = string; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleString = D.string; +export type SimpleStringType = D.Output; " `; @@ -4945,10 +4684,9 @@ exports[`v3 should generate: test/generated/v3/models/SimpleStringWithPattern.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -/** - * This is a simple string - */ -export type SimpleStringWithPattern = string | null; +import * as D from '@majkit/fp-ts-schema'; +export const SimpleStringWithPattern = D.nullable(D.string); +export type SimpleStringWithPatternType = D.Output; " `; @@ -6362,25 +6100,25 @@ exports[`v3 should generate: test/generated/v3/services/CollectionFormatService. /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class CollectionFormatService { - /** - * @param parameterArrayCsv This is an array parameter that is sent as csv format (comma-separated values) - * @param parameterArraySsv This is an array parameter that is sent as ssv format (space-separated values) - * @param parameterArrayTsv This is an array parameter that is sent as tsv format (tab-separated values) - * @param parameterArrayPipes This is an array parameter that is sent as pipes format (pipe-separated values) - * @param parameterArrayMulti This is an array parameter that is sent as multi format (multiple parameter instances) - * @throws ApiError - */ + private static collectionFormatDecoder = D.object({ + parameterArrayCsv: D.nullable(D.array(D.string)), + parameterArraySsv: D.nullable(D.array(D.string)), + parameterArrayTsv: D.nullable(D.array(D.string)), + parameterArrayPipes: D.nullable(D.array(D.string)), + parameterArrayMulti: D.nullable(D.array(D.string)), + }); public static collectionFormat( - parameterArrayCsv: Array | null, - parameterArraySsv: Array | null, - parameterArrayTsv: Array | null, - parameterArrayPipes: Array | null, - parameterArrayMulti: Array | null, - ): CancelablePromise { + parameterArrayCsv: D.Output['parameterArrayCsv'], + parameterArraySsv: D.Output['parameterArraySsv'], + parameterArrayTsv: D.Output['parameterArrayTsv'], + parameterArrayPipes: D.Output['parameterArrayPipes'], + parameterArrayMulti: D.Output['parameterArrayMulti'], + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/collectionFormat', @@ -6402,30 +6140,29 @@ exports[`v3 should generate: test/generated/v3/services/ComplexService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithArray } from '../models/ModelWithArray'; -import type { ModelWithDictionary } from '../models/ModelWithDictionary'; -import type { ModelWithEnum } from '../models/ModelWithEnum'; -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelWithArray } from '../models/ModelWithArray'; +import { ModelWithDictionary } from '../models/ModelWithDictionary'; +import { ModelWithEnum } from '../models/ModelWithEnum'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class ComplexService { - /** - * @param parameterObject Parameter containing object - * @param parameterReference Parameter containing reference - * @returns ModelWithString Successful response - * @throws ApiError - */ - public static complexTypes( - parameterObject: { - first?: { - second?: { - third?: string; - }; - }; - }, + private static complexTypesDecoder = D.object({ + parameterObject: D.object({ + first: D.optional(D.object({ + second: D.optional(D.object({ + third: D.optional(D.string), + })), + })), + }), parameterReference: ModelWithString, - ): CancelablePromise> { + }); + public static complexTypes( + parameterObject: D.Output['parameterObject'], + parameterReference: D.Output['parameterReference'], + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/complex', @@ -6433,34 +6170,35 @@ export class ComplexService { 'parameterObject': parameterObject, 'parameterReference': parameterReference, }, + responseDecoders: { + 200: D.array(ModelWithString), + }, errors: { 400: \`400 server error\`, 500: \`500 server error\`, }, }); } - /** - * @param id - * @param requestBody - * @returns ModelWithString Success - * @throws ApiError - */ + private static complexParamsDecoder = D.object({ + id: D.number, + requestBody: D.optional(D.object({ + key: D.nullable(D.string), + name: D.nullable(D.string), + enabled: D.optional(D.boolean), + type: D.literalUnion('Monkey', 'Horse', 'Bird'), + listOfModels: D.optional(D.nullable(D.array(ModelWithString))), + listOfStrings: D.optional(D.nullable(D.array(D.string))), + parameters: D.oneOf(ModelWithString, ModelWithEnum, ModelWithArray, ModelWithDictionary), + user: D.optional(D.object({ + id: D.optional(D.number), + name: D.optional(D.nullable(D.string)), + })), + })), + }); public static complexParams( - id: number, - requestBody?: { - readonly key: string | null; - name: string | null; - enabled?: boolean; - readonly type: 'Monkey' | 'Horse' | 'Bird'; - listOfModels?: Array | null; - listOfStrings?: Array | null; - parameters: (ModelWithString | ModelWithEnum | ModelWithArray | ModelWithDictionary); - readonly user?: { - readonly id?: number; - readonly name?: string | null; - }; - }, - ): CancelablePromise { + id: D.Output['id'], + requestBody: D.Output['requestBody'] = option.none, + ) { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/complex/{id}', @@ -6469,6 +6207,9 @@ export class ComplexService { }, body: requestBody, mediaType: 'application/json-patch+json', + responseDecoders: { + 200: ModelWithString, + }, }); } } @@ -6480,14 +6221,12 @@ exports[`v3 should generate: test/generated/v3/services/DefaultService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DefaultService { - /** - * @throws ApiError - */ - public static serviceWithEmptyTag(): CancelablePromise { + public static serviceWithEmptyTag() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/no-tag', @@ -6502,28 +6241,28 @@ exports[`v3 should generate: test/generated/v3/services/DefaultsService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DefaultsService { - /** - * @param parameterString This is a simple string with default value - * @param parameterNumber This is a simple number with default value - * @param parameterBoolean This is a simple boolean with default value - * @param parameterEnum This is a simple enum with default value - * @param parameterModel This is a simple model with default value - * @throws ApiError - */ + private static callWithDefaultParametersDecoder = D.object({ + parameterString: D.nullable(D.string), + parameterNumber: D.nullable(D.number), + parameterBoolean: D.nullable(D.boolean), + parameterEnum: D.literalUnion('Success', 'Warning', 'Error'), + parameterModel: D.nullable(ModelWithString), + }); public static callWithDefaultParameters( - parameterString: string | null = 'Hello World!', - parameterNumber: number | null = 123, - parameterBoolean: boolean | null = true, - parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success', - parameterModel: ModelWithString | null = { + parameterString: D.Output['parameterString'] = 'Hello World!', + parameterNumber: D.Output['parameterNumber'] = 123, + parameterBoolean: D.Output['parameterBoolean'] = true, + parameterEnum: D.Output['parameterEnum'] = 'Success', + parameterModel: D.Output['parameterModel'] = { "prop": "Hello World!" }, - ): CancelablePromise { + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/defaults', @@ -6536,23 +6275,22 @@ export class DefaultsService { }, }); } - /** - * @param parameterString This is a simple string that is optional with default value - * @param parameterNumber This is a simple number that is optional with default value - * @param parameterBoolean This is a simple boolean that is optional with default value - * @param parameterEnum This is a simple enum that is optional with default value - * @param parameterModel This is a simple model that is optional with default value - * @throws ApiError - */ + private static callWithDefaultOptionalParametersDecoder = D.object({ + parameterString: D.string, + parameterNumber: D.number, + parameterBoolean: D.boolean, + parameterEnum: D.literalUnion('Success', 'Warning', 'Error'), + parameterModel: ModelWithString, + }); public static callWithDefaultOptionalParameters( - parameterString: string = 'Hello World!', - parameterNumber: number = 123, - parameterBoolean: boolean = true, - parameterEnum: 'Success' | 'Warning' | 'Error' = 'Success', - parameterModel: ModelWithString = { + parameterString: D.Output['parameterString'] = 'Hello World!', + parameterNumber: D.Output['parameterNumber'] = 123, + parameterBoolean: D.Output['parameterBoolean'] = true, + parameterEnum: D.Output['parameterEnum'] = 'Success', + parameterModel: D.Output['parameterModel'] = { "prop": "Hello World!" }, - ): CancelablePromise { + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/defaults', @@ -6565,27 +6303,26 @@ export class DefaultsService { }, }); } - /** - * @param parameterStringWithNoDefault This is a string with no default - * @param parameterOptionalStringWithDefault This is a optional string with default - * @param parameterOptionalStringWithEmptyDefault This is a optional string with empty default - * @param parameterOptionalStringWithNoDefault This is a optional string with no default - * @param parameterStringWithDefault This is a string with default - * @param parameterStringWithEmptyDefault This is a string with empty default - * @param parameterStringNullableWithNoDefault This is a string that can be null with no default - * @param parameterStringNullableWithDefault This is a string that can be null with default - * @throws ApiError - */ + private static callToTestOrderOfParamsDecoder = D.object({ + parameterStringWithNoDefault: D.string, + parameterOptionalStringWithDefault: D.string, + parameterOptionalStringWithEmptyDefault: D.string, + parameterOptionalStringWithNoDefault: D.optional(D.string), + parameterStringWithDefault: D.string, + parameterStringWithEmptyDefault: D.string, + parameterStringNullableWithNoDefault: D.optional(D.nullable(D.string)), + parameterStringNullableWithDefault: D.nullable(D.string), + }); public static callToTestOrderOfParams( - parameterStringWithNoDefault: string, - parameterOptionalStringWithDefault: string = 'Hello World!', - parameterOptionalStringWithEmptyDefault: string = '', - parameterOptionalStringWithNoDefault?: string, - parameterStringWithDefault: string = 'Hello World!', - parameterStringWithEmptyDefault: string = '', - parameterStringNullableWithNoDefault?: string | null, - parameterStringNullableWithDefault: string | null = null, - ): CancelablePromise { + parameterStringWithNoDefault: D.Output['parameterStringWithNoDefault'], + parameterOptionalStringWithDefault: D.Output['parameterOptionalStringWithDefault'] = 'Hello World!', + parameterOptionalStringWithEmptyDefault: D.Output['parameterOptionalStringWithEmptyDefault'] = '', + parameterOptionalStringWithNoDefault: D.Output['parameterOptionalStringWithNoDefault'] = option.none, + parameterStringWithDefault: D.Output['parameterStringWithDefault'] = 'Hello World!', + parameterStringWithEmptyDefault: D.Output['parameterStringWithEmptyDefault'] = '', + parameterStringNullableWithNoDefault: D.Output['parameterStringNullableWithNoDefault'] = option.none, + parameterStringNullableWithDefault: D.Output['parameterStringNullableWithDefault'] = option.none, + ) { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/defaults', @@ -6610,19 +6347,18 @@ exports[`v3 should generate: test/generated/v3/services/DeprecatedService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { DeprecatedModel } from '../models/DeprecatedModel'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { DeprecatedModel } from '../models/DeprecatedModel'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DeprecatedService { - /** - * @deprecated - * @param parameter This parameter is deprecated - * @throws ApiError - */ + private static deprecatedCallDecoder = D.object({ + parameter: D.nullable(DeprecatedModel), + }); public static deprecatedCall( - parameter: DeprecatedModel | null, - ): CancelablePromise { + parameter: D.Output['parameter'], + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/parameters/deprecated', @@ -6640,30 +6376,39 @@ exports[`v3 should generate: test/generated/v3/services/DescriptionsService.ts 1 /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DescriptionsService { - /** - * @param parameterWithBreaks Testing multiline comments in string: First line - * Second line - * - * Fourth line - * @param parameterWithBackticks Testing backticks in string: \`backticks\` and \`\`\`multiple backticks\`\`\` should work - * @param parameterWithSlashes Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work - * @param parameterWithExpressionPlaceholders Testing expression placeholders in string: \${expression} should work - * @param parameterWithQuotes Testing quotes in string: 'single quote''' and "double quotes""" should work - * @param parameterWithReservedCharacters Testing reserved characters in string: * inline * and ** inline ** should work - * @throws ApiError - */ + private static callWithDescriptionsDecoder = D.object({ + parameterWithBreaks: D.optional(D.createDecoder({ + forceDecode: (data) => data, + })), + parameterWithBackticks: D.optional(D.createDecoder({ + forceDecode: (data) => data, + })), + parameterWithSlashes: D.optional(D.createDecoder({ + forceDecode: (data) => data, + })), + parameterWithExpressionPlaceholders: D.optional(D.createDecoder({ + forceDecode: (data) => data, + })), + parameterWithQuotes: D.optional(D.createDecoder({ + forceDecode: (data) => data, + })), + parameterWithReservedCharacters: D.optional(D.createDecoder({ + forceDecode: (data) => data, + })), + }); public static callWithDescriptions( - parameterWithBreaks?: any, - parameterWithBackticks?: any, - parameterWithSlashes?: any, - parameterWithExpressionPlaceholders?: any, - parameterWithQuotes?: any, - parameterWithReservedCharacters?: any, - ): CancelablePromise { + parameterWithBreaks: D.Output['parameterWithBreaks'] = option.none, + parameterWithBackticks: D.Output['parameterWithBackticks'] = option.none, + parameterWithSlashes: D.Output['parameterWithSlashes'] = option.none, + parameterWithExpressionPlaceholders: D.Output['parameterWithExpressionPlaceholders'] = option.none, + parameterWithQuotes: D.Output['parameterWithQuotes'] = option.none, + parameterWithReservedCharacters: D.Output['parameterWithReservedCharacters'] = option.none, + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/descriptions/', @@ -6686,41 +6431,30 @@ exports[`v3 should generate: test/generated/v3/services/DuplicateService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DuplicateService { - /** - * @throws ApiError - */ - public static duplicateName(): CancelablePromise { + public static duplicateName() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/duplicate', }); } - /** - * @throws ApiError - */ - public static duplicateName1(): CancelablePromise { + public static duplicateName1() { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/duplicate', }); } - /** - * @throws ApiError - */ - public static duplicateName2(): CancelablePromise { + public static duplicateName2() { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/duplicate', }); } - /** - * @throws ApiError - */ - public static duplicateName3(): CancelablePromise { + public static duplicateName3() { return __request(OpenAPI, { method: 'DELETE', url: '/api/v{api-version}/duplicate', @@ -6735,24 +6469,28 @@ exports[`v3 should generate: test/generated/v3/services/ErrorService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class ErrorService { - /** - * @param status Status code to return - * @returns any Custom message: Successful response - * @throws ApiError - */ + private static testErrorCodeDecoder = D.object({ + status: D.number, + }); public static testErrorCode( - status: number, - ): CancelablePromise { + status: D.Output['status'], + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/error', query: { 'status': status, }, + responseDecoders: { + 200: D.createDecoder({ + forceDecode: (data) => data, + }), + }, errors: { 500: \`Custom message: Internal Server Error\`, 501: \`Custom message: Not Implemented\`, @@ -6770,20 +6508,20 @@ exports[`v3 should generate: test/generated/v3/services/FormDataService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class FormDataService { - /** - * @param parameter This is a reusable parameter - * @param formData A reusable request body - * @throws ApiError - */ + private static postApiFormDataDecoder = D.object({ + parameter: D.optional(D.string), + formData: D.optional(ModelWithString), + }); public static postApiFormData( - parameter?: string, - formData?: ModelWithString, - ): CancelablePromise { + parameter: D.Output['parameter'] = option.none, + formData: D.Output['formData'] = option.none, + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/formData/', @@ -6803,19 +6541,19 @@ exports[`v3 should generate: test/generated/v3/services/HeaderService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class HeaderService { - /** - * @returns string Successful response - * @throws ApiError - */ - public static callWithResultFromHeader(): CancelablePromise { + public static callWithResultFromHeader() { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/header', responseHeader: 'operation-location', + responseDecoders: { + 200: D.string, + }, errors: { 400: \`400 server error\`, 500: \`500 server error\`, @@ -6831,21 +6569,28 @@ exports[`v3 should generate: test/generated/v3/services/MultipartService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class MultipartService { - /** - * @param formData - * @throws ApiError - */ + private static multipartRequestDecoder = D.object({ + formData: D.optional(D.object({ + content: D.optional(D.createDecoder({ + forceDecode: (data) => { + if (data instanceof Blob) { + return data; + } + throw new D.DecoderError('Expected Blob'); + }, + })), + data: D.optional(D.nullable(D.oneOf(ModelWithString))), + })), + }); public static multipartRequest( - formData?: { - content?: Blob; - data?: ModelWithString | null; - }, - ): CancelablePromise { + formData: D.Output['formData'] = option.none, + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/multipart', @@ -6853,20 +6598,26 @@ export class MultipartService { mediaType: 'multipart/form-data', }); } - /** - * @returns any OK - * @throws ApiError - */ - public static multipartResponse(): CancelablePromise<{ - file?: Blob; - metadata?: { - foo?: string; - bar?: string; - }; - }> { + public static multipartResponse() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multipart', + responseDecoders: { + 200: D.object({ + file: D.optional(D.createDecoder({ + forceDecode: (data) => { + if (data instanceof Blob) { + return data; + } + throw new D.DecoderError('Expected Blob'); + }, + })), + metadata: D.optional(D.object({ + foo: D.optional(D.string), + bar: D.optional(D.string), + })), + }), + }, }); } } @@ -6878,28 +6629,27 @@ exports[`v3 should generate: test/generated/v3/services/MultipleTags1Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class MultipleTags1Service { - /** - * @returns void - * @throws ApiError - */ - public static dummyA(): CancelablePromise { + public static dummyA() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/a', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } - /** - * @returns void - * @throws ApiError - */ - public static dummyB(): CancelablePromise { + public static dummyB() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } } @@ -6911,28 +6661,27 @@ exports[`v3 should generate: test/generated/v3/services/MultipleTags2Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class MultipleTags2Service { - /** - * @returns void - * @throws ApiError - */ - public static dummyA(): CancelablePromise { + public static dummyA() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/a', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } - /** - * @returns void - * @throws ApiError - */ - public static dummyB(): CancelablePromise { + public static dummyB() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } } @@ -6944,18 +6693,18 @@ exports[`v3 should generate: test/generated/v3/services/MultipleTags3Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class MultipleTags3Service { - /** - * @returns void - * @throws ApiError - */ - public static dummyB(): CancelablePromise { + public static dummyB() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } } @@ -6967,18 +6716,18 @@ exports[`v3 should generate: test/generated/v3/services/NoContentService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class NoContentService { - /** - * @returns void - * @throws ApiError - */ - public static callWithNoContentResponse(): CancelablePromise { + public static callWithNoContentResponse() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/no-content', + responseDecoders: { + 200: D.succeed(undefined), + }, }); } } @@ -6990,29 +6739,29 @@ exports[`v3 should generate: test/generated/v3/services/ParametersService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from '../models/ModelWithString'; -import type { Pageable } from '../models/Pageable'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelWithString } from '../models/ModelWithString'; +import { Pageable } from '../models/Pageable'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class ParametersService { - /** - * @param parameterHeader This is the parameter that goes into the header - * @param parameterQuery This is the parameter that goes into the query params - * @param parameterForm This is the parameter that goes into the form data - * @param parameterCookie This is the parameter that goes into the cookie - * @param parameterPath This is the parameter that goes into the path - * @param requestBody This is the parameter that goes into the body - * @throws ApiError - */ + private static callWithParametersDecoder = D.object({ + parameterHeader: D.nullable(D.string), + parameterQuery: D.nullable(D.string), + parameterForm: D.nullable(D.string), + parameterCookie: D.nullable(D.string), + parameterPath: D.nullable(D.string), + requestBody: D.nullable(ModelWithString), + }); public static callWithParameters( - parameterHeader: string | null, - parameterQuery: string | null, - parameterForm: string | null, - parameterCookie: string | null, - parameterPath: string | null, - requestBody: ModelWithString | null, - ): CancelablePromise { + parameterHeader: D.Output['parameterHeader'], + parameterQuery: D.Output['parameterQuery'], + parameterForm: D.Output['parameterForm'], + parameterCookie: D.Output['parameterCookie'], + parameterPath: D.Output['parameterPath'], + requestBody: D.Output['requestBody'], + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/parameters/{parameterPath}', @@ -7035,29 +6784,28 @@ export class ParametersService { mediaType: 'application/json', }); } - /** - * @param parameterHeader This is the parameter that goes into the request header - * @param parameterQuery This is the parameter that goes into the request query params - * @param parameterForm This is the parameter that goes into the request form data - * @param parameterCookie This is the parameter that goes into the cookie - * @param requestBody This is the parameter that goes into the body - * @param parameterPath1 This is the parameter that goes into the path - * @param parameterPath2 This is the parameter that goes into the path - * @param parameterPath3 This is the parameter that goes into the path - * @param _default This is the parameter with a reserved keyword - * @throws ApiError - */ + private static callWithWeirdParameterNamesDecoder = D.object({ + parameterHeader: D.nullable(D.string), + parameterQuery: D.nullable(D.string), + parameterForm: D.nullable(D.string), + parameterCookie: D.nullable(D.string), + requestBody: D.nullable(ModelWithString), + parameterPath1: D.optional(D.string), + parameterPath2: D.optional(D.string), + parameterPath3: D.optional(D.string), + _default: D.optional(D.string), + }); public static callWithWeirdParameterNames( - parameterHeader: string | null, - parameterQuery: string | null, - parameterForm: string | null, - parameterCookie: string | null, - requestBody: ModelWithString | null, - parameterPath1?: string, - parameterPath2?: string, - parameterPath3?: string, - _default?: string, - ): CancelablePromise { + parameterHeader: D.Output['parameterHeader'], + parameterQuery: D.Output['parameterQuery'], + parameterForm: D.Output['parameterForm'], + parameterCookie: D.Output['parameterCookie'], + requestBody: D.Output['requestBody'], + parameterPath1: D.Output['parameterPath1'] = option.none, + parameterPath2: D.Output['parameterPath2'] = option.none, + parameterPath3: D.Output['parameterPath3'] = option.none, + _default: D.Output['_default'] = option.none, + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}', @@ -7083,15 +6831,14 @@ export class ParametersService { mediaType: 'application/json', }); } - /** - * @param requestBody This is a required parameter - * @param parameter This is an optional parameter - * @throws ApiError - */ - public static getCallWithOptionalParam( + private static getCallWithOptionalParamDecoder = D.object({ requestBody: ModelWithString, - parameter?: string, - ): CancelablePromise { + parameter: D.optional(D.string), + }); + public static getCallWithOptionalParam( + requestBody: D.Output['requestBody'], + parameter: D.Output['parameter'] = option.none, + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/parameters/', @@ -7102,15 +6849,14 @@ export class ParametersService { mediaType: 'application/json', }); } - /** - * @param parameter This is a required parameter - * @param requestBody This is an optional parameter - * @throws ApiError - */ - public static postCallWithOptionalParam( + private static postCallWithOptionalParamDecoder = D.object({ parameter: Pageable, - requestBody?: ModelWithString, - ): CancelablePromise { + requestBody: D.optional(ModelWithString), + }); + public static postCallWithOptionalParam( + parameter: D.Output['parameter'], + requestBody: D.Output['requestBody'] = option.none, + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/parameters/', @@ -7130,20 +6876,20 @@ exports[`v3 should generate: test/generated/v3/services/RequestBodyService.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class RequestBodyService { - /** - * @param parameter This is a reusable parameter - * @param requestBody A reusable request body - * @throws ApiError - */ + private static postApiRequestBodyDecoder = D.object({ + parameter: D.optional(D.string), + requestBody: D.optional(ModelWithString), + }); public static postApiRequestBody( - parameter?: string, - requestBody?: ModelWithString, - ): CancelablePromise { + parameter: D.Output['parameter'] = option.none, + requestBody: D.Output['requestBody'] = option.none, + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/requestBody/', @@ -7163,31 +6909,30 @@ exports[`v3 should generate: test/generated/v3/services/ResponseService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ModelThatExtends } from '../models/ModelThatExtends'; -import type { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends'; -import type { ModelWithString } from '../models/ModelWithString'; -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; +import { ModelThatExtends } from '../models/ModelThatExtends'; +import { ModelThatExtendsExtends } from '../models/ModelThatExtendsExtends'; +import { ModelWithString } from '../models/ModelWithString'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class ResponseService { - /** - * @returns ModelWithString - * @throws ApiError - */ - public static callWithResponse(): CancelablePromise { + public static callWithResponse() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/response', + responseDecoders: { + 0: ModelWithString, + }, }); } - /** - * @returns ModelWithString Message for default response - * @throws ApiError - */ - public static callWithDuplicateResponses(): CancelablePromise { + public static callWithDuplicateResponses() { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/response', + responseDecoders: { + 0: ModelWithString, + }, errors: { 500: \`Message for 500 error\`, 501: \`Message for 501 error\`, @@ -7195,21 +6940,20 @@ export class ResponseService { }, }); } - /** - * @returns any Message for 200 response - * @returns ModelWithString Message for default response - * @returns ModelThatExtends Message for 201 response - * @returns ModelThatExtendsExtends Message for 202 response - * @throws ApiError - */ - public static callWithResponses(): CancelablePromise<{ - readonly '@namespace.string'?: string; - readonly '@namespace.integer'?: number; - readonly value?: Array; - } | ModelWithString | ModelThatExtends | ModelThatExtendsExtends> { + public static callWithResponses() { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/response', + responseDecoders: { + 0: ModelWithString, + 200: D.object({ + '@namespace.string': D.optional(D.string), + '@namespace.integer': D.optional(D.number), + value: D.optional(D.array(ModelWithString)), + }), + 201: ModelThatExtends, + 202: ModelThatExtendsExtends, + }, errors: { 500: \`Message for 500 error\`, 501: \`Message for 501 error\`, @@ -7226,68 +6970,48 @@ exports[`v3 should generate: test/generated/v3/services/SimpleService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class SimpleService { - /** - * @throws ApiError - */ - public static getCallWithoutParametersAndResponse(): CancelablePromise { + public static getCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static putCallWithoutParametersAndResponse(): CancelablePromise { + public static putCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static postCallWithoutParametersAndResponse(): CancelablePromise { + public static postCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static deleteCallWithoutParametersAndResponse(): CancelablePromise { + public static deleteCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'DELETE', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static optionsCallWithoutParametersAndResponse(): CancelablePromise { + public static optionsCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'OPTIONS', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static headCallWithoutParametersAndResponse(): CancelablePromise { + public static headCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'HEAD', url: '/api/v{api-version}/simple', }); } - /** - * @throws ApiError - */ - public static patchCallWithoutParametersAndResponse(): CancelablePromise { + public static patchCallWithoutParametersAndResponse() { return __request(OpenAPI, { method: 'PATCH', url: '/api/v{api-version}/simple', @@ -7302,35 +7026,35 @@ exports[`v3 should generate: test/generated/v3/services/TypesService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class TypesService { - /** - * @param parameterArray This is an array parameter - * @param parameterDictionary This is a dictionary parameter - * @param parameterEnum This is an enum parameter - * @param parameterNumber This is a number parameter - * @param parameterString This is a string parameter - * @param parameterBoolean This is a boolean parameter - * @param parameterObject This is an object parameter - * @param id This is a number parameter - * @returns number Response is a simple number - * @returns string Response is a simple string - * @returns boolean Response is a simple boolean - * @returns any Response is a simple object - * @throws ApiError - */ + private static typesDecoder = D.object({ + parameterArray: D.nullable(D.array(D.string)), + parameterDictionary: D.nullable(D.record(D.createDecoder({ + forceDecode: (data) => data, + }))), + parameterEnum: D.nullable(D.literalUnion('Success', 'Warning', 'Error')), + parameterNumber: D.number, + parameterString: D.nullable(D.string), + parameterBoolean: D.nullable(D.boolean), + parameterObject: D.nullable(D.record(D.createDecoder({ + forceDecode: (data) => data, + }))), + id: D.optional(D.number), + }); public static types( - parameterArray: Array | null, - parameterDictionary: Record | null, - parameterEnum: 'Success' | 'Warning' | 'Error' | null, - parameterNumber: number = 123, - parameterString: string | null = 'default', - parameterBoolean: boolean | null = true, - parameterObject: Record | null = null, - id?: number, - ): CancelablePromise> { + parameterArray: D.Output['parameterArray'], + parameterDictionary: D.Output['parameterDictionary'], + parameterEnum: D.Output['parameterEnum'], + parameterNumber: D.Output['parameterNumber'] = 123, + parameterString: D.Output['parameterString'] = 'default', + parameterBoolean: D.Output['parameterBoolean'] = true, + parameterObject: D.Output['parameterObject'] = option.none, + id: D.Output['id'] = option.none, + ) { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/types', @@ -7346,6 +7070,14 @@ export class TypesService { 'parameterDictionary': parameterDictionary, 'parameterEnum': parameterEnum, }, + responseDecoders: { + 200: D.number, + 201: D.string, + 202: D.boolean, + 203: D.record(D.createDecoder({ + forceDecode: (data) => data, + })), + }, }); } } @@ -7357,24 +7089,33 @@ exports[`v3 should generate: test/generated/v3/services/UploadService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { CancelablePromise } from '../core/CancelablePromise'; +import * as D from '@majkit/fp-ts-schema'; +import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class UploadService { - /** - * @param file Supply a file reference for upload - * @returns boolean - * @throws ApiError - */ + private static uploadFileDecoder = D.object({ + file: D.createDecoder({ + forceDecode: (data) => { + if (data instanceof Blob) { + return data; + } + throw new D.DecoderError('Expected Blob'); + }, + }), + }); public static uploadFile( - file: Blob, - ): CancelablePromise { + file: D.Output['file'], + ) { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/upload', formData: { 'file': file, }, + responseDecoders: { + 200: D.boolean, + }, }); } } diff --git a/test/e2e/assets/main-angular-module.ts b/test/e2e/assets/main-angular-module.ts deleted file mode 100644 index f6529550e..000000000 --- a/test/e2e/assets/main-angular-module.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { HttpClientModule } from '@angular/common/http'; -import { Component, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { ApiModule } from './ApiModule'; -import { OpenAPI } from './core/OpenAPI'; -import { CollectionFormatService } from './services/CollectionFormatService'; -import { ComplexService } from './services/ComplexService'; -import { DefaultService } from './services/DefaultService'; -import { DefaultsService } from './services/DefaultsService'; -import { DuplicateService } from './services/DuplicateService'; -import { ErrorService } from './services/ErrorService'; -import { HeaderService } from './services/HeaderService'; -import { MultipleTags1Service } from './services/MultipleTags1Service'; -import { MultipleTags2Service } from './services/MultipleTags2Service'; -import { MultipleTags3Service } from './services/MultipleTags3Service'; -import { NoContentService } from './services/NoContentService'; -import { ParametersService } from './services/ParametersService'; -import { ResponseService } from './services/ResponseService'; -import { SimpleService } from './services/SimpleService'; -import { TypesService } from './services/TypesService'; - -@Component({ - selector: 'app-root', - template: `
Angular is ready
`, -}) -export class AppComponent { - constructor( - private readonly collectionFormatService: CollectionFormatService, - private readonly complexService: ComplexService, - private readonly defaultService: DefaultService, - private readonly defaultsService: DefaultsService, - private readonly duplicateService: DuplicateService, - private readonly errorService: ErrorService, - private readonly headerService: HeaderService, - private readonly multipleTags1Service: MultipleTags1Service, - private readonly multipleTags2Service: MultipleTags2Service, - private readonly multipleTags3Service: MultipleTags3Service, - private readonly noContentService: NoContentService, - private readonly parametersService: ParametersService, - private readonly responseService: ResponseService, - private readonly simpleService: SimpleService, - private readonly typesService: TypesService - ) { - (window as any).api = { - OpenAPI, - ApiModule, - CollectionFormatService: this.collectionFormatService, - ComplexService: this.complexService, - DefaultService: this.defaultService, - DefaultsService: this.defaultsService, - DuplicateService: this.duplicateService, - ErrorService: this.errorService, - HeaderService: this.headerService, - MultipleTags1Service: this.multipleTags1Service, - MultipleTags2Service: this.multipleTags2Service, - MultipleTags3Service: this.multipleTags3Service, - NoContentService: this.noContentService, - ParametersService: this.parametersService, - ResponseService: this.responseService, - SimpleService: this.simpleService, - TypesService: this.typesService, - }; - } -} - -@NgModule({ - imports: [BrowserModule, HttpClientModule, ApiModule], - bootstrap: [AppComponent], -}) -export class AppModule {} - -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch(err => console.error(err)); diff --git a/test/e2e/assets/main-angular.ts b/test/e2e/assets/main-angular.ts deleted file mode 100644 index 1ed564d2f..000000000 --- a/test/e2e/assets/main-angular.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { HttpClientModule } from '@angular/common/http'; -import { Component, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { OpenAPI } from './core/OpenAPI'; -import { CollectionFormatService } from './services/CollectionFormatService'; -import { ComplexService } from './services/ComplexService'; -import { DefaultService } from './services/DefaultService'; -import { DefaultsService } from './services/DefaultsService'; -import { DuplicateService } from './services/DuplicateService'; -import { ErrorService } from './services/ErrorService'; -import { HeaderService } from './services/HeaderService'; -import { MultipleTags1Service } from './services/MultipleTags1Service'; -import { MultipleTags2Service } from './services/MultipleTags2Service'; -import { MultipleTags3Service } from './services/MultipleTags3Service'; -import { NoContentService } from './services/NoContentService'; -import { ParametersService } from './services/ParametersService'; -import { ResponseService } from './services/ResponseService'; -import { SimpleService } from './services/SimpleService'; -import { TypesService } from './services/TypesService'; - -@Component({ - selector: 'app-root', - template: `
Angular is ready
`, -}) -export class AppComponent { - constructor( - private readonly collectionFormatService: CollectionFormatService, - private readonly complexService: ComplexService, - private readonly defaultService: DefaultService, - private readonly defaultsService: DefaultsService, - private readonly duplicateService: DuplicateService, - private readonly errorService: ErrorService, - private readonly headerService: HeaderService, - private readonly multipleTags1Service: MultipleTags1Service, - private readonly multipleTags2Service: MultipleTags2Service, - private readonly multipleTags3Service: MultipleTags3Service, - private readonly noContentService: NoContentService, - private readonly parametersService: ParametersService, - private readonly responseService: ResponseService, - private readonly simpleService: SimpleService, - private readonly typesService: TypesService - ) { - (window as any).api = { - OpenAPI, - CollectionFormatService: this.collectionFormatService, - ComplexService: this.complexService, - DefaultService: this.defaultService, - DefaultsService: this.defaultsService, - DuplicateService: this.duplicateService, - ErrorService: this.errorService, - HeaderService: this.headerService, - MultipleTags1Service: this.multipleTags1Service, - MultipleTags2Service: this.multipleTags2Service, - MultipleTags3Service: this.multipleTags3Service, - NoContentService: this.noContentService, - ParametersService: this.parametersService, - ResponseService: this.responseService, - SimpleService: this.simpleService, - TypesService: this.typesService, - }; - } -} - -@NgModule({ - imports: [BrowserModule, HttpClientModule], - providers: [ - CollectionFormatService, - ComplexService, - DefaultService, - DefaultsService, - DuplicateService, - ErrorService, - HeaderService, - MultipleTags1Service, - MultipleTags2Service, - MultipleTags3Service, - NoContentService, - ParametersService, - ResponseService, - SimpleService, - TypesService, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} - -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch(err => console.error(err)); diff --git a/test/e2e/client.angular.spec.ts b/test/e2e/client.angular.spec.ts deleted file mode 100644 index 54dd5bc89..000000000 --- a/test/e2e/client.angular.spec.ts +++ /dev/null @@ -1,158 +0,0 @@ -import browser from './scripts/browser'; -import { buildAngularProject } from './scripts/buildAngularProject'; -import { cleanup } from './scripts/cleanup'; -import { copyAsset } from './scripts/copyAsset'; -import { createAngularProject } from './scripts/createAngularProject'; -import { generateClient } from './scripts/generateClient'; -import server from './scripts/server'; - -describe('client.angular', () => { - beforeAll(async () => { - cleanup('client/angular'); - createAngularProject('client/angular', 'app'); - await generateClient('client/angular/app/src', 'v3', 'angular', false, false, 'ApiModule'); - copyAsset('main-angular-module.ts', 'client/angular/app/src/main.ts'); - buildAngularProject('client/angular', 'app', 'dist'); - await server.start('client/angular/app/dist'); - await browser.start(); - }, 30000); - - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); - - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { SimpleService } = (window as any).api; - SimpleService.httpRequest.config.TOKEN = (window as any).tokenRequest; - SimpleService.httpRequest.config.USERNAME = undefined; - SimpleService.httpRequest.config.PASSWORD = undefined; - SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); - }); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); - }); - - it('uses credentials', async () => { - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { SimpleService } = (window as any).api; - SimpleService.httpRequest.config.TOKEN = undefined; - SimpleService.httpRequest.config.USERNAME = 'username'; - SimpleService.httpRequest.config.PASSWORD = 'password'; - SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); - }); - }); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); - }); - - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { ComplexService } = (window as any).api; - ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }).subscribe(resolve); - }); - }); - expect(result).toBeDefined(); - }); - - it('support form data', async () => { - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { ParametersService } = (window as any).api; - ParametersService.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ).subscribe(resolve); - }); - }); - expect(result).toBeDefined(); - }); - - it('should throw known error (500)', async () => { - const error = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { ErrorService } = (window as any).api; - ErrorService.testErrorCode(500).subscribe({ - error: (e: any) => { - resolve( - JSON.stringify({ - name: e.name, - message: e.message, - url: e.url, - status: e.status, - statusText: e.statusText, - body: e.body, - }) - ); - }, - }); - }); - }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); - }); - - it('should throw unknown error (409)', async () => { - const error = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { ErrorService } = (window as any).api; - ErrorService.testErrorCode(409).subscribe({ - error: (e: any) => { - resolve( - JSON.stringify({ - name: e.name, - message: e.message, - url: e.url, - status: e.status, - statusText: e.statusText, - body: e.body, - }) - ); - }, - }); - }); - }); - - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); - }); -}); diff --git a/test/e2e/scripts/buildAngularProject.ts b/test/e2e/scripts/buildAngularProject.ts deleted file mode 100644 index 43060756b..000000000 --- a/test/e2e/scripts/buildAngularProject.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { sync } from 'cross-spawn'; -import { resolve as resolvePath } from 'path'; - -export const buildAngularProject = (dir: string, name: string, output: string) => { - const cwd = `./test/e2e/generated/${dir}/${name}/`; - sync( - 'ng', - [ - 'build', - '--output-path', - output, - '--optimization', - 'false', - '--configuration', - 'development', - '--source-map', - 'false', - ], - { - cwd: resolvePath(cwd), - stdio: 'inherit', - } - ); -}; diff --git a/test/e2e/scripts/createAngularProject.ts b/test/e2e/scripts/createAngularProject.ts deleted file mode 100644 index 2b51ed361..000000000 --- a/test/e2e/scripts/createAngularProject.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { sync } from 'cross-spawn'; -import { mkdirSync, rmSync } from 'fs'; -import { resolve as resolvePath } from 'path'; - -export const createAngularProject = (dir: string, name: string) => { - const cwd = `./test/e2e/generated/${dir}/`; - mkdirSync(cwd, { - recursive: true, - }); - sync( - 'ng', - [ - 'new', - name, - '--minimal', - 'true', - '--style', - 'css', - '--inline-style', - 'true', - '--inline-template', - 'true', - '--routing', - 'false', - '--skip-tests', - 'true', - '--skip-install', - 'true', - '--skip-git', - 'true', - '--commit', - 'false', - '--force', - ], - { - cwd: resolvePath(cwd), - stdio: 'inherit', - } - ); - rmSync(`${cwd}/${name}/src/app/`, { - recursive: true, - }); -}; diff --git a/test/e2e/scripts/generateClient.ts b/test/e2e/scripts/generateClient.ts index 9c0402528..998bc6d09 100644 --- a/test/e2e/scripts/generateClient.ts +++ b/test/e2e/scripts/generateClient.ts @@ -3,9 +3,8 @@ import { generate as __generate } from '../../../'; export const generateClient = async ( dir: string, version: string, - client: 'fetch' | 'xhr' | 'node' | 'axios' | 'angular', + client: 'fetch' | 'xhr' | 'node' | 'axios', useOptions: boolean = false, - useUnionTypes: boolean = false, clientName?: string ) => { await __generate({ @@ -13,7 +12,6 @@ export const generateClient = async ( output: `./test/e2e/generated/${dir}/`, httpClient: client, useOptions, - useUnionTypes, clientName, }); }; diff --git a/test/e2e/v2.angular.spec.ts b/test/e2e/v2.angular.spec.ts deleted file mode 100644 index fa19f4357..000000000 --- a/test/e2e/v2.angular.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -import browser from './scripts/browser'; -import { buildAngularProject } from './scripts/buildAngularProject'; -import { cleanup } from './scripts/cleanup'; -import { copyAsset } from './scripts/copyAsset'; -import { createAngularProject } from './scripts/createAngularProject'; -import { generateClient } from './scripts/generateClient'; -import server from './scripts/server'; - -describe('v2.angular', () => { - beforeAll(async () => { - cleanup('v2/angular'); - createAngularProject('v2/angular', 'app'); - await generateClient('v2/angular/app/src', 'v2', 'angular'); - copyAsset('main-angular.ts', 'v2/angular/app/src/main.ts'); - buildAngularProject('v2/angular', 'app', 'dist'); - await server.start('v2/angular/app/dist'); - await browser.start(); - }, 30000); - - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); - - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = (window as any).tokenRequest; - SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); - }); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); - }); - - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { ComplexService } = (window as any).api; - ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }).subscribe(resolve); - }); - }); - expect(result).toBeDefined(); - }); -}); diff --git a/test/e2e/v3.angular.spec.ts b/test/e2e/v3.angular.spec.ts deleted file mode 100644 index 85e87b583..000000000 --- a/test/e2e/v3.angular.spec.ts +++ /dev/null @@ -1,159 +0,0 @@ -import browser from './scripts/browser'; -import { buildAngularProject } from './scripts/buildAngularProject'; -import { cleanup } from './scripts/cleanup'; -import { copyAsset } from './scripts/copyAsset'; -import { createAngularProject } from './scripts/createAngularProject'; -import { generateClient } from './scripts/generateClient'; -import server from './scripts/server'; - -describe('v3.angular', () => { - beforeAll(async () => { - cleanup('v3/angular'); - createAngularProject('v3/angular', 'app'); - await generateClient('v3/angular/app/src', 'v3', 'angular'); - copyAsset('main-angular.ts', 'v3/angular/app/src/main.ts'); - buildAngularProject('v3/angular', 'app', 'dist'); - await server.start('v3/angular/app/dist'); - await browser.start(); - }, 30000); - - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); - - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = (window as any).tokenRequest; - OpenAPI.USERNAME = undefined; - OpenAPI.PASSWORD = undefined; - SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); - }); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); - }); - - it('uses credentials', async () => { - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = undefined; - OpenAPI.USERNAME = 'username'; - OpenAPI.PASSWORD = 'password'; - SimpleService.getCallWithoutParametersAndResponse().subscribe(resolve); - }); - }); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); - }); - - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { ComplexService } = (window as any).api; - ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }).subscribe(resolve); - }); - }); - expect(result).toBeDefined(); - }); - - it('support form data', async () => { - const result = await browser.evaluate(async () => { - return await new Promise(resolve => { - const { ParametersService } = (window as any).api; - ParametersService.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ).subscribe(resolve); - }); - }); - expect(result).toBeDefined(); - }); - - it('should throw known error (500)', async () => { - const error = await browser.evaluate(async () => { - try { - await new Promise((resolve, reject) => { - const { ErrorService } = (window as any).api; - ErrorService.testErrorCode(500).subscribe(resolve, reject); - }); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; - }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); - }); - - it('should throw unknown error (409)', async () => { - const error = await browser.evaluate(async () => { - const { ErrorService } = (window as any).api; - ErrorService.testErrorCode(409).subscribe(console.log, console.log); - try { - await new Promise((resolve, reject) => { - // const { ErrorService } = (window as any).api; - ErrorService.testErrorCode(409).subscribe(resolve, reject); - }); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; - }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); - }); -}); diff --git a/test/index.js b/test/index.js index 6d276c412..32cf700e3 100644 --- a/test/index.js +++ b/test/index.js @@ -9,7 +9,6 @@ const generate = async (input, output) => { output, httpClient: OpenAPI.HttpClient.FETCH, useOptions: true, - useUnionTypes: false, exportCore: true, exportSchemas: true, exportModels: true, diff --git a/test/index.spec.ts b/test/index.spec.ts index 78a0197d5..1a6e1d2dd 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -10,7 +10,6 @@ describe('v2', () => { output: './test/generated/v2/', httpClient: HttpClient.FETCH, useOptions: false, - useUnionTypes: false, exportCore: true, exportSchemas: true, exportModels: true, @@ -31,7 +30,6 @@ describe('v3', () => { output: './test/generated/v3/', httpClient: HttpClient.FETCH, useOptions: false, - useUnionTypes: false, exportCore: true, exportSchemas: true, exportModels: true, diff --git a/test/spec/v2.json b/test/spec/v2.json index e8eb19b51..43f0bfd1d 100644 --- a/test/spec/v2.json +++ b/test/spec/v2.json @@ -1114,7 +1114,8 @@ }, "Date": { "description": "This is a type-only model that defines Date as a string", - "type": "string" + "type": "string", + "format": "string" }, "ModelWithInteger": { "description": "This is a model with one number property", diff --git a/types/index.d.ts b/types/index.d.ts index e2b5247e0..1e8d698ad 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -3,7 +3,6 @@ export declare enum HttpClient { XHR = 'xhr', NODE = 'node', AXIOS = 'axios', - ANGULAR = 'angular', } export declare enum Indent { @@ -15,10 +14,9 @@ export declare enum Indent { export type Options = { input: string | Record; output: string; - httpClient?: HttpClient | 'fetch' | 'xhr' | 'node' | 'axios' | 'angular'; + httpClient?: HttpClient | 'fetch' | 'xhr' | 'node' | 'axios'; clientName?: string; useOptions?: boolean; - useUnionTypes?: boolean; exportCore?: boolean; exportServices?: boolean; exportModels?: boolean; From 6ab7c67cfa0ed22a5992d2915729b1d6623829e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sat, 11 Nov 2023 23:15:12 +0000 Subject: [PATCH 13/48] =?UTF-8?q?=F0=9F=90=9B=20npm=20scripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8fb0fd8e9..944545c50 100644 --- a/package.json +++ b/package.json @@ -56,8 +56,8 @@ "eslint": "eslint .", "eslint:fix": "eslint . --fix", "prepare": "npm run clean && npm run release", - "codecov": "codecov --token=66c30c23-8954-4892-bef9-fbaed0a2e42b", - "docker": "docker build -t eeelenbaas/openapi-typescript-codegen ." + "codecov": "codecov --token=938189e1-ff82-4130-85c6-6c107fe17861", + "docker": "docker build -t @majkit/openapi ." }, "dependencies": { "@majkit/fp-ts-schema": "^1.1.1", From 3aff31e54f2a4acc4ae4683199a6642b3f272f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sat, 11 Nov 2023 23:37:26 +0000 Subject: [PATCH 14/48] =?UTF-8?q?=F0=9F=9A=91=20codecov?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .circleci/config.yml | 56 ++++++++++++++++++++------------------------ package.json | 1 - 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fe53ab1f2..a168cc90f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,32 +1,28 @@ version: 2 +orbs: + codecov/codecov@3.2.4 jobs: - build: - docker: - - image: cimg/node:lts-browsers - resource_class: large - working_directory: ~/repo - steps: - - checkout - - restore_cache: - keys: - - v1-dependencies-{{ checksum "package-lock.json" }} - - v1-dependencies- - - run: - name: Install dependencies - command: npm install - - save_cache: - key: v1-dependencies-{{ checksum "package-lock.json" }} - paths: - - node_modules - - run: - name: Build library - command: npm run release - - run: - name: Run unit tests - command: npm run test -# - run: -# name: Run e2e tests -# command: npm run test:e2e - - run: - name: Submit to Codecov - command: npm run codecov + build: + docker: + - image: 'cimg/node:lts-browsers' + resource_class: large + working_directory: ~/repo + steps: + - checkout + - restore_cache: + keys: + - 'v1-dependencies-{{ checksum "package-lock.json" }}' + - v1-dependencies- + - run: + name: Install dependencies + command: npm install + - save_cache: + key: 'v1-dependencies-{{ checksum "package-lock.json" }}' + paths: + - node_modules + - run: + name: Build library + command: npm run release + - run: + name: Run unit tests + command: npm run test diff --git a/package.json b/package.json index 944545c50..61889d567 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,6 @@ "eslint": "eslint .", "eslint:fix": "eslint . --fix", "prepare": "npm run clean && npm run release", - "codecov": "codecov --token=938189e1-ff82-4130-85c6-6c107fe17861", "docker": "docker build -t @majkit/openapi ." }, "dependencies": { From 682f550c08070c8e17db9f37b6f08143a862df2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sat, 11 Nov 2023 23:42:07 +0000 Subject: [PATCH 15/48] =?UTF-8?q?=E2=9C=A8=20run=20codecov?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a168cc90f..2ad04b030 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -26,3 +26,5 @@ jobs: - run: name: Run unit tests command: npm run test + - codecov/upload: + file: {{ coverage_report_filepath }} From 932fddef56b562c9a66668b5275380ecbaf11791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sat, 11 Nov 2023 23:44:49 +0000 Subject: [PATCH 16/48] =?UTF-8?q?=F0=9F=90=9B=20just=20codecov=20upload?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .circleci/config.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ad04b030..0d8b8d740 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 2 +version: 2.1 orbs: codecov/codecov@3.2.4 jobs: @@ -26,5 +26,4 @@ jobs: - run: name: Run unit tests command: npm run test - - codecov/upload: - file: {{ coverage_report_filepath }} + - codecov/upload From e32280121272f70bcad4df7c23d1ff0db2a55607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sat, 11 Nov 2023 23:45:37 +0000 Subject: [PATCH 17/48] =?UTF-8?q?=F0=9F=90=9B=20orbs=20definition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0d8b8d740..256cc3196 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,6 +1,6 @@ version: 2.1 orbs: - codecov/codecov@3.2.4 + codecov: codecov/codecov@3.3.0 jobs: build: docker: From 5b807a6f19b9a100e7a43faf25a0a6ecf77aee48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sat, 11 Nov 2023 23:53:48 +0000 Subject: [PATCH 18/48] =?UTF-8?q?=F0=9F=90=9B=20badges?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4c662b50e..507eab13a 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ ## Install ``` -npm install openapi-typescript-codegen --save-dev +pnpm install @majkit/openapi -D ``` ## Usage @@ -91,13 +91,13 @@ Support - [Axios support](docs/axios-support.md) - [Node-Fetch support](docs/node-fetch-support.md) -[npm-url]: https://npmjs.org/package/openapi-typescript-codegen -[npm-image]: https://img.shields.io/npm/v/openapi-typescript-codegen.svg +[npm-url]: https://npmjs.org/package/@majkit/openapi +[npm-image]: https://img.shields.io/npm/v/@majkit/openapi.svg [license-url]: LICENSE -[license-image]: http://img.shields.io/npm/l/openapi-typescript-codegen.svg -[coverage-url]: https://codecov.io/gh/ferdikoomen/openapi-typescript-codegen -[coverage-image]: https://img.shields.io/codecov/c/github/ferdikoomen/openapi-typescript-codegen.svg -[downloads-url]: http://npm-stat.com/charts.html?package=openapi-typescript-codegen -[downloads-image]: http://img.shields.io/npm/dm/openapi-typescript-codegen.svg -[build-url]: https://circleci.com/gh/ferdikoomen/openapi-typescript-codegen/tree/master -[build-image]: https://circleci.com/gh/ferdikoomen/openapi-typescript-codegen/tree/master.svg?style=svg +[license-image]: http://img.shields.io/npm/l/@majkit/openapi.svg +[coverage-url]: https://codecov.io/gh/maxa-ondrej/openapi-typescript-codegen +[coverage-image]: https://img.shields.io/codecov/c/github/maxa-ondrej/openapi-typescript-codegen.svg +[downloads-url]: http://npm-stat.com/charts.html?package=@majkit/openapi +[downloads-image]: http://img.shields.io/npm/dm/@majkit/openapi.svg +[build-url]: https://circleci.com/gh/maxa-ondrej/openapi-typescript-codegen +[build-image]: https://circleci.com/gh/maxa-ondrej/openapi-typescript-codegen.svg?style=svg From 80e532e4ee38512946341e8ef608b6c916e53bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sun, 12 Nov 2023 21:53:41 +0000 Subject: [PATCH 19/48] =?UTF-8?q?=E2=9C=A8=20generate=20coverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 256cc3196..935b6fd82 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,5 +25,5 @@ jobs: command: npm run release - run: name: Run unit tests - command: npm run test + command: npm run test:coverage - codecov/upload From 8c907de6c6e19462ac5d17d7dcd5e20732fce3f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sun, 12 Nov 2023 22:19:12 +0000 Subject: [PATCH 20/48] =?UTF-8?q?=F0=9F=8E=A8=20add=20biomejs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .eslintrc.json | 46 +- .prettierrc.json | 12 +- babel.config.json | 30 +- bin/index.js | 78 +- bin/index.spec.js | 126 +- biome.json | 23 + jest.config.ts | 74 +- package.json | 1 + pnpm-lock.yaml | 10960 ++++++++++++++++ rollup.config.mjs | 106 +- samples/spec/v2.json | 1881 ++- samples/spec/v3.json | 2251 ++-- src/HttpClient.ts | 8 +- src/Indent.ts | 6 +- src/client/interfaces/Client.d.ts | 8 +- src/client/interfaces/Enum.d.ts | 8 +- src/client/interfaces/Model.d.ts | 26 +- src/client/interfaces/ModelComposition.d.ts | 8 +- src/client/interfaces/Operation.d.ts | 20 +- src/client/interfaces/OperationError.d.ts | 4 +- src/client/interfaces/OperationParameter.d.ts | 6 +- .../interfaces/OperationParameters.d.ts | 16 +- src/client/interfaces/OperationResponse.d.ts | 4 +- src/client/interfaces/Schema.d.ts | 58 +- src/client/interfaces/Service.d.ts | 6 +- src/client/interfaces/Type.d.ts | 10 +- src/index.spec.ts | 48 +- src/index.ts | 160 +- src/openApi/v2/index.ts | 10 +- .../Extensions/WithEnumExtension.d.ts | 4 +- .../Extensions/WithNullableExtension.d.ts | 2 +- src/openApi/v2/interfaces/OpenApi.d.ts | 30 +- src/openApi/v2/interfaces/OpenApiContact.d.ts | 6 +- src/openApi/v2/interfaces/OpenApiExample.d.ts | 2 +- .../v2/interfaces/OpenApiExternalDocs.d.ts | 4 +- src/openApi/v2/interfaces/OpenApiHeader.d.ts | 58 +- src/openApi/v2/interfaces/OpenApiInfo.d.ts | 12 +- src/openApi/v2/interfaces/OpenApiItems.d.ts | 56 +- src/openApi/v2/interfaces/OpenApiLicense.d.ts | 4 +- .../v2/interfaces/OpenApiOperation.d.ts | 24 +- .../v2/interfaces/OpenApiParameter.d.ts | 68 +- src/openApi/v2/interfaces/OpenApiPath.d.ts | 16 +- .../v2/interfaces/OpenApiReference.d.ts | 2 +- .../v2/interfaces/OpenApiResponse.d.ts | 8 +- .../v2/interfaces/OpenApiResponses.d.ts | 4 +- src/openApi/v2/interfaces/OpenApiSchema.d.ts | 80 +- .../OpenApiSecurityRequirement.d.ts | 2 +- .../v2/interfaces/OpenApiSecurityScheme.d.ts | 16 +- src/openApi/v2/interfaces/OpenApiTag.d.ts | 6 +- src/openApi/v2/interfaces/OpenApiXml.d.ts | 10 +- src/openApi/v2/parser/escapeName.spec.ts | 34 +- src/openApi/v2/parser/escapeName.ts | 12 +- src/openApi/v2/parser/extendEnum.ts | 16 +- src/openApi/v2/parser/getEnum.ts | 60 +- src/openApi/v2/parser/getMappedType.spec.ts | 34 +- src/openApi/v2/parser/getMappedType.ts | 48 +- src/openApi/v2/parser/getModel.ts | 252 +- src/openApi/v2/parser/getModelComposition.ts | 140 +- src/openApi/v2/parser/getModelProperties.ts | 148 +- .../v2/parser/getModelTemplate.spec.ts | 36 +- src/openApi/v2/parser/getModelTemplate.ts | 2 +- src/openApi/v2/parser/getModels.ts | 18 +- src/openApi/v2/parser/getOperation.ts | 108 +- src/openApi/v2/parser/getOperationErrors.ts | 16 +- .../v2/parser/getOperationName.spec.ts | 44 +- src/openApi/v2/parser/getOperationName.ts | 26 +- .../v2/parser/getOperationParameter.ts | 224 +- .../v2/parser/getOperationParameterDefault.ts | 58 +- .../parser/getOperationParameterName.spec.ts | 26 +- .../v2/parser/getOperationParameterName.ts | 10 +- .../v2/parser/getOperationParameters.ts | 94 +- src/openApi/v2/parser/getOperationResponse.ts | 164 +- .../parser/getOperationResponseCode.spec.ts | 18 +- .../v2/parser/getOperationResponseCode.ts | 22 +- .../v2/parser/getOperationResponseHeader.ts | 14 +- .../v2/parser/getOperationResponses.ts | 34 +- src/openApi/v2/parser/getOperationResults.ts | 80 +- src/openApi/v2/parser/getRef.spec.ts | 56 +- src/openApi/v2/parser/getRef.ts | 44 +- .../getRequiredPropertiesFromComposition.ts | 42 +- src/openApi/v2/parser/getServer.spec.ts | 30 +- src/openApi/v2/parser/getServer.ts | 10 +- src/openApi/v2/parser/getServiceName.spec.ts | 18 +- src/openApi/v2/parser/getServiceName.ts | 10 +- .../v2/parser/getServiceVersion.spec.ts | 10 +- src/openApi/v2/parser/getServiceVersion.ts | 2 +- src/openApi/v2/parser/getServices.spec.ts | 50 +- src/openApi/v2/parser/getServices.ts | 78 +- src/openApi/v2/parser/getType.spec.ts | 126 +- src/openApi/v2/parser/getType.ts | 90 +- src/openApi/v2/parser/sortByRequired.ts | 10 +- src/openApi/v2/parser/stripNamespace.spec.ts | 12 +- src/openApi/v2/parser/stripNamespace.ts | 12 +- src/openApi/v3/index.ts | 10 +- .../Extensions/WithEnumExtension.d.ts | 4 +- src/openApi/v3/interfaces/OpenApi.d.ts | 16 +- .../v3/interfaces/OpenApiCallback.d.ts | 2 +- .../v3/interfaces/OpenApiComponents.d.ts | 18 +- src/openApi/v3/interfaces/OpenApiContact.d.ts | 6 +- .../v3/interfaces/OpenApiDiscriminator.d.ts | 4 +- .../v3/interfaces/OpenApiEncoding.d.ts | 10 +- src/openApi/v3/interfaces/OpenApiExample.d.ts | 8 +- .../v3/interfaces/OpenApiExternalDocs.d.ts | 4 +- src/openApi/v3/interfaces/OpenApiHeader.d.ts | 20 +- src/openApi/v3/interfaces/OpenApiInfo.d.ts | 12 +- src/openApi/v3/interfaces/OpenApiLicense.d.ts | 4 +- src/openApi/v3/interfaces/OpenApiLink.d.ts | 12 +- .../v3/interfaces/OpenApiMediaType.d.ts | 8 +- .../v3/interfaces/OpenApiOAuthFlow.d.ts | 8 +- .../v3/interfaces/OpenApiOAuthFlows.d.ts | 8 +- .../v3/interfaces/OpenApiOperation.d.ts | 24 +- .../v3/interfaces/OpenApiParameter.d.ts | 26 +- src/openApi/v3/interfaces/OpenApiPath.d.ts | 24 +- src/openApi/v3/interfaces/OpenApiPaths.d.ts | 2 +- .../v3/interfaces/OpenApiReference.d.ts | 2 +- .../v3/interfaces/OpenApiRequestBody.d.ts | 8 +- .../v3/interfaces/OpenApiResponse.d.ts | 8 +- .../v3/interfaces/OpenApiResponses.d.ts | 4 +- src/openApi/v3/interfaces/OpenApiSchema.d.ts | 92 +- .../OpenApiSecurityRequirement.d.ts | 2 +- .../v3/interfaces/OpenApiSecurityScheme.d.ts | 16 +- src/openApi/v3/interfaces/OpenApiServer.d.ts | 6 +- .../v3/interfaces/OpenApiServerVariable.d.ts | 6 +- src/openApi/v3/interfaces/OpenApiTag.d.ts | 6 +- src/openApi/v3/interfaces/OpenApiXml.d.ts | 10 +- src/openApi/v3/parser/escapeName.spec.ts | 34 +- src/openApi/v3/parser/escapeName.ts | 12 +- src/openApi/v3/parser/extendEnum.ts | 16 +- src/openApi/v3/parser/getContent.ts | 62 +- src/openApi/v3/parser/getEnum.ts | 60 +- src/openApi/v3/parser/getMappedType.spec.ts | 34 +- src/openApi/v3/parser/getMappedType.ts | 48 +- src/openApi/v3/parser/getModel.ts | 332 +- src/openApi/v3/parser/getModelComposition.ts | 142 +- src/openApi/v3/parser/getModelDefault.ts | 54 +- src/openApi/v3/parser/getModelProperties.ts | 173 +- .../v3/parser/getModelTemplate.spec.ts | 36 +- src/openApi/v3/parser/getModelTemplate.ts | 2 +- src/openApi/v3/parser/getModels.ts | 46 +- src/openApi/v3/parser/getOperation.ts | 140 +- src/openApi/v3/parser/getOperationErrors.ts | 16 +- .../v3/parser/getOperationName.spec.ts | 44 +- src/openApi/v3/parser/getOperationName.ts | 26 +- .../v3/parser/getOperationParameter.ts | 152 +- .../parser/getOperationParameterName.spec.ts | 30 +- .../v3/parser/getOperationParameterName.ts | 12 +- .../v3/parser/getOperationParameters.ts | 94 +- .../v3/parser/getOperationRequestBody.ts | 146 +- src/openApi/v3/parser/getOperationResponse.ts | 160 +- .../parser/getOperationResponseCode.spec.ts | 18 +- .../v3/parser/getOperationResponseCode.ts | 22 +- .../v3/parser/getOperationResponseHeader.ts | 14 +- .../v3/parser/getOperationResponses.ts | 34 +- src/openApi/v3/parser/getOperationResults.ts | 80 +- src/openApi/v3/parser/getRef.spec.ts | 108 +- src/openApi/v3/parser/getRef.ts | 44 +- .../getRequiredPropertiesFromComposition.ts | 42 +- src/openApi/v3/parser/getServer.spec.ts | 84 +- src/openApi/v3/parser/getServer.ts | 16 +- src/openApi/v3/parser/getServiceName.spec.ts | 18 +- src/openApi/v3/parser/getServiceName.ts | 10 +- .../v3/parser/getServiceVersion.spec.ts | 10 +- src/openApi/v3/parser/getServiceVersion.ts | 2 +- src/openApi/v3/parser/getServices.spec.ts | 50 +- src/openApi/v3/parser/getServices.ts | 78 +- src/openApi/v3/parser/getType.spec.ts | 176 +- src/openApi/v3/parser/getType.ts | 116 +- src/openApi/v3/parser/sortByRequired.ts | 10 +- src/openApi/v3/parser/stripNamespace.spec.ts | 22 +- src/openApi/v3/parser/stripNamespace.ts | 22 +- src/templates/__mocks__/index.ts | 10 +- src/typings/hbs.d.ts | 12 +- src/utils/discriminator.ts | 50 +- src/utils/fileSystem.ts | 12 +- src/utils/flatMap.spec.ts | 10 +- src/utils/flatMap.ts | 10 +- src/utils/formatCode.spec.ts | 16 +- src/utils/formatCode.ts | 38 +- src/utils/formatIndentation.ts | 28 +- src/utils/getHttpRequestName.ts | 20 +- src/utils/getModelNames.spec.ts | 112 +- src/utils/getModelNames.ts | 2 +- src/utils/getOpenApiSpec.ts | 2 +- src/utils/getOpenApiVersion.spec.ts | 20 +- src/utils/getOpenApiVersion.ts | 20 +- src/utils/getPattern.spec.ts | 24 +- src/utils/getPattern.ts | 4 +- src/utils/getServiceNames.spec.ts | 40 +- src/utils/getServiceNames.ts | 2 +- src/utils/isDefined.ts | 2 +- src/utils/isEqual.ts | 60 +- src/utils/isString.spec.ts | 18 +- src/utils/isString.ts | 2 +- src/utils/isSubdirectory.spec.ts | 18 +- src/utils/isSubdirectory.ts | 2 +- src/utils/postProcessClient.ts | 10 +- src/utils/postProcessModel.ts | 12 +- src/utils/postProcessModelEnum.ts | 6 +- src/utils/postProcessModelEnums.ts | 6 +- src/utils/postProcessModelImports.ts | 8 +- src/utils/postProcessService.ts | 14 +- src/utils/postProcessServiceImports.ts | 2 +- src/utils/postProcessServiceOperations.ts | 32 +- src/utils/readSpec.ts | 14 +- src/utils/readSpecFromDisk.ts | 20 +- src/utils/readSpecFromHttp.ts | 26 +- src/utils/readSpecFromHttps.ts | 26 +- src/utils/registerHandlebarHelpers.spec.ts | 26 +- src/utils/registerHandlebarHelpers.ts | 90 +- src/utils/registerHandlebarTemplates.spec.ts | 28 +- src/utils/registerHandlebarTemplates.ts | 212 +- src/utils/reservedWords.ts | 2 +- src/utils/sort.spec.ts | 12 +- src/utils/sort.ts | 6 +- src/utils/sortModelsByName.spec.ts | 112 +- src/utils/sortModelsByName.ts | 10 +- src/utils/sortServicesByName.spec.ts | 40 +- src/utils/sortServicesByName.ts | 10 +- src/utils/types.d.ts | 2 +- src/utils/unique.spec.ts | 16 +- src/utils/unique.ts | 2 +- src/utils/writeClient.spec.ts | 88 +- src/utils/writeClient.ts | 140 +- src/utils/writeClientClass.spec.ts | 58 +- src/utils/writeClientClass.ts | 36 +- src/utils/writeClientCore.spec.ts | 68 +- src/utils/writeClientCore.ts | 64 +- src/utils/writeClientIndex.spec.ts | 58 +- src/utils/writeClientIndex.ts | 50 +- src/utils/writeClientModels.spec.ts | 84 +- src/utils/writeClientModels.ts | 26 +- src/utils/writeClientSchemas.spec.ts | 84 +- src/utils/writeClientSchemas.ts | 26 +- src/utils/writeClientServices.spec.ts | 60 +- src/utils/writeClientServices.ts | 38 +- test/custom/request.ts | 46 +- test/e2e/client.axios.spec.ts | 266 +- test/e2e/client.babel.spec.ts | 302 +- test/e2e/client.fetch.spec.ts | 292 +- test/e2e/client.node.spec.ts | 266 +- test/e2e/client.xhr.spec.ts | 290 +- test/e2e/scripts/browser.ts | 40 +- test/e2e/scripts/cleanup.ts | 8 +- test/e2e/scripts/compileWithBabel.ts | 62 +- test/e2e/scripts/compileWithTypescript.ts | 98 +- test/e2e/scripts/copyAsset.ts | 2 +- test/e2e/scripts/generateClient.ts | 24 +- test/e2e/scripts/server.ts | 160 +- test/e2e/v2.axios.spec.ts | 54 +- test/e2e/v2.babel.spec.ts | 70 +- test/e2e/v2.fetch.spec.ts | 66 +- test/e2e/v2.node.spec.ts | 82 +- test/e2e/v2.xhr.spec.ts | 66 +- test/e2e/v3.axios.spec.ts | 270 +- test/e2e/v3.babel.spec.ts | 310 +- test/e2e/v3.fetch.spec.ts | 294 +- test/e2e/v3.node.spec.ts | 270 +- test/e2e/v3.xhr.spec.ts | 292 +- test/index.js | 90 +- test/index.spec.ts | 60 +- test/spec/v2.json | 2752 ++-- test/spec/v3.json | 4755 ++++--- types/index.d.ts | 48 +- 263 files changed, 22944 insertions(+), 12532 deletions(-) create mode 100644 biome.json create mode 100644 pnpm-lock.yaml diff --git a/.eslintrc.json b/.eslintrc.json index 6b6165178..dccdbd128 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,25 +1,25 @@ { - "parser": "@typescript-eslint/parser", - "extends": ["plugin:@typescript-eslint/recommended", "plugin:prettier/recommended", "prettier"], - "env": { - "es6": true, - "node": true, - "jest": true - }, - "plugins": ["simple-import-sort"], - "rules": { - "@typescript-eslint/no-explicit-any": 0, - "@typescript-eslint/no-inferrable-types": 0, - "@typescript-eslint/no-non-null-assertion": 0, - "@typescript-eslint/no-var-requires": 0, - "@typescript-eslint/ban-ts-ignore": 0, - "@typescript-eslint/ban-ts-comment": 0, - "@typescript-eslint/explicit-function-return-type": 0, - "@typescript-eslint/explicit-module-boundary-types": 0, - "sort-imports": "off", - "import/order": "off", - "simple-import-sort/imports": "error", - "simple-import-sort/exports": "error", - "prettier/prettier": ["error"] - } + "parser": "@typescript-eslint/parser", + "extends": ["plugin:@typescript-eslint/recommended", "plugin:prettier/recommended", "prettier"], + "env": { + "es6": true, + "node": true, + "jest": true + }, + "plugins": ["simple-import-sort"], + "rules": { + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-inferrable-types": 0, + "@typescript-eslint/no-non-null-assertion": 0, + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/ban-ts-ignore": 0, + "@typescript-eslint/ban-ts-comment": 0, + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/explicit-module-boundary-types": 0, + "sort-imports": "off", + "import/order": "off", + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", + "prettier/prettier": ["error"] + } } diff --git a/.prettierrc.json b/.prettierrc.json index d7d68f56b..197f347ac 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,8 +1,8 @@ { - "semi": true, - "singleQuote": true, - "trailingComma": "es5", - "arrowParens": "avoid", - "printWidth": 120, - "tabWidth": 4 + "semi": true, + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "avoid", + "printWidth": 120, + "tabWidth": 4 } diff --git a/babel.config.json b/babel.config.json index d452c89bd..ff5c1c77b 100644 --- a/babel.config.json +++ b/babel.config.json @@ -1,18 +1,18 @@ { - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "node": "12" - } - } - ], - [ - "@babel/preset-typescript", - { - "onlyRemoveTypeImports": true - } - ] + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "12" + } + } + ], + [ + "@babel/preset-typescript", + { + "onlyRemoveTypeImports": true + } ] + ] } diff --git a/bin/index.js b/bin/index.js index 299be731b..d2a051c73 100755 --- a/bin/index.js +++ b/bin/index.js @@ -7,48 +7,48 @@ const { program } = require('commander'); const pkg = require('../package.json'); const params = program - .name('openapi') - .usage('[options]') - .version(pkg.version) - .requiredOption('-i, --input ', 'OpenAPI specification, can be a path, url or string content (required)') - .requiredOption('-o, --output ', 'Output directory (required)') - .option('-c, --client ', 'HTTP client to generate [fetch, xhr, node, axios]', 'fetch') - .option('--name ', 'Custom client class name') - .option('--useOptions', 'Use options instead of arguments') - .option('--exportCore ', 'Write core files to disk', true) - .option('--exportServices ', 'Write services to disk', true) - .option('--exportModels ', 'Write models to disk', true) - .option('--exportSchemas ', 'Write schemas to disk', false) - .option('--indent ', 'Indentation options [4, 2, tabs]', '4') - .option('--postfixServices ', 'Service name postfix', 'Service') - .option('--postfixModels ', 'Model name postfix') - .option('--request ', 'Path to custom request file') - .parse(process.argv) - .opts(); + .name('openapi') + .usage('[options]') + .version(pkg.version) + .requiredOption('-i, --input ', 'OpenAPI specification, can be a path, url or string content (required)') + .requiredOption('-o, --output ', 'Output directory (required)') + .option('-c, --client ', 'HTTP client to generate [fetch, xhr, node, axios]', 'fetch') + .option('--name ', 'Custom client class name') + .option('--useOptions', 'Use options instead of arguments') + .option('--exportCore ', 'Write core files to disk', true) + .option('--exportServices ', 'Write services to disk', true) + .option('--exportModels ', 'Write models to disk', true) + .option('--exportSchemas ', 'Write schemas to disk', false) + .option('--indent ', 'Indentation options [4, 2, tabs]', '4') + .option('--postfixServices ', 'Service name postfix', 'Service') + .option('--postfixModels ', 'Model name postfix') + .option('--request ', 'Path to custom request file') + .parse(process.argv) + .opts(); const OpenAPI = require(path.resolve(__dirname, '../dist/index.js')); if (OpenAPI) { - OpenAPI.generate({ - input: params.input, - output: params.output, - httpClient: params.client, - clientName: params.name, - useOptions: params.useOptions, - exportCore: JSON.parse(params.exportCore) === true, - exportServices: JSON.parse(params.exportServices) === true, - exportModels: JSON.parse(params.exportModels) === true, - exportSchemas: JSON.parse(params.exportSchemas) === true, - indent: params.indent, - postfixServices: params.postfixServices, - postfixModels: params.postfixModels, - request: params.request, + OpenAPI.generate({ + input: params.input, + output: params.output, + httpClient: params.client, + clientName: params.name, + useOptions: params.useOptions, + exportCore: JSON.parse(params.exportCore) === true, + exportServices: JSON.parse(params.exportServices) === true, + exportModels: JSON.parse(params.exportModels) === true, + exportSchemas: JSON.parse(params.exportSchemas) === true, + indent: params.indent, + postfixServices: params.postfixServices, + postfixModels: params.postfixModels, + request: params.request, + }) + .then(() => { + process.exit(0); }) - .then(() => { - process.exit(0); - }) - .catch(error => { - console.error(error); - process.exit(1); - }); + .catch((error) => { + console.error(error); + process.exit(1); + }); } diff --git a/bin/index.spec.js b/bin/index.spec.js index cdcadb5d1..940965e37 100755 --- a/bin/index.spec.js +++ b/bin/index.spec.js @@ -1,71 +1,71 @@ const crossSpawn = require('cross-spawn'); describe('bin', () => { - it('it should support minimal params', async () => { - const result = crossSpawn.sync('node', [ - './bin/index.js', - '--input', - './test/spec/v3.json', - '--output', - './test/generated/bin', - ]); - expect(result.stdout.toString()).toBe(''); - expect(result.stderr.toString()).toBe(''); - }); + it('it should support minimal params', async () => { + const result = crossSpawn.sync('node', [ + './bin/index.js', + '--input', + './test/spec/v3.json', + '--output', + './test/generated/bin', + ]); + expect(result.stdout.toString()).toBe(''); + expect(result.stderr.toString()).toBe(''); + }); - it('it should support all params', async () => { - const result = crossSpawn.sync('node', [ - './bin/index.js', - '--input', - './test/spec/v3.json', - '--output', - './test/generated/bin', - '--client', - 'fetch', - '--useOptions', - '--exportCore', - 'true', - '--exportServices', - 'true', - '--exportModels', - 'true', - '--exportSchemas', - 'true', - '--indent', - '4', - '--postfixServices', - 'Service', - '--postfixModels', - 'Dto', - ]); - expect(result.stdout.toString()).toBe(''); - expect(result.stderr.toString()).toBe(''); - }); + it('it should support all params', async () => { + const result = crossSpawn.sync('node', [ + './bin/index.js', + '--input', + './test/spec/v3.json', + '--output', + './test/generated/bin', + '--client', + 'fetch', + '--useOptions', + '--exportCore', + 'true', + '--exportServices', + 'true', + '--exportModels', + 'true', + '--exportSchemas', + 'true', + '--indent', + '4', + '--postfixServices', + 'Service', + '--postfixModels', + 'Dto', + ]); + expect(result.stdout.toString()).toBe(''); + expect(result.stderr.toString()).toBe(''); + }); - it('it should throw error without params', async () => { - const result = crossSpawn.sync('node', ['./bin/index.js']); - expect(result.stdout.toString()).toBe(''); - expect(result.stderr.toString()).toContain(`error: required option '-i, --input ' not specified`); - }); + it('it should throw error without params', async () => { + const result = crossSpawn.sync('node', ['./bin/index.js']); + expect(result.stdout.toString()).toBe(''); + expect(result.stderr.toString()).toContain(`error: required option '-i, --input ' not specified`); + }); - it('it should throw error with wrong params', async () => { - const result = crossSpawn.sync('node', [ - './bin/index.js', - '--input', - './test/spec/v3.json', - '--output', - './test/generated/bin', - '--unknown', - ]); - expect(result.stdout.toString()).toBe(''); - expect(result.stderr.toString()).toContain(`error: unknown option '--unknown'`); - }); + it('it should throw error with wrong params', async () => { + const result = crossSpawn.sync('node', [ + './bin/index.js', + '--input', + './test/spec/v3.json', + '--output', + './test/generated/bin', + '--unknown', + ]); + expect(result.stdout.toString()).toBe(''); + expect(result.stderr.toString()).toContain(`error: unknown option '--unknown'`); + }); - it('it should display help', async () => { - const result = crossSpawn.sync('node', ['./bin/index.js', '--help']); - expect(result.stdout.toString()).toContain(`Usage: openapi [options]`); - expect(result.stdout.toString()).toContain(`-i, --input `); - expect(result.stdout.toString()).toContain(`-o, --output `); - expect(result.stderr.toString()).toBe(''); - }); + it('it should display help', async () => { + const result = crossSpawn.sync('node', ['./bin/index.js', '--help']); + expect(result.stdout.toString()).toContain(`Usage: openapi [options]`); + expect(result.stdout.toString()).toContain(`-i, --input `); + expect(result.stdout.toString()).toContain(`-o, --output `); + expect(result.stderr.toString()).toBe(''); + }); }); diff --git a/biome.json b/biome.json new file mode 100644 index 000000000..d44b2c5d6 --- /dev/null +++ b/biome.json @@ -0,0 +1,23 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": false + }, + "formatter": { + "enabled": true, + "indentWidth": 2, + "indentStyle": "space", + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + }, + "files": { + "ignore": ["/node_modules", "/dist/", "/coverage/"] + } +} diff --git a/jest.config.ts b/jest.config.ts index af04ee15d..8ef598237 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,43 +1,43 @@ import type { Config } from '@jest/types'; const config: Config.InitialOptions = { - projects: [ - { - displayName: 'UNIT', - testEnvironment: 'node', - testMatch: ['/src/**/*.spec.ts', '/test/index.spec.ts', '/bin/index.spec.js'], - moduleFileExtensions: ['js', 'ts', 'd.ts'], - moduleNameMapper: { - '\\.hbs$': '/src/templates/__mocks__/index.ts', - }, - }, - { - displayName: 'E2E', - testEnvironment: 'node', - testMatch: [ - '/test/e2e/v2.fetch.spec.ts', - '/test/e2e/v2.xhr.spec.ts', - '/test/e2e/v2.node.spec.ts', - '/test/e2e/v2.axios.spec.ts', - '/test/e2e/v2.babel.spec.ts', - '/test/e2e/v2.angular.spec.ts', - '/test/e2e/v3.fetch.spec.ts', - '/test/e2e/v3.xhr.spec.ts', - '/test/e2e/v3.node.spec.ts', - '/test/e2e/v3.axios.spec.ts', - '/test/e2e/v3.babel.spec.ts', - '/test/e2e/v3.angular.spec.ts', - '/test/e2e/client.fetch.spec.ts', - '/test/e2e/client.xhr.spec.ts', - '/test/e2e/client.node.spec.ts', - '/test/e2e/client.axios.spec.ts', - '/test/e2e/client.babel.spec.ts', - '/test/e2e/client.angular.spec.ts', - ], - modulePathIgnorePatterns: ['/test/e2e/generated'], - }, - ], - collectCoverageFrom: ['/src/**/*.ts', '!/src/**/*.d.ts', '!/bin', '!/dist'], + projects: [ + { + displayName: 'UNIT', + testEnvironment: 'node', + testMatch: ['/src/**/*.spec.ts', '/test/index.spec.ts', '/bin/index.spec.js'], + moduleFileExtensions: ['js', 'ts', 'd.ts'], + moduleNameMapper: { + '\\.hbs$': '/src/templates/__mocks__/index.ts', + }, + }, + { + displayName: 'E2E', + testEnvironment: 'node', + testMatch: [ + '/test/e2e/v2.fetch.spec.ts', + '/test/e2e/v2.xhr.spec.ts', + '/test/e2e/v2.node.spec.ts', + '/test/e2e/v2.axios.spec.ts', + '/test/e2e/v2.babel.spec.ts', + '/test/e2e/v2.angular.spec.ts', + '/test/e2e/v3.fetch.spec.ts', + '/test/e2e/v3.xhr.spec.ts', + '/test/e2e/v3.node.spec.ts', + '/test/e2e/v3.axios.spec.ts', + '/test/e2e/v3.babel.spec.ts', + '/test/e2e/v3.angular.spec.ts', + '/test/e2e/client.fetch.spec.ts', + '/test/e2e/client.xhr.spec.ts', + '/test/e2e/client.node.spec.ts', + '/test/e2e/client.axios.spec.ts', + '/test/e2e/client.babel.spec.ts', + '/test/e2e/client.angular.spec.ts', + ], + modulePathIgnorePatterns: ['/test/e2e/generated'], + }, + ], + collectCoverageFrom: ['/src/**/*.ts', '!/src/**/*.d.ts', '!/bin', '!/dist'], }; export default config; diff --git a/package.json b/package.json index 61889d567..aa953dcdf 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "@babel/core": "7.23.2", "@babel/preset-env": "7.23.2", "@babel/preset-typescript": "7.23.2", + "@biomejs/biome": "^1.3.3", "@rollup/plugin-commonjs": "25.0.7", "@rollup/plugin-node-resolve": "15.2.3", "@rollup/plugin-typescript": "11.1.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..1aaf33a3e --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,10960 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@majkit/fp-ts-schema': + specifier: ^1.1.1 + version: 1.1.1 + camelcase: + specifier: ^6.3.0 + version: 6.3.0 + commander: + specifier: ^11.0.0 + version: 11.1.0 + fs-extra: + specifier: ^11.1.1 + version: 11.1.1 + handlebars: + specifier: ^4.7.7 + version: 4.7.8 + json-schema-ref-parser: + specifier: ^9.0.9 + version: 9.0.9 + +devDependencies: + '@angular-devkit/build-angular': + specifier: ^16.2.9 + version: 16.2.10(@angular/compiler-cli@16.1.3)(@types/node@20.8.9)(jest@29.7.0)(typescript@5.1.6) + '@angular/animations': + specifier: 16.1.3 + version: 16.1.3(@angular/core@16.1.3) + '@angular/cli': + specifier: 16.1.3 + version: 16.1.3 + '@angular/common': + specifier: 16.1.3 + version: 16.1.3(@angular/core@16.1.3)(rxjs@7.8.1) + '@angular/compiler': + specifier: 16.1.3 + version: 16.1.3(@angular/core@16.1.3) + '@angular/compiler-cli': + specifier: 16.1.3 + version: 16.1.3(@angular/compiler@16.1.3)(typescript@5.1.6) + '@angular/core': + specifier: 16.1.3 + version: 16.1.3(rxjs@7.8.1)(zone.js@0.13.3) + '@angular/forms': + specifier: 16.1.3 + version: 16.1.3(@angular/common@16.1.3)(@angular/core@16.1.3)(@angular/platform-browser@16.1.3)(rxjs@7.8.1) + '@angular/platform-browser': + specifier: 16.1.3 + version: 16.1.3(@angular/animations@16.1.3)(@angular/common@16.1.3)(@angular/core@16.1.3) + '@angular/platform-browser-dynamic': + specifier: 16.1.3 + version: 16.1.3(@angular/common@16.1.3)(@angular/compiler@16.1.3)(@angular/core@16.1.3)(@angular/platform-browser@16.1.3) + '@angular/router': + specifier: 16.1.3 + version: 16.1.3(@angular/common@16.1.3)(@angular/core@16.1.3)(@angular/platform-browser@16.1.3)(rxjs@7.8.1) + '@babel/cli': + specifier: 7.23.0 + version: 7.23.0(@babel/core@7.23.2) + '@babel/core': + specifier: 7.23.2 + version: 7.23.2 + '@babel/preset-env': + specifier: 7.23.2 + version: 7.23.2(@babel/core@7.23.2) + '@babel/preset-typescript': + specifier: 7.23.2 + version: 7.23.2(@babel/core@7.23.2) + '@biomejs/biome': + specifier: ^1.3.3 + version: 1.3.3 + '@rollup/plugin-commonjs': + specifier: 25.0.7 + version: 25.0.7(rollup@3.26.1) + '@rollup/plugin-node-resolve': + specifier: 15.2.3 + version: 15.2.3(rollup@3.26.1) + '@rollup/plugin-typescript': + specifier: 11.1.5 + version: 11.1.5(rollup@3.26.1)(tslib@2.6.2)(typescript@5.1.6) + '@types/cross-spawn': + specifier: 6.0.4 + version: 6.0.4 + '@types/express': + specifier: 4.17.20 + version: 4.17.20 + '@types/fs-extra': + specifier: ^11.0.1 + version: 11.0.4 + '@types/glob': + specifier: 8.1.0 + version: 8.1.0 + '@types/jest': + specifier: 29.5.6 + version: 29.5.6 + '@types/node': + specifier: 20.8.9 + version: 20.8.9 + '@types/node-fetch': + specifier: 2.6.4 + version: 2.6.4 + '@types/qs': + specifier: 6.9.9 + version: 6.9.9 + '@typescript-eslint/eslint-plugin': + specifier: 6.9.0 + version: 6.9.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.1.6) + '@typescript-eslint/parser': + specifier: 6.9.1 + version: 6.9.1(eslint@8.52.0)(typescript@5.1.6) + abort-controller: + specifier: 3.0.0 + version: 3.0.0 + axios: + specifier: 1.6.0 + version: 1.6.0 + codecov: + specifier: 3.8.3 + version: 3.8.3 + cross-spawn: + specifier: 7.0.3 + version: 7.0.3 + eslint: + specifier: 8.52.0 + version: 8.52.0 + eslint-config-prettier: + specifier: 8.10.0 + version: 8.10.0(eslint@8.52.0) + eslint-plugin-prettier: + specifier: 5.0.1 + version: 5.0.1(eslint-config-prettier@8.10.0)(eslint@8.52.0)(prettier@3.0.3) + eslint-plugin-simple-import-sort: + specifier: 10.0.0 + version: 10.0.0(eslint@8.52.0) + express: + specifier: 4.18.2 + version: 4.18.2 + form-data: + specifier: 4.0.0 + version: 4.0.0 + glob: + specifier: 10.3.10 + version: 10.3.10 + jest: + specifier: 29.7.0 + version: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + jest-cli: + specifier: 29.7.0 + version: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + node-fetch: + specifier: 2.6.9 + version: 2.6.9 + prettier: + specifier: 3.0.3 + version: 3.0.3 + puppeteer: + specifier: 20.9.0 + version: 20.9.0(typescript@5.1.6) + qs: + specifier: 6.11.2 + version: 6.11.2 + rimraf: + specifier: 5.0.5 + version: 5.0.5 + rollup: + specifier: 3.26.1 + version: 3.26.1 + rollup-plugin-terser: + specifier: 7.0.2 + version: 7.0.2(rollup@3.26.1) + rxjs: + specifier: 7.8.1 + version: 7.8.1 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@20.8.9)(typescript@5.1.6) + tslib: + specifier: 2.6.2 + version: 2.6.2 + typescript: + specifier: 5.1.6 + version: 5.1.6 + zone.js: + specifier: 0.13.3 + version: 0.13.3 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@angular-devkit/architect@0.1601.3: + resolution: {integrity: sha512-HvW51cCEoIYe2mYqcmnm2RZiMMFbFn7iIdsjbCJe7etFhcG+Y3hGDZMh4IFSiQiss+pwPSYOvQY2zwGrndMgLw==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 16.1.3 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + dev: true + + /@angular-devkit/architect@0.1602.10(chokidar@3.5.3): + resolution: {integrity: sha512-FwemQXh3edqA/S6zPpsqKei5v7gt0R0WpjJoAJaz+FOpfDwij1fwnKr88XINY8xcefTcQaTDQxJZheJShA/hHw==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 16.2.10(chokidar@3.5.3) + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + dev: true + + /@angular-devkit/build-angular@16.2.10(@angular/compiler-cli@16.1.3)(@types/node@20.8.9)(jest@29.7.0)(typescript@5.1.6): + resolution: {integrity: sha512-msB/qjIsAOySDxdU5DpcX2sWGUEJOFIO03O9+HbtLwf3NDfe74mFfejxuKlHJXIJdgpM2Zc948M6+618QKpUYA==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler-cli': ^16.0.0 + '@angular/localize': ^16.0.0 + '@angular/platform-server': ^16.0.0 + '@angular/service-worker': ^16.0.0 + jest: ^29.5.0 + jest-environment-jsdom: ^29.5.0 + karma: ^6.3.0 + ng-packagr: ^16.0.0 + protractor: ^7.0.0 + tailwindcss: ^2.0.0 || ^3.0.0 + typescript: '>=4.9.3 <5.2' + peerDependenciesMeta: + '@angular/localize': + optional: true + '@angular/platform-server': + optional: true + '@angular/service-worker': + optional: true + jest: + optional: true + jest-environment-jsdom: + optional: true + karma: + optional: true + ng-packagr: + optional: true + protractor: + optional: true + tailwindcss: + optional: true + dependencies: + '@ampproject/remapping': 2.2.1 + '@angular-devkit/architect': 0.1602.10(chokidar@3.5.3) + '@angular-devkit/build-webpack': 0.1602.10(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.88.2) + '@angular-devkit/core': 16.2.10(chokidar@3.5.3) + '@angular/compiler-cli': 16.1.3(@angular/compiler@16.1.3)(typescript@5.1.6) + '@babel/core': 7.22.9 + '@babel/generator': 7.22.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.9) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-runtime': 7.22.9(@babel/core@7.22.9) + '@babel/preset-env': 7.22.9(@babel/core@7.22.9) + '@babel/runtime': 7.22.6 + '@babel/template': 7.22.5 + '@discoveryjs/json-ext': 0.5.7 + '@ngtools/webpack': 16.2.10(@angular/compiler-cli@16.1.3)(typescript@5.1.6)(webpack@5.88.2) + '@vitejs/plugin-basic-ssl': 1.0.1(vite@4.4.7) + ansi-colors: 4.1.3 + autoprefixer: 10.4.14(postcss@8.4.31) + babel-loader: 9.1.3(@babel/core@7.22.9)(webpack@5.88.2) + babel-plugin-istanbul: 6.1.1 + browserslist: 4.22.1 + chokidar: 3.5.3 + copy-webpack-plugin: 11.0.0(webpack@5.88.2) + critters: 0.0.20 + css-loader: 6.8.1(webpack@5.88.2) + esbuild-wasm: 0.18.17 + fast-glob: 3.3.1 + guess-parser: 0.4.22(typescript@5.1.6) + https-proxy-agent: 5.0.1 + inquirer: 8.2.4 + jest: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + jsonc-parser: 3.2.0 + karma-source-map-support: 1.4.0 + less: 4.1.3 + less-loader: 11.1.0(less@4.1.3)(webpack@5.88.2) + license-webpack-plugin: 4.0.2(webpack@5.88.2) + loader-utils: 3.2.1 + magic-string: 0.30.1 + mini-css-extract-plugin: 2.7.6(webpack@5.88.2) + mrmime: 1.0.1 + open: 8.4.2 + ora: 5.4.1 + parse5-html-rewriting-stream: 7.0.0 + picomatch: 2.3.1 + piscina: 4.0.0 + postcss: 8.4.31 + postcss-loader: 7.3.3(postcss@8.4.31)(typescript@5.1.6)(webpack@5.88.2) + resolve-url-loader: 5.0.0 + rxjs: 7.8.1 + sass: 1.64.1 + sass-loader: 13.3.2(sass@1.64.1)(webpack@5.88.2) + semver: 7.5.4 + source-map-loader: 4.0.1(webpack@5.88.2) + source-map-support: 0.5.21 + terser: 5.19.2 + text-table: 0.2.0 + tree-kill: 1.2.2 + tslib: 2.6.1 + typescript: 5.1.6 + vite: 4.4.7(@types/node@20.8.9)(less@4.1.3)(sass@1.64.1)(terser@5.19.2) + webpack: 5.88.2(esbuild@0.18.17) + webpack-dev-middleware: 6.1.1(webpack@5.88.2) + webpack-dev-server: 4.15.1(webpack@5.88.2) + webpack-merge: 5.9.0 + webpack-subresource-integrity: 5.1.0(webpack@5.88.2) + optionalDependencies: + esbuild: 0.18.17 + transitivePeerDependencies: + - '@swc/core' + - '@types/node' + - bufferutil + - canvas + - debug + - fibers + - html-webpack-plugin + - lightningcss + - node-sass + - sass-embedded + - stylus + - sugarss + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + dev: true + + /@angular-devkit/build-webpack@0.1602.10(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.88.2): + resolution: {integrity: sha512-H7HiFKbZl/xVxpr1RH05SGawTpA1417wvr2nFGRu2OiePd0lPr6pIhcq8F8gt7JcA8yZKKaqjn2gU+6um2MFLg==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + webpack: ^5.30.0 + webpack-dev-server: ^4.0.0 + dependencies: + '@angular-devkit/architect': 0.1602.10(chokidar@3.5.3) + rxjs: 7.8.1 + webpack: 5.88.2(esbuild@0.18.17) + webpack-dev-server: 4.15.1(webpack@5.88.2) + transitivePeerDependencies: + - chokidar + dev: true + + /@angular-devkit/core@16.1.3: + resolution: {integrity: sha512-cFhNdJHumNMZGD3NYxOtNuMGRQXeDnKbwvK+IJmKAttXt8na6EvURR/ZxZOI7rl/YRVX+vcNSdtXz3hE6g+Isw==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + jsonc-parser: 3.2.0 + rxjs: 7.8.1 + source-map: 0.7.4 + dev: true + + /@angular-devkit/core@16.2.10(chokidar@3.5.3): + resolution: {integrity: sha512-eo7suLDjyu5bSlEr4TluYkFm4v2PVLSAPgnau8XHHlN5Yg4P/BZ00ve7LA7C9S1gzRSCrxQhK5ki4rnoFTo5zg==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + chokidar: 3.5.3 + jsonc-parser: 3.2.0 + picomatch: 2.3.1 + rxjs: 7.8.1 + source-map: 0.7.4 + dev: true + + /@angular-devkit/schematics@16.1.3: + resolution: {integrity: sha512-hWEuQnfQOgcSs4YX6iF4QR/34ROeSPaMi7lQOYg33hStg+pnk/JDdIU0f2nrIIz3t0jqAj+5VXVLBJvOCd84vg==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 16.1.3 + jsonc-parser: 3.2.0 + magic-string: 0.30.0 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + dev: true + + /@angular/animations@16.1.3(@angular/core@16.1.3): + resolution: {integrity: sha512-ET6ahrlbOyTYXOTouKs2VJxx0CMTrYkfz0HfI6IHnSKBC6wguDxXYnamMouHgrCkDDEB5qClfGHyS9se0AOX4w==} + engines: {node: ^16.14.0 || >=18.10.0} + peerDependencies: + '@angular/core': 16.1.3 + dependencies: + '@angular/core': 16.1.3(rxjs@7.8.1)(zone.js@0.13.3) + tslib: 2.6.2 + dev: true + + /@angular/cli@16.1.3: + resolution: {integrity: sha512-D0gU12z/N2oJ+s6pggAnWYrTUZ+2duGb3Y5oUyClsubz7JWpAwHjSZpb8exPUrgYhr+qIEMGO685y1JazJQ2tA==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + dependencies: + '@angular-devkit/architect': 0.1601.3 + '@angular-devkit/core': 16.1.3 + '@angular-devkit/schematics': 16.1.3 + '@schematics/angular': 16.1.3 + '@yarnpkg/lockfile': 1.1.0 + ansi-colors: 4.1.3 + ini: 4.1.1 + inquirer: 8.2.4 + jsonc-parser: 3.2.0 + npm-package-arg: 10.1.0 + npm-pick-manifest: 8.0.1 + open: 8.4.2 + ora: 5.4.1 + pacote: 15.2.0 + resolve: 1.22.2 + semver: 7.5.3 + symbol-observable: 4.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - bluebird + - chokidar + - supports-color + dev: true + + /@angular/common@16.1.3(@angular/core@16.1.3)(rxjs@7.8.1): + resolution: {integrity: sha512-ZzJ6EwQHUkiZYV0zH/UxyUYW5uxomsyk7tdtqZIxAR5m2ktYkQ5XlqgPjBO8voF54Rs5Ot43RkPCLesbZyJDsw==} + engines: {node: ^16.14.0 || >=18.10.0} + peerDependencies: + '@angular/core': 16.1.3 + rxjs: ^6.5.3 || ^7.4.0 + dependencies: + '@angular/core': 16.1.3(rxjs@7.8.1)(zone.js@0.13.3) + rxjs: 7.8.1 + tslib: 2.6.2 + dev: true + + /@angular/compiler-cli@16.1.3(@angular/compiler@16.1.3)(typescript@5.1.6): + resolution: {integrity: sha512-aUqnIV9rRTBNgiQRS0Gv6lhghaGj1vpVRyXgiE4VnTR9uBONSsGKMNALYBBhXRTSk2e0cvutt0ubLgmNpdyWyQ==} + engines: {node: ^16.14.0 || >=18.10.0} + hasBin: true + peerDependencies: + '@angular/compiler': 16.1.3 + typescript: '>=4.9.3 <5.2' + dependencies: + '@angular/compiler': 16.1.3(@angular/core@16.1.3) + '@babel/core': 7.22.5 + '@jridgewell/sourcemap-codec': 1.4.15 + chokidar: 3.5.3 + convert-source-map: 1.9.0 + reflect-metadata: 0.1.13 + semver: 7.5.4 + tslib: 2.6.2 + typescript: 5.1.6 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@angular/compiler@16.1.3(@angular/core@16.1.3): + resolution: {integrity: sha512-7Ckvssk9+s5xLyXvp72IwAw5vd/Osa3tR6oiQatdbw+O3XjLO04QycoGXwkp/fYVexGsjFyOn6QJ5n1F/PYPbQ==} + engines: {node: ^16.14.0 || >=18.10.0} + peerDependencies: + '@angular/core': 16.1.3 + peerDependenciesMeta: + '@angular/core': + optional: true + dependencies: + '@angular/core': 16.1.3(rxjs@7.8.1)(zone.js@0.13.3) + tslib: 2.6.2 + dev: true + + /@angular/core@16.1.3(rxjs@7.8.1)(zone.js@0.13.3): + resolution: {integrity: sha512-yhRo9hVS8KhfcEgzciWuRWF4Pnnko98bmSJTqd7u8Kys6z3Uj0qgXMssXHIPUALe3mQKjVkdSZPLIZ9/CaVn/Q==} + engines: {node: ^16.14.0 || >=18.10.0} + peerDependencies: + rxjs: ^6.5.3 || ^7.4.0 + zone.js: ~0.13.0 + dependencies: + rxjs: 7.8.1 + tslib: 2.6.2 + zone.js: 0.13.3 + dev: true + + /@angular/forms@16.1.3(@angular/common@16.1.3)(@angular/core@16.1.3)(@angular/platform-browser@16.1.3)(rxjs@7.8.1): + resolution: {integrity: sha512-9tJHgoi/Jmeo30zfnReVZWFcd1WthR+QwYUNwPev+ys58u1mB0cDGORvROySmC2YUyXFSpXt8sxwyWCkYvaV2w==} + engines: {node: ^16.14.0 || >=18.10.0} + peerDependencies: + '@angular/common': 16.1.3 + '@angular/core': 16.1.3 + '@angular/platform-browser': 16.1.3 + rxjs: ^6.5.3 || ^7.4.0 + dependencies: + '@angular/common': 16.1.3(@angular/core@16.1.3)(rxjs@7.8.1) + '@angular/core': 16.1.3(rxjs@7.8.1)(zone.js@0.13.3) + '@angular/platform-browser': 16.1.3(@angular/animations@16.1.3)(@angular/common@16.1.3)(@angular/core@16.1.3) + rxjs: 7.8.1 + tslib: 2.6.2 + dev: true + + /@angular/platform-browser-dynamic@16.1.3(@angular/common@16.1.3)(@angular/compiler@16.1.3)(@angular/core@16.1.3)(@angular/platform-browser@16.1.3): + resolution: {integrity: sha512-UHxSWpPB5+FSv8zm8T+4ZikLqyy+VE6GlOLp/DdgEz77j81rz2C1pMqozwTnVbD16XbI4rhTp+RFY3C9ArWOtw==} + engines: {node: ^16.14.0 || >=18.10.0} + peerDependencies: + '@angular/common': 16.1.3 + '@angular/compiler': 16.1.3 + '@angular/core': 16.1.3 + '@angular/platform-browser': 16.1.3 + dependencies: + '@angular/common': 16.1.3(@angular/core@16.1.3)(rxjs@7.8.1) + '@angular/compiler': 16.1.3(@angular/core@16.1.3) + '@angular/core': 16.1.3(rxjs@7.8.1)(zone.js@0.13.3) + '@angular/platform-browser': 16.1.3(@angular/animations@16.1.3)(@angular/common@16.1.3)(@angular/core@16.1.3) + tslib: 2.6.2 + dev: true + + /@angular/platform-browser@16.1.3(@angular/animations@16.1.3)(@angular/common@16.1.3)(@angular/core@16.1.3): + resolution: {integrity: sha512-qZA6Lua2fpBe+KD/QArY/4hilypSZFcTcJsPjZwIzo5pavXqYDI8BVghwh5dcZoUa56hVRDJjv+XW6kl8m9Tdw==} + engines: {node: ^16.14.0 || >=18.10.0} + peerDependencies: + '@angular/animations': 16.1.3 + '@angular/common': 16.1.3 + '@angular/core': 16.1.3 + peerDependenciesMeta: + '@angular/animations': + optional: true + dependencies: + '@angular/animations': 16.1.3(@angular/core@16.1.3) + '@angular/common': 16.1.3(@angular/core@16.1.3)(rxjs@7.8.1) + '@angular/core': 16.1.3(rxjs@7.8.1)(zone.js@0.13.3) + tslib: 2.6.2 + dev: true + + /@angular/router@16.1.3(@angular/common@16.1.3)(@angular/core@16.1.3)(@angular/platform-browser@16.1.3)(rxjs@7.8.1): + resolution: {integrity: sha512-bkn8cWGBKKZidDaP+R7g/S/6miSfH8iP24d2k86Awo+vaO+7G/5WWGfKJMKK8UNM/A5ueX6ugAZrMHpQ9e6Y4w==} + engines: {node: ^16.14.0 || >=18.10.0} + peerDependencies: + '@angular/common': 16.1.3 + '@angular/core': 16.1.3 + '@angular/platform-browser': 16.1.3 + rxjs: ^6.5.3 || ^7.4.0 + dependencies: + '@angular/common': 16.1.3(@angular/core@16.1.3)(rxjs@7.8.1) + '@angular/core': 16.1.3(rxjs@7.8.1)(zone.js@0.13.3) + '@angular/platform-browser': 16.1.3(@angular/animations@16.1.3)(@angular/common@16.1.3)(@angular/core@16.1.3) + rxjs: 7.8.1 + tslib: 2.6.2 + dev: true + + /@apidevtools/json-schema-ref-parser@9.0.9: + resolution: {integrity: sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==} + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + call-me-maybe: 1.0.2 + js-yaml: 4.1.0 + dev: false + + /@assemblyscript/loader@0.10.1: + resolution: {integrity: sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==} + dev: true + + /@babel/cli@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@jridgewell/trace-mapping': 0.3.20 + commander: 4.1.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.5.3 + dev: true + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.3: + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.22.5: + resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.5) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.3 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.22.9: + resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.9 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.9) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.3 + '@babel/template': 7.22.5 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.3 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.9: + resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/generator@7.23.3: + resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.9): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.22.9): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.22.9): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.22.5): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.22.9): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.22.9): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.3 + dev: true + + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.23.3: + resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.9): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + dev: true + + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.9): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.9): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.9): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.9): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.9): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.9): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.9): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.9): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.9): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-async-generator-functions@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-static-block@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-class-static-block@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-classes@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.9) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-classes@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-dynamic-import@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-export-namespace-from@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-for-of@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-for-of@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-json-strings@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-json-strings@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.9): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-numeric-separator@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-numeric-separator@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-property-in-object@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) + dev: true + + /@babel/plugin-transform-private-property-in-object@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-runtime@7.22.9(@babel/core@7.22.9): + resolution: {integrity: sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.22.9) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.22.9) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.22.9) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typescript@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.2) + dev: true + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.22.9): + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.22.9(@babel/core@7.22.9): + resolution: {integrity: sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.9) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-async-generator-functions': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-block-scoping': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-class-static-block': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-classes': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-dynamic-import': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-export-namespace-from': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-for-of': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-json-strings': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-logical-assignment-operators': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-numeric-separator': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-object-rest-spread': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-optional-catch-binding': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-optional-chaining': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-private-property-in-object': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.22.9) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.22.9) + '@babel/preset-modules': 0.1.6(@babel/core@7.22.9) + '@babel/types': 7.23.3 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.22.9) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.22.9) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.22.9) + core-js-compat: 3.33.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-env@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-async-generator-functions': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-block-scoping': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-class-static-block': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-classes': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-dynamic-import': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-export-namespace-from': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-for-of': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-json-strings': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-logical-assignment-operators': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-numeric-separator': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-object-rest-spread': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-optional-catch-binding': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-optional-chaining': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-private-property-in-object': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) + '@babel/types': 7.23.3 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.6(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) + core-js-compat: 3.33.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6(@babel/core@7.22.9): + resolution: {integrity: sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.9) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.22.9) + '@babel/types': 7.23.3 + esutils: 2.0.3 + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.3 + esutils: 2.0.3 + dev: true + + /@babel/preset-typescript@7.23.2(@babel/core@7.23.2): + resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.23.3(@babel/core@7.23.2) + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + dev: true + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + dev: true + + /@babel/traverse@7.23.3: + resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.3: + resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@biomejs/biome@1.3.3: + resolution: {integrity: sha512-vTJn7RBzLWIabUuUIoEopO860YyBrbPEu4Pztfd28jRU5QD074hKZ9IQs24pFO6A2R296gaeYmN62f4u7pUruQ==} + engines: {node: '>=14.*'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.3.3 + '@biomejs/cli-darwin-x64': 1.3.3 + '@biomejs/cli-linux-arm64': 1.3.3 + '@biomejs/cli-linux-x64': 1.3.3 + '@biomejs/cli-win32-arm64': 1.3.3 + '@biomejs/cli-win32-x64': 1.3.3 + dev: true + + /@biomejs/cli-darwin-arm64@1.3.3: + resolution: {integrity: sha512-2X87ZfbmWwe4NGukrUvnoYdI//muSgjNUCAHJ2DO+kS1sB7kDy1s6PN/IYyTJuqRcJtDuOnSpaUDE7KxR1YhtA==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-darwin-x64@1.3.3: + resolution: {integrity: sha512-t+7DWTCbSgHOBcPsGKuwS1qh1z9zbXFK8i8ktE18yW7iF/W0zI62k44fYqYeFJKlb0Q08aqUvez3L+AQJFsn+w==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64@1.3.3: + resolution: {integrity: sha512-D8CvXaB8lkXXBQ6B3n0MXSSZFiE60+aNHorBLimVTtKiMod8QvAP425oQFZFul5wMXZqPLGTKFjXbAi/rvnc1A==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64@1.3.3: + resolution: {integrity: sha512-bqB05fwJnRZwRlcm/BS/s4qPickqiXZkiU/nOYvHApfsPeqgSHgv5HWoBYuSUjgqBbX3XZJArsC5dCcVW7vAJw==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-arm64@1.3.3: + resolution: {integrity: sha512-muFOjAv1ONMfaJDlo4Ds+Qb9lkdSLM2XaxOe3AJPejSq3Vi0aRr51ZnE02BofMnL2sVsOA9cO54wibsuTcopbw==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-x64@1.3.3: + resolution: {integrity: sha512-PMkMhS4smmmTMflxuZUx3REFSazEL9xsGscvZO1dKWI4ET23la+KxEM4TlSpjOyO66UerqSkuUlZecn0QhD63A==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@esbuild/android-arm64@0.18.17: + resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.17: + resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.17: + resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.17: + resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.17: + resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.17: + resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.17: + resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.17: + resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.17: + resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.17: + resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.17: + resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.17: + resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.17: + resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.17: + resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.17: + resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.17: + resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.17: + resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.17: + resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.17: + resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.17: + resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.17: + resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.17: + resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.52.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/core@29.7.0(ts-node@10.9.1): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + jest-mock: 29.7.0 + dev: true + + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.8.9 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.20 + '@types/node': 20.8.9 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.23.2 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.20 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.8.9 + '@types/yargs': 17.0.31 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: false + + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + dev: true + + /@majkit/fp-ts-schema@1.1.1: + resolution: {integrity: sha512-ldFsUOuBgCjRs872T0/PdLAKA9ZX3M3yuD2nCDIcFDe2HBxG0a4E+O+uiGWLudJkkQdwKXNKdBwzBSGAP5ys9w==} + dependencies: + fp-ts: 2.16.1 + schemawax: 1.0.12 + dev: false + + /@ngtools/webpack@16.2.10(@angular/compiler-cli@16.1.3)(typescript@5.1.6)(webpack@5.88.2): + resolution: {integrity: sha512-XAVn59zP3ztuKDtw92Xc9+64RK4u4c9g8y5GgtjIWeOwgNXl8bYhAo3uTZzrSrOu96DFZGjsmghFab/7/C2pDg==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler-cli': ^16.0.0 + typescript: '>=4.9.3 <5.2' + webpack: ^5.54.0 + dependencies: + '@angular/compiler-cli': 16.1.3(@angular/compiler@16.1.3)(typescript@5.1.6) + typescript: 5.1.6 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + requiresBuild: true + dev: true + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@npmcli/fs@2.1.2: + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.3 + dev: true + + /@npmcli/fs@3.1.0: + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.3 + dev: true + + /@npmcli/git@4.1.0: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.1 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.3 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents@2.0.2: + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/move-file@2.0.1: + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/promise-spawn@6.0.2: + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + which: 3.0.1 + dev: true + + /@npmcli/run-script@6.0.2: + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.1 + read-package-json-fast: 3.0.2 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + + /@puppeteer/browsers@1.4.6(typescript@5.1.6): + resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} + engines: {node: '>=16.3.0'} + hasBin: true + peerDependencies: + typescript: '>= 4.7.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.3.0 + tar-fs: 3.0.4 + typescript: 5.1.6 + unbzip2-stream: 1.4.3 + yargs: 17.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@rollup/plugin-commonjs@25.0.7(rollup@3.26.1): + resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.26.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.30.5 + rollup: 3.26.1 + dev: true + + /@rollup/plugin-node-resolve@15.2.3(rollup@3.26.1): + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.26.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 3.26.1 + dev: true + + /@rollup/plugin-typescript@11.1.5(rollup@3.26.1)(tslib@2.6.2)(typescript@5.1.6): + resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@3.26.1) + resolve: 1.22.8 + rollup: 3.26.1 + tslib: 2.6.2 + typescript: 5.1.6 + dev: true + + /@rollup/pluginutils@5.0.5(rollup@3.26.1): + resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.26.1 + dev: true + + /@schematics/angular@16.1.3: + resolution: {integrity: sha512-bNSxCLf6f+/dsQ1k3PhcZhrC/qgJSCpM6h3m6ATpjR+tYW/v7WR1OyE5r3DQmDe7NJSazBvpbrRtg8xjRsMzvw==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 16.1.3 + '@angular-devkit/schematics': 16.1.3 + jsonc-parser: 3.2.0 + transitivePeerDependencies: + - chokidar + dev: true + + /@sigstore/bundle@1.1.0: + resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sigstore/protobuf-specs@0.2.1: + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@sigstore/sign@1.0.0: + resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 1.1.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf@1.0.3: + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 1.1.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: true + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + dev: true + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@tufjs/canonical-json@1.0.0: + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@tufjs/models@1.0.4: + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/canonical-json': 1.0.0 + minimatch: 9.0.3 + dev: true + + /@types/babel__core@7.20.4: + resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==} + dependencies: + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + '@types/babel__generator': 7.6.7 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.4 + dev: true + + /@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + dev: true + + /@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.8.9 + dev: true + + /@types/bonjour@3.5.13: + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/connect-history-api-fallback@1.5.3: + resolution: {integrity: sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==} + dependencies: + '@types/express-serve-static-core': 4.17.41 + '@types/node': 20.8.9 + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/cross-spawn@6.0.4: + resolution: {integrity: sha512-GGLpeThc2Bu8FBGmVn76ZU3lix17qZensEI4/MPty0aZpm2CHfgEMis31pf5X5EiudYKcPAsWciAsCALoPo5dw==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.44.7 + '@types/estree': 1.0.5 + dev: true + + /@types/eslint@8.44.7: + resolution: {integrity: sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/express-serve-static-core@4.17.41: + resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + dependencies: + '@types/node': 20.8.9 + '@types/qs': 6.9.9 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.20: + resolution: {integrity: sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.41 + '@types/qs': 6.9.9 + '@types/serve-static': 1.15.5 + dev: true + + /@types/fs-extra@11.0.4: + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 20.8.9 + dev: true + + /@types/glob@8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.8.9 + dev: true + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true + + /@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@29.5.6: + resolution: {integrity: sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/jsonfile@6.1.4: + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true + + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/node-fetch@2.6.4: + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + dependencies: + '@types/node': 20.8.9 + form-data: 3.0.1 + dev: true + + /@types/node-forge@1.3.9: + resolution: {integrity: sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/node@20.8.9: + resolution: {integrity: sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/qs@6.9.9: + resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} + dev: true + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: true + + /@types/semver@7.5.5: + resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} + dev: true + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.8.9 + dev: true + + /@types/serve-index@1.9.4: + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + dependencies: + '@types/express': 4.17.20 + dev: true + + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.8.9 + dev: true + + /@types/sockjs@0.3.36: + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/ws@8.5.9: + resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} + dependencies: + '@types/node': 20.8.9 + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@17.0.31: + resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 20.8.9 + dev: true + optional: true + + /@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.1.6): + resolution: {integrity: sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/type-utils': 6.9.0(eslint@8.52.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.9.0 + debug: 4.3.4 + eslint: 8.52.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.9.1(eslint@8.52.0)(typescript@5.1.6): + resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.9.1 + debug: 4.3.4 + eslint: 8.52.0 + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.9.0: + resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/visitor-keys': 6.9.0 + dev: true + + /@typescript-eslint/scope-manager@6.9.1: + resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 + dev: true + + /@typescript-eslint/type-utils@6.9.0(eslint@8.52.0)(typescript@5.1.6): + resolution: {integrity: sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.1.6) + '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.52.0 + ts-api-utils: 1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.9.0: + resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/types@6.9.1: + resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.6): + resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/visitor-keys': 6.9.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@6.9.1(typescript@5.1.6): + resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.9.0(eslint@8.52.0)(typescript@5.1.6): + resolution: {integrity: sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.5 + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.1.6) + eslint: 8.52.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.9.0: + resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@6.9.1: + resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.9.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vitejs/plugin-basic-ssl@1.0.1(vite@4.4.7): + resolution: {integrity: sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==} + engines: {node: '>=14.6.0'} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 + dependencies: + vite: 4.4.7(@types/node@20.8.9)(less@4.1.3)(sass@1.64.1)(terser@5.19.2) + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@wessberg/ts-evaluator@0.0.27(typescript@5.1.6): + resolution: {integrity: sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==} + engines: {node: '>=10.1.0'} + deprecated: this package has been renamed to ts-evaluator. Please install ts-evaluator instead + peerDependencies: + typescript: '>=3.2.x || >= 4.x' + dependencies: + chalk: 4.1.2 + jsdom: 16.7.0 + object-path: 0.11.8 + tslib: 2.6.2 + typescript: 5.1.6 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /@yarnpkg/lockfile@1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.11.2): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /adjust-sourcemap-loader@4.0.0: + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} + dependencies: + loader-utils: 2.0.4 + regex-parser: 2.2.11 + dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv-keywords@5.1.0(ajv@8.12.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /argv@0.0.2: + resolution: {integrity: sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==} + engines: {node: '>=0.6.10'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /array-flatten@2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.6.2 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /autoprefixer@10.4.14(postcss@8.4.31): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001561 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: true + + /axios@1.6.0: + resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: true + + /babel-jest@29.7.0(@babel/core@7.23.2): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.23.2 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.4 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.23.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-loader@9.1.3(@babel/core@7.22.9)(webpack@5.88.2): + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.22.9 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.3 + '@types/babel__core': 7.20.4 + '@types/babel__traverse': 7.20.4 + dev: true + + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.22.9): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/core': 7.22.9 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.9) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.22.9): + resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.9) + core-js-compat: 3.33.2 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.8.6(@babel/core@7.23.2): + resolution: {integrity: sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + core-js-compat: 3.33.2 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.22.9): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.9) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.23.2): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /basic-ftp@5.0.3: + resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} + engines: {node: '>=10.0.0'} + dev: true + + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: true + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bonjour-service@1.1.1: + resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + dependencies: + array-flatten: 2.1.2 + dns-equal: 1.0.0 + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001561 + electron-to-chromium: 1.4.581 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.3 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.2.0 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.3 + glob: 10.3.10 + lru-cache: 7.18.3 + minipass: 7.0.4 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.5 + tar: 6.2.0 + unique-filename: 3.0.0 + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: true + + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /caniuse-lite@1.0.30001561: + resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): + resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==} + peerDependencies: + devtools-protocol: '*' + dependencies: + devtools-protocol: 0.0.1147663 + mitt: 3.0.0 + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: '>=6'} + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /codecov@3.8.3: + resolution: {integrity: sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==} + engines: {node: '>=4.0'} + deprecated: https://about.codecov.io/blog/codecov-uploader-deprecation-plan/ + hasBin: true + dependencies: + argv: 0.0.2 + ignore-walk: 3.0.4 + js-yaml: 3.14.1 + teeny-request: 7.1.1 + urlgrey: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + dev: true + + /copy-webpack-plugin@11.0.0(webpack@5.88.2): + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + dependencies: + fast-glob: 3.3.1 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + serialize-javascript: 6.0.1 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /core-js-compat@3.33.2: + resolution: {integrity: sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==} + dependencies: + browserslist: 4.22.1 + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /cosmiconfig@8.3.6(typescript@5.1.6): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.1.6 + dev: true + + /create-jest@29.7.0(@types/node@20.8.9)(ts-node@10.9.1): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /critters@0.0.20: + resolution: {integrity: sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==} + dependencies: + chalk: 4.1.2 + css-select: 5.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + htmlparser2: 8.0.2 + postcss: 8.4.31 + pretty-bytes: 5.6.0 + dev: true + + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /css-loader@6.8.1(webpack@5.88.2): + resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) + postcss-modules-scope: 3.0.0(postcss@8.4.31) + postcss-modules-values: 4.0.0(postcss@8.4.31) + postcss-value-parser: 4.2.0 + semver: 7.5.4 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /data-uri-to-buffer@6.0.1: + resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} + engines: {node: '>= 14'} + dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + optional: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + + /default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + + /devtools-protocol@0.0.1147663: + resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /dns-equal@1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + dev: true + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-to-chromium@1.4.581: + resolution: {integrity: sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==} + dev: true + + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true + optional: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: true + optional: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + dev: true + + /esbuild-wasm@0.18.17: + resolution: {integrity: sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==} + engines: {node: '>=12'} + hasBin: true + dev: true + + /esbuild@0.18.17: + resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.17 + '@esbuild/android-arm64': 0.18.17 + '@esbuild/android-x64': 0.18.17 + '@esbuild/darwin-arm64': 0.18.17 + '@esbuild/darwin-x64': 0.18.17 + '@esbuild/freebsd-arm64': 0.18.17 + '@esbuild/freebsd-x64': 0.18.17 + '@esbuild/linux-arm': 0.18.17 + '@esbuild/linux-arm64': 0.18.17 + '@esbuild/linux-ia32': 0.18.17 + '@esbuild/linux-loong64': 0.18.17 + '@esbuild/linux-mips64el': 0.18.17 + '@esbuild/linux-ppc64': 0.18.17 + '@esbuild/linux-riscv64': 0.18.17 + '@esbuild/linux-s390x': 0.18.17 + '@esbuild/linux-x64': 0.18.17 + '@esbuild/netbsd-x64': 0.18.17 + '@esbuild/openbsd-x64': 0.18.17 + '@esbuild/sunos-x64': 0.18.17 + '@esbuild/win32-arm64': 0.18.17 + '@esbuild/win32-ia32': 0.18.17 + '@esbuild/win32-x64': 0.18.17 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@8.10.0(eslint@8.52.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.52.0 + dev: true + + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@8.10.0)(eslint@8.52.0)(prettier@3.0.3): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.52.0 + eslint-config-prettier: 8.10.0(eslint@8.52.0) + prettier: 3.0.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 + dev: true + + /eslint-plugin-simple-import-sort@10.0.0(eslint@8.52.0): + resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 8.52.0 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + + /eventemitter-asyncresource@1.0.0: + resolution: {integrity: sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + dev: true + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-url-parser@1.1.3: + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + dependencies: + punycode: 1.4.1 + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fp-ts@2.16.1: + resolution: {integrity: sha512-by7U5W8dkIzcvDofUcO42yl9JbnHTEDBrzu3pt5fKT+Z4Oy85I21K80EYJYdjQGC2qum4Vo55Ag57iiIK4FYuA==} + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + dev: true + + /fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + dev: true + + /fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-uri@6.0.2: + resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} + engines: {node: '>= 14'} + dependencies: + basic-ftp: 5.0.3 + data-uri-to-buffer: 6.0.1 + debug: 4.3.4 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /guess-parser@0.4.22(typescript@5.1.6): + resolution: {integrity: sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==} + peerDependencies: + typescript: '>=3.7.5' + dependencies: + '@wessberg/ts-evaluator': 0.0.27(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /hdr-histogram-js@2.0.3: + resolution: {integrity: sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==} + dependencies: + '@assemblyscript/loader': 0.10.1 + base64-js: 1.5.1 + pako: 1.0.11 + dev: true + + /hdr-histogram-percentiles-obj@3.0.0: + resolution: {integrity: sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==} + dev: true + + /hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + lru-cache: 7.18.3 + dev: true + + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: true + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-entities@2.4.0: + resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: true + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: true + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-middleware@2.0.6(@types/express@4.17.20): + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.20 + '@types/http-proxy': 1.17.14 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.5 + transitivePeerDependencies: + - debug + dev: true + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.3 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /icss-utils@5.1.0(postcss@8.4.31): + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.31 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-walk@3.0.4: + resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} + dependencies: + minimatch: 3.1.2 + dev: true + + /ignore-walk@6.0.3: + resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.3 + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /immutable@4.3.4: + resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /inquirer@8.2.4: + resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: true + + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /ipaddr.js@2.1.0: + resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} + engines: {node: '>= 10'} + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.5 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.23.2 + '@babel/parser': 7.23.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@6.0.1: + resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.2 + '@babel/parser': 7.23.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.1 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.0.4 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-cli@29.7.0(@types/node@20.8.9)(ts-node@10.9.1): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jest-config@29.7.0(@types/node@20.8.9)(ts-node@10.9.1): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + babel-jest: 29.7.0(@babel/core@7.23.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@20.8.9)(typescript@5.1.6) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.8.9 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.22.13 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + jest-util: 29.7.0 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.7.0 + dev: true + + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.23.2 + '@babel/generator': 7.23.3 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.2) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.2) + '@babel/types': 7.23.3 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + dev: true + + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + dev: true + + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.8.9 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.8.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 20.8.9 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.7.0(@types/node@20.8.9)(ts-node@10.9.1): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.11.2 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /json-schema-ref-parser@9.0.9: + resolution: {integrity: sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==} + engines: {node: '>=10'} + deprecated: Please switch to @apidevtools/json-schema-ref-parser + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.9 + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /karma-source-map-support@1.4.0: + resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} + dependencies: + source-map-support: 0.5.21 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + dev: true + + /launch-editor@2.6.1: + resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} + dependencies: + picocolors: 1.0.0 + shell-quote: 1.8.1 + dev: true + + /less-loader@11.1.0(less@4.1.3)(webpack@5.88.2): + resolution: {integrity: sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==} + engines: {node: '>= 14.15.0'} + peerDependencies: + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + dependencies: + klona: 2.0.6 + less: 4.1.3 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /less@4.1.3: + resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.6.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /license-webpack-plugin@4.0.2(webpack@5.88.2): + resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} + peerDependencies: + webpack: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-sources: + optional: true + dependencies: + webpack: 5.88.2(esbuild@0.18.17) + webpack-sources: 3.2.3 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + dev: true + + /loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /lru-cache@10.0.2: + resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==} + engines: {node: 14 || >=16.14} + dependencies: + semver: 7.5.4 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: true + + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.1: + resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + agentkeepalive: 4.5.0 + cacache: 16.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + agentkeepalive: 4.5.0 + cacache: 17.1.4 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 5.0.0 + minipass-fetch: 3.0.4 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 10.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.5 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mini-css-extract-plugin@2.7.6(webpack@5.88.2): + resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + schema-utils: 4.2.0 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-fetch@3.0.4: + resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mitt@3.0.0: + resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + dev: true + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /needle@3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.6.3 + sax: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + dev: true + + /nice-napi@1.0.2: + resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} + os: ['!win32'] + requiresBuild: true + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.6.1 + dev: true + optional: true + + /node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + dev: true + optional: true + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /node-gyp-build@4.6.1: + resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} + hasBin: true + dev: true + optional: true + + /node-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 10.2.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.3 + tar: 6.2.0 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.13.1 + semver: 7.5.3 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-normalize-package-bin: 3.0.1 + dev: true + + /npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.3 + dev: true + + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.5.3 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-packlist@7.0.4: + resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.3 + dev: true + + /npm-pick-manifest@8.0.1: + resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.5.3 + dev: true + + /npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + make-fetch-happen: 11.1.1 + minipass: 5.0.0 + minipass-fetch: 3.0.4 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 10.1.0 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-path@0.11.8: + resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} + engines: {node: '>= 10.12.0'} + dev: true + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.1 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.0 + debug: 4.3.4 + get-uri: 6.0.2 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + pac-resolver: 7.0.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /pac-resolver@7.0.0: + resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + ip: 1.1.8 + netmask: 2.0.2 + dev: true + + /pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 4.1.0 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 6.0.2 + '@npmcli/run-script': 6.0.2 + cacache: 17.1.4 + fs-minipass: 3.0.3 + minipass: 5.0.0 + npm-package-arg: 10.1.0 + npm-packlist: 7.0.4 + npm-pick-manifest: 8.0.1 + npm-registry-fetch: 14.0.5 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 6.0.4 + read-package-json-fast: 3.0.2 + sigstore: 1.9.0 + ssri: 10.0.5 + tar: 6.2.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /parse5-html-rewriting-stream@7.0.0: + resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} + dependencies: + entities: 4.5.0 + parse5: 7.1.2 + parse5-sax-parser: 7.0.0 + dev: true + + /parse5-sax-parser@7.0.0: + resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} + dependencies: + parse5: 7.1.2 + dev: true + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.2 + minipass: 7.0.4 + dev: true + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /piscina@4.0.0: + resolution: {integrity: sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==} + dependencies: + eventemitter-asyncresource: 1.0.0 + hdr-histogram-js: 2.0.3 + hdr-histogram-percentiles-obj: 3.0.0 + optionalDependencies: + nice-napi: 1.0.2 + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + dependencies: + find-up: 6.3.0 + dev: true + + /postcss-loader@7.3.3(postcss@8.4.31)(typescript@5.1.6)(webpack@5.88.2): + resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + dependencies: + cosmiconfig: 8.3.6(typescript@5.1.6) + jiti: 1.21.0 + postcss: 8.4.31 + semver: 7.5.4 + webpack: 5.88.2(esbuild@0.18.17) + transitivePeerDependencies: + - typescript + dev: true + + /postcss-modules-extract-imports@3.0.0(postcss@8.4.31): + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.31 + dev: true + + /postcss-modules-local-by-default@4.0.3(postcss@8.4.31): + resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-modules-scope@3.0.0(postcss@8.4.31): + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-modules-values@4.0.0(postcss@8.4.31): + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.31) + postcss: 8.4.31 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-agent@6.3.0: + resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + dev: true + optional: true + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /puppeteer-core@20.9.0(typescript@5.1.6): + resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} + engines: {node: '>=16.3.0'} + peerDependencies: + typescript: '>= 4.7.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@puppeteer/browsers': 1.4.6(typescript@5.1.6) + chromium-bidi: 0.4.16(devtools-protocol@0.0.1147663) + cross-fetch: 4.0.0 + debug: 4.3.4 + devtools-protocol: 0.0.1147663 + typescript: 5.1.6 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /puppeteer@20.9.0(typescript@5.1.6): + resolution: {integrity: sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw==} + engines: {node: '>=16.3.0'} + requiresBuild: true + dependencies: + '@puppeteer/browsers': 1.4.6(typescript@5.1.6) + cosmiconfig: 8.2.0 + puppeteer-core: 20.9.0(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + /pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + dev: true + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json@6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + glob: 10.3.10 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 5.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /reflect-metadata@0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + dev: true + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.23.2 + dev: true + + /regex-parser@2.2.11: + resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} + dev: true + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-url-loader@5.0.0: + resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} + engines: {node: '>=12'} + dependencies: + adjust-sourcemap-loader: 4.0.0 + convert-source-map: 1.9.0 + loader-utils: 2.0.4 + postcss: 8.4.31 + source-map: 0.6.1 + dev: true + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: true + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.10 + dev: true + + /rollup-plugin-terser@7.0.2(rollup@3.26.1): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.22.13 + jest-worker: 26.6.2 + rollup: 3.26.1 + serialize-javascript: 4.0.0 + terser: 5.24.0 + dev: true + + /rollup@3.26.1: + resolution: {integrity: sha512-I5gJCSpSMr3U9wv4D5YA8g7w7cj3eaSDeo7t+JcaFQOmoOUBgu4K9iMp8k3EZnwbJrjQxUMSKxMyB8qEQzzaSg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sass-loader@13.3.2(sass@1.64.1)(webpack@5.88.2): + resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + dependencies: + neo-async: 2.6.2 + sass: 1.64.1 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /sass@1.64.1: + resolution: {integrity: sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.4 + source-map-js: 1.0.2 + dev: true + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: true + optional: true + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + dev: true + + /schemawax@1.0.12: + resolution: {integrity: sha512-1N6jkJHStJs24CRSb5UGgye83wxQAx3bOeJ8zaJ+QXBcUyd+xxSgZ6H9GlpYxqlddeXgOmamxS+afYZGNKWsCw==} + dev: false + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: true + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.9 + node-forge: 1.3.1 + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /sigstore@1.9.0: + resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + '@sigstore/bundle': 1.1.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 1.0.0 + '@sigstore/tuf': 1.0.3 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + dev: true + + /socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-loader@4.0.1(webpack@5.88.2): + resolution: {integrity: sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.72.1 + dependencies: + abab: 2.0.6 + iconv-lite: 0.6.3 + source-map-js: 1.0.2 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + + /spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.4 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.4 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /ssri@10.0.5: + resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + dev: true + + /ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /stream-events@1.0.5: + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + dependencies: + stubs: 3.0.0 + dev: true + + /streamx@2.15.4: + resolution: {integrity: sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /stubs@3.0.0: + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + dev: true + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: true + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.4 + dev: true + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /teeny-request@7.1.1: + resolution: {integrity: sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==} + engines: {node: '>=10'} + dependencies: + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.9 + stream-events: 1.0.5 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /terser-webpack-plugin@5.3.9(esbuild@0.18.17)(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + esbuild: 0.18.17 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /terser@5.24.0: + resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.1 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /ts-api-utils@1.0.3(typescript@5.1.6): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.1.6 + dev: true + + /ts-node@10.9.1(@types/node@20.8.9)(typescript@5.1.6): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.8.9 + acorn: 8.11.2 + acorn-walk: 8.3.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.1.6 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tuf-js@1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@tufjs/models': 1.0.4 + debug: 4.3.4 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /typed-assert@1.0.9: + resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} + dev: true + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + unique-slug: 3.0.0 + dev: true + + /unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + unique-slug: 4.0.0 + dev: true + + /unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /urlgrey@1.0.0: + resolution: {integrity: sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==} + dependencies: + fast-url-parser: 1.1.3 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-to-istanbul@9.1.3: + resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + builtins: 5.0.1 + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vite@4.4.7(@types/node@20.8.9)(less@4.1.3)(sass@1.64.1)(terser@5.19.2): + resolution: {integrity: sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.8.9 + esbuild: 0.18.17 + less: 4.1.3 + postcss: 8.4.31 + rollup: 3.26.1 + sass: 1.64.1 + terser: 5.19.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /webpack-dev-middleware@5.3.3(webpack@5.88.2): + resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /webpack-dev-middleware@6.1.1(webpack@5.88.2): + resolution: {integrity: sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /webpack-dev-server@4.15.1(webpack@5.88.2): + resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.3 + '@types/express': 4.17.20 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.5 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.9 + ansi-html-community: 0.0.8 + bonjour-service: 1.1.1 + chokidar: 3.5.3 + colorette: 2.0.20 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.18.2 + graceful-fs: 4.2.11 + html-entities: 2.4.0 + http-proxy-middleware: 2.0.6(@types/express@4.17.20) + ipaddr.js: 2.1.0 + launch-editor: 2.6.1 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.88.2(esbuild@0.18.17) + webpack-dev-middleware: 5.3.3(webpack@5.88.2) + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + + /webpack-merge@5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.1 + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack-subresource-integrity@5.1.0(webpack@5.88.2): + resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} + engines: {node: '>= 12'} + peerDependencies: + html-webpack-plugin: '>= 5.0.0-beta.1 < 6' + webpack: ^5.12.0 + peerDependenciesMeta: + html-webpack-plugin: + optional: true + dependencies: + typed-assert: 1.0.9 + webpack: 5.88.2(esbuild@0.18.17) + dev: true + + /webpack@5.88.2(esbuild@0.18.17): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.11.2 + acorn-import-assertions: 1.9.0(acorn@8.11.2) + browserslist: 4.22.1 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.4.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(esbuild@0.18.17)(webpack@5.88.2) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: true + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + dev: true + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + 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 + dev: true + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zone.js@0.13.3: + resolution: {integrity: sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==} + dependencies: + tslib: 2.6.2 + dev: true diff --git a/rollup.config.mjs b/rollup.config.mjs index df7373395..a21925ba8 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -14,63 +14,63 @@ const { precompile } = handlebars; * half on large projects. */ const handlebarsPlugin = () => ({ - resolveId: (file, importer) => { - if (extname(file) === '.hbs') { - return resolve(dirname(importer), file); - } - return null; - }, - load: file => { - if (extname(file) === '.hbs') { - const template = readFileSync(file, 'utf8').toString().trim(); - const templateSpec = precompile(template, { - strict: true, - noEscape: true, - preventIndent: true, - knownHelpersOnly: true, - knownHelpers: { - ifdef: true, - equals: true, - notEquals: true, - containsSpaces: true, - union: true, - intersection: true, - enumerator: true, - escapeComment: true, - escapeDescription: true, - camelCase: true, - }, - }); - return `export default ${templateSpec};`; - } - return null; - }, + resolveId: (file, importer) => { + if (extname(file) === '.hbs') { + return resolve(dirname(importer), file); + } + return null; + }, + load: (file) => { + if (extname(file) === '.hbs') { + const template = readFileSync(file, 'utf8').toString().trim(); + const templateSpec = precompile(template, { + strict: true, + noEscape: true, + preventIndent: true, + knownHelpersOnly: true, + knownHelpers: { + ifdef: true, + equals: true, + notEquals: true, + containsSpaces: true, + union: true, + intersection: true, + enumerator: true, + escapeComment: true, + escapeDescription: true, + camelCase: true, + }, + }); + return `export default ${templateSpec};`; + } + return null; + }, }); const getPlugins = () => { - const plugins = [ - nodeResolve(), - commonjs({ - sourceMap: false, - }), - handlebarsPlugin(), - typescript({ - module: 'esnext', - }), - ]; - if (process.env.NODE_ENV === 'development') { - return plugins; - } - return [...plugins, terser()]; + const plugins = [ + nodeResolve(), + commonjs({ + sourceMap: false, + }), + handlebarsPlugin(), + typescript({ + module: 'esnext', + }), + ]; + if (process.env.NODE_ENV === 'development') { + return plugins; + } + return [...plugins, terser()]; }; export default { - input: './src/index.ts', - output: { - exports: 'named', - file: './dist/index.js', - format: 'cjs', - }, - external: ['camelcase', 'commander', 'fs-extra', 'handlebars', 'json-schema-ref-parser'], - plugins: getPlugins(), + input: './src/index.ts', + output: { + exports: 'named', + file: './dist/index.js', + format: 'cjs', + }, + external: ['camelcase', 'commander', 'fs-extra', 'handlebars', 'json-schema-ref-parser'], + plugins: getPlugins(), }; diff --git a/samples/spec/v2.json b/samples/spec/v2.json index ca7d3a25c..a584e862a 100644 --- a/samples/spec/v2.json +++ b/samples/spec/v2.json @@ -1,1063 +1,904 @@ { - "swagger": "2.0", - "info": { - "description": "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.", - "version": "1.0.5", - "title": "Swagger Petstore", - "termsOfService": "http://swagger.io/terms/", - "contact": { - "email": "apiteam@swagger.io" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - } + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.", + "version": "1.0.5", + "title": "Swagger Petstore", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Access to Petstore orders" }, - "host": "petstore.swagger.io", - "basePath": "/v2", - "tags": [ - { - "name": "pet", - "description": "Everything about your Pets", - "externalDocs": { - "description": "Find out more", - "url": "http://swagger.io" + { + "name": "user", + "description": "Operations about user", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + } + ], + "schemes": ["https", "http"], + "paths": { + "/pet/{petId}/uploadImage": { + "post": { + "tags": ["pet"], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "consumes": ["multipart/form-data"], + "produces": ["application/json"], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "additionalMetadata", + "in": "formData", + "description": "Additional data to pass to server", + "required": false, + "type": "string", + "x-nullable": true, + "default": null + }, + { + "name": "file", + "in": "formData", + "description": "file to upload", + "required": false, + "type": "file" + } + ], + "responses": { + "default": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiResponse" } + } }, - { - "name": "store", - "description": "Access to Petstore orders" - }, - { - "name": "user", - "description": "Operations about user", - "externalDocs": { - "description": "Find out more about our store", - "url": "http://swagger.io" + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet": { + "post": { + "tags": ["pet"], + "summary": "Add a new pet to the store", + "description": "", + "operationId": "addPet", + "consumes": ["application/json", "application/xml"], + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "schema": { + "$ref": "#/definitions/Pet" } - } - ], - "schemes": [ - "https", - "http" - ], - "paths": { - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "pet" - ], - "summary": "uploads an image", - "description": "", - "operationId": "uploadFile", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to update", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "additionalMetadata", - "in": "formData", - "description": "Additional data to pass to server", - "required": false, - "type": "string", - "x-nullable": true, - "default": null - }, - { - "name": "file", - "in": "formData", - "description": "file to upload", - "required": false, - "type": "file" - } - ], - "responses": { - "default": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/ApiResponse" - } - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + }, + "put": { + "tags": ["pet"], + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "consumes": ["application/json", "application/xml"], + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "schema": { + "$ref": "#/definitions/Pet" } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } }, - "/pet": { - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new pet to the store", - "description": "", - "operationId": "addPet", - "consumes": [ - "application/json", - "application/xml" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": ["pet"], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": true, + "type": "array", + "items": { + "type": "string", + "enum": ["available", "pending", "sold"], + "default": "available" }, - "put": { - "tags": [ - "pet" - ], - "summary": "Update an existing pet", - "description": "", - "operationId": "updatePet", - "consumes": [ - "application/json", - "application/xml" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - }, - "405": { - "description": "Validation exception" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } } + }, + "400": { + "description": "Invalid status value" + } }, - "/pet/findByStatus": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma separated strings", - "operationId": "findPetsByStatus", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": true, - "type": "array", - "items": { - "type": "string", - "enum": [ - "available", - "pending", - "sold" - ], - "default": "available" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": ["pet"], + "summary": "Finds Pets by tags", + "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } } + }, + "400": { + "description": "Invalid tag value" + } }, - "/pet/findByTags": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by tags", - "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTags", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": true, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ], - "deprecated": true + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ], + "deprecated": true + } + }, + "/pet/{petId}": { + "get": { + "tags": ["pet"], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Pet" } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } }, - "/pet/{petId}": { - "get": { - "tags": [ - "pet" - ], - "summary": "Find pet by ID", - "description": "Returns a single pet", - "operationId": "getPetById", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to return", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - } - }, - "security": [ - { - "api_key": [] - } - ] - }, - "post": { - "tags": [ - "pet" - ], - "summary": "Updates a pet in the store with form data", - "description": "", - "operationId": "updatePetWithForm", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be updated", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "name", - "in": "formData", - "description": "Updated name of the pet", - "required": false, - "type": "string" - }, - { - "name": "status", - "in": "formData", - "description": "Updated status of the pet", - "required": false, - "type": "string" - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "delete": { - "tags": [ - "pet" - ], - "summary": "Deletes a pet", - "description": "", - "operationId": "deletePet", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "api_key", - "in": "header", - "required": false, - "type": "string" - }, - { - "name": "petId", - "in": "path", - "description": "Pet id to delete", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } + "security": [ + { + "api_key": [] + } + ] + }, + "post": { + "tags": ["pet"], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "consumes": ["application/x-www-form-urlencoded"], + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "name", + "in": "formData", + "description": "Updated name of the pet", + "required": false, + "type": "string" + }, + { + "name": "status", + "in": "formData", + "description": "Updated status of the pet", + "required": false, + "type": "string" + } + ], + "responses": { + "405": { + "description": "Invalid input" + } }, - "/store/order": { - "post": { - "tags": [ - "store" - ], - "summary": "Place an order for a pet", - "description": "", - "operationId": "placeOrder", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "order placed for purchasing the pet", - "required": true, - "schema": { - "$ref": "#/definitions/Order" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/Order" - } - }, - "400": { - "description": "Invalid Order" - } - } - } + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + }, + "delete": { + "tags": ["pet"], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "api_key", + "in": "header", + "required": false, + "type": "string" + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } }, - "/store/order/{orderId}": { - "get": { - "tags": [ - "store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions", - "operationId": "getOrderById", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "integer", - "maximum": 10, - "minimum": 1, - "format": "int64" - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/Order" - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - }, - "delete": { - "tags": [ - "store" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors", - "operationId": "deleteOrder", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "type": "integer", - "minimum": 1, - "format": "int64" - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/store/order": { + "post": { + "tags": ["store"], + "summary": "Place an order for a pet", + "description": "", + "operationId": "placeOrder", + "consumes": ["application/json"], + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "order placed for purchasing the pet", + "required": true, + "schema": { + "$ref": "#/definitions/Order" } - }, - "/store/inventory": { - "get": { - "tags": [ - "store" - ], - "summary": "Returns pet inventories by status", - "description": "Returns a map of status codes to quantities", - "operationId": "getInventory", - "produces": [ - "application/json" - ], - "parameters": [], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "type": "object", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - } - } - }, - "security": [ - { - "api_key": [] - } - ] + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" } - }, - "/user/createWithArray": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "", - "operationId": "createUsersWithArrayInput", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "List of user object", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/User" - } - } - } - ], - "responses": { - "default": { - "description": "successful operation" - } - } + }, + "400": { + "description": "Invalid Order" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": ["store"], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions", + "operationId": "getOrderById", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "integer", + "maximum": 10, + "minimum": 1, + "format": "int64" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" } - }, - "/user/createWithList": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "", - "operationId": "createUsersWithListInput", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "List of user object", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/User" - } - } - } - ], - "responses": { - "default": { - "description": "successful operation" - } - } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": ["store"], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors", + "operationId": "deleteOrder", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "type": "integer", + "minimum": 1, + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/store/inventory": { + "get": { + "tags": ["store"], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "produces": ["application/json"], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } } + } }, - "/user/{username}": { - "get": { - "tags": [ - "user" - ], - "summary": "Get user by user name", - "description": "", - "operationId": "getUserByName", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/User" - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "put": { - "tags": [ - "user" - ], - "summary": "Updated user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUser", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "name that need to be updated", - "required": true, - "type": "string" - }, - { - "in": "body", - "name": "body", - "description": "Updated user object", - "required": true, - "schema": { - "$ref": "#/definitions/User" - } - } - ], - "responses": { - "400": { - "description": "Invalid user supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "delete": { - "tags": [ - "user" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUser", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "type": "string" - } - ], - "responses": { - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } + "security": [ + { + "api_key": [] + } + ] + } + }, + "/user/createWithArray": { + "post": { + "tags": ["user"], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithArrayInput", + "consumes": ["application/json"], + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } } - }, - "/user/login": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs user into the system", - "description": "", - "operationId": "loginUser", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": true, - "type": "string" - }, - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "successful operation", - "headers": { - "X-Expires-After": { - "type": "string", - "format": "date-time", - "description": "date in UTC when token expires" - }, - "X-Rate-Limit": { - "type": "integer", - "format": "int32", - "description": "calls per hour allowed by the user" - } - }, - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": ["user"], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithListInput", + "consumes": ["application/json"], + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } } - }, - "/user/logout": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs out current logged in user session", - "description": "", - "operationId": "logoutUser", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [], - "responses": { - "default": { - "description": "successful operation" - } - } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": ["user"], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/User" } - }, - "/user": { - "post": { - "tags": [ - "user" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUser", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Created user object", - "required": true, - "schema": { - "$ref": "#/definitions/User" - } - } - ], - "responses": { - "default": { - "description": "successful operation" - } - } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": ["user"], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "consumes": ["application/json"], + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be updated", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" } + } + ], + "responses": { + "400": { + "description": "Invalid user supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "delete": { + "tags": ["user"], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } } + } }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "https://petstore.swagger.io/oauth/authorize", - "flow": "implicit", - "scopes": { - "read:pets": "read your pets", - "write:pets": "modify pets in your account" + "/user/login": { + "get": { + "tags": ["user"], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": true, + "type": "string" + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" } + }, + "400": { + "description": "Invalid username/password supplied" + } } + } }, - "definitions": { - "ApiResponse": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "type": { - "type": "string" - }, - "message": { - "type": "string" - } + "/user/logout": { + "get": { + "tags": ["user"], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "produces": ["application/json", "application/xml"], + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user": { + "post": { + "tags": ["user"], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "consumes": ["application/json"], + "produces": ["application/json", "application/xml"], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Created user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + } + }, + "securityDefinitions": { + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + }, + "petstore_auth": { + "type": "oauth2", + "authorizationUrl": "https://petstore.swagger.io/oauth/authorize", + "flow": "implicit", + "scopes": { + "read:pets": "read your pets", + "write:pets": "modify pets in your account" + } + } + }, + "definitions": { + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" }, - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "xml": { - "name": "Category" - } + "type": { + "type": "string" }, - "Pet": { - "type": "object", - "required": [ - "name", - "photoUrls" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "category": { - "$ref": "#/definitions/Category" - }, - "name": { - "type": "string", - "example": "doggie" - }, - "photoUrls": { - "type": "array", - "xml": { - "wrapped": true - }, - "items": { - "type": "string", - "xml": { - "name": "photoUrl" - } - } - }, - "tags": { - "type": "array", - "xml": { - "wrapped": true - }, - "items": { - "xml": { - "name": "tag" - }, - "$ref": "#/definitions/Tag" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - } - }, - "xml": { - "name": "Pet" - } + "message": { + "type": "string" + } + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "xml": { - "name": "Tag" - } + "name": { + "type": "string" + } + }, + "xml": { + "name": "Category" + } + }, + "Pet": { + "type": "object", + "required": ["name", "photoUrls"], + "properties": { + "id": { + "type": "integer", + "format": "int64" }, - "Order": { - "type": "object", - "properties": { - "bool": { - "description": "Simple boolean enum", - "type": "boolean", - "enum": [ - true - ] - }, - "id": { - "type": "integer", - "format": "int64" - }, - "petId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "enum": [ - "placed", - "approved", - "delivered" - ] - }, - "complete": { - "type": "boolean" - } - }, + "category": { + "$ref": "#/definitions/Category" + }, + "name": { + "type": "string", + "example": "doggie" + }, + "photoUrls": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "type": "string", "xml": { - "name": "Order" + "name": "photoUrl" } + } }, - "User": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "username": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "email": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status" - } - }, + "tags": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { "xml": { - "name": "User" - } + "name": "tag" + }, + "$ref": "#/definitions/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": ["available", "pending", "sold"] } + }, + "xml": { + "name": "Pet" + } }, - "externalDocs": { - "description": "Find out more about Swagger", - "url": "http://swagger.io" + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Tag" + } + }, + "Order": { + "type": "object", + "properties": { + "bool": { + "description": "Simple boolean enum", + "type": "boolean", + "enum": [true] + }, + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": ["placed", "approved", "delivered"] + }, + "complete": { + "type": "boolean" + } + }, + "xml": { + "name": "Order" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "username": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status" + } + }, + "xml": { + "name": "User" + } } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + } } diff --git a/samples/spec/v3.json b/samples/spec/v3.json index befc0795b..de11b3bce 100644 --- a/samples/spec/v3.json +++ b/samples/spec/v3.json @@ -1,1225 +1,1148 @@ { - "openapi": "3.0.2", - "info": { - "title": "Swagger Petstore - OpenAPI 3.0", - "description": "This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml) ", - "termsOfService": "http://swagger.io/terms/", - "contact": { - "email": "apiteam@swagger.io" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - }, - "version": "1.0.4" + "openapi": "3.0.2", + "info": { + "title": "Swagger Petstore - OpenAPI 3.0", + "description": "This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml) ", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" }, - "externalDocs": { - "description": "Find out more about Swagger", + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0.4" + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + }, + "servers": [ + { + "url": "/api/v3" + } + ], + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", "url": "http://swagger.io" + } }, - "servers": [ - { - "url": "/api/v3" - } - ], - "tags": [ - { - "name": "pet", - "description": "Everything about your Pets", - "externalDocs": { - "description": "Find out more", - "url": "http://swagger.io" + { + "name": "store", + "description": "Operations about user" + }, + { + "name": "user", + "description": "Access to Petstore orders", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + } + ], + "paths": { + "/pet": { + "put": { + "tags": ["pet"], + "summary": "Update an existing pet", + "description": "Update an existing pet by Id", + "operationId": "updatePet", + "requestBody": { + "description": "Update an existent pet in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Pet" + } } + }, + "required": true }, - { - "name": "store", - "description": "Operations about user" - }, - { - "name": "user", - "description": "Access to Petstore orders", - "externalDocs": { - "description": "Find out more about our store", - "url": "http://swagger.io" + "responses": { + "default": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } } - } - ], - "paths": { - "/pet": { - "put": { - "tags": [ - "pet" - ], - "summary": "Update an existing pet", - "description": "Update an existing pet by Id", - "operationId": "updatePet", - "requestBody": { - "description": "Update an existent pet in the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "default": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - }, - "405": { - "description": "Validation exception" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + }, + "post": { + "tags": ["pet"], + "summary": "Add a new pet to the store", + "description": "Add a new pet to the store", + "operationId": "addPet", + "requestBody": { + "description": "Create a new pet in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } }, - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new pet to the store", - "description": "Add a new pet to the store", - "operationId": "addPet", - "requestBody": { - "description": "Create a new pet in the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Pet" + } } + }, + "required": true }, - "/pet/findByStatus": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma separated strings", - "operationId": "findPetsByStatus", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": false, - "explode": true, - "schema": { - "type": "string", - "default": "available", - "enum": [ - "available", - "pending", - "sold" - ] - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } } + }, + "405": { + "description": "Invalid input" + } }, - "/pet/findByTags": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by tags", - "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTags", - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": false, - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": ["pet"], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": false, + "explode": true, + "schema": { + "type": "string", + "default": "available", + "enum": ["available", "pending", "sold"] + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } } + }, + "400": { + "description": "Invalid status value" + } }, - "/pet/{petId}": { - "get": { - "tags": [ - "pet" - ], - "summary": "Find pet by ID", - "description": "Returns a single pet", - "operationId": "getPetById", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to return", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - } - }, - "security": [ - { - "api_key": [] - }, - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "post": { - "tags": [ - "pet" - ], - "summary": "Updates a pet in the store with form data", - "description": "", - "operationId": "updatePetWithForm", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be updated", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - }, - { - "name": "name", - "in": "query", - "description": "Name of pet that needs to be updated", - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Status of pet that needs to be updated", - "schema": { - "type": "string" - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "delete": { - "tags": [ - "pet" - ], - "summary": "Deletes a pet", - "description": "", - "operationId": "deletePet", - "parameters": [ - { - "name": "api_key", - "in": "header", - "description": "", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "petId", - "in": "path", - "description": "Pet id to delete", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "400": { - "description": "Invalid pet value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": ["pet"], + "summary": "Finds Pets by tags", + "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": false, + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/{petId}": { + "get": { + "tags": ["pet"], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "pet" - ], - "summary": "uploads an image", - "description": "", - "operationId": "uploadFile", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to update", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - }, - { - "name": "additionalMetadata", - "in": "query", - "description": "Additional Metadata", - "required": false, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponse" - } - } - } - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] + "security": [ + { + "api_key": [] + }, + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + }, + "post": { + "tags": ["pet"], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "name", + "in": "query", + "description": "Name of pet that needs to be updated", + "schema": { + "type": "string" } + }, + { + "name": "status", + "in": "query", + "description": "Status of pet that needs to be updated", + "schema": { + "type": "string" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } }, - "/store/inventory": { - "get": { - "tags": [ - "store" - ], - "summary": "Returns pet inventories by status", - "description": "Returns a map of status codes to quantities", - "operationId": "getInventory", - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - } - } - } - } - }, - "security": [ - { - "api_key": [] - } - ] + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + }, + "delete": { + "tags": ["pet"], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "parameters": [ + { + "name": "api_key", + "in": "header", + "description": "", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "schema": { + "type": "integer", + "format": "int64" } + } + ], + "responses": { + "400": { + "description": "Invalid pet value" + } }, - "/store/order": { - "post": { - "tags": [ - "store" - ], - "summary": "Place an order for a pet", - "description": "Place a new order in the store", - "operationId": "placeOrder", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "405": { - "description": "Invalid input" - } + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/pet/{petId}/uploadImage": { + "post": { + "tags": ["pet"], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "additionalMetadata", + "in": "query", + "description": "Additional Metadata", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponse" } + } } + } }, - "/store/order/{orderId}": { - "get": { - "tags": [ - "store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - "operationId": "getOrderById", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of order that needs to be fetched", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } + "security": [ + { + "petstore_auth": ["write:pets", "read:pets"] + } + ] + } + }, + "/store/inventory": { + "get": { + "tags": ["store"], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } } + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/store/order": { + "post": { + "tags": ["store"], + "summary": "Place an order for a pet", + "description": "Place a new order in the store", + "operationId": "placeOrder", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } }, - "delete": { - "tags": [ - "store" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", - "operationId": "deleteOrder", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Order" + } } + } }, - "/user": { - "post": { - "tags": [ - "user" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUser", - "requestBody": { - "description": "Created user object", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "responses": { - "default": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - } + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" } + } } - }, - "/user/createWithList": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "Creates list of users with given input array", - "operationId": "createUsersWithListInput", - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - } - }, - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "default": { - "description": "successful operation" - } + }, + "405": { + "description": "Invalid input" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": ["store"], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", + "operationId": "getOrderById", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of order that needs to be fetched", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": ["store"], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "operationId": "deleteOrder", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/user": { + "post": { + "tags": ["user"], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "requestBody": { + "description": "Created user object", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/User" + } } + } }, - "/user/login": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs user into the system", - "description": "", - "operationId": "loginUser", - "parameters": [ - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "headers": { - "X-Rate-Limit": { - "description": "calls per hour allowed by the user", - "schema": { - "type": "integer", - "format": "int32" - } - }, - "X-Expires-After": { - "description": "date in UTC when toekn expires", - "schema": { - "type": "string", - "format": "date-time" - } - } - }, - "content": { - "application/xml": { - "schema": { - "type": "string" - } - }, - "application/json": { - "schema": { - "type": "string" - } - } - } - }, - "400": { - "description": "Invalid username/password supplied" - } + "responses": { + "default": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + } } - }, - "/user/logout": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs out current logged in user session", - "description": "", - "operationId": "logoutUser", - "parameters": [], - "responses": { - "default": { - "description": "successful operation" - } + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": ["user"], + "summary": "Creates list of users with given input array", + "description": "Creates list of users with given input array", + "operationId": "createUsersWithListInput", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" } + } } + } }, - "/user/{username}": { - "get": { - "tags": [ - "user" - ], - "summary": "Get user by user name", - "description": "", - "operationId": "getUserByName", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" } - }, - "put": { - "tags": [ - "user" - ], - "summary": "Update user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "name that need to be deleted", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "Update an existent user in the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "responses": { - "default": { - "description": "successful operation" - } - } - }, - "delete": { - "tags": [ - "user" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" } + } } + }, + "default": { + "description": "successful operation" + } } + } }, - "components": { - "schemas": { - "Order": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "petId": { - "type": "integer", - "format": "int64", - "example": 198772 - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 7 - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "example": "approved", - "enum": [ - "placed", - "approved", - "delivered" - ] - }, - "complete": { - "type": "boolean" - } - }, - "xml": { - "name": "order" + "/user/login": { + "get": { + "tags": ["user"], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Rate-Limit": { + "description": "calls per hour allowed by the user", + "schema": { + "type": "integer", + "format": "int32" } - }, - "Customer": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 100000 - }, - "username": { - "type": "string", - "example": "fehguy" - }, - "address": { - "type": "array", - "xml": { - "name": "addresses", - "wrapped": true - }, - "items": { - "$ref": "#/components/schemas/Address" - } - } - }, - "xml": { - "name": "customer" + }, + "X-Expires-After": { + "description": "date in UTC when toekn expires", + "schema": { + "type": "string", + "format": "date-time" } + } }, - "Address": { - "type": "object", - "properties": { - "street": { - "type": "string", - "example": "437 Lytton" - }, - "city": { - "type": "string", - "example": "Palo Alto" - }, - "state": { - "type": "string", - "example": "CA" - }, - "zip": { - "type": "string", - "example": "94301" - } - }, - "xml": { - "name": "address" + "content": { + "application/xml": { + "schema": { + "type": "string" } - }, - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 1 - }, - "name": { - "type": "string", - "example": "Dogs" - } - }, - "xml": { - "name": "category" + }, + "application/json": { + "schema": { + "type": "string" } - }, - "User": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "username": { - "type": "string", - "example": "theUser" - }, - "firstName": { - "type": "string", - "example": "John" - }, - "lastName": { - "type": "string", - "example": "James" - }, - "email": { - "type": "string", - "example": "john@email.com" - }, - "password": { - "type": "string", - "example": "12345" - }, - "phone": { - "type": "string", - "example": "12345" - }, - "userStatus": { - "type": "integer", - "description": "User Status", - "format": "int32", - "example": 1 - } - }, - "xml": { - "name": "user" + } + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": ["user"], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": ["user"], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" } - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "xml": { - "name": "tag" + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" } + } + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": ["user"], + "summary": "Update user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Update an existent user in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } }, - "Pet": { - "required": [ - "name", - "photoUrls" - ], - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "name": { - "type": "string", - "example": "doggie" - }, - "category": { - "$ref": "#/components/schemas/Category" - }, - "photoUrls": { - "type": "array", - "xml": { - "wrapped": true - }, - "items": { - "type": "string", - "xml": { - "name": "photoUrl" - } - } - }, - "tags": { - "type": "array", - "xml": { - "wrapped": true - }, - "items": { - "$ref": "#/components/schemas/Tag" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - } - }, - "xml": { - "name": "pet" - } + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } }, - "ApiResponse": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "type": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "xml": { - "name": "##default" - } + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/User" + } } + } }, - "requestBodies": { - "Pet": { - "description": "Pet object that needs to be added to the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } + "responses": { + "default": { + "description": "successful operation" + } + } + }, + "delete": { + "tags": ["user"], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + } + } + }, + "components": { + "schemas": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "petId": { + "type": "integer", + "format": "int64", + "example": 198772 + }, + "quantity": { + "type": "integer", + "format": "int32", + "example": 7 + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "example": "approved", + "enum": ["placed", "approved", "delivered"] + }, + "complete": { + "type": "boolean" + } + }, + "xml": { + "name": "order" + } + }, + "Customer": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 100000 + }, + "username": { + "type": "string", + "example": "fehguy" + }, + "address": { + "type": "array", + "xml": { + "name": "addresses", + "wrapped": true }, - "UserArray": { - "description": "List of user object", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - } + "items": { + "$ref": "#/components/schemas/Address" } + } }, - "securitySchemes": { - "petstore_auth": { - "type": "oauth2", - "flows": { - "implicit": { - "authorizationUrl": "https://petstore3.swagger.io/oauth/authorize", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } + "xml": { + "name": "customer" + } + }, + "Address": { + "type": "object", + "properties": { + "street": { + "type": "string", + "example": "437 Lytton" + }, + "city": { + "type": "string", + "example": "Palo Alto" + }, + "state": { + "type": "string", + "example": "CA" + }, + "zip": { + "type": "string", + "example": "94301" + } + }, + "xml": { + "name": "address" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 1 + }, + "name": { + "type": "string", + "example": "Dogs" + } + }, + "xml": { + "name": "category" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "username": { + "type": "string", + "example": "theUser" + }, + "firstName": { + "type": "string", + "example": "John" + }, + "lastName": { + "type": "string", + "example": "James" + }, + "email": { + "type": "string", + "example": "john@email.com" + }, + "password": { + "type": "string", + "example": "12345" + }, + "phone": { + "type": "string", + "example": "12345" + }, + "userStatus": { + "type": "integer", + "description": "User Status", + "format": "int32", + "example": 1 + } + }, + "xml": { + "name": "user" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "tag" + } + }, + "Pet": { + "required": ["name", "photoUrls"], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "name": { + "type": "string", + "example": "doggie" + }, + "category": { + "$ref": "#/components/schemas/Category" + }, + "photoUrls": { + "type": "array", + "xml": { + "wrapped": true }, - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" + "items": { + "type": "string", + "xml": { + "name": "photoUrl" + } + } + }, + "tags": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": ["available", "pending", "sold"] + } + }, + "xml": { + "name": "pet" + } + }, + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "xml": { + "name": "##default" + } + } + }, + "requestBodies": { + "Pet": { + "description": "Pet object that needs to be added to the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "UserArray": { + "description": "List of user object", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + }, + "securitySchemes": { + "petstore_auth": { + "type": "oauth2", + "flows": { + "implicit": { + "authorizationUrl": "https://petstore3.swagger.io/oauth/authorize", + "scopes": { + "write:pets": "modify pets in your account", + "read:pets": "read your pets" } + } } + }, + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + } } + } } diff --git a/src/HttpClient.ts b/src/HttpClient.ts index 9b3f9010b..4dc7c74d7 100644 --- a/src/HttpClient.ts +++ b/src/HttpClient.ts @@ -1,6 +1,6 @@ export enum HttpClient { - FETCH = 'fetch', - XHR = 'xhr', - NODE = 'node', - AXIOS = 'axios', + FETCH = 'fetch', + XHR = 'xhr', + NODE = 'node', + AXIOS = 'axios', } diff --git a/src/Indent.ts b/src/Indent.ts index 4203f34c5..938fe2d10 100644 --- a/src/Indent.ts +++ b/src/Indent.ts @@ -1,5 +1,5 @@ export enum Indent { - SPACE_4 = '4', - SPACE_2 = '2', - TAB = 'tab', + SPACE_4 = '4', + SPACE_2 = '2', + TAB = 'tab', } diff --git a/src/client/interfaces/Client.d.ts b/src/client/interfaces/Client.d.ts index 844e2c6f1..4b77f5547 100644 --- a/src/client/interfaces/Client.d.ts +++ b/src/client/interfaces/Client.d.ts @@ -2,8 +2,8 @@ import type { Model } from './Model'; import type { Service } from './Service'; export interface Client { - version: string; - server: string; - models: Model[]; - services: Service[]; + version: string; + server: string; + models: Model[]; + services: Service[]; } diff --git a/src/client/interfaces/Enum.d.ts b/src/client/interfaces/Enum.d.ts index fd41e95aa..5db259f54 100644 --- a/src/client/interfaces/Enum.d.ts +++ b/src/client/interfaces/Enum.d.ts @@ -1,6 +1,6 @@ export interface Enum { - name: string; - value: string; - type: string; - description: string | null; + name: string; + value: string; + type: string; + description: string | null; } diff --git a/src/client/interfaces/Model.d.ts b/src/client/interfaces/Model.d.ts index 5f0318942..c792ff92a 100644 --- a/src/client/interfaces/Model.d.ts +++ b/src/client/interfaces/Model.d.ts @@ -2,17 +2,17 @@ import type { Enum } from './Enum'; import type { Schema } from './Schema'; export interface Model extends Schema { - name: string; - export: 'reference' | 'generic' | 'enum' | 'array' | 'dictionary' | 'interface' | 'one-of' | 'any-of' | 'all-of'; - type: string; - base: string; - template: string | null; - link: Model | null; - description: string | null; - deprecated?: boolean; - default?: string; - imports: string[]; - enum: Enum[]; - enums: Model[]; - properties: Model[]; + name: string; + export: 'reference' | 'generic' | 'enum' | 'array' | 'dictionary' | 'interface' | 'one-of' | 'any-of' | 'all-of'; + type: string; + base: string; + template: string | null; + link: Model | null; + description: string | null; + deprecated?: boolean; + default?: string; + imports: string[]; + enum: Enum[]; + enums: Model[]; + properties: Model[]; } diff --git a/src/client/interfaces/ModelComposition.d.ts b/src/client/interfaces/ModelComposition.d.ts index f17fc5e64..1e531c912 100644 --- a/src/client/interfaces/ModelComposition.d.ts +++ b/src/client/interfaces/ModelComposition.d.ts @@ -1,8 +1,8 @@ import type { Model } from './Model'; export interface ModelComposition { - type: 'one-of' | 'any-of' | 'all-of'; - imports: string[]; - enums: Model[]; - properties: Model[]; + type: 'one-of' | 'any-of' | 'all-of'; + imports: string[]; + enums: Model[]; + properties: Model[]; } diff --git a/src/client/interfaces/Operation.d.ts b/src/client/interfaces/Operation.d.ts index 779144325..3229c1ffd 100644 --- a/src/client/interfaces/Operation.d.ts +++ b/src/client/interfaces/Operation.d.ts @@ -3,14 +3,14 @@ import type { OperationParameters } from './OperationParameters'; import type { OperationResponse } from './OperationResponse'; export interface Operation extends OperationParameters { - service: string; - name: string; - summary: string | null; - description: string | null; - deprecated: boolean; - method: string; - path: string; - errors: OperationError[]; - results: OperationResponse[]; - responseHeader: string | null; + service: string; + name: string; + summary: string | null; + description: string | null; + deprecated: boolean; + method: string; + path: string; + errors: OperationError[]; + results: OperationResponse[]; + responseHeader: string | null; } diff --git a/src/client/interfaces/OperationError.d.ts b/src/client/interfaces/OperationError.d.ts index bfb741996..2a2808efd 100644 --- a/src/client/interfaces/OperationError.d.ts +++ b/src/client/interfaces/OperationError.d.ts @@ -1,4 +1,4 @@ export interface OperationError { - code: number; - description: string; + code: number; + description: string; } diff --git a/src/client/interfaces/OperationParameter.d.ts b/src/client/interfaces/OperationParameter.d.ts index 77c0da771..80f79f3f2 100644 --- a/src/client/interfaces/OperationParameter.d.ts +++ b/src/client/interfaces/OperationParameter.d.ts @@ -1,7 +1,7 @@ import type { Model } from './Model'; export interface OperationParameter extends Model { - in: 'path' | 'query' | 'header' | 'formData' | 'body' | 'cookie'; - prop: string; - mediaType: string | null; + in: 'path' | 'query' | 'header' | 'formData' | 'body' | 'cookie'; + prop: string; + mediaType: string | null; } diff --git a/src/client/interfaces/OperationParameters.d.ts b/src/client/interfaces/OperationParameters.d.ts index 43419438c..c6ceada69 100644 --- a/src/client/interfaces/OperationParameters.d.ts +++ b/src/client/interfaces/OperationParameters.d.ts @@ -1,12 +1,12 @@ import type { OperationParameter } from './OperationParameter'; export interface OperationParameters { - imports: string[]; - parameters: OperationParameter[]; - parametersPath: OperationParameter[]; - parametersQuery: OperationParameter[]; - parametersForm: OperationParameter[]; - parametersCookie: OperationParameter[]; - parametersHeader: OperationParameter[]; - parametersBody: OperationParameter | null; + imports: string[]; + parameters: OperationParameter[]; + parametersPath: OperationParameter[]; + parametersQuery: OperationParameter[]; + parametersForm: OperationParameter[]; + parametersCookie: OperationParameter[]; + parametersHeader: OperationParameter[]; + parametersBody: OperationParameter | null; } diff --git a/src/client/interfaces/OperationResponse.d.ts b/src/client/interfaces/OperationResponse.d.ts index 0eed91537..938e93eab 100644 --- a/src/client/interfaces/OperationResponse.d.ts +++ b/src/client/interfaces/OperationResponse.d.ts @@ -1,6 +1,6 @@ import type { Model } from './Model'; export interface OperationResponse extends Model { - in: 'response' | 'header'; - code: number; + in: 'response' | 'header'; + code: number; } diff --git a/src/client/interfaces/Schema.d.ts b/src/client/interfaces/Schema.d.ts index 26a116dbf..fb607afc5 100644 --- a/src/client/interfaces/Schema.d.ts +++ b/src/client/interfaces/Schema.d.ts @@ -1,31 +1,31 @@ export interface Schema { - isDefinition: boolean; - isReadOnly: boolean; - isRequired: boolean; - isNullable: boolean; - format?: - | 'int32' - | 'int64' - | 'float' - | 'double' - | 'string' - | 'boolean' - | 'byte' - | 'binary' - | 'date' - | 'date-time' - | 'password'; - maximum?: number; - exclusiveMaximum?: boolean; - minimum?: number; - exclusiveMinimum?: boolean; - multipleOf?: number; - maxLength?: number; - minLength?: number; - pattern?: string; - maxItems?: number; - minItems?: number; - uniqueItems?: boolean; - maxProperties?: number; - minProperties?: number; + isDefinition: boolean; + isReadOnly: boolean; + isRequired: boolean; + isNullable: boolean; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; + maximum?: number; + exclusiveMaximum?: boolean; + minimum?: number; + exclusiveMinimum?: boolean; + multipleOf?: number; + maxLength?: number; + minLength?: number; + pattern?: string; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + maxProperties?: number; + minProperties?: number; } diff --git a/src/client/interfaces/Service.d.ts b/src/client/interfaces/Service.d.ts index 9ab21ebee..77e362842 100644 --- a/src/client/interfaces/Service.d.ts +++ b/src/client/interfaces/Service.d.ts @@ -1,7 +1,7 @@ import type { Operation } from './Operation'; export interface Service { - name: string; - operations: Operation[]; - imports: string[]; + name: string; + operations: Operation[]; + imports: string[]; } diff --git a/src/client/interfaces/Type.d.ts b/src/client/interfaces/Type.d.ts index 114c68b63..d815a8fbb 100644 --- a/src/client/interfaces/Type.d.ts +++ b/src/client/interfaces/Type.d.ts @@ -1,7 +1,7 @@ export interface Type { - type: string; - base: string; - template: string | null; - imports: string[]; - isNullable: boolean; + type: string; + base: string; + template: string | null; + imports: string[]; + isNullable: boolean; } diff --git a/src/index.spec.ts b/src/index.spec.ts index 1e42c68e4..40a8c07ba 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,35 +1,35 @@ import OpenAPI from './index'; describe('index', () => { - it('parses v2 without issues', async () => { - await OpenAPI.generate({ - input: './test/spec/v2.json', - output: './generated/v2/', - write: false, - }); + it('parses v2 without issues', async () => { + await OpenAPI.generate({ + input: './test/spec/v2.json', + output: './generated/v2/', + write: false, }); + }); - it('parses v3 without issues', async () => { - await OpenAPI.generate({ - input: './test/spec/v3.json', - output: './generated/v3/', - write: false, - }); + it('parses v3 without issues', async () => { + await OpenAPI.generate({ + input: './test/spec/v3.json', + output: './generated/v3/', + write: false, }); + }); - it('downloads and parses v2 without issues', async () => { - await OpenAPI.generate({ - input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/master/test/spec/v2.json', - output: './generated/v2-downloaded/', - write: false, - }); + it('downloads and parses v2 without issues', async () => { + await OpenAPI.generate({ + input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/master/test/spec/v2.json', + output: './generated/v2-downloaded/', + write: false, }); + }); - it('downloads and parses v3 without issues', async () => { - await OpenAPI.generate({ - input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/master/test/spec/v3.json', - output: './generated/v3-downloaded/', - write: false, - }); + it('downloads and parses v3 without issues', async () => { + await OpenAPI.generate({ + input: 'https://raw.githubusercontent.com/ferdikoomen/openapi-typescript-codegen/master/test/spec/v3.json', + output: './generated/v3-downloaded/', + write: false, }); + }); }); diff --git a/src/index.ts b/src/index.ts index 28f1d219d..34dbd719e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,20 +13,20 @@ export { HttpClient } from './HttpClient'; export { Indent } from './Indent'; export type Options = { - input: string | Record; - output: string; - httpClient?: HttpClient; - clientName?: string; - useOptions?: boolean; - exportCore?: boolean; - exportServices?: boolean; - exportModels?: boolean; - exportSchemas?: boolean; - indent?: Indent; - postfixServices?: string; - postfixModels?: string; - request?: string; - write?: boolean; + input: string | Record; + output: string; + httpClient?: HttpClient; + clientName?: string; + useOptions?: boolean; + exportCore?: boolean; + exportServices?: boolean; + exportModels?: boolean; + exportSchemas?: boolean; + indent?: Indent; + postfixServices?: string; + postfixModels?: string; + request?: string; + write?: boolean; }; /** @@ -49,78 +49,78 @@ export type Options = { * @param write Write the files to disk (true or false) */ export const generate = async ({ - input, - output, - httpClient = HttpClient.FETCH, - clientName, - useOptions = false, - exportCore = true, - exportServices = true, - exportModels = true, - exportSchemas = false, - indent = Indent.SPACE_4, - postfixServices = 'Service', - postfixModels = '', - request, - write = true, + input, + output, + httpClient = HttpClient.FETCH, + clientName, + useOptions = false, + exportCore = true, + exportServices = true, + exportModels = true, + exportSchemas = false, + indent = Indent.SPACE_4, + postfixServices = 'Service', + postfixModels = '', + request, + write = true, }: Options): Promise => { - const openApi = isString(input) ? await getOpenApiSpec(input) : input; - const openApiVersion = getOpenApiVersion(openApi); - const templates = registerHandlebarTemplates({ + const openApi = isString(input) ? await getOpenApiSpec(input) : input; + const openApiVersion = getOpenApiVersion(openApi); + const templates = registerHandlebarTemplates({ + httpClient, + useOptions, + }); + + switch (openApiVersion) { + case OpenApiVersion.V2: { + const client = parseV2(openApi); + const clientFinal = postProcessClient(client); + if (!write) break; + await writeClient( + clientFinal, + templates, + output, httpClient, useOptions, - }); - - switch (openApiVersion) { - case OpenApiVersion.V2: { - const client = parseV2(openApi); - const clientFinal = postProcessClient(client); - if (!write) break; - await writeClient( - clientFinal, - templates, - output, - httpClient, - useOptions, - exportCore, - exportServices, - exportModels, - exportSchemas, - indent, - postfixServices, - postfixModels, - clientName, - request - ); - break; - } + exportCore, + exportServices, + exportModels, + exportSchemas, + indent, + postfixServices, + postfixModels, + clientName, + request, + ); + break; + } - case OpenApiVersion.V3: { - const client = parseV3(openApi); - const clientFinal = postProcessClient(client); - if (!write) break; - await writeClient( - clientFinal, - templates, - output, - httpClient, - useOptions, - exportCore, - exportServices, - exportModels, - exportSchemas, - indent, - postfixServices, - postfixModels, - clientName, - request - ); - break; - } + case OpenApiVersion.V3: { + const client = parseV3(openApi); + const clientFinal = postProcessClient(client); + if (!write) break; + await writeClient( + clientFinal, + templates, + output, + httpClient, + useOptions, + exportCore, + exportServices, + exportModels, + exportSchemas, + indent, + postfixServices, + postfixModels, + clientName, + request, + ); + break; } + } }; export default { - HttpClient, - generate, + HttpClient, + generate, }; diff --git a/src/openApi/v2/index.ts b/src/openApi/v2/index.ts index 9dbdadb34..1eaa23d73 100644 --- a/src/openApi/v2/index.ts +++ b/src/openApi/v2/index.ts @@ -11,10 +11,10 @@ import { getServiceVersion } from './parser/getServiceVersion'; * @param openApi The OpenAPI spec that we have loaded from disk. */ export const parse = (openApi: OpenApi): Client => { - const version = getServiceVersion(openApi.info.version); - const server = getServer(openApi); - const models = getModels(openApi); - const services = getServices(openApi); + const version = getServiceVersion(openApi.info.version); + const server = getServer(openApi); + const models = getModels(openApi); + const services = getServices(openApi); - return { version, server, models, services }; + return { version, server, models, services }; }; diff --git a/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts b/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts index 0d6ead780..05a585a22 100644 --- a/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts +++ b/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts @@ -1,4 +1,4 @@ export interface WithEnumExtension { - 'x-enum-varnames'?: string[]; - 'x-enum-descriptions'?: string[]; + 'x-enum-varnames'?: string[]; + 'x-enum-descriptions'?: string[]; } diff --git a/src/openApi/v2/interfaces/Extensions/WithNullableExtension.d.ts b/src/openApi/v2/interfaces/Extensions/WithNullableExtension.d.ts index ed2632ff5..4912b2c21 100644 --- a/src/openApi/v2/interfaces/Extensions/WithNullableExtension.d.ts +++ b/src/openApi/v2/interfaces/Extensions/WithNullableExtension.d.ts @@ -1,3 +1,3 @@ export interface WithNullableExtension { - 'x-nullable'?: boolean; + 'x-nullable'?: boolean; } diff --git a/src/openApi/v2/interfaces/OpenApi.d.ts b/src/openApi/v2/interfaces/OpenApi.d.ts index 1479c31ac..ab8fe8d80 100644 --- a/src/openApi/v2/interfaces/OpenApi.d.ts +++ b/src/openApi/v2/interfaces/OpenApi.d.ts @@ -13,19 +13,19 @@ import type { OpenApiTag } from './OpenApiTag'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md */ export interface OpenApi { - swagger: string; - info: OpenApiInfo; - host?: string; - basePath?: string; - schemes?: string[]; - consumes?: string[]; - produces?: string[]; - paths: Dictionary; - definitions?: Dictionary; - parameters?: Dictionary; - responses?: Dictionary; - securityDefinitions?: Dictionary; - security?: OpenApiSecurityRequirement[]; - tags?: OpenApiTag[]; - externalDocs?: OpenApiExternalDocs; + swagger: string; + info: OpenApiInfo; + host?: string; + basePath?: string; + schemes?: string[]; + consumes?: string[]; + produces?: string[]; + paths: Dictionary; + definitions?: Dictionary; + parameters?: Dictionary; + responses?: Dictionary; + securityDefinitions?: Dictionary; + security?: OpenApiSecurityRequirement[]; + tags?: OpenApiTag[]; + externalDocs?: OpenApiExternalDocs; } diff --git a/src/openApi/v2/interfaces/OpenApiContact.d.ts b/src/openApi/v2/interfaces/OpenApiContact.d.ts index 485e97a5e..858efe0c1 100644 --- a/src/openApi/v2/interfaces/OpenApiContact.d.ts +++ b/src/openApi/v2/interfaces/OpenApiContact.d.ts @@ -2,7 +2,7 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#contactObject */ export interface OpenApiContact { - name?: string; - url?: string; - email?: string; + name?: string; + url?: string; + email?: string; } diff --git a/src/openApi/v2/interfaces/OpenApiExample.d.ts b/src/openApi/v2/interfaces/OpenApiExample.d.ts index 692752f5c..a4bb6c1a5 100644 --- a/src/openApi/v2/interfaces/OpenApiExample.d.ts +++ b/src/openApi/v2/interfaces/OpenApiExample.d.ts @@ -2,5 +2,5 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#exampleObject */ export interface OpenApiExample { - [mimetype: string]: any; + [mimetype: string]: any; } diff --git a/src/openApi/v2/interfaces/OpenApiExternalDocs.d.ts b/src/openApi/v2/interfaces/OpenApiExternalDocs.d.ts index dfcc9bb5c..9a3a1d9a7 100644 --- a/src/openApi/v2/interfaces/OpenApiExternalDocs.d.ts +++ b/src/openApi/v2/interfaces/OpenApiExternalDocs.d.ts @@ -2,6 +2,6 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#externalDocumentationObject */ export interface OpenApiExternalDocs { - description?: string; - url: string; + description?: string; + url: string; } diff --git a/src/openApi/v2/interfaces/OpenApiHeader.d.ts b/src/openApi/v2/interfaces/OpenApiHeader.d.ts index 81d2a74c9..d9efa53a9 100644 --- a/src/openApi/v2/interfaces/OpenApiHeader.d.ts +++ b/src/openApi/v2/interfaces/OpenApiHeader.d.ts @@ -5,33 +5,33 @@ import type { OpenApiItems } from './OpenApiItems'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#headerObject */ export interface OpenApiHeader { - description?: string; - type: 'string' | 'number' | 'integer' | 'boolean' | 'array'; - format?: - | 'int32' - | 'int64' - | 'float' - | 'double' - | 'string' - | 'boolean' - | 'byte' - | 'binary' - | 'date' - | 'date-time' - | 'password'; - items?: Dictionary; - collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes'; - default?: any; - maximum?: number; - exclusiveMaximum?: boolean; - minimum?: number; - exclusiveMinimum?: boolean; - maxLength?: number; - minLength?: number; - pattern?: string; - maxItems?: number; - minItems?: number; - uniqueItems?: boolean; - enum?: (string | number)[]; - multipleOf?: number; + description?: string; + type: 'string' | 'number' | 'integer' | 'boolean' | 'array'; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; + items?: Dictionary; + collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes'; + default?: any; + maximum?: number; + exclusiveMaximum?: boolean; + minimum?: number; + exclusiveMinimum?: boolean; + maxLength?: number; + minLength?: number; + pattern?: string; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + enum?: (string | number)[]; + multipleOf?: number; } diff --git a/src/openApi/v2/interfaces/OpenApiInfo.d.ts b/src/openApi/v2/interfaces/OpenApiInfo.d.ts index 208dec9fd..0824d450f 100644 --- a/src/openApi/v2/interfaces/OpenApiInfo.d.ts +++ b/src/openApi/v2/interfaces/OpenApiInfo.d.ts @@ -5,10 +5,10 @@ import type { OpenApiLicense } from './OpenApiLicense'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#infoObject */ export interface OpenApiInfo { - title: string; - description?: string; - termsOfService?: string; - contact?: OpenApiContact; - license?: OpenApiLicense; - version: string; + title: string; + description?: string; + termsOfService?: string; + contact?: OpenApiContact; + license?: OpenApiLicense; + version: string; } diff --git a/src/openApi/v2/interfaces/OpenApiItems.d.ts b/src/openApi/v2/interfaces/OpenApiItems.d.ts index fa1d0b944..b90cc44af 100644 --- a/src/openApi/v2/interfaces/OpenApiItems.d.ts +++ b/src/openApi/v2/interfaces/OpenApiItems.d.ts @@ -4,32 +4,32 @@ import type { WithEnumExtension } from './Extensions/WithEnumExtension'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#itemsObject */ export interface OpenApiItems extends WithEnumExtension { - type?: string; - format?: - | 'int32' - | 'int64' - | 'float' - | 'double' - | 'string' - | 'boolean' - | 'byte' - | 'binary' - | 'date' - | 'date-time' - | 'password'; - items?: OpenApiItems; - collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes'; - default?: any; - maximum?: number; - exclusiveMaximum?: number; - minimum?: number; - exclusiveMinimum?: number; - maxLength?: number; - minLength?: number; - pattern?: string; - maxItems?: number; - minItems?: number; - uniqueItems?: boolean; - enum?: (string | number)[]; - multipleOf?: number; + type?: string; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; + items?: OpenApiItems; + collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes'; + default?: any; + maximum?: number; + exclusiveMaximum?: number; + minimum?: number; + exclusiveMinimum?: number; + maxLength?: number; + minLength?: number; + pattern?: string; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + enum?: (string | number)[]; + multipleOf?: number; } diff --git a/src/openApi/v2/interfaces/OpenApiLicense.d.ts b/src/openApi/v2/interfaces/OpenApiLicense.d.ts index 44fc2f4a3..492448693 100644 --- a/src/openApi/v2/interfaces/OpenApiLicense.d.ts +++ b/src/openApi/v2/interfaces/OpenApiLicense.d.ts @@ -2,6 +2,6 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#licenseObject */ export interface OpenApiLicense { - name: string; - url?: string; + name: string; + url?: string; } diff --git a/src/openApi/v2/interfaces/OpenApiOperation.d.ts b/src/openApi/v2/interfaces/OpenApiOperation.d.ts index aa811bd3f..5614a4a6c 100644 --- a/src/openApi/v2/interfaces/OpenApiOperation.d.ts +++ b/src/openApi/v2/interfaces/OpenApiOperation.d.ts @@ -7,16 +7,16 @@ import type { OpenApiSecurityRequirement } from './OpenApiSecurityRequirement'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#operationObject */ export interface OpenApiOperation { - tags?: string[]; - summary?: string; - description?: string; - externalDocs?: OpenApiExternalDocs; - operationId?: string; - consumes?: string[]; - produces?: string[]; - parameters?: OpenApiParameter[]; - responses: OpenApiResponses; - schemes?: ('http' | 'https' | 'ws' | 'wss')[]; - deprecated?: boolean; - security?: OpenApiSecurityRequirement[]; + tags?: string[]; + summary?: string; + description?: string; + externalDocs?: OpenApiExternalDocs; + operationId?: string; + consumes?: string[]; + produces?: string[]; + parameters?: OpenApiParameter[]; + responses: OpenApiResponses; + schemes?: ('http' | 'https' | 'ws' | 'wss')[]; + deprecated?: boolean; + security?: OpenApiSecurityRequirement[]; } diff --git a/src/openApi/v2/interfaces/OpenApiParameter.d.ts b/src/openApi/v2/interfaces/OpenApiParameter.d.ts index bdff0bb6f..589a171cf 100644 --- a/src/openApi/v2/interfaces/OpenApiParameter.d.ts +++ b/src/openApi/v2/interfaces/OpenApiParameter.d.ts @@ -8,38 +8,38 @@ import type { OpenApiSchema } from './OpenApiSchema'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameterObject */ export interface OpenApiParameter extends OpenApiReference, WithEnumExtension, WithNullableExtension { - name: string; - in: 'path' | 'query' | 'header' | 'formData' | 'body'; - description?: string; - required?: boolean; - schema?: OpenApiSchema; - type?: string; - format?: - | 'int32' - | 'int64' - | 'float' - | 'double' - | 'string' - | 'boolean' - | 'byte' - | 'binary' - | 'date' - | 'date-time' - | 'password'; - allowEmptyValue?: boolean; - items?: OpenApiItems; - collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes' | 'multi'; - default?: any; - maximum?: number; - exclusiveMaximum?: boolean; - minimum?: number; - exclusiveMinimum?: boolean; - maxLength?: number; - minLength?: number; - pattern?: string; - maxItems?: number; - minItems?: number; - uniqueItems?: boolean; - enum?: (string | number)[]; - multipleOf?: number; + name: string; + in: 'path' | 'query' | 'header' | 'formData' | 'body'; + description?: string; + required?: boolean; + schema?: OpenApiSchema; + type?: string; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; + allowEmptyValue?: boolean; + items?: OpenApiItems; + collectionFormat?: 'csv' | 'ssv' | 'tsv' | 'pipes' | 'multi'; + default?: any; + maximum?: number; + exclusiveMaximum?: boolean; + minimum?: number; + exclusiveMinimum?: boolean; + maxLength?: number; + minLength?: number; + pattern?: string; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + enum?: (string | number)[]; + multipleOf?: number; } diff --git a/src/openApi/v2/interfaces/OpenApiPath.d.ts b/src/openApi/v2/interfaces/OpenApiPath.d.ts index 62d8e7552..498cebac6 100644 --- a/src/openApi/v2/interfaces/OpenApiPath.d.ts +++ b/src/openApi/v2/interfaces/OpenApiPath.d.ts @@ -6,12 +6,12 @@ import type { OpenApiReference } from './OpenApiReference'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#pathItemObject */ export interface OpenApiPath extends OpenApiReference { - get?: OpenApiOperation; - put?: OpenApiOperation; - post?: OpenApiOperation; - delete?: OpenApiOperation; - options?: OpenApiOperation; - head?: OpenApiOperation; - patch?: OpenApiOperation; - parameters?: OpenApiParameter[]; + get?: OpenApiOperation; + put?: OpenApiOperation; + post?: OpenApiOperation; + delete?: OpenApiOperation; + options?: OpenApiOperation; + head?: OpenApiOperation; + patch?: OpenApiOperation; + parameters?: OpenApiParameter[]; } diff --git a/src/openApi/v2/interfaces/OpenApiReference.d.ts b/src/openApi/v2/interfaces/OpenApiReference.d.ts index cbf3253db..93a0d7561 100644 --- a/src/openApi/v2/interfaces/OpenApiReference.d.ts +++ b/src/openApi/v2/interfaces/OpenApiReference.d.ts @@ -2,5 +2,5 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#referenceObject */ export interface OpenApiReference { - $ref?: string; + $ref?: string; } diff --git a/src/openApi/v2/interfaces/OpenApiResponse.d.ts b/src/openApi/v2/interfaces/OpenApiResponse.d.ts index 64a0bc85a..bc49508d7 100644 --- a/src/openApi/v2/interfaces/OpenApiResponse.d.ts +++ b/src/openApi/v2/interfaces/OpenApiResponse.d.ts @@ -8,8 +8,8 @@ import type { OpenApiSchema } from './OpenApiSchema'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responseObject */ export interface OpenApiResponse extends OpenApiReference { - description: string; - schema?: OpenApiSchema & OpenApiReference; - headers?: Dictionary; - examples?: OpenApiExample; + description: string; + schema?: OpenApiSchema & OpenApiReference; + headers?: Dictionary; + examples?: OpenApiExample; } diff --git a/src/openApi/v2/interfaces/OpenApiResponses.d.ts b/src/openApi/v2/interfaces/OpenApiResponses.d.ts index 35b20454f..a588b7686 100644 --- a/src/openApi/v2/interfaces/OpenApiResponses.d.ts +++ b/src/openApi/v2/interfaces/OpenApiResponses.d.ts @@ -4,7 +4,7 @@ import type { OpenApiResponse } from './OpenApiResponse'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responsesObject */ export interface OpenApiResponses { - default?: OpenApiResponse; + default?: OpenApiResponse; - [httpcode: string]: OpenApiResponse; + [httpcode: string]: OpenApiResponse; } diff --git a/src/openApi/v2/interfaces/OpenApiSchema.d.ts b/src/openApi/v2/interfaces/OpenApiSchema.d.ts index 09970dbb6..a2b63fe51 100644 --- a/src/openApi/v2/interfaces/OpenApiSchema.d.ts +++ b/src/openApi/v2/interfaces/OpenApiSchema.d.ts @@ -9,44 +9,44 @@ import type { OpenApiXml } from './OpenApiXml'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#schemaObject */ export interface OpenApiSchema extends OpenApiReference, WithEnumExtension, WithNullableExtension { - title?: string; - description?: string; - default?: any; - multipleOf?: number; - maximum?: number; - exclusiveMaximum?: boolean; - minimum?: number; - exclusiveMinimum?: boolean; - maxLength?: number; - minLength?: number; - pattern?: string; - maxItems?: number; - minItems?: number; - uniqueItems?: boolean; - maxProperties?: number; - minProperties?: number; - required?: string[]; - enum?: (string | number)[]; - type?: string; - format?: - | 'int32' - | 'int64' - | 'float' - | 'double' - | 'string' - | 'boolean' - | 'byte' - | 'binary' - | 'date' - | 'date-time' - | 'password'; - items?: OpenApiSchema; - allOf?: OpenApiSchema[]; - properties?: Dictionary; - additionalProperties?: boolean | OpenApiSchema; - discriminator?: string; - readOnly?: boolean; - xml?: OpenApiXml; - externalDocs?: OpenApiExternalDocs; - example?: any; + title?: string; + description?: string; + default?: any; + multipleOf?: number; + maximum?: number; + exclusiveMaximum?: boolean; + minimum?: number; + exclusiveMinimum?: boolean; + maxLength?: number; + minLength?: number; + pattern?: string; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + maxProperties?: number; + minProperties?: number; + required?: string[]; + enum?: (string | number)[]; + type?: string; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; + items?: OpenApiSchema; + allOf?: OpenApiSchema[]; + properties?: Dictionary; + additionalProperties?: boolean | OpenApiSchema; + discriminator?: string; + readOnly?: boolean; + xml?: OpenApiXml; + externalDocs?: OpenApiExternalDocs; + example?: any; } diff --git a/src/openApi/v2/interfaces/OpenApiSecurityRequirement.d.ts b/src/openApi/v2/interfaces/OpenApiSecurityRequirement.d.ts index 3c1ce9af6..f5a424a97 100644 --- a/src/openApi/v2/interfaces/OpenApiSecurityRequirement.d.ts +++ b/src/openApi/v2/interfaces/OpenApiSecurityRequirement.d.ts @@ -2,5 +2,5 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#securityRequirementObject */ export interface OpenApiSecurityRequirement { - [key: string]: string; + [key: string]: string; } diff --git a/src/openApi/v2/interfaces/OpenApiSecurityScheme.d.ts b/src/openApi/v2/interfaces/OpenApiSecurityScheme.d.ts index 121c737a9..891acb3b8 100644 --- a/src/openApi/v2/interfaces/OpenApiSecurityScheme.d.ts +++ b/src/openApi/v2/interfaces/OpenApiSecurityScheme.d.ts @@ -4,12 +4,12 @@ import type { Dictionary } from '../../../utils/types'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#securitySchemeObject */ export interface OpenApiSecurityScheme { - type: 'basic' | 'apiKey' | 'oauth2'; - description?: string; - name?: string; - in?: 'query' | 'header'; - flow?: 'implicit' | 'password' | 'application' | 'accessCode'; - authorizationUrl?: string; - tokenUrl?: string; - scopes: Dictionary; + type: 'basic' | 'apiKey' | 'oauth2'; + description?: string; + name?: string; + in?: 'query' | 'header'; + flow?: 'implicit' | 'password' | 'application' | 'accessCode'; + authorizationUrl?: string; + tokenUrl?: string; + scopes: Dictionary; } diff --git a/src/openApi/v2/interfaces/OpenApiTag.d.ts b/src/openApi/v2/interfaces/OpenApiTag.d.ts index 85063452a..9ca1805cf 100644 --- a/src/openApi/v2/interfaces/OpenApiTag.d.ts +++ b/src/openApi/v2/interfaces/OpenApiTag.d.ts @@ -4,7 +4,7 @@ import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#tagObject */ export interface OpenApiTag { - name: string; - description?: string; - externalDocs?: OpenApiExternalDocs; + name: string; + description?: string; + externalDocs?: OpenApiExternalDocs; } diff --git a/src/openApi/v2/interfaces/OpenApiXml.d.ts b/src/openApi/v2/interfaces/OpenApiXml.d.ts index 6bd8a1bcc..8e256ee86 100644 --- a/src/openApi/v2/interfaces/OpenApiXml.d.ts +++ b/src/openApi/v2/interfaces/OpenApiXml.d.ts @@ -2,9 +2,9 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#xmlObject */ export interface OpenApiXml { - name?: string; - namespace?: string; - prefix?: string; - attribute?: boolean; - wrapped?: boolean; + name?: string; + namespace?: string; + prefix?: string; + attribute?: boolean; + wrapped?: boolean; } diff --git a/src/openApi/v2/parser/escapeName.spec.ts b/src/openApi/v2/parser/escapeName.spec.ts index 8e343d4f9..3d9409915 100644 --- a/src/openApi/v2/parser/escapeName.spec.ts +++ b/src/openApi/v2/parser/escapeName.spec.ts @@ -1,21 +1,21 @@ import { escapeName } from './escapeName'; describe('escapeName', () => { - it('should escape', () => { - expect(escapeName('')).toEqual("''"); - expect(escapeName('fooBar')).toEqual('fooBar'); - expect(escapeName('Foo Bar')).toEqual(`'Foo Bar'`); - expect(escapeName('foo bar')).toEqual(`'foo bar'`); - expect(escapeName('foo-bar')).toEqual(`'foo-bar'`); - expect(escapeName('foo.bar')).toEqual(`'foo.bar'`); - expect(escapeName('foo_bar')).toEqual('foo_bar'); - expect(escapeName('123foo.bar')).toEqual(`'123foo.bar'`); - expect(escapeName('@foo.bar')).toEqual(`'@foo.bar'`); - expect(escapeName('$foo.bar')).toEqual(`'$foo.bar'`); - expect(escapeName('_foo.bar')).toEqual(`'_foo.bar'`); - expect(escapeName('123foobar')).toEqual(`'123foobar'`); - expect(escapeName('@foobar')).toEqual(`'@foobar'`); - expect(escapeName('$foobar')).toEqual('$foobar'); - expect(escapeName('_foobar')).toEqual('_foobar'); - }); + it('should escape', () => { + expect(escapeName('')).toEqual("''"); + expect(escapeName('fooBar')).toEqual('fooBar'); + expect(escapeName('Foo Bar')).toEqual(`'Foo Bar'`); + expect(escapeName('foo bar')).toEqual(`'foo bar'`); + expect(escapeName('foo-bar')).toEqual(`'foo-bar'`); + expect(escapeName('foo.bar')).toEqual(`'foo.bar'`); + expect(escapeName('foo_bar')).toEqual('foo_bar'); + expect(escapeName('123foo.bar')).toEqual(`'123foo.bar'`); + expect(escapeName('@foo.bar')).toEqual(`'@foo.bar'`); + expect(escapeName('$foo.bar')).toEqual(`'$foo.bar'`); + expect(escapeName('_foo.bar')).toEqual(`'_foo.bar'`); + expect(escapeName('123foobar')).toEqual(`'123foobar'`); + expect(escapeName('@foobar')).toEqual(`'@foobar'`); + expect(escapeName('$foobar')).toEqual('$foobar'); + expect(escapeName('_foobar')).toEqual('_foobar'); + }); }); diff --git a/src/openApi/v2/parser/escapeName.ts b/src/openApi/v2/parser/escapeName.ts index 9d6816c10..403d69583 100644 --- a/src/openApi/v2/parser/escapeName.ts +++ b/src/openApi/v2/parser/escapeName.ts @@ -1,9 +1,9 @@ export const escapeName = (value: string): string => { - if (value || value === '') { - const validName = /^[a-zA-Z_$][\w$]+$/g.test(value); - if (!validName) { - return `'${value}'`; - } + if (value || value === '') { + const validName = /^[a-zA-Z_$][\w$]+$/g.test(value); + if (!validName) { + return `'${value}'`; } - return value; + } + return value; }; diff --git a/src/openApi/v2/parser/extendEnum.ts b/src/openApi/v2/parser/extendEnum.ts index a7fa865cb..d2b9373f7 100644 --- a/src/openApi/v2/parser/extendEnum.ts +++ b/src/openApi/v2/parser/extendEnum.ts @@ -9,13 +9,13 @@ import type { WithEnumExtension } from '../interfaces/Extensions/WithEnumExtensi * @param definition */ export const extendEnum = (enumerators: Enum[], definition: WithEnumExtension): Enum[] => { - const names = definition['x-enum-varnames']?.filter(isString); - const descriptions = definition['x-enum-descriptions']?.filter(isString); + const names = definition['x-enum-varnames']?.filter(isString); + const descriptions = definition['x-enum-descriptions']?.filter(isString); - return enumerators.map((enumerator, index) => ({ - name: names?.[index] || enumerator.name, - description: descriptions?.[index] || enumerator.description, - value: enumerator.value, - type: enumerator.type, - })); + return enumerators.map((enumerator, index) => ({ + name: names?.[index] || enumerator.name, + description: descriptions?.[index] || enumerator.description, + value: enumerator.value, + type: enumerator.type, + })); }; diff --git a/src/openApi/v2/parser/getEnum.ts b/src/openApi/v2/parser/getEnum.ts index 64c7ca8b5..e7959b85c 100644 --- a/src/openApi/v2/parser/getEnum.ts +++ b/src/openApi/v2/parser/getEnum.ts @@ -1,34 +1,34 @@ import type { Enum } from '../../../client/interfaces/Enum'; export const getEnum = (values?: (string | number)[]): Enum[] => { - if (Array.isArray(values)) { - return values - .filter((value, index, arr) => { - return arr.indexOf(value) === index; - }) - .filter((value: any) => { - return typeof value === 'number' || typeof value === 'string'; - }) - .map(value => { - if (typeof value === 'number') { - return { - name: `'_${value}'`, - value: String(value), - type: 'number', - description: null, - }; - } - return { - name: String(value) - .replace(/\W+/g, '_') - .replace(/^(\d+)/g, '_$1') - .replace(/([a-z])([A-Z]+)/g, '$1_$2') - .toUpperCase(), - value: `'${value.replace(/'/g, "\\'")}'`, - type: 'string', - description: null, - }; - }); - } - return []; + if (Array.isArray(values)) { + return values + .filter((value, index, arr) => { + return arr.indexOf(value) === index; + }) + .filter((value: any) => { + return typeof value === 'number' || typeof value === 'string'; + }) + .map((value) => { + if (typeof value === 'number') { + return { + name: `'_${value}'`, + value: String(value), + type: 'number', + description: null, + }; + } + return { + name: String(value) + .replace(/\W+/g, '_') + .replace(/^(\d+)/g, '_$1') + .replace(/([a-z])([A-Z]+)/g, '$1_$2') + .toUpperCase(), + value: `'${value.replace(/'/g, "\\'")}'`, + type: 'string', + description: null, + }; + }); + } + return []; }; diff --git a/src/openApi/v2/parser/getMappedType.spec.ts b/src/openApi/v2/parser/getMappedType.spec.ts index f6d7886c6..5dc1ab45c 100644 --- a/src/openApi/v2/parser/getMappedType.spec.ts +++ b/src/openApi/v2/parser/getMappedType.spec.ts @@ -1,21 +1,21 @@ import { getMappedType } from './getMappedType'; describe('getMappedType', () => { - it('should map types to the basics', () => { - expect(getMappedType('file')).toEqual('binary'); - expect(getMappedType('string')).toEqual('string'); - expect(getMappedType('date')).toEqual('date'); - expect(getMappedType('date-time')).toEqual('date'); - expect(getMappedType('float')).toEqual('number'); - expect(getMappedType('double')).toEqual('number'); - expect(getMappedType('short')).toEqual('number'); - expect(getMappedType('int')).toEqual('number'); - expect(getMappedType('boolean')).toEqual('boolean'); - expect(getMappedType('any')).toEqual('any'); - expect(getMappedType('object')).toEqual('any'); - expect(getMappedType('void')).toEqual('void'); - expect(getMappedType('null')).toEqual('null'); - expect(getMappedType('unknown')).toEqual(undefined); - expect(getMappedType('')).toEqual(undefined); - }); + it('should map types to the basics', () => { + expect(getMappedType('file')).toEqual('binary'); + expect(getMappedType('string')).toEqual('string'); + expect(getMappedType('date')).toEqual('date'); + expect(getMappedType('date-time')).toEqual('date'); + expect(getMappedType('float')).toEqual('number'); + expect(getMappedType('double')).toEqual('number'); + expect(getMappedType('short')).toEqual('number'); + expect(getMappedType('int')).toEqual('number'); + expect(getMappedType('boolean')).toEqual('boolean'); + expect(getMappedType('any')).toEqual('any'); + expect(getMappedType('object')).toEqual('any'); + expect(getMappedType('void')).toEqual('void'); + expect(getMappedType('null')).toEqual('null'); + expect(getMappedType('unknown')).toEqual(undefined); + expect(getMappedType('')).toEqual(undefined); + }); }); diff --git a/src/openApi/v2/parser/getMappedType.ts b/src/openApi/v2/parser/getMappedType.ts index 74806f1ce..44f4ec204 100644 --- a/src/openApi/v2/parser/getMappedType.ts +++ b/src/openApi/v2/parser/getMappedType.ts @@ -1,32 +1,32 @@ const TYPE_MAPPINGS = new Map([ - ['file', 'binary'], - ['any', 'any'], - ['object', 'any'], - ['array', 'any[]'], - ['boolean', 'boolean'], - ['byte', 'number'], - ['int', 'number'], - ['integer', 'number'], - ['float', 'number'], - ['double', 'number'], - ['short', 'number'], - ['long', 'number'], - ['number', 'number'], - ['char', 'string'], - ['date', 'date'], - ['date-time', 'date'], - ['password', 'string'], - ['string', 'string'], - ['void', 'void'], - ['null', 'null'], + ['file', 'binary'], + ['any', 'any'], + ['object', 'any'], + ['array', 'any[]'], + ['boolean', 'boolean'], + ['byte', 'number'], + ['int', 'number'], + ['integer', 'number'], + ['float', 'number'], + ['double', 'number'], + ['short', 'number'], + ['long', 'number'], + ['number', 'number'], + ['char', 'string'], + ['date', 'date'], + ['date-time', 'date'], + ['password', 'string'], + ['string', 'string'], + ['void', 'void'], + ['null', 'null'], ]); /** * Get mapped type for given type to any basic Typescript/Javascript type. */ export const getMappedType = (type: string, format?: string): string | undefined => { - if (format === 'binary') { - return 'binary'; - } - return TYPE_MAPPINGS.get(type); + if (format === 'binary') { + return 'binary'; + } + return TYPE_MAPPINGS.get(type); }; diff --git a/src/openApi/v2/parser/getModel.ts b/src/openApi/v2/parser/getModel.ts index 22f3528aa..e57de56c4 100644 --- a/src/openApi/v2/parser/getModel.ts +++ b/src/openApi/v2/parser/getModel.ts @@ -9,145 +9,145 @@ import { getModelProperties } from './getModelProperties'; import { getType } from './getType'; export const getModel = ( - openApi: OpenApi, - definition: OpenApiSchema, - isDefinition: boolean = false, - name: string = '' + openApi: OpenApi, + definition: OpenApiSchema, + isDefinition: boolean = false, + name: string = '', ): Model => { - const model: Model = { - name, - export: 'interface', - type: 'any', - base: 'any', - template: null, - link: null, - description: definition.description || null, - isDefinition, - isReadOnly: definition.readOnly === true, - isNullable: definition['x-nullable'] === true, - isRequired: false, - format: definition.format, - maximum: definition.maximum, - exclusiveMaximum: definition.exclusiveMaximum, - minimum: definition.minimum, - exclusiveMinimum: definition.exclusiveMinimum, - multipleOf: definition.multipleOf, - maxLength: definition.maxLength, - minLength: definition.minLength, - maxItems: definition.maxItems, - minItems: definition.minItems, - uniqueItems: definition.uniqueItems, - maxProperties: definition.maxProperties, - minProperties: definition.minProperties, - pattern: getPattern(definition.pattern), - imports: [], - enum: [], - enums: [], - properties: [], - }; + const model: Model = { + name, + export: 'interface', + type: 'any', + base: 'any', + template: null, + link: null, + description: definition.description || null, + isDefinition, + isReadOnly: definition.readOnly === true, + isNullable: definition['x-nullable'] === true, + isRequired: false, + format: definition.format, + maximum: definition.maximum, + exclusiveMaximum: definition.exclusiveMaximum, + minimum: definition.minimum, + exclusiveMinimum: definition.exclusiveMinimum, + multipleOf: definition.multipleOf, + maxLength: definition.maxLength, + minLength: definition.minLength, + maxItems: definition.maxItems, + minItems: definition.minItems, + uniqueItems: definition.uniqueItems, + maxProperties: definition.maxProperties, + minProperties: definition.minProperties, + pattern: getPattern(definition.pattern), + imports: [], + enum: [], + enums: [], + properties: [], + }; - if (definition.$ref) { - const definitionRef = getType(definition.$ref); - model.export = 'reference'; - model.type = definitionRef.type; - model.base = definitionRef.base; - model.template = definitionRef.template; - model.imports.push(...definitionRef.imports); - return model; - } + if (definition.$ref) { + const definitionRef = getType(definition.$ref); + model.export = 'reference'; + model.type = definitionRef.type; + model.base = definitionRef.base; + model.template = definitionRef.template; + model.imports.push(...definitionRef.imports); + return model; + } - if (definition.enum && definition.type !== 'boolean') { - const enumerators = getEnum(definition.enum); - const extendedEnumerators = extendEnum(enumerators, definition); - if (extendedEnumerators.length) { - model.export = 'enum'; - model.type = 'string'; - model.base = 'string'; - model.enum.push(...extendedEnumerators); - return model; - } + if (definition.enum && definition.type !== 'boolean') { + const enumerators = getEnum(definition.enum); + const extendedEnumerators = extendEnum(enumerators, definition); + if (extendedEnumerators.length) { + model.export = 'enum'; + model.type = 'string'; + model.base = 'string'; + model.enum.push(...extendedEnumerators); + return model; } + } - if (definition.type === 'array' && definition.items) { - if (definition.items.$ref) { - const arrayItems = getType(definition.items.$ref); - model.export = 'array'; - model.type = arrayItems.type; - model.base = arrayItems.base; - model.template = arrayItems.template; - model.imports.push(...arrayItems.imports); - return model; - } else { - const arrayItems = getModel(openApi, definition.items); - model.export = 'array'; - model.type = arrayItems.type; - model.base = arrayItems.base; - model.template = arrayItems.template; - model.link = arrayItems; - model.imports.push(...arrayItems.imports); - return model; - } + if (definition.type === 'array' && definition.items) { + if (definition.items.$ref) { + const arrayItems = getType(definition.items.$ref); + model.export = 'array'; + model.type = arrayItems.type; + model.base = arrayItems.base; + model.template = arrayItems.template; + model.imports.push(...arrayItems.imports); + return model; + } else { + const arrayItems = getModel(openApi, definition.items); + model.export = 'array'; + model.type = arrayItems.type; + model.base = arrayItems.base; + model.template = arrayItems.template; + model.link = arrayItems; + model.imports.push(...arrayItems.imports); + return model; } + } - if (definition.type === 'object' && typeof definition.additionalProperties === 'object') { - if (definition.additionalProperties.$ref) { - const additionalProperties = getType(definition.additionalProperties.$ref); - model.export = 'dictionary'; - model.type = additionalProperties.type; - model.base = additionalProperties.base; - model.template = additionalProperties.template; - model.imports.push(...additionalProperties.imports); - return model; - } else { - const additionalProperties = getModel(openApi, definition.additionalProperties); - model.export = 'dictionary'; - model.type = additionalProperties.type; - model.base = additionalProperties.base; - model.template = additionalProperties.template; - model.link = additionalProperties; - model.imports.push(...additionalProperties.imports); - return model; - } + if (definition.type === 'object' && typeof definition.additionalProperties === 'object') { + if (definition.additionalProperties.$ref) { + const additionalProperties = getType(definition.additionalProperties.$ref); + model.export = 'dictionary'; + model.type = additionalProperties.type; + model.base = additionalProperties.base; + model.template = additionalProperties.template; + model.imports.push(...additionalProperties.imports); + return model; + } else { + const additionalProperties = getModel(openApi, definition.additionalProperties); + model.export = 'dictionary'; + model.type = additionalProperties.type; + model.base = additionalProperties.base; + model.template = additionalProperties.template; + model.link = additionalProperties; + model.imports.push(...additionalProperties.imports); + return model; } + } - if (definition.allOf?.length) { - const composition = getModelComposition(openApi, definition, definition.allOf, 'all-of', getModel); - model.export = composition.type; - model.imports.push(...composition.imports); - model.properties.push(...composition.properties); - model.enums.push(...composition.enums); - return model; - } + if (definition.allOf?.length) { + const composition = getModelComposition(openApi, definition, definition.allOf, 'all-of', getModel); + model.export = composition.type; + model.imports.push(...composition.imports); + model.properties.push(...composition.properties); + model.enums.push(...composition.enums); + return model; + } - if (definition.type === 'object') { - model.export = 'interface'; - model.type = 'any'; - model.base = 'any'; + if (definition.type === 'object') { + model.export = 'interface'; + model.type = 'any'; + model.base = 'any'; - if (definition.properties) { - const modelProperties = getModelProperties(openApi, definition, getModel); - modelProperties.forEach(modelProperty => { - model.imports.push(...modelProperty.imports); - model.enums.push(...modelProperty.enums); - model.properties.push(modelProperty); - if (modelProperty.export === 'enum') { - model.enums.push(modelProperty); - } - }); + if (definition.properties) { + const modelProperties = getModelProperties(openApi, definition, getModel); + modelProperties.forEach((modelProperty) => { + model.imports.push(...modelProperty.imports); + model.enums.push(...modelProperty.enums); + model.properties.push(modelProperty); + if (modelProperty.export === 'enum') { + model.enums.push(modelProperty); } - return model; - } - - // If the schema has a type than it can be a basic or generic type. - if (definition.type) { - const definitionType = getType(definition.type, definition.format); - model.export = 'generic'; - model.type = definitionType.type; - model.base = definitionType.base; - model.template = definitionType.template; - model.imports.push(...definitionType.imports); - return model; + }); } + return model; + } + // If the schema has a type than it can be a basic or generic type. + if (definition.type) { + const definitionType = getType(definition.type, definition.format); + model.export = 'generic'; + model.type = definitionType.type; + model.base = definitionType.base; + model.template = definitionType.template; + model.imports.push(...definitionType.imports); return model; + } + + return model; }; diff --git a/src/openApi/v2/parser/getModelComposition.ts b/src/openApi/v2/parser/getModelComposition.ts index 6b5e4c305..4adfabb48 100644 --- a/src/openApi/v2/parser/getModelComposition.ts +++ b/src/openApi/v2/parser/getModelComposition.ts @@ -10,81 +10,81 @@ import { getRequiredPropertiesFromComposition } from './getRequiredPropertiesFro export type GetModelFn = typeof getModel; export const getModelComposition = ( - openApi: OpenApi, - definition: OpenApiSchema, - definitions: OpenApiSchema[], - type: 'one-of' | 'any-of' | 'all-of', - getModel: GetModelFn + openApi: OpenApi, + definition: OpenApiSchema, + definitions: OpenApiSchema[], + type: 'one-of' | 'any-of' | 'all-of', + getModel: GetModelFn, ): ModelComposition => { - const composition: ModelComposition = { - type, - imports: [], - enums: [], - properties: [], - }; + const composition: ModelComposition = { + type, + imports: [], + enums: [], + properties: [], + }; - const properties: Model[] = []; + const properties: Model[] = []; - definitions - .map(definition => getModel(openApi, definition)) - .filter(model => { - const hasProperties = model.properties.length; - const hasEnums = model.enums.length; - const isObject = model.type === 'any'; - const isEmpty = isObject && !hasProperties && !hasEnums; - return !isEmpty; - }) - .forEach(model => { - composition.imports.push(...model.imports); - composition.enums.push(...model.enums); - composition.properties.push(model); - }); + definitions + .map((definition) => getModel(openApi, definition)) + .filter((model) => { + const hasProperties = model.properties.length; + const hasEnums = model.enums.length; + const isObject = model.type === 'any'; + const isEmpty = isObject && !hasProperties && !hasEnums; + return !isEmpty; + }) + .forEach((model) => { + composition.imports.push(...model.imports); + composition.enums.push(...model.enums); + composition.properties.push(model); + }); - if (definition.required) { - const requiredProperties = getRequiredPropertiesFromComposition( - openApi, - definition.required, - definitions, - getModel - ); - requiredProperties.forEach(requiredProperty => { - composition.imports.push(...requiredProperty.imports); - composition.enums.push(...requiredProperty.enums); - }); - properties.push(...requiredProperties); - } + if (definition.required) { + const requiredProperties = getRequiredPropertiesFromComposition( + openApi, + definition.required, + definitions, + getModel, + ); + requiredProperties.forEach((requiredProperty) => { + composition.imports.push(...requiredProperty.imports); + composition.enums.push(...requiredProperty.enums); + }); + properties.push(...requiredProperties); + } - if (definition.properties) { - const modelProperties = getModelProperties(openApi, definition, getModel); - modelProperties.forEach(modelProperty => { - composition.imports.push(...modelProperty.imports); - composition.enums.push(...modelProperty.enums); - if (modelProperty.export === 'enum') { - composition.enums.push(modelProperty); - } - }); - properties.push(...modelProperties); - } + if (definition.properties) { + const modelProperties = getModelProperties(openApi, definition, getModel); + modelProperties.forEach((modelProperty) => { + composition.imports.push(...modelProperty.imports); + composition.enums.push(...modelProperty.enums); + if (modelProperty.export === 'enum') { + composition.enums.push(modelProperty); + } + }); + properties.push(...modelProperties); + } - if (properties.length) { - composition.properties.push({ - name: 'properties', - export: 'interface', - type: 'any', - base: 'any', - template: null, - link: null, - description: '', - isDefinition: false, - isReadOnly: false, - isNullable: false, - isRequired: false, - imports: [], - enum: [], - enums: [], - properties, - }); - } + if (properties.length) { + composition.properties.push({ + name: 'properties', + export: 'interface', + type: 'any', + base: 'any', + template: null, + link: null, + description: '', + isDefinition: false, + isReadOnly: false, + isNullable: false, + isRequired: false, + imports: [], + enum: [], + enums: [], + properties, + }); + } - return composition; + return composition; }; diff --git a/src/openApi/v2/parser/getModelProperties.ts b/src/openApi/v2/parser/getModelProperties.ts index 7560be765..27d9997ce 100644 --- a/src/openApi/v2/parser/getModelProperties.ts +++ b/src/openApi/v2/parser/getModelProperties.ts @@ -10,79 +10,79 @@ import { getType } from './getType'; export type GetModelFn = typeof getModel; export const getModelProperties = (openApi: OpenApi, definition: OpenApiSchema, getModel: GetModelFn): Model[] => { - const models: Model[] = []; - for (const propertyName in definition.properties) { - if (definition.properties.hasOwnProperty(propertyName)) { - const property = definition.properties[propertyName]; - const propertyRequired = !!definition.required?.includes(propertyName); - if (property.$ref) { - const model = getType(property.$ref); - models.push({ - name: escapeName(propertyName), - export: 'reference', - type: model.type, - base: model.base, - template: model.template, - link: null, - description: property.description || null, - isDefinition: false, - isReadOnly: property.readOnly === true, - isRequired: propertyRequired, - isNullable: property['x-nullable'] === true, - format: property.format, - maximum: property.maximum, - exclusiveMaximum: property.exclusiveMaximum, - minimum: property.minimum, - exclusiveMinimum: property.exclusiveMinimum, - multipleOf: property.multipleOf, - maxLength: property.maxLength, - minLength: property.minLength, - maxItems: property.maxItems, - minItems: property.minItems, - uniqueItems: property.uniqueItems, - maxProperties: property.maxProperties, - minProperties: property.minProperties, - pattern: getPattern(property.pattern), - imports: model.imports, - enum: [], - enums: [], - properties: [], - }); - } else { - const model = getModel(openApi, property); - models.push({ - name: escapeName(propertyName), - export: model.export, - type: model.type, - base: model.base, - template: model.template, - link: model.link, - description: property.description || null, - isDefinition: false, - isReadOnly: property.readOnly === true, - isRequired: propertyRequired, - isNullable: property['x-nullable'] === true, - format: property.format, - maximum: property.maximum, - exclusiveMaximum: property.exclusiveMaximum, - minimum: property.minimum, - exclusiveMinimum: property.exclusiveMinimum, - multipleOf: property.multipleOf, - maxLength: property.maxLength, - minLength: property.minLength, - maxItems: property.maxItems, - minItems: property.minItems, - uniqueItems: property.uniqueItems, - maxProperties: property.maxProperties, - minProperties: property.minProperties, - pattern: getPattern(property.pattern), - imports: model.imports, - enum: model.enum, - enums: model.enums, - properties: model.properties, - }); - } - } + const models: Model[] = []; + for (const propertyName in definition.properties) { + if (definition.properties.hasOwnProperty(propertyName)) { + const property = definition.properties[propertyName]; + const propertyRequired = !!definition.required?.includes(propertyName); + if (property.$ref) { + const model = getType(property.$ref); + models.push({ + name: escapeName(propertyName), + export: 'reference', + type: model.type, + base: model.base, + template: model.template, + link: null, + description: property.description || null, + isDefinition: false, + isReadOnly: property.readOnly === true, + isRequired: propertyRequired, + isNullable: property['x-nullable'] === true, + format: property.format, + maximum: property.maximum, + exclusiveMaximum: property.exclusiveMaximum, + minimum: property.minimum, + exclusiveMinimum: property.exclusiveMinimum, + multipleOf: property.multipleOf, + maxLength: property.maxLength, + minLength: property.minLength, + maxItems: property.maxItems, + minItems: property.minItems, + uniqueItems: property.uniqueItems, + maxProperties: property.maxProperties, + minProperties: property.minProperties, + pattern: getPattern(property.pattern), + imports: model.imports, + enum: [], + enums: [], + properties: [], + }); + } else { + const model = getModel(openApi, property); + models.push({ + name: escapeName(propertyName), + export: model.export, + type: model.type, + base: model.base, + template: model.template, + link: model.link, + description: property.description || null, + isDefinition: false, + isReadOnly: property.readOnly === true, + isRequired: propertyRequired, + isNullable: property['x-nullable'] === true, + format: property.format, + maximum: property.maximum, + exclusiveMaximum: property.exclusiveMaximum, + minimum: property.minimum, + exclusiveMinimum: property.exclusiveMinimum, + multipleOf: property.multipleOf, + maxLength: property.maxLength, + minLength: property.minLength, + maxItems: property.maxItems, + minItems: property.minItems, + uniqueItems: property.uniqueItems, + maxProperties: property.maxProperties, + minProperties: property.minProperties, + pattern: getPattern(property.pattern), + imports: model.imports, + enum: model.enum, + enums: model.enums, + properties: model.properties, + }); + } } - return models; + } + return models; }; diff --git a/src/openApi/v2/parser/getModelTemplate.spec.ts b/src/openApi/v2/parser/getModelTemplate.spec.ts index 09c920a4d..db8ea2191 100644 --- a/src/openApi/v2/parser/getModelTemplate.spec.ts +++ b/src/openApi/v2/parser/getModelTemplate.spec.ts @@ -1,25 +1,25 @@ import { getModelTemplate } from './getModelTemplate'; describe('getModelTemplate', () => { - it('should return generic for template type', () => { - const template = getModelTemplate({ - type: 'Link', - base: 'Link', - template: 'Model', - imports: ['Model'], - isNullable: false, - }); - expect(template).toEqual(''); + it('should return generic for template type', () => { + const template = getModelTemplate({ + type: 'Link', + base: 'Link', + template: 'Model', + imports: ['Model'], + isNullable: false, }); + expect(template).toEqual(''); + }); - it('should return empty for primary type', () => { - const template = getModelTemplate({ - type: 'string', - base: 'string', - template: null, - imports: [], - isNullable: false, - }); - expect(template).toEqual(''); + it('should return empty for primary type', () => { + const template = getModelTemplate({ + type: 'string', + base: 'string', + template: null, + imports: [], + isNullable: false, }); + expect(template).toEqual(''); + }); }); diff --git a/src/openApi/v2/parser/getModelTemplate.ts b/src/openApi/v2/parser/getModelTemplate.ts index b2aa0b33a..fa41b5ff8 100644 --- a/src/openApi/v2/parser/getModelTemplate.ts +++ b/src/openApi/v2/parser/getModelTemplate.ts @@ -7,5 +7,5 @@ import type { Type } from '../../../client/interfaces/Type'; * @returns The model template type ( or empty). */ export const getModelTemplate = (modelClass: Type): string => { - return modelClass.template ? '' : ''; + return modelClass.template ? '' : ''; }; diff --git a/src/openApi/v2/parser/getModels.ts b/src/openApi/v2/parser/getModels.ts index 4ea4728cc..356ceb5dc 100644 --- a/src/openApi/v2/parser/getModels.ts +++ b/src/openApi/v2/parser/getModels.ts @@ -5,14 +5,14 @@ import { getModel } from './getModel'; import { getType } from './getType'; export const getModels = (openApi: OpenApi): Model[] => { - const models: Model[] = []; - for (const definitionName in openApi.definitions) { - if (openApi.definitions.hasOwnProperty(definitionName)) { - const definition = openApi.definitions[definitionName]; - const definitionType = getType(definitionName); - const model = getModel(openApi, definition, true, definitionType.base.replace(reservedWords, '_$1')); - models.push(model); - } + const models: Model[] = []; + for (const definitionName in openApi.definitions) { + if (openApi.definitions.hasOwnProperty(definitionName)) { + const definition = openApi.definitions[definitionName]; + const definitionType = getType(definitionName); + const model = getModel(openApi, definition, true, definitionType.base.replace(reservedWords, '_$1')); + models.push(model); } - return models; + } + return models; }; diff --git a/src/openApi/v2/parser/getOperation.ts b/src/openApi/v2/parser/getOperation.ts index 9aa157460..52498331d 100644 --- a/src/openApi/v2/parser/getOperation.ts +++ b/src/openApi/v2/parser/getOperation.ts @@ -12,65 +12,65 @@ import { getServiceName } from './getServiceName'; import { sortByRequired } from './sortByRequired'; export const getOperation = ( - openApi: OpenApi, - url: string, - method: string, - tag: string, - op: OpenApiOperation, - pathParams: OperationParameters + openApi: OpenApi, + url: string, + method: string, + tag: string, + op: OpenApiOperation, + pathParams: OperationParameters, ): Operation => { - const serviceName = getServiceName(tag); - const operationName = getOperationName(url, method, op.operationId); + const serviceName = getServiceName(tag); + const operationName = getOperationName(url, method, op.operationId); - // Create a new operation object for this method. - const operation: Operation = { - service: serviceName, - name: operationName, - summary: op.summary || null, - description: op.description || null, - deprecated: op.deprecated === true, - method: method.toUpperCase(), - path: url, - parameters: [...pathParams.parameters], - parametersPath: [...pathParams.parametersPath], - parametersQuery: [...pathParams.parametersQuery], - parametersForm: [...pathParams.parametersForm], - parametersHeader: [...pathParams.parametersHeader], - parametersCookie: [...pathParams.parametersCookie], - parametersBody: pathParams.parametersBody, - imports: [], - errors: [], - results: [], - responseHeader: null, - }; + // Create a new operation object for this method. + const operation: Operation = { + service: serviceName, + name: operationName, + summary: op.summary || null, + description: op.description || null, + deprecated: op.deprecated === true, + method: method.toUpperCase(), + path: url, + parameters: [...pathParams.parameters], + parametersPath: [...pathParams.parametersPath], + parametersQuery: [...pathParams.parametersQuery], + parametersForm: [...pathParams.parametersForm], + parametersHeader: [...pathParams.parametersHeader], + parametersCookie: [...pathParams.parametersCookie], + parametersBody: pathParams.parametersBody, + imports: [], + errors: [], + results: [], + responseHeader: null, + }; - // Parse the operation parameters (path, query, body, etc). - if (op.parameters) { - const parameters = getOperationParameters(openApi, op.parameters); - operation.imports.push(...parameters.imports); - operation.parameters.push(...parameters.parameters); - operation.parametersPath.push(...parameters.parametersPath); - operation.parametersQuery.push(...parameters.parametersQuery); - operation.parametersForm.push(...parameters.parametersForm); - operation.parametersHeader.push(...parameters.parametersHeader); - operation.parametersCookie.push(...parameters.parametersCookie); - operation.parametersBody = parameters.parametersBody; - } + // Parse the operation parameters (path, query, body, etc). + if (op.parameters) { + const parameters = getOperationParameters(openApi, op.parameters); + operation.imports.push(...parameters.imports); + operation.parameters.push(...parameters.parameters); + operation.parametersPath.push(...parameters.parametersPath); + operation.parametersQuery.push(...parameters.parametersQuery); + operation.parametersForm.push(...parameters.parametersForm); + operation.parametersHeader.push(...parameters.parametersHeader); + operation.parametersCookie.push(...parameters.parametersCookie); + operation.parametersBody = parameters.parametersBody; + } - // Parse the operation responses. - if (op.responses) { - const operationResponses = getOperationResponses(openApi, op.responses); - const operationResults = getOperationResults(operationResponses); - operation.errors = getOperationErrors(operationResponses); - operation.responseHeader = getOperationResponseHeader(operationResults); + // Parse the operation responses. + if (op.responses) { + const operationResponses = getOperationResponses(openApi, op.responses); + const operationResults = getOperationResults(operationResponses); + operation.errors = getOperationErrors(operationResponses); + operation.responseHeader = getOperationResponseHeader(operationResults); - operationResults.forEach(operationResult => { - operation.results.push(operationResult); - operation.imports.push(...operationResult.imports); - }); - } + operationResults.forEach((operationResult) => { + operation.results.push(operationResult); + operation.imports.push(...operationResult.imports); + }); + } - operation.parameters = operation.parameters.sort(sortByRequired); + operation.parameters = operation.parameters.sort(sortByRequired); - return operation; + return operation; }; diff --git a/src/openApi/v2/parser/getOperationErrors.ts b/src/openApi/v2/parser/getOperationErrors.ts index ef4c12e54..ad03bebe2 100644 --- a/src/openApi/v2/parser/getOperationErrors.ts +++ b/src/openApi/v2/parser/getOperationErrors.ts @@ -6,12 +6,12 @@ import type { OperationResponse } from '../../../client/interfaces/OperationResp * @param operationResponses */ export const getOperationErrors = (operationResponses: OperationResponse[]): OperationError[] => { - return operationResponses - .filter(operationResponse => { - return operationResponse.code >= 300 && operationResponse.description; - }) - .map(response => ({ - code: response.code, - description: response.description!, - })); + return operationResponses + .filter((operationResponse) => { + return operationResponse.code >= 300 && operationResponse.description; + }) + .map((response) => ({ + code: response.code, + description: response.description!, + })); }; diff --git a/src/openApi/v2/parser/getOperationName.spec.ts b/src/openApi/v2/parser/getOperationName.spec.ts index bdaecb8f8..0c5348bbd 100644 --- a/src/openApi/v2/parser/getOperationName.spec.ts +++ b/src/openApi/v2/parser/getOperationName.spec.ts @@ -1,27 +1,27 @@ import { getOperationName } from './getOperationName'; describe('getOperationName', () => { - it('should produce correct result', () => { - expect(getOperationName('/api/v{api-version}/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); - expect(getOperationName('/api/v{api-version}/users', 'GET', undefined)).toEqual('getApiUsers'); - expect(getOperationName('/api/v{api-version}/users', 'POST', undefined)).toEqual('postApiUsers'); - expect(getOperationName('/api/v1/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); - expect(getOperationName('/api/v1/users', 'GET', undefined)).toEqual('getApiV1Users'); - expect(getOperationName('/api/v1/users', 'POST', undefined)).toEqual('postApiV1Users'); - expect(getOperationName('/api/v1/users/{id}', 'GET', undefined)).toEqual('getApiV1Users'); - expect(getOperationName('/api/v1/users/{id}', 'POST', undefined)).toEqual('postApiV1Users'); + it('should produce correct result', () => { + expect(getOperationName('/api/v{api-version}/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); + expect(getOperationName('/api/v{api-version}/users', 'GET', undefined)).toEqual('getApiUsers'); + expect(getOperationName('/api/v{api-version}/users', 'POST', undefined)).toEqual('postApiUsers'); + expect(getOperationName('/api/v1/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); + expect(getOperationName('/api/v1/users', 'GET', undefined)).toEqual('getApiV1Users'); + expect(getOperationName('/api/v1/users', 'POST', undefined)).toEqual('postApiV1Users'); + expect(getOperationName('/api/v1/users/{id}', 'GET', undefined)).toEqual('getApiV1Users'); + expect(getOperationName('/api/v1/users/{id}', 'POST', undefined)).toEqual('postApiV1Users'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'FooBar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'Foo Bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo-bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo_bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '@foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '$foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar'); - }); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'FooBar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'Foo Bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo-bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo_bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '@foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '$foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar'); + }); }); diff --git a/src/openApi/v2/parser/getOperationName.ts b/src/openApi/v2/parser/getOperationName.ts index 124bf66bd..c4c4ded27 100644 --- a/src/openApi/v2/parser/getOperationName.ts +++ b/src/openApi/v2/parser/getOperationName.ts @@ -6,19 +6,19 @@ import camelCase from 'camelcase'; * on a generated name from the URL */ export const getOperationName = (url: string, method: string, operationId?: string): string => { - if (operationId) { - return camelCase( - operationId - .replace(/^[^a-zA-Z]+/g, '') - .replace(/[^\w\-]+/g, '-') - .trim() - ); - } + if (operationId) { + return camelCase( + operationId + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim(), + ); + } - const urlWithoutPlaceholders = url - .replace(/[^/]*?{api-version}.*?\//g, '') - .replace(/{(.*?)}/g, '') - .replace(/\//g, '-'); + const urlWithoutPlaceholders = url + .replace(/[^/]*?{api-version}.*?\//g, '') + .replace(/{(.*?)}/g, '') + .replace(/\//g, '-'); - return camelCase(`${method}-${urlWithoutPlaceholders}`); + return camelCase(`${method}-${urlWithoutPlaceholders}`); }; diff --git a/src/openApi/v2/parser/getOperationParameter.ts b/src/openApi/v2/parser/getOperationParameter.ts index 6b68c9d5a..17a6e164b 100644 --- a/src/openApi/v2/parser/getOperationParameter.ts +++ b/src/openApi/v2/parser/getOperationParameter.ts @@ -12,126 +12,126 @@ import { getRef } from './getRef'; import { getType } from './getType'; export const getOperationParameter = (openApi: OpenApi, parameter: OpenApiParameter): OperationParameter => { - const operationParameter: OperationParameter = { - in: parameter.in, - prop: parameter.name, - export: 'interface', - name: getOperationParameterName(parameter.name), - type: 'any', - base: 'any', - template: null, - link: null, - description: parameter.description || null, - isDefinition: false, - isReadOnly: false, - isRequired: parameter.required === true, - isNullable: parameter['x-nullable'] === true, - format: parameter.format, - maximum: parameter.maximum, - exclusiveMaximum: parameter.exclusiveMaximum, - minimum: parameter.minimum, - exclusiveMinimum: parameter.exclusiveMinimum, - multipleOf: parameter.multipleOf, - maxLength: parameter.maxLength, - minLength: parameter.minLength, - maxItems: parameter.maxItems, - minItems: parameter.minItems, - uniqueItems: parameter.uniqueItems, - pattern: getPattern(parameter.pattern), - imports: [], - enum: [], - enums: [], - properties: [], - mediaType: null, - }; + const operationParameter: OperationParameter = { + in: parameter.in, + prop: parameter.name, + export: 'interface', + name: getOperationParameterName(parameter.name), + type: 'any', + base: 'any', + template: null, + link: null, + description: parameter.description || null, + isDefinition: false, + isReadOnly: false, + isRequired: parameter.required === true, + isNullable: parameter['x-nullable'] === true, + format: parameter.format, + maximum: parameter.maximum, + exclusiveMaximum: parameter.exclusiveMaximum, + minimum: parameter.minimum, + exclusiveMinimum: parameter.exclusiveMinimum, + multipleOf: parameter.multipleOf, + maxLength: parameter.maxLength, + minLength: parameter.minLength, + maxItems: parameter.maxItems, + minItems: parameter.minItems, + uniqueItems: parameter.uniqueItems, + pattern: getPattern(parameter.pattern), + imports: [], + enum: [], + enums: [], + properties: [], + mediaType: null, + }; - if (parameter.$ref) { - const definitionRef = getType(parameter.$ref); - operationParameter.export = 'reference'; - operationParameter.type = definitionRef.type; - operationParameter.base = definitionRef.base; - operationParameter.template = definitionRef.template; - operationParameter.imports.push(...definitionRef.imports); - operationParameter.default = getOperationParameterDefault(parameter, operationParameter); - return operationParameter; - } + if (parameter.$ref) { + const definitionRef = getType(parameter.$ref); + operationParameter.export = 'reference'; + operationParameter.type = definitionRef.type; + operationParameter.base = definitionRef.base; + operationParameter.template = definitionRef.template; + operationParameter.imports.push(...definitionRef.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + return operationParameter; + } - if (parameter.enum) { - const enumerators = getEnum(parameter.enum); - const extendedEnumerators = extendEnum(enumerators, parameter); - if (extendedEnumerators.length) { - operationParameter.export = 'enum'; - operationParameter.type = 'string'; - operationParameter.base = 'string'; - operationParameter.enum.push(...extendedEnumerators); - operationParameter.default = getOperationParameterDefault(parameter, operationParameter); - return operationParameter; - } + if (parameter.enum) { + const enumerators = getEnum(parameter.enum); + const extendedEnumerators = extendEnum(enumerators, parameter); + if (extendedEnumerators.length) { + operationParameter.export = 'enum'; + operationParameter.type = 'string'; + operationParameter.base = 'string'; + operationParameter.enum.push(...extendedEnumerators); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + return operationParameter; } + } - if (parameter.type === 'array' && parameter.items) { - const items = getType(parameter.items.type, parameter.items.format); - operationParameter.export = 'array'; - operationParameter.type = items.type; - operationParameter.base = items.base; - operationParameter.template = items.template; - operationParameter.imports.push(...items.imports); - operationParameter.default = getOperationParameterDefault(parameter, operationParameter); - return operationParameter; - } + if (parameter.type === 'array' && parameter.items) { + const items = getType(parameter.items.type, parameter.items.format); + operationParameter.export = 'array'; + operationParameter.type = items.type; + operationParameter.base = items.base; + operationParameter.template = items.template; + operationParameter.imports.push(...items.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + return operationParameter; + } - if (parameter.type === 'object' && parameter.items) { - const items = getType(parameter.items.type, parameter.items.format); - operationParameter.export = 'dictionary'; - operationParameter.type = items.type; - operationParameter.base = items.base; - operationParameter.template = items.template; - operationParameter.imports.push(...items.imports); - operationParameter.default = getOperationParameterDefault(parameter, operationParameter); - return operationParameter; - } + if (parameter.type === 'object' && parameter.items) { + const items = getType(parameter.items.type, parameter.items.format); + operationParameter.export = 'dictionary'; + operationParameter.type = items.type; + operationParameter.base = items.base; + operationParameter.template = items.template; + operationParameter.imports.push(...items.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + return operationParameter; + } - let schema = parameter.schema; - if (schema) { - if (schema.$ref?.startsWith('#/parameters/')) { - schema = getRef(openApi, schema); - } - if (schema.$ref) { - const model = getType(schema.$ref); - operationParameter.export = 'reference'; - operationParameter.type = model.type; - operationParameter.base = model.base; - operationParameter.template = model.template; - operationParameter.imports.push(...model.imports); - operationParameter.default = getOperationParameterDefault(parameter, operationParameter); - return operationParameter; - } else { - const model = getModel(openApi, schema); - operationParameter.export = model.export; - operationParameter.type = model.type; - operationParameter.base = model.base; - operationParameter.template = model.template; - operationParameter.link = model.link; - operationParameter.imports.push(...model.imports); - operationParameter.enum.push(...model.enum); - operationParameter.enums.push(...model.enums); - operationParameter.properties.push(...model.properties); - operationParameter.default = getOperationParameterDefault(parameter, operationParameter); - return operationParameter; - } + let schema = parameter.schema; + if (schema) { + if (schema.$ref?.startsWith('#/parameters/')) { + schema = getRef(openApi, schema); } - - // If the parameter has a type than it can be a basic or generic type. - if (parameter.type) { - const definitionType = getType(parameter.type, parameter.format); - operationParameter.export = 'generic'; - operationParameter.type = definitionType.type; - operationParameter.base = definitionType.base; - operationParameter.template = definitionType.template; - operationParameter.imports.push(...definitionType.imports); - operationParameter.default = getOperationParameterDefault(parameter, operationParameter); - return operationParameter; + if (schema.$ref) { + const model = getType(schema.$ref); + operationParameter.export = 'reference'; + operationParameter.type = model.type; + operationParameter.base = model.base; + operationParameter.template = model.template; + operationParameter.imports.push(...model.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + return operationParameter; + } else { + const model = getModel(openApi, schema); + operationParameter.export = model.export; + operationParameter.type = model.type; + operationParameter.base = model.base; + operationParameter.template = model.template; + operationParameter.link = model.link; + operationParameter.imports.push(...model.imports); + operationParameter.enum.push(...model.enum); + operationParameter.enums.push(...model.enums); + operationParameter.properties.push(...model.properties); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); + return operationParameter; } + } + // If the parameter has a type than it can be a basic or generic type. + if (parameter.type) { + const definitionType = getType(parameter.type, parameter.format); + operationParameter.export = 'generic'; + operationParameter.type = definitionType.type; + operationParameter.base = definitionType.base; + operationParameter.template = definitionType.template; + operationParameter.imports.push(...definitionType.imports); + operationParameter.default = getOperationParameterDefault(parameter, operationParameter); return operationParameter; + } + + return operationParameter; }; diff --git a/src/openApi/v2/parser/getOperationParameterDefault.ts b/src/openApi/v2/parser/getOperationParameterDefault.ts index 28e0fff80..21deb2991 100644 --- a/src/openApi/v2/parser/getOperationParameterDefault.ts +++ b/src/openApi/v2/parser/getOperationParameterDefault.ts @@ -2,40 +2,40 @@ import type { OperationParameter } from '../../../client/interfaces/OperationPar import type { OpenApiParameter } from '../interfaces/OpenApiParameter'; export const getOperationParameterDefault = ( - parameter: OpenApiParameter, - operationParameter: OperationParameter + parameter: OpenApiParameter, + operationParameter: OperationParameter, ): string | undefined => { - if (parameter.default === undefined) { - return undefined; - } - if (parameter.default === null) { - return 'option.none'; - } + if (parameter.default === undefined) { + return undefined; + } + if (parameter.default === null) { + return 'option.none'; + } - const type = parameter.type || typeof parameter.default; + const type = parameter.type || typeof parameter.default; - switch (type) { - case 'int': - case 'integer': - case 'number': - if (operationParameter.export === 'enum' && operationParameter.enum?.[parameter.default]) { - return operationParameter.enum[parameter.default].value; - } - return parameter.default; + switch (type) { + case 'int': + case 'integer': + case 'number': + if (operationParameter.export === 'enum' && operationParameter.enum?.[parameter.default]) { + return operationParameter.enum[parameter.default].value; + } + return parameter.default; - case 'boolean': - return JSON.stringify(parameter.default); + case 'boolean': + return JSON.stringify(parameter.default); - case 'string': - return `'${parameter.default}'`; + case 'string': + return `'${parameter.default}'`; - case 'object': - try { - return JSON.stringify(parameter.default, null, 4); - } catch (e) { - // Ignore - } - } + case 'object': + try { + return JSON.stringify(parameter.default, null, 4); + } catch (e) { + // Ignore + } + } - return undefined; + return undefined; }; diff --git a/src/openApi/v2/parser/getOperationParameterName.spec.ts b/src/openApi/v2/parser/getOperationParameterName.spec.ts index 725011531..02a7b83f3 100644 --- a/src/openApi/v2/parser/getOperationParameterName.spec.ts +++ b/src/openApi/v2/parser/getOperationParameterName.spec.ts @@ -1,17 +1,17 @@ import { getOperationParameterName } from './getOperationParameterName'; describe('getOperationParameterName', () => { - it('should produce correct result', () => { - expect(getOperationParameterName('')).toEqual(''); - expect(getOperationParameterName('foobar')).toEqual('foobar'); - expect(getOperationParameterName('fooBar')).toEqual('fooBar'); - expect(getOperationParameterName('foo_bar')).toEqual('fooBar'); - expect(getOperationParameterName('foo-bar')).toEqual('fooBar'); - expect(getOperationParameterName('foo.bar')).toEqual('fooBar'); - expect(getOperationParameterName('@foo.bar')).toEqual('fooBar'); - expect(getOperationParameterName('$foo.bar')).toEqual('fooBar'); - expect(getOperationParameterName('123.foo.bar')).toEqual('fooBar'); - expect(getOperationParameterName('Foo-Bar')).toEqual('fooBar'); - expect(getOperationParameterName('FOO-BAR')).toEqual('fooBar'); - }); + it('should produce correct result', () => { + expect(getOperationParameterName('')).toEqual(''); + expect(getOperationParameterName('foobar')).toEqual('foobar'); + expect(getOperationParameterName('fooBar')).toEqual('fooBar'); + expect(getOperationParameterName('foo_bar')).toEqual('fooBar'); + expect(getOperationParameterName('foo-bar')).toEqual('fooBar'); + expect(getOperationParameterName('foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('@foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('$foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('123.foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('Foo-Bar')).toEqual('fooBar'); + expect(getOperationParameterName('FOO-BAR')).toEqual('fooBar'); + }); }); diff --git a/src/openApi/v2/parser/getOperationParameterName.ts b/src/openApi/v2/parser/getOperationParameterName.ts index 3a7fb408b..7c5d3b628 100644 --- a/src/openApi/v2/parser/getOperationParameterName.ts +++ b/src/openApi/v2/parser/getOperationParameterName.ts @@ -7,9 +7,9 @@ import { reservedWords } from '../../../utils/reservedWords'; * For example: 'filter.someProperty' becomes 'filterSomeProperty'. */ export const getOperationParameterName = (value: string): string => { - const clean = value - .replace(/^[^a-zA-Z]+/g, '') - .replace(/[^\w\-]+/g, '-') - .trim(); - return camelCase(clean).replace(reservedWords, '_$1'); + const clean = value + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim(); + return camelCase(clean).replace(reservedWords, '_$1'); }; diff --git a/src/openApi/v2/parser/getOperationParameters.ts b/src/openApi/v2/parser/getOperationParameters.ts index f265d1ccc..0554905a1 100644 --- a/src/openApi/v2/parser/getOperationParameters.ts +++ b/src/openApi/v2/parser/getOperationParameters.ts @@ -5,57 +5,57 @@ import { getOperationParameter } from './getOperationParameter'; import { getRef } from './getRef'; export const getOperationParameters = (openApi: OpenApi, parameters: OpenApiParameter[]): OperationParameters => { - const operationParameters: OperationParameters = { - imports: [], - parameters: [], - parametersPath: [], - parametersQuery: [], - parametersForm: [], - parametersCookie: [], - parametersHeader: [], - parametersBody: null, - }; + const operationParameters: OperationParameters = { + imports: [], + parameters: [], + parametersPath: [], + parametersQuery: [], + parametersForm: [], + parametersCookie: [], + parametersHeader: [], + parametersBody: null, + }; - // Iterate over the parameters - parameters.forEach(parameterOrReference => { - const parameterDef = getRef(openApi, parameterOrReference); - const parameter = getOperationParameter(openApi, parameterDef); + // Iterate over the parameters + parameters.forEach((parameterOrReference) => { + const parameterDef = getRef(openApi, parameterOrReference); + const parameter = getOperationParameter(openApi, parameterDef); - // We ignore the "api-version" param, since we do not want to add this - // as the first / default parameter for each of the service calls. - if (parameter.prop !== 'api-version') { - switch (parameter.in) { - case 'path': - operationParameters.parametersPath.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; + // We ignore the "api-version" param, since we do not want to add this + // as the first / default parameter for each of the service calls. + if (parameter.prop !== 'api-version') { + switch (parameter.in) { + case 'path': + operationParameters.parametersPath.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; - case 'query': - operationParameters.parametersQuery.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; + case 'query': + operationParameters.parametersQuery.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; - case 'header': - operationParameters.parametersHeader.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; + case 'header': + operationParameters.parametersHeader.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; - case 'formData': - operationParameters.parametersForm.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; + case 'formData': + operationParameters.parametersForm.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; - case 'body': - operationParameters.parametersBody = parameter; - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; - } - } - }); - return operationParameters; + case 'body': + operationParameters.parametersBody = parameter; + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; + } + } + }); + return operationParameters; }; diff --git a/src/openApi/v2/parser/getOperationResponse.ts b/src/openApi/v2/parser/getOperationResponse.ts index 8f6c3ca56..9c5458f26 100644 --- a/src/openApi/v2/parser/getOperationResponse.ts +++ b/src/openApi/v2/parser/getOperationResponse.ts @@ -8,92 +8,92 @@ import { getRef } from './getRef'; import { getType } from './getType'; export const getOperationResponse = ( - openApi: OpenApi, - response: OpenApiResponse, - responseCode: number + openApi: OpenApi, + response: OpenApiResponse, + responseCode: number, ): OperationResponse => { - const operationResponse: OperationResponse = { - in: 'response', - name: '', - code: responseCode, - description: response.description || null, - export: 'generic', - type: 'any', - base: 'any', - template: null, - link: null, - isDefinition: false, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }; + const operationResponse: OperationResponse = { + in: 'response', + name: '', + code: responseCode, + description: response.description || null, + export: 'generic', + type: 'any', + base: 'any', + template: null, + link: null, + isDefinition: false, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; - // If this response has a schema, then we need to check two things: - // if this is a reference then the parameter is just the 'name' of - // this reference type. Otherwise, it might be a complex schema, - // and then we need to parse the schema! - let schema = response.schema; - if (schema) { - if (schema.$ref?.startsWith('#/responses/')) { - schema = getRef(openApi, schema); - } - if (schema.$ref) { - const model = getType(schema.$ref); - operationResponse.export = 'reference'; - operationResponse.type = model.type; - operationResponse.base = model.base; - operationResponse.template = model.template; - operationResponse.imports.push(...model.imports); - return operationResponse; - } else { - const model = getModel(openApi, schema); - operationResponse.export = model.export; - operationResponse.type = model.type; - operationResponse.base = model.base; - operationResponse.template = model.template; - operationResponse.link = model.link; - operationResponse.isReadOnly = model.isReadOnly; - operationResponse.isRequired = model.isRequired; - operationResponse.isNullable = model.isNullable; - operationResponse.format = model.format; - operationResponse.maximum = model.maximum; - operationResponse.exclusiveMaximum = model.exclusiveMaximum; - operationResponse.minimum = model.minimum; - operationResponse.exclusiveMinimum = model.exclusiveMinimum; - operationResponse.multipleOf = model.multipleOf; - operationResponse.maxLength = model.maxLength; - operationResponse.minLength = model.minLength; - operationResponse.maxItems = model.maxItems; - operationResponse.minItems = model.minItems; - operationResponse.uniqueItems = model.uniqueItems; - operationResponse.maxProperties = model.maxProperties; - operationResponse.minProperties = model.minProperties; - operationResponse.pattern = getPattern(model.pattern); - operationResponse.imports.push(...model.imports); - operationResponse.enum.push(...model.enum); - operationResponse.enums.push(...model.enums); - operationResponse.properties.push(...model.properties); - return operationResponse; - } + // If this response has a schema, then we need to check two things: + // if this is a reference then the parameter is just the 'name' of + // this reference type. Otherwise, it might be a complex schema, + // and then we need to parse the schema! + let schema = response.schema; + if (schema) { + if (schema.$ref?.startsWith('#/responses/')) { + schema = getRef(openApi, schema); } + if (schema.$ref) { + const model = getType(schema.$ref); + operationResponse.export = 'reference'; + operationResponse.type = model.type; + operationResponse.base = model.base; + operationResponse.template = model.template; + operationResponse.imports.push(...model.imports); + return operationResponse; + } else { + const model = getModel(openApi, schema); + operationResponse.export = model.export; + operationResponse.type = model.type; + operationResponse.base = model.base; + operationResponse.template = model.template; + operationResponse.link = model.link; + operationResponse.isReadOnly = model.isReadOnly; + operationResponse.isRequired = model.isRequired; + operationResponse.isNullable = model.isNullable; + operationResponse.format = model.format; + operationResponse.maximum = model.maximum; + operationResponse.exclusiveMaximum = model.exclusiveMaximum; + operationResponse.minimum = model.minimum; + operationResponse.exclusiveMinimum = model.exclusiveMinimum; + operationResponse.multipleOf = model.multipleOf; + operationResponse.maxLength = model.maxLength; + operationResponse.minLength = model.minLength; + operationResponse.maxItems = model.maxItems; + operationResponse.minItems = model.minItems; + operationResponse.uniqueItems = model.uniqueItems; + operationResponse.maxProperties = model.maxProperties; + operationResponse.minProperties = model.minProperties; + operationResponse.pattern = getPattern(model.pattern); + operationResponse.imports.push(...model.imports); + operationResponse.enum.push(...model.enum); + operationResponse.enums.push(...model.enums); + operationResponse.properties.push(...model.properties); + return operationResponse; + } + } - // We support basic properties from response headers, since both - // fetch and XHR client just support string types. - if (response.headers) { - for (const name in response.headers) { - if (response.headers.hasOwnProperty(name)) { - operationResponse.in = 'header'; - operationResponse.name = name; - operationResponse.type = 'string'; - operationResponse.base = 'string'; - return operationResponse; - } - } + // We support basic properties from response headers, since both + // fetch and XHR client just support string types. + if (response.headers) { + for (const name in response.headers) { + if (response.headers.hasOwnProperty(name)) { + operationResponse.in = 'header'; + operationResponse.name = name; + operationResponse.type = 'string'; + operationResponse.base = 'string'; + return operationResponse; + } } + } - return operationResponse; + return operationResponse; }; diff --git a/src/openApi/v2/parser/getOperationResponseCode.spec.ts b/src/openApi/v2/parser/getOperationResponseCode.spec.ts index 24e8da39f..9c76cf499 100644 --- a/src/openApi/v2/parser/getOperationResponseCode.spec.ts +++ b/src/openApi/v2/parser/getOperationResponseCode.spec.ts @@ -1,13 +1,13 @@ import { getOperationResponseCode } from './getOperationResponseCode'; describe('getOperationResponseCode', () => { - it('should produce correct result', () => { - expect(getOperationResponseCode('')).toEqual(null); - expect(getOperationResponseCode('default')).toEqual(0); - expect(getOperationResponseCode('200')).toEqual(200); - expect(getOperationResponseCode('300')).toEqual(300); - expect(getOperationResponseCode('400')).toEqual(400); - expect(getOperationResponseCode('abc')).toEqual(null); - expect(getOperationResponseCode('-100')).toEqual(100); - }); + it('should produce correct result', () => { + expect(getOperationResponseCode('')).toEqual(null); + expect(getOperationResponseCode('default')).toEqual(0); + expect(getOperationResponseCode('200')).toEqual(200); + expect(getOperationResponseCode('300')).toEqual(300); + expect(getOperationResponseCode('400')).toEqual(400); + expect(getOperationResponseCode('abc')).toEqual(null); + expect(getOperationResponseCode('-100')).toEqual(100); + }); }); diff --git a/src/openApi/v2/parser/getOperationResponseCode.ts b/src/openApi/v2/parser/getOperationResponseCode.ts index 9f886f3ae..ca0b486e8 100644 --- a/src/openApi/v2/parser/getOperationResponseCode.ts +++ b/src/openApi/v2/parser/getOperationResponseCode.ts @@ -1,16 +1,16 @@ export const getOperationResponseCode = (value: string | 'default'): number | null => { - // You can specify a "default" response, this is treated as HTTP code 200 - if (value === 'default') { - return 0; - } + // You can specify a "default" response, this is treated as HTTP code 200 + if (value === 'default') { + return 0; + } - // Check if we can parse the code and return of successful. - if (/[0-9]+/g.test(value)) { - const code = parseInt(value); - if (Number.isInteger(code)) { - return Math.abs(code); - } + // Check if we can parse the code and return of successful. + if (/[0-9]+/g.test(value)) { + const code = parseInt(value); + if (Number.isInteger(code)) { + return Math.abs(code); } + } - return null; + return null; }; diff --git a/src/openApi/v2/parser/getOperationResponseHeader.ts b/src/openApi/v2/parser/getOperationResponseHeader.ts index 09a810916..759d2597e 100644 --- a/src/openApi/v2/parser/getOperationResponseHeader.ts +++ b/src/openApi/v2/parser/getOperationResponseHeader.ts @@ -1,11 +1,11 @@ import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; export const getOperationResponseHeader = (operationResponses: OperationResponse[]): string | null => { - const header = operationResponses.find(operationResponses => { - return operationResponses.in === 'header'; - }); - if (header) { - return header.name; - } - return null; + const header = operationResponses.find((operationResponses) => { + return operationResponses.in === 'header'; + }); + if (header) { + return header.name; + } + return null; }; diff --git a/src/openApi/v2/parser/getOperationResponses.ts b/src/openApi/v2/parser/getOperationResponses.ts index 66a980420..4797145be 100644 --- a/src/openApi/v2/parser/getOperationResponses.ts +++ b/src/openApi/v2/parser/getOperationResponses.ts @@ -7,25 +7,25 @@ import { getOperationResponseCode } from './getOperationResponseCode'; import { getRef } from './getRef'; export const getOperationResponses = (openApi: OpenApi, responses: OpenApiResponses): OperationResponse[] => { - const operationResponses: OperationResponse[] = []; + const operationResponses: OperationResponse[] = []; - // Iterate over each response code and get the - // status code and response message (if any). - for (const code in responses) { - if (responses.hasOwnProperty(code)) { - const responseOrReference = responses[code]; - const response = getRef(openApi, responseOrReference); - const responseCode = getOperationResponseCode(code); + // Iterate over each response code and get the + // status code and response message (if any). + for (const code in responses) { + if (responses.hasOwnProperty(code)) { + const responseOrReference = responses[code]; + const response = getRef(openApi, responseOrReference); + const responseCode = getOperationResponseCode(code); - if (responseCode !== null) { - const operationResponse = getOperationResponse(openApi, response, responseCode); - operationResponses.push(operationResponse); - } - } + if (responseCode !== null) { + const operationResponse = getOperationResponse(openApi, response, responseCode); + operationResponses.push(operationResponse); + } } + } - // Sort the responses to 2XX success codes come before 4XX and 5XX error codes. - return operationResponses.sort((a, b): number => { - return a.code < b.code ? -1 : a.code > b.code ? 1 : 0; - }); + // Sort the responses to 2XX success codes come before 4XX and 5XX error codes. + return operationResponses.sort((a, b): number => { + return a.code < b.code ? -1 : a.code > b.code ? 1 : 0; + }); }; diff --git a/src/openApi/v2/parser/getOperationResults.ts b/src/openApi/v2/parser/getOperationResults.ts index 5dde1e60a..67238ebbd 100644 --- a/src/openApi/v2/parser/getOperationResults.ts +++ b/src/openApi/v2/parser/getOperationResults.ts @@ -2,51 +2,51 @@ import type { Model } from '../../../client/interfaces/Model'; import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; const areEqual = (a: Model, b: Model): boolean => { - const equal = a.type === b.type && a.base === b.base && a.template === b.template; - if (equal && a.link && b.link) { - return areEqual(a.link, b.link); - } - return equal; + const equal = a.type === b.type && a.base === b.base && a.template === b.template; + if (equal && a.link && b.link) { + return areEqual(a.link, b.link); + } + return equal; }; export const getOperationResults = (operationResponses: OperationResponse[]): OperationResponse[] => { - const operationResults: OperationResponse[] = []; - - // Filter out success response codes, but skip "204 No Content" - operationResponses.forEach(operationResponse => { - const { code } = operationResponse; - if (code !== 204 && (code >= 200 && code < 300 || code === 0)) { - operationResults.push(operationResponse); - } - }); + const operationResults: OperationResponse[] = []; - if (!operationResults.length) { - operationResults.push({ - in: 'response', - name: '', - code: 200, - description: '', - export: 'generic', - type: 'void', - base: 'void', - template: null, - link: null, - isDefinition: false, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }); + // Filter out success response codes, but skip "204 No Content" + operationResponses.forEach((operationResponse) => { + const { code } = operationResponse; + if (code !== 204 && ((code >= 200 && code < 300) || code === 0)) { + operationResults.push(operationResponse); } + }); - return operationResults.filter((operationResult, index, arr) => { - return ( - arr.findIndex(item => { - return areEqual(item, operationResult); - }) === index - ); + if (!operationResults.length) { + operationResults.push({ + in: 'response', + name: '', + code: 200, + description: '', + export: 'generic', + type: 'void', + base: 'void', + template: null, + link: null, + isDefinition: false, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], }); + } + + return operationResults.filter((operationResult, index, arr) => { + return ( + arr.findIndex((item) => { + return areEqual(item, operationResult); + }) === index + ); + }); }; diff --git a/src/openApi/v2/parser/getRef.spec.ts b/src/openApi/v2/parser/getRef.spec.ts index c475208b2..ba5fa2237 100644 --- a/src/openApi/v2/parser/getRef.spec.ts +++ b/src/openApi/v2/parser/getRef.spec.ts @@ -1,33 +1,33 @@ import { getRef } from './getRef'; describe('getRef', () => { - it('should produce correct result', () => { - expect( - getRef( - { - swagger: '2.0', - info: { - title: 'dummy', - version: '1.0', - }, - host: 'localhost:8080', - basePath: '/api', - schemes: ['http', 'https'], - paths: {}, - definitions: { - Example: { - description: 'This is an Example model ', - type: 'integer', - }, - }, - }, - { - $ref: '#/definitions/Example', - } - ) - ).toEqual({ - description: 'This is an Example model ', - type: 'integer', - }); + it('should produce correct result', () => { + expect( + getRef( + { + swagger: '2.0', + info: { + title: 'dummy', + version: '1.0', + }, + host: 'localhost:8080', + basePath: '/api', + schemes: ['http', 'https'], + paths: {}, + definitions: { + Example: { + description: 'This is an Example model ', + type: 'integer', + }, + }, + }, + { + $ref: '#/definitions/Example', + }, + ), + ).toEqual({ + description: 'This is an Example model ', + type: 'integer', }); + }); }); diff --git a/src/openApi/v2/parser/getRef.ts b/src/openApi/v2/parser/getRef.ts index f92dfcf67..cb76703a1 100644 --- a/src/openApi/v2/parser/getRef.ts +++ b/src/openApi/v2/parser/getRef.ts @@ -5,28 +5,26 @@ const ESCAPED_REF_SLASH = /~1/g; const ESCAPED_REF_TILDE = /~0/g; export const getRef = (openApi: OpenApi, item: T & OpenApiReference): T => { - if (item.$ref) { - // Fetch the paths to the definitions, this converts: - // "#/definitions/Form" to ["definitions", "Form"] - const paths = item.$ref - .replace(/^#/g, '') - .split('/') - .filter(item => item); + if (item.$ref) { + // Fetch the paths to the definitions, this converts: + // "#/definitions/Form" to ["definitions", "Form"] + const paths = item.$ref + .replace(/^#/g, '') + .split('/') + .filter((item) => item); - // Try to find the reference by walking down the path, - // if we cannot find it, then we throw an error. - let result: any = openApi; - paths.forEach(path => { - const decodedPath = decodeURIComponent( - path.replace(ESCAPED_REF_SLASH, '/').replace(ESCAPED_REF_TILDE, '~') - ); - if (result.hasOwnProperty(decodedPath)) { - result = result[decodedPath]; - } else { - throw new Error(`Could not find reference: "${item.$ref}"`); - } - }); - return result as T; - } - return item as T; + // Try to find the reference by walking down the path, + // if we cannot find it, then we throw an error. + let result: any = openApi; + paths.forEach((path) => { + const decodedPath = decodeURIComponent(path.replace(ESCAPED_REF_SLASH, '/').replace(ESCAPED_REF_TILDE, '~')); + if (result.hasOwnProperty(decodedPath)) { + result = result[decodedPath]; + } else { + throw new Error(`Could not find reference: "${item.$ref}"`); + } + }); + return result as T; + } + return item as T; }; diff --git a/src/openApi/v2/parser/getRequiredPropertiesFromComposition.ts b/src/openApi/v2/parser/getRequiredPropertiesFromComposition.ts index 0b1f1859f..803e6a0ec 100644 --- a/src/openApi/v2/parser/getRequiredPropertiesFromComposition.ts +++ b/src/openApi/v2/parser/getRequiredPropertiesFromComposition.ts @@ -8,26 +8,26 @@ import { getRef } from './getRef'; export type GetModelFn = typeof getModel; export const getRequiredPropertiesFromComposition = ( - openApi: OpenApi, - required: string[], - definitions: OpenApiSchema[], - getModel: GetModelFn + openApi: OpenApi, + required: string[], + definitions: OpenApiSchema[], + getModel: GetModelFn, ): Model[] => { - return definitions - .reduce((properties, definition) => { - if (definition.$ref) { - const schema = getRef(openApi, definition); - return [...properties, ...getModel(openApi, schema).properties]; - } - return [...properties, ...getModel(openApi, definition).properties]; - }, [] as Model[]) - .filter(property => { - return !property.isRequired && required.includes(property.name); - }) - .map(property => { - return { - ...property, - isRequired: true, - }; - }); + return definitions + .reduce((properties, definition) => { + if (definition.$ref) { + const schema = getRef(openApi, definition); + return [...properties, ...getModel(openApi, schema).properties]; + } + return [...properties, ...getModel(openApi, definition).properties]; + }, [] as Model[]) + .filter((property) => { + return !property.isRequired && required.includes(property.name); + }) + .map((property) => { + return { + ...property, + isRequired: true, + }; + }); }; diff --git a/src/openApi/v2/parser/getServer.spec.ts b/src/openApi/v2/parser/getServer.spec.ts index 4eddc72c8..83db45c0d 100644 --- a/src/openApi/v2/parser/getServer.spec.ts +++ b/src/openApi/v2/parser/getServer.spec.ts @@ -1,19 +1,19 @@ import { getServer } from './getServer'; describe('getServer', () => { - it('should produce correct result', () => { - expect( - getServer({ - swagger: '2.0', - info: { - title: 'dummy', - version: '1.0', - }, - host: 'localhost:8080', - basePath: '/api', - schemes: ['http', 'https'], - paths: {}, - }) - ).toEqual('http://localhost:8080/api'); - }); + it('should produce correct result', () => { + expect( + getServer({ + swagger: '2.0', + info: { + title: 'dummy', + version: '1.0', + }, + host: 'localhost:8080', + basePath: '/api', + schemes: ['http', 'https'], + paths: {}, + }), + ).toEqual('http://localhost:8080/api'); + }); }); diff --git a/src/openApi/v2/parser/getServer.ts b/src/openApi/v2/parser/getServer.ts index 0b1913883..e148543e8 100644 --- a/src/openApi/v2/parser/getServer.ts +++ b/src/openApi/v2/parser/getServer.ts @@ -5,9 +5,9 @@ import type { OpenApi } from '../interfaces/OpenApi'; * @param openApi */ export const getServer = (openApi: OpenApi): string => { - const scheme = openApi.schemes?.[0] || 'http'; - const host = openApi.host; - const basePath = openApi.basePath || ''; - const url = host ? `${scheme}://${host}${basePath}` : basePath; - return url.replace(/\/$/g, ''); + const scheme = openApi.schemes?.[0] || 'http'; + const host = openApi.host; + const basePath = openApi.basePath || ''; + const url = host ? `${scheme}://${host}${basePath}` : basePath; + return url.replace(/\/$/g, ''); }; diff --git a/src/openApi/v2/parser/getServiceName.spec.ts b/src/openApi/v2/parser/getServiceName.spec.ts index 77c420d3b..f8aa4221c 100644 --- a/src/openApi/v2/parser/getServiceName.spec.ts +++ b/src/openApi/v2/parser/getServiceName.spec.ts @@ -1,13 +1,13 @@ import { getServiceName } from './getServiceName'; describe('getServiceName', () => { - it('should produce correct result', () => { - expect(getServiceName('')).toEqual(''); - expect(getServiceName('FooBar')).toEqual('FooBar'); - expect(getServiceName('Foo Bar')).toEqual('FooBar'); - expect(getServiceName('foo bar')).toEqual('FooBar'); - expect(getServiceName('@fooBar')).toEqual('FooBar'); - expect(getServiceName('$fooBar')).toEqual('FooBar'); - expect(getServiceName('123fooBar')).toEqual('FooBar'); - }); + it('should produce correct result', () => { + expect(getServiceName('')).toEqual(''); + expect(getServiceName('FooBar')).toEqual('FooBar'); + expect(getServiceName('Foo Bar')).toEqual('FooBar'); + expect(getServiceName('foo bar')).toEqual('FooBar'); + expect(getServiceName('@fooBar')).toEqual('FooBar'); + expect(getServiceName('$fooBar')).toEqual('FooBar'); + expect(getServiceName('123fooBar')).toEqual('FooBar'); + }); }); diff --git a/src/openApi/v2/parser/getServiceName.ts b/src/openApi/v2/parser/getServiceName.ts index b5b1718f2..1fa6b089b 100644 --- a/src/openApi/v2/parser/getServiceName.ts +++ b/src/openApi/v2/parser/getServiceName.ts @@ -5,9 +5,9 @@ import camelCase from 'camelcase'; * the input string to PascalCase. */ export const getServiceName = (value: string): string => { - const clean = value - .replace(/^[^a-zA-Z]+/g, '') - .replace(/[^\w\-]+/g, '-') - .trim(); - return camelCase(clean, { pascalCase: true }); + const clean = value + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim(); + return camelCase(clean, { pascalCase: true }); }; diff --git a/src/openApi/v2/parser/getServiceVersion.spec.ts b/src/openApi/v2/parser/getServiceVersion.spec.ts index 3e72898b4..8fb71150b 100644 --- a/src/openApi/v2/parser/getServiceVersion.spec.ts +++ b/src/openApi/v2/parser/getServiceVersion.spec.ts @@ -1,9 +1,9 @@ import { getServiceVersion } from './getServiceVersion'; describe('getServiceVersion', () => { - it('should produce correct result', () => { - expect(getServiceVersion('1.0')).toEqual('1.0'); - expect(getServiceVersion('v1.0')).toEqual('1.0'); - expect(getServiceVersion('V1.0')).toEqual('1.0'); - }); + it('should produce correct result', () => { + expect(getServiceVersion('1.0')).toEqual('1.0'); + expect(getServiceVersion('v1.0')).toEqual('1.0'); + expect(getServiceVersion('V1.0')).toEqual('1.0'); + }); }); diff --git a/src/openApi/v2/parser/getServiceVersion.ts b/src/openApi/v2/parser/getServiceVersion.ts index 9c7a8a04b..b1fd6c4b0 100644 --- a/src/openApi/v2/parser/getServiceVersion.ts +++ b/src/openApi/v2/parser/getServiceVersion.ts @@ -4,5 +4,5 @@ * @param version */ export const getServiceVersion = (version = '1.0'): string => { - return String(version).replace(/^v/gi, ''); + return String(version).replace(/^v/gi, ''); }; diff --git a/src/openApi/v2/parser/getServices.spec.ts b/src/openApi/v2/parser/getServices.spec.ts index 915ee6b09..c5cd0bc53 100644 --- a/src/openApi/v2/parser/getServices.spec.ts +++ b/src/openApi/v2/parser/getServices.spec.ts @@ -1,31 +1,31 @@ import { getServices } from './getServices'; describe('getServices', () => { - it('should create a unnamed service if tags are empty', () => { - const services = getServices({ - swagger: '2.0', - info: { - title: 'x', - version: '1', + it('should create a unnamed service if tags are empty', () => { + const services = getServices({ + swagger: '2.0', + info: { + title: 'x', + version: '1', + }, + paths: { + '/api/trips': { + get: { + tags: [], + responses: { + 200: { + description: 'x', + }, + default: { + description: 'default', + }, }, - paths: { - '/api/trips': { - get: { - tags: [], - responses: { - 200: { - description: 'x', - }, - default: { - description: 'default', - }, - }, - }, - }, - }, - }); - - expect(services).toHaveLength(1); - expect(services[0].name).toEqual('Default'); + }, + }, + }, }); + + expect(services).toHaveLength(1); + expect(services[0].name).toEqual('Default'); + }); }); diff --git a/src/openApi/v2/parser/getServices.ts b/src/openApi/v2/parser/getServices.ts index d8fe411bb..3e7b37247 100644 --- a/src/openApi/v2/parser/getServices.ts +++ b/src/openApi/v2/parser/getServices.ts @@ -8,48 +8,48 @@ import { getOperationParameters } from './getOperationParameters'; * Get the OpenAPI services */ export const getServices = (openApi: OpenApi): Service[] => { - const services = new Map(); - for (const url in openApi.paths) { - if (openApi.paths.hasOwnProperty(url)) { - // Grab path and parse any global path parameters - const path = openApi.paths[url]; - const pathParams = getOperationParameters(openApi, path.parameters || []); + const services = new Map(); + for (const url in openApi.paths) { + if (openApi.paths.hasOwnProperty(url)) { + // Grab path and parse any global path parameters + const path = openApi.paths[url]; + const pathParams = getOperationParameters(openApi, path.parameters || []); - // Parse all the methods for this path - for (const method in path) { - if (path.hasOwnProperty(method)) { - switch (method) { - case 'get': - case 'put': - case 'post': - case 'delete': - case 'options': - case 'head': - case 'patch': - // Each method contains an OpenAPI operation, we parse the operation - const op = path[method]!; - const tags = op.tags?.length ? op.tags.filter(unique) : ['Default']; - tags.forEach(tag => { - const operation = getOperation(openApi, url, method, tag, op, pathParams); + // Parse all the methods for this path + for (const method in path) { + if (path.hasOwnProperty(method)) { + switch (method) { + case 'get': + case 'put': + case 'post': + case 'delete': + case 'options': + case 'head': + case 'patch': + // Each method contains an OpenAPI operation, we parse the operation + const op = path[method]!; + const tags = op.tags?.length ? op.tags.filter(unique) : ['Default']; + tags.forEach((tag) => { + const operation = getOperation(openApi, url, method, tag, op, pathParams); - // If we have already declared a service, then we should fetch that and - // append the new method to it. Otherwise we should create a new service object. - const service: Service = services.get(operation.service) || { - name: operation.service, - operations: [], - imports: [], - }; + // If we have already declared a service, then we should fetch that and + // append the new method to it. Otherwise we should create a new service object. + const service: Service = services.get(operation.service) || { + name: operation.service, + operations: [], + imports: [], + }; - // Push the operation in the service - service.operations.push(operation); - service.imports.push(...operation.imports); - services.set(operation.service, service); - }); - break; - } - } - } + // Push the operation in the service + service.operations.push(operation); + service.imports.push(...operation.imports); + services.set(operation.service, service); + }); + break; + } } + } } - return Array.from(services.values()); + } + return Array.from(services.values()); }; diff --git a/src/openApi/v2/parser/getType.spec.ts b/src/openApi/v2/parser/getType.spec.ts index 575d2d46c..b8fbad2b9 100644 --- a/src/openApi/v2/parser/getType.spec.ts +++ b/src/openApi/v2/parser/getType.spec.ts @@ -1,75 +1,75 @@ import { getType } from './getType'; describe('getType', () => { - it('should convert int', () => { - const type = getType('int'); - expect(type.type).toEqual('number'); - expect(type.base).toEqual('number'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); - }); + it('should convert int', () => { + const type = getType('int'); + expect(type.type).toEqual('number'); + expect(type.base).toEqual('number'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + }); - it('should convert string', () => { - const type = getType('string'); - expect(type.type).toEqual('string'); - expect(type.base).toEqual('string'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); - }); + it('should convert string', () => { + const type = getType('string'); + expect(type.type).toEqual('string'); + expect(type.base).toEqual('string'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + }); - it('should convert string array', () => { - const type = getType('array[string]'); - expect(type.type).toEqual('string[]'); - expect(type.base).toEqual('string'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); - }); + it('should convert string array', () => { + const type = getType('array[string]'); + expect(type.type).toEqual('string[]'); + expect(type.base).toEqual('string'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + }); - it('should convert template with primary', () => { - const type = getType('#/definitions/Link[string]'); - expect(type.type).toEqual('Link'); - expect(type.base).toEqual('Link'); - expect(type.template).toEqual('string'); - expect(type.imports).toEqual(['Link']); - }); + it('should convert template with primary', () => { + const type = getType('#/definitions/Link[string]'); + expect(type.type).toEqual('Link'); + expect(type.base).toEqual('Link'); + expect(type.template).toEqual('string'); + expect(type.imports).toEqual(['Link']); + }); - it('should convert template with model', () => { - const type = getType('#/definitions/Link[Model]'); - expect(type.type).toEqual('Link'); - expect(type.base).toEqual('Link'); - expect(type.template).toEqual('Model'); - expect(type.imports).toEqual(['Link', 'Model']); - }); + it('should convert template with model', () => { + const type = getType('#/definitions/Link[Model]'); + expect(type.type).toEqual('Link'); + expect(type.base).toEqual('Link'); + expect(type.template).toEqual('Model'); + expect(type.imports).toEqual(['Link', 'Model']); + }); - it('should have double imports', () => { - const type = getType('#/definitions/Link[Link]'); - expect(type.type).toEqual('Link'); - expect(type.base).toEqual('Link'); - expect(type.template).toEqual('Link'); - expect(type.imports).toEqual(['Link', 'Link']); - }); + it('should have double imports', () => { + const type = getType('#/definitions/Link[Link]'); + expect(type.type).toEqual('Link'); + expect(type.base).toEqual('Link'); + expect(type.template).toEqual('Link'); + expect(type.imports).toEqual(['Link', 'Link']); + }); - it('should support dot', () => { - const type = getType('#/definitions/model.000'); - expect(type.type).toEqual('model_000'); - expect(type.base).toEqual('model_000'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual(['model_000']); - }); + it('should support dot', () => { + const type = getType('#/definitions/model.000'); + expect(type.type).toEqual('model_000'); + expect(type.base).toEqual('model_000'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['model_000']); + }); - it('should support dashes', () => { - const type = getType('#/definitions/some_special-schema'); - expect(type.type).toEqual('some_special_schema'); - expect(type.base).toEqual('some_special_schema'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual(['some_special_schema']); - }); + it('should support dashes', () => { + const type = getType('#/definitions/some_special-schema'); + expect(type.type).toEqual('some_special_schema'); + expect(type.base).toEqual('some_special_schema'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['some_special_schema']); + }); - it('should support dollar sign', () => { - const type = getType('#/definitions/$some+special+schema'); - expect(type.type).toEqual('$some_special_schema'); - expect(type.base).toEqual('$some_special_schema'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual(['$some_special_schema']); - }); + it('should support dollar sign', () => { + const type = getType('#/definitions/$some+special+schema'); + expect(type.type).toEqual('$some_special_schema'); + expect(type.base).toEqual('$some_special_schema'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['$some_special_schema']); + }); }); diff --git a/src/openApi/v2/parser/getType.ts b/src/openApi/v2/parser/getType.ts index 6caa1e015..d255b83b9 100644 --- a/src/openApi/v2/parser/getType.ts +++ b/src/openApi/v2/parser/getType.ts @@ -3,7 +3,7 @@ import { getMappedType } from './getMappedType'; import { stripNamespace } from './stripNamespace'; const encode = (value: string): string => { - return value.replace(/^[^a-zA-Z_$]+/g, '').replace(/[^\w$]+/g, '_'); + return value.replace(/^[^a-zA-Z_$]+/g, '').replace(/[^\w$]+/g, '_'); }; /** @@ -12,56 +12,56 @@ const encode = (value: string): string => { * @param format String value like "binary" or "date". */ export const getType = (type: string = 'any', format?: string): Type => { - const result: Type = { - type: 'any', - base: 'any', - template: null, - imports: [], - isNullable: false, - }; + const result: Type = { + type: 'any', + base: 'any', + template: null, + imports: [], + isNullable: false, + }; - const mapped = getMappedType(type, format); - if (mapped) { - result.type = mapped; - result.base = mapped; - return result; - } + const mapped = getMappedType(type, format); + if (mapped) { + result.type = mapped; + result.base = mapped; + return result; + } - const typeWithoutNamespace = decodeURIComponent(stripNamespace(type)); + const typeWithoutNamespace = decodeURIComponent(stripNamespace(type)); - if (/\[.*\]$/g.test(typeWithoutNamespace)) { - const matches = typeWithoutNamespace.match(/(.*?)\[(.*)\]$/); - if (matches?.length) { - const match1 = getType(encode(matches[1])); - const match2 = getType(encode(matches[2])); + if (/\[.*\]$/g.test(typeWithoutNamespace)) { + const matches = typeWithoutNamespace.match(/(.*?)\[(.*)\]$/); + if (matches?.length) { + const match1 = getType(encode(matches[1])); + const match2 = getType(encode(matches[2])); - if (match1.type === 'any[]') { - result.type = `${match2.type}[]`; - result.base = match2.type; - match1.imports = []; - } else if (match2.type) { - result.type = `${match1.type}<${match2.type}>`; - result.base = match1.type; - result.template = match2.type; - } else { - result.type = match1.type; - result.base = match1.type; - result.template = match1.type; - } + if (match1.type === 'any[]') { + result.type = `${match2.type}[]`; + result.base = match2.type; + match1.imports = []; + } else if (match2.type) { + result.type = `${match1.type}<${match2.type}>`; + result.base = match1.type; + result.template = match2.type; + } else { + result.type = match1.type; + result.base = match1.type; + result.template = match1.type; + } - result.imports.push(...match1.imports); - result.imports.push(...match2.imports); - return result; - } - } - - if (typeWithoutNamespace) { - const type = encode(typeWithoutNamespace); - result.type = type; - result.base = type; - result.imports.push(type); - return result; + result.imports.push(...match1.imports); + result.imports.push(...match2.imports); + return result; } + } + if (typeWithoutNamespace) { + const type = encode(typeWithoutNamespace); + result.type = type; + result.base = type; + result.imports.push(type); return result; + } + + return result; }; diff --git a/src/openApi/v2/parser/sortByRequired.ts b/src/openApi/v2/parser/sortByRequired.ts index 6519bb17e..c94203980 100644 --- a/src/openApi/v2/parser/sortByRequired.ts +++ b/src/openApi/v2/parser/sortByRequired.ts @@ -1,9 +1,9 @@ import type { OperationParameter } from '../../../client/interfaces/OperationParameter'; export const sortByRequired = (a: OperationParameter, b: OperationParameter): number => { - const aNeedsValue = a.isRequired && a.default === undefined; - const bNeedsValue = b.isRequired && b.default === undefined; - if (aNeedsValue && !bNeedsValue) return -1; - if (bNeedsValue && !aNeedsValue) return 1; - return 0; + const aNeedsValue = a.isRequired && a.default === undefined; + const bNeedsValue = b.isRequired && b.default === undefined; + if (aNeedsValue && !bNeedsValue) return -1; + if (bNeedsValue && !aNeedsValue) return 1; + return 0; }; diff --git a/src/openApi/v2/parser/stripNamespace.spec.ts b/src/openApi/v2/parser/stripNamespace.spec.ts index 103f08682..5b8172caa 100644 --- a/src/openApi/v2/parser/stripNamespace.spec.ts +++ b/src/openApi/v2/parser/stripNamespace.spec.ts @@ -1,10 +1,10 @@ import { stripNamespace } from './stripNamespace'; describe('stripNamespace', () => { - it('should strip namespace', () => { - expect(stripNamespace('#/definitions/Item')).toEqual('Item'); - expect(stripNamespace('#/parameters/Item')).toEqual('Item'); - expect(stripNamespace('#/responses/Item')).toEqual('Item'); - expect(stripNamespace('#/securityDefinitions/Item')).toEqual('Item'); - }); + it('should strip namespace', () => { + expect(stripNamespace('#/definitions/Item')).toEqual('Item'); + expect(stripNamespace('#/parameters/Item')).toEqual('Item'); + expect(stripNamespace('#/responses/Item')).toEqual('Item'); + expect(stripNamespace('#/securityDefinitions/Item')).toEqual('Item'); + }); }); diff --git a/src/openApi/v2/parser/stripNamespace.ts b/src/openApi/v2/parser/stripNamespace.ts index ff543b3c9..0b3abd16d 100644 --- a/src/openApi/v2/parser/stripNamespace.ts +++ b/src/openApi/v2/parser/stripNamespace.ts @@ -3,10 +3,10 @@ * @param value */ export const stripNamespace = (value: string): string => { - return value - .trim() - .replace(/^#\/definitions\//, '') - .replace(/^#\/parameters\//, '') - .replace(/^#\/responses\//, '') - .replace(/^#\/securityDefinitions\//, ''); + return value + .trim() + .replace(/^#\/definitions\//, '') + .replace(/^#\/parameters\//, '') + .replace(/^#\/responses\//, '') + .replace(/^#\/securityDefinitions\//, ''); }; diff --git a/src/openApi/v3/index.ts b/src/openApi/v3/index.ts index 9dbdadb34..1eaa23d73 100644 --- a/src/openApi/v3/index.ts +++ b/src/openApi/v3/index.ts @@ -11,10 +11,10 @@ import { getServiceVersion } from './parser/getServiceVersion'; * @param openApi The OpenAPI spec that we have loaded from disk. */ export const parse = (openApi: OpenApi): Client => { - const version = getServiceVersion(openApi.info.version); - const server = getServer(openApi); - const models = getModels(openApi); - const services = getServices(openApi); + const version = getServiceVersion(openApi.info.version); + const server = getServer(openApi); + const models = getModels(openApi); + const services = getServices(openApi); - return { version, server, models, services }; + return { version, server, models, services }; }; diff --git a/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts b/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts index 0d6ead780..05a585a22 100644 --- a/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts +++ b/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts @@ -1,4 +1,4 @@ export interface WithEnumExtension { - 'x-enum-varnames'?: string[]; - 'x-enum-descriptions'?: string[]; + 'x-enum-varnames'?: string[]; + 'x-enum-descriptions'?: string[]; } diff --git a/src/openApi/v3/interfaces/OpenApi.d.ts b/src/openApi/v3/interfaces/OpenApi.d.ts index b33d382a4..d261212aa 100644 --- a/src/openApi/v3/interfaces/OpenApi.d.ts +++ b/src/openApi/v3/interfaces/OpenApi.d.ts @@ -10,12 +10,12 @@ import type { OpenApiTag } from './OpenApiTag'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md */ export interface OpenApi { - openapi: string; - info: OpenApiInfo; - servers?: OpenApiServer[]; - paths: OpenApiPaths; - components?: OpenApiComponents; - security?: OpenApiSecurityRequirement[]; - tags?: OpenApiTag[]; - externalDocs?: OpenApiExternalDocs; + openapi: string; + info: OpenApiInfo; + servers?: OpenApiServer[]; + paths: OpenApiPaths; + components?: OpenApiComponents; + security?: OpenApiSecurityRequirement[]; + tags?: OpenApiTag[]; + externalDocs?: OpenApiExternalDocs; } diff --git a/src/openApi/v3/interfaces/OpenApiCallback.d.ts b/src/openApi/v3/interfaces/OpenApiCallback.d.ts index deec433ce..40d9ef84f 100644 --- a/src/openApi/v3/interfaces/OpenApiCallback.d.ts +++ b/src/openApi/v3/interfaces/OpenApiCallback.d.ts @@ -5,5 +5,5 @@ import type { OpenApiReference } from './OpenApiReference'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#callbackObject */ export interface OpenApiCallback extends OpenApiReference { - [key: string]: OpenApiPath; + [key: string]: OpenApiPath; } diff --git a/src/openApi/v3/interfaces/OpenApiComponents.d.ts b/src/openApi/v3/interfaces/OpenApiComponents.d.ts index 54cfaa680..43cac8c28 100644 --- a/src/openApi/v3/interfaces/OpenApiComponents.d.ts +++ b/src/openApi/v3/interfaces/OpenApiComponents.d.ts @@ -13,13 +13,13 @@ import type { OpenApiSecurityScheme } from './OpenApiSecurityScheme'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#componentsObject */ export interface OpenApiComponents { - schemas?: Dictionary; - responses?: Dictionary; - parameters?: Dictionary; - examples?: Dictionary; - requestBodies?: Dictionary; - headers?: Dictionary; - securitySchemes?: Dictionary; - links?: Dictionary; - callbacks?: Dictionary; + schemas?: Dictionary; + responses?: Dictionary; + parameters?: Dictionary; + examples?: Dictionary; + requestBodies?: Dictionary; + headers?: Dictionary; + securitySchemes?: Dictionary; + links?: Dictionary; + callbacks?: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiContact.d.ts b/src/openApi/v3/interfaces/OpenApiContact.d.ts index a291268f9..989cb6655 100644 --- a/src/openApi/v3/interfaces/OpenApiContact.d.ts +++ b/src/openApi/v3/interfaces/OpenApiContact.d.ts @@ -2,7 +2,7 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#contactObject */ export interface OpenApiContact { - name?: string; - url?: string; - email?: string; + name?: string; + url?: string; + email?: string; } diff --git a/src/openApi/v3/interfaces/OpenApiDiscriminator.d.ts b/src/openApi/v3/interfaces/OpenApiDiscriminator.d.ts index aa683057f..4c27d4809 100644 --- a/src/openApi/v3/interfaces/OpenApiDiscriminator.d.ts +++ b/src/openApi/v3/interfaces/OpenApiDiscriminator.d.ts @@ -4,6 +4,6 @@ import type { Dictionary } from '../../../utils/types'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#discriminatorObject */ export interface OpenApiDiscriminator { - propertyName: string; - mapping?: Dictionary; + propertyName: string; + mapping?: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiEncoding.d.ts b/src/openApi/v3/interfaces/OpenApiEncoding.d.ts index 670a5f15c..0c61f1c3b 100644 --- a/src/openApi/v3/interfaces/OpenApiEncoding.d.ts +++ b/src/openApi/v3/interfaces/OpenApiEncoding.d.ts @@ -5,9 +5,9 @@ import type { OpenApiHeader } from './OpenApiHeader'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#encodingObject */ export interface OpenApiEncoding { - contentType?: string; - headers?: Dictionary; - style?: string; - explode?: boolean; - allowReserved?: boolean; + contentType?: string; + headers?: Dictionary; + style?: string; + explode?: boolean; + allowReserved?: boolean; } diff --git a/src/openApi/v3/interfaces/OpenApiExample.d.ts b/src/openApi/v3/interfaces/OpenApiExample.d.ts index 228795790..1d7b7f24a 100644 --- a/src/openApi/v3/interfaces/OpenApiExample.d.ts +++ b/src/openApi/v3/interfaces/OpenApiExample.d.ts @@ -4,8 +4,8 @@ import type { OpenApiReference } from './OpenApiReference'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#exampleObject */ export interface OpenApiExample extends OpenApiReference { - summary?: string; - description?: string; - value?: any; - externalValue?: string; + summary?: string; + description?: string; + value?: any; + externalValue?: string; } diff --git a/src/openApi/v3/interfaces/OpenApiExternalDocs.d.ts b/src/openApi/v3/interfaces/OpenApiExternalDocs.d.ts index 3aaf18772..798de4dd1 100644 --- a/src/openApi/v3/interfaces/OpenApiExternalDocs.d.ts +++ b/src/openApi/v3/interfaces/OpenApiExternalDocs.d.ts @@ -2,6 +2,6 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#externalDocumentationObject */ export interface OpenApiExternalDocs { - description?: string; - url: string; + description?: string; + url: string; } diff --git a/src/openApi/v3/interfaces/OpenApiHeader.d.ts b/src/openApi/v3/interfaces/OpenApiHeader.d.ts index 694c859ff..44b711d56 100644 --- a/src/openApi/v3/interfaces/OpenApiHeader.d.ts +++ b/src/openApi/v3/interfaces/OpenApiHeader.d.ts @@ -7,14 +7,14 @@ import type { OpenApiSchema } from './OpenApiSchema'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#headerObject */ export interface OpenApiHeader extends OpenApiReference { - description?: string; - required?: boolean; - deprecated?: boolean; - allowEmptyValue?: boolean; - style?: string; - explode?: boolean; - allowReserved?: boolean; - schema?: OpenApiSchema; - example?: any; - examples?: Dictionary; + description?: string; + required?: boolean; + deprecated?: boolean; + allowEmptyValue?: boolean; + style?: string; + explode?: boolean; + allowReserved?: boolean; + schema?: OpenApiSchema; + example?: any; + examples?: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiInfo.d.ts b/src/openApi/v3/interfaces/OpenApiInfo.d.ts index 96fabd0c6..9ec4d55ac 100644 --- a/src/openApi/v3/interfaces/OpenApiInfo.d.ts +++ b/src/openApi/v3/interfaces/OpenApiInfo.d.ts @@ -5,10 +5,10 @@ import type { OpenApiLicense } from './OpenApiLicense'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#infoObject */ export interface OpenApiInfo { - title: string; - description?: string; - termsOfService?: string; - contact?: OpenApiContact; - license?: OpenApiLicense; - version: string; + title: string; + description?: string; + termsOfService?: string; + contact?: OpenApiContact; + license?: OpenApiLicense; + version: string; } diff --git a/src/openApi/v3/interfaces/OpenApiLicense.d.ts b/src/openApi/v3/interfaces/OpenApiLicense.d.ts index 9982f95c9..f96036f37 100644 --- a/src/openApi/v3/interfaces/OpenApiLicense.d.ts +++ b/src/openApi/v3/interfaces/OpenApiLicense.d.ts @@ -2,6 +2,6 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#licenseObject */ export interface OpenApiLicense { - name: string; - url?: string; + name: string; + url?: string; } diff --git a/src/openApi/v3/interfaces/OpenApiLink.d.ts b/src/openApi/v3/interfaces/OpenApiLink.d.ts index 31b9707ec..d299d9de3 100644 --- a/src/openApi/v3/interfaces/OpenApiLink.d.ts +++ b/src/openApi/v3/interfaces/OpenApiLink.d.ts @@ -6,10 +6,10 @@ import type { OpenApiServer } from './OpenApiServer'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#linkObject */ export interface OpenApiLink extends OpenApiReference { - operationRef?: string; - operationId?: string; - parameters?: Dictionary; - requestBody?: any; - description?: string; - server?: OpenApiServer; + operationRef?: string; + operationId?: string; + parameters?: Dictionary; + requestBody?: any; + description?: string; + server?: OpenApiServer; } diff --git a/src/openApi/v3/interfaces/OpenApiMediaType.d.ts b/src/openApi/v3/interfaces/OpenApiMediaType.d.ts index 89f78c8ad..776a26a5c 100644 --- a/src/openApi/v3/interfaces/OpenApiMediaType.d.ts +++ b/src/openApi/v3/interfaces/OpenApiMediaType.d.ts @@ -8,8 +8,8 @@ import type { OpenApiSchema } from './OpenApiSchema'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#mediaTypeObject */ export interface OpenApiMediaType extends OpenApiReference { - schema?: OpenApiSchema; - example?: any; - examples?: Dictionary; - encoding?: Dictionary; + schema?: OpenApiSchema; + example?: any; + examples?: Dictionary; + encoding?: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiOAuthFlow.d.ts b/src/openApi/v3/interfaces/OpenApiOAuthFlow.d.ts index 85654a9a3..467aa198e 100644 --- a/src/openApi/v3/interfaces/OpenApiOAuthFlow.d.ts +++ b/src/openApi/v3/interfaces/OpenApiOAuthFlow.d.ts @@ -4,8 +4,8 @@ import type { Dictionary } from '../../../utils/types'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#oauthFlowObject */ export interface OpenApiOAuthFlow { - authorizationUrl: string; - tokenUrl: string; - refreshUrl?: string; - scopes: Dictionary; + authorizationUrl: string; + tokenUrl: string; + refreshUrl?: string; + scopes: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiOAuthFlows.d.ts b/src/openApi/v3/interfaces/OpenApiOAuthFlows.d.ts index 87accfdb0..dd245d4be 100644 --- a/src/openApi/v3/interfaces/OpenApiOAuthFlows.d.ts +++ b/src/openApi/v3/interfaces/OpenApiOAuthFlows.d.ts @@ -4,8 +4,8 @@ import type { OpenApiOAuthFlow } from './OpenApiOAuthFlow'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#oauthFlowsObject */ export interface OpenApiOAuthFlows { - implicit?: OpenApiOAuthFlow; - password?: OpenApiOAuthFlow; - clientCredentials?: OpenApiOAuthFlow; - authorizationCode?: OpenApiOAuthFlow; + implicit?: OpenApiOAuthFlow; + password?: OpenApiOAuthFlow; + clientCredentials?: OpenApiOAuthFlow; + authorizationCode?: OpenApiOAuthFlow; } diff --git a/src/openApi/v3/interfaces/OpenApiOperation.d.ts b/src/openApi/v3/interfaces/OpenApiOperation.d.ts index 954d9653b..e83cf77ea 100644 --- a/src/openApi/v3/interfaces/OpenApiOperation.d.ts +++ b/src/openApi/v3/interfaces/OpenApiOperation.d.ts @@ -11,16 +11,16 @@ import type { OpenApiServer } from './OpenApiServer'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operationObject */ export interface OpenApiOperation { - tags?: string[]; - summary?: string; - description?: string; - externalDocs?: OpenApiExternalDocs; - operationId?: string; - parameters?: OpenApiParameter[]; - requestBody?: OpenApiRequestBody; - responses: OpenApiResponses; - callbacks?: Dictionary; - deprecated?: boolean; - security?: OpenApiSecurityRequirement[]; - servers?: OpenApiServer[]; + tags?: string[]; + summary?: string; + description?: string; + externalDocs?: OpenApiExternalDocs; + operationId?: string; + parameters?: OpenApiParameter[]; + requestBody?: OpenApiRequestBody; + responses: OpenApiResponses; + callbacks?: Dictionary; + deprecated?: boolean; + security?: OpenApiSecurityRequirement[]; + servers?: OpenApiServer[]; } diff --git a/src/openApi/v3/interfaces/OpenApiParameter.d.ts b/src/openApi/v3/interfaces/OpenApiParameter.d.ts index 7172feb7b..5bac9de54 100644 --- a/src/openApi/v3/interfaces/OpenApiParameter.d.ts +++ b/src/openApi/v3/interfaces/OpenApiParameter.d.ts @@ -7,17 +7,17 @@ import type { OpenApiSchema } from './OpenApiSchema'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject */ export interface OpenApiParameter extends OpenApiReference { - name: string; - in: 'path' | 'query' | 'header' | 'formData' | 'cookie'; - description?: string; - required?: boolean; - nullable?: boolean; - deprecated?: boolean; - allowEmptyValue?: boolean; - style?: string; - explode?: boolean; - allowReserved?: boolean; - schema?: OpenApiSchema; - example?: any; - examples?: Dictionary; + name: string; + in: 'path' | 'query' | 'header' | 'formData' | 'cookie'; + description?: string; + required?: boolean; + nullable?: boolean; + deprecated?: boolean; + allowEmptyValue?: boolean; + style?: string; + explode?: boolean; + allowReserved?: boolean; + schema?: OpenApiSchema; + example?: any; + examples?: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiPath.d.ts b/src/openApi/v3/interfaces/OpenApiPath.d.ts index a0d298054..61f93ea87 100644 --- a/src/openApi/v3/interfaces/OpenApiPath.d.ts +++ b/src/openApi/v3/interfaces/OpenApiPath.d.ts @@ -6,16 +6,16 @@ import type { OpenApiServer } from './OpenApiServer'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#pathItemObject */ export interface OpenApiPath { - summary?: string; - description?: string; - get?: OpenApiOperation; - put?: OpenApiOperation; - post?: OpenApiOperation; - delete?: OpenApiOperation; - options?: OpenApiOperation; - head?: OpenApiOperation; - patch?: OpenApiOperation; - trace?: OpenApiOperation; - servers?: OpenApiServer[]; - parameters?: OpenApiParameter[]; + summary?: string; + description?: string; + get?: OpenApiOperation; + put?: OpenApiOperation; + post?: OpenApiOperation; + delete?: OpenApiOperation; + options?: OpenApiOperation; + head?: OpenApiOperation; + patch?: OpenApiOperation; + trace?: OpenApiOperation; + servers?: OpenApiServer[]; + parameters?: OpenApiParameter[]; } diff --git a/src/openApi/v3/interfaces/OpenApiPaths.d.ts b/src/openApi/v3/interfaces/OpenApiPaths.d.ts index 334e1bed6..be398b134 100644 --- a/src/openApi/v3/interfaces/OpenApiPaths.d.ts +++ b/src/openApi/v3/interfaces/OpenApiPaths.d.ts @@ -4,5 +4,5 @@ import type { OpenApiPath } from './OpenApiPath'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#pathsObject */ export interface OpenApiPaths { - [path: string]: OpenApiPath; + [path: string]: OpenApiPath; } diff --git a/src/openApi/v3/interfaces/OpenApiReference.d.ts b/src/openApi/v3/interfaces/OpenApiReference.d.ts index e3a1c07ba..3eb2266dd 100644 --- a/src/openApi/v3/interfaces/OpenApiReference.d.ts +++ b/src/openApi/v3/interfaces/OpenApiReference.d.ts @@ -2,5 +2,5 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#referenceObject */ export interface OpenApiReference { - $ref?: string; + $ref?: string; } diff --git a/src/openApi/v3/interfaces/OpenApiRequestBody.d.ts b/src/openApi/v3/interfaces/OpenApiRequestBody.d.ts index 1a687b8b9..dc9f15459 100644 --- a/src/openApi/v3/interfaces/OpenApiRequestBody.d.ts +++ b/src/openApi/v3/interfaces/OpenApiRequestBody.d.ts @@ -6,8 +6,8 @@ import type { OpenApiReference } from './OpenApiReference'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#requestBodyObject */ export interface OpenApiRequestBody extends OpenApiReference { - description?: string; - content: Dictionary; - required?: boolean; - nullable?: boolean; + description?: string; + content: Dictionary; + required?: boolean; + nullable?: boolean; } diff --git a/src/openApi/v3/interfaces/OpenApiResponse.d.ts b/src/openApi/v3/interfaces/OpenApiResponse.d.ts index d6509bd7b..83e0ac85f 100644 --- a/src/openApi/v3/interfaces/OpenApiResponse.d.ts +++ b/src/openApi/v3/interfaces/OpenApiResponse.d.ts @@ -8,8 +8,8 @@ import type { OpenApiReference } from './OpenApiReference'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject */ export interface OpenApiResponse extends OpenApiReference { - description: string; - headers?: Dictionary; - content?: Dictionary; - links?: Dictionary; + description: string; + headers?: Dictionary; + content?: Dictionary; + links?: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiResponses.d.ts b/src/openApi/v3/interfaces/OpenApiResponses.d.ts index fd909d29c..db3242fe1 100644 --- a/src/openApi/v3/interfaces/OpenApiResponses.d.ts +++ b/src/openApi/v3/interfaces/OpenApiResponses.d.ts @@ -5,7 +5,7 @@ import type { OpenApiResponse } from './OpenApiResponse'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responsesObject */ export interface OpenApiResponses extends OpenApiReference { - default: OpenApiResponse; + default: OpenApiResponse; - [httpcode: string]: OpenApiResponse; + [httpcode: string]: OpenApiResponse; } diff --git a/src/openApi/v3/interfaces/OpenApiSchema.d.ts b/src/openApi/v3/interfaces/OpenApiSchema.d.ts index a51456f3b..fc5c8d815 100644 --- a/src/openApi/v3/interfaces/OpenApiSchema.d.ts +++ b/src/openApi/v3/interfaces/OpenApiSchema.d.ts @@ -9,50 +9,50 @@ import type { OpenApiXml } from './OpenApiXml'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject */ export interface OpenApiSchema extends OpenApiReference, WithEnumExtension { - title?: string; - multipleOf?: number; - maximum?: number; - exclusiveMaximum?: boolean; - minimum?: number; - exclusiveMinimum?: boolean; - maxLength?: number; - minLength?: number; - pattern?: string; - maxItems?: number; - minItems?: number; - uniqueItems?: boolean; - maxProperties?: number; - minProperties?: number; - required?: string[]; - enum?: (string | number)[]; - type?: string | string[]; - allOf?: OpenApiSchema[]; - oneOf?: OpenApiSchema[]; - anyOf?: OpenApiSchema[]; - not?: OpenApiSchema[]; - items?: OpenApiSchema; - properties?: Dictionary; - additionalProperties?: boolean | OpenApiSchema; - description?: string; - format?: - | 'int32' - | 'int64' - | 'float' - | 'double' - | 'string' - | 'boolean' - | 'byte' - | 'binary' - | 'date' - | 'date-time' - | 'password'; - default?: any; - nullable?: boolean; - discriminator?: OpenApiDiscriminator; - readOnly?: boolean; - writeOnly?: boolean; - xml?: OpenApiXml; - externalDocs?: OpenApiExternalDocs; - example?: any; - deprecated?: boolean; + title?: string; + multipleOf?: number; + maximum?: number; + exclusiveMaximum?: boolean; + minimum?: number; + exclusiveMinimum?: boolean; + maxLength?: number; + minLength?: number; + pattern?: string; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + maxProperties?: number; + minProperties?: number; + required?: string[]; + enum?: (string | number)[]; + type?: string | string[]; + allOf?: OpenApiSchema[]; + oneOf?: OpenApiSchema[]; + anyOf?: OpenApiSchema[]; + not?: OpenApiSchema[]; + items?: OpenApiSchema; + properties?: Dictionary; + additionalProperties?: boolean | OpenApiSchema; + description?: string; + format?: + | 'int32' + | 'int64' + | 'float' + | 'double' + | 'string' + | 'boolean' + | 'byte' + | 'binary' + | 'date' + | 'date-time' + | 'password'; + default?: any; + nullable?: boolean; + discriminator?: OpenApiDiscriminator; + readOnly?: boolean; + writeOnly?: boolean; + xml?: OpenApiXml; + externalDocs?: OpenApiExternalDocs; + example?: any; + deprecated?: boolean; } diff --git a/src/openApi/v3/interfaces/OpenApiSecurityRequirement.d.ts b/src/openApi/v3/interfaces/OpenApiSecurityRequirement.d.ts index 147407a8e..655e92128 100644 --- a/src/openApi/v3/interfaces/OpenApiSecurityRequirement.d.ts +++ b/src/openApi/v3/interfaces/OpenApiSecurityRequirement.d.ts @@ -2,5 +2,5 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#securityRequirementObject */ export interface OpenApiSecurityRequirement { - [name: string]: string; + [name: string]: string; } diff --git a/src/openApi/v3/interfaces/OpenApiSecurityScheme.d.ts b/src/openApi/v3/interfaces/OpenApiSecurityScheme.d.ts index 21cfd1c2b..5f507c0b0 100644 --- a/src/openApi/v3/interfaces/OpenApiSecurityScheme.d.ts +++ b/src/openApi/v3/interfaces/OpenApiSecurityScheme.d.ts @@ -5,12 +5,12 @@ import type { OpenApiReference } from './OpenApiReference'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#securitySchemeObject */ export interface OpenApiSecurityScheme extends OpenApiReference { - type: 'apiKey' | 'http' | 'oauth2' | 'openIdConnect'; - description?: string; - name?: string; - in?: 'query' | 'header' | 'cookie'; - scheme?: string; - bearerFormat?: string; - flows?: OpenApiOAuthFlows; - openIdConnectUrl?: string; + type: 'apiKey' | 'http' | 'oauth2' | 'openIdConnect'; + description?: string; + name?: string; + in?: 'query' | 'header' | 'cookie'; + scheme?: string; + bearerFormat?: string; + flows?: OpenApiOAuthFlows; + openIdConnectUrl?: string; } diff --git a/src/openApi/v3/interfaces/OpenApiServer.d.ts b/src/openApi/v3/interfaces/OpenApiServer.d.ts index 811786614..7968917be 100644 --- a/src/openApi/v3/interfaces/OpenApiServer.d.ts +++ b/src/openApi/v3/interfaces/OpenApiServer.d.ts @@ -5,7 +5,7 @@ import type { OpenApiServerVariable } from './OpenApiServerVariable'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#serverObject */ export interface OpenApiServer { - url: string; - description?: string; - variables?: Dictionary; + url: string; + description?: string; + variables?: Dictionary; } diff --git a/src/openApi/v3/interfaces/OpenApiServerVariable.d.ts b/src/openApi/v3/interfaces/OpenApiServerVariable.d.ts index 7e556ccd7..e90c8d7a3 100644 --- a/src/openApi/v3/interfaces/OpenApiServerVariable.d.ts +++ b/src/openApi/v3/interfaces/OpenApiServerVariable.d.ts @@ -4,7 +4,7 @@ import type { WithEnumExtension } from './Extensions/WithEnumExtension'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#serverVariableObject */ export interface OpenApiServerVariable extends WithEnumExtension { - enum?: (string | number)[]; - default: string; - description?: string; + enum?: (string | number)[]; + default: string; + description?: string; } diff --git a/src/openApi/v3/interfaces/OpenApiTag.d.ts b/src/openApi/v3/interfaces/OpenApiTag.d.ts index 4bded3373..98e785cea 100644 --- a/src/openApi/v3/interfaces/OpenApiTag.d.ts +++ b/src/openApi/v3/interfaces/OpenApiTag.d.ts @@ -4,7 +4,7 @@ import type { OpenApiExternalDocs } from './OpenApiExternalDocs'; * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#tagObject */ export interface OpenApiTag { - name: string; - description?: string; - externalDocs?: OpenApiExternalDocs; + name: string; + description?: string; + externalDocs?: OpenApiExternalDocs; } diff --git a/src/openApi/v3/interfaces/OpenApiXml.d.ts b/src/openApi/v3/interfaces/OpenApiXml.d.ts index 2528bbd4a..6b78276aa 100644 --- a/src/openApi/v3/interfaces/OpenApiXml.d.ts +++ b/src/openApi/v3/interfaces/OpenApiXml.d.ts @@ -2,9 +2,9 @@ * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#xmlObject */ export interface OpenApiXml { - name?: string; - namespace?: string; - prefix?: string; - attribute?: boolean; - wrapped?: boolean; + name?: string; + namespace?: string; + prefix?: string; + attribute?: boolean; + wrapped?: boolean; } diff --git a/src/openApi/v3/parser/escapeName.spec.ts b/src/openApi/v3/parser/escapeName.spec.ts index 8e343d4f9..3d9409915 100644 --- a/src/openApi/v3/parser/escapeName.spec.ts +++ b/src/openApi/v3/parser/escapeName.spec.ts @@ -1,21 +1,21 @@ import { escapeName } from './escapeName'; describe('escapeName', () => { - it('should escape', () => { - expect(escapeName('')).toEqual("''"); - expect(escapeName('fooBar')).toEqual('fooBar'); - expect(escapeName('Foo Bar')).toEqual(`'Foo Bar'`); - expect(escapeName('foo bar')).toEqual(`'foo bar'`); - expect(escapeName('foo-bar')).toEqual(`'foo-bar'`); - expect(escapeName('foo.bar')).toEqual(`'foo.bar'`); - expect(escapeName('foo_bar')).toEqual('foo_bar'); - expect(escapeName('123foo.bar')).toEqual(`'123foo.bar'`); - expect(escapeName('@foo.bar')).toEqual(`'@foo.bar'`); - expect(escapeName('$foo.bar')).toEqual(`'$foo.bar'`); - expect(escapeName('_foo.bar')).toEqual(`'_foo.bar'`); - expect(escapeName('123foobar')).toEqual(`'123foobar'`); - expect(escapeName('@foobar')).toEqual(`'@foobar'`); - expect(escapeName('$foobar')).toEqual('$foobar'); - expect(escapeName('_foobar')).toEqual('_foobar'); - }); + it('should escape', () => { + expect(escapeName('')).toEqual("''"); + expect(escapeName('fooBar')).toEqual('fooBar'); + expect(escapeName('Foo Bar')).toEqual(`'Foo Bar'`); + expect(escapeName('foo bar')).toEqual(`'foo bar'`); + expect(escapeName('foo-bar')).toEqual(`'foo-bar'`); + expect(escapeName('foo.bar')).toEqual(`'foo.bar'`); + expect(escapeName('foo_bar')).toEqual('foo_bar'); + expect(escapeName('123foo.bar')).toEqual(`'123foo.bar'`); + expect(escapeName('@foo.bar')).toEqual(`'@foo.bar'`); + expect(escapeName('$foo.bar')).toEqual(`'$foo.bar'`); + expect(escapeName('_foo.bar')).toEqual(`'_foo.bar'`); + expect(escapeName('123foobar')).toEqual(`'123foobar'`); + expect(escapeName('@foobar')).toEqual(`'@foobar'`); + expect(escapeName('$foobar')).toEqual('$foobar'); + expect(escapeName('_foobar')).toEqual('_foobar'); + }); }); diff --git a/src/openApi/v3/parser/escapeName.ts b/src/openApi/v3/parser/escapeName.ts index 9d6816c10..403d69583 100644 --- a/src/openApi/v3/parser/escapeName.ts +++ b/src/openApi/v3/parser/escapeName.ts @@ -1,9 +1,9 @@ export const escapeName = (value: string): string => { - if (value || value === '') { - const validName = /^[a-zA-Z_$][\w$]+$/g.test(value); - if (!validName) { - return `'${value}'`; - } + if (value || value === '') { + const validName = /^[a-zA-Z_$][\w$]+$/g.test(value); + if (!validName) { + return `'${value}'`; } - return value; + } + return value; }; diff --git a/src/openApi/v3/parser/extendEnum.ts b/src/openApi/v3/parser/extendEnum.ts index a7fa865cb..d2b9373f7 100644 --- a/src/openApi/v3/parser/extendEnum.ts +++ b/src/openApi/v3/parser/extendEnum.ts @@ -9,13 +9,13 @@ import type { WithEnumExtension } from '../interfaces/Extensions/WithEnumExtensi * @param definition */ export const extendEnum = (enumerators: Enum[], definition: WithEnumExtension): Enum[] => { - const names = definition['x-enum-varnames']?.filter(isString); - const descriptions = definition['x-enum-descriptions']?.filter(isString); + const names = definition['x-enum-varnames']?.filter(isString); + const descriptions = definition['x-enum-descriptions']?.filter(isString); - return enumerators.map((enumerator, index) => ({ - name: names?.[index] || enumerator.name, - description: descriptions?.[index] || enumerator.description, - value: enumerator.value, - type: enumerator.type, - })); + return enumerators.map((enumerator, index) => ({ + name: names?.[index] || enumerator.name, + description: descriptions?.[index] || enumerator.description, + value: enumerator.value, + type: enumerator.type, + })); }; diff --git a/src/openApi/v3/parser/getContent.ts b/src/openApi/v3/parser/getContent.ts index 976625817..907590170 100644 --- a/src/openApi/v3/parser/getContent.ts +++ b/src/openApi/v3/parser/getContent.ts @@ -5,42 +5,42 @@ import type { OpenApiMediaType } from '../interfaces/OpenApiMediaType'; import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; export interface Content { - mediaType: string; - schema: OpenApiSchema; + mediaType: string; + schema: OpenApiSchema; } const BASIC_MEDIA_TYPES = [ - 'application/json-patch+json', - 'application/json', - 'application/x-www-form-urlencoded', - 'text/json', - 'text/plain', - 'multipart/form-data', - 'multipart/mixed', - 'multipart/related', - 'multipart/batch', + 'application/json-patch+json', + 'application/json', + 'application/x-www-form-urlencoded', + 'text/json', + 'text/plain', + 'multipart/form-data', + 'multipart/mixed', + 'multipart/related', + 'multipart/batch', ]; export const getContent = (openApi: OpenApi, content: Dictionary): Content | null => { - const basicMediaTypeWithSchema = Object.keys(content) - .filter(mediaType => { - const cleanMediaType = mediaType.split(';')[0].trim(); - return BASIC_MEDIA_TYPES.includes(cleanMediaType); - }) - .find(mediaType => isDefined(content[mediaType]?.schema)); - if (basicMediaTypeWithSchema) { - return { - mediaType: basicMediaTypeWithSchema, - schema: content[basicMediaTypeWithSchema].schema as OpenApiSchema, - }; - } + const basicMediaTypeWithSchema = Object.keys(content) + .filter((mediaType) => { + const cleanMediaType = mediaType.split(';')[0].trim(); + return BASIC_MEDIA_TYPES.includes(cleanMediaType); + }) + .find((mediaType) => isDefined(content[mediaType]?.schema)); + if (basicMediaTypeWithSchema) { + return { + mediaType: basicMediaTypeWithSchema, + schema: content[basicMediaTypeWithSchema].schema as OpenApiSchema, + }; + } - const firstMediaTypeWithSchema = Object.keys(content).find(mediaType => isDefined(content[mediaType]?.schema)); - if (firstMediaTypeWithSchema) { - return { - mediaType: firstMediaTypeWithSchema, - schema: content[firstMediaTypeWithSchema].schema as OpenApiSchema, - }; - } - return null; + const firstMediaTypeWithSchema = Object.keys(content).find((mediaType) => isDefined(content[mediaType]?.schema)); + if (firstMediaTypeWithSchema) { + return { + mediaType: firstMediaTypeWithSchema, + schema: content[firstMediaTypeWithSchema].schema as OpenApiSchema, + }; + } + return null; }; diff --git a/src/openApi/v3/parser/getEnum.ts b/src/openApi/v3/parser/getEnum.ts index 64c7ca8b5..e7959b85c 100644 --- a/src/openApi/v3/parser/getEnum.ts +++ b/src/openApi/v3/parser/getEnum.ts @@ -1,34 +1,34 @@ import type { Enum } from '../../../client/interfaces/Enum'; export const getEnum = (values?: (string | number)[]): Enum[] => { - if (Array.isArray(values)) { - return values - .filter((value, index, arr) => { - return arr.indexOf(value) === index; - }) - .filter((value: any) => { - return typeof value === 'number' || typeof value === 'string'; - }) - .map(value => { - if (typeof value === 'number') { - return { - name: `'_${value}'`, - value: String(value), - type: 'number', - description: null, - }; - } - return { - name: String(value) - .replace(/\W+/g, '_') - .replace(/^(\d+)/g, '_$1') - .replace(/([a-z])([A-Z]+)/g, '$1_$2') - .toUpperCase(), - value: `'${value.replace(/'/g, "\\'")}'`, - type: 'string', - description: null, - }; - }); - } - return []; + if (Array.isArray(values)) { + return values + .filter((value, index, arr) => { + return arr.indexOf(value) === index; + }) + .filter((value: any) => { + return typeof value === 'number' || typeof value === 'string'; + }) + .map((value) => { + if (typeof value === 'number') { + return { + name: `'_${value}'`, + value: String(value), + type: 'number', + description: null, + }; + } + return { + name: String(value) + .replace(/\W+/g, '_') + .replace(/^(\d+)/g, '_$1') + .replace(/([a-z])([A-Z]+)/g, '$1_$2') + .toUpperCase(), + value: `'${value.replace(/'/g, "\\'")}'`, + type: 'string', + description: null, + }; + }); + } + return []; }; diff --git a/src/openApi/v3/parser/getMappedType.spec.ts b/src/openApi/v3/parser/getMappedType.spec.ts index 8dd847c91..40d73b365 100644 --- a/src/openApi/v3/parser/getMappedType.spec.ts +++ b/src/openApi/v3/parser/getMappedType.spec.ts @@ -1,21 +1,21 @@ import { getMappedType } from './getMappedType'; describe('getMappedType', () => { - it('should map types to the basics', () => { - expect(getMappedType('file')).toEqual('binary'); - expect(getMappedType('string')).toEqual('string'); - expect(getMappedType('date')).toEqual('string'); - expect(getMappedType('date-time')).toEqual('string'); - expect(getMappedType('float')).toEqual('number'); - expect(getMappedType('double')).toEqual('number'); - expect(getMappedType('short')).toEqual('number'); - expect(getMappedType('int')).toEqual('number'); - expect(getMappedType('boolean')).toEqual('boolean'); - expect(getMappedType('any')).toEqual('any'); - expect(getMappedType('object')).toEqual('any'); - expect(getMappedType('void')).toEqual('void'); - expect(getMappedType('null')).toEqual('null'); - expect(getMappedType('unknown')).toEqual(undefined); - expect(getMappedType('')).toEqual(undefined); - }); + it('should map types to the basics', () => { + expect(getMappedType('file')).toEqual('binary'); + expect(getMappedType('string')).toEqual('string'); + expect(getMappedType('date')).toEqual('string'); + expect(getMappedType('date-time')).toEqual('string'); + expect(getMappedType('float')).toEqual('number'); + expect(getMappedType('double')).toEqual('number'); + expect(getMappedType('short')).toEqual('number'); + expect(getMappedType('int')).toEqual('number'); + expect(getMappedType('boolean')).toEqual('boolean'); + expect(getMappedType('any')).toEqual('any'); + expect(getMappedType('object')).toEqual('any'); + expect(getMappedType('void')).toEqual('void'); + expect(getMappedType('null')).toEqual('null'); + expect(getMappedType('unknown')).toEqual(undefined); + expect(getMappedType('')).toEqual(undefined); + }); }); diff --git a/src/openApi/v3/parser/getMappedType.ts b/src/openApi/v3/parser/getMappedType.ts index a7c32fd84..fdaadd20f 100644 --- a/src/openApi/v3/parser/getMappedType.ts +++ b/src/openApi/v3/parser/getMappedType.ts @@ -1,32 +1,32 @@ const TYPE_MAPPINGS = new Map([ - ['file', 'binary'], - ['any', 'any'], - ['object', 'any'], - ['array', 'any[]'], - ['boolean', 'boolean'], - ['byte', 'number'], - ['int', 'number'], - ['integer', 'number'], - ['float', 'number'], - ['double', 'number'], - ['short', 'number'], - ['long', 'number'], - ['number', 'number'], - ['char', 'string'], - ['date', 'string'], - ['date-time', 'string'], - ['password', 'string'], - ['string', 'string'], - ['void', 'void'], - ['null', 'null'], + ['file', 'binary'], + ['any', 'any'], + ['object', 'any'], + ['array', 'any[]'], + ['boolean', 'boolean'], + ['byte', 'number'], + ['int', 'number'], + ['integer', 'number'], + ['float', 'number'], + ['double', 'number'], + ['short', 'number'], + ['long', 'number'], + ['number', 'number'], + ['char', 'string'], + ['date', 'string'], + ['date-time', 'string'], + ['password', 'string'], + ['string', 'string'], + ['void', 'void'], + ['null', 'null'], ]); /** * Get mapped type for given type to any basic Typescript/Javascript type. */ export const getMappedType = (type: string, format?: string): string | undefined => { - if (format === 'binary') { - return 'binary'; - } - return TYPE_MAPPINGS.get(type); + if (format === 'binary') { + return 'binary'; + } + return TYPE_MAPPINGS.get(type); }; diff --git a/src/openApi/v3/parser/getModel.ts b/src/openApi/v3/parser/getModel.ts index 9e9c60a98..26078b03d 100644 --- a/src/openApi/v3/parser/getModel.ts +++ b/src/openApi/v3/parser/getModel.ts @@ -10,187 +10,187 @@ import { getModelProperties } from './getModelProperties'; import { getType } from './getType'; export const getModel = ( - openApi: OpenApi, - definition: OpenApiSchema, - isDefinition: boolean = false, - name: string = '' + openApi: OpenApi, + definition: OpenApiSchema, + isDefinition: boolean = false, + name: string = '', ): Model => { - const model: Model = { - name, - export: 'interface', - type: 'any', - base: 'any', - template: null, - link: null, - description: definition.description || null, - deprecated: definition.deprecated === true, - isDefinition, - isReadOnly: definition.readOnly === true, - isNullable: definition.nullable === true, - isRequired: false, - format: definition.format, - maximum: definition.maximum, - exclusiveMaximum: definition.exclusiveMaximum, - minimum: definition.minimum, - exclusiveMinimum: definition.exclusiveMinimum, - multipleOf: definition.multipleOf, - maxLength: definition.maxLength, - minLength: definition.minLength, - maxItems: definition.maxItems, - minItems: definition.minItems, - uniqueItems: definition.uniqueItems, - maxProperties: definition.maxProperties, - minProperties: definition.minProperties, - pattern: getPattern(definition.pattern), - imports: [], - enum: [], - enums: [], - properties: [], - }; + const model: Model = { + name, + export: 'interface', + type: 'any', + base: 'any', + template: null, + link: null, + description: definition.description || null, + deprecated: definition.deprecated === true, + isDefinition, + isReadOnly: definition.readOnly === true, + isNullable: definition.nullable === true, + isRequired: false, + format: definition.format, + maximum: definition.maximum, + exclusiveMaximum: definition.exclusiveMaximum, + minimum: definition.minimum, + exclusiveMinimum: definition.exclusiveMinimum, + multipleOf: definition.multipleOf, + maxLength: definition.maxLength, + minLength: definition.minLength, + maxItems: definition.maxItems, + minItems: definition.minItems, + uniqueItems: definition.uniqueItems, + maxProperties: definition.maxProperties, + minProperties: definition.minProperties, + pattern: getPattern(definition.pattern), + imports: [], + enum: [], + enums: [], + properties: [], + }; - if (definition.$ref) { - const definitionRef = getType(definition.$ref); - model.export = 'reference'; - model.type = definitionRef.type; - model.base = definitionRef.base; - model.template = definitionRef.template; - model.imports.push(...definitionRef.imports); - model.default = getModelDefault(definition, model); - return model; - } + if (definition.$ref) { + const definitionRef = getType(definition.$ref); + model.export = 'reference'; + model.type = definitionRef.type; + model.base = definitionRef.base; + model.template = definitionRef.template; + model.imports.push(...definitionRef.imports); + model.default = getModelDefault(definition, model); + return model; + } - if (definition.enum && definition.type !== 'boolean') { - const enumerators = getEnum(definition.enum); - const extendedEnumerators = extendEnum(enumerators, definition); - if (extendedEnumerators.length) { - model.export = 'enum'; - model.type = 'string'; - model.base = 'string'; - model.enum.push(...extendedEnumerators); - model.default = getModelDefault(definition, model); - return model; - } + if (definition.enum && definition.type !== 'boolean') { + const enumerators = getEnum(definition.enum); + const extendedEnumerators = extendEnum(enumerators, definition); + if (extendedEnumerators.length) { + model.export = 'enum'; + model.type = 'string'; + model.base = 'string'; + model.enum.push(...extendedEnumerators); + model.default = getModelDefault(definition, model); + return model; } + } - if (definition.type === 'array' && definition.items) { - if (definition.items.$ref) { - const arrayItems = getType(definition.items.$ref); - model.export = 'array'; - model.type = arrayItems.type; - model.base = arrayItems.base; - model.template = arrayItems.template; - model.imports.push(...arrayItems.imports); - model.default = getModelDefault(definition, model); - return model; - } else { - const arrayItems = getModel(openApi, definition.items); - model.export = 'array'; - model.type = arrayItems.type; - model.base = arrayItems.base; - model.template = arrayItems.template; - model.link = arrayItems; - model.imports.push(...arrayItems.imports); - model.default = getModelDefault(definition, model); - return model; - } + if (definition.type === 'array' && definition.items) { + if (definition.items.$ref) { + const arrayItems = getType(definition.items.$ref); + model.export = 'array'; + model.type = arrayItems.type; + model.base = arrayItems.base; + model.template = arrayItems.template; + model.imports.push(...arrayItems.imports); + model.default = getModelDefault(definition, model); + return model; + } else { + const arrayItems = getModel(openApi, definition.items); + model.export = 'array'; + model.type = arrayItems.type; + model.base = arrayItems.base; + model.template = arrayItems.template; + model.link = arrayItems; + model.imports.push(...arrayItems.imports); + model.default = getModelDefault(definition, model); + return model; } + } - if ( - definition.type === 'object' && - (typeof definition.additionalProperties === 'object' || definition.additionalProperties === true) - ) { - const ap = typeof definition.additionalProperties === 'object' ? definition.additionalProperties : {}; - if (ap.$ref) { - const additionalProperties = getType(ap.$ref); - model.export = 'dictionary'; - model.type = additionalProperties.type; - model.base = additionalProperties.base; - model.template = additionalProperties.template; - model.imports.push(...additionalProperties.imports); - model.default = getModelDefault(definition, model); - return model; - } else { - const additionalProperties = getModel(openApi, ap); - model.export = 'dictionary'; - model.type = additionalProperties.type; - model.base = additionalProperties.base; - model.template = additionalProperties.template; - model.link = additionalProperties; - model.imports.push(...additionalProperties.imports); - model.default = getModelDefault(definition, model); - return model; - } + if ( + definition.type === 'object' && + (typeof definition.additionalProperties === 'object' || definition.additionalProperties === true) + ) { + const ap = typeof definition.additionalProperties === 'object' ? definition.additionalProperties : {}; + if (ap.$ref) { + const additionalProperties = getType(ap.$ref); + model.export = 'dictionary'; + model.type = additionalProperties.type; + model.base = additionalProperties.base; + model.template = additionalProperties.template; + model.imports.push(...additionalProperties.imports); + model.default = getModelDefault(definition, model); + return model; + } else { + const additionalProperties = getModel(openApi, ap); + model.export = 'dictionary'; + model.type = additionalProperties.type; + model.base = additionalProperties.base; + model.template = additionalProperties.template; + model.link = additionalProperties; + model.imports.push(...additionalProperties.imports); + model.default = getModelDefault(definition, model); + return model; } + } - if (definition.oneOf?.length) { - const composition = getModelComposition(openApi, definition, definition.oneOf, 'one-of', getModel); - model.export = composition.type; - model.imports.push(...composition.imports); - model.properties.push(...composition.properties); - model.enums.push(...composition.enums); - return model; - } + if (definition.oneOf?.length) { + const composition = getModelComposition(openApi, definition, definition.oneOf, 'one-of', getModel); + model.export = composition.type; + model.imports.push(...composition.imports); + model.properties.push(...composition.properties); + model.enums.push(...composition.enums); + return model; + } - if (definition.anyOf?.length) { - const composition = getModelComposition(openApi, definition, definition.anyOf, 'any-of', getModel); - model.export = composition.type; - model.imports.push(...composition.imports); - model.properties.push(...composition.properties); - model.enums.push(...composition.enums); - return model; - } + if (definition.anyOf?.length) { + const composition = getModelComposition(openApi, definition, definition.anyOf, 'any-of', getModel); + model.export = composition.type; + model.imports.push(...composition.imports); + model.properties.push(...composition.properties); + model.enums.push(...composition.enums); + return model; + } - if (definition.allOf?.length) { - const composition = getModelComposition(openApi, definition, definition.allOf, 'all-of', getModel); - model.export = composition.type; - model.imports.push(...composition.imports); - model.properties.push(...composition.properties); - model.enums.push(...composition.enums); - return model; - } + if (definition.allOf?.length) { + const composition = getModelComposition(openApi, definition, definition.allOf, 'all-of', getModel); + model.export = composition.type; + model.imports.push(...composition.imports); + model.properties.push(...composition.properties); + model.enums.push(...composition.enums); + return model; + } - if (definition.type === 'object') { - if (definition.properties) { - model.export = 'interface'; - model.type = 'any'; - model.base = 'any'; - model.default = getModelDefault(definition, model); + if (definition.type === 'object') { + if (definition.properties) { + model.export = 'interface'; + model.type = 'any'; + model.base = 'any'; + model.default = getModelDefault(definition, model); - const modelProperties = getModelProperties(openApi, definition, getModel, model); - modelProperties.forEach(modelProperty => { - model.imports.push(...modelProperty.imports); - model.enums.push(...modelProperty.enums); - model.properties.push(modelProperty); - if (modelProperty.export === 'enum') { - model.enums.push(modelProperty); - } - }); - return model; - } else { - const additionalProperties = getModel(openApi, {}); - model.export = 'dictionary'; - model.type = additionalProperties.type; - model.base = additionalProperties.base; - model.template = additionalProperties.template; - model.link = additionalProperties; - model.imports.push(...additionalProperties.imports); - model.default = getModelDefault(definition, model); - return model; + const modelProperties = getModelProperties(openApi, definition, getModel, model); + modelProperties.forEach((modelProperty) => { + model.imports.push(...modelProperty.imports); + model.enums.push(...modelProperty.enums); + model.properties.push(modelProperty); + if (modelProperty.export === 'enum') { + model.enums.push(modelProperty); } + }); + return model; + } else { + const additionalProperties = getModel(openApi, {}); + model.export = 'dictionary'; + model.type = additionalProperties.type; + model.base = additionalProperties.base; + model.template = additionalProperties.template; + model.link = additionalProperties; + model.imports.push(...additionalProperties.imports); + model.default = getModelDefault(definition, model); + return model; } + } - // If the schema has a type than it can be a basic or generic type. - if (definition.type) { - const definitionType = getType(definition.type, definition.format); - model.export = 'generic'; - model.type = definitionType.type; - model.base = definitionType.base; - model.template = definitionType.template; - model.isNullable = definitionType.isNullable || model.isNullable; - model.imports.push(...definitionType.imports); - model.default = getModelDefault(definition, model); - return model; - } - + // If the schema has a type than it can be a basic or generic type. + if (definition.type) { + const definitionType = getType(definition.type, definition.format); + model.export = 'generic'; + model.type = definitionType.type; + model.base = definitionType.base; + model.template = definitionType.template; + model.isNullable = definitionType.isNullable || model.isNullable; + model.imports.push(...definitionType.imports); + model.default = getModelDefault(definition, model); return model; + } + + return model; }; diff --git a/src/openApi/v3/parser/getModelComposition.ts b/src/openApi/v3/parser/getModelComposition.ts index 2c27d1815..89b9f56b6 100644 --- a/src/openApi/v3/parser/getModelComposition.ts +++ b/src/openApi/v3/parser/getModelComposition.ts @@ -10,82 +10,82 @@ import { getRequiredPropertiesFromComposition } from './getRequiredPropertiesFro export type GetModelFn = typeof getModel; export const getModelComposition = ( - openApi: OpenApi, - definition: OpenApiSchema, - definitions: OpenApiSchema[], - type: 'one-of' | 'any-of' | 'all-of', - getModel: GetModelFn + openApi: OpenApi, + definition: OpenApiSchema, + definitions: OpenApiSchema[], + type: 'one-of' | 'any-of' | 'all-of', + getModel: GetModelFn, ): ModelComposition => { - const composition: ModelComposition = { - type, - imports: [], - enums: [], - properties: [], - }; + const composition: ModelComposition = { + type, + imports: [], + enums: [], + properties: [], + }; - const properties: Model[] = []; + const properties: Model[] = []; - definitions - .map(definition => getModel(openApi, definition)) - .filter(model => { - const hasProperties = model.properties.length; - const hasEnums = model.enums.length; - const isObject = model.type === 'any'; - const isDictionary = model.export === 'dictionary'; - const isEmpty = isObject && !hasProperties && !hasEnums; - return !isEmpty || isDictionary; - }) - .forEach(model => { - composition.imports.push(...model.imports); - composition.enums.push(...model.enums); - composition.properties.push(model); - }); + definitions + .map((definition) => getModel(openApi, definition)) + .filter((model) => { + const hasProperties = model.properties.length; + const hasEnums = model.enums.length; + const isObject = model.type === 'any'; + const isDictionary = model.export === 'dictionary'; + const isEmpty = isObject && !hasProperties && !hasEnums; + return !isEmpty || isDictionary; + }) + .forEach((model) => { + composition.imports.push(...model.imports); + composition.enums.push(...model.enums); + composition.properties.push(model); + }); - if (definition.required) { - const requiredProperties = getRequiredPropertiesFromComposition( - openApi, - definition.required, - definitions, - getModel - ); - requiredProperties.forEach(requiredProperty => { - composition.imports.push(...requiredProperty.imports); - composition.enums.push(...requiredProperty.enums); - }); - properties.push(...requiredProperties); - } + if (definition.required) { + const requiredProperties = getRequiredPropertiesFromComposition( + openApi, + definition.required, + definitions, + getModel, + ); + requiredProperties.forEach((requiredProperty) => { + composition.imports.push(...requiredProperty.imports); + composition.enums.push(...requiredProperty.enums); + }); + properties.push(...requiredProperties); + } - if (definition.properties) { - const modelProperties = getModelProperties(openApi, definition, getModel); - modelProperties.forEach(modelProperty => { - composition.imports.push(...modelProperty.imports); - composition.enums.push(...modelProperty.enums); - if (modelProperty.export === 'enum') { - composition.enums.push(modelProperty); - } - }); - properties.push(...modelProperties); - } + if (definition.properties) { + const modelProperties = getModelProperties(openApi, definition, getModel); + modelProperties.forEach((modelProperty) => { + composition.imports.push(...modelProperty.imports); + composition.enums.push(...modelProperty.enums); + if (modelProperty.export === 'enum') { + composition.enums.push(modelProperty); + } + }); + properties.push(...modelProperties); + } - if (properties.length) { - composition.properties.push({ - name: 'properties', - export: 'interface', - type: 'any', - base: 'any', - template: null, - link: null, - description: '', - isDefinition: false, - isReadOnly: false, - isNullable: false, - isRequired: false, - imports: [], - enum: [], - enums: [], - properties, - }); - } + if (properties.length) { + composition.properties.push({ + name: 'properties', + export: 'interface', + type: 'any', + base: 'any', + template: null, + link: null, + description: '', + isDefinition: false, + isReadOnly: false, + isNullable: false, + isRequired: false, + imports: [], + enum: [], + enums: [], + properties, + }); + } - return composition; + return composition; }; diff --git a/src/openApi/v3/parser/getModelDefault.ts b/src/openApi/v3/parser/getModelDefault.ts index fade1ed7f..a49e0b469 100644 --- a/src/openApi/v3/parser/getModelDefault.ts +++ b/src/openApi/v3/parser/getModelDefault.ts @@ -2,37 +2,37 @@ import type { Model } from '../../../client/interfaces/Model'; import type { OpenApiSchema } from '../interfaces/OpenApiSchema'; export const getModelDefault = (definition: OpenApiSchema, model?: Model): string | undefined => { - if (definition.default === undefined) { - return undefined; - } - if (definition.default === null) { - return 'option.none'; - } + if (definition.default === undefined) { + return undefined; + } + if (definition.default === null) { + return 'option.none'; + } - const type = definition.type || typeof definition.default; + const type = definition.type || typeof definition.default; - switch (type) { - case 'int': - case 'integer': - case 'number': - if (model?.export === 'enum' && model.enum?.[definition.default]) { - return model.enum[definition.default].value; - } - return definition.default; + switch (type) { + case 'int': + case 'integer': + case 'number': + if (model?.export === 'enum' && model.enum?.[definition.default]) { + return model.enum[definition.default].value; + } + return definition.default; - case 'boolean': - return JSON.stringify(definition.default); + case 'boolean': + return JSON.stringify(definition.default); - case 'string': - return `'${definition.default}'`; + case 'string': + return `'${definition.default}'`; - case 'object': - try { - return JSON.stringify(definition.default, null, 4); - } catch (e) { - // Ignore - } - } + case 'object': + try { + return JSON.stringify(definition.default, null, 4); + } catch (e) { + // Ignore + } + } - return undefined; + return undefined; }; diff --git a/src/openApi/v3/parser/getModelProperties.ts b/src/openApi/v3/parser/getModelProperties.ts index 6e25ca833..5a58d68e3 100644 --- a/src/openApi/v3/parser/getModelProperties.ts +++ b/src/openApi/v3/parser/getModelProperties.ts @@ -11,98 +11,89 @@ import { getType } from './getType'; export type GetModelFn = typeof getModel; export const getModelProperties = ( - openApi: OpenApi, - definition: OpenApiSchema, - getModel: GetModelFn, - parent?: Model + openApi: OpenApi, + definition: OpenApiSchema, + getModel: GetModelFn, + parent?: Model, ): Model[] => { - const models: Model[] = []; - const discriminator = findOneOfParentDiscriminator(openApi, parent); - for (const propertyName in definition.properties) { - if (definition.properties.hasOwnProperty(propertyName)) { - const property = definition.properties[propertyName]; - const propertyRequired = !!definition.required?.includes(propertyName); - const propertyValues: Omit< - Model, - | 'export' - | 'type' - | 'base' - | 'template' - | 'link' - | 'isNullable' - | 'imports' - | 'enum' - | 'enums' - | 'properties' - > = { - name: escapeName(propertyName), - description: property.description || null, - deprecated: property.deprecated === true, - isDefinition: false, - isReadOnly: property.readOnly === true, - isRequired: propertyRequired, - format: property.format, - maximum: property.maximum, - exclusiveMaximum: property.exclusiveMaximum, - minimum: property.minimum, - exclusiveMinimum: property.exclusiveMinimum, - multipleOf: property.multipleOf, - maxLength: property.maxLength, - minLength: property.minLength, - maxItems: property.maxItems, - minItems: property.minItems, - uniqueItems: property.uniqueItems, - maxProperties: property.maxProperties, - minProperties: property.minProperties, - pattern: getPattern(property.pattern), - }; - if (parent && discriminator?.propertyName == propertyName) { - models.push({ - export: 'reference', - type: 'string', - base: `'${mapPropertyValue(discriminator, parent)}'`, - template: null, - isNullable: property.nullable === true, - link: null, - imports: [], - enum: [], - enums: [], - properties: [], - ...propertyValues, - }); - } else if (property.$ref) { - const model = getType(property.$ref); - models.push({ - export: 'reference', - type: model.type, - base: model.base, - template: model.template, - link: null, - isNullable: model.isNullable || property.nullable === true, - imports: model.imports, - enum: [], - enums: [], - properties: [], - ...propertyValues, - }); - } else { - const model = getModel(openApi, property); - models.push({ - export: model.export, - type: model.type, - base: model.base, - template: model.template, - link: model.link, - isNullable: model.isNullable || property.nullable === true, - imports: model.imports, - enum: model.enum, - enums: model.enums, - properties: model.properties, - ...propertyValues, - }); - } - } + const models: Model[] = []; + const discriminator = findOneOfParentDiscriminator(openApi, parent); + for (const propertyName in definition.properties) { + if (definition.properties.hasOwnProperty(propertyName)) { + const property = definition.properties[propertyName]; + const propertyRequired = !!definition.required?.includes(propertyName); + const propertyValues: Omit< + Model, + 'export' | 'type' | 'base' | 'template' | 'link' | 'isNullable' | 'imports' | 'enum' | 'enums' | 'properties' + > = { + name: escapeName(propertyName), + description: property.description || null, + deprecated: property.deprecated === true, + isDefinition: false, + isReadOnly: property.readOnly === true, + isRequired: propertyRequired, + format: property.format, + maximum: property.maximum, + exclusiveMaximum: property.exclusiveMaximum, + minimum: property.minimum, + exclusiveMinimum: property.exclusiveMinimum, + multipleOf: property.multipleOf, + maxLength: property.maxLength, + minLength: property.minLength, + maxItems: property.maxItems, + minItems: property.minItems, + uniqueItems: property.uniqueItems, + maxProperties: property.maxProperties, + minProperties: property.minProperties, + pattern: getPattern(property.pattern), + }; + if (parent && discriminator?.propertyName == propertyName) { + models.push({ + export: 'reference', + type: 'string', + base: `'${mapPropertyValue(discriminator, parent)}'`, + template: null, + isNullable: property.nullable === true, + link: null, + imports: [], + enum: [], + enums: [], + properties: [], + ...propertyValues, + }); + } else if (property.$ref) { + const model = getType(property.$ref); + models.push({ + export: 'reference', + type: model.type, + base: model.base, + template: model.template, + link: null, + isNullable: model.isNullable || property.nullable === true, + imports: model.imports, + enum: [], + enums: [], + properties: [], + ...propertyValues, + }); + } else { + const model = getModel(openApi, property); + models.push({ + export: model.export, + type: model.type, + base: model.base, + template: model.template, + link: model.link, + isNullable: model.isNullable || property.nullable === true, + imports: model.imports, + enum: model.enum, + enums: model.enums, + properties: model.properties, + ...propertyValues, + }); + } } + } - return models; + return models; }; diff --git a/src/openApi/v3/parser/getModelTemplate.spec.ts b/src/openApi/v3/parser/getModelTemplate.spec.ts index 09c920a4d..db8ea2191 100644 --- a/src/openApi/v3/parser/getModelTemplate.spec.ts +++ b/src/openApi/v3/parser/getModelTemplate.spec.ts @@ -1,25 +1,25 @@ import { getModelTemplate } from './getModelTemplate'; describe('getModelTemplate', () => { - it('should return generic for template type', () => { - const template = getModelTemplate({ - type: 'Link', - base: 'Link', - template: 'Model', - imports: ['Model'], - isNullable: false, - }); - expect(template).toEqual(''); + it('should return generic for template type', () => { + const template = getModelTemplate({ + type: 'Link', + base: 'Link', + template: 'Model', + imports: ['Model'], + isNullable: false, }); + expect(template).toEqual(''); + }); - it('should return empty for primary type', () => { - const template = getModelTemplate({ - type: 'string', - base: 'string', - template: null, - imports: [], - isNullable: false, - }); - expect(template).toEqual(''); + it('should return empty for primary type', () => { + const template = getModelTemplate({ + type: 'string', + base: 'string', + template: null, + imports: [], + isNullable: false, }); + expect(template).toEqual(''); + }); }); diff --git a/src/openApi/v3/parser/getModelTemplate.ts b/src/openApi/v3/parser/getModelTemplate.ts index b2aa0b33a..fa41b5ff8 100644 --- a/src/openApi/v3/parser/getModelTemplate.ts +++ b/src/openApi/v3/parser/getModelTemplate.ts @@ -7,5 +7,5 @@ import type { Type } from '../../../client/interfaces/Type'; * @returns The model template type ( or empty). */ export const getModelTemplate = (modelClass: Type): string => { - return modelClass.template ? '' : ''; + return modelClass.template ? '' : ''; }; diff --git a/src/openApi/v3/parser/getModels.ts b/src/openApi/v3/parser/getModels.ts index 6df7cf1e5..82534fc7b 100644 --- a/src/openApi/v3/parser/getModels.ts +++ b/src/openApi/v3/parser/getModels.ts @@ -5,29 +5,29 @@ import { getModel } from './getModel'; import { getType } from './getType'; export const getModels = (openApi: OpenApi): Model[] => { - const models: Model[] = []; - if (openApi.components) { - for (const definitionName in openApi.components.schemas) { - if (openApi.components.schemas.hasOwnProperty(definitionName)) { - const definition = openApi.components.schemas[definitionName]; - const definitionType = getType(definitionName); - const model = getModel(openApi, definition, true, definitionType.base.replace(reservedWords, '_$1')); - models.push(model); - } - } - for (const definitionName in openApi.components.parameters) { - if (openApi.components.parameters.hasOwnProperty(definitionName)) { - const definition = openApi.components.parameters[definitionName]; - const definitionType = getType(definitionName); - const schema = definition.schema; - if (schema) { - const model = getModel(openApi, schema, true, definitionType.base.replace(reservedWords, '_$1')); - model.description = definition.description || null; - model.deprecated = definition.deprecated; - models.push(model); - } - } + const models: Model[] = []; + if (openApi.components) { + for (const definitionName in openApi.components.schemas) { + if (openApi.components.schemas.hasOwnProperty(definitionName)) { + const definition = openApi.components.schemas[definitionName]; + const definitionType = getType(definitionName); + const model = getModel(openApi, definition, true, definitionType.base.replace(reservedWords, '_$1')); + models.push(model); + } + } + for (const definitionName in openApi.components.parameters) { + if (openApi.components.parameters.hasOwnProperty(definitionName)) { + const definition = openApi.components.parameters[definitionName]; + const definitionType = getType(definitionName); + const schema = definition.schema; + if (schema) { + const model = getModel(openApi, schema, true, definitionType.base.replace(reservedWords, '_$1')); + model.description = definition.description || null; + model.deprecated = definition.deprecated; + models.push(model); } + } } - return models; + } + return models; }; diff --git a/src/openApi/v3/parser/getOperation.ts b/src/openApi/v3/parser/getOperation.ts index 96c84770a..d701dc0a6 100644 --- a/src/openApi/v3/parser/getOperation.ts +++ b/src/openApi/v3/parser/getOperation.ts @@ -15,83 +15,83 @@ import { getServiceName } from './getServiceName'; import { sortByRequired } from './sortByRequired'; export const getOperation = ( - openApi: OpenApi, - url: string, - method: string, - tag: string, - op: OpenApiOperation, - pathParams: OperationParameters + openApi: OpenApi, + url: string, + method: string, + tag: string, + op: OpenApiOperation, + pathParams: OperationParameters, ): Operation => { - const serviceName = getServiceName(tag); - const operationName = getOperationName(url, method, op.operationId); + const serviceName = getServiceName(tag); + const operationName = getOperationName(url, method, op.operationId); - // Create a new operation object for this method. - const operation: Operation = { - service: serviceName, - name: operationName, - summary: op.summary || null, - description: op.description || null, - deprecated: op.deprecated === true, - method: method.toUpperCase(), - path: url, - parameters: [...pathParams.parameters], - parametersPath: [...pathParams.parametersPath], - parametersQuery: [...pathParams.parametersQuery], - parametersForm: [...pathParams.parametersForm], - parametersHeader: [...pathParams.parametersHeader], - parametersCookie: [...pathParams.parametersCookie], - parametersBody: pathParams.parametersBody, - imports: [], - errors: [], - results: [], - responseHeader: null, - }; + // Create a new operation object for this method. + const operation: Operation = { + service: serviceName, + name: operationName, + summary: op.summary || null, + description: op.description || null, + deprecated: op.deprecated === true, + method: method.toUpperCase(), + path: url, + parameters: [...pathParams.parameters], + parametersPath: [...pathParams.parametersPath], + parametersQuery: [...pathParams.parametersQuery], + parametersForm: [...pathParams.parametersForm], + parametersHeader: [...pathParams.parametersHeader], + parametersCookie: [...pathParams.parametersCookie], + parametersBody: pathParams.parametersBody, + imports: [], + errors: [], + results: [], + responseHeader: null, + }; - // Parse the operation parameters (path, query, body, etc). - if (op.parameters) { - const parameters = getOperationParameters(openApi, op.parameters); - operation.imports.push(...parameters.imports); - operation.parameters.push(...parameters.parameters); - operation.parametersPath.push(...parameters.parametersPath); - operation.parametersQuery.push(...parameters.parametersQuery); - operation.parametersForm.push(...parameters.parametersForm); - operation.parametersHeader.push(...parameters.parametersHeader); - operation.parametersCookie.push(...parameters.parametersCookie); - operation.parametersBody = parameters.parametersBody; - } + // Parse the operation parameters (path, query, body, etc). + if (op.parameters) { + const parameters = getOperationParameters(openApi, op.parameters); + operation.imports.push(...parameters.imports); + operation.parameters.push(...parameters.parameters); + operation.parametersPath.push(...parameters.parametersPath); + operation.parametersQuery.push(...parameters.parametersQuery); + operation.parametersForm.push(...parameters.parametersForm); + operation.parametersHeader.push(...parameters.parametersHeader); + operation.parametersCookie.push(...parameters.parametersCookie); + operation.parametersBody = parameters.parametersBody; + } - if (op.requestBody) { - const requestBodyDef = getRef(openApi, op.requestBody); - const requestBody = getOperationRequestBody(openApi, requestBodyDef); - operation.imports.push(...requestBody.imports); - operation.parameters.push(requestBody); - operation.parametersBody = requestBody; - } + if (op.requestBody) { + const requestBodyDef = getRef(openApi, op.requestBody); + const requestBody = getOperationRequestBody(openApi, requestBodyDef); + operation.imports.push(...requestBody.imports); + operation.parameters.push(requestBody); + operation.parametersBody = requestBody; + } - // Parse the operation responses. - if (op.responses) { - const operationResponses = getOperationResponses(openApi, op.responses); - const operationResults = getOperationResults(operationResponses); - operation.errors = getOperationErrors(operationResponses); - operation.responseHeader = getOperationResponseHeader(operationResults); + // Parse the operation responses. + if (op.responses) { + const operationResponses = getOperationResponses(openApi, op.responses); + const operationResults = getOperationResults(operationResponses); + operation.errors = getOperationErrors(operationResponses); + operation.responseHeader = getOperationResponseHeader(operationResults); - const types = { - 'application/json': 1, - 'x-www-form-urlencoded': 2, - 'application/xml': 3, - } as const; + const types = { + 'application/json': 1, + 'x-www-form-urlencoded': 2, + 'application/xml': 3, + } as const; - operationResults - .sort((a, b) => (types[a.type as keyof typeof types] ?? 4) - (types[b.type as keyof typeof types] ?? 4)) - .filter(($, i1, arr) => arr.filter(({ code }, i2) => i1 > i2 && code === $.code).length === 0) - .sort((a, b) => a.code - b.code) - .forEach(operationResult => { - operation.results.push(operationResult); - operation.imports.push(...operationResult.imports); - }); - } + operationResults + .sort((a, b) => (types[a.type as keyof typeof types] ?? 4) - (types[b.type as keyof typeof types] ?? 4)) + .filter(($, i1, arr) => arr.filter(({ code }, i2) => i1 > i2 && code === $.code).length === 0) + .sort((a, b) => a.code - b.code) + .forEach((operationResult) => { + operation.results.push(operationResult); + operation.imports.push(...operationResult.imports); + }); + } - operation.parameters = operation.parameters.sort(sortByRequired); + operation.parameters = operation.parameters.sort(sortByRequired); - return operation; + return operation; }; diff --git a/src/openApi/v3/parser/getOperationErrors.ts b/src/openApi/v3/parser/getOperationErrors.ts index e7624adb5..2b9cb5996 100644 --- a/src/openApi/v3/parser/getOperationErrors.ts +++ b/src/openApi/v3/parser/getOperationErrors.ts @@ -2,12 +2,12 @@ import type { OperationError } from '../../../client/interfaces/OperationError'; import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; export const getOperationErrors = (operationResponses: OperationResponse[]): OperationError[] => { - return operationResponses - .filter(operationResponse => { - return operationResponse.code >= 300 && operationResponse.description; - }) - .map(response => ({ - code: response.code, - description: response.description!, - })); + return operationResponses + .filter((operationResponse) => { + return operationResponse.code >= 300 && operationResponse.description; + }) + .map((response) => ({ + code: response.code, + description: response.description!, + })); }; diff --git a/src/openApi/v3/parser/getOperationName.spec.ts b/src/openApi/v3/parser/getOperationName.spec.ts index bdaecb8f8..0c5348bbd 100644 --- a/src/openApi/v3/parser/getOperationName.spec.ts +++ b/src/openApi/v3/parser/getOperationName.spec.ts @@ -1,27 +1,27 @@ import { getOperationName } from './getOperationName'; describe('getOperationName', () => { - it('should produce correct result', () => { - expect(getOperationName('/api/v{api-version}/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); - expect(getOperationName('/api/v{api-version}/users', 'GET', undefined)).toEqual('getApiUsers'); - expect(getOperationName('/api/v{api-version}/users', 'POST', undefined)).toEqual('postApiUsers'); - expect(getOperationName('/api/v1/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); - expect(getOperationName('/api/v1/users', 'GET', undefined)).toEqual('getApiV1Users'); - expect(getOperationName('/api/v1/users', 'POST', undefined)).toEqual('postApiV1Users'); - expect(getOperationName('/api/v1/users/{id}', 'GET', undefined)).toEqual('getApiV1Users'); - expect(getOperationName('/api/v1/users/{id}', 'POST', undefined)).toEqual('postApiV1Users'); + it('should produce correct result', () => { + expect(getOperationName('/api/v{api-version}/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); + expect(getOperationName('/api/v{api-version}/users', 'GET', undefined)).toEqual('getApiUsers'); + expect(getOperationName('/api/v{api-version}/users', 'POST', undefined)).toEqual('postApiUsers'); + expect(getOperationName('/api/v1/users', 'GET', 'GetAllUsers')).toEqual('getAllUsers'); + expect(getOperationName('/api/v1/users', 'GET', undefined)).toEqual('getApiV1Users'); + expect(getOperationName('/api/v1/users', 'POST', undefined)).toEqual('postApiV1Users'); + expect(getOperationName('/api/v1/users/{id}', 'GET', undefined)).toEqual('getApiV1Users'); + expect(getOperationName('/api/v1/users/{id}', 'POST', undefined)).toEqual('postApiV1Users'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'FooBar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'Foo Bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo-bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo_bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '@foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '$foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar'); - expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar'); - }); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'FooBar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'Foo Bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo-bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo_bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '@foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '$foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar'); + }); }); diff --git a/src/openApi/v3/parser/getOperationName.ts b/src/openApi/v3/parser/getOperationName.ts index 124bf66bd..c4c4ded27 100644 --- a/src/openApi/v3/parser/getOperationName.ts +++ b/src/openApi/v3/parser/getOperationName.ts @@ -6,19 +6,19 @@ import camelCase from 'camelcase'; * on a generated name from the URL */ export const getOperationName = (url: string, method: string, operationId?: string): string => { - if (operationId) { - return camelCase( - operationId - .replace(/^[^a-zA-Z]+/g, '') - .replace(/[^\w\-]+/g, '-') - .trim() - ); - } + if (operationId) { + return camelCase( + operationId + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim(), + ); + } - const urlWithoutPlaceholders = url - .replace(/[^/]*?{api-version}.*?\//g, '') - .replace(/{(.*?)}/g, '') - .replace(/\//g, '-'); + const urlWithoutPlaceholders = url + .replace(/[^/]*?{api-version}.*?\//g, '') + .replace(/{(.*?)}/g, '') + .replace(/\//g, '-'); - return camelCase(`${method}-${urlWithoutPlaceholders}`); + return camelCase(`${method}-${urlWithoutPlaceholders}`); }; diff --git a/src/openApi/v3/parser/getOperationParameter.ts b/src/openApi/v3/parser/getOperationParameter.ts index 97a719c96..17c947d35 100644 --- a/src/openApi/v3/parser/getOperationParameter.ts +++ b/src/openApi/v3/parser/getOperationParameter.ts @@ -10,84 +10,84 @@ import { getRef } from './getRef'; import { getType } from './getType'; export const getOperationParameter = (openApi: OpenApi, parameter: OpenApiParameter): OperationParameter => { - const operationParameter: OperationParameter = { - in: parameter.in, - prop: parameter.name, - export: 'interface', - name: getOperationParameterName(parameter.name), - type: 'any', - base: 'any', - template: null, - link: null, - description: parameter.description || null, - deprecated: parameter.deprecated === true, - isDefinition: false, - isReadOnly: false, - isRequired: parameter.required === true, - isNullable: parameter.nullable === true, - imports: [], - enum: [], - enums: [], - properties: [], - mediaType: null, - }; + const operationParameter: OperationParameter = { + in: parameter.in, + prop: parameter.name, + export: 'interface', + name: getOperationParameterName(parameter.name), + type: 'any', + base: 'any', + template: null, + link: null, + description: parameter.description || null, + deprecated: parameter.deprecated === true, + isDefinition: false, + isReadOnly: false, + isRequired: parameter.required === true, + isNullable: parameter.nullable === true, + imports: [], + enum: [], + enums: [], + properties: [], + mediaType: null, + }; - if (parameter.$ref) { - const definitionRef = getType(parameter.$ref); - operationParameter.export = 'reference'; - operationParameter.type = definitionRef.type; - operationParameter.base = definitionRef.base; - operationParameter.template = definitionRef.template; - operationParameter.imports.push(...definitionRef.imports); - return operationParameter; - } + if (parameter.$ref) { + const definitionRef = getType(parameter.$ref); + operationParameter.export = 'reference'; + operationParameter.type = definitionRef.type; + operationParameter.base = definitionRef.base; + operationParameter.template = definitionRef.template; + operationParameter.imports.push(...definitionRef.imports); + return operationParameter; + } - let schema = parameter.schema; - if (schema) { - if (schema.$ref?.startsWith('#/components/parameters/')) { - schema = getRef(openApi, schema); - } - if (schema.$ref) { - const model = getType(schema.$ref); - operationParameter.export = 'reference'; - operationParameter.type = model.type; - operationParameter.base = model.base; - operationParameter.template = model.template; - operationParameter.imports.push(...model.imports); - operationParameter.default = getModelDefault(schema); - return operationParameter; - } else { - const model = getModel(openApi, schema); - operationParameter.export = model.export; - operationParameter.type = model.type; - operationParameter.base = model.base; - operationParameter.template = model.template; - operationParameter.link = model.link; - operationParameter.isReadOnly = model.isReadOnly; - operationParameter.isRequired = operationParameter.isRequired || model.isRequired; - operationParameter.isNullable = operationParameter.isNullable || model.isNullable; - operationParameter.format = model.format; - operationParameter.maximum = model.maximum; - operationParameter.exclusiveMaximum = model.exclusiveMaximum; - operationParameter.minimum = model.minimum; - operationParameter.exclusiveMinimum = model.exclusiveMinimum; - operationParameter.multipleOf = model.multipleOf; - operationParameter.maxLength = model.maxLength; - operationParameter.minLength = model.minLength; - operationParameter.maxItems = model.maxItems; - operationParameter.minItems = model.minItems; - operationParameter.uniqueItems = model.uniqueItems; - operationParameter.maxProperties = model.maxProperties; - operationParameter.minProperties = model.minProperties; - operationParameter.pattern = getPattern(model.pattern); - operationParameter.default = model.default; - operationParameter.imports.push(...model.imports); - operationParameter.enum.push(...model.enum); - operationParameter.enums.push(...model.enums); - operationParameter.properties.push(...model.properties); - return operationParameter; - } + let schema = parameter.schema; + if (schema) { + if (schema.$ref?.startsWith('#/components/parameters/')) { + schema = getRef(openApi, schema); } + if (schema.$ref) { + const model = getType(schema.$ref); + operationParameter.export = 'reference'; + operationParameter.type = model.type; + operationParameter.base = model.base; + operationParameter.template = model.template; + operationParameter.imports.push(...model.imports); + operationParameter.default = getModelDefault(schema); + return operationParameter; + } else { + const model = getModel(openApi, schema); + operationParameter.export = model.export; + operationParameter.type = model.type; + operationParameter.base = model.base; + operationParameter.template = model.template; + operationParameter.link = model.link; + operationParameter.isReadOnly = model.isReadOnly; + operationParameter.isRequired = operationParameter.isRequired || model.isRequired; + operationParameter.isNullable = operationParameter.isNullable || model.isNullable; + operationParameter.format = model.format; + operationParameter.maximum = model.maximum; + operationParameter.exclusiveMaximum = model.exclusiveMaximum; + operationParameter.minimum = model.minimum; + operationParameter.exclusiveMinimum = model.exclusiveMinimum; + operationParameter.multipleOf = model.multipleOf; + operationParameter.maxLength = model.maxLength; + operationParameter.minLength = model.minLength; + operationParameter.maxItems = model.maxItems; + operationParameter.minItems = model.minItems; + operationParameter.uniqueItems = model.uniqueItems; + operationParameter.maxProperties = model.maxProperties; + operationParameter.minProperties = model.minProperties; + operationParameter.pattern = getPattern(model.pattern); + operationParameter.default = model.default; + operationParameter.imports.push(...model.imports); + operationParameter.enum.push(...model.enum); + operationParameter.enums.push(...model.enums); + operationParameter.properties.push(...model.properties); + return operationParameter; + } + } - return operationParameter; + return operationParameter; }; diff --git a/src/openApi/v3/parser/getOperationParameterName.spec.ts b/src/openApi/v3/parser/getOperationParameterName.spec.ts index 070749597..c53457426 100644 --- a/src/openApi/v3/parser/getOperationParameterName.spec.ts +++ b/src/openApi/v3/parser/getOperationParameterName.spec.ts @@ -1,19 +1,19 @@ import { getOperationParameterName } from './getOperationParameterName'; describe('getOperationParameterName', () => { - it('should produce correct result', () => { - expect(getOperationParameterName('')).toEqual(''); - expect(getOperationParameterName('foobar')).toEqual('foobar'); - expect(getOperationParameterName('fooBar')).toEqual('fooBar'); - expect(getOperationParameterName('foo_bar')).toEqual('fooBar'); - expect(getOperationParameterName('foo-bar')).toEqual('fooBar'); - expect(getOperationParameterName('foo.bar')).toEqual('fooBar'); - expect(getOperationParameterName('@foo.bar')).toEqual('fooBar'); - expect(getOperationParameterName('$foo.bar')).toEqual('fooBar'); - expect(getOperationParameterName('123.foo.bar')).toEqual('fooBar'); - expect(getOperationParameterName('Foo-Bar')).toEqual('fooBar'); - expect(getOperationParameterName('FOO-BAR')).toEqual('fooBar'); - expect(getOperationParameterName('foo[bar]')).toEqual('fooBar'); - expect(getOperationParameterName('foo.bar[]')).toEqual('fooBarArray'); - }); + it('should produce correct result', () => { + expect(getOperationParameterName('')).toEqual(''); + expect(getOperationParameterName('foobar')).toEqual('foobar'); + expect(getOperationParameterName('fooBar')).toEqual('fooBar'); + expect(getOperationParameterName('foo_bar')).toEqual('fooBar'); + expect(getOperationParameterName('foo-bar')).toEqual('fooBar'); + expect(getOperationParameterName('foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('@foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('$foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('123.foo.bar')).toEqual('fooBar'); + expect(getOperationParameterName('Foo-Bar')).toEqual('fooBar'); + expect(getOperationParameterName('FOO-BAR')).toEqual('fooBar'); + expect(getOperationParameterName('foo[bar]')).toEqual('fooBar'); + expect(getOperationParameterName('foo.bar[]')).toEqual('fooBarArray'); + }); }); diff --git a/src/openApi/v3/parser/getOperationParameterName.ts b/src/openApi/v3/parser/getOperationParameterName.ts index a3caa291c..56b0a9b90 100644 --- a/src/openApi/v3/parser/getOperationParameterName.ts +++ b/src/openApi/v3/parser/getOperationParameterName.ts @@ -7,10 +7,10 @@ import { reservedWords } from '../../../utils/reservedWords'; * For example: 'filter.someProperty' becomes 'filterSomeProperty'. */ export const getOperationParameterName = (value: string): string => { - const clean = value - .replace(/^[^a-zA-Z]+/g, '') - .replace('[]', 'Array') - .replace(/[^\w\-]+/g, '-') - .trim(); - return camelCase(clean).replace(reservedWords, '_$1'); + const clean = value + .replace(/^[^a-zA-Z]+/g, '') + .replace('[]', 'Array') + .replace(/[^\w\-]+/g, '-') + .trim(); + return camelCase(clean).replace(reservedWords, '_$1'); }; diff --git a/src/openApi/v3/parser/getOperationParameters.ts b/src/openApi/v3/parser/getOperationParameters.ts index 051b4a0a9..cc54683b3 100644 --- a/src/openApi/v3/parser/getOperationParameters.ts +++ b/src/openApi/v3/parser/getOperationParameters.ts @@ -5,57 +5,57 @@ import { getOperationParameter } from './getOperationParameter'; import { getRef } from './getRef'; export const getOperationParameters = (openApi: OpenApi, parameters: OpenApiParameter[]): OperationParameters => { - const operationParameters: OperationParameters = { - imports: [], - parameters: [], - parametersPath: [], - parametersQuery: [], - parametersForm: [], - parametersCookie: [], - parametersHeader: [], - parametersBody: null, // Not used in V3 -> @see requestBody - }; + const operationParameters: OperationParameters = { + imports: [], + parameters: [], + parametersPath: [], + parametersQuery: [], + parametersForm: [], + parametersCookie: [], + parametersHeader: [], + parametersBody: null, // Not used in V3 -> @see requestBody + }; - // Iterate over the parameters - parameters.forEach(parameterOrReference => { - const parameterDef = getRef(openApi, parameterOrReference); - const parameter = getOperationParameter(openApi, parameterDef); + // Iterate over the parameters + parameters.forEach((parameterOrReference) => { + const parameterDef = getRef(openApi, parameterOrReference); + const parameter = getOperationParameter(openApi, parameterDef); - // We ignore the "api-version" param, since we do not want to add this - // as the first / default parameter for each of the service calls. - if (parameter.prop !== 'api-version') { - switch (parameterDef.in) { - case 'path': - operationParameters.parametersPath.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; + // We ignore the "api-version" param, since we do not want to add this + // as the first / default parameter for each of the service calls. + if (parameter.prop !== 'api-version') { + switch (parameterDef.in) { + case 'path': + operationParameters.parametersPath.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; - case 'query': - operationParameters.parametersQuery.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; + case 'query': + operationParameters.parametersQuery.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; - case 'formData': - operationParameters.parametersForm.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; + case 'formData': + operationParameters.parametersForm.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; - case 'cookie': - operationParameters.parametersCookie.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; + case 'cookie': + operationParameters.parametersCookie.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; - case 'header': - operationParameters.parametersHeader.push(parameter); - operationParameters.parameters.push(parameter); - operationParameters.imports.push(...parameter.imports); - break; - } - } - }); - return operationParameters; + case 'header': + operationParameters.parametersHeader.push(parameter); + operationParameters.parameters.push(parameter); + operationParameters.imports.push(...parameter.imports); + break; + } + } + }); + return operationParameters; }; diff --git a/src/openApi/v3/parser/getOperationRequestBody.ts b/src/openApi/v3/parser/getOperationRequestBody.ts index 9f9cca241..bb6f93042 100644 --- a/src/openApi/v3/parser/getOperationRequestBody.ts +++ b/src/openApi/v3/parser/getOperationRequestBody.ts @@ -7,80 +7,80 @@ import { getModel } from './getModel'; import { getType } from './getType'; export const getOperationRequestBody = (openApi: OpenApi, body: OpenApiRequestBody): OperationParameter => { - const requestBody: OperationParameter = { - in: 'body', - export: 'interface', - prop: 'requestBody', - name: 'requestBody', - type: 'any', - base: 'any', - template: null, - link: null, - description: body.description || null, - default: undefined, - isDefinition: false, - isReadOnly: false, - isRequired: body.required === true, - isNullable: body.nullable === true, - imports: [], - enum: [], - enums: [], - properties: [], - mediaType: null, - }; + const requestBody: OperationParameter = { + in: 'body', + export: 'interface', + prop: 'requestBody', + name: 'requestBody', + type: 'any', + base: 'any', + template: null, + link: null, + description: body.description || null, + default: undefined, + isDefinition: false, + isReadOnly: false, + isRequired: body.required === true, + isNullable: body.nullable === true, + imports: [], + enum: [], + enums: [], + properties: [], + mediaType: null, + }; - if (body.content) { - const content = getContent(openApi, body.content); - if (content) { - requestBody.mediaType = content.mediaType; - switch (requestBody.mediaType) { - case 'application/x-www-form-urlencoded': - case 'multipart/form-data': - requestBody.in = 'formData'; - requestBody.name = 'formData'; - requestBody.prop = 'formData'; - break; - } - if (content.schema.$ref) { - const model = getType(content.schema.$ref); - requestBody.export = 'reference'; - requestBody.type = model.type; - requestBody.base = model.base; - requestBody.template = model.template; - requestBody.imports.push(...model.imports); - return requestBody; - } else { - const model = getModel(openApi, content.schema); - requestBody.export = model.export; - requestBody.type = model.type; - requestBody.base = model.base; - requestBody.template = model.template; - requestBody.link = model.link; - requestBody.isReadOnly = model.isReadOnly; - requestBody.isRequired = requestBody.isRequired || model.isRequired; - requestBody.isNullable = requestBody.isNullable || model.isNullable; - requestBody.format = model.format; - requestBody.maximum = model.maximum; - requestBody.exclusiveMaximum = model.exclusiveMaximum; - requestBody.minimum = model.minimum; - requestBody.exclusiveMinimum = model.exclusiveMinimum; - requestBody.multipleOf = model.multipleOf; - requestBody.maxLength = model.maxLength; - requestBody.minLength = model.minLength; - requestBody.maxItems = model.maxItems; - requestBody.minItems = model.minItems; - requestBody.uniqueItems = model.uniqueItems; - requestBody.maxProperties = model.maxProperties; - requestBody.minProperties = model.minProperties; - requestBody.pattern = getPattern(model.pattern); - requestBody.imports.push(...model.imports); - requestBody.enum.push(...model.enum); - requestBody.enums.push(...model.enums); - requestBody.properties.push(...model.properties); - return requestBody; - } - } + if (body.content) { + const content = getContent(openApi, body.content); + if (content) { + requestBody.mediaType = content.mediaType; + switch (requestBody.mediaType) { + case 'application/x-www-form-urlencoded': + case 'multipart/form-data': + requestBody.in = 'formData'; + requestBody.name = 'formData'; + requestBody.prop = 'formData'; + break; + } + if (content.schema.$ref) { + const model = getType(content.schema.$ref); + requestBody.export = 'reference'; + requestBody.type = model.type; + requestBody.base = model.base; + requestBody.template = model.template; + requestBody.imports.push(...model.imports); + return requestBody; + } else { + const model = getModel(openApi, content.schema); + requestBody.export = model.export; + requestBody.type = model.type; + requestBody.base = model.base; + requestBody.template = model.template; + requestBody.link = model.link; + requestBody.isReadOnly = model.isReadOnly; + requestBody.isRequired = requestBody.isRequired || model.isRequired; + requestBody.isNullable = requestBody.isNullable || model.isNullable; + requestBody.format = model.format; + requestBody.maximum = model.maximum; + requestBody.exclusiveMaximum = model.exclusiveMaximum; + requestBody.minimum = model.minimum; + requestBody.exclusiveMinimum = model.exclusiveMinimum; + requestBody.multipleOf = model.multipleOf; + requestBody.maxLength = model.maxLength; + requestBody.minLength = model.minLength; + requestBody.maxItems = model.maxItems; + requestBody.minItems = model.minItems; + requestBody.uniqueItems = model.uniqueItems; + requestBody.maxProperties = model.maxProperties; + requestBody.minProperties = model.minProperties; + requestBody.pattern = getPattern(model.pattern); + requestBody.imports.push(...model.imports); + requestBody.enum.push(...model.enum); + requestBody.enums.push(...model.enums); + requestBody.properties.push(...model.properties); + return requestBody; + } } + } - return requestBody; + return requestBody; }; diff --git a/src/openApi/v3/parser/getOperationResponse.ts b/src/openApi/v3/parser/getOperationResponse.ts index dff19ec13..afac29937 100644 --- a/src/openApi/v3/parser/getOperationResponse.ts +++ b/src/openApi/v3/parser/getOperationResponse.ts @@ -9,90 +9,90 @@ import { getRef } from './getRef'; import { getType } from './getType'; export const getOperationResponse = ( - openApi: OpenApi, - response: OpenApiResponse, - responseCode: number + openApi: OpenApi, + response: OpenApiResponse, + responseCode: number, ): OperationResponse => { - const operationResponse: OperationResponse = { - in: 'response', - name: '', - code: responseCode, - description: response.description || null, - export: 'generic', - type: 'any', - base: 'any', - template: null, - link: null, - isDefinition: false, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }; + const operationResponse: OperationResponse = { + in: 'response', + name: '', + code: responseCode, + description: response.description || null, + export: 'generic', + type: 'any', + base: 'any', + template: null, + link: null, + isDefinition: false, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; - if (response.content) { - const content = getContent(openApi, response.content); - if (content) { - if (content.schema.$ref?.startsWith('#/components/responses/')) { - content.schema = getRef(openApi, content.schema); - } - if (content.schema.$ref) { - const model = getType(content.schema.$ref); - operationResponse.export = 'reference'; - operationResponse.type = model.type; - operationResponse.base = model.base; - operationResponse.template = model.template; - operationResponse.imports.push(...model.imports); - return operationResponse; - } else { - const model = getModel(openApi, content.schema); - operationResponse.export = model.export; - operationResponse.type = model.type; - operationResponse.base = model.base; - operationResponse.template = model.template; - operationResponse.link = model.link; - operationResponse.isReadOnly = model.isReadOnly; - operationResponse.isRequired = model.isRequired; - operationResponse.isNullable = model.isNullable; - operationResponse.format = model.format; - operationResponse.maximum = model.maximum; - operationResponse.exclusiveMaximum = model.exclusiveMaximum; - operationResponse.minimum = model.minimum; - operationResponse.exclusiveMinimum = model.exclusiveMinimum; - operationResponse.multipleOf = model.multipleOf; - operationResponse.maxLength = model.maxLength; - operationResponse.minLength = model.minLength; - operationResponse.maxItems = model.maxItems; - operationResponse.minItems = model.minItems; - operationResponse.uniqueItems = model.uniqueItems; - operationResponse.maxProperties = model.maxProperties; - operationResponse.minProperties = model.minProperties; - operationResponse.pattern = getPattern(model.pattern); - operationResponse.imports.push(...model.imports); - operationResponse.enum.push(...model.enum); - operationResponse.enums.push(...model.enums); - operationResponse.properties.push(...model.properties); - return operationResponse; - } - } + if (response.content) { + const content = getContent(openApi, response.content); + if (content) { + if (content.schema.$ref?.startsWith('#/components/responses/')) { + content.schema = getRef(openApi, content.schema); + } + if (content.schema.$ref) { + const model = getType(content.schema.$ref); + operationResponse.export = 'reference'; + operationResponse.type = model.type; + operationResponse.base = model.base; + operationResponse.template = model.template; + operationResponse.imports.push(...model.imports); + return operationResponse; + } else { + const model = getModel(openApi, content.schema); + operationResponse.export = model.export; + operationResponse.type = model.type; + operationResponse.base = model.base; + operationResponse.template = model.template; + operationResponse.link = model.link; + operationResponse.isReadOnly = model.isReadOnly; + operationResponse.isRequired = model.isRequired; + operationResponse.isNullable = model.isNullable; + operationResponse.format = model.format; + operationResponse.maximum = model.maximum; + operationResponse.exclusiveMaximum = model.exclusiveMaximum; + operationResponse.minimum = model.minimum; + operationResponse.exclusiveMinimum = model.exclusiveMinimum; + operationResponse.multipleOf = model.multipleOf; + operationResponse.maxLength = model.maxLength; + operationResponse.minLength = model.minLength; + operationResponse.maxItems = model.maxItems; + operationResponse.minItems = model.minItems; + operationResponse.uniqueItems = model.uniqueItems; + operationResponse.maxProperties = model.maxProperties; + operationResponse.minProperties = model.minProperties; + operationResponse.pattern = getPattern(model.pattern); + operationResponse.imports.push(...model.imports); + operationResponse.enum.push(...model.enum); + operationResponse.enums.push(...model.enums); + operationResponse.properties.push(...model.properties); + return operationResponse; + } } + } - // We support basic properties from response headers, since both - // fetch and XHR client just support string types. - if (response.headers) { - for (const name in response.headers) { - if (response.headers.hasOwnProperty(name)) { - operationResponse.in = 'header'; - operationResponse.name = name; - operationResponse.type = 'string'; - operationResponse.base = 'string'; - return operationResponse; - } - } + // We support basic properties from response headers, since both + // fetch and XHR client just support string types. + if (response.headers) { + for (const name in response.headers) { + if (response.headers.hasOwnProperty(name)) { + operationResponse.in = 'header'; + operationResponse.name = name; + operationResponse.type = 'string'; + operationResponse.base = 'string'; + return operationResponse; + } } + } - return operationResponse; + return operationResponse; }; diff --git a/src/openApi/v3/parser/getOperationResponseCode.spec.ts b/src/openApi/v3/parser/getOperationResponseCode.spec.ts index 24e8da39f..9c76cf499 100644 --- a/src/openApi/v3/parser/getOperationResponseCode.spec.ts +++ b/src/openApi/v3/parser/getOperationResponseCode.spec.ts @@ -1,13 +1,13 @@ import { getOperationResponseCode } from './getOperationResponseCode'; describe('getOperationResponseCode', () => { - it('should produce correct result', () => { - expect(getOperationResponseCode('')).toEqual(null); - expect(getOperationResponseCode('default')).toEqual(0); - expect(getOperationResponseCode('200')).toEqual(200); - expect(getOperationResponseCode('300')).toEqual(300); - expect(getOperationResponseCode('400')).toEqual(400); - expect(getOperationResponseCode('abc')).toEqual(null); - expect(getOperationResponseCode('-100')).toEqual(100); - }); + it('should produce correct result', () => { + expect(getOperationResponseCode('')).toEqual(null); + expect(getOperationResponseCode('default')).toEqual(0); + expect(getOperationResponseCode('200')).toEqual(200); + expect(getOperationResponseCode('300')).toEqual(300); + expect(getOperationResponseCode('400')).toEqual(400); + expect(getOperationResponseCode('abc')).toEqual(null); + expect(getOperationResponseCode('-100')).toEqual(100); + }); }); diff --git a/src/openApi/v3/parser/getOperationResponseCode.ts b/src/openApi/v3/parser/getOperationResponseCode.ts index 74b698865..1e6d49757 100644 --- a/src/openApi/v3/parser/getOperationResponseCode.ts +++ b/src/openApi/v3/parser/getOperationResponseCode.ts @@ -1,16 +1,16 @@ export const getOperationResponseCode = (value: string | 'default'): number | null => { - // You can specify a "default" response - if (value === 'default') { - return 0; - } + // You can specify a "default" response + if (value === 'default') { + return 0; + } - // Check if we can parse the code and return of successful. - if (/[0-9]+/g.test(value)) { - const code = parseInt(value); - if (Number.isInteger(code)) { - return Math.abs(code); - } + // Check if we can parse the code and return of successful. + if (/[0-9]+/g.test(value)) { + const code = parseInt(value); + if (Number.isInteger(code)) { + return Math.abs(code); } + } - return null; + return null; }; diff --git a/src/openApi/v3/parser/getOperationResponseHeader.ts b/src/openApi/v3/parser/getOperationResponseHeader.ts index 09a810916..759d2597e 100644 --- a/src/openApi/v3/parser/getOperationResponseHeader.ts +++ b/src/openApi/v3/parser/getOperationResponseHeader.ts @@ -1,11 +1,11 @@ import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; export const getOperationResponseHeader = (operationResponses: OperationResponse[]): string | null => { - const header = operationResponses.find(operationResponses => { - return operationResponses.in === 'header'; - }); - if (header) { - return header.name; - } - return null; + const header = operationResponses.find((operationResponses) => { + return operationResponses.in === 'header'; + }); + if (header) { + return header.name; + } + return null; }; diff --git a/src/openApi/v3/parser/getOperationResponses.ts b/src/openApi/v3/parser/getOperationResponses.ts index 66a980420..4797145be 100644 --- a/src/openApi/v3/parser/getOperationResponses.ts +++ b/src/openApi/v3/parser/getOperationResponses.ts @@ -7,25 +7,25 @@ import { getOperationResponseCode } from './getOperationResponseCode'; import { getRef } from './getRef'; export const getOperationResponses = (openApi: OpenApi, responses: OpenApiResponses): OperationResponse[] => { - const operationResponses: OperationResponse[] = []; + const operationResponses: OperationResponse[] = []; - // Iterate over each response code and get the - // status code and response message (if any). - for (const code in responses) { - if (responses.hasOwnProperty(code)) { - const responseOrReference = responses[code]; - const response = getRef(openApi, responseOrReference); - const responseCode = getOperationResponseCode(code); + // Iterate over each response code and get the + // status code and response message (if any). + for (const code in responses) { + if (responses.hasOwnProperty(code)) { + const responseOrReference = responses[code]; + const response = getRef(openApi, responseOrReference); + const responseCode = getOperationResponseCode(code); - if (responseCode !== null) { - const operationResponse = getOperationResponse(openApi, response, responseCode); - operationResponses.push(operationResponse); - } - } + if (responseCode !== null) { + const operationResponse = getOperationResponse(openApi, response, responseCode); + operationResponses.push(operationResponse); + } } + } - // Sort the responses to 2XX success codes come before 4XX and 5XX error codes. - return operationResponses.sort((a, b): number => { - return a.code < b.code ? -1 : a.code > b.code ? 1 : 0; - }); + // Sort the responses to 2XX success codes come before 4XX and 5XX error codes. + return operationResponses.sort((a, b): number => { + return a.code < b.code ? -1 : a.code > b.code ? 1 : 0; + }); }; diff --git a/src/openApi/v3/parser/getOperationResults.ts b/src/openApi/v3/parser/getOperationResults.ts index 5dde1e60a..67238ebbd 100644 --- a/src/openApi/v3/parser/getOperationResults.ts +++ b/src/openApi/v3/parser/getOperationResults.ts @@ -2,51 +2,51 @@ import type { Model } from '../../../client/interfaces/Model'; import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; const areEqual = (a: Model, b: Model): boolean => { - const equal = a.type === b.type && a.base === b.base && a.template === b.template; - if (equal && a.link && b.link) { - return areEqual(a.link, b.link); - } - return equal; + const equal = a.type === b.type && a.base === b.base && a.template === b.template; + if (equal && a.link && b.link) { + return areEqual(a.link, b.link); + } + return equal; }; export const getOperationResults = (operationResponses: OperationResponse[]): OperationResponse[] => { - const operationResults: OperationResponse[] = []; - - // Filter out success response codes, but skip "204 No Content" - operationResponses.forEach(operationResponse => { - const { code } = operationResponse; - if (code !== 204 && (code >= 200 && code < 300 || code === 0)) { - operationResults.push(operationResponse); - } - }); + const operationResults: OperationResponse[] = []; - if (!operationResults.length) { - operationResults.push({ - in: 'response', - name: '', - code: 200, - description: '', - export: 'generic', - type: 'void', - base: 'void', - template: null, - link: null, - isDefinition: false, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }); + // Filter out success response codes, but skip "204 No Content" + operationResponses.forEach((operationResponse) => { + const { code } = operationResponse; + if (code !== 204 && ((code >= 200 && code < 300) || code === 0)) { + operationResults.push(operationResponse); } + }); - return operationResults.filter((operationResult, index, arr) => { - return ( - arr.findIndex(item => { - return areEqual(item, operationResult); - }) === index - ); + if (!operationResults.length) { + operationResults.push({ + in: 'response', + name: '', + code: 200, + description: '', + export: 'generic', + type: 'void', + base: 'void', + template: null, + link: null, + isDefinition: false, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], }); + } + + return operationResults.filter((operationResult, index, arr) => { + return ( + arr.findIndex((item) => { + return areEqual(item, operationResult); + }) === index + ); + }); }; diff --git a/src/openApi/v3/parser/getRef.spec.ts b/src/openApi/v3/parser/getRef.spec.ts index 4195e55bc..e59970901 100644 --- a/src/openApi/v3/parser/getRef.spec.ts +++ b/src/openApi/v3/parser/getRef.spec.ts @@ -1,61 +1,61 @@ import { getRef } from './getRef'; describe('getRef', () => { - it('should produce correct result', () => { - expect( - getRef( - { - openapi: '3.0', - info: { - title: 'dummy', - version: '1.0', - }, - paths: {}, - servers: [ - { - url: 'https://localhost:8080/api', - }, - ], - components: { - schemas: { - Example: { - description: 'This is an Example model ', - type: 'integer', - }, - }, - }, - }, - { - $ref: '#/components/schemas/Example', - } - ) - ).toEqual({ - description: 'This is an Example model ', - type: 'integer', - }); + it('should produce correct result', () => { + expect( + getRef( + { + openapi: '3.0', + info: { + title: 'dummy', + version: '1.0', + }, + paths: {}, + servers: [ + { + url: 'https://localhost:8080/api', + }, + ], + components: { + schemas: { + Example: { + description: 'This is an Example model ', + type: 'integer', + }, + }, + }, + }, + { + $ref: '#/components/schemas/Example', + }, + ), + ).toEqual({ + description: 'This is an Example model ', + type: 'integer', }); + }); - it('should produce correct result for encoded ref path', () => { - expect( - getRef( - { - openapi: '3.0', - info: { - title: 'dummy', - version: '1.0', - }, - paths: { - '/api/user/{id}': { - description: 'This is an Example path', - }, - }, - }, - { - $ref: '#/paths/~1api~1user~1%7Bid%7D', - } - ) - ).toEqual({ - description: 'This is an Example path', - }); + it('should produce correct result for encoded ref path', () => { + expect( + getRef( + { + openapi: '3.0', + info: { + title: 'dummy', + version: '1.0', + }, + paths: { + '/api/user/{id}': { + description: 'This is an Example path', + }, + }, + }, + { + $ref: '#/paths/~1api~1user~1%7Bid%7D', + }, + ), + ).toEqual({ + description: 'This is an Example path', }); + }); }); diff --git a/src/openApi/v3/parser/getRef.ts b/src/openApi/v3/parser/getRef.ts index 2c42690ee..61da5bc66 100644 --- a/src/openApi/v3/parser/getRef.ts +++ b/src/openApi/v3/parser/getRef.ts @@ -5,28 +5,26 @@ const ESCAPED_REF_SLASH = /~1/g; const ESCAPED_REF_TILDE = /~0/g; export const getRef = (openApi: OpenApi, item: T & OpenApiReference): T => { - if (item.$ref) { - // Fetch the paths to the definitions, this converts: - // "#/components/schemas/Form" to ["components", "schemas", "Form"] - const paths = item.$ref - .replace(/^#/g, '') - .split('/') - .filter(item => item); + if (item.$ref) { + // Fetch the paths to the definitions, this converts: + // "#/components/schemas/Form" to ["components", "schemas", "Form"] + const paths = item.$ref + .replace(/^#/g, '') + .split('/') + .filter((item) => item); - // Try to find the reference by walking down the path, - // if we cannot find it, then we throw an error. - let result: any = openApi; - paths.forEach(path => { - const decodedPath = decodeURIComponent( - path.replace(ESCAPED_REF_SLASH, '/').replace(ESCAPED_REF_TILDE, '~') - ); - if (result.hasOwnProperty(decodedPath)) { - result = result[decodedPath]; - } else { - throw new Error(`Could not find reference: "${item.$ref}"`); - } - }); - return result as T; - } - return item as T; + // Try to find the reference by walking down the path, + // if we cannot find it, then we throw an error. + let result: any = openApi; + paths.forEach((path) => { + const decodedPath = decodeURIComponent(path.replace(ESCAPED_REF_SLASH, '/').replace(ESCAPED_REF_TILDE, '~')); + if (result.hasOwnProperty(decodedPath)) { + result = result[decodedPath]; + } else { + throw new Error(`Could not find reference: "${item.$ref}"`); + } + }); + return result as T; + } + return item as T; }; diff --git a/src/openApi/v3/parser/getRequiredPropertiesFromComposition.ts b/src/openApi/v3/parser/getRequiredPropertiesFromComposition.ts index 0b1f1859f..803e6a0ec 100644 --- a/src/openApi/v3/parser/getRequiredPropertiesFromComposition.ts +++ b/src/openApi/v3/parser/getRequiredPropertiesFromComposition.ts @@ -8,26 +8,26 @@ import { getRef } from './getRef'; export type GetModelFn = typeof getModel; export const getRequiredPropertiesFromComposition = ( - openApi: OpenApi, - required: string[], - definitions: OpenApiSchema[], - getModel: GetModelFn + openApi: OpenApi, + required: string[], + definitions: OpenApiSchema[], + getModel: GetModelFn, ): Model[] => { - return definitions - .reduce((properties, definition) => { - if (definition.$ref) { - const schema = getRef(openApi, definition); - return [...properties, ...getModel(openApi, schema).properties]; - } - return [...properties, ...getModel(openApi, definition).properties]; - }, [] as Model[]) - .filter(property => { - return !property.isRequired && required.includes(property.name); - }) - .map(property => { - return { - ...property, - isRequired: true, - }; - }); + return definitions + .reduce((properties, definition) => { + if (definition.$ref) { + const schema = getRef(openApi, definition); + return [...properties, ...getModel(openApi, schema).properties]; + } + return [...properties, ...getModel(openApi, definition).properties]; + }, [] as Model[]) + .filter((property) => { + return !property.isRequired && required.includes(property.name); + }) + .map((property) => { + return { + ...property, + isRequired: true, + }; + }); }; diff --git a/src/openApi/v3/parser/getServer.spec.ts b/src/openApi/v3/parser/getServer.spec.ts index 46a1cc0b0..e9615cf2a 100644 --- a/src/openApi/v3/parser/getServer.spec.ts +++ b/src/openApi/v3/parser/getServer.spec.ts @@ -1,47 +1,47 @@ import { getServer } from './getServer'; describe('getServer', () => { - it('should produce correct result', () => { - expect( - getServer({ - openapi: '3.0', - info: { - title: 'dummy', - version: '1.0', - }, - paths: {}, - servers: [ - { - url: 'https://localhost:8080/api', - }, - ], - }) - ).toEqual('https://localhost:8080/api'); - }); + it('should produce correct result', () => { + expect( + getServer({ + openapi: '3.0', + info: { + title: 'dummy', + version: '1.0', + }, + paths: {}, + servers: [ + { + url: 'https://localhost:8080/api', + }, + ], + }), + ).toEqual('https://localhost:8080/api'); + }); - it('should produce correct result with variables', () => { - expect( - getServer({ - openapi: '3.0', - info: { - title: 'dummy', - version: '1.0', - }, - paths: {}, - servers: [ - { - url: '{scheme}://localhost:{port}/api', - variables: { - scheme: { - default: 'https', - }, - port: { - default: '8080', - }, - }, - }, - ], - }) - ).toEqual('https://localhost:8080/api'); - }); + it('should produce correct result with variables', () => { + expect( + getServer({ + openapi: '3.0', + info: { + title: 'dummy', + version: '1.0', + }, + paths: {}, + servers: [ + { + url: '{scheme}://localhost:{port}/api', + variables: { + scheme: { + default: 'https', + }, + port: { + default: '8080', + }, + }, + }, + ], + }), + ).toEqual('https://localhost:8080/api'); + }); }); diff --git a/src/openApi/v3/parser/getServer.ts b/src/openApi/v3/parser/getServer.ts index dd60b1cf3..950ac7005 100644 --- a/src/openApi/v3/parser/getServer.ts +++ b/src/openApi/v3/parser/getServer.ts @@ -1,13 +1,13 @@ import type { OpenApi } from '../interfaces/OpenApi'; export const getServer = (openApi: OpenApi): string => { - const server = openApi.servers?.[0]; - const variables = server?.variables || {}; - let url = server?.url || ''; - for (const variable in variables) { - if (variables.hasOwnProperty(variable)) { - url = url.replace(`{${variable}}`, variables[variable].default); - } + const server = openApi.servers?.[0]; + const variables = server?.variables || {}; + let url = server?.url || ''; + for (const variable in variables) { + if (variables.hasOwnProperty(variable)) { + url = url.replace(`{${variable}}`, variables[variable].default); } - return url.replace(/\/$/g, ''); + } + return url.replace(/\/$/g, ''); }; diff --git a/src/openApi/v3/parser/getServiceName.spec.ts b/src/openApi/v3/parser/getServiceName.spec.ts index 77c420d3b..f8aa4221c 100644 --- a/src/openApi/v3/parser/getServiceName.spec.ts +++ b/src/openApi/v3/parser/getServiceName.spec.ts @@ -1,13 +1,13 @@ import { getServiceName } from './getServiceName'; describe('getServiceName', () => { - it('should produce correct result', () => { - expect(getServiceName('')).toEqual(''); - expect(getServiceName('FooBar')).toEqual('FooBar'); - expect(getServiceName('Foo Bar')).toEqual('FooBar'); - expect(getServiceName('foo bar')).toEqual('FooBar'); - expect(getServiceName('@fooBar')).toEqual('FooBar'); - expect(getServiceName('$fooBar')).toEqual('FooBar'); - expect(getServiceName('123fooBar')).toEqual('FooBar'); - }); + it('should produce correct result', () => { + expect(getServiceName('')).toEqual(''); + expect(getServiceName('FooBar')).toEqual('FooBar'); + expect(getServiceName('Foo Bar')).toEqual('FooBar'); + expect(getServiceName('foo bar')).toEqual('FooBar'); + expect(getServiceName('@fooBar')).toEqual('FooBar'); + expect(getServiceName('$fooBar')).toEqual('FooBar'); + expect(getServiceName('123fooBar')).toEqual('FooBar'); + }); }); diff --git a/src/openApi/v3/parser/getServiceName.ts b/src/openApi/v3/parser/getServiceName.ts index b5b1718f2..1fa6b089b 100644 --- a/src/openApi/v3/parser/getServiceName.ts +++ b/src/openApi/v3/parser/getServiceName.ts @@ -5,9 +5,9 @@ import camelCase from 'camelcase'; * the input string to PascalCase. */ export const getServiceName = (value: string): string => { - const clean = value - .replace(/^[^a-zA-Z]+/g, '') - .replace(/[^\w\-]+/g, '-') - .trim(); - return camelCase(clean, { pascalCase: true }); + const clean = value + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim(); + return camelCase(clean, { pascalCase: true }); }; diff --git a/src/openApi/v3/parser/getServiceVersion.spec.ts b/src/openApi/v3/parser/getServiceVersion.spec.ts index 3e72898b4..8fb71150b 100644 --- a/src/openApi/v3/parser/getServiceVersion.spec.ts +++ b/src/openApi/v3/parser/getServiceVersion.spec.ts @@ -1,9 +1,9 @@ import { getServiceVersion } from './getServiceVersion'; describe('getServiceVersion', () => { - it('should produce correct result', () => { - expect(getServiceVersion('1.0')).toEqual('1.0'); - expect(getServiceVersion('v1.0')).toEqual('1.0'); - expect(getServiceVersion('V1.0')).toEqual('1.0'); - }); + it('should produce correct result', () => { + expect(getServiceVersion('1.0')).toEqual('1.0'); + expect(getServiceVersion('v1.0')).toEqual('1.0'); + expect(getServiceVersion('V1.0')).toEqual('1.0'); + }); }); diff --git a/src/openApi/v3/parser/getServiceVersion.ts b/src/openApi/v3/parser/getServiceVersion.ts index 9c7a8a04b..b1fd6c4b0 100644 --- a/src/openApi/v3/parser/getServiceVersion.ts +++ b/src/openApi/v3/parser/getServiceVersion.ts @@ -4,5 +4,5 @@ * @param version */ export const getServiceVersion = (version = '1.0'): string => { - return String(version).replace(/^v/gi, ''); + return String(version).replace(/^v/gi, ''); }; diff --git a/src/openApi/v3/parser/getServices.spec.ts b/src/openApi/v3/parser/getServices.spec.ts index baea07e66..33bf29d28 100644 --- a/src/openApi/v3/parser/getServices.spec.ts +++ b/src/openApi/v3/parser/getServices.spec.ts @@ -1,31 +1,31 @@ import { getServices } from './getServices'; describe('getServices', () => { - it('should create a unnamed service if tags are empty', () => { - const services = getServices({ - openapi: '3.0.0', - info: { - title: 'x', - version: '1', + it('should create a unnamed service if tags are empty', () => { + const services = getServices({ + openapi: '3.0.0', + info: { + title: 'x', + version: '1', + }, + paths: { + '/api/trips': { + get: { + tags: [], + responses: { + 200: { + description: 'x', + }, + default: { + description: 'default', + }, }, - paths: { - '/api/trips': { - get: { - tags: [], - responses: { - 200: { - description: 'x', - }, - default: { - description: 'default', - }, - }, - }, - }, - }, - }); - - expect(services).toHaveLength(1); - expect(services[0].name).toEqual('Default'); + }, + }, + }, }); + + expect(services).toHaveLength(1); + expect(services[0].name).toEqual('Default'); + }); }); diff --git a/src/openApi/v3/parser/getServices.ts b/src/openApi/v3/parser/getServices.ts index d8fe411bb..3e7b37247 100644 --- a/src/openApi/v3/parser/getServices.ts +++ b/src/openApi/v3/parser/getServices.ts @@ -8,48 +8,48 @@ import { getOperationParameters } from './getOperationParameters'; * Get the OpenAPI services */ export const getServices = (openApi: OpenApi): Service[] => { - const services = new Map(); - for (const url in openApi.paths) { - if (openApi.paths.hasOwnProperty(url)) { - // Grab path and parse any global path parameters - const path = openApi.paths[url]; - const pathParams = getOperationParameters(openApi, path.parameters || []); + const services = new Map(); + for (const url in openApi.paths) { + if (openApi.paths.hasOwnProperty(url)) { + // Grab path and parse any global path parameters + const path = openApi.paths[url]; + const pathParams = getOperationParameters(openApi, path.parameters || []); - // Parse all the methods for this path - for (const method in path) { - if (path.hasOwnProperty(method)) { - switch (method) { - case 'get': - case 'put': - case 'post': - case 'delete': - case 'options': - case 'head': - case 'patch': - // Each method contains an OpenAPI operation, we parse the operation - const op = path[method]!; - const tags = op.tags?.length ? op.tags.filter(unique) : ['Default']; - tags.forEach(tag => { - const operation = getOperation(openApi, url, method, tag, op, pathParams); + // Parse all the methods for this path + for (const method in path) { + if (path.hasOwnProperty(method)) { + switch (method) { + case 'get': + case 'put': + case 'post': + case 'delete': + case 'options': + case 'head': + case 'patch': + // Each method contains an OpenAPI operation, we parse the operation + const op = path[method]!; + const tags = op.tags?.length ? op.tags.filter(unique) : ['Default']; + tags.forEach((tag) => { + const operation = getOperation(openApi, url, method, tag, op, pathParams); - // If we have already declared a service, then we should fetch that and - // append the new method to it. Otherwise we should create a new service object. - const service: Service = services.get(operation.service) || { - name: operation.service, - operations: [], - imports: [], - }; + // If we have already declared a service, then we should fetch that and + // append the new method to it. Otherwise we should create a new service object. + const service: Service = services.get(operation.service) || { + name: operation.service, + operations: [], + imports: [], + }; - // Push the operation in the service - service.operations.push(operation); - service.imports.push(...operation.imports); - services.set(operation.service, service); - }); - break; - } - } - } + // Push the operation in the service + service.operations.push(operation); + service.imports.push(...operation.imports); + services.set(operation.service, service); + }); + break; + } } + } } - return Array.from(services.values()); + } + return Array.from(services.values()); }; diff --git a/src/openApi/v3/parser/getType.spec.ts b/src/openApi/v3/parser/getType.spec.ts index 06e23f374..709e7c6da 100644 --- a/src/openApi/v3/parser/getType.spec.ts +++ b/src/openApi/v3/parser/getType.spec.ts @@ -1,102 +1,102 @@ import { getType } from './getType'; describe('getType', () => { - it('should convert int', () => { - const type = getType('int'); - expect(type.type).toEqual('number'); - expect(type.base).toEqual('number'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); - expect(type.isNullable).toEqual(false); - }); + it('should convert int', () => { + const type = getType('int'); + expect(type.type).toEqual('number'); + expect(type.base).toEqual('number'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(false); + }); - it('should convert string', () => { - const type = getType('string'); - expect(type.type).toEqual('string'); - expect(type.base).toEqual('string'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); - expect(type.isNullable).toEqual(false); - }); + it('should convert string', () => { + const type = getType('string'); + expect(type.type).toEqual('string'); + expect(type.base).toEqual('string'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(false); + }); - it('should convert string array', () => { - const type = getType('array[string]'); - expect(type.type).toEqual('string[]'); - expect(type.base).toEqual('string'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); - expect(type.isNullable).toEqual(false); - }); + it('should convert string array', () => { + const type = getType('array[string]'); + expect(type.type).toEqual('string[]'); + expect(type.base).toEqual('string'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(false); + }); - it('should convert template with primary', () => { - const type = getType('#/components/schemas/Link[string]'); - expect(type.type).toEqual('Link'); - expect(type.base).toEqual('Link'); - expect(type.template).toEqual('string'); - expect(type.imports).toEqual(['Link']); - expect(type.isNullable).toEqual(false); - }); + it('should convert template with primary', () => { + const type = getType('#/components/schemas/Link[string]'); + expect(type.type).toEqual('Link'); + expect(type.base).toEqual('Link'); + expect(type.template).toEqual('string'); + expect(type.imports).toEqual(['Link']); + expect(type.isNullable).toEqual(false); + }); - it('should convert template with model', () => { - const type = getType('#/components/schemas/Link[Model]'); - expect(type.type).toEqual('Link'); - expect(type.base).toEqual('Link'); - expect(type.template).toEqual('Model'); - expect(type.imports).toEqual(['Link', 'Model']); - expect(type.isNullable).toEqual(false); - }); + it('should convert template with model', () => { + const type = getType('#/components/schemas/Link[Model]'); + expect(type.type).toEqual('Link'); + expect(type.base).toEqual('Link'); + expect(type.template).toEqual('Model'); + expect(type.imports).toEqual(['Link', 'Model']); + expect(type.isNullable).toEqual(false); + }); - it('should have double imports', () => { - const type = getType('#/components/schemas/Link[Link]'); - expect(type.type).toEqual('Link'); - expect(type.base).toEqual('Link'); - expect(type.template).toEqual('Link'); - expect(type.imports).toEqual(['Link', 'Link']); - expect(type.isNullable).toEqual(false); - }); + it('should have double imports', () => { + const type = getType('#/components/schemas/Link[Link]'); + expect(type.type).toEqual('Link'); + expect(type.base).toEqual('Link'); + expect(type.template).toEqual('Link'); + expect(type.imports).toEqual(['Link', 'Link']); + expect(type.isNullable).toEqual(false); + }); - it('should support dot', () => { - const type = getType('#/components/schemas/model.000'); - expect(type.type).toEqual('model_000'); - expect(type.base).toEqual('model_000'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual(['model_000']); - expect(type.isNullable).toEqual(false); - }); + it('should support dot', () => { + const type = getType('#/components/schemas/model.000'); + expect(type.type).toEqual('model_000'); + expect(type.base).toEqual('model_000'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['model_000']); + expect(type.isNullable).toEqual(false); + }); - it('should support dashes', () => { - const type = getType('#/components/schemas/some_special-schema'); - expect(type.type).toEqual('some_special_schema'); - expect(type.base).toEqual('some_special_schema'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual(['some_special_schema']); - expect(type.isNullable).toEqual(false); - }); + it('should support dashes', () => { + const type = getType('#/components/schemas/some_special-schema'); + expect(type.type).toEqual('some_special_schema'); + expect(type.base).toEqual('some_special_schema'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['some_special_schema']); + expect(type.isNullable).toEqual(false); + }); - it('should support dollar sign', () => { - const type = getType('#/components/schemas/$some+special+schema'); - expect(type.type).toEqual('$some_special_schema'); - expect(type.base).toEqual('$some_special_schema'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual(['$some_special_schema']); - expect(type.isNullable).toEqual(false); - }); + it('should support dollar sign', () => { + const type = getType('#/components/schemas/$some+special+schema'); + expect(type.type).toEqual('$some_special_schema'); + expect(type.base).toEqual('$some_special_schema'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual(['$some_special_schema']); + expect(type.isNullable).toEqual(false); + }); - it('should support multiple base types', () => { - const type = getType(['string', 'int']); - expect(type.type).toEqual('string | number'); - expect(type.base).toEqual('string | number'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); - expect(type.isNullable).toEqual(false); - }); + it('should support multiple base types', () => { + const type = getType(['string', 'int']); + expect(type.type).toEqual('string | number'); + expect(type.base).toEqual('string | number'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(false); + }); - it('should support multiple nullable types', () => { - const type = getType(['string', 'null']); - expect(type.type).toEqual('string'); - expect(type.base).toEqual('string'); - expect(type.template).toEqual(null); - expect(type.imports).toEqual([]); - expect(type.isNullable).toEqual(true); - }); + it('should support multiple nullable types', () => { + const type = getType(['string', 'null']); + expect(type.type).toEqual('string'); + expect(type.base).toEqual('string'); + expect(type.template).toEqual(null); + expect(type.imports).toEqual([]); + expect(type.isNullable).toEqual(true); + }); }); diff --git a/src/openApi/v3/parser/getType.ts b/src/openApi/v3/parser/getType.ts index e8ef4733d..cf916b3f3 100644 --- a/src/openApi/v3/parser/getType.ts +++ b/src/openApi/v3/parser/getType.ts @@ -4,7 +4,7 @@ import { getMappedType } from './getMappedType'; import { stripNamespace } from './stripNamespace'; const encode = (value: string): string => { - return value.replace(/^[^a-zA-Z_$]+/g, '').replace(/[^\w$]+/g, '_'); + return value.replace(/^[^a-zA-Z_$]+/g, '').replace(/[^\w$]+/g, '_'); }; /** @@ -13,70 +13,70 @@ const encode = (value: string): string => { * @param format String value like "binary" or "date". */ export const getType = (type: string | string[] = 'any', format?: string): Type => { - const result: Type = { - type: 'any', - base: 'any', - template: null, - imports: [], - isNullable: false, - }; + const result: Type = { + type: 'any', + base: 'any', + template: null, + imports: [], + isNullable: false, + }; - // Special case for JSON Schema spec (december 2020, page 17), - // that allows type to be an array of primitive types... - if (Array.isArray(type)) { - const joinedType = type - .filter(value => value !== 'null') - .map(value => getMappedType(value, format)) - .filter(isDefined) - .join(' | '); - result.type = joinedType; - result.base = joinedType; - result.isNullable = type.includes('null'); - return result; - } - - const mapped = getMappedType(type, format); - if (mapped) { - result.type = mapped; - result.base = mapped; - return result; - } + // Special case for JSON Schema spec (december 2020, page 17), + // that allows type to be an array of primitive types... + if (Array.isArray(type)) { + const joinedType = type + .filter((value) => value !== 'null') + .map((value) => getMappedType(value, format)) + .filter(isDefined) + .join(' | '); + result.type = joinedType; + result.base = joinedType; + result.isNullable = type.includes('null'); + return result; + } - const typeWithoutNamespace = decodeURIComponent(stripNamespace(type)); + const mapped = getMappedType(type, format); + if (mapped) { + result.type = mapped; + result.base = mapped; + return result; + } - if (/\[.*\]$/g.test(typeWithoutNamespace)) { - const matches = typeWithoutNamespace.match(/(.*?)\[(.*)\]$/); - if (matches?.length) { - const match1 = getType(encode(matches[1])); - const match2 = getType(encode(matches[2])); + const typeWithoutNamespace = decodeURIComponent(stripNamespace(type)); - if (match1.type === 'any[]') { - result.type = `${match2.type}[]`; - result.base = `${match2.type}`; - match1.imports = []; - } else if (match2.type) { - result.type = `${match1.type}<${match2.type}>`; - result.base = match1.type; - result.template = match2.type; - } else { - result.type = match1.type; - result.base = match1.type; - result.template = match1.type; - } + if (/\[.*\]$/g.test(typeWithoutNamespace)) { + const matches = typeWithoutNamespace.match(/(.*?)\[(.*)\]$/); + if (matches?.length) { + const match1 = getType(encode(matches[1])); + const match2 = getType(encode(matches[2])); - result.imports.push(...match1.imports); - result.imports.push(...match2.imports); - return result; - } - } + if (match1.type === 'any[]') { + result.type = `${match2.type}[]`; + result.base = `${match2.type}`; + match1.imports = []; + } else if (match2.type) { + result.type = `${match1.type}<${match2.type}>`; + result.base = match1.type; + result.template = match2.type; + } else { + result.type = match1.type; + result.base = match1.type; + result.template = match1.type; + } - if (typeWithoutNamespace) { - const type = encode(typeWithoutNamespace); - result.type = type; - result.base = type; - result.imports.push(type); - return result; + result.imports.push(...match1.imports); + result.imports.push(...match2.imports); + return result; } + } + if (typeWithoutNamespace) { + const type = encode(typeWithoutNamespace); + result.type = type; + result.base = type; + result.imports.push(type); return result; + } + + return result; }; diff --git a/src/openApi/v3/parser/sortByRequired.ts b/src/openApi/v3/parser/sortByRequired.ts index 6519bb17e..c94203980 100644 --- a/src/openApi/v3/parser/sortByRequired.ts +++ b/src/openApi/v3/parser/sortByRequired.ts @@ -1,9 +1,9 @@ import type { OperationParameter } from '../../../client/interfaces/OperationParameter'; export const sortByRequired = (a: OperationParameter, b: OperationParameter): number => { - const aNeedsValue = a.isRequired && a.default === undefined; - const bNeedsValue = b.isRequired && b.default === undefined; - if (aNeedsValue && !bNeedsValue) return -1; - if (bNeedsValue && !aNeedsValue) return 1; - return 0; + const aNeedsValue = a.isRequired && a.default === undefined; + const bNeedsValue = b.isRequired && b.default === undefined; + if (aNeedsValue && !bNeedsValue) return -1; + if (bNeedsValue && !aNeedsValue) return 1; + return 0; }; diff --git a/src/openApi/v3/parser/stripNamespace.spec.ts b/src/openApi/v3/parser/stripNamespace.spec.ts index 5b3cc4a16..2e80972be 100644 --- a/src/openApi/v3/parser/stripNamespace.spec.ts +++ b/src/openApi/v3/parser/stripNamespace.spec.ts @@ -1,15 +1,15 @@ import { stripNamespace } from './stripNamespace'; describe('stripNamespace', () => { - it('should strip namespace', () => { - expect(stripNamespace('#/components/schemas/Item')).toEqual('Item'); - expect(stripNamespace('#/components/responses/Item')).toEqual('Item'); - expect(stripNamespace('#/components/parameters/Item')).toEqual('Item'); - expect(stripNamespace('#/components/examples/Item')).toEqual('Item'); - expect(stripNamespace('#/components/requestBodies/Item')).toEqual('Item'); - expect(stripNamespace('#/components/headers/Item')).toEqual('Item'); - expect(stripNamespace('#/components/securitySchemes/Item')).toEqual('Item'); - expect(stripNamespace('#/components/links/Item')).toEqual('Item'); - expect(stripNamespace('#/components/callbacks/Item')).toEqual('Item'); - }); + it('should strip namespace', () => { + expect(stripNamespace('#/components/schemas/Item')).toEqual('Item'); + expect(stripNamespace('#/components/responses/Item')).toEqual('Item'); + expect(stripNamespace('#/components/parameters/Item')).toEqual('Item'); + expect(stripNamespace('#/components/examples/Item')).toEqual('Item'); + expect(stripNamespace('#/components/requestBodies/Item')).toEqual('Item'); + expect(stripNamespace('#/components/headers/Item')).toEqual('Item'); + expect(stripNamespace('#/components/securitySchemes/Item')).toEqual('Item'); + expect(stripNamespace('#/components/links/Item')).toEqual('Item'); + expect(stripNamespace('#/components/callbacks/Item')).toEqual('Item'); + }); }); diff --git a/src/openApi/v3/parser/stripNamespace.ts b/src/openApi/v3/parser/stripNamespace.ts index 76b9d02d2..1472394e7 100644 --- a/src/openApi/v3/parser/stripNamespace.ts +++ b/src/openApi/v3/parser/stripNamespace.ts @@ -3,15 +3,15 @@ * @param value */ export const stripNamespace = (value: string): string => { - return value - .trim() - .replace(/^#\/components\/schemas\//, '') - .replace(/^#\/components\/responses\//, '') - .replace(/^#\/components\/parameters\//, '') - .replace(/^#\/components\/examples\//, '') - .replace(/^#\/components\/requestBodies\//, '') - .replace(/^#\/components\/headers\//, '') - .replace(/^#\/components\/securitySchemes\//, '') - .replace(/^#\/components\/links\//, '') - .replace(/^#\/components\/callbacks\//, ''); + return value + .trim() + .replace(/^#\/components\/schemas\//, '') + .replace(/^#\/components\/responses\//, '') + .replace(/^#\/components\/parameters\//, '') + .replace(/^#\/components\/examples\//, '') + .replace(/^#\/components\/requestBodies\//, '') + .replace(/^#\/components\/headers\//, '') + .replace(/^#\/components\/securitySchemes\//, '') + .replace(/^#\/components\/links\//, '') + .replace(/^#\/components\/callbacks\//, ''); }; diff --git a/src/templates/__mocks__/index.ts b/src/templates/__mocks__/index.ts index 7f78e06f9..23a32df4f 100644 --- a/src/templates/__mocks__/index.ts +++ b/src/templates/__mocks__/index.ts @@ -1,7 +1,7 @@ export default { - compiler: [8, '>= 4.3.0'], - useData: true, - main: () => { - return ''; - }, + compiler: [8, '>= 4.3.0'], + useData: true, + main: () => { + return ''; + }, }; diff --git a/src/typings/hbs.d.ts b/src/typings/hbs.d.ts index d5a0d4345..55d75f9cc 100644 --- a/src/typings/hbs.d.ts +++ b/src/typings/hbs.d.ts @@ -7,10 +7,10 @@ * @see: build.js for more information */ declare module '*.hbs' { - const template: { - compiler: [number, string]; - useData: true; - main: () => void; - }; - export default template; + const template: { + compiler: [number, string]; + useData: true; + main: () => void; + }; + export default template; } diff --git a/src/utils/discriminator.ts b/src/utils/discriminator.ts index 15e1ef510..17a86e822 100644 --- a/src/utils/discriminator.ts +++ b/src/utils/discriminator.ts @@ -5,38 +5,38 @@ import { stripNamespace } from '../openApi/v3/parser/stripNamespace'; import type { Dictionary } from './types'; const inverseDictionary = (map: Dictionary): Dictionary => { - const m2: Dictionary = {}; - for (const key in map) { - m2[map[key]] = key; - } - return m2; + const m2: Dictionary = {}; + for (const key in map) { + m2[map[key]] = key; + } + return m2; }; export const findOneOfParentDiscriminator = (openApi: OpenApi, parent?: Model): OpenApiDiscriminator | undefined => { - if (openApi.components && parent) { - for (const definitionName in openApi.components.schemas) { - if (openApi.components.schemas.hasOwnProperty(definitionName)) { - const schema = openApi.components.schemas[definitionName]; - if ( - schema.discriminator && - schema.oneOf?.length && - schema.oneOf.some(definition => definition.$ref && stripNamespace(definition.$ref) == parent.name) - ) { - return schema.discriminator; - } - } + if (openApi.components && parent) { + for (const definitionName in openApi.components.schemas) { + if (openApi.components.schemas.hasOwnProperty(definitionName)) { + const schema = openApi.components.schemas[definitionName]; + if ( + schema.discriminator && + schema.oneOf?.length && + schema.oneOf.some((definition) => definition.$ref && stripNamespace(definition.$ref) == parent.name) + ) { + return schema.discriminator; } + } } - return undefined; + } + return undefined; }; export const mapPropertyValue = (discriminator: OpenApiDiscriminator, parent: Model): string => { - if (discriminator.mapping) { - const mapping = inverseDictionary(discriminator.mapping); - const key = Object.keys(mapping).find(item => stripNamespace(item) == parent.name); - if (key && mapping[key]) { - return mapping[key]; - } + if (discriminator.mapping) { + const mapping = inverseDictionary(discriminator.mapping); + const key = Object.keys(mapping).find((item) => stripNamespace(item) == parent.name); + if (key && mapping[key]) { + return mapping[key]; } - return parent.name; + } + return parent.name; }; diff --git a/src/utils/fileSystem.ts b/src/utils/fileSystem.ts index 3d39afbaa..3aa35cb82 100644 --- a/src/utils/fileSystem.ts +++ b/src/utils/fileSystem.ts @@ -1,10 +1,10 @@ import { - copyFile as __copyFile, - mkdirp as __mkdirp, - pathExists as __pathExists, - readFile as __readFile, - remove as __remove, - writeFile as __writeFile, + copyFile as __copyFile, + mkdirp as __mkdirp, + pathExists as __pathExists, + readFile as __readFile, + remove as __remove, + writeFile as __writeFile, } from 'fs-extra'; // Export calls (needed for mocking) diff --git a/src/utils/flatMap.spec.ts b/src/utils/flatMap.spec.ts index 4cd2c7a54..67f389492 100644 --- a/src/utils/flatMap.spec.ts +++ b/src/utils/flatMap.spec.ts @@ -1,9 +1,9 @@ import { flatMap } from './flatMap'; describe('flatMap', () => { - it('should produce correct result', () => { - expect(flatMap([1, 2, 3], i => [i])).toEqual([1, 2, 3]); - expect(flatMap([1, 2, 3], i => [i + 1])).toEqual([2, 3, 4]); - expect(flatMap([1, 2, 3], () => [1])).toEqual([1, 1, 1]); - }); + it('should produce correct result', () => { + expect(flatMap([1, 2, 3], (i) => [i])).toEqual([1, 2, 3]); + expect(flatMap([1, 2, 3], (i) => [i + 1])).toEqual([2, 3, 4]); + expect(flatMap([1, 2, 3], () => [1])).toEqual([1, 1, 1]); + }); }); diff --git a/src/utils/flatMap.ts b/src/utils/flatMap.ts index 7dbcb3150..0d7350474 100644 --- a/src/utils/flatMap.ts +++ b/src/utils/flatMap.ts @@ -3,9 +3,9 @@ * Then, flattens the result into a new array. */ export const flatMap = (array: T[], callback: (value: T, index: number, array: T[]) => U[]): U[] => { - const result: U[] = []; - array.map(callback).forEach(arr => { - result.push(...arr); - }); - return result; + const result: U[] = []; + array.map(callback).forEach((arr) => { + result.push(...arr); + }); + return result; }; diff --git a/src/utils/formatCode.spec.ts b/src/utils/formatCode.spec.ts index 794fcc967..204a1fe42 100644 --- a/src/utils/formatCode.spec.ts +++ b/src/utils/formatCode.spec.ts @@ -25,12 +25,12 @@ const input4 = `{ const output4 = `{${EOL}\tfoo: true,${EOL}\tbar: 123${EOL}}`; describe('format', () => { - it('should produce correct result', () => { - expect(formatCode(``)).toEqual(''); - expect(formatCode(`{}`)).toEqual('{}'); - expect(formatCode(input1)).toEqual(output1); - expect(formatCode(input2)).toEqual(output2); - expect(formatCode(input3)).toEqual(output3); - expect(formatCode(input4)).toEqual(output4); - }); + it('should produce correct result', () => { + expect(formatCode(``)).toEqual(''); + expect(formatCode(`{}`)).toEqual('{}'); + expect(formatCode(input1)).toEqual(output1); + expect(formatCode(input2)).toEqual(output2); + expect(formatCode(input3)).toEqual(output3); + expect(formatCode(input4)).toEqual(output4); + }); }); diff --git a/src/utils/formatCode.ts b/src/utils/formatCode.ts index 9d0e8e69b..487685248 100644 --- a/src/utils/formatCode.ts +++ b/src/utils/formatCode.ts @@ -1,23 +1,23 @@ import { EOL } from 'os'; export const formatCode = (s: string): string => { - let indent: number = 0; - let lines = s.split(/[\r\n]+/); - lines = lines.map(line => { - line = line.trim().replace(/^\*/g, ' *'); - let i = indent; - if (line.endsWith('(') || line.endsWith('{') || line.endsWith('[')) { - indent++; - } - if ((line.startsWith(')') || line.startsWith('}') || line.startsWith(']')) && i) { - indent--; - i--; - } - const result = `${'\t'.repeat(i)}${line}`; - if (result.trim() === '') { - return ''; - } - return result; - }); - return lines.join(EOL); + let indent: number = 0; + let lines = s.split(/[\r\n]+/); + lines = lines.map((line) => { + line = line.trim().replace(/^\*/g, ' *'); + let i = indent; + if (line.endsWith('(') || line.endsWith('{') || line.endsWith('[')) { + indent++; + } + if ((line.startsWith(')') || line.startsWith('}') || line.startsWith(']')) && i) { + indent--; + i--; + } + const result = `${'\t'.repeat(i)}${line}`; + if (result.trim() === '') { + return ''; + } + return result; + }); + return lines.join(EOL); }; diff --git a/src/utils/formatIndentation.ts b/src/utils/formatIndentation.ts index 63e1ca912..5a18c87ea 100644 --- a/src/utils/formatIndentation.ts +++ b/src/utils/formatIndentation.ts @@ -3,18 +3,18 @@ import { EOL } from 'os'; import { Indent } from '../Indent'; export const formatIndentation = (s: string, indent: Indent): string => { - let lines = s.split(EOL); - lines = lines.map(line => { - switch (indent) { - case Indent.SPACE_4: - return line.replace(/\t/g, ' '); - case Indent.SPACE_2: - return line.replace(/\t/g, ' '); - case Indent.TAB: - return line; // Default output is tab formatted - } - }); - // Make sure we have a blank line at the end - const content = lines.join(EOL); - return `${content}${EOL}`; + let lines = s.split(EOL); + lines = lines.map((line) => { + switch (indent) { + case Indent.SPACE_4: + return line.replace(/\t/g, ' '); + case Indent.SPACE_2: + return line.replace(/\t/g, ' '); + case Indent.TAB: + return line; // Default output is tab formatted + } + }); + // Make sure we have a blank line at the end + const content = lines.join(EOL); + return `${content}${EOL}`; }; diff --git a/src/utils/getHttpRequestName.ts b/src/utils/getHttpRequestName.ts index b69062092..3a38fd278 100644 --- a/src/utils/getHttpRequestName.ts +++ b/src/utils/getHttpRequestName.ts @@ -5,14 +5,14 @@ import { HttpClient } from '../HttpClient'; * @param httpClient The selected httpClient (fetch, xhr, node or axios) */ export const getHttpRequestName = (httpClient: HttpClient): string => { - switch (httpClient) { - case HttpClient.FETCH: - return 'FetchHttpRequest'; - case HttpClient.XHR: - return 'XHRHttpRequest'; - case HttpClient.NODE: - return 'NodeHttpRequest'; - case HttpClient.AXIOS: - return 'AxiosHttpRequest'; - } + switch (httpClient) { + case HttpClient.FETCH: + return 'FetchHttpRequest'; + case HttpClient.XHR: + return 'XHRHttpRequest'; + case HttpClient.NODE: + return 'NodeHttpRequest'; + case HttpClient.AXIOS: + return 'AxiosHttpRequest'; + } }; diff --git a/src/utils/getModelNames.spec.ts b/src/utils/getModelNames.spec.ts index a5a17d4b4..f3d5f53e2 100644 --- a/src/utils/getModelNames.spec.ts +++ b/src/utils/getModelNames.spec.ts @@ -2,61 +2,61 @@ import type { Model } from '../client/interfaces/Model'; import { getModelNames } from './getModelNames'; describe('getModelNames', () => { - it('should return sorted list', () => { - const john: Model = { - export: 'interface', - name: 'John', - type: 'John', - base: 'John', - template: null, - link: null, - description: null, - isDefinition: true, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }; - const jane: Model = { - export: 'interface', - name: 'Jane', - type: 'Jane', - base: 'Jane', - template: null, - link: null, - description: null, - isDefinition: true, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }; - const doe: Model = { - export: 'interface', - name: 'Doe', - type: 'Doe', - base: 'Doe', - template: null, - link: null, - description: null, - isDefinition: true, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }; - const models: Model[] = [john, jane, doe]; + it('should return sorted list', () => { + const john: Model = { + export: 'interface', + name: 'John', + type: 'John', + base: 'John', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const jane: Model = { + export: 'interface', + name: 'Jane', + type: 'Jane', + base: 'Jane', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const doe: Model = { + export: 'interface', + name: 'Doe', + type: 'Doe', + base: 'Doe', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const models: Model[] = [john, jane, doe]; - expect(getModelNames([])).toEqual([]); - expect(getModelNames(models)).toEqual(['Doe', 'Jane', 'John']); - }); + expect(getModelNames([])).toEqual([]); + expect(getModelNames(models)).toEqual(['Doe', 'Jane', 'John']); + }); }); diff --git a/src/utils/getModelNames.ts b/src/utils/getModelNames.ts index 26b76f713..f6d376e36 100644 --- a/src/utils/getModelNames.ts +++ b/src/utils/getModelNames.ts @@ -2,5 +2,5 @@ import type { Model } from '../client/interfaces/Model'; import { sort } from './sort'; export const getModelNames = (models: Model[]): string[] => { - return models.map(model => model.name).sort(sort); + return models.map((model) => model.name).sort(sort); }; diff --git a/src/utils/getOpenApiSpec.ts b/src/utils/getOpenApiSpec.ts index 148b1469f..6ca35e313 100644 --- a/src/utils/getOpenApiSpec.ts +++ b/src/utils/getOpenApiSpec.ts @@ -7,5 +7,5 @@ import RefParser from 'json-schema-ref-parser'; * @param location: Path or url */ export const getOpenApiSpec = async (location: string): Promise => { - return await RefParser.bundle(location, location, {}); + return await RefParser.bundle(location, location, {}); }; diff --git a/src/utils/getOpenApiVersion.spec.ts b/src/utils/getOpenApiVersion.spec.ts index eda928637..f22f9859b 100644 --- a/src/utils/getOpenApiVersion.spec.ts +++ b/src/utils/getOpenApiVersion.spec.ts @@ -1,15 +1,15 @@ import { getOpenApiVersion } from './getOpenApiVersion'; describe('getOpenApiVersion', () => { - it('should read the correct version', () => { - expect(getOpenApiVersion({ openapi: '2' })).toEqual(2); - expect(getOpenApiVersion({ openapi: '3' })).toEqual(3); - expect(getOpenApiVersion({ openapi: '2.0' })).toEqual(2); - expect(getOpenApiVersion({ openapi: '3.0' })).toEqual(3); + it('should read the correct version', () => { + expect(getOpenApiVersion({ openapi: '2' })).toEqual(2); + expect(getOpenApiVersion({ openapi: '3' })).toEqual(3); + expect(getOpenApiVersion({ openapi: '2.0' })).toEqual(2); + expect(getOpenApiVersion({ openapi: '3.0' })).toEqual(3); - expect(getOpenApiVersion({ swagger: '2' })).toEqual(2); - expect(getOpenApiVersion({ swagger: '3' })).toEqual(3); - expect(getOpenApiVersion({ swagger: '2.0' })).toEqual(2); - expect(getOpenApiVersion({ swagger: '3.0' })).toEqual(3); - }); + expect(getOpenApiVersion({ swagger: '2' })).toEqual(2); + expect(getOpenApiVersion({ swagger: '3' })).toEqual(3); + expect(getOpenApiVersion({ swagger: '2.0' })).toEqual(2); + expect(getOpenApiVersion({ swagger: '3.0' })).toEqual(3); + }); }); diff --git a/src/utils/getOpenApiVersion.ts b/src/utils/getOpenApiVersion.ts index 9c7cc7e47..d573607bc 100644 --- a/src/utils/getOpenApiVersion.ts +++ b/src/utils/getOpenApiVersion.ts @@ -1,6 +1,6 @@ export enum OpenApiVersion { - V2 = 2, - V3 = 3, + V2 = 2, + V3 = 3, } /** @@ -10,13 +10,13 @@ export enum OpenApiVersion { * @param openApi The loaded spec (can be any object) */ export const getOpenApiVersion = (openApi: any): OpenApiVersion => { - const info: any = openApi.swagger || openApi.openapi; - if (typeof info === 'string') { - const c = info.charAt(0); - const v = Number.parseInt(c); - if (v === OpenApiVersion.V2 || v === OpenApiVersion.V3) { - return v as OpenApiVersion; - } + const info: any = openApi.swagger || openApi.openapi; + if (typeof info === 'string') { + const c = info.charAt(0); + const v = Number.parseInt(c); + if (v === OpenApiVersion.V2 || v === OpenApiVersion.V3) { + return v as OpenApiVersion; } - throw new Error(`Unsupported Open API version: "${String(info)}"`); + } + throw new Error(`Unsupported Open API version: "${String(info)}"`); }; diff --git a/src/utils/getPattern.spec.ts b/src/utils/getPattern.spec.ts index 3f3756f01..1f3f16bf4 100644 --- a/src/utils/getPattern.spec.ts +++ b/src/utils/getPattern.spec.ts @@ -1,16 +1,16 @@ import { getPattern } from './getPattern'; describe('getPattern', () => { - it('should produce correct result', () => { - expect(getPattern()).toEqual(undefined); - expect(getPattern('')).toEqual(''); - expect(getPattern('^[a-zA-Z]')).toEqual('^[a-zA-Z]'); - expect(getPattern('^\\w+$')).toEqual('^\\\\w+$'); - expect(getPattern('^\\d{3}-\\d{2}-\\d{4}$')).toEqual('^\\\\d{3}-\\\\d{2}-\\\\d{4}$'); - expect(getPattern('\\')).toEqual('\\\\'); - expect(getPattern('\\/')).toEqual('\\\\/'); - expect(getPattern('\\/\\/')).toEqual('\\\\/\\\\/'); - // eslint-disable-next-line prettier/prettier - expect(getPattern("'")).toEqual("\\'"); - }); + it('should produce correct result', () => { + expect(getPattern()).toEqual(undefined); + expect(getPattern('')).toEqual(''); + expect(getPattern('^[a-zA-Z]')).toEqual('^[a-zA-Z]'); + expect(getPattern('^\\w+$')).toEqual('^\\\\w+$'); + expect(getPattern('^\\d{3}-\\d{2}-\\d{4}$')).toEqual('^\\\\d{3}-\\\\d{2}-\\\\d{4}$'); + expect(getPattern('\\')).toEqual('\\\\'); + expect(getPattern('\\/')).toEqual('\\\\/'); + expect(getPattern('\\/\\/')).toEqual('\\\\/\\\\/'); + // eslint-disable-next-line prettier/prettier + expect(getPattern("'")).toEqual("\\'"); + }); }); diff --git a/src/utils/getPattern.ts b/src/utils/getPattern.ts index b4580f5a6..16a933c8a 100644 --- a/src/utils/getPattern.ts +++ b/src/utils/getPattern.ts @@ -9,6 +9,6 @@ * @param pattern */ export const getPattern = (pattern?: string): string | undefined => { - // eslint-disable-next-line prettier/prettier - return pattern?.replace(/\\/g, '\\\\').replace(/'/g, "\\'"); + // eslint-disable-next-line prettier/prettier + return pattern?.replace(/\\/g, '\\\\').replace(/'/g, "\\'"); }; diff --git a/src/utils/getServiceNames.spec.ts b/src/utils/getServiceNames.spec.ts index 53fa0bd40..50c412bbb 100644 --- a/src/utils/getServiceNames.spec.ts +++ b/src/utils/getServiceNames.spec.ts @@ -2,26 +2,26 @@ import type { Service } from '../client/interfaces/Service'; import { getServiceNames } from './getServiceNames'; describe('getServiceNames', () => { - it('should return sorted list', () => { - const john: Service = { - name: 'John', - operations: [], - imports: [], - }; - const jane: Service = { - name: 'Jane', - operations: [], - imports: [], - }; - const doe: Service = { - name: 'Doe', - operations: [], - imports: [], - }; + it('should return sorted list', () => { + const john: Service = { + name: 'John', + operations: [], + imports: [], + }; + const jane: Service = { + name: 'Jane', + operations: [], + imports: [], + }; + const doe: Service = { + name: 'Doe', + operations: [], + imports: [], + }; - const services = [john, jane, doe]; + const services = [john, jane, doe]; - expect(getServiceNames([])).toEqual([]); - expect(getServiceNames(services)).toEqual(['Doe', 'Jane', 'John']); - }); + expect(getServiceNames([])).toEqual([]); + expect(getServiceNames(services)).toEqual(['Doe', 'Jane', 'John']); + }); }); diff --git a/src/utils/getServiceNames.ts b/src/utils/getServiceNames.ts index 913b746cf..5262ebd51 100644 --- a/src/utils/getServiceNames.ts +++ b/src/utils/getServiceNames.ts @@ -2,5 +2,5 @@ import type { Service } from '../client/interfaces/Service'; import { sort } from './sort'; export const getServiceNames = (services: Service[]): string[] => { - return services.map(service => service.name).sort(sort); + return services.map((service) => service.name).sort(sort); }; diff --git a/src/utils/isDefined.ts b/src/utils/isDefined.ts index 470b6f9d4..9891968ef 100644 --- a/src/utils/isDefined.ts +++ b/src/utils/isDefined.ts @@ -3,5 +3,5 @@ * @param value */ export const isDefined = (value: T | undefined | null | ''): value is Exclude => { - return value !== undefined && value !== null && value !== ''; + return value !== undefined && value !== null && value !== ''; }; diff --git a/src/utils/isEqual.ts b/src/utils/isEqual.ts index f0d1c2a39..742382751 100644 --- a/src/utils/isEqual.ts +++ b/src/utils/isEqual.ts @@ -1,38 +1,38 @@ export const isEqual = (a: any, b: any): boolean => { - if (a === b) { - return true; - } + if (a === b) { + return true; + } - if (a && b && typeof a === 'object' && typeof b === 'object') { - if (Array.isArray(a) && Array.isArray(b)) { - if (a.length !== b.length) { - return false; - } - for (let i = 0; i < a.length; i++) { - if (!isEqual(a[i], b[i])) { - return false; - } - } - return true; + if (a && b && typeof a === 'object' && typeof b === 'object') { + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; i++) { + if (!isEqual(a[i], b[i])) { + return false; } + } + return true; + } - const keysA = Object.keys(a); - const keysB = Object.keys(b); - if (keysA.length !== keysB.length) { - return false; - } + const keysA = Object.keys(a); + const keysB = Object.keys(b); + if (keysA.length !== keysB.length) { + return false; + } - for (let i = 0; i < keysA.length; i++) { - const key = keysA[i]; - if (!Object.prototype.hasOwnProperty.call(b, key)) { - return false; - } - if (!isEqual(a[key], b[key])) { - return false; - } - } - return true; + for (let i = 0; i < keysA.length; i++) { + const key = keysA[i]; + if (!Object.prototype.hasOwnProperty.call(b, key)) { + return false; + } + if (!isEqual(a[key], b[key])) { + return false; + } } + return true; + } - return a !== a && b !== b; + return a !== a && b !== b; }; diff --git a/src/utils/isString.spec.ts b/src/utils/isString.spec.ts index f082aa2c2..0ae036e2c 100644 --- a/src/utils/isString.spec.ts +++ b/src/utils/isString.spec.ts @@ -1,13 +1,13 @@ import { isString } from './isString'; describe('isString', () => { - it('should produce correct result', () => { - expect(isString('foo')).toBeTruthy(); - expect(isString('123')).toBeTruthy(); - expect(isString('-1')).toBeTruthy(); - expect(isString('')).toBeTruthy(); - expect(isString(null)).toBeFalsy(); - expect(isString(undefined)).toBeFalsy(); - expect(isString({})).toBeFalsy(); - }); + it('should produce correct result', () => { + expect(isString('foo')).toBeTruthy(); + expect(isString('123')).toBeTruthy(); + expect(isString('-1')).toBeTruthy(); + expect(isString('')).toBeTruthy(); + expect(isString(null)).toBeFalsy(); + expect(isString(undefined)).toBeFalsy(); + expect(isString({})).toBeFalsy(); + }); }); diff --git a/src/utils/isString.ts b/src/utils/isString.ts index 581c602c9..a7d8a211a 100644 --- a/src/utils/isString.ts +++ b/src/utils/isString.ts @@ -1,3 +1,3 @@ export const isString = (val: any): val is string => { - return typeof val === 'string'; + return typeof val === 'string'; }; diff --git a/src/utils/isSubdirectory.spec.ts b/src/utils/isSubdirectory.spec.ts index 8b0574e70..184580bf4 100644 --- a/src/utils/isSubdirectory.spec.ts +++ b/src/utils/isSubdirectory.spec.ts @@ -3,13 +3,13 @@ import { resolve } from 'path'; import { isSubDirectory } from './isSubdirectory'; describe('isSubDirectory', () => { - it('should return correct result', () => { - expect(isSubDirectory(resolve('/'), resolve('/'))).toBeFalsy(); - expect(isSubDirectory(resolve('.'), resolve('.'))).toBeFalsy(); - expect(isSubDirectory(resolve('./project'), resolve('./project'))).toBeFalsy(); - expect(isSubDirectory(resolve('./project'), resolve('../'))).toBeFalsy(); - expect(isSubDirectory(resolve('./project'), resolve('../../'))).toBeFalsy(); - expect(isSubDirectory(resolve('./'), resolve('./output'))).toBeTruthy(); - expect(isSubDirectory(resolve('./'), resolve('../output'))).toBeTruthy(); - }); + it('should return correct result', () => { + expect(isSubDirectory(resolve('/'), resolve('/'))).toBeFalsy(); + expect(isSubDirectory(resolve('.'), resolve('.'))).toBeFalsy(); + expect(isSubDirectory(resolve('./project'), resolve('./project'))).toBeFalsy(); + expect(isSubDirectory(resolve('./project'), resolve('../'))).toBeFalsy(); + expect(isSubDirectory(resolve('./project'), resolve('../../'))).toBeFalsy(); + expect(isSubDirectory(resolve('./'), resolve('./output'))).toBeTruthy(); + expect(isSubDirectory(resolve('./'), resolve('../output'))).toBeTruthy(); + }); }); diff --git a/src/utils/isSubdirectory.ts b/src/utils/isSubdirectory.ts index 761eb89d0..b79329104 100644 --- a/src/utils/isSubdirectory.ts +++ b/src/utils/isSubdirectory.ts @@ -1,5 +1,5 @@ import { relative } from 'path'; export const isSubDirectory = (parent: string, child: string) => { - return relative(child, parent).startsWith('..'); + return relative(child, parent).startsWith('..'); }; diff --git a/src/utils/postProcessClient.ts b/src/utils/postProcessClient.ts index 0033923d4..5f2fe2412 100644 --- a/src/utils/postProcessClient.ts +++ b/src/utils/postProcessClient.ts @@ -7,9 +7,9 @@ import { postProcessService } from './postProcessService'; * @param client Client object with all the models, services, etc. */ export const postProcessClient = (client: Client): Client => { - return { - ...client, - models: client.models.map(model => postProcessModel(model)), - services: client.services.map(service => postProcessService(service)), - }; + return { + ...client, + models: client.models.map((model) => postProcessModel(model)), + services: client.services.map((service) => postProcessService(service)), + }; }; diff --git a/src/utils/postProcessModel.ts b/src/utils/postProcessModel.ts index 195a94e4f..a494891c7 100644 --- a/src/utils/postProcessModel.ts +++ b/src/utils/postProcessModel.ts @@ -9,10 +9,10 @@ import { postProcessModelImports } from './postProcessModelImports'; * @param model */ export const postProcessModel = (model: Model): Model => { - return { - ...model, - imports: postProcessModelImports(model), - enums: postProcessModelEnums(model), - enum: postProcessModelEnum(model), - }; + return { + ...model, + imports: postProcessModelImports(model), + enums: postProcessModelEnums(model), + enum: postProcessModelEnum(model), + }; }; diff --git a/src/utils/postProcessModelEnum.ts b/src/utils/postProcessModelEnum.ts index f442b369a..740ef9726 100644 --- a/src/utils/postProcessModelEnum.ts +++ b/src/utils/postProcessModelEnum.ts @@ -6,7 +6,7 @@ import type { Model } from '../client/interfaces/Model'; * @param model */ export const postProcessModelEnum = (model: Model): Enum[] => { - return model.enum.filter((property, index, arr) => { - return arr.findIndex(item => item.name === property.name) === index; - }); + return model.enum.filter((property, index, arr) => { + return arr.findIndex((item) => item.name === property.name) === index; + }); }; diff --git a/src/utils/postProcessModelEnums.ts b/src/utils/postProcessModelEnums.ts index 2f06127aa..daaf99c2f 100644 --- a/src/utils/postProcessModelEnums.ts +++ b/src/utils/postProcessModelEnums.ts @@ -5,7 +5,7 @@ import type { Model } from '../client/interfaces/Model'; * @param model The model that is post-processed */ export const postProcessModelEnums = (model: Model): Model[] => { - return model.enums.filter((property, index, arr) => { - return arr.findIndex(item => item.name === property.name) === index; - }); + return model.enums.filter((property, index, arr) => { + return arr.findIndex((item) => item.name === property.name) === index; + }); }; diff --git a/src/utils/postProcessModelImports.ts b/src/utils/postProcessModelImports.ts index 00c0d4539..24947847a 100644 --- a/src/utils/postProcessModelImports.ts +++ b/src/utils/postProcessModelImports.ts @@ -7,8 +7,8 @@ import { unique } from './unique'; * @param model The model that is post-processed */ export const postProcessModelImports = (model: Model): string[] => { - return model.imports - .filter(unique) - .sort(sort) - .filter(name => model.name !== name); + return model.imports + .filter(unique) + .sort(sort) + .filter((name) => model.name !== name); }; diff --git a/src/utils/postProcessService.ts b/src/utils/postProcessService.ts index 2851f4a6a..76780dd18 100644 --- a/src/utils/postProcessService.ts +++ b/src/utils/postProcessService.ts @@ -3,11 +3,11 @@ import { postProcessServiceImports } from './postProcessServiceImports'; import { postProcessServiceOperations } from './postProcessServiceOperations'; export const postProcessService = (service: Service): Service => { - const clone = { ...service }; - clone.operations = postProcessServiceOperations(clone); - clone.operations.forEach(operation => { - clone.imports.push(...operation.imports); - }); - clone.imports = postProcessServiceImports(clone); - return clone; + const clone = { ...service }; + clone.operations = postProcessServiceOperations(clone); + clone.operations.forEach((operation) => { + clone.imports.push(...operation.imports); + }); + clone.imports = postProcessServiceImports(clone); + return clone; }; diff --git a/src/utils/postProcessServiceImports.ts b/src/utils/postProcessServiceImports.ts index b47cfe793..c73119eb1 100644 --- a/src/utils/postProcessServiceImports.ts +++ b/src/utils/postProcessServiceImports.ts @@ -7,5 +7,5 @@ import { unique } from './unique'; * @param service */ export const postProcessServiceImports = (service: Service): string[] => { - return service.imports.filter(unique).sort(sort); + return service.imports.filter(unique).sort(sort); }; diff --git a/src/utils/postProcessServiceOperations.ts b/src/utils/postProcessServiceOperations.ts index 5b88a5b21..16ca2acbf 100644 --- a/src/utils/postProcessServiceOperations.ts +++ b/src/utils/postProcessServiceOperations.ts @@ -3,24 +3,24 @@ import type { Service } from '../client/interfaces/Service'; import { flatMap } from './flatMap'; export const postProcessServiceOperations = (service: Service): Operation[] => { - const names = new Map(); + const names = new Map(); - return service.operations.map(operation => { - const clone = { ...operation }; + return service.operations.map((operation) => { + const clone = { ...operation }; - // Parse the service parameters and results, very similar to how we parse - // properties of models. These methods will extend the type if needed. - clone.imports.push(...flatMap(clone.parameters, parameter => parameter.imports)); - clone.imports.push(...flatMap(clone.results, result => result.imports)); + // Parse the service parameters and results, very similar to how we parse + // properties of models. These methods will extend the type if needed. + clone.imports.push(...flatMap(clone.parameters, (parameter) => parameter.imports)); + clone.imports.push(...flatMap(clone.results, (result) => result.imports)); - // Check if the operation name is unique, if not then prefix this with a number - const name = clone.name; - const index = names.get(name) || 0; - if (index > 0) { - clone.name = `${name}${index}`; - } - names.set(name, index + 1); + // Check if the operation name is unique, if not then prefix this with a number + const name = clone.name; + const index = names.get(name) || 0; + if (index > 0) { + clone.name = `${name}${index}`; + } + names.set(name, index + 1); - return clone; - }); + return clone; + }); }; diff --git a/src/utils/readSpec.ts b/src/utils/readSpec.ts index 016bf929e..5c586d713 100644 --- a/src/utils/readSpec.ts +++ b/src/utils/readSpec.ts @@ -3,11 +3,11 @@ import { readSpecFromHttp } from './readSpecFromHttp'; import { readSpecFromHttps } from './readSpecFromHttps'; export const readSpec = async (input: string): Promise => { - if (input.startsWith('https://')) { - return await readSpecFromHttps(input); - } - if (input.startsWith('http://')) { - return await readSpecFromHttp(input); - } - return await readSpecFromDisk(input); + if (input.startsWith('https://')) { + return await readSpecFromHttps(input); + } + if (input.startsWith('http://')) { + return await readSpecFromHttp(input); + } + return await readSpecFromDisk(input); }; diff --git a/src/utils/readSpecFromDisk.ts b/src/utils/readSpecFromDisk.ts index 7a5b76671..1eada3790 100644 --- a/src/utils/readSpecFromDisk.ts +++ b/src/utils/readSpecFromDisk.ts @@ -7,15 +7,15 @@ import { exists, readFile } from './fileSystem'; * @param input */ export const readSpecFromDisk = async (input: string): Promise => { - const filePath = resolve(process.cwd(), input); - const fileExists = await exists(filePath); - if (fileExists) { - try { - const content = await readFile(filePath, 'utf8'); - return content.toString(); - } catch (e) { - throw new Error(`Could not read OpenApi spec: "${filePath}"`); - } + const filePath = resolve(process.cwd(), input); + const fileExists = await exists(filePath); + if (fileExists) { + try { + const content = await readFile(filePath, 'utf8'); + return content.toString(); + } catch (e) { + throw new Error(`Could not read OpenApi spec: "${filePath}"`); } - throw new Error(`Could not find OpenApi spec: "${filePath}"`); + } + throw new Error(`Could not find OpenApi spec: "${filePath}"`); }; diff --git a/src/utils/readSpecFromHttp.ts b/src/utils/readSpecFromHttp.ts index e4cc828a5..9af308fbc 100644 --- a/src/utils/readSpecFromHttp.ts +++ b/src/utils/readSpecFromHttp.ts @@ -5,18 +5,18 @@ import { get } from 'http'; * @param url */ export const readSpecFromHttp = async (url: string): Promise => { - return new Promise((resolve, reject) => { - get(url, response => { - let body = ''; - response.on('data', chunk => { - body += chunk; - }); - response.on('end', () => { - resolve(body); - }); - response.on('error', () => { - reject(`Could not read OpenApi spec: "${url}"`); - }); - }); + return new Promise((resolve, reject) => { + get(url, (response) => { + let body = ''; + response.on('data', (chunk) => { + body += chunk; + }); + response.on('end', () => { + resolve(body); + }); + response.on('error', () => { + reject(`Could not read OpenApi spec: "${url}"`); + }); }); + }); }; diff --git a/src/utils/readSpecFromHttps.ts b/src/utils/readSpecFromHttps.ts index 52cdc57db..069a34dcb 100644 --- a/src/utils/readSpecFromHttps.ts +++ b/src/utils/readSpecFromHttps.ts @@ -5,18 +5,18 @@ import { get } from 'https'; * @param url */ export const readSpecFromHttps = async (url: string): Promise => { - return new Promise((resolve, reject) => { - get(url, response => { - let body = ''; - response.on('data', chunk => { - body += chunk; - }); - response.on('end', () => { - resolve(body); - }); - response.on('error', () => { - reject(`Could not read OpenApi spec: "${url}"`); - }); - }); + return new Promise((resolve, reject) => { + get(url, (response) => { + let body = ''; + response.on('data', (chunk) => { + body += chunk; + }); + response.on('end', () => { + resolve(body); + }); + response.on('error', () => { + reject(`Could not read OpenApi spec: "${url}"`); + }); }); + }); }; diff --git a/src/utils/registerHandlebarHelpers.spec.ts b/src/utils/registerHandlebarHelpers.spec.ts index 73ff11167..4cbd92adf 100644 --- a/src/utils/registerHandlebarHelpers.spec.ts +++ b/src/utils/registerHandlebarHelpers.spec.ts @@ -4,18 +4,18 @@ import { HttpClient } from '../HttpClient'; import { registerHandlebarHelpers } from './registerHandlebarHelpers'; describe('registerHandlebarHelpers', () => { - it('should register the helpers', () => { - registerHandlebarHelpers({ - httpClient: HttpClient.FETCH, - useOptions: false, - }); - const helpers = Object.keys(Handlebars.helpers); - expect(helpers).toContain('ifdef'); - expect(helpers).toContain('equals'); - expect(helpers).toContain('notEquals'); - expect(helpers).toContain('containsSpaces'); - expect(helpers).toContain('escapeComment'); - expect(helpers).toContain('escapeDescription'); - expect(helpers).toContain('camelCase'); + it('should register the helpers', () => { + registerHandlebarHelpers({ + httpClient: HttpClient.FETCH, + useOptions: false, }); + const helpers = Object.keys(Handlebars.helpers); + expect(helpers).toContain('ifdef'); + expect(helpers).toContain('equals'); + expect(helpers).toContain('notEquals'); + expect(helpers).toContain('containsSpaces'); + expect(helpers).toContain('escapeComment'); + expect(helpers).toContain('escapeDescription'); + expect(helpers).toContain('camelCase'); + }); }); diff --git a/src/utils/registerHandlebarHelpers.ts b/src/utils/registerHandlebarHelpers.ts index 726ac148e..bf7346880 100644 --- a/src/utils/registerHandlebarHelpers.ts +++ b/src/utils/registerHandlebarHelpers.ts @@ -5,50 +5,50 @@ import { EOL } from 'os'; import type { HttpClient } from '../HttpClient'; export const registerHandlebarHelpers = (root: { - httpClient: HttpClient; - useOptions: boolean; + httpClient: HttpClient; + useOptions: boolean; }): void => { - Handlebars.registerHelper('ifdef', function (this: any, ...args): string { - const options = args.pop(); - if (!args.every(value => !value)) { - return options.fn(this); - } - return options.inverse(this); - }); - - Handlebars.registerHelper( - 'equals', - function (this: any, a: string, b: string, options: Handlebars.HelperOptions): string { - return a === b ? options.fn(this) : options.inverse(this); - } - ); - - Handlebars.registerHelper( - 'notEquals', - function (this: any, a: string, b: string, options: Handlebars.HelperOptions): string { - return a !== b ? options.fn(this) : options.inverse(this); - } - ); - - Handlebars.registerHelper( - 'containsSpaces', - function (this: any, value: string, options: Handlebars.HelperOptions): string { - return /\s+/.test(value) ? options.fn(this) : options.inverse(this); - } - ); - - Handlebars.registerHelper('escapeComment', function (value: string): string { - return value - .replace(/\*\//g, '*') - .replace(/\/\*/g, '*') - .replace(/\r?\n(.*)/g, (_, w) => `${EOL} * ${w.trim()}`); - }); - - Handlebars.registerHelper('escapeDescription', function (value: string): string { - return value.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\${/g, '\\${'); - }); - - Handlebars.registerHelper('camelCase', function (value: string): string { - return camelCase(value); - }); + Handlebars.registerHelper('ifdef', function (this: any, ...args): string { + const options = args.pop(); + if (!args.every((value) => !value)) { + return options.fn(this); + } + return options.inverse(this); + }); + + Handlebars.registerHelper( + 'equals', + function (this: any, a: string, b: string, options: Handlebars.HelperOptions): string { + return a === b ? options.fn(this) : options.inverse(this); + }, + ); + + Handlebars.registerHelper( + 'notEquals', + function (this: any, a: string, b: string, options: Handlebars.HelperOptions): string { + return a !== b ? options.fn(this) : options.inverse(this); + }, + ); + + Handlebars.registerHelper( + 'containsSpaces', + function (this: any, value: string, options: Handlebars.HelperOptions): string { + return /\s+/.test(value) ? options.fn(this) : options.inverse(this); + }, + ); + + Handlebars.registerHelper('escapeComment', function (value: string): string { + return value + .replace(/\*\//g, '*') + .replace(/\/\*/g, '*') + .replace(/\r?\n(.*)/g, (_, w) => `${EOL} * ${w.trim()}`); + }); + + Handlebars.registerHelper('escapeDescription', function (value: string): string { + return value.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\${/g, '\\${'); + }); + + Handlebars.registerHelper('camelCase', function (value: string): string { + return camelCase(value); + }); }; diff --git a/src/utils/registerHandlebarTemplates.spec.ts b/src/utils/registerHandlebarTemplates.spec.ts index 24bdd3d62..4f066ea8e 100644 --- a/src/utils/registerHandlebarTemplates.spec.ts +++ b/src/utils/registerHandlebarTemplates.spec.ts @@ -2,19 +2,19 @@ import { HttpClient } from '../HttpClient'; import { registerHandlebarTemplates } from './registerHandlebarTemplates'; describe('registerHandlebarTemplates', () => { - it('should return correct templates', () => { - const templates = registerHandlebarTemplates({ - httpClient: HttpClient.FETCH, - useOptions: false, - }); - expect(templates.index).toBeDefined(); - expect(templates.exports.model).toBeDefined(); - expect(templates.exports.schema).toBeDefined(); - expect(templates.exports.service).toBeDefined(); - expect(templates.core.settings).toBeDefined(); - expect(templates.core.apiError).toBeDefined(); - expect(templates.core.apiRequestOptions).toBeDefined(); - expect(templates.core.apiResult).toBeDefined(); - expect(templates.core.request).toBeDefined(); + it('should return correct templates', () => { + const templates = registerHandlebarTemplates({ + httpClient: HttpClient.FETCH, + useOptions: false, }); + expect(templates.index).toBeDefined(); + expect(templates.exports.model).toBeDefined(); + expect(templates.exports.schema).toBeDefined(); + expect(templates.exports.service).toBeDefined(); + expect(templates.core.settings).toBeDefined(); + expect(templates.core.apiError).toBeDefined(); + expect(templates.core.apiRequestOptions).toBeDefined(); + expect(templates.core.apiResult).toBeDefined(); + expect(templates.core.request).toBeDefined(); + }); }); diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index ee8637976..cb9edb240 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -76,23 +76,23 @@ import partialTypeUnion from '../templates/partials/typeUnion.hbs'; import { registerHandlebarHelpers } from './registerHandlebarHelpers'; export interface Templates { - index: Handlebars.TemplateDelegate; - client: Handlebars.TemplateDelegate; - exports: { - model: Handlebars.TemplateDelegate; - schema: Handlebars.TemplateDelegate; - service: Handlebars.TemplateDelegate; - }; - core: { - settings: Handlebars.TemplateDelegate; - apiError: Handlebars.TemplateDelegate; - apiRequestOptions: Handlebars.TemplateDelegate; - apiResult: Handlebars.TemplateDelegate; - cancelablePromise: Handlebars.TemplateDelegate; - request: Handlebars.TemplateDelegate; - baseHttpRequest: Handlebars.TemplateDelegate; - httpRequest: Handlebars.TemplateDelegate; - }; + index: Handlebars.TemplateDelegate; + client: Handlebars.TemplateDelegate; + exports: { + model: Handlebars.TemplateDelegate; + schema: Handlebars.TemplateDelegate; + service: Handlebars.TemplateDelegate; + }; + core: { + settings: Handlebars.TemplateDelegate; + apiError: Handlebars.TemplateDelegate; + apiRequestOptions: Handlebars.TemplateDelegate; + apiResult: Handlebars.TemplateDelegate; + cancelablePromise: Handlebars.TemplateDelegate; + request: Handlebars.TemplateDelegate; + baseHttpRequest: Handlebars.TemplateDelegate; + httpRequest: Handlebars.TemplateDelegate; + }; } /** @@ -100,102 +100,102 @@ export interface Templates { * so we can easily access the templates in out generator / write functions. */ export const registerHandlebarTemplates = (root: { - httpClient: HttpClient; - useOptions: boolean; + httpClient: HttpClient; + useOptions: boolean; }): Templates => { - registerHandlebarHelpers(root); + registerHandlebarHelpers(root); - // Main templates (entry points for the files we write to disk) - const templates: Templates = { - index: Handlebars.template(templateIndex), - client: Handlebars.template(templateClient), - exports: { - model: Handlebars.template(templateExportModel), - schema: Handlebars.template(templateExportSchema), - service: Handlebars.template(templateExportService), - }, - core: { - settings: Handlebars.template(templateCoreSettings), - apiError: Handlebars.template(templateCoreApiError), - apiRequestOptions: Handlebars.template(templateCoreApiRequestOptions), - apiResult: Handlebars.template(templateCoreApiResult), - cancelablePromise: Handlebars.template(templateCancelablePromise), - request: Handlebars.template(templateCoreRequest), - baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest), - httpRequest: Handlebars.template(templateCoreHttpRequest), - }, - }; + // Main templates (entry points for the files we write to disk) + const templates: Templates = { + index: Handlebars.template(templateIndex), + client: Handlebars.template(templateClient), + exports: { + model: Handlebars.template(templateExportModel), + schema: Handlebars.template(templateExportSchema), + service: Handlebars.template(templateExportService), + }, + core: { + settings: Handlebars.template(templateCoreSettings), + apiError: Handlebars.template(templateCoreApiError), + apiRequestOptions: Handlebars.template(templateCoreApiRequestOptions), + apiResult: Handlebars.template(templateCoreApiResult), + cancelablePromise: Handlebars.template(templateCancelablePromise), + request: Handlebars.template(templateCoreRequest), + baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest), + httpRequest: Handlebars.template(templateCoreHttpRequest), + }, + }; - // Partials for the generations of the models, services, etc. - Handlebars.registerPartial('header', Handlebars.template(partialHeader)); - Handlebars.registerPartial('isNullable', Handlebars.template(partialIsNullable)); - Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly)); - Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); - Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); - Handlebars.registerPartial('result', Handlebars.template(partialResult)); - Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); - Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); - Handlebars.registerPartial('schemaDictionary', Handlebars.template(partialSchemaDictionary)); - Handlebars.registerPartial('schemaEnum', Handlebars.template(partialSchemaEnum)); - Handlebars.registerPartial('schemaGeneric', Handlebars.template(partialSchemaGeneric)); - Handlebars.registerPartial('schemaInterface', Handlebars.template(partialSchemaInterface)); - Handlebars.registerPartial('schemaComposition', Handlebars.template(partialSchemaComposition)); - Handlebars.registerPartial('type', Handlebars.template(partialType)); - Handlebars.registerPartial('typeArray', Handlebars.template(partialTypeArray)); - Handlebars.registerPartial('typeDictionary', Handlebars.template(partialTypeDictionary)); - Handlebars.registerPartial('typeEnum', Handlebars.template(partialTypeEnum)); - Handlebars.registerPartial('typeGeneric', Handlebars.template(partialTypeGeneric)); - Handlebars.registerPartial('typeInterface', Handlebars.template(partialTypeInterface)); - Handlebars.registerPartial('typeReference', Handlebars.template(partialTypeReference)); - Handlebars.registerPartial('typeUnion', Handlebars.template(partialTypeUnion)); - Handlebars.registerPartial('typeIntersection', Handlebars.template(partialTypeIntersection)); - Handlebars.registerPartial('base', Handlebars.template(partialBase)); + // Partials for the generations of the models, services, etc. + Handlebars.registerPartial('header', Handlebars.template(partialHeader)); + Handlebars.registerPartial('isNullable', Handlebars.template(partialIsNullable)); + Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly)); + Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); + Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); + Handlebars.registerPartial('result', Handlebars.template(partialResult)); + Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); + Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); + Handlebars.registerPartial('schemaDictionary', Handlebars.template(partialSchemaDictionary)); + Handlebars.registerPartial('schemaEnum', Handlebars.template(partialSchemaEnum)); + Handlebars.registerPartial('schemaGeneric', Handlebars.template(partialSchemaGeneric)); + Handlebars.registerPartial('schemaInterface', Handlebars.template(partialSchemaInterface)); + Handlebars.registerPartial('schemaComposition', Handlebars.template(partialSchemaComposition)); + Handlebars.registerPartial('type', Handlebars.template(partialType)); + Handlebars.registerPartial('typeArray', Handlebars.template(partialTypeArray)); + Handlebars.registerPartial('typeDictionary', Handlebars.template(partialTypeDictionary)); + Handlebars.registerPartial('typeEnum', Handlebars.template(partialTypeEnum)); + Handlebars.registerPartial('typeGeneric', Handlebars.template(partialTypeGeneric)); + Handlebars.registerPartial('typeInterface', Handlebars.template(partialTypeInterface)); + Handlebars.registerPartial('typeReference', Handlebars.template(partialTypeReference)); + Handlebars.registerPartial('typeUnion', Handlebars.template(partialTypeUnion)); + Handlebars.registerPartial('typeIntersection', Handlebars.template(partialTypeIntersection)); + Handlebars.registerPartial('base', Handlebars.template(partialBase)); - // Generic functions used in 'request' file @see src/templates/core/request.hbs for more info - Handlebars.registerPartial('functions/catchErrorCodes', Handlebars.template(functionCatchErrorCodes)); - Handlebars.registerPartial('functions/getFormData', Handlebars.template(functionGetFormData)); - Handlebars.registerPartial('functions/getQueryString', Handlebars.template(functionGetQueryString)); - Handlebars.registerPartial('functions/getUrl', Handlebars.template(functionGetUrl)); - Handlebars.registerPartial('functions/isBlob', Handlebars.template(functionIsBlob)); - Handlebars.registerPartial('functions/isDefined', Handlebars.template(functionIsDefined)); - Handlebars.registerPartial('functions/isFormData', Handlebars.template(functionIsFormData)); - Handlebars.registerPartial('functions/isString', Handlebars.template(functionIsString)); - Handlebars.registerPartial('functions/isStringWithValue', Handlebars.template(functionIsStringWithValue)); - Handlebars.registerPartial('functions/isSuccess', Handlebars.template(functionIsSuccess)); - Handlebars.registerPartial('functions/base64', Handlebars.template(functionBase64)); - Handlebars.registerPartial('functions/resolve', Handlebars.template(functionResolve)); + // Generic functions used in 'request' file @see src/templates/core/request.hbs for more info + Handlebars.registerPartial('functions/catchErrorCodes', Handlebars.template(functionCatchErrorCodes)); + Handlebars.registerPartial('functions/getFormData', Handlebars.template(functionGetFormData)); + Handlebars.registerPartial('functions/getQueryString', Handlebars.template(functionGetQueryString)); + Handlebars.registerPartial('functions/getUrl', Handlebars.template(functionGetUrl)); + Handlebars.registerPartial('functions/isBlob', Handlebars.template(functionIsBlob)); + Handlebars.registerPartial('functions/isDefined', Handlebars.template(functionIsDefined)); + Handlebars.registerPartial('functions/isFormData', Handlebars.template(functionIsFormData)); + Handlebars.registerPartial('functions/isString', Handlebars.template(functionIsString)); + Handlebars.registerPartial('functions/isStringWithValue', Handlebars.template(functionIsStringWithValue)); + Handlebars.registerPartial('functions/isSuccess', Handlebars.template(functionIsSuccess)); + Handlebars.registerPartial('functions/base64', Handlebars.template(functionBase64)); + Handlebars.registerPartial('functions/resolve', Handlebars.template(functionResolve)); - // Specific files for the fetch client implementation - Handlebars.registerPartial('fetch/getHeaders', Handlebars.template(fetchGetHeaders)); - Handlebars.registerPartial('fetch/getRequestBody', Handlebars.template(fetchGetRequestBody)); - Handlebars.registerPartial('fetch/getResponseBody', Handlebars.template(fetchGetResponseBody)); - Handlebars.registerPartial('fetch/getResponseHeader', Handlebars.template(fetchGetResponseHeader)); - Handlebars.registerPartial('fetch/sendRequest', Handlebars.template(fetchSendRequest)); - Handlebars.registerPartial('fetch/request', Handlebars.template(fetchRequest)); + // Specific files for the fetch client implementation + Handlebars.registerPartial('fetch/getHeaders', Handlebars.template(fetchGetHeaders)); + Handlebars.registerPartial('fetch/getRequestBody', Handlebars.template(fetchGetRequestBody)); + Handlebars.registerPartial('fetch/getResponseBody', Handlebars.template(fetchGetResponseBody)); + Handlebars.registerPartial('fetch/getResponseHeader', Handlebars.template(fetchGetResponseHeader)); + Handlebars.registerPartial('fetch/sendRequest', Handlebars.template(fetchSendRequest)); + Handlebars.registerPartial('fetch/request', Handlebars.template(fetchRequest)); - // Specific files for the xhr client implementation - Handlebars.registerPartial('xhr/getHeaders', Handlebars.template(xhrGetHeaders)); - Handlebars.registerPartial('xhr/getRequestBody', Handlebars.template(xhrGetRequestBody)); - Handlebars.registerPartial('xhr/getResponseBody', Handlebars.template(xhrGetResponseBody)); - Handlebars.registerPartial('xhr/getResponseHeader', Handlebars.template(xhrGetResponseHeader)); - Handlebars.registerPartial('xhr/sendRequest', Handlebars.template(xhrSendRequest)); - Handlebars.registerPartial('xhr/request', Handlebars.template(xhrRequest)); + // Specific files for the xhr client implementation + Handlebars.registerPartial('xhr/getHeaders', Handlebars.template(xhrGetHeaders)); + Handlebars.registerPartial('xhr/getRequestBody', Handlebars.template(xhrGetRequestBody)); + Handlebars.registerPartial('xhr/getResponseBody', Handlebars.template(xhrGetResponseBody)); + Handlebars.registerPartial('xhr/getResponseHeader', Handlebars.template(xhrGetResponseHeader)); + Handlebars.registerPartial('xhr/sendRequest', Handlebars.template(xhrSendRequest)); + Handlebars.registerPartial('xhr/request', Handlebars.template(xhrRequest)); - // Specific files for the node client implementation - Handlebars.registerPartial('node/getHeaders', Handlebars.template(nodeGetHeaders)); - Handlebars.registerPartial('node/getRequestBody', Handlebars.template(nodeGetRequestBody)); - Handlebars.registerPartial('node/getResponseBody', Handlebars.template(nodeGetResponseBody)); - Handlebars.registerPartial('node/getResponseHeader', Handlebars.template(nodeGetResponseHeader)); - Handlebars.registerPartial('node/sendRequest', Handlebars.template(nodeSendRequest)); - Handlebars.registerPartial('node/request', Handlebars.template(nodeRequest)); + // Specific files for the node client implementation + Handlebars.registerPartial('node/getHeaders', Handlebars.template(nodeGetHeaders)); + Handlebars.registerPartial('node/getRequestBody', Handlebars.template(nodeGetRequestBody)); + Handlebars.registerPartial('node/getResponseBody', Handlebars.template(nodeGetResponseBody)); + Handlebars.registerPartial('node/getResponseHeader', Handlebars.template(nodeGetResponseHeader)); + Handlebars.registerPartial('node/sendRequest', Handlebars.template(nodeSendRequest)); + Handlebars.registerPartial('node/request', Handlebars.template(nodeRequest)); - // Specific files for the axios client implementation - Handlebars.registerPartial('axios/getHeaders', Handlebars.template(axiosGetHeaders)); - Handlebars.registerPartial('axios/getRequestBody', Handlebars.template(axiosGetRequestBody)); - Handlebars.registerPartial('axios/getResponseBody', Handlebars.template(axiosGetResponseBody)); - Handlebars.registerPartial('axios/getResponseHeader', Handlebars.template(axiosGetResponseHeader)); - Handlebars.registerPartial('axios/sendRequest', Handlebars.template(axiosSendRequest)); - Handlebars.registerPartial('axios/request', Handlebars.template(axiosRequest)); + // Specific files for the axios client implementation + Handlebars.registerPartial('axios/getHeaders', Handlebars.template(axiosGetHeaders)); + Handlebars.registerPartial('axios/getRequestBody', Handlebars.template(axiosGetRequestBody)); + Handlebars.registerPartial('axios/getResponseBody', Handlebars.template(axiosGetResponseBody)); + Handlebars.registerPartial('axios/getResponseHeader', Handlebars.template(axiosGetResponseHeader)); + Handlebars.registerPartial('axios/sendRequest', Handlebars.template(axiosSendRequest)); + Handlebars.registerPartial('axios/request', Handlebars.template(axiosRequest)); - return templates; + return templates; }; diff --git a/src/utils/reservedWords.ts b/src/utils/reservedWords.ts index 4c385c17c..d94f14cb2 100644 --- a/src/utils/reservedWords.ts +++ b/src/utils/reservedWords.ts @@ -1,2 +1,2 @@ export const reservedWords = - /^(arguments|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|eval|export|extends|false|finally|for|function|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)$/g; + /^(arguments|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|eval|export|extends|false|finally|for|function|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)$/g; diff --git a/src/utils/sort.spec.ts b/src/utils/sort.spec.ts index 7d89ff1a5..94f163941 100644 --- a/src/utils/sort.spec.ts +++ b/src/utils/sort.spec.ts @@ -1,10 +1,10 @@ import { sort } from './sort'; describe('sort', () => { - it('should return correct index', () => { - expect(sort('a', 'b')).toEqual(-1); - expect(sort('b', 'a')).toEqual(1); - expect(sort('a', 'a')).toEqual(0); - expect(sort('', '')).toEqual(0); - }); + it('should return correct index', () => { + expect(sort('a', 'b')).toEqual(-1); + expect(sort('b', 'a')).toEqual(1); + expect(sort('a', 'a')).toEqual(0); + expect(sort('', '')).toEqual(0); + }); }); diff --git a/src/utils/sort.ts b/src/utils/sort.ts index 1d76998f4..d0f6397e6 100644 --- a/src/utils/sort.ts +++ b/src/utils/sort.ts @@ -1,5 +1,5 @@ export const sort = (a: string, b: string): number => { - const nameA = a.toLowerCase(); - const nameB = b.toLowerCase(); - return nameA.localeCompare(nameB, 'en'); + const nameA = a.toLowerCase(); + const nameB = b.toLowerCase(); + return nameA.localeCompare(nameB, 'en'); }; diff --git a/src/utils/sortModelsByName.spec.ts b/src/utils/sortModelsByName.spec.ts index ab57a7d98..ef8ff2e47 100644 --- a/src/utils/sortModelsByName.spec.ts +++ b/src/utils/sortModelsByName.spec.ts @@ -2,61 +2,61 @@ import type { Model } from '../client/interfaces/Model'; import { sortModelsByName } from './sortModelsByName'; describe('sortModelsByName', () => { - it('should return sorted list', () => { - const john: Model = { - export: 'interface', - name: 'John', - type: 'John', - base: 'John', - template: null, - link: null, - description: null, - isDefinition: true, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }; - const jane: Model = { - export: 'interface', - name: 'Jane', - type: 'Jane', - base: 'Jane', - template: null, - link: null, - description: null, - isDefinition: true, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }; - const doe: Model = { - export: 'interface', - name: 'Doe', - type: 'Doe', - base: 'Doe', - template: null, - link: null, - description: null, - isDefinition: true, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }; - const models: Model[] = [john, jane, doe]; + it('should return sorted list', () => { + const john: Model = { + export: 'interface', + name: 'John', + type: 'John', + base: 'John', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const jane: Model = { + export: 'interface', + name: 'Jane', + type: 'Jane', + base: 'Jane', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const doe: Model = { + export: 'interface', + name: 'Doe', + type: 'Doe', + base: 'Doe', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }; + const models: Model[] = [john, jane, doe]; - expect(sortModelsByName([])).toEqual([]); - expect(sortModelsByName(models)).toEqual([doe, jane, john]); - }); + expect(sortModelsByName([])).toEqual([]); + expect(sortModelsByName(models)).toEqual([doe, jane, john]); + }); }); diff --git a/src/utils/sortModelsByName.ts b/src/utils/sortModelsByName.ts index 33fae3990..236b4ff94 100644 --- a/src/utils/sortModelsByName.ts +++ b/src/utils/sortModelsByName.ts @@ -1,9 +1,9 @@ import type { Model } from '../client/interfaces/Model'; export const sortModelsByName = (models: Model[]): Model[] => { - return models.sort((a, b) => { - const nameA = a.name.toLowerCase(); - const nameB = b.name.toLowerCase(); - return nameA.localeCompare(nameB, 'en'); - }); + return models.sort((a, b) => { + const nameA = a.name.toLowerCase(); + const nameB = b.name.toLowerCase(); + return nameA.localeCompare(nameB, 'en'); + }); }; diff --git a/src/utils/sortServicesByName.spec.ts b/src/utils/sortServicesByName.spec.ts index bcce6c4ee..ca2099a33 100644 --- a/src/utils/sortServicesByName.spec.ts +++ b/src/utils/sortServicesByName.spec.ts @@ -2,26 +2,26 @@ import type { Service } from '../client/interfaces/Service'; import { sortServicesByName } from './sortServicesByName'; describe('sortServicesByName', () => { - it('should return sorted list', () => { - const john: Service = { - name: 'John', - operations: [], - imports: [], - }; - const jane: Service = { - name: 'Jane', - operations: [], - imports: [], - }; - const doe: Service = { - name: 'Doe', - operations: [], - imports: [], - }; + it('should return sorted list', () => { + const john: Service = { + name: 'John', + operations: [], + imports: [], + }; + const jane: Service = { + name: 'Jane', + operations: [], + imports: [], + }; + const doe: Service = { + name: 'Doe', + operations: [], + imports: [], + }; - const services: Service[] = [john, jane, doe]; + const services: Service[] = [john, jane, doe]; - expect(sortServicesByName([])).toEqual([]); - expect(sortServicesByName(services)).toEqual([doe, jane, john]); - }); + expect(sortServicesByName([])).toEqual([]); + expect(sortServicesByName(services)).toEqual([doe, jane, john]); + }); }); diff --git a/src/utils/sortServicesByName.ts b/src/utils/sortServicesByName.ts index 4bbef1269..03834024a 100644 --- a/src/utils/sortServicesByName.ts +++ b/src/utils/sortServicesByName.ts @@ -1,9 +1,9 @@ import type { Service } from '../client/interfaces/Service'; export const sortServicesByName = (services: Service[]): Service[] => { - return services.sort((a, b) => { - const nameA = a.name.toLowerCase(); - const nameB = b.name.toLowerCase(); - return nameA.localeCompare(nameB, 'en'); - }); + return services.sort((a, b) => { + const nameA = a.name.toLowerCase(); + const nameB = b.name.toLowerCase(); + return nameA.localeCompare(nameB, 'en'); + }); }; diff --git a/src/utils/types.d.ts b/src/utils/types.d.ts index c9785159e..3d1d2aab3 100644 --- a/src/utils/types.d.ts +++ b/src/utils/types.d.ts @@ -1,3 +1,3 @@ export interface Dictionary { - [key: string]: T; + [key: string]: T; } diff --git a/src/utils/unique.spec.ts b/src/utils/unique.spec.ts index f4bb98238..935487c29 100644 --- a/src/utils/unique.spec.ts +++ b/src/utils/unique.spec.ts @@ -1,12 +1,12 @@ import { unique } from './unique'; describe('unique', () => { - it('should return correct index', () => { - expect(unique('a', 0, ['a', 'b', 'c'])).toBeTruthy(); - expect(unique('a', 1, ['a', 'b', 'c'])).toBeFalsy(); - expect(unique('a', 2, ['a', 'b', 'c'])).toBeFalsy(); - expect(unique('a', 0, ['a', 'b', 'c'])).toBeTruthy(); - expect(unique('a', 1, ['z', 'a', 'b'])).toBeTruthy(); - expect(unique('a', 2, ['y', 'z', 'a'])).toBeTruthy(); - }); + it('should return correct index', () => { + expect(unique('a', 0, ['a', 'b', 'c'])).toBeTruthy(); + expect(unique('a', 1, ['a', 'b', 'c'])).toBeFalsy(); + expect(unique('a', 2, ['a', 'b', 'c'])).toBeFalsy(); + expect(unique('a', 0, ['a', 'b', 'c'])).toBeTruthy(); + expect(unique('a', 1, ['z', 'a', 'b'])).toBeTruthy(); + expect(unique('a', 2, ['y', 'z', 'a'])).toBeTruthy(); + }); }); diff --git a/src/utils/unique.ts b/src/utils/unique.ts index 65c0f7c7a..42094a854 100644 --- a/src/utils/unique.ts +++ b/src/utils/unique.ts @@ -1,3 +1,3 @@ export const unique = (val: T, index: number, arr: T[]): boolean => { - return arr.indexOf(val) === index; + return arr.indexOf(val) === index; }; diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 7aeb31c03..dcc516306 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -8,51 +8,51 @@ import { writeClient } from './writeClient'; jest.mock('./fileSystem'); describe('writeClient', () => { - it('should write to filesystem', async () => { - const client: Client = { - server: 'http://localhost:8080', - version: 'v1', - models: [], - services: [], - }; + it('should write to filesystem', async () => { + const client: Client = { + server: 'http://localhost:8080', + version: 'v1', + models: [], + services: [], + }; - const templates: Templates = { - index: () => 'index', - client: () => 'client', - exports: { - model: () => 'model', - schema: () => 'schema', - service: () => 'service', - }, - core: { - settings: () => 'settings', - apiError: () => 'apiError', - apiRequestOptions: () => 'apiRequestOptions', - apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', - request: () => 'request', - baseHttpRequest: () => 'baseHttpRequest', - httpRequest: () => 'httpRequest', - }, - }; + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; - await writeClient( - client, - templates, - './dist', - HttpClient.FETCH, - false, - true, - true, - true, - true, - Indent.SPACE_4, - 'Service', - 'AppClient' - ); + await writeClient( + client, + templates, + './dist', + HttpClient.FETCH, + false, + true, + true, + true, + true, + Indent.SPACE_4, + 'Service', + 'AppClient', + ); - expect(rmdir).toBeCalled(); - expect(mkdir).toBeCalled(); - expect(writeFile).toBeCalled(); - }); + expect(rmdir).toBeCalled(); + expect(mkdir).toBeCalled(); + expect(writeFile).toBeCalled(); + }); }); diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index 9b3b7261c..b6fcac32b 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -33,82 +33,82 @@ import { writeClientServices } from './writeClientServices'; * @param request Path to custom request file */ export const writeClient = async ( - client: Client, - templates: Templates, - output: string, - httpClient: HttpClient, - useOptions: boolean, - exportCore: boolean, - exportServices: boolean, - exportModels: boolean, - exportSchemas: boolean, - indent: Indent, - postfixServices: string, - postfixModels: string, - clientName?: string, - request?: string + client: Client, + templates: Templates, + output: string, + httpClient: HttpClient, + useOptions: boolean, + exportCore: boolean, + exportServices: boolean, + exportModels: boolean, + exportSchemas: boolean, + indent: Indent, + postfixServices: string, + postfixModels: string, + clientName?: string, + request?: string, ): Promise => { - const outputPath = resolve(process.cwd(), output); - const outputPathCore = resolve(outputPath, 'core'); - const outputPathModels = resolve(outputPath, 'models'); - const outputPathSchemas = resolve(outputPath, 'schemas'); - const outputPathServices = resolve(outputPath, 'services'); + const outputPath = resolve(process.cwd(), output); + const outputPathCore = resolve(outputPath, 'core'); + const outputPathModels = resolve(outputPath, 'models'); + const outputPathSchemas = resolve(outputPath, 'schemas'); + const outputPathServices = resolve(outputPath, 'services'); - if (!isSubDirectory(process.cwd(), output)) { - throw new Error(`Output folder is not a subdirectory of the current working directory`); - } + if (!isSubDirectory(process.cwd(), output)) { + throw new Error(`Output folder is not a subdirectory of the current working directory`); + } - if (exportCore) { - await rmdir(outputPathCore); - await mkdir(outputPathCore); - await writeClientCore(client, templates, outputPathCore, httpClient, indent, clientName, request); - } + if (exportCore) { + await rmdir(outputPathCore); + await mkdir(outputPathCore); + await writeClientCore(client, templates, outputPathCore, httpClient, indent, clientName, request); + } - if (exportServices) { - await rmdir(outputPathServices); - await mkdir(outputPathServices); - await writeClientServices( - client.services, - templates, - outputPathServices, - httpClient, - useOptions, - indent, - postfixServices, - clientName - ); - } + if (exportServices) { + await rmdir(outputPathServices); + await mkdir(outputPathServices); + await writeClientServices( + client.services, + templates, + outputPathServices, + httpClient, + useOptions, + indent, + postfixServices, + clientName, + ); + } - if (exportSchemas) { - await rmdir(outputPathSchemas); - await mkdir(outputPathSchemas); - await writeClientSchemas(client.models, templates, outputPathSchemas, httpClient, indent); - } + if (exportSchemas) { + await rmdir(outputPathSchemas); + await mkdir(outputPathSchemas); + await writeClientSchemas(client.models, templates, outputPathSchemas, httpClient, indent); + } - if (exportModels) { - await rmdir(outputPathModels); - await mkdir(outputPathModels); - await writeClientModels(client.models, templates, outputPathModels, httpClient, indent); - } + if (exportModels) { + await rmdir(outputPathModels); + await mkdir(outputPathModels); + await writeClientModels(client.models, templates, outputPathModels, httpClient, indent); + } - if (isDefined(clientName)) { - await mkdir(outputPath); - await writeClientClass(client, templates, outputPath, httpClient, clientName, indent, postfixServices); - } + if (isDefined(clientName)) { + await mkdir(outputPath); + await writeClientClass(client, templates, outputPath, httpClient, clientName, indent, postfixServices); + } - if (exportCore || exportServices || exportSchemas || exportModels) { - await mkdir(outputPath); - await writeClientIndex( - client, - templates, - outputPath, - exportCore, - exportServices, - exportModels, - exportSchemas, - postfixServices, - postfixModels, - clientName - ); - } + if (exportCore || exportServices || exportSchemas || exportModels) { + await mkdir(outputPath); + await writeClientIndex( + client, + templates, + outputPath, + exportCore, + exportServices, + exportModels, + exportSchemas, + postfixServices, + postfixModels, + clientName, + ); + } }; diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts index 102f2eb57..698a28608 100644 --- a/src/utils/writeClientClass.spec.ts +++ b/src/utils/writeClientClass.spec.ts @@ -8,36 +8,36 @@ import { writeClientClass } from './writeClientClass'; jest.mock('./fileSystem'); describe('writeClientClass', () => { - it('should write to filesystem', async () => { - const client: Client = { - server: 'http://localhost:8080', - version: 'v1', - models: [], - services: [], - }; + it('should write to filesystem', async () => { + const client: Client = { + server: 'http://localhost:8080', + version: 'v1', + models: [], + services: [], + }; - const templates: Templates = { - index: () => 'index', - client: () => 'client', - exports: { - model: () => 'model', - schema: () => 'schema', - service: () => 'service', - }, - core: { - settings: () => 'settings', - apiError: () => 'apiError', - apiRequestOptions: () => 'apiRequestOptions', - apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', - request: () => 'request', - baseHttpRequest: () => 'baseHttpRequest', - httpRequest: () => 'httpRequest', - }, - }; + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; - await writeClientClass(client, templates, './dist', HttpClient.FETCH, 'AppClient', Indent.SPACE_4, ''); + await writeClientClass(client, templates, './dist', HttpClient.FETCH, 'AppClient', Indent.SPACE_4, ''); - expect(writeFile).toBeCalled(); - }); + expect(writeFile).toBeCalled(); + }); }); diff --git a/src/utils/writeClientClass.ts b/src/utils/writeClientClass.ts index 558150bb4..eaa668696 100644 --- a/src/utils/writeClientClass.ts +++ b/src/utils/writeClientClass.ts @@ -24,24 +24,24 @@ import { sortServicesByName } from './sortServicesByName'; * @param postfix Service name postfix */ export const writeClientClass = async ( - client: Client, - templates: Templates, - outputPath: string, - httpClient: HttpClient, - clientName: string, - indent: Indent, - postfix: string + client: Client, + templates: Templates, + outputPath: string, + httpClient: HttpClient, + clientName: string, + indent: Indent, + postfix: string, ): Promise => { - const templateResult = templates.client({ - clientName, - httpClient, - postfix, - server: client.server, - version: client.version, - models: sortModelsByName(client.models), - services: sortServicesByName(client.services), - httpRequest: getHttpRequestName(httpClient), - }); + const templateResult = templates.client({ + clientName, + httpClient, + postfix, + server: client.server, + version: client.version, + models: sortModelsByName(client.models), + services: sortServicesByName(client.services), + httpRequest: getHttpRequestName(httpClient), + }); - await writeFile(resolve(outputPath, `${clientName}.ts`), i(f(templateResult), indent)); + await writeFile(resolve(outputPath, `${clientName}.ts`), i(f(templateResult), indent)); }; diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index 7db71f59b..613a9ff01 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -11,41 +11,41 @@ import { writeClientCore } from './writeClientCore'; jest.mock('./fileSystem'); describe('writeClientCore', () => { - it('should write to filesystem', async () => { - const client: Client = { - server: 'http://localhost:8080', - version: '1.0', - models: [], - services: [], - }; + it('should write to filesystem', async () => { + const client: Client = { + server: 'http://localhost:8080', + version: '1.0', + models: [], + services: [], + }; - const templates: Templates = { - index: () => 'index', - client: () => 'client', - exports: { - model: () => 'model', - schema: () => 'schema', - service: () => 'service', - }, - core: { - settings: () => 'settings', - apiError: () => 'apiError', - apiRequestOptions: () => 'apiRequestOptions', - apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', - request: () => 'request', - baseHttpRequest: () => 'baseHttpRequest', - httpRequest: () => 'httpRequest', - }, - }; + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; - await writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4); + await writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4); - expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/ApiRequestOptions.ts'), `apiRequestOptions${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/CancelablePromise.ts'), `cancelablePromise${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); - }); + expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiRequestOptions.ts'), `apiRequestOptions${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/CancelablePromise.ts'), `cancelablePromise${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); + }); }); diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts index 6d35849d2..082c028a7 100644 --- a/src/utils/writeClientCore.ts +++ b/src/utils/writeClientCore.ts @@ -20,41 +20,41 @@ import type { Templates } from './registerHandlebarTemplates'; * @param request Path to custom request file */ export const writeClientCore = async ( - client: Client, - templates: Templates, - outputPath: string, - httpClient: HttpClient, - indent: Indent, - clientName?: string, - request?: string + client: Client, + templates: Templates, + outputPath: string, + httpClient: HttpClient, + indent: Indent, + clientName?: string, + request?: string, ): Promise => { - const httpRequest = getHttpRequestName(httpClient); - const context = { - httpClient, - clientName, - httpRequest, - server: client.server, - version: client.version, - }; + const httpRequest = getHttpRequestName(httpClient); + const context = { + httpClient, + clientName, + httpRequest, + server: client.server, + version: client.version, + }; - await writeFile(resolve(outputPath, 'OpenAPI.ts'), i(templates.core.settings(context), indent)); - await writeFile(resolve(outputPath, 'ApiError.ts'), i(templates.core.apiError(context), indent)); - await writeFile(resolve(outputPath, 'ApiRequestOptions.ts'), i(templates.core.apiRequestOptions(context), indent)); - await writeFile(resolve(outputPath, 'ApiResult.ts'), i(templates.core.apiResult(context), indent)); - await writeFile(resolve(outputPath, 'CancelablePromise.ts'), i(templates.core.cancelablePromise(context), indent)); - await writeFile(resolve(outputPath, 'request.ts'), i(templates.core.request(context), indent)); + await writeFile(resolve(outputPath, 'OpenAPI.ts'), i(templates.core.settings(context), indent)); + await writeFile(resolve(outputPath, 'ApiError.ts'), i(templates.core.apiError(context), indent)); + await writeFile(resolve(outputPath, 'ApiRequestOptions.ts'), i(templates.core.apiRequestOptions(context), indent)); + await writeFile(resolve(outputPath, 'ApiResult.ts'), i(templates.core.apiResult(context), indent)); + await writeFile(resolve(outputPath, 'CancelablePromise.ts'), i(templates.core.cancelablePromise(context), indent)); + await writeFile(resolve(outputPath, 'request.ts'), i(templates.core.request(context), indent)); - if (isDefined(clientName)) { - await writeFile(resolve(outputPath, 'BaseHttpRequest.ts'), i(templates.core.baseHttpRequest(context), indent)); - await writeFile(resolve(outputPath, `${httpRequest}.ts`), i(templates.core.httpRequest(context), indent)); - } + if (isDefined(clientName)) { + await writeFile(resolve(outputPath, 'BaseHttpRequest.ts'), i(templates.core.baseHttpRequest(context), indent)); + await writeFile(resolve(outputPath, `${httpRequest}.ts`), i(templates.core.httpRequest(context), indent)); + } - if (request) { - const requestFile = resolve(process.cwd(), request); - const requestFileExists = await exists(requestFile); - if (!requestFileExists) { - throw new Error(`Custom request file "${requestFile}" does not exists`); - } - await copyFile(requestFile, resolve(outputPath, 'request.ts')); + if (request) { + const requestFile = resolve(process.cwd(), request); + const requestFileExists = await exists(requestFile); + if (!requestFileExists) { + throw new Error(`Custom request file "${requestFile}" does not exists`); } + await copyFile(requestFile, resolve(outputPath, 'request.ts')); + } }; diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index 5dfebd29f..6336f581a 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -8,36 +8,36 @@ import { writeClientIndex } from './writeClientIndex'; jest.mock('./fileSystem'); describe('writeClientIndex', () => { - it('should write to filesystem', async () => { - const client: Client = { - server: 'http://localhost:8080', - version: '1.0', - models: [], - services: [], - }; + it('should write to filesystem', async () => { + const client: Client = { + server: 'http://localhost:8080', + version: '1.0', + models: [], + services: [], + }; - const templates: Templates = { - index: () => 'index', - client: () => 'client', - exports: { - model: () => 'model', - schema: () => 'schema', - service: () => 'service', - }, - core: { - settings: () => 'settings', - apiError: () => 'apiError', - apiRequestOptions: () => 'apiRequestOptions', - apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', - request: () => 'request', - baseHttpRequest: () => 'baseHttpRequest', - httpRequest: () => 'httpRequest', - }, - }; + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; - await writeClientIndex(client, templates, '/', true, true, true, true, 'Service', ''); + await writeClientIndex(client, templates, '/', true, true, true, true, 'Service', ''); - expect(writeFile).toBeCalledWith(resolve('/', '/index.ts'), 'index'); - }); + expect(writeFile).toBeCalledWith(resolve('/', '/index.ts'), 'index'); + }); }); diff --git a/src/utils/writeClientIndex.ts b/src/utils/writeClientIndex.ts index 4eb1ca250..1f417b8bc 100644 --- a/src/utils/writeClientIndex.ts +++ b/src/utils/writeClientIndex.ts @@ -23,31 +23,31 @@ import { sortServicesByName } from './sortServicesByName'; * @param clientName Custom client class name */ export const writeClientIndex = async ( - client: Client, - templates: Templates, - outputPath: string, - exportCore: boolean, - exportServices: boolean, - exportModels: boolean, - exportSchemas: boolean, - postfixServices: string, - postfixModels: string, - clientName?: string + client: Client, + templates: Templates, + outputPath: string, + exportCore: boolean, + exportServices: boolean, + exportModels: boolean, + exportSchemas: boolean, + postfixServices: string, + postfixModels: string, + clientName?: string, ): Promise => { - const templateResult = templates.index({ - exportCore, - exportServices, - exportModels, - exportSchemas, - postfixServices, - postfixModels, - clientName, - server: client.server, - version: client.version, - models: sortModelsByName(client.models), - services: sortServicesByName(client.services), - exportClient: isDefined(clientName), - }); + const templateResult = templates.index({ + exportCore, + exportServices, + exportModels, + exportSchemas, + postfixServices, + postfixModels, + clientName, + server: client.server, + version: client.version, + models: sortModelsByName(client.models), + services: sortServicesByName(client.services), + exportClient: isDefined(clientName), + }); - await writeFile(resolve(outputPath, 'index.ts'), templateResult); + await writeFile(resolve(outputPath, 'index.ts'), templateResult); }; diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index 166ac8f50..6b6ff227a 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -11,49 +11,49 @@ import { writeClientModels } from './writeClientModels'; jest.mock('./fileSystem'); describe('writeClientModels', () => { - it('should write to filesystem', async () => { - const models: Model[] = [ - { - export: 'interface', - name: 'User', - type: 'User', - base: 'User', - template: null, - link: null, - description: null, - isDefinition: true, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }, - ]; + it('should write to filesystem', async () => { + const models: Model[] = [ + { + export: 'interface', + name: 'User', + type: 'User', + base: 'User', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }, + ]; - const templates: Templates = { - index: () => 'index', - client: () => 'client', - exports: { - model: () => 'model', - schema: () => 'schema', - service: () => 'service', - }, - core: { - settings: () => 'settings', - apiError: () => 'apiError', - apiRequestOptions: () => 'apiRequestOptions', - apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', - request: () => 'request', - baseHttpRequest: () => 'baseHttpRequest', - httpRequest: () => 'httpRequest', - }, - }; + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; - await writeClientModels(models, templates, '/', HttpClient.FETCH, Indent.SPACE_4); + await writeClientModels(models, templates, '/', HttpClient.FETCH, Indent.SPACE_4); - expect(writeFile).toBeCalledWith(resolve('/', '/User.ts'), `model${EOL}`); - }); + expect(writeFile).toBeCalledWith(resolve('/', '/User.ts'), `model${EOL}`); + }); }); diff --git a/src/utils/writeClientModels.ts b/src/utils/writeClientModels.ts index 915c6f7a3..29f52fac6 100644 --- a/src/utils/writeClientModels.ts +++ b/src/utils/writeClientModels.ts @@ -17,18 +17,18 @@ import type { Templates } from './registerHandlebarTemplates'; * @param indent Indentation options (4, 2 or tab) */ export const writeClientModels = async ( - models: Model[], - templates: Templates, - outputPath: string, - httpClient: HttpClient, - indent: Indent + models: Model[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + indent: Indent, ): Promise => { - for (const model of models) { - const file = resolve(outputPath, `${model.name}.ts`); - const templateResult = templates.exports.model({ - ...model, - httpClient, - }); - await writeFile(file, i(f(templateResult), indent)); - } + for (const model of models) { + const file = resolve(outputPath, `${model.name}.ts`); + const templateResult = templates.exports.model({ + ...model, + httpClient, + }); + await writeFile(file, i(f(templateResult), indent)); + } }; diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index c6cb3262d..256b87a4e 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -11,49 +11,49 @@ import { writeClientSchemas } from './writeClientSchemas'; jest.mock('./fileSystem'); describe('writeClientSchemas', () => { - it('should write to filesystem', async () => { - const models: Model[] = [ - { - export: 'interface', - name: 'User', - type: 'User', - base: 'User', - template: null, - link: null, - description: null, - isDefinition: true, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }, - ]; + it('should write to filesystem', async () => { + const models: Model[] = [ + { + export: 'interface', + name: 'User', + type: 'User', + base: 'User', + template: null, + link: null, + description: null, + isDefinition: true, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }, + ]; - const templates: Templates = { - index: () => 'index', - client: () => 'client', - exports: { - model: () => 'model', - schema: () => 'schema', - service: () => 'service', - }, - core: { - settings: () => 'settings', - apiError: () => 'apiError', - apiRequestOptions: () => 'apiRequestOptions', - apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', - request: () => 'request', - baseHttpRequest: () => 'baseHttpRequest', - httpRequest: () => 'httpRequest', - }, - }; + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; - await writeClientSchemas(models, templates, '/', HttpClient.FETCH, Indent.SPACE_4); + await writeClientSchemas(models, templates, '/', HttpClient.FETCH, Indent.SPACE_4); - expect(writeFile).toBeCalledWith(resolve('/', '/$User.ts'), `schema${EOL}`); - }); + expect(writeFile).toBeCalledWith(resolve('/', '/$User.ts'), `schema${EOL}`); + }); }); diff --git a/src/utils/writeClientSchemas.ts b/src/utils/writeClientSchemas.ts index c2456fdd6..9323de388 100644 --- a/src/utils/writeClientSchemas.ts +++ b/src/utils/writeClientSchemas.ts @@ -17,18 +17,18 @@ import type { Templates } from './registerHandlebarTemplates'; * @param indent Indentation options (4, 2 or tab) */ export const writeClientSchemas = async ( - models: Model[], - templates: Templates, - outputPath: string, - httpClient: HttpClient, - indent: Indent + models: Model[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + indent: Indent, ): Promise => { - for (const model of models) { - const file = resolve(outputPath, `$${model.name}.ts`); - const templateResult = templates.exports.schema({ - ...model, - httpClient, - }); - await writeFile(file, i(f(templateResult), indent)); - } + for (const model of models) { + const file = resolve(outputPath, `$${model.name}.ts`); + const templateResult = templates.exports.schema({ + ...model, + httpClient, + }); + await writeFile(file, i(f(templateResult), indent)); + } }; diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index 3ba5e064c..1bb7e518b 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -11,37 +11,37 @@ import { writeClientServices } from './writeClientServices'; jest.mock('./fileSystem'); describe('writeClientServices', () => { - it('should write to filesystem', async () => { - const services: Service[] = [ - { - name: 'User', - operations: [], - imports: [], - }, - ]; + it('should write to filesystem', async () => { + const services: Service[] = [ + { + name: 'User', + operations: [], + imports: [], + }, + ]; - const templates: Templates = { - index: () => 'index', - client: () => 'client', - exports: { - model: () => 'model', - schema: () => 'schema', - service: () => 'service', - }, - core: { - settings: () => 'settings', - apiError: () => 'apiError', - apiRequestOptions: () => 'apiRequestOptions', - apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', - request: () => 'request', - baseHttpRequest: () => 'baseHttpRequest', - httpRequest: () => 'httpRequest', - }, - }; + const templates: Templates = { + index: () => 'index', + client: () => 'client', + exports: { + model: () => 'model', + schema: () => 'schema', + service: () => 'service', + }, + core: { + settings: () => 'settings', + apiError: () => 'apiError', + apiRequestOptions: () => 'apiRequestOptions', + apiResult: () => 'apiResult', + cancelablePromise: () => 'cancelablePromise', + request: () => 'request', + baseHttpRequest: () => 'baseHttpRequest', + httpRequest: () => 'httpRequest', + }, + }; - await writeClientServices(services, templates, '/', HttpClient.FETCH, false, Indent.SPACE_4, 'Service'); + await writeClientServices(services, templates, '/', HttpClient.FETCH, false, Indent.SPACE_4, 'Service'); - expect(writeFile).toBeCalledWith(resolve('/', '/UserService.ts'), `service${EOL}`); - }); + expect(writeFile).toBeCalledWith(resolve('/', '/UserService.ts'), `service${EOL}`); + }); }); diff --git a/src/utils/writeClientServices.ts b/src/utils/writeClientServices.ts index 826257c35..bcab7fad5 100644 --- a/src/utils/writeClientServices.ts +++ b/src/utils/writeClientServices.ts @@ -21,24 +21,24 @@ import type { Templates } from './registerHandlebarTemplates'; * @param clientName Custom client class name */ export const writeClientServices = async ( - services: Service[], - templates: Templates, - outputPath: string, - httpClient: HttpClient, - useOptions: boolean, - indent: Indent, - postfix: string, - clientName?: string + services: Service[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + useOptions: boolean, + indent: Indent, + postfix: string, + clientName?: string, ): Promise => { - for (const service of services) { - const file = resolve(outputPath, `${service.name}${postfix}.ts`); - const templateResult = templates.exports.service({ - ...service, - httpClient, - useOptions, - postfix, - exportClient: isDefined(clientName), - }); - await writeFile(file, i(f(templateResult), indent)); - } + for (const service of services) { + const file = resolve(outputPath, `${service.name}${postfix}.ts`); + const templateResult = templates.exports.service({ + ...service, + httpClient, + useOptions, + postfix, + exportClient: isDefined(clientName), + }); + await writeFile(file, i(f(templateResult), indent)); + } }; diff --git a/test/custom/request.ts b/test/custom/request.ts index 8252ea396..c6854140d 100644 --- a/test/custom/request.ts +++ b/test/custom/request.ts @@ -3,29 +3,29 @@ import { CancelablePromise } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { - return new CancelablePromise((resolve, reject, onCancel) => { - const url = `${config.BASE}${options.path}`.replace('{api-version}', config.VERSION); + return new CancelablePromise((resolve, reject, onCancel) => { + const url = `${config.BASE}${options.path}`.replace('{api-version}', config.VERSION); - try { - // Do your request... - const timeout = setTimeout(() => { - resolve({ - url, - ok: true, - status: 200, - statusText: 'dummy', - body: { - ...options, - }, - }); - }, 500); + try { + // Do your request... + const timeout = setTimeout(() => { + resolve({ + url, + ok: true, + status: 200, + statusText: 'dummy', + body: { + ...options, + }, + }); + }, 500); - // Cancel your request... - onCancel(() => { - clearTimeout(timeout); - }); - } catch (e) { - reject(e); - } - }); + // Cancel your request... + onCancel(() => { + clearTimeout(timeout); + }); + } catch (e) { + reject(e); + } + }); }; diff --git a/test/e2e/client.axios.spec.ts b/test/e2e/client.axios.spec.ts index a0ba54750..4d8d2101b 100644 --- a/test/e2e/client.axios.spec.ts +++ b/test/e2e/client.axios.spec.ts @@ -4,148 +4,148 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('client.axios', () => { - beforeAll(async () => { - cleanup('client/axios'); - await generateClient('client/axios', 'v3', 'axios', false, false, 'ApiClient'); - compileWithTypescript('client/axios'); - await server.start('client/axios'); - }, 30000); + beforeAll(async () => { + cleanup('client/axios'); + await generateClient('client/axios', 'v3', 'axios', false, false, 'ApiClient'); + compileWithTypescript('client/axios'); + await server.start('client/axios'); + }, 30000); - afterAll(async () => { - await server.stop(); - }); + afterAll(async () => { + await server.stop(); + }); - it('requests token', async () => { - const { ApiClient } = require('./generated/client/axios/index.js'); - const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); - const client = new ApiClient({ - TOKEN: tokenRequest, - USERNAME: undefined, - PASSWORD: undefined, - }); - const result = await client.simple.getCallWithoutParametersAndResponse(); - expect(tokenRequest.mock.calls.length).toBe(1); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + const { ApiClient } = require('./generated/client/axios/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + const client = new ApiClient({ + TOKEN: tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, }); + const result = await client.simple.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const { ApiClient } = require('./generated/client/axios/index.js'); - const client = new ApiClient({ - TOKEN: undefined, - USERNAME: 'username', - PASSWORD: 'password', - }); - const result = await client.simple.getCallWithoutParametersAndResponse(); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + it('uses credentials', async () => { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', }); + const result = await client.simple.getCallWithoutParametersAndResponse(); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const { ApiClient } = require('./generated/client/axios/index.js'); - const client = new ApiClient(); - const result = await client.complex.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + const result = await client.complex.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, }); + expect(result).toBeDefined(); + }); - it('supports form data', async () => { - const { ApiClient } = require('./generated/client/axios/index.js'); - const client = new ApiClient(); - const result = await client.parameters.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ); - expect(result).toBeDefined(); - }); + it('supports form data', async () => { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + const result = await client.parameters.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + }, + ); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - const { ApiClient } = require('./generated/client/axios/index.js'); - const client = new ApiClient(); - const promise = client.simple.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - let error; - try { - const { ApiClient } = require('./generated/client/axios/index.js'); - const client = new ApiClient(); - await client.error.testErrorCode(500); - } catch (e) { - const err = e as any; - error = JSON.stringify({ - name: err.name, - message: err.message, - url: err.url, - status: err.status, - statusText: err.statusText, - body: err.body, - }); - } - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); - }); + it('should throw known error (500)', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + await client.error.testErrorCode(500); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); - it('should throw unknown error (409)', async () => { - let error; - try { - const { ApiClient } = require('./generated/client/axios/index.js'); - const client = new ApiClient(); - await client.error.testErrorCode(409); - } catch (e) { - const err = e as any; - error = JSON.stringify({ - name: err.name, - message: err.message, - url: err.url, - status: err.status, - statusText: err.statusText, - body: err.body, - }); - } - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); - }); + it('should throw unknown error (409)', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/axios/index.js'); + const client = new ApiClient(); + await client.error.testErrorCode(409); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); }); diff --git a/test/e2e/client.babel.spec.ts b/test/e2e/client.babel.spec.ts index 82320d1f9..760e49434 100644 --- a/test/e2e/client.babel.spec.ts +++ b/test/e2e/client.babel.spec.ts @@ -6,171 +6,171 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('client.babel', () => { - beforeAll(async () => { - cleanup('client/babel'); - await generateClient('client/babel', 'v3', 'fetch', true, true, 'ApiClient'); - copyAsset('index.html', 'client/babel/index.html'); - copyAsset('main.ts', 'client/babel/main.ts'); - compileWithBabel('client/babel'); - await server.start('client/babel'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('client/babel'); + await generateClient('client/babel', 'v3', 'fetch', true, true, 'ApiClient'); + copyAsset('index.html', 'client/babel/index.html'); + copyAsset('main.ts', 'client/babel/main.ts'); + compileWithBabel('client/babel'); + await server.start('client/babel'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient({ - TOKEN: (window as any).tokenRequest, - USERNAME: undefined, - PASSWORD: undefined, - }); - return await client.simple.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: (window as any).tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, + }); + return await client.simple.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient({ - TOKEN: undefined, - USERNAME: 'username', - PASSWORD: 'password', - }); - return await client.simple.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', + }); + return await client.simple.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - return await client.complex.complexTypes({ - parameterObject: { - first: { - second: { - third: 'Hello World!', - }, - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.complex.complexTypes({ + parameterObject: { + first: { + second: { + third: 'Hello World!', + }, + }, + }, + }); }); + expect(result).toBeDefined(); + }); - it('support form data', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - return await client.parameters.callWithParameters({ - parameterHeader: 'valueHeader', - parameterQuery: 'valueQuery', - parameterForm: 'valueForm', - parameterCookie: 'valueCookie', - parameterPath: 'valuePath', - requestBody: { - prop: 'valueBody', - }, - }); - }); - expect(result).toBeDefined(); + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.parameters.callWithParameters({ + parameterHeader: 'valueHeader', + parameterQuery: 'valueQuery', + parameterForm: 'valueForm', + parameterCookie: 'valueCookie', + parameterPath: 'valuePath', + requestBody: { + prop: 'valueBody', + }, + }); }); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - const promise = client.simple.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - }); - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - await client.error.testErrorCode({ - status: 500, - }); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode({ + status: 500, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); - it('should throw unknown error (409)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - await client.error.testErrorCode({ - status: 409, - }); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode({ + status: 409, + }); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); }); diff --git a/test/e2e/client.fetch.spec.ts b/test/e2e/client.fetch.spec.ts index 9a64284bd..818be6db1 100644 --- a/test/e2e/client.fetch.spec.ts +++ b/test/e2e/client.fetch.spec.ts @@ -6,166 +6,166 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('client.fetch', () => { - beforeAll(async () => { - cleanup('client/fetch'); - await generateClient('client/fetch', 'v3', 'fetch', false, false, 'ApiClient'); - copyAsset('index.html', 'client/fetch/index.html'); - copyAsset('main.ts', 'client/fetch/main.ts'); - compileWithTypescript('client/fetch'); - await server.start('client/fetch'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('client/fetch'); + await generateClient('client/fetch', 'v3', 'fetch', false, false, 'ApiClient'); + copyAsset('index.html', 'client/fetch/index.html'); + copyAsset('main.ts', 'client/fetch/main.ts'); + compileWithTypescript('client/fetch'); + await server.start('client/fetch'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient({ - TOKEN: (window as any).tokenRequest, - USERNAME: undefined, - PASSWORD: undefined, - }); - return await client.simple.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: (window as any).tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, + }); + return await client.simple.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient({ - TOKEN: undefined, - USERNAME: 'username', - PASSWORD: 'password', - }); - return await client.simple.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', + }); + return await client.simple.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - return await client.complex.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.complex.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); }); + expect(result).toBeDefined(); + }); - it('support form data', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - return await client.parameters.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ); - }); - expect(result).toBeDefined(); + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.parameters.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + }, + ); }); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - const promise = client.simple.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - }); - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - await client.error.testErrorCode(500); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode(500); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); + } + return; }); - it('should throw unknown error (409)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - await client.error.testErrorCode(409); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode(409); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); }); diff --git a/test/e2e/client.node.spec.ts b/test/e2e/client.node.spec.ts index 0d915919b..67fd6c685 100644 --- a/test/e2e/client.node.spec.ts +++ b/test/e2e/client.node.spec.ts @@ -4,148 +4,148 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('client.node', () => { - beforeAll(async () => { - cleanup('client/node'); - await generateClient('client/node', 'v3', 'node', false, false, 'ApiClient'); - compileWithTypescript('client/node'); - await server.start('client/node'); - }, 30000); + beforeAll(async () => { + cleanup('client/node'); + await generateClient('client/node', 'v3', 'node', false, false, 'ApiClient'); + compileWithTypescript('client/node'); + await server.start('client/node'); + }, 30000); - afterAll(async () => { - await server.stop(); - }); + afterAll(async () => { + await server.stop(); + }); - it('requests token', async () => { - const { ApiClient } = require('./generated/client/node/index.js'); - const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); - const client = new ApiClient({ - TOKEN: tokenRequest, - USERNAME: undefined, - PASSWORD: undefined, - }); - const result = await client.simple.getCallWithoutParametersAndResponse(); - expect(tokenRequest.mock.calls.length).toBe(1); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + const { ApiClient } = require('./generated/client/node/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + const client = new ApiClient({ + TOKEN: tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, }); + const result = await client.simple.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const { ApiClient } = require('./generated/client/node/index.js'); - const client = new ApiClient({ - TOKEN: undefined, - USERNAME: 'username', - PASSWORD: 'password', - }); - const result = await client.simple.getCallWithoutParametersAndResponse(); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + it('uses credentials', async () => { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', }); + const result = await client.simple.getCallWithoutParametersAndResponse(); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const { ApiClient } = require('./generated/client/node/index.js'); - const client = new ApiClient(); - const result = await client.complex.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + const result = await client.complex.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, }); + expect(result).toBeDefined(); + }); - it('support form data', async () => { - const { ApiClient } = require('./generated/client/node/index.js'); - const client = new ApiClient(); - const result = await client.parameters.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ); - expect(result).toBeDefined(); - }); + it('support form data', async () => { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + const result = await client.parameters.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + }, + ); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - const { ApiClient } = require('./generated/client/node/index.js'); - const client = new ApiClient(); - const promise = client.simple.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - let error; - try { - const { ApiClient } = require('./generated/client/node/index.js'); - const client = new ApiClient(); - await client.error.testErrorCode(500); - } catch (e) { - const err = e as any; - error = JSON.stringify({ - name: err.name, - message: err.message, - url: err.url, - status: err.status, - statusText: err.statusText, - body: err.body, - }); - } - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); - }); + it('should throw known error (500)', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + await client.error.testErrorCode(500); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); - it('should throw unknown error (409)', async () => { - let error; - try { - const { ApiClient } = require('./generated/client/node/index.js'); - const client = new ApiClient(); - await client.error.testErrorCode(409); - } catch (e) { - const err = e as any; - error = JSON.stringify({ - name: err.name, - message: err.message, - url: err.url, - status: err.status, - statusText: err.statusText, - body: err.body, - }); - } - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); - }); + it('should throw unknown error (409)', async () => { + let error; + try { + const { ApiClient } = require('./generated/client/node/index.js'); + const client = new ApiClient(); + await client.error.testErrorCode(409); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); }); diff --git a/test/e2e/client.xhr.spec.ts b/test/e2e/client.xhr.spec.ts index e0b516f39..e04e442c0 100644 --- a/test/e2e/client.xhr.spec.ts +++ b/test/e2e/client.xhr.spec.ts @@ -6,165 +6,165 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('client.xhr', () => { - beforeAll(async () => { - cleanup('client/xhr'); - await generateClient('client/xhr', 'v3', 'xhr', false, false, 'ApiClient'); - copyAsset('index.html', 'client/xhr/index.html'); - copyAsset('main.ts', 'client/xhr/main.ts'); - compileWithTypescript('client/xhr'); - await server.start('client/xhr'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('client/xhr'); + await generateClient('client/xhr', 'v3', 'xhr', false, false, 'ApiClient'); + copyAsset('index.html', 'client/xhr/index.html'); + copyAsset('main.ts', 'client/xhr/main.ts'); + compileWithTypescript('client/xhr'); + await server.start('client/xhr'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient({ - TOKEN: (window as any).tokenRequest, - USERNAME: undefined, - PASSWORD: undefined, - }); - return await client.simple.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: (window as any).tokenRequest, + USERNAME: undefined, + PASSWORD: undefined, + }); + return await client.simple.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient({ - TOKEN: undefined, - USERNAME: 'username', - PASSWORD: 'password', - }); - return await client.simple.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient({ + TOKEN: undefined, + USERNAME: 'username', + PASSWORD: 'password', + }); + return await client.simple.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - return await client.complex.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.complex.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); }); + expect(result).toBeDefined(); + }); - it('support form data', async () => { - const result = await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - return await client.parameters.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ); - }); - expect(result).toBeDefined(); + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + return await client.parameters.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + }, + ); }); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - await browser.evaluate(async () => { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - const promise = client.simple.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - }); - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + const promise = client.simple.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - await client.error.testErrorCode(500); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode(500); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); - it('should throw unknown error (409)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ApiClient } = (window as any).api; - const client = new ApiClient(); - await client.error.testErrorCode(409); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ApiClient } = (window as any).api; + const client = new ApiClient(); + await client.error.testErrorCode(409); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); }); diff --git a/test/e2e/scripts/browser.ts b/test/e2e/scripts/browser.ts index ab0b96bc5..61ddfd1bc 100644 --- a/test/e2e/scripts/browser.ts +++ b/test/e2e/scripts/browser.ts @@ -4,37 +4,37 @@ let _browser: Browser; let _page: Page; const start = async () => { - // This starts a new puppeteer browser (Chrome) - // and load the localhost page, this page will load the - // javascript modules (see server.js for more info) - _browser = await puppeteer.launch({ - headless: 'new', - args: ['--no-sandbox', '--disable-setuid-sandbox'], - }); - _page = await _browser.newPage(); - // _page.on('console', msg => console.log(msg.text())); - await _page.goto(`http://localhost:3000/`, { - waitUntil: 'networkidle0', - }); + // This starts a new puppeteer browser (Chrome) + // and load the localhost page, this page will load the + // javascript modules (see server.js for more info) + _browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox'], + }); + _page = await _browser.newPage(); + // _page.on('console', msg => console.log(msg.text())); + await _page.goto(`http://localhost:3000/`, { + waitUntil: 'networkidle0', + }); }; const stop = async () => { - await _page.close(); - await _browser.close(); + await _page.close(); + await _browser.close(); }; const evaluate = async (fn: EvaluateFn) => { - return await _page.evaluate(fn); + return await _page.evaluate(fn); }; // eslint-disable-next-line @typescript-eslint/ban-types const exposeFunction = async (name: string, fn: Function) => { - return await _page.exposeFunction(name, fn); + return await _page.exposeFunction(name, fn); }; export default { - start, - stop, - evaluate, - exposeFunction, + start, + stop, + evaluate, + exposeFunction, }; diff --git a/test/e2e/scripts/cleanup.ts b/test/e2e/scripts/cleanup.ts index d3d9d896b..55b515370 100644 --- a/test/e2e/scripts/cleanup.ts +++ b/test/e2e/scripts/cleanup.ts @@ -1,8 +1,8 @@ import { rmSync } from 'fs'; export const cleanup = (dir: string) => { - rmSync(`./test/e2e/generated/${dir}/`, { - force: true, - recursive: true, - }); + rmSync(`./test/e2e/generated/${dir}/`, { + force: true, + recursive: true, + }); }; diff --git a/test/e2e/scripts/compileWithBabel.ts b/test/e2e/scripts/compileWithBabel.ts index 5421934f2..801ed6bc8 100644 --- a/test/e2e/scripts/compileWithBabel.ts +++ b/test/e2e/scripts/compileWithBabel.ts @@ -3,35 +3,35 @@ import { readFileSync, writeFileSync } from 'fs'; import { sync } from 'glob'; export const compileWithBabel = (dir: string) => { - sync(`./test/e2e/generated/${dir}/**/*.ts`).forEach(file => { - try { - const content = readFileSync(file, 'utf8').toString(); - const result = transformSync(content, { - filename: file, - presets: [ - [ - '@babel/preset-env', - { - modules: false, - targets: { - node: true, - }, - }, - ], - [ - '@babel/preset-typescript', - { - onlyRemoveTypeImports: true, - }, - ], - ], - }); - if (result?.code) { - const out = file.replace(/\.ts$/, '.js'); - writeFileSync(out, result.code); - } - } catch (error) { - console.error(error); - } - }); + sync(`./test/e2e/generated/${dir}/**/*.ts`).forEach((file) => { + try { + const content = readFileSync(file, 'utf8').toString(); + const result = transformSync(content, { + filename: file, + presets: [ + [ + '@babel/preset-env', + { + modules: false, + targets: { + node: true, + }, + }, + ], + [ + '@babel/preset-typescript', + { + onlyRemoveTypeImports: true, + }, + ], + ], + }); + if (result?.code) { + const out = file.replace(/\.ts$/, '.js'); + writeFileSync(out, result.code); + } + } catch (error) { + console.error(error); + } + }); }; diff --git a/test/e2e/scripts/compileWithTypescript.ts b/test/e2e/scripts/compileWithTypescript.ts index 4a8ab1de5..395fe88ee 100644 --- a/test/e2e/scripts/compileWithTypescript.ts +++ b/test/e2e/scripts/compileWithTypescript.ts @@ -1,58 +1,58 @@ import { EOL } from 'os'; import { resolve } from 'path'; import { - createCompilerHost, - createProgram, - formatDiagnosticsWithColorAndContext, - getPreEmitDiagnostics, - parseConfigFileTextToJson, - parseJsonConfigFileContent, - sys, + createCompilerHost, + createProgram, + formatDiagnosticsWithColorAndContext, + getPreEmitDiagnostics, + parseConfigFileTextToJson, + parseJsonConfigFileContent, + sys, } from 'typescript'; export const compileWithTypescript = (dir: string) => { - const cwd = `./test/e2e/generated/${dir}/`; - const tsconfig = { - compilerOptions: { - target: 'es2020', - module: 'es2020', - moduleResolution: 'node', - lib: ['es2020', 'dom'], - declaration: false, - declarationMap: false, - sourceMap: false, - noImplicitReturns: true, - noImplicitThis: true, - noImplicitAny: true, - strict: true, - skipLibCheck: true, - allowSyntheticDefaultImports: true, - experimentalDecorators: true, - }, - include: ['**/*.ts'], - }; + const cwd = `./test/e2e/generated/${dir}/`; + const tsconfig = { + compilerOptions: { + target: 'es2020', + module: 'es2020', + moduleResolution: 'node', + lib: ['es2020', 'dom'], + declaration: false, + declarationMap: false, + sourceMap: false, + noImplicitReturns: true, + noImplicitThis: true, + noImplicitAny: true, + strict: true, + skipLibCheck: true, + allowSyntheticDefaultImports: true, + experimentalDecorators: true, + }, + include: ['**/*.ts'], + }; - // Compile files to JavaScript (ES6 modules) - const configFile = parseConfigFileTextToJson('tsconfig.json', JSON.stringify(tsconfig)); - const configFileResult = parseJsonConfigFileContent( - configFile.config, - sys, - resolve(process.cwd(), cwd), - undefined, - 'tsconfig.json' - ); - const compilerHost = createCompilerHost(configFileResult.options); - const compiler = createProgram(configFileResult.fileNames, configFileResult.options, compilerHost); - const result = compiler.emit(); + // Compile files to JavaScript (ES6 modules) + const configFile = parseConfigFileTextToJson('tsconfig.json', JSON.stringify(tsconfig)); + const configFileResult = parseJsonConfigFileContent( + configFile.config, + sys, + resolve(process.cwd(), cwd), + undefined, + 'tsconfig.json', + ); + const compilerHost = createCompilerHost(configFileResult.options); + const compiler = createProgram(configFileResult.fileNames, configFileResult.options, compilerHost); + const result = compiler.emit(); - // Show errors or warnings (if any) - const diagnostics = getPreEmitDiagnostics(compiler).concat(result.diagnostics); - if (diagnostics.length) { - const message = formatDiagnosticsWithColorAndContext(diagnostics, { - getCurrentDirectory: () => sys.getCurrentDirectory(), - getCanonicalFileName: f => f, - getNewLine: () => EOL, - }); - console.log(message); - } + // Show errors or warnings (if any) + const diagnostics = getPreEmitDiagnostics(compiler).concat(result.diagnostics); + if (diagnostics.length) { + const message = formatDiagnosticsWithColorAndContext(diagnostics, { + getCurrentDirectory: () => sys.getCurrentDirectory(), + getCanonicalFileName: (f) => f, + getNewLine: () => EOL, + }); + console.log(message); + } }; diff --git a/test/e2e/scripts/copyAsset.ts b/test/e2e/scripts/copyAsset.ts index 166aecc6d..be6c14784 100644 --- a/test/e2e/scripts/copyAsset.ts +++ b/test/e2e/scripts/copyAsset.ts @@ -1,5 +1,5 @@ import { copyFileSync } from 'fs'; export const copyAsset = (fileNameIn: string, fileNameOut: string) => { - copyFileSync(`./test/e2e/assets/${fileNameIn}`, `./test/e2e/generated/${fileNameOut}`); + copyFileSync(`./test/e2e/assets/${fileNameIn}`, `./test/e2e/generated/${fileNameOut}`); }; diff --git a/test/e2e/scripts/generateClient.ts b/test/e2e/scripts/generateClient.ts index 998bc6d09..0b22913bd 100644 --- a/test/e2e/scripts/generateClient.ts +++ b/test/e2e/scripts/generateClient.ts @@ -1,17 +1,17 @@ import { generate as __generate } from '../../../'; export const generateClient = async ( - dir: string, - version: string, - client: 'fetch' | 'xhr' | 'node' | 'axios', - useOptions: boolean = false, - clientName?: string + dir: string, + version: string, + client: 'fetch' | 'xhr' | 'node' | 'axios', + useOptions: boolean = false, + clientName?: string, ) => { - await __generate({ - input: `./test/spec/${version}.json`, - output: `./test/e2e/generated/${dir}/`, - httpClient: client, - useOptions, - clientName, - }); + await __generate({ + input: `./test/spec/${version}.json`, + output: `./test/e2e/generated/${dir}/`, + httpClient: client, + useOptions, + clientName, + }); }; diff --git a/test/e2e/scripts/server.ts b/test/e2e/scripts/server.ts index 37a41907d..5771d83b0 100644 --- a/test/e2e/scripts/server.ts +++ b/test/e2e/scripts/server.ts @@ -6,98 +6,98 @@ let _app: Express; let _server: Server; const start = async (dir: string) => { - return new Promise(resolve => { - _app = express(); + return new Promise((resolve) => { + _app = express(); - // Serve the JavaScript files from the specific folder, since we are using browser - // based ES6 modules, this also means that we can just request the js/index.js file - // and all other relative paths are resolved from that file. - _app.use( - '/js', - express.static(`./test/e2e/generated/${dir}/`, { - extensions: ['', 'js'], - index: 'index.js', - }) - ); + // Serve the JavaScript files from the specific folder, since we are using browser + // based ES6 modules, this also means that we can just request the js/index.js file + // and all other relative paths are resolved from that file. + _app.use( + '/js', + express.static(`./test/e2e/generated/${dir}/`, { + extensions: ['', 'js'], + index: 'index.js', + }), + ); - _app.use( - '/js', - express.static(`./test/e2e/generated/${dir}/`, { - extensions: ['', 'js'], - index: 'index.js', - }) - ); + _app.use( + '/js', + express.static(`./test/e2e/generated/${dir}/`, { + extensions: ['', 'js'], + index: 'index.js', + }), + ); - // Serve static assets - _app.get('/runtime.js', (req, res) => { - res.sendFile(resolvePath(`./test/e2e/generated/${dir}/runtime.js`)); - }); - _app.get('/polyfills.js', (req, res) => { - res.sendFile(resolvePath(`./test/e2e/generated/${dir}/polyfills.js`)); - }); - _app.get('/vendor.js', (req, res) => { - res.sendFile(resolvePath(`./test/e2e/generated/${dir}/vendor.js`)); - }); - _app.get('/main.js', (req, res) => { - res.sendFile(resolvePath(`./test/e2e/generated/${dir}/main.js`)); - }); - _app.get('/styles.css', (req, res) => { - res.sendFile(resolvePath(`./test/e2e/generated/${dir}/styles.css`)); - }); - _app.get('/favicon.ico', (req, res) => { - res.sendFile(resolvePath(`./test/e2e/generated/${dir}/favicon.ico`)); - }); - _app.get('/', (req, res) => { - res.sendFile(resolvePath(`./test/e2e/generated/${dir}/index.html`)); - }); + // Serve static assets + _app.get('/runtime.js', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/runtime.js`)); + }); + _app.get('/polyfills.js', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/polyfills.js`)); + }); + _app.get('/vendor.js', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/vendor.js`)); + }); + _app.get('/main.js', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/main.js`)); + }); + _app.get('/styles.css', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/styles.css`)); + }); + _app.get('/favicon.ico', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/favicon.ico`)); + }); + _app.get('/', (req, res) => { + res.sendFile(resolvePath(`./test/e2e/generated/${dir}/index.html`)); + }); - // Register an 'echo' server for testing error codes. This will just grab the - // status code from the query and return the default response (and text) from Express. - // See the spec files for more information. - _app.all('/base/api/v1.0/error', (req, res) => { - const status = parseInt(String(req.query.status)); - res.status(status).json({ - status, - message: 'hello world', - }); - }); + // Register an 'echo' server for testing error codes. This will just grab the + // status code from the query and return the default response (and text) from Express. + // See the spec files for more information. + _app.all('/base/api/v1.0/error', (req, res) => { + const status = parseInt(String(req.query.status)); + res.status(status).json({ + status, + message: 'hello world', + }); + }); - // Register an 'echo' server that just returns all data from the API calls. - // Although this might not be a 'correct' response, we can use this to test - // the majority of API calls. - _app.all('/base/api/v1.0/*', (req, res) => { - setTimeout(() => { - res.json({ - method: req.method, - protocol: req.protocol, - hostname: req.hostname, - path: req.path, - url: req.url, - query: req.query, - body: req.body, - headers: req.headers, - }); - }, 100); - }); - _server = _app.listen(3000, () => { - resolve(); + // Register an 'echo' server that just returns all data from the API calls. + // Although this might not be a 'correct' response, we can use this to test + // the majority of API calls. + _app.all('/base/api/v1.0/*', (req, res) => { + setTimeout(() => { + res.json({ + method: req.method, + protocol: req.protocol, + hostname: req.hostname, + path: req.path, + url: req.url, + query: req.query, + body: req.body, + headers: req.headers, }); + }, 100); }); + _server = _app.listen(3000, () => { + resolve(); + }); + }); }; const stop = async () => { - return new Promise((resolve, reject) => { - _server.close(err => { - if (err) { - reject(err); - } else { - resolve(); - } - }); + return new Promise((resolve, reject) => { + _server.close((err) => { + if (err) { + reject(err); + } else { + resolve(); + } }); + }); }; export default { - start, - stop, + start, + stop, }; diff --git a/test/e2e/v2.axios.spec.ts b/test/e2e/v2.axios.spec.ts index 940c740dd..b03de789c 100644 --- a/test/e2e/v2.axios.spec.ts +++ b/test/e2e/v2.axios.spec.ts @@ -4,35 +4,35 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v2.axios', () => { - beforeAll(async () => { - cleanup('v2/axios'); - await generateClient('v2/axios', 'v2', 'axios'); - compileWithTypescript('v2/axios'); - await server.start('v2/axios'); - }, 30000); + beforeAll(async () => { + cleanup('v2/axios'); + await generateClient('v2/axios', 'v2', 'axios'); + compileWithTypescript('v2/axios'); + await server.start('v2/axios'); + }, 30000); - afterAll(async () => { - await server.stop(); - }); + afterAll(async () => { + await server.stop(); + }); - it('requests token', async () => { - const { OpenAPI, SimpleService } = require('./generated/v2/axios/index.js'); - const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); - OpenAPI.TOKEN = tokenRequest; - const result = await SimpleService.getCallWithoutParametersAndResponse(); - expect(tokenRequest.mock.calls.length).toBe(1); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); - }); + it('requests token', async () => { + const { OpenAPI, SimpleService } = require('./generated/v2/axios/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + OpenAPI.TOKEN = tokenRequest; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('supports complex params', async () => { - const { ComplexService } = require('./generated/v2/axios/index.js'); - const result = await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const { ComplexService } = require('./generated/v2/axios/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, }); + expect(result).toBeDefined(); + }); }); diff --git a/test/e2e/v2.babel.spec.ts b/test/e2e/v2.babel.spec.ts index 63f7461c4..84047b014 100644 --- a/test/e2e/v2.babel.spec.ts +++ b/test/e2e/v2.babel.spec.ts @@ -6,44 +6,44 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v2.babel', () => { - beforeAll(async () => { - cleanup('v2/babel'); - await generateClient('v2/babel', 'v2', 'fetch', true, true); - copyAsset('index.html', 'v2/babel/index.html'); - copyAsset('main.ts', 'v2/babel/main.ts'); - compileWithBabel('v2/babel'); - await server.start('v2/babel'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('v2/babel'); + await generateClient('v2/babel', 'v2', 'fetch', true, true); + copyAsset('index.html', 'v2/babel/index.html'); + copyAsset('main.ts', 'v2/babel/main.ts'); + compileWithBabel('v2/babel'); + await server.start('v2/babel'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = (window as any).tokenRequest; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ComplexService } = (window as any).api; - return await ComplexService.complexTypes({ - parameterObject: { - first: { - second: { - third: 'Hello World!', - }, - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + parameterObject: { + first: { + second: { + third: 'Hello World!', + }, + }, + }, + }); }); + expect(result).toBeDefined(); + }); }); diff --git a/test/e2e/v2.fetch.spec.ts b/test/e2e/v2.fetch.spec.ts index 54c6311a4..a17ab70b3 100644 --- a/test/e2e/v2.fetch.spec.ts +++ b/test/e2e/v2.fetch.spec.ts @@ -6,42 +6,42 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v2.fetch', () => { - beforeAll(async () => { - cleanup('v2/fetch'); - await generateClient('v2/fetch', 'v2', 'fetch'); - copyAsset('index.html', 'v2/fetch/index.html'); - copyAsset('main.ts', 'v2/fetch/main.ts'); - compileWithTypescript('v2/fetch'); - await server.start('v2/fetch'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('v2/fetch'); + await generateClient('v2/fetch', 'v2', 'fetch'); + copyAsset('index.html', 'v2/fetch/index.html'); + copyAsset('main.ts', 'v2/fetch/main.ts'); + compileWithTypescript('v2/fetch'); + await server.start('v2/fetch'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = (window as any).tokenRequest; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ComplexService } = (window as any).api; - return await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); }); + expect(result).toBeDefined(); + }); }); diff --git a/test/e2e/v2.node.spec.ts b/test/e2e/v2.node.spec.ts index e38176ee5..70c75b465 100644 --- a/test/e2e/v2.node.spec.ts +++ b/test/e2e/v2.node.spec.ts @@ -4,50 +4,50 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v2.node', () => { - beforeAll(async () => { - cleanup('v2/node'); - await generateClient('v2/node', 'v2', 'node'); - compileWithTypescript('v2/node'); - await server.start('v2/node'); - }, 30000); + beforeAll(async () => { + cleanup('v2/node'); + await generateClient('v2/node', 'v2', 'node'); + compileWithTypescript('v2/node'); + await server.start('v2/node'); + }, 30000); - afterAll(async () => { - await server.stop(); - }); + afterAll(async () => { + await server.stop(); + }); - it('requests token', async () => { - const { OpenAPI, SimpleService } = require('./generated/v2/node/index.js'); - const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); - OpenAPI.TOKEN = tokenRequest; - const result = await SimpleService.getCallWithoutParametersAndResponse(); - expect(tokenRequest.mock.calls.length).toBe(1); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); - }); + it('requests token', async () => { + const { OpenAPI, SimpleService } = require('./generated/v2/node/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + OpenAPI.TOKEN = tokenRequest; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('supports complex params', async () => { - const { ComplexService } = require('./generated/v2/node/index.js'); - const result = await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const { ComplexService } = require('./generated/v2/node/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, }); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - const { SimpleService } = require('./generated/v2/node/index.js'); - const promise = SimpleService.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + const { SimpleService } = require('./generated/v2/node/index.js'); + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); }); diff --git a/test/e2e/v2.xhr.spec.ts b/test/e2e/v2.xhr.spec.ts index d6149757e..6daa57911 100644 --- a/test/e2e/v2.xhr.spec.ts +++ b/test/e2e/v2.xhr.spec.ts @@ -6,42 +6,42 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v2.xhr', () => { - beforeAll(async () => { - cleanup('v2/xhr'); - await generateClient('v2/xhr', 'v2', 'xhr'); - copyAsset('index.html', 'v2/xhr/index.html'); - copyAsset('main.ts', 'v2/xhr/main.ts'); - compileWithTypescript('v2/xhr'); - await server.start('v2/xhr'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('v2/xhr'); + await generateClient('v2/xhr', 'v2', 'xhr'); + copyAsset('index.html', 'v2/xhr/index.html'); + copyAsset('main.ts', 'v2/xhr/main.ts'); + compileWithTypescript('v2/xhr'); + await server.start('v2/xhr'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = (window as any).tokenRequest; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ComplexService } = (window as any).api; - return await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); }); + expect(result).toBeDefined(); + }); }); diff --git a/test/e2e/v3.axios.spec.ts b/test/e2e/v3.axios.spec.ts index 56b21be3e..b10a0bc47 100644 --- a/test/e2e/v3.axios.spec.ts +++ b/test/e2e/v3.axios.spec.ts @@ -4,149 +4,149 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v3.axios', () => { - beforeAll(async () => { - cleanup('v3/axios'); - await generateClient('v3/axios', 'v3', 'axios'); - compileWithTypescript('v3/axios'); - await server.start('v3/axios'); - }, 30000); + beforeAll(async () => { + cleanup('v3/axios'); + await generateClient('v3/axios', 'v3', 'axios'); + compileWithTypescript('v3/axios'); + await server.start('v3/axios'); + }, 30000); - afterAll(async () => { - await server.stop(); - }); + afterAll(async () => { + await server.stop(); + }); - it('requests token', async () => { - const { OpenAPI, SimpleService } = require('./generated/v3/axios/index.js'); - const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); - OpenAPI.TOKEN = tokenRequest; - OpenAPI.USERNAME = undefined; - OpenAPI.PASSWORD = undefined; - const result = await SimpleService.getCallWithoutParametersAndResponse(); - expect(tokenRequest.mock.calls.length).toBe(1); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); - }); + it('requests token', async () => { + const { OpenAPI, SimpleService } = require('./generated/v3/axios/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + OpenAPI.TOKEN = tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const { OpenAPI, SimpleService } = require('./generated/v3/axios/index.js'); - OpenAPI.TOKEN = undefined; - OpenAPI.USERNAME = 'username'; - OpenAPI.PASSWORD = 'password'; - const result = await SimpleService.getCallWithoutParametersAndResponse(); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); - }); + it('uses credentials', async () => { + const { OpenAPI, SimpleService } = require('./generated/v3/axios/index.js'); + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const { ComplexService } = require('./generated/v3/axios/index.js'); - const result = await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const { ComplexService } = require('./generated/v3/axios/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, }); + expect(result).toBeDefined(); + }); - it('supports form data', async () => { - const { ParametersService } = require('./generated/v3/axios/index.js'); - const result = await ParametersService.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ); - expect(result).toBeDefined(); - }); + it('supports form data', async () => { + const { ParametersService } = require('./generated/v3/axios/index.js'); + const result = await ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + }, + ); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - const { SimpleService } = require('./generated/v3/axios/index.js'); - const promise = SimpleService.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + const { SimpleService } = require('./generated/v3/axios/index.js'); + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - let error; - try { - const { ErrorService } = require('./generated/v3/axios/index.js'); - await ErrorService.testErrorCode(500); - } catch (e) { - const err = e as any; - error = JSON.stringify({ - name: err.name, - message: err.message, - url: err.url, - status: err.status, - statusText: err.statusText, - body: err.body, - }); - } - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); - }); + it('should throw known error (500)', async () => { + let error; + try { + const { ErrorService } = require('./generated/v3/axios/index.js'); + await ErrorService.testErrorCode(500); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); - it('should throw unknown error (409)', async () => { - let error; - try { - const { ErrorService } = require('./generated/v3/axios/index.js'); - await ErrorService.testErrorCode(409); - } catch (e) { - const err = e as any; - error = JSON.stringify({ - name: err.name, - message: err.message, - url: err.url, - status: err.status, - statusText: err.statusText, - body: err.body, - }); - } - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); - }); + it('should throw unknown error (409)', async () => { + let error; + try { + const { ErrorService } = require('./generated/v3/axios/index.js'); + await ErrorService.testErrorCode(409); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); - it('it should parse query params', async () => { - const { ParametersService } = require('./generated/v3/axios/index.js'); - const result = (await ParametersService.postCallWithOptionalParam({ - page: 0, - size: 1, - sort: ['location'], - })) as Promise; - expect((result as any).query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); - }); + it('it should parse query params', async () => { + const { ParametersService } = require('./generated/v3/axios/index.js'); + const result = (await ParametersService.postCallWithOptionalParam({ + page: 0, + size: 1, + sort: ['location'], + })) as Promise; + expect((result as any).query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); }); diff --git a/test/e2e/v3.babel.spec.ts b/test/e2e/v3.babel.spec.ts index 5ce2a366e..595492c2b 100644 --- a/test/e2e/v3.babel.spec.ts +++ b/test/e2e/v3.babel.spec.ts @@ -6,177 +6,177 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v3.babel', () => { - beforeAll(async () => { - cleanup('v3/babel'); - await generateClient('v3/babel', 'v3', 'fetch', true, true); - copyAsset('index.html', 'v3/babel/index.html'); - copyAsset('main.ts', 'v3/babel/main.ts'); - compileWithBabel('v3/babel'); - await server.start('v3/babel'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('v3/babel'); + await generateClient('v3/babel', 'v3', 'fetch', true, true); + copyAsset('index.html', 'v3/babel/index.html'); + copyAsset('main.ts', 'v3/babel/main.ts'); + compileWithBabel('v3/babel'); + await server.start('v3/babel'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = (window as any).tokenRequest; - OpenAPI.USERNAME = undefined; - OpenAPI.PASSWORD = undefined; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = undefined; - OpenAPI.USERNAME = 'username'; - OpenAPI.PASSWORD = 'password'; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ComplexService } = (window as any).api; - return await ComplexService.complexTypes({ - parameterObject: { - first: { - second: { - third: 'Hello World!', - }, - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + parameterObject: { + first: { + second: { + third: 'Hello World!', + }, + }, + }, + }); }); + expect(result).toBeDefined(); + }); - it('support form data', async () => { - const result = await browser.evaluate(async () => { - const { ParametersService } = (window as any).api; - return await ParametersService.callWithParameters({ - parameterHeader: 'valueHeader', - parameterQuery: 'valueQuery', - parameterForm: 'valueForm', - parameterCookie: 'valueCookie', - parameterPath: 'valuePath', - requestBody: { - prop: 'valueBody', - }, - }); - }); - expect(result).toBeDefined(); + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return await ParametersService.callWithParameters({ + parameterHeader: 'valueHeader', + parameterQuery: 'valueQuery', + parameterForm: 'valueForm', + parameterCookie: 'valueCookie', + parameterPath: 'valuePath', + requestBody: { + prop: 'valueBody', + }, + }); }); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - await browser.evaluate(async () => { - const { SimpleService } = (window as any).api; - const promise = SimpleService.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - }); - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { SimpleService } = (window as any).api; + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ErrorService } = (window as any).api; - await ErrorService.testErrorCode({ - status: 500, - }); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode({ + status: 500, }); - - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; }); - it('should throw unknown error (409)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ErrorService } = (window as any).api; - await ErrorService.testErrorCode({ - status: 409, - }); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode({ + status: 409, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, + }); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); - it('it should parse query params', async () => { - const result = await browser.evaluate(async () => { - const { ParametersService } = (window as any).api; - return (await ParametersService.postCallWithOptionalParam({ - parameter: { - page: 0, - size: 1, - sort: ['location'], - }, - })) as Promise; - }); - expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + it('it should parse query params', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return (await ParametersService.postCallWithOptionalParam({ + parameter: { + page: 0, + size: 1, + sort: ['location'], + }, + })) as Promise; }); + expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); }); diff --git a/test/e2e/v3.fetch.spec.ts b/test/e2e/v3.fetch.spec.ts index 547853a70..0d7ba9f8e 100644 --- a/test/e2e/v3.fetch.spec.ts +++ b/test/e2e/v3.fetch.spec.ts @@ -6,169 +6,169 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v3.fetch', () => { - beforeAll(async () => { - cleanup('v3/fetch'); - await generateClient('v3/fetch', 'v3', 'fetch'); - copyAsset('index.html', 'v3/fetch/index.html'); - copyAsset('main.ts', 'v3/fetch/main.ts'); - compileWithTypescript('v3/fetch'); - await server.start('v3/fetch'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('v3/fetch'); + await generateClient('v3/fetch', 'v3', 'fetch'); + copyAsset('index.html', 'v3/fetch/index.html'); + copyAsset('main.ts', 'v3/fetch/main.ts'); + compileWithTypescript('v3/fetch'); + await server.start('v3/fetch'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = (window as any).tokenRequest; - OpenAPI.USERNAME = undefined; - OpenAPI.PASSWORD = undefined; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = undefined; - OpenAPI.USERNAME = 'username'; - OpenAPI.PASSWORD = 'password'; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ComplexService } = (window as any).api; - return await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); }); + expect(result).toBeDefined(); + }); - it('support form data', async () => { - const result = await browser.evaluate(async () => { - const { ParametersService } = (window as any).api; - return await ParametersService.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ); - }); - expect(result).toBeDefined(); + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return await ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + }, + ); }); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - await browser.evaluate(async () => { - const { SimpleService } = (window as any).api; - const promise = SimpleService.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - }); - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { SimpleService } = (window as any).api; + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ErrorService } = (window as any).api; - await ErrorService.testErrorCode(500); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode(500); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); + } + return; }); - it('should throw unknown error (409)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ErrorService } = (window as any).api; - await ErrorService.testErrorCode(409); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); + + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode(409); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); - it('it should parse query params', async () => { - const result = await browser.evaluate(async () => { - const { ParametersService } = (window as any).api; - return (await ParametersService.postCallWithOptionalParam({ - page: 0, - size: 1, - sort: ['location'], - })) as Promise; - }); - expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + it('it should parse query params', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return (await ParametersService.postCallWithOptionalParam({ + page: 0, + size: 1, + sort: ['location'], + })) as Promise; }); + expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); }); diff --git a/test/e2e/v3.node.spec.ts b/test/e2e/v3.node.spec.ts index 6d6a484ce..03b067f25 100644 --- a/test/e2e/v3.node.spec.ts +++ b/test/e2e/v3.node.spec.ts @@ -4,149 +4,149 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v3.node', () => { - beforeAll(async () => { - cleanup('v3/node'); - await generateClient('v3/node', 'v3', 'node'); - compileWithTypescript('v3/node'); - await server.start('v3/node'); - }, 30000); + beforeAll(async () => { + cleanup('v3/node'); + await generateClient('v3/node', 'v3', 'node'); + compileWithTypescript('v3/node'); + await server.start('v3/node'); + }, 30000); - afterAll(async () => { - await server.stop(); - }); + afterAll(async () => { + await server.stop(); + }); - it('requests token', async () => { - const { OpenAPI, SimpleService } = require('./generated/v3/node/index.js'); - const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); - OpenAPI.TOKEN = tokenRequest; - OpenAPI.USERNAME = undefined; - OpenAPI.PASSWORD = undefined; - const result = await SimpleService.getCallWithoutParametersAndResponse(); - expect(tokenRequest.mock.calls.length).toBe(1); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); - }); + it('requests token', async () => { + const { OpenAPI, SimpleService } = require('./generated/v3/node/index.js'); + const tokenRequest = jest.fn().mockResolvedValue('MY_TOKEN'); + OpenAPI.TOKEN = tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(tokenRequest.mock.calls.length).toBe(1); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const { OpenAPI, SimpleService } = require('./generated/v3/node/index.js'); - OpenAPI.TOKEN = undefined; - OpenAPI.USERNAME = 'username'; - OpenAPI.PASSWORD = 'password'; - const result = await SimpleService.getCallWithoutParametersAndResponse(); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); - }); + it('uses credentials', async () => { + const { OpenAPI, SimpleService } = require('./generated/v3/node/index.js'); + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + const result = await SimpleService.getCallWithoutParametersAndResponse(); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const { ComplexService } = require('./generated/v3/node/index.js'); - const result = await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const { ComplexService } = require('./generated/v3/node/index.js'); + const result = await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, }); + expect(result).toBeDefined(); + }); - it('support form data', async () => { - const { ParametersService } = require('./generated/v3/node/index.js'); - const result = await ParametersService.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ); - expect(result).toBeDefined(); - }); + it('support form data', async () => { + const { ParametersService } = require('./generated/v3/node/index.js'); + const result = await ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + }, + ); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - const { SimpleService } = require('./generated/v3/node/index.js'); - const promise = SimpleService.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + const { SimpleService } = require('./generated/v3/node/index.js'); + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - let error; - try { - const { ErrorService } = require('./generated/v3/node/index.js'); - await ErrorService.testErrorCode(500); - } catch (e) { - const err = e as any; - error = JSON.stringify({ - name: err.name, - message: err.message, - url: err.url, - status: err.status, - statusText: err.statusText, - body: err.body, - }); - } - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); - }); + it('should throw known error (500)', async () => { + let error; + try { + const { ErrorService } = require('./generated/v3/node/index.js'); + await ErrorService.testErrorCode(500); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); - it('should throw unknown error (409)', async () => { - let error; - try { - const { ErrorService } = require('./generated/v3/node/index.js'); - await ErrorService.testErrorCode(409); - } catch (e) { - const err = e as any; - error = JSON.stringify({ - name: err.name, - message: err.message, - url: err.url, - status: err.status, - statusText: err.statusText, - body: err.body, - }); - } - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); - }); + it('should throw unknown error (409)', async () => { + let error; + try { + const { ErrorService } = require('./generated/v3/node/index.js'); + await ErrorService.testErrorCode(409); + } catch (e) { + const err = e as any; + error = JSON.stringify({ + name: err.name, + message: err.message, + url: err.url, + status: err.status, + statusText: err.statusText, + body: err.body, + }); + } + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); - it('it should parse query params', async () => { - const { ParametersService } = require('./generated/v3/node/index.js'); - const result = (await ParametersService.postCallWithOptionalParam({ - page: 0, - size: 1, - sort: ['location'], - })) as Promise; - expect((result as any).query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); - }); + it('it should parse query params', async () => { + const { ParametersService } = require('./generated/v3/node/index.js'); + const result = (await ParametersService.postCallWithOptionalParam({ + page: 0, + size: 1, + sort: ['location'], + })) as Promise; + expect((result as any).query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); }); diff --git a/test/e2e/v3.xhr.spec.ts b/test/e2e/v3.xhr.spec.ts index d1fac6e1c..af7aca89e 100644 --- a/test/e2e/v3.xhr.spec.ts +++ b/test/e2e/v3.xhr.spec.ts @@ -6,168 +6,168 @@ import { generateClient } from './scripts/generateClient'; import server from './scripts/server'; describe('v3.xhr', () => { - beforeAll(async () => { - cleanup('v3/xhr'); - await generateClient('v3/xhr', 'v3', 'xhr'); - copyAsset('index.html', 'v3/xhr/index.html'); - copyAsset('main.ts', 'v3/xhr/main.ts'); - compileWithTypescript('v3/xhr'); - await server.start('v3/xhr'); - await browser.start(); - }, 30000); + beforeAll(async () => { + cleanup('v3/xhr'); + await generateClient('v3/xhr', 'v3', 'xhr'); + copyAsset('index.html', 'v3/xhr/index.html'); + copyAsset('main.ts', 'v3/xhr/main.ts'); + compileWithTypescript('v3/xhr'); + await server.start('v3/xhr'); + await browser.start(); + }, 30000); - afterAll(async () => { - await browser.stop(); - await server.stop(); - }); + afterAll(async () => { + await browser.stop(); + await server.stop(); + }); - it('requests token', async () => { - await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = (window as any).tokenRequest; - OpenAPI.USERNAME = undefined; - OpenAPI.PASSWORD = undefined; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + it('requests token', async () => { + await browser.exposeFunction('tokenRequest', jest.fn().mockResolvedValue('MY_TOKEN')); + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = (window as any).tokenRequest; + OpenAPI.USERNAME = undefined; + OpenAPI.PASSWORD = undefined; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Bearer MY_TOKEN'); + }); - it('uses credentials', async () => { - const result = await browser.evaluate(async () => { - const { OpenAPI, SimpleService } = (window as any).api; - OpenAPI.TOKEN = undefined; - OpenAPI.USERNAME = 'username'; - OpenAPI.PASSWORD = 'password'; - return await SimpleService.getCallWithoutParametersAndResponse(); - }); - expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + it('uses credentials', async () => { + const result = await browser.evaluate(async () => { + const { OpenAPI, SimpleService } = (window as any).api; + OpenAPI.TOKEN = undefined; + OpenAPI.USERNAME = 'username'; + OpenAPI.PASSWORD = 'password'; + return await SimpleService.getCallWithoutParametersAndResponse(); }); + expect(result.headers.authorization).toBe('Basic dXNlcm5hbWU6cGFzc3dvcmQ='); + }); - it('supports complex params', async () => { - const result = await browser.evaluate(async () => { - const { ComplexService } = (window as any).api; - return await ComplexService.complexTypes({ - first: { - second: { - third: 'Hello World!', - }, - }, - }); - }); - expect(result).toBeDefined(); + it('supports complex params', async () => { + const result = await browser.evaluate(async () => { + const { ComplexService } = (window as any).api; + return await ComplexService.complexTypes({ + first: { + second: { + third: 'Hello World!', + }, + }, + }); }); + expect(result).toBeDefined(); + }); - it('support form data', async () => { - const result = await browser.evaluate(async () => { - const { ParametersService } = (window as any).api; - return await ParametersService.callWithParameters( - 'valueHeader', - 'valueQuery', - 'valueForm', - 'valueCookie', - 'valuePath', - { - prop: 'valueBody', - } - ); - }); - expect(result).toBeDefined(); + it('support form data', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return await ParametersService.callWithParameters( + 'valueHeader', + 'valueQuery', + 'valueForm', + 'valueCookie', + 'valuePath', + { + prop: 'valueBody', + }, + ); }); + expect(result).toBeDefined(); + }); - it('can abort the request', async () => { - let error; - try { - await browser.evaluate(async () => { - const { SimpleService } = (window as any).api; - const promise = SimpleService.getCallWithoutParametersAndResponse(); - setTimeout(() => { - promise.cancel(); - }, 10); - await promise; - }); - } catch (e) { - error = (e as Error).message; - } - expect(error).toContain('Request aborted'); - }); + it('can abort the request', async () => { + let error; + try { + await browser.evaluate(async () => { + const { SimpleService } = (window as any).api; + const promise = SimpleService.getCallWithoutParametersAndResponse(); + setTimeout(() => { + promise.cancel(); + }, 10); + await promise; + }); + } catch (e) { + error = (e as Error).message; + } + expect(error).toContain('Request aborted'); + }); - it('should throw known error (500)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ErrorService } = (window as any).api; - await ErrorService.testErrorCode(500); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw known error (500)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode(500); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: 'Custom message: Internal Server Error', - url: 'http://localhost:3000/base/api/v1.0/error?status=500', - status: 500, - statusText: 'Internal Server Error', - body: { - status: 500, - message: 'hello world', - }, - }) - ); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: 'Custom message: Internal Server Error', + url: 'http://localhost:3000/base/api/v1.0/error?status=500', + status: 500, + statusText: 'Internal Server Error', + body: { + status: 500, + message: 'hello world', + }, + }), + ); + }); - it('should throw unknown error (409)', async () => { - const error = await browser.evaluate(async () => { - try { - const { ErrorService } = (window as any).api; - await ErrorService.testErrorCode(409); - } catch (e) { - const error = e as any; - return JSON.stringify({ - name: error.name, - message: error.message, - url: error.url, - status: error.status, - statusText: error.statusText, - body: error.body, - }); - } - return; + it('should throw unknown error (409)', async () => { + const error = await browser.evaluate(async () => { + try { + const { ErrorService } = (window as any).api; + await ErrorService.testErrorCode(409); + } catch (e) { + const error = e as any; + return JSON.stringify({ + name: error.name, + message: error.message, + url: error.url, + status: error.status, + statusText: error.statusText, + body: error.body, }); - expect(error).toBe( - JSON.stringify({ - name: 'ApiError', - message: - 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', - url: 'http://localhost:3000/base/api/v1.0/error?status=409', - status: 409, - statusText: 'Conflict', - body: { - status: 409, - message: 'hello world', - }, - }) - ); + } + return; }); + expect(error).toBe( + JSON.stringify({ + name: 'ApiError', + message: + 'Generic Error: status: 409; status text: Conflict; body: {\n "status": 409,\n "message": "hello world"\n}', + url: 'http://localhost:3000/base/api/v1.0/error?status=409', + status: 409, + statusText: 'Conflict', + body: { + status: 409, + message: 'hello world', + }, + }), + ); + }); - it('it should parse query params', async () => { - const result = await browser.evaluate(async () => { - const { ParametersService } = (window as any).api; - return (await ParametersService.postCallWithOptionalParam({ - page: 0, - size: 1, - sort: ['location'], - })) as Promise; - }); - expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + it('it should parse query params', async () => { + const result = await browser.evaluate(async () => { + const { ParametersService } = (window as any).api; + return (await ParametersService.postCallWithOptionalParam({ + page: 0, + size: 1, + sort: ['location'], + })) as Promise; }); + expect(result.query).toStrictEqual({ parameter: { page: '0', size: '1', sort: 'location' } }); + }); }); diff --git a/test/index.js b/test/index.js index 32cf700e3..eab11542e 100644 --- a/test/index.js +++ b/test/index.js @@ -4,61 +4,61 @@ const OpenAPI = require('../'); const fetch = require('node-fetch'); const generate = async (input, output) => { - await OpenAPI.generate({ - input, - output, - httpClient: OpenAPI.HttpClient.FETCH, - useOptions: true, - exportCore: true, - exportSchemas: true, - exportModels: true, - exportServices: true, - // clientName: 'Demo', - // indent: OpenAPI.Indent.SPACE_2, - // postfix: 'Service', - // request: './test/custom/request.ts', - }); + await OpenAPI.generate({ + input, + output, + httpClient: OpenAPI.HttpClient.FETCH, + useOptions: true, + exportCore: true, + exportSchemas: true, + exportModels: true, + exportServices: true, + // clientName: 'Demo', + // indent: OpenAPI.Indent.SPACE_2, + // postfix: 'Service', + // request: './test/custom/request.ts', + }); }; // eslint-disable-next-line @typescript-eslint/no-unused-vars const generateRealWorldSpecs = async () => { - const response = await fetch('https://api.apis.guru/v2/list.json'); + const response = await fetch('https://api.apis.guru/v2/list.json'); - const list = await response.json(); - delete list['api.video']; - delete list['apideck.com:vault']; - delete list['amazonaws.com:mediaconvert']; - delete list['bungie.net']; - delete list['docusign.net']; - delete list['googleapis.com:adsense']; - delete list['googleapis.com:servicebroker']; - delete list['kubernetes.io']; - delete list['microsoft.com:graph']; - delete list['presalytics.io:ooxml']; - delete list['stripe.com']; + const list = await response.json(); + delete list['api.video']; + delete list['apideck.com:vault']; + delete list['amazonaws.com:mediaconvert']; + delete list['bungie.net']; + delete list['docusign.net']; + delete list['googleapis.com:adsense']; + delete list['googleapis.com:servicebroker']; + delete list['kubernetes.io']; + delete list['microsoft.com:graph']; + delete list['presalytics.io:ooxml']; + delete list['stripe.com']; - const specs = Object.entries(list).map(([name, api]) => { - const latestVersion = api.versions[api.preferred]; - return { - name: name - .replace(/^[^a-zA-Z]+/g, '') - .replace(/[^\w\-]+/g, '-') - .trim() - .toLowerCase(), - url: latestVersion.swaggerYamlUrl || latestVersion.swaggerUrl, - }; - }); + const specs = Object.entries(list).map(([name, api]) => { + const latestVersion = api.versions[api.preferred]; + return { + name: name + .replace(/^[^a-zA-Z]+/g, '') + .replace(/[^\w\-]+/g, '-') + .trim() + .toLowerCase(), + url: latestVersion.swaggerYamlUrl || latestVersion.swaggerUrl, + }; + }); - for (let i = 0; i < specs.length; i++) { - const spec = specs[i]; - await generate(spec.url, `./test/generated/${spec.name}/`); - } + for (let i = 0; i < specs.length; i++) { + const spec = specs[i]; + await generate(spec.url, `./test/generated/${spec.name}/`); + } }; const main = async () => { - await generate('./test/spec/v2.json', './test/generated/v2/'); - await generate('./test/spec/v3.json', './test/generated/v3/'); - // await generateRealWorldSpecs(); + await generate('./test/spec/v2.json', './test/generated/v2/'); + await generate('./test/spec/v3.json', './test/generated/v3/'); + // await generateRealWorldSpecs(); }; main(); diff --git a/test/index.spec.ts b/test/index.spec.ts index 1a6e1d2dd..ef0e23a38 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -4,41 +4,41 @@ import { sync } from 'glob'; import { generate, HttpClient } from '../'; describe('v2', () => { - it('should generate', async () => { - await generate({ - input: './test/spec/v2.json', - output: './test/generated/v2/', - httpClient: HttpClient.FETCH, - useOptions: false, - exportCore: true, - exportSchemas: true, - exportModels: true, - exportServices: true, - }); + it('should generate', async () => { + await generate({ + input: './test/spec/v2.json', + output: './test/generated/v2/', + httpClient: HttpClient.FETCH, + useOptions: false, + exportCore: true, + exportSchemas: true, + exportModels: true, + exportServices: true, + }); - sync('./test/generated/v2/**/*.ts').forEach(file => { - const content = readFileSync(file, 'utf8').toString(); - expect(content).toMatchSnapshot(file); - }); + sync('./test/generated/v2/**/*.ts').forEach((file) => { + const content = readFileSync(file, 'utf8').toString(); + expect(content).toMatchSnapshot(file); }); + }); }); describe('v3', () => { - it('should generate', async () => { - await generate({ - input: './test/spec/v3.json', - output: './test/generated/v3/', - httpClient: HttpClient.FETCH, - useOptions: false, - exportCore: true, - exportSchemas: true, - exportModels: true, - exportServices: true, - }); + it('should generate', async () => { + await generate({ + input: './test/spec/v3.json', + output: './test/generated/v3/', + httpClient: HttpClient.FETCH, + useOptions: false, + exportCore: true, + exportSchemas: true, + exportModels: true, + exportServices: true, + }); - sync('./test/generated/v3/**/*.ts').forEach(file => { - const content = readFileSync(file, 'utf8').toString(); - expect(content).toMatchSnapshot(file); - }); + sync('./test/generated/v3/**/*.ts').forEach((file) => { + const content = readFileSync(file, 'utf8').toString(); + expect(content).toMatchSnapshot(file); }); + }); }); diff --git a/test/spec/v2.json b/test/spec/v2.json index 43f0bfd1d..fdd07d1c7 100644 --- a/test/spec/v2.json +++ b/test/spec/v2.json @@ -1,1519 +1,1377 @@ { - "swagger": "2.0", - "info": { - "title": "swagger", - "version": "v1.0" + "swagger": "2.0", + "info": { + "title": "swagger", + "version": "v1.0" + }, + "host": "localhost:3000", + "basePath": "/base", + "schemes": ["http"], + "paths": { + "/api/v{api-version}/no-tag": { + "tags": [], + "get": { + "operationId": "ServiceWithEmptyTag" + } }, - "host": "localhost:3000", - "basePath": "/base", - "schemes": [ - "http" - ], - "paths": { - "/api/v{api-version}/no-tag": { - "tags": [], - "get": { - "operationId": "ServiceWithEmptyTag" + "/api/v{api-version}/simple": { + "get": { + "tags": ["Simple"], + "operationId": "GetCallWithoutParametersAndResponse" + }, + "put": { + "tags": ["Simple"], + "operationId": "PutCallWithoutParametersAndResponse" + }, + "post": { + "tags": ["Simple"], + "operationId": "PostCallWithoutParametersAndResponse" + }, + "delete": { + "tags": ["Simple"], + "operationId": "DeleteCallWithoutParametersAndResponse" + }, + "options": { + "tags": ["Simple"], + "operationId": "OptionsCallWithoutParametersAndResponse" + }, + "head": { + "tags": ["Simple"], + "operationId": "HeadCallWithoutParametersAndResponse" + }, + "patch": { + "tags": ["Simple"], + "operationId": "PatchCallWithoutParametersAndResponse" + } + }, + "/api/v{api-version}/descriptions/": { + "post": { + "tags": ["Descriptions"], + "operationId": "CallWithDescriptions", + "parameters": [ + { + "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", + "name": "parameterWithBreaks", + "in": "query", + "type": "string" + }, + { + "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", + "name": "parameterWithBackticks", + "in": "query", + "type": "string" + }, + { + "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", + "name": "parameterWithSlashes", + "in": "query", + "type": "string" + }, + { + "description": "Testing expression placeholders in string: ${expression} should work", + "name": "parameterWithExpressionPlaceholders", + "in": "query", + "type": "string" + }, + { + "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", + "name": "parameterWithQuotes", + "in": "query", + "type": "string" + }, + { + "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", + "name": "parameterWithReservedCharacters", + "in": "query", + "type": "string" + } + ] + } + }, + "/api/v{api-version}/parameters/{parameterPath}": { + "post": { + "tags": ["Parameters"], + "operationId": "CallWithParameters", + "parameters": [ + { + "description": "This is the parameter that goes into the header", + "name": "parameterHeader", + "in": "header", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the query params", + "name": "parameterQuery", + "in": "query", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the form data", + "name": "parameterForm", + "in": "formData", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that is sent as request body", + "name": "parameterBody", + "in": "body", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the path", + "name": "parameterPath", + "in": "path", + "type": "string", + "required": true + }, + { + "name": "api-version", + "in": "path", + "type": "string", + "required": true + } + ] + } + }, + "/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}": { + "post": { + "tags": ["Parameters"], + "operationId": "CallWithWeirdParameterNames", + "parameters": [ + { + "description": "This is the parameter that goes into the path", + "name": "parameter.path.1", + "in": "path", + "type": "string", + "required": false + }, + { + "description": "This is the parameter that goes into the path", + "name": "parameter-path-2", + "in": "path", + "type": "string", + "required": false + }, + { + "description": "This is the parameter that goes into the path", + "name": "PARAMETER-PATH-3", + "in": "path", + "type": "string", + "required": false + }, + { + "description": "This is the parameter with a reserved keyword", + "name": "default", + "in": "query", + "type": "string", + "required": false + }, + { + "description": "This is the parameter that goes into the request header", + "name": "parameter.header", + "in": "header", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the request query params", + "name": "parameter-query", + "in": "query", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that goes into the request form data", + "name": "parameter_form", + "in": "formData", + "type": "string", + "required": true + }, + { + "description": "This is the parameter that is sent as request body", + "name": "PARAMETER-BODY", + "in": "body", + "type": "string", + "required": true + }, + { + "name": "api-version", + "in": "path", + "type": "string", + "required": true + } + ] + } + }, + "/api/v{api-version}/defaults": { + "get": { + "tags": ["Defaults"], + "operationId": "CallWithDefaultParameters", + "parameters": [ + { + "description": "This is a simple string with default value", + "name": "parameterString", + "in": "query", + "required": true, + "default": "Hello World!", + "type": "string" + }, + { + "description": "This is a simple number with default value", + "name": "parameterNumber", + "in": "query", + "required": true, + "default": 123, + "type": "number" + }, + { + "description": "This is a simple boolean with default value", + "name": "parameterBoolean", + "in": "query", + "required": true, + "default": true, + "type": "boolean" + }, + { + "description": "This is a simple enum with default value", + "name": "parameterEnum", + "in": "query", + "required": true, + "default": 0, + "schema": { + "enum": ["Success", "Warning", "Error"] } - }, - "/api/v{api-version}/simple": { - "get": { - "tags": [ - "Simple" - ], - "operationId": "GetCallWithoutParametersAndResponse" + }, + { + "description": "This is a simple model with default value", + "name": "parameterModel", + "in": "query", + "required": true, + "default": { + "prop": "Hello World!" }, - "put": { - "tags": [ - "Simple" - ], - "operationId": "PutCallWithoutParametersAndResponse" - }, - "post": { - "tags": [ - "Simple" - ], - "operationId": "PostCallWithoutParametersAndResponse" - }, - "delete": { - "tags": [ - "Simple" - ], - "operationId": "DeleteCallWithoutParametersAndResponse" - }, - "options": { - "tags": [ - "Simple" - ], - "operationId": "OptionsCallWithoutParametersAndResponse" - }, - "head": { - "tags": [ - "Simple" - ], - "operationId": "HeadCallWithoutParametersAndResponse" + "schema": { + "$ref": "#/definitions/ModelWithString" + } + } + ] + }, + "post": { + "tags": ["Defaults"], + "operationId": "CallWithDefaultOptionalParameters", + "parameters": [ + { + "description": "This is a simple string that is optional with default value", + "name": "parameterString", + "in": "query", + "default": "Hello World!", + "type": "string" + }, + { + "description": "This is a simple number that is optional with default value", + "name": "parameterNumber", + "in": "query", + "default": 123, + "type": "number" + }, + { + "description": "This is a simple boolean that is optional with default value", + "name": "parameterBoolean", + "in": "query", + "default": true, + "type": "boolean" + }, + { + "description": "This is a simple enum that is optional with default value", + "name": "parameterEnum", + "in": "query", + "default": 0, + "schema": { + "enum": ["Success", "Warning", "Error"] + } + }, + { + "description": "This is a simple model that is optional with default value", + "name": "parameterModel", + "in": "query", + "default": { + "prop": "Hello World!" }, - "patch": { - "tags": [ - "Simple" - ], - "operationId": "PatchCallWithoutParametersAndResponse" + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/descriptions/": { - "post": { - "tags": [ - "Descriptions" - ], - "operationId": "CallWithDescriptions", - "parameters": [ - { - "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", - "name": "parameterWithBreaks", - "in": "query", - "type": "string" - }, - { - "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", - "name": "parameterWithBackticks", - "in": "query", - "type": "string" - }, - { - "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", - "name": "parameterWithSlashes", - "in": "query", - "type": "string" - }, - { - "description": "Testing expression placeholders in string: ${expression} should work", - "name": "parameterWithExpressionPlaceholders", - "in": "query", - "type": "string" - }, - { - "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", - "name": "parameterWithQuotes", - "in": "query", - "type": "string" - }, - { - "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", - "name": "parameterWithReservedCharacters", - "in": "query", - "type": "string" - } - ] + } + ] + }, + "put": { + "tags": ["Defaults"], + "operationId": "CallToTestOrderOfParams", + "parameters": [ + { + "description": "This is a optional string with default", + "name": "parameterOptionalStringWithDefault", + "in": "query", + "required": false, + "default": "Hello World!", + "type": "string" + }, + { + "description": "This is a optional string with empty default", + "name": "parameterOptionalStringWithEmptyDefault", + "in": "query", + "required": false, + "default": "", + "type": "string" + }, + { + "description": "This is a optional string with no default", + "name": "parameterOptionalStringWithNoDefault", + "in": "query", + "required": false, + "type": "string" + }, + { + "description": "This is a string with default", + "name": "parameterStringWithDefault", + "in": "query", + "required": true, + "default": "Hello World!", + "type": "string" + }, + { + "description": "This is a string with empty default", + "name": "parameterStringWithEmptyDefault", + "in": "query", + "required": true, + "default": "", + "type": "string" + }, + { + "description": "This is a string with no default", + "name": "parameterStringWithNoDefault", + "in": "query", + "required": true, + "type": "string" + }, + { + "x-nullable": true, + "description": "This is a string that can be null with no default", + "name": "parameterStringNullableWithNoDefault", + "in": "query", + "required": false, + "type": "string" + }, + { + "x-nullable": true, + "description": "This is a string that can be null with default", + "name": "parameterStringNullableWithDefault", + "in": "query", + "required": false, + "type": "string", + "default": null + } + ] + } + }, + "/api/v{api-version}/duplicate": { + "get": { + "tags": ["Duplicate", "Duplicate"], + "operationId": "DuplicateName" + }, + "post": { + "tags": ["Duplicate", "Duplicate"], + "operationId": "DuplicateName" + }, + "put": { + "tags": ["Duplicate", "Duplicate"], + "operationId": "DuplicateName" + }, + "delete": { + "tags": ["Duplicate", "Duplicate"], + "operationId": "DuplicateName" + } + }, + "/api/v{api-version}/no-content": { + "get": { + "tags": ["NoContent"], + "operationId": "CallWithNoContentResponse", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/multiple-tags/a": { + "get": { + "tags": ["MultipleTags1", "MultipleTags2"], + "operationId": "DummyA", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/multiple-tags/b": { + "get": { + "tags": ["MultipleTags1", "MultipleTags2", "MultipleTags3"], + "operationId": "DummyB", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/response": { + "get": { + "tags": ["Response"], + "operationId": "CallWithResponse", + "responses": { + "default": { + "description": "Message for default response", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/parameters/{parameterPath}": { - "post": { - "tags": [ - "Parameters" - ], - "operationId": "CallWithParameters", - "parameters": [ - { - "description": "This is the parameter that goes into the header", - "name": "parameterHeader", - "in": "header", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that goes into the query params", - "name": "parameterQuery", - "in": "query", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that goes into the form data", - "name": "parameterForm", - "in": "formData", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that is sent as request body", - "name": "parameterBody", - "in": "body", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that goes into the path", - "name": "parameterPath", - "in": "path", - "type": "string", - "required": true - }, - { - "name": "api-version", - "in": "path", - "type": "string", - "required": true - } - ] + } + } + }, + "post": { + "tags": ["Response"], + "operationId": "CallWithDuplicateResponses", + "responses": { + "default": { + "description": "Message for default response", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}": { - "post": { - "tags": [ - "Parameters" - ], - "operationId": "CallWithWeirdParameterNames", - "parameters": [ - { - "description": "This is the parameter that goes into the path", - "name": "parameter.path.1", - "in": "path", - "type": "string", - "required": false - }, - { - "description": "This is the parameter that goes into the path", - "name": "parameter-path-2", - "in": "path", - "type": "string", - "required": false - }, - { - "description": "This is the parameter that goes into the path", - "name": "PARAMETER-PATH-3", - "in": "path", - "type": "string", - "required": false - }, - { - "description": "This is the parameter with a reserved keyword", - "name": "default", - "in": "query", - "type": "string", - "required": false - }, - { - "description": "This is the parameter that goes into the request header", - "name": "parameter.header", - "in": "header", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that goes into the request query params", - "name": "parameter-query", - "in": "query", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that goes into the request form data", - "name": "parameter_form", - "in": "formData", - "type": "string", - "required": true - }, - { - "description": "This is the parameter that is sent as request body", - "name": "PARAMETER-BODY", - "in": "body", - "type": "string", - "required": true - }, - { - "name": "api-version", - "in": "path", - "type": "string", - "required": true - } - ] + }, + "201": { + "description": "Message for 201 response", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/defaults": { - "get": { - "tags": [ - "Defaults" - ], - "operationId": "CallWithDefaultParameters", - "parameters": [ - { - "description": "This is a simple string with default value", - "name": "parameterString", - "in": "query", - "required": true, - "default": "Hello World!", - "type": "string" - }, - { - "description": "This is a simple number with default value", - "name": "parameterNumber", - "in": "query", - "required": true, - "default": 123, - "type": "number" - }, - { - "description": "This is a simple boolean with default value", - "name": "parameterBoolean", - "in": "query", - "required": true, - "default": true, - "type": "boolean" - }, - { - "description": "This is a simple enum with default value", - "name": "parameterEnum", - "in": "query", - "required": true, - "default": 0, - "schema": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - { - "description": "This is a simple model with default value", - "name": "parameterModel", - "in": "query", - "required": true, - "default": { - "prop": "Hello World!" - }, - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - ] - }, - "post": { - "tags": [ - "Defaults" - ], - "operationId": "CallWithDefaultOptionalParameters", - "parameters": [ - { - "description": "This is a simple string that is optional with default value", - "name": "parameterString", - "in": "query", - "default": "Hello World!", - "type": "string" - }, - { - "description": "This is a simple number that is optional with default value", - "name": "parameterNumber", - "in": "query", - "default": 123, - "type": "number" - }, - { - "description": "This is a simple boolean that is optional with default value", - "name": "parameterBoolean", - "in": "query", - "default": true, - "type": "boolean" - }, - { - "description": "This is a simple enum that is optional with default value", - "name": "parameterEnum", - "in": "query", - "default": 0, - "schema": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - { - "description": "This is a simple model that is optional with default value", - "name": "parameterModel", - "in": "query", - "default": { - "prop": "Hello World!" - }, - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - ] - }, - "put": { - "tags": [ - "Defaults" - ], - "operationId": "CallToTestOrderOfParams", - "parameters": [ - { - "description": "This is a optional string with default", - "name": "parameterOptionalStringWithDefault", - "in": "query", - "required": false, - "default": "Hello World!", - "type": "string" - }, - { - "description": "This is a optional string with empty default", - "name": "parameterOptionalStringWithEmptyDefault", - "in": "query", - "required": false, - "default": "", - "type": "string" - }, - { - "description": "This is a optional string with no default", - "name": "parameterOptionalStringWithNoDefault", - "in": "query", - "required": false, - "type": "string" - }, - { - "description": "This is a string with default", - "name": "parameterStringWithDefault", - "in": "query", - "required": true, - "default": "Hello World!", - "type": "string" - }, - { - "description": "This is a string with empty default", - "name": "parameterStringWithEmptyDefault", - "in": "query", - "required": true, - "default": "", - "type": "string" - }, - { - "description": "This is a string with no default", - "name": "parameterStringWithNoDefault", - "in": "query", - "required": true, - "type": "string" - }, - { - "x-nullable": true, - "description": "This is a string that can be null with no default", - "name": "parameterStringNullableWithNoDefault", - "in": "query", - "required": false, - "type": "string" - }, - { - "x-nullable": true, - "description": "This is a string that can be null with default", - "name": "parameterStringNullableWithDefault", - "in": "query", - "required": false, - "type": "string", - "default": null - } - ] + }, + "202": { + "description": "Message for 202 response", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/duplicate": { - "get": { - "tags": [ - "Duplicate", - "Duplicate" - ], - "operationId": "DuplicateName" - }, - "post": { - "tags": [ - "Duplicate", - "Duplicate" - ], - "operationId": "DuplicateName" - }, - "put": { - "tags": [ - "Duplicate", - "Duplicate" - ], - "operationId": "DuplicateName" - }, - "delete": { - "tags": [ - "Duplicate", - "Duplicate" - ], - "operationId": "DuplicateName" + }, + "500": { + "description": "Message for 500 error", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/no-content": { - "get": { - "tags": [ - "NoContent" - ], - "operationId": "CallWithNoContentResponse", - "responses": { - "204": { - "description": "Success" - } - } + }, + "501": { + "description": "Message for 501 error", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/multiple-tags/a": { - "get": { - "tags": [ - "MultipleTags1", - "MultipleTags2" - ], - "operationId": "DummyA", - "responses": { - "204": { - "description": "Success" - } - } + }, + "502": { + "description": "Message for 502 error", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/multiple-tags/b": { - "get": { - "tags": [ - "MultipleTags1", - "MultipleTags2", - "MultipleTags3" - ], - "operationId": "DummyB", - "responses": { - "204": { - "description": "Success" - } - } + } + } + }, + "put": { + "tags": ["Response"], + "operationId": "CallWithResponses", + "responses": { + "default": { + "description": "Message for default response", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/response": { - "get": { - "tags": [ - "Response" - ], - "operationId": "CallWithResponse", - "responses": { - "default": { - "description": "Message for default response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - } - }, - "post": { - "tags": [ - "Response" - ], - "operationId": "CallWithDuplicateResponses", - "responses": { - "default": { - "description": "Message for default response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "201": { - "description": "Message for 201 response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "202": { - "description": "Message for 202 response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "500": { - "description": "Message for 500 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "501": { - "description": "Message for 501 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "502": { - "description": "Message for 502 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - } - }, - "put": { - "tags": [ - "Response" - ], - "operationId": "CallWithResponses", - "responses": { - "default": { - "description": "Message for default response", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "200": { - "description": "Message for 200 response", - "schema": { - "type": "object", - "properties": { - "@namespace.string": { - "type": "string", - "readOnly": true - }, - "@namespace.integer": { - "type": "integer", - "readOnly": true - }, - "value": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - }, - "readOnly": true - } - } - } - }, - "201": { - "description": "Message for 201 response", - "schema": { - "$ref": "#/definitions/ModelThatExtends" - } - }, - "202": { - "description": "Message for 202 response", - "schema": { - "$ref": "#/definitions/ModelThatExtendsExtends" - } - }, - "500": { - "description": "Message for 500 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "501": { - "description": "Message for 501 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - }, - "502": { - "description": "Message for 502 error", - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } + }, + "200": { + "description": "Message for 200 response", + "schema": { + "type": "object", + "properties": { + "@namespace.string": { + "type": "string", + "readOnly": true + }, + "@namespace.integer": { + "type": "integer", + "readOnly": true + }, + "value": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + }, + "readOnly": true } + } } - }, - "/api/v{api-version}/collectionFormat": { - "get": { - "tags": [ - "CollectionFormat" - ], - "operationId": "CollectionFormat", - "parameters": [ - { - "description": "This is an array parameter that is sent as csv format (comma-separated values)", - "name": "parameterArrayCSV", - "in": "query", - "required": true, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "csv" - }, - { - "description": "This is an array parameter that is sent as ssv format (space-separated values)", - "name": "parameterArraySSV", - "in": "query", - "required": true, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "ssv" - }, - { - "description": "This is an array parameter that is sent as tsv format (tab-separated values)", - "name": "parameterArrayTSV", - "in": "query", - "required": true, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "tsv" - }, - { - "description": "This is an array parameter that is sent as pipes format (pipe-separated values)", - "name": "parameterArrayPipes", - "in": "query", - "required": true, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "pipes" - }, - { - "description": "This is an array parameter that is sent as multi format (multiple parameter instances)", - "name": "parameterArrayMulti", - "in": "query", - "required": true, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - } - ] + }, + "201": { + "description": "Message for 201 response", + "schema": { + "$ref": "#/definitions/ModelThatExtends" } - }, - "/api/v{api-version}/types": { - "get": { - "tags": [ - "Types" - ], - "operationId": "Types", - "parameters": [ - { - "description": "This is a number parameter", - "name": "parameterNumber", - "in": "query", - "required": true, - "default": 123, - "type": "number" - }, - { - "description": "This is a string parameter", - "name": "parameterString", - "in": "query", - "required": true, - "default": "default", - "type": "string" - }, - { - "description": "This is a boolean parameter", - "name": "parameterBoolean", - "in": "query", - "required": true, - "default": true, - "type": "boolean" - }, - { - "description": "This is an object parameter", - "name": "parameterObject", - "in": "query", - "required": true, - "default": null, - "type": "object" - }, - { - "description": "This is an array parameter", - "name": "parameterArray", - "in": "query", - "required": true, - "type": "array", - "items": { - "type": "string" - } - }, - { - "description": "This is a dictionary parameter", - "name": "parameterDictionary", - "in": "query", - "required": true, - "type": "object", - "items": { - "type": "string" - } - }, - { - "description": "This is an enum parameter", - "name": "parameterEnum", - "in": "query", - "required": true, - "schema": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - { - "description": "This is a number parameter", - "name": "id", - "in": "path", - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "200": { - "description": "Response is a simple number", - "schema": { - "type": "number" - } - }, - "201": { - "description": "Response is a simple string", - "schema": { - "type": "string" - } - }, - "202": { - "description": "Response is a simple boolean", - "schema": { - "type": "boolean" - } - }, - "203": { - "description": "Response is a simple object", - "default": null, - "schema": { - "type": "object" - } - } - } + }, + "202": { + "description": "Message for 202 response", + "schema": { + "$ref": "#/definitions/ModelThatExtendsExtends" } - }, - "/api/v{api-version}/complex": { - "get": { - "tags": [ - "Complex" - ], - "operationId": "ComplexTypes", - "parameters": [ - { - "description": "Parameter containing object", - "name": "parameterObject", - "in": "query", - "required": true, - "schema": { - "type": "object", - "properties": { - "first": { - "type": "object", - "properties": { - "second": { - "type": "object", - "properties": { - "third": { - "type": "string" - } - } - } - } - } - } - } - }, - { - "description": "Parameter containing reference", - "name": "parameterReference", - "in": "query", - "required": true, - "schema": { - "$ref": "#/definitions/ModelWithString" - } - } - ], - "responses": { - "200": { - "description": "Successful response", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "400": { - "description": "400 server error" - }, - "500": { - "description": "500 server error" - } - } + }, + "500": { + "description": "Message for 500 error", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/header": { - "post": { - "tags": [ - "Header" - ], - "operationId": "CallWithResultFromHeader", - "responses": { - "200": { - "description": "Successful response", - "headers": { - "operation-location": { - "type": "string" - } - } - }, - "400": { - "description": "400 server error" - }, - "500": { - "description": "500 server error" - } - } + }, + "501": { + "description": "Message for 501 error", + "schema": { + "$ref": "#/definitions/ModelWithString" } - }, - "/api/v{api-version}/error": { - "post": { - "tags": [ - "Error" - ], - "operationId": "testErrorCode", - "parameters": [ - { - "description": "Status code to return", - "name": "status", - "in": "query", - "type": "string", - "required": true - } - ], - "responses": { - "200": { - "description": "Custom message: Successful response" - }, - "500": { - "description": "Custom message: Internal Server Error" - }, - "501": { - "description": "Custom message: Not Implemented" - }, - "502": { - "description": "Custom message: Bad Gateway" - }, - "503": { - "description": "Custom message: Service Unavailable" - } - } + }, + "502": { + "description": "Message for 502 error", + "schema": { + "$ref": "#/definitions/ModelWithString" } + } } + } }, - "definitions": { - "CommentWithBreaks": { - "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", - "type": "integer" - }, - "CommentWithBackticks": { - "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", - "type": "integer" - }, - "CommentWithSlashes": { - "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", - "type": "integer" - }, - "CommentWithExpressionPlaceholders": { - "description": "Testing expression placeholders in string: ${expression} should work", - "type": "integer" - }, - "CommentWithQuotes": { - "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", - "type": "integer" - }, - "CommentWithReservedCharacters": { - "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", - "type": "integer" - }, - "SimpleInteger": { - "description": "This is a simple number", - "type": "integer" - }, - "SimpleBoolean": { - "description": "This is a simple boolean", - "type": "boolean" - }, - "SimpleString": { - "description": "This is a simple string", - "type": "string" - }, - "SimpleFile": { - "description": "This is a simple file", - "type": "file" - }, - "SimpleReference": { - "description": "This is a simple reference", - "$ref": "#/definitions/ModelWithString" - }, - "SimpleStringWithPattern": { - "description": "This is a simple string", - "type": "string", - "maxLength": 64, - "pattern": "^[a-zA-Z0-9_]*$" - }, - "EnumWithStrings": { - "description": "This is a simple enum with strings", - "enum": [ - "Success", - "Warning", - "Error", - "'Single Quote'", - "\"Double Quotes\"" - ] - }, - "EnumWithNumbers": { - "description": "This is a simple enum with numbers", - "enum": [ - 1, - 2, - 3, - 1.1, - 1.20, - 1.300, - 100, - 200, - 300, - -100, - -200, - -300, - -1.1, - -1.20, - -1.300 - ] - }, - "EnumFromDescription": { - "description": "Success=1,Warning=2,Error=3", - "type": "number" - }, - "EnumWithExtensions": { - "description": "This is a simple enum with numbers", - "enum": [ - 200, - 400, - 500 - ], - "x-enum-varnames": [ - "CUSTOM_SUCCESS", - "CUSTOM_WARNING", - "CUSTOM_ERROR" - ], - "x-enum-descriptions": [ - "Used when the status of something is successful", - "Used when the status of something has a warning", - "Used when the status of something has an error" - ] - }, - "ArrayWithNumbers": { - "description": "This is a simple array with numbers", + "/api/v{api-version}/collectionFormat": { + "get": { + "tags": ["CollectionFormat"], + "operationId": "CollectionFormat", + "parameters": [ + { + "description": "This is an array parameter that is sent as csv format (comma-separated values)", + "name": "parameterArrayCSV", + "in": "query", + "required": true, "type": "array", "items": { - "type": "integer" - } - }, - "ArrayWithBooleans": { - "description": "This is a simple array with booleans", + "type": "string" + }, + "collectionFormat": "csv" + }, + { + "description": "This is an array parameter that is sent as ssv format (space-separated values)", + "name": "parameterArraySSV", + "in": "query", + "required": true, "type": "array", "items": { - "type": "boolean" - } - }, - "ArrayWithStrings": { - "description": "This is a simple array with strings", + "type": "string" + }, + "collectionFormat": "ssv" + }, + { + "description": "This is an array parameter that is sent as tsv format (tab-separated values)", + "name": "parameterArrayTSV", + "in": "query", + "required": true, "type": "array", "items": { - "type": "string" - } - }, - "ArrayWithReferences": { - "description": "This is a simple array with references", + "type": "string" + }, + "collectionFormat": "tsv" + }, + { + "description": "This is an array parameter that is sent as pipes format (pipe-separated values)", + "name": "parameterArrayPipes", + "in": "query", + "required": true, "type": "array", "items": { - "$ref": "#/definitions/ModelWithString" - } - }, - "ArrayWithArray": { - "description": "This is a simple array containing an array", + "type": "string" + }, + "collectionFormat": "pipes" + }, + { + "description": "This is an array parameter that is sent as multi format (multiple parameter instances)", + "name": "parameterArrayMulti", + "in": "query", + "required": true, "type": "array", "items": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } - } - }, - "ArrayWithProperties": { - "description": "This is a simple array with properties", + "type": "string" + }, + "collectionFormat": "multi" + } + ] + } + }, + "/api/v{api-version}/types": { + "get": { + "tags": ["Types"], + "operationId": "Types", + "parameters": [ + { + "description": "This is a number parameter", + "name": "parameterNumber", + "in": "query", + "required": true, + "default": 123, + "type": "number" + }, + { + "description": "This is a string parameter", + "name": "parameterString", + "in": "query", + "required": true, + "default": "default", + "type": "string" + }, + { + "description": "This is a boolean parameter", + "name": "parameterBoolean", + "in": "query", + "required": true, + "default": true, + "type": "boolean" + }, + { + "description": "This is an object parameter", + "name": "parameterObject", + "in": "query", + "required": true, + "default": null, + "type": "object" + }, + { + "description": "This is an array parameter", + "name": "parameterArray", + "in": "query", + "required": true, "type": "array", "items": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" - } - } + "type": "string" } - }, - "DictionaryWithString": { - "description": "This is a string dictionary", + }, + { + "description": "This is a dictionary parameter", + "name": "parameterDictionary", + "in": "query", + "required": true, "type": "object", - "additionalProperties": { - "type": "string" + "items": { + "type": "string" } - }, - "DictionaryWithReference": { - "description": "This is a string reference", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/ModelWithString" + }, + { + "description": "This is an enum parameter", + "name": "parameterEnum", + "in": "query", + "required": true, + "schema": { + "enum": ["Success", "Warning", "Error"] } - }, - "DictionaryWithArray": { - "description": "This is a complex dictionary", - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } + }, + { + "description": "This is a number parameter", + "name": "id", + "in": "path", + "schema": { + "type": "integer", + "format": "int32" } - }, - "DictionaryWithDictionary": { - "description": "This is a string dictionary", - "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "type": "string" - } + } + ], + "responses": { + "200": { + "description": "Response is a simple number", + "schema": { + "type": "number" } - }, - "DictionaryWithProperties": { - "description": "This is a complex dictionary", - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" + }, + "201": { + "description": "Response is a simple string", + "schema": { + "type": "string" + } + }, + "202": { + "description": "Response is a simple boolean", + "schema": { + "type": "boolean" + } + }, + "203": { + "description": "Response is a simple object", + "default": null, + "schema": { + "type": "object" + } + } + } + } + }, + "/api/v{api-version}/complex": { + "get": { + "tags": ["Complex"], + "operationId": "ComplexTypes", + "parameters": [ + { + "description": "Parameter containing object", + "name": "parameterObject", + "in": "query", + "required": true, + "schema": { + "type": "object", + "properties": { + "first": { + "type": "object", + "properties": { + "second": { + "type": "object", + "properties": { + "third": { + "type": "string" + } + } } + } } + } } - }, - "Date": { - "description": "This is a type-only model that defines Date as a string", + }, + { + "description": "Parameter containing reference", + "name": "parameterReference", + "in": "query", + "required": true, + "schema": { + "$ref": "#/definitions/ModelWithString" + } + } + ], + "responses": { + "200": { + "description": "Successful response", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "400": { + "description": "400 server error" + }, + "500": { + "description": "500 server error" + } + } + } + }, + "/api/v{api-version}/header": { + "post": { + "tags": ["Header"], + "operationId": "CallWithResultFromHeader", + "responses": { + "200": { + "description": "Successful response", + "headers": { + "operation-location": { + "type": "string" + } + } + }, + "400": { + "description": "400 server error" + }, + "500": { + "description": "500 server error" + } + } + } + }, + "/api/v{api-version}/error": { + "post": { + "tags": ["Error"], + "operationId": "testErrorCode", + "parameters": [ + { + "description": "Status code to return", + "name": "status", + "in": "query", "type": "string", - "format": "string" + "required": true + } + ], + "responses": { + "200": { + "description": "Custom message: Successful response" + }, + "500": { + "description": "Custom message: Internal Server Error" + }, + "501": { + "description": "Custom message: Not Implemented" + }, + "502": { + "description": "Custom message: Bad Gateway" + }, + "503": { + "description": "Custom message: Service Unavailable" + } + } + } + } + }, + "definitions": { + "CommentWithBreaks": { + "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", + "type": "integer" + }, + "CommentWithBackticks": { + "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", + "type": "integer" + }, + "CommentWithSlashes": { + "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", + "type": "integer" + }, + "CommentWithExpressionPlaceholders": { + "description": "Testing expression placeholders in string: ${expression} should work", + "type": "integer" + }, + "CommentWithQuotes": { + "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", + "type": "integer" + }, + "CommentWithReservedCharacters": { + "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", + "type": "integer" + }, + "SimpleInteger": { + "description": "This is a simple number", + "type": "integer" + }, + "SimpleBoolean": { + "description": "This is a simple boolean", + "type": "boolean" + }, + "SimpleString": { + "description": "This is a simple string", + "type": "string" + }, + "SimpleFile": { + "description": "This is a simple file", + "type": "file" + }, + "SimpleReference": { + "description": "This is a simple reference", + "$ref": "#/definitions/ModelWithString" + }, + "SimpleStringWithPattern": { + "description": "This is a simple string", + "type": "string", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$" + }, + "EnumWithStrings": { + "description": "This is a simple enum with strings", + "enum": ["Success", "Warning", "Error", "'Single Quote'", "\"Double Quotes\""] + }, + "EnumWithNumbers": { + "description": "This is a simple enum with numbers", + "enum": [1, 2, 3, 1.1, 1.2, 1.3, 100, 200, 300, -100, -200, -300, -1.1, -1.2, -1.3] + }, + "EnumFromDescription": { + "description": "Success=1,Warning=2,Error=3", + "type": "number" + }, + "EnumWithExtensions": { + "description": "This is a simple enum with numbers", + "enum": [200, 400, 500], + "x-enum-varnames": ["CUSTOM_SUCCESS", "CUSTOM_WARNING", "CUSTOM_ERROR"], + "x-enum-descriptions": [ + "Used when the status of something is successful", + "Used when the status of something has a warning", + "Used when the status of something has an error" + ] + }, + "ArrayWithNumbers": { + "description": "This is a simple array with numbers", + "type": "array", + "items": { + "type": "integer" + } + }, + "ArrayWithBooleans": { + "description": "This is a simple array with booleans", + "type": "array", + "items": { + "type": "boolean" + } + }, + "ArrayWithStrings": { + "description": "This is a simple array with strings", + "type": "array", + "items": { + "type": "string" + } + }, + "ArrayWithReferences": { + "description": "This is a simple array with references", + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + }, + "ArrayWithArray": { + "description": "This is a simple array containing an array", + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "ArrayWithProperties": { + "description": "This is a simple array with properties", + "type": "array", + "items": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + }, + "DictionaryWithString": { + "description": "This is a string dictionary", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "DictionaryWithReference": { + "description": "This is a string reference", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ModelWithString" + } + }, + "DictionaryWithArray": { + "description": "This is a complex dictionary", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "DictionaryWithDictionary": { + "description": "This is a string dictionary", + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "DictionaryWithProperties": { + "description": "This is a complex dictionary", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + }, + "Date": { + "description": "This is a type-only model that defines Date as a string", + "type": "string", + "format": "string" + }, + "ModelWithInteger": { + "description": "This is a model with one number property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple number property", + "type": "integer" + } + } + }, + "ModelWithBoolean": { + "description": "This is a model with one boolean property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple boolean property", + "type": "boolean" + } + } + }, + "ModelWithString": { + "description": "This is a model with one string property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple string property", + "type": "string" + } + } + }, + "ModelWithNullableString": { + "description": "This is a model with one string property", + "type": "object", + "required": ["nullableRequiredProp"], + "properties": { + "nullableProp": { + "description": "This is a simple string property", + "type": "string", + "x-nullable": true }, - "ModelWithInteger": { - "description": "This is a model with one number property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple number property", - "type": "integer" - } - } + "nullableRequiredProp": { + "description": "This is a simple string property", + "type": "string", + "x-nullable": true + } + } + }, + "ModelWithEnum": { + "description": "This is a model with one enum", + "type": "object", + "properties": { + "test": { + "description": "This is a simple enum with strings", + "enum": ["Success", "Warning", "Error"] }, - "ModelWithBoolean": { - "description": "This is a model with one boolean property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple boolean property", - "type": "boolean" - } - } + "statusCode": { + "description": "These are the HTTP error code enums", + "enum": ["100", "200 FOO", "300 FOO_BAR", "400 foo-bar", "500 foo.bar", "600 foo&bar"] }, - "ModelWithString": { - "description": "This is a model with one string property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple string property", - "type": "string" - } - } + "bool": { + "description": "Simple boolean enum", + "type": "boolean", + "enum": [true] + } + } + }, + "ModelWithEnumFromDescription": { + "description": "This is a model with one enum", + "type": "object", + "properties": { + "test": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + } + }, + "ModelWithNestedEnums": { + "description": "This is a model with nested enums", + "type": "object", + "properties": { + "dictionaryWithEnum": { + "type": "object", + "additionalProperties": { + "enum": ["Success", "Warning", "Error"] + } }, - "ModelWithNullableString": { - "description": "This is a model with one string property", - "type": "object", - "required": [ - "nullableRequiredProp" - ], - "properties": { - "nullableProp": { - "description": "This is a simple string property", - "type": "string", - "x-nullable": true - }, - "nullableRequiredProp": { - "description": "This is a simple string property", - "type": "string", - "x-nullable": true - } - } + "dictionaryWithEnumFromDescription": { + "type": "object", + "additionalProperties": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } }, - "ModelWithEnum": { - "description": "This is a model with one enum", - "type": "object", - "properties": { - "test": { - "description": "This is a simple enum with strings", - "enum": [ - "Success", - "Warning", - "Error" - ] - }, - "statusCode": { - "description": "These are the HTTP error code enums", - "enum": [ - "100", - "200 FOO", - "300 FOO_BAR", - "400 foo-bar", - "500 foo.bar", - "600 foo&bar" - ] - }, - "bool": { - "description": "Simple boolean enum", - "type": "boolean", - "enum": [ - true - ] - } - } + "arrayWithEnum": { + "type": "array", + "items": { + "enum": ["Success", "Warning", "Error"] + } }, - "ModelWithEnumFromDescription": { - "description": "This is a model with one enum", - "type": "object", - "properties": { - "test": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - } + "arrayWithDescription": { + "type": "array", + "items": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + } + } + }, + "ModelWithReference": { + "description": "This is a model with one property containing a reference", + "type": "object", + "properties": { + "prop": { + "$ref": "#/definitions/ModelWithProperties" + } + } + }, + "ModelWithArray": { + "description": "This is a model with one property containing an array", + "type": "object", + "properties": { + "prop": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelWithString" + } }, - "ModelWithNestedEnums": { - "description": "This is a model with nested enums", - "type": "object", - "properties": { - "dictionaryWithEnum": { - "type": "object", - "additionalProperties": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - "dictionaryWithEnumFromDescription": { - "type": "object", - "additionalProperties": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - }, - "arrayWithEnum": { - "type": "array", - "items": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - "arrayWithDescription": { - "type": "array", - "items": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - } - } + "propWithFile": { + "type": "array", + "items": { + "type": "file" + } }, - "ModelWithReference": { - "description": "This is a model with one property containing a reference", - "type": "object", - "properties": { - "prop": { - "$ref": "#/definitions/ModelWithProperties" - } - } + "propWithNumber": { + "type": "array", + "items": { + "type": "number" + } + } + } + }, + "ModelWithDictionary": { + "description": "This is a model with one property containing a dictionary", + "type": "object", + "properties": { + "prop": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "ModelWithCircularReference": { + "description": "This is a model with one property containing a circular reference", + "type": "object", + "properties": { + "prop": { + "$ref": "#/definitions/ModelWithCircularReference" + } + } + }, + "ModelWithProperties": { + "description": "This is a model with one nested property", + "type": "object", + "required": ["required", "requiredAndReadOnly"], + "properties": { + "required": { + "type": "string" }, - "ModelWithArray": { - "description": "This is a model with one property containing an array", - "type": "object", - "properties": { - "prop": { - "type": "array", - "items": { - "$ref": "#/definitions/ModelWithString" - } - }, - "propWithFile": { - "type": "array", - "items": { - "type": "file" - } - }, - "propWithNumber": { - "type": "array", - "items": { - "type": "number" - } - } - } + "requiredAndReadOnly": { + "type": "string", + "readOnly": true }, - "ModelWithDictionary": { - "description": "This is a model with one property containing a dictionary", - "type": "object", - "properties": { - "prop": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } + "string": { + "type": "string" }, - "ModelWithCircularReference": { - "description": "This is a model with one property containing a circular reference", - "type": "object", - "properties": { - "prop": { - "$ref": "#/definitions/ModelWithCircularReference" - } - } + "number": { + "type": "number" }, - "ModelWithProperties": { - "description": "This is a model with one nested property", - "type": "object", - "required": [ - "required", - "requiredAndReadOnly" - ], - "properties": { - "required": { - "type": "string" - }, - "requiredAndReadOnly": { - "type": "string", - "readOnly": true - }, - "string": { - "type": "string" - }, - "number": { - "type": "number" - }, - "boolean": { - "type": "boolean" - }, - "reference": { - "$ref": "#/definitions/ModelWithString" - }, - "property with space": { - "type": "string" - }, - "default": { - "type": "string" - }, - "try": { - "type": "string" - }, - "@namespace.string": { - "type": "string", - "readOnly": true - }, - "@namespace.integer": { - "type": "integer", - "readOnly": true - } - } + "boolean": { + "type": "boolean" }, - "ModelWithNestedProperties": { - "description": "This is a model with one nested property", - "type": "object", - "required": [ - "first" - ], - "properties": { - "first": { - "type": "object", - "required": [ - "second" - ], - "readOnly": true, - "properties": { - "second": { - "type": "object", - "required": [ - "third" - ], - "readOnly": true, - "properties": { - "third": { - "type": "string", - "readOnly": true - } - } - } - } - } - } + "reference": { + "$ref": "#/definitions/ModelWithString" }, - "ModelWithDuplicateProperties": { - "description": "This is a model with duplicated properties", - "type": "object", - "properties": { - "prop": { - "$ref": "#/definitions/ModelWithString" - }, - "prop": { - "$ref": "#/definitions/ModelWithString" - }, - "prop": { - "$ref": "#/definitions/ModelWithString" - } - } + "property with space": { + "type": "string" }, - "ModelWithOrderedProperties": { - "description": "This is a model with ordered properties", - "type": "object", - "properties": { - "zebra": { - "type": "string" - }, - "apple": { - "type": "string" - }, - "hawaii": { - "type": "string" - } - } + "default": { + "type": "string" }, - "ModelWithDuplicateImports": { - "description": "This is a model with duplicated imports", - "type": "object", - "properties": { - "propA": { - "$ref": "#/definitions/ModelWithString" - }, - "propB": { - "$ref": "#/definitions/ModelWithString" - }, - "propC": { - "$ref": "#/definitions/ModelWithString" + "try": { + "type": "string" + }, + "@namespace.string": { + "type": "string", + "readOnly": true + }, + "@namespace.integer": { + "type": "integer", + "readOnly": true + } + } + }, + "ModelWithNestedProperties": { + "description": "This is a model with one nested property", + "type": "object", + "required": ["first"], + "properties": { + "first": { + "type": "object", + "required": ["second"], + "readOnly": true, + "properties": { + "second": { + "type": "object", + "required": ["third"], + "readOnly": true, + "properties": { + "third": { + "type": "string", + "readOnly": true } + } } + } + } + } + }, + "ModelWithDuplicateProperties": { + "description": "This is a model with duplicated properties", + "type": "object", + "properties": { + "prop": { + "$ref": "#/definitions/ModelWithString" }, - "ModelThatExtends": { - "description": "This is a model that extends another model", - "type": "object", - "allOf": [ - { - "$ref": "#/definitions/ModelWithString" - }, - { - "type": "object", - "properties": { - "propExtendsA": { - "type": "string" - }, - "propExtendsB": { - "$ref": "#/definitions/ModelWithString" - } - } - } - ] + "prop": { + "$ref": "#/definitions/ModelWithString" }, - "ModelThatExtendsExtends": { - "description": "This is a model that extends another model", - "type": "object", - "allOf": [ - { - "$ref": "#/definitions/ModelWithString" - }, - { - "$ref": "#/definitions/ModelThatExtends" - }, - { - "type": "object", - "properties": { - "propExtendsC": { - "type": "string" - }, - "propExtendsD": { - "$ref": "#/definitions/ModelWithString" - } - } - } - ] + "prop": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "ModelWithOrderedProperties": { + "description": "This is a model with ordered properties", + "type": "object", + "properties": { + "zebra": { + "type": "string" }, - "default": { - "type": "object", - "properties": { - "name": { - "type": "string" - } + "apple": { + "type": "string" + }, + "hawaii": { + "type": "string" + } + } + }, + "ModelWithDuplicateImports": { + "description": "This is a model with duplicated imports", + "type": "object", + "properties": { + "propA": { + "$ref": "#/definitions/ModelWithString" + }, + "propB": { + "$ref": "#/definitions/ModelWithString" + }, + "propC": { + "$ref": "#/definitions/ModelWithString" + } + } + }, + "ModelThatExtends": { + "description": "This is a model that extends another model", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/ModelWithString" + }, + { + "type": "object", + "properties": { + "propExtendsA": { + "type": "string" + }, + "propExtendsB": { + "$ref": "#/definitions/ModelWithString" } + } + } + ] + }, + "ModelThatExtendsExtends": { + "description": "This is a model that extends another model", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/ModelWithString" }, - "ModelWithPattern": { - "description": "This is a model that contains a some patterns", - "type": "object", - "required": [ - "key", - "name" - ], - "properties": { - "key": { - "maxLength": 64, - "pattern": "^[a-zA-Z0-9_]*$", - "type": "string" - }, - "name": { - "maxLength": 255, - "type": "string" - }, - "enabled": { - "type": "boolean", - "readOnly": true - }, - "modified": { - "type": "string", - "format": "date-time", - "readOnly": true - }, - "id": { - "type": "string", - "pattern": "^\\d{2}-\\d{3}-\\d{4}$" - }, - "text": { - "type": "string", - "pattern": "^\\w+$" - }, - "patternWithSingleQuotes": { - "type": "string", - "pattern": "^[a-zA-Z0-9']*$" - } + { + "$ref": "#/definitions/ModelThatExtends" + }, + { + "type": "object", + "properties": { + "propExtendsC": { + "type": "string" + }, + "propExtendsD": { + "$ref": "#/definitions/ModelWithString" } + } + } + ] + }, + "default": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "ModelWithPattern": { + "description": "This is a model that contains a some patterns", + "type": "object", + "required": ["key", "name"], + "properties": { + "key": { + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$", + "type": "string" + }, + "name": { + "maxLength": 255, + "type": "string" + }, + "enabled": { + "type": "boolean", + "readOnly": true + }, + "modified": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "id": { + "type": "string", + "pattern": "^\\d{2}-\\d{3}-\\d{4}$" + }, + "text": { + "type": "string", + "pattern": "^\\w+$" + }, + "patternWithSingleQuotes": { + "type": "string", + "pattern": "^[a-zA-Z0-9']*$" } + } } + } } diff --git a/test/spec/v3.json b/test/spec/v3.json index cb590d0b7..2455531bf 100644 --- a/test/spec/v3.json +++ b/test/spec/v3.json @@ -1,2559 +1,2378 @@ { - "openapi": "3.0.0", - "info": { - "title": "swagger", - "version": "v1.0" + "openapi": "3.0.0", + "info": { + "title": "swagger", + "version": "v1.0" + }, + "servers": [ + { + "url": "http://localhost:3000/base" + } + ], + "paths": { + "/api/v{api-version}/no-tag": { + "tags": [], + "get": { + "operationId": "ServiceWithEmptyTag" + } + }, + "/api/v{api-version}/simple": { + "get": { + "tags": ["Simple"], + "operationId": "GetCallWithoutParametersAndResponse" + }, + "put": { + "tags": ["Simple"], + "operationId": "PutCallWithoutParametersAndResponse" + }, + "post": { + "tags": ["Simple"], + "operationId": "PostCallWithoutParametersAndResponse" + }, + "delete": { + "tags": ["Simple"], + "operationId": "DeleteCallWithoutParametersAndResponse" + }, + "options": { + "tags": ["Simple"], + "operationId": "OptionsCallWithoutParametersAndResponse" + }, + "head": { + "tags": ["Simple"], + "operationId": "HeadCallWithoutParametersAndResponse" + }, + "patch": { + "tags": ["Simple"], + "operationId": "PatchCallWithoutParametersAndResponse" + } + }, + "/api/v{api-version}/descriptions/": { + "post": { + "tags": ["Descriptions"], + "operationId": "CallWithDescriptions", + "parameters": [ + { + "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", + "name": "parameterWithBreaks", + "in": "query", + "type": "string" + }, + { + "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", + "name": "parameterWithBackticks", + "in": "query", + "type": "string" + }, + { + "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", + "name": "parameterWithSlashes", + "in": "query", + "type": "string" + }, + { + "description": "Testing expression placeholders in string: ${expression} should work", + "name": "parameterWithExpressionPlaceholders", + "in": "query", + "type": "string" + }, + { + "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", + "name": "parameterWithQuotes", + "in": "query", + "type": "string" + }, + { + "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", + "name": "parameterWithReservedCharacters", + "in": "query", + "type": "string" + } + ] + } + }, + "/api/v{api-version}/parameters/deprecated": { + "post": { + "tags": ["Deprecated"], + "deprecated": true, + "operationId": "DeprecatedCall", + "parameters": [ + { + "deprecated": true, + "description": "This parameter is deprecated", + "name": "parameter", + "in": "header", + "required": true, + "nullable": true, + "schema": { + "$ref": "#/components/schemas/DeprecatedModel" + } + } + ] + } }, - "servers": [ - { - "url": "http://localhost:3000/base" + "/api/v{api-version}/parameters/{parameterPath}": { + "post": { + "tags": ["Parameters"], + "operationId": "CallWithParameters", + "parameters": [ + { + "description": "This is the parameter that goes into the header", + "name": "parameterHeader", + "in": "header", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the query params", + "name": "parameterQuery", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the form data", + "name": "parameterForm", + "in": "formData", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the cookie", + "name": "parameterCookie", + "in": "cookie", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the path", + "name": "parameterPath", + "in": "path", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "name": "api-version", + "in": "path", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "This is the parameter that goes into the body", + "required": true, + "nullable": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } } - ], - "paths": { - "/api/v{api-version}/no-tag": { - "tags": [], - "get": { - "operationId": "ServiceWithEmptyTag" + } + }, + "/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}": { + "post": { + "tags": ["Parameters"], + "operationId": "CallWithWeirdParameterNames", + "parameters": [ + { + "description": "This is the parameter that goes into the path", + "name": "parameter.path.1", + "in": "path", + "required": false, + "nullable": false, + "schema": { + "type": "string" } - }, - "/api/v{api-version}/simple": { - "get": { - "tags": [ - "Simple" - ], - "operationId": "GetCallWithoutParametersAndResponse" - }, - "put": { - "tags": [ - "Simple" - ], - "operationId": "PutCallWithoutParametersAndResponse" - }, - "post": { - "tags": [ - "Simple" - ], - "operationId": "PostCallWithoutParametersAndResponse" - }, - "delete": { - "tags": [ - "Simple" - ], - "operationId": "DeleteCallWithoutParametersAndResponse" - }, - "options": { - "tags": [ - "Simple" - ], - "operationId": "OptionsCallWithoutParametersAndResponse" - }, - "head": { - "tags": [ - "Simple" - ], - "operationId": "HeadCallWithoutParametersAndResponse" - }, - "patch": { - "tags": [ - "Simple" - ], - "operationId": "PatchCallWithoutParametersAndResponse" + }, + { + "description": "This is the parameter that goes into the path", + "name": "parameter-path-2", + "in": "path", + "required": false, + "nullable": false, + "schema": { + "type": "string" } - }, - "/api/v{api-version}/descriptions/": { - "post": { - "tags": [ - "Descriptions" - ], - "operationId": "CallWithDescriptions", - "parameters": [ - { - "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", - "name": "parameterWithBreaks", - "in": "query", - "type": "string" - }, - { - "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", - "name": "parameterWithBackticks", - "in": "query", - "type": "string" - }, - { - "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", - "name": "parameterWithSlashes", - "in": "query", - "type": "string" - }, - { - "description": "Testing expression placeholders in string: ${expression} should work", - "name": "parameterWithExpressionPlaceholders", - "in": "query", - "type": "string" - }, - { - "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", - "name": "parameterWithQuotes", - "in": "query", - "type": "string" - }, - { - "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", - "name": "parameterWithReservedCharacters", - "in": "query", - "type": "string" - } - ] + }, + { + "description": "This is the parameter that goes into the path", + "name": "PARAMETER-PATH-3", + "in": "path", + "required": false, + "nullable": false, + "schema": { + "type": "string" } - }, - "/api/v{api-version}/parameters/deprecated": { - "post": { - "tags": [ - "Deprecated" - ], - "deprecated": true, - "operationId": "DeprecatedCall", - "parameters": [ - { - "deprecated": true, - "description": "This parameter is deprecated", - "name": "parameter", - "in": "header", - "required": true, - "nullable": true, - "schema": { - "$ref": "#/components/schemas/DeprecatedModel" - } - } - ] + }, + { + "description": "This is the parameter with a reserved keyword", + "name": "default", + "in": "query", + "required": false, + "nullable": false, + "schema": { + "type": "string" } - }, - "/api/v{api-version}/parameters/{parameterPath}": { - "post": { - "tags": [ - "Parameters" - ], - "operationId": "CallWithParameters", - "parameters": [ - { - "description": "This is the parameter that goes into the header", - "name": "parameterHeader", - "in": "header", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the query params", - "name": "parameterQuery", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the form data", - "name": "parameterForm", - "in": "formData", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the cookie", - "name": "parameterCookie", - "in": "cookie", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the path", - "name": "parameterPath", - "in": "path", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "name": "api-version", - "in": "path", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "This is the parameter that goes into the body", - "required": true, - "nullable": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } + }, + { + "description": "This is the parameter that goes into the request header", + "name": "parameter.header", + "in": "header", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the request query params", + "name": "parameter-query", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the request form data", + "name": "parameter_form", + "in": "formData", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is the parameter that goes into the cookie", + "name": "PARAMETER-COOKIE", + "in": "cookie", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + }, + { + "name": "api-version", + "in": "path", + "required": true, + "nullable": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "This is the parameter that goes into the body", + "required": true, + "nullable": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + }, + "/api/v{api-version}/parameters/": { + "get": { + "tags": ["Parameters"], + "operationId": "GetCallWithOptionalParam", + "parameters": [ + { + "description": "This is an optional parameter", + "name": "parameter", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "This is a required parameter", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + }, + "post": { + "tags": ["Parameters"], + "operationId": "PostCallWithOptionalParam", + "parameters": [ + { + "description": "This is a required parameter", + "name": "parameter", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "requestBody": { + "description": "This is an optional parameter", + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + }, + "/api/v{api-version}/requestBody/": { + "post": { + "tags": ["RequestBody"], + "parameters": [ + { + "$ref": "#/components/parameters/SimpleParameter" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/SimpleRequestBody" + } + } + }, + "/api/v{api-version}/formData/": { + "post": { + "tags": ["FormData"], + "parameters": [ + { + "$ref": "#/components/parameters/SimpleParameter" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/SimpleFormData" + } + } + }, + "/api/v{api-version}/defaults": { + "get": { + "tags": ["Defaults"], + "operationId": "CallWithDefaultParameters", + "parameters": [ + { + "description": "This is a simple string with default value", + "name": "parameterString", + "in": "query", + "nullable": true, + "schema": { + "type": "string", + "default": "Hello World!" + } + }, + { + "description": "This is a simple number with default value", + "name": "parameterNumber", + "in": "query", + "nullable": true, + "schema": { + "type": "number", + "default": 123 + } + }, + { + "description": "This is a simple boolean with default value", + "name": "parameterBoolean", + "in": "query", + "nullable": true, + "schema": { + "type": "boolean", + "default": true + } + }, + { + "description": "This is a simple enum with default value", + "name": "parameterEnum", + "in": "query", + "schema": { + "enum": ["Success", "Warning", "Error"], + "default": 0 + } + }, + { + "description": "This is a simple model with default value", + "name": "parameterModel", + "in": "query", + "nullable": true, + "schema": { + "$ref": "#/components/schemas/ModelWithString", + "default": { + "prop": "Hello World!" + } + } + } + ] + }, + "post": { + "tags": ["Defaults"], + "operationId": "CallWithDefaultOptionalParameters", + "parameters": [ + { + "description": "This is a simple string that is optional with default value", + "name": "parameterString", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "Hello World!" + } + }, + { + "description": "This is a simple number that is optional with default value", + "name": "parameterNumber", + "in": "query", + "required": false, + "schema": { + "type": "number", + "default": 123 + } + }, + { + "description": "This is a simple boolean that is optional with default value", + "name": "parameterBoolean", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true + } + }, + { + "description": "This is a simple enum that is optional with default value", + "name": "parameterEnum", + "in": "query", + "required": false, + "schema": { + "enum": ["Success", "Warning", "Error"], + "default": 0 + } + }, + { + "description": "This is a simple model that is optional with default value", + "name": "parameterModel", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/ModelWithString", + "default": { + "prop": "Hello World!" + } + } + } + ] + }, + "put": { + "tags": ["Defaults"], + "operationId": "CallToTestOrderOfParams", + "parameters": [ + { + "description": "This is a optional string with default", + "name": "parameterOptionalStringWithDefault", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "Hello World!" + } + }, + { + "description": "This is a optional string with empty default", + "name": "parameterOptionalStringWithEmptyDefault", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "" + } + }, + { + "description": "This is a optional string with no default", + "name": "parameterOptionalStringWithNoDefault", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "This is a string with default", + "name": "parameterStringWithDefault", + "in": "query", + "required": true, + "schema": { + "type": "string", + "default": "Hello World!" + } + }, + { + "description": "This is a string with empty default", + "name": "parameterStringWithEmptyDefault", + "in": "query", + "required": true, + "schema": { + "type": "string", + "default": "" + } + }, + { + "description": "This is a string with no default", + "name": "parameterStringWithNoDefault", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "This is a string that can be null with no default", + "name": "parameterStringNullableWithNoDefault", + "in": "query", + "required": false, + "schema": { + "type": "string", + "nullable": true + } + }, + { + "description": "This is a string that can be null with default", + "name": "parameterStringNullableWithDefault", + "in": "query", + "required": false, + "schema": { + "type": "string", + "nullable": true, + "default": null + } + } + ] + } + }, + "/api/v{api-version}/duplicate": { + "get": { + "tags": ["Duplicate"], + "operationId": "DuplicateName" + }, + "post": { + "tags": ["Duplicate"], + "operationId": "DuplicateName" + }, + "put": { + "tags": ["Duplicate"], + "operationId": "DuplicateName" + }, + "delete": { + "tags": ["Duplicate"], + "operationId": "DuplicateName" + } + }, + "/api/v{api-version}/no-content": { + "get": { + "tags": ["NoContent"], + "operationId": "CallWithNoContentResponse", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/multiple-tags/a": { + "get": { + "tags": ["MultipleTags1", "MultipleTags2"], + "operationId": "DummyA", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/multiple-tags/b": { + "get": { + "tags": ["MultipleTags1", "MultipleTags2", "MultipleTags3"], + "operationId": "DummyB", + "responses": { + "204": { + "description": "Success" + } + } + } + }, + "/api/v{api-version}/response": { + "get": { + "tags": ["Response"], + "operationId": "CallWithResponse", + "responses": { + "default": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } + } } - }, - "/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}": { - "post": { - "tags": [ - "Parameters" - ], - "operationId": "CallWithWeirdParameterNames", - "parameters": [ - { - "description": "This is the parameter that goes into the path", - "name": "parameter.path.1", - "in": "path", - "required": false, - "nullable": false, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the path", - "name": "parameter-path-2", - "in": "path", - "required": false, - "nullable": false, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the path", - "name": "PARAMETER-PATH-3", - "in": "path", - "required": false, - "nullable": false, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter with a reserved keyword", - "name": "default", - "in": "query", - "required": false, - "nullable": false, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the request header", - "name": "parameter.header", - "in": "header", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the request query params", - "name": "parameter-query", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the request form data", - "name": "parameter_form", - "in": "formData", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "description": "This is the parameter that goes into the cookie", - "name": "PARAMETER-COOKIE", - "in": "cookie", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - }, - { - "name": "api-version", - "in": "path", - "required": true, - "nullable": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "This is the parameter that goes into the body", - "required": true, - "nullable": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } + } + } + }, + "post": { + "tags": ["Response"], + "operationId": "CallWithDuplicateResponses", + "responses": { + "default": { + "description": "Message for default response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } + } } - }, - "/api/v{api-version}/parameters/": { - "get": { - "tags": [ - "Parameters" - ], - "operationId": "GetCallWithOptionalParam", - "parameters": [ - { - "description": "This is an optional parameter", - "name": "parameter", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "This is a required parameter", - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } + }, + "201": { + "description": "Message for 201 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } - }, - "post": { - "tags": [ - "Parameters" - ], - "operationId": "PostCallWithOptionalParam", - "parameters": [ - { - "description": "This is a required parameter", - "name": "parameter", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } - } - ], - "requestBody": { - "description": "This is an optional parameter", - "required": false, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } + } + } + }, + "202": { + "description": "Message for 202 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } + } } - }, - "/api/v{api-version}/requestBody/": { - "post": { - "tags": [ - "RequestBody" - ], - "parameters": [ - { - "$ref": "#/components/parameters/SimpleParameter" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/SimpleRequestBody" + }, + "500": { + "description": "Message for 500 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } + } } - }, - "/api/v{api-version}/formData/": { - "post": { - "tags": [ - "FormData" - ], - "parameters": [ - { - "$ref": "#/components/parameters/SimpleParameter" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/SimpleFormData" + }, + "501": { + "description": "Message for 501 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } + } } - }, - "/api/v{api-version}/defaults": { - "get": { - "tags": [ - "Defaults" - ], - "operationId": "CallWithDefaultParameters", - "parameters": [ - { - "description": "This is a simple string with default value", - "name": "parameterString", - "in": "query", - "nullable": true, - "schema": { - "type": "string", - "default": "Hello World!" - } - }, - { - "description": "This is a simple number with default value", - "name": "parameterNumber", - "in": "query", - "nullable": true, - "schema": { - "type": "number", - "default": 123 - } - }, - { - "description": "This is a simple boolean with default value", - "name": "parameterBoolean", - "in": "query", - "nullable": true, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "description": "This is a simple enum with default value", - "name": "parameterEnum", - "in": "query", - "schema": { - "enum": [ - "Success", - "Warning", - "Error" - ], - "default": 0 - } - }, - { - "description": "This is a simple model with default value", - "name": "parameterModel", - "in": "query", - "nullable": true, - "schema": { - "$ref": "#/components/schemas/ModelWithString", - "default": { - "prop": "Hello World!" - } - } - } - ] - }, - "post": { - "tags": [ - "Defaults" - ], - "operationId": "CallWithDefaultOptionalParameters", - "parameters": [ - { - "description": "This is a simple string that is optional with default value", - "name": "parameterString", - "in": "query", - "required": false, - "schema": { - "type": "string", - "default": "Hello World!" - } - }, - { - "description": "This is a simple number that is optional with default value", - "name": "parameterNumber", - "in": "query", - "required": false, - "schema": { - "type": "number", - "default": 123 - } - }, - { - "description": "This is a simple boolean that is optional with default value", - "name": "parameterBoolean", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "description": "This is a simple enum that is optional with default value", - "name": "parameterEnum", - "in": "query", - "required": false, - "schema": { - "enum": [ - "Success", - "Warning", - "Error" - ], - "default": 0 - } - }, - { - "description": "This is a simple model that is optional with default value", - "name": "parameterModel", - "in": "query", - "required": false, - "schema": { - "$ref": "#/components/schemas/ModelWithString", - "default": { - "prop": "Hello World!" - } - } - } - ] - }, - "put": { - "tags": [ - "Defaults" - ], - "operationId": "CallToTestOrderOfParams", - "parameters": [ - { - "description": "This is a optional string with default", - "name": "parameterOptionalStringWithDefault", - "in": "query", - "required": false, - "schema": { - "type": "string", - "default": "Hello World!" - } - }, - { - "description": "This is a optional string with empty default", - "name": "parameterOptionalStringWithEmptyDefault", - "in": "query", - "required": false, - "schema": { - "type": "string", - "default": "" - } - }, - { - "description": "This is a optional string with no default", - "name": "parameterOptionalStringWithNoDefault", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "description": "This is a string with default", - "name": "parameterStringWithDefault", - "in": "query", - "required": true, - "schema": { - "type": "string", - "default": "Hello World!" - } - }, - { - "description": "This is a string with empty default", - "name": "parameterStringWithEmptyDefault", - "in": "query", - "required": true, - "schema": { - "type": "string", - "default": "" - } - }, - { - "description": "This is a string with no default", - "name": "parameterStringWithNoDefault", - "in": "query", - "required": true, - "schema": { - "type": "string" - } + }, + "502": { + "description": "Message for 502 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + } + }, + "put": { + "tags": ["Response"], + "operationId": "CallWithResponses", + "responses": { + "default": { + "description": "Message for default response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "200": { + "description": "Message for 200 response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "@namespace.string": { + "type": "string", + "readOnly": true }, - { - "description": "This is a string that can be null with no default", - "name": "parameterStringNullableWithNoDefault", - "in": "query", - "required": false, - "schema": { - "type": "string", - "nullable": true - } + "@namespace.integer": { + "type": "integer", + "readOnly": true }, - { - "description": "This is a string that can be null with default", - "name": "parameterStringNullableWithDefault", - "in": "query", - "required": false, - "schema": { - "type": "string", - "nullable": true, - "default": null - } + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + }, + "readOnly": true } - ] - } - }, - "/api/v{api-version}/duplicate": { - "get": { - "tags": [ - "Duplicate" - ], - "operationId": "DuplicateName" - }, - "post": { - "tags": [ - "Duplicate" - ], - "operationId": "DuplicateName" - }, - "put": { - "tags": [ - "Duplicate" - ], - "operationId": "DuplicateName" - }, - "delete": { - "tags": [ - "Duplicate" - ], - "operationId": "DuplicateName" + } + } + } } - }, - "/api/v{api-version}/no-content": { - "get": { - "tags": [ - "NoContent" - ], - "operationId": "CallWithNoContentResponse", - "responses": { - "204": { - "description": "Success" - } + }, + "201": { + "description": "Message for 201 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelThatExtends" } + } } - }, - "/api/v{api-version}/multiple-tags/a": { - "get": { - "tags": [ - "MultipleTags1", - "MultipleTags2" - ], - "operationId": "DummyA", - "responses": { - "204": { - "description": "Success" - } + }, + "202": { + "description": "Message for 202 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelThatExtendsExtends" } + } } - }, - "/api/v{api-version}/multiple-tags/b": { - "get": { - "tags": [ - "MultipleTags1", - "MultipleTags2", - "MultipleTags3" - ], - "operationId": "DummyB", - "responses": { - "204": { - "description": "Success" - } + }, + "500": { + "description": "Message for 500 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } + } } - }, - "/api/v{api-version}/response": { - "get": { - "tags": [ - "Response" - ], - "operationId": "CallWithResponse", - "responses": { - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } + }, + "501": { + "description": "Message for 501 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } - }, - "post": { - "tags": [ - "Response" - ], - "operationId": "CallWithDuplicateResponses", - "responses": { - "default": { - "description": "Message for default response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "201": { - "description": "Message for 201 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "202": { - "description": "Message for 202 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "500": { - "description": "Message for 500 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "501": { - "description": "Message for 501 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "502": { - "description": "Message for 502 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } + } + } + }, + "502": { + "description": "Message for 502 error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } + } + } + } + } + } + }, + "/api/v{api-version}/collectionFormat": { + "get": { + "tags": ["CollectionFormat"], + "operationId": "CollectionFormat", + "parameters": [ + { + "description": "This is an array parameter that is sent as csv format (comma-separated values)", + "name": "parameterArrayCSV", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "csv" + }, + { + "description": "This is an array parameter that is sent as ssv format (space-separated values)", + "name": "parameterArraySSV", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "ssv" + }, + { + "description": "This is an array parameter that is sent as tsv format (tab-separated values)", + "name": "parameterArrayTSV", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "tsv" + }, + { + "description": "This is an array parameter that is sent as pipes format (pipe-separated values)", + "name": "parameterArrayPipes", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "collectionFormat": "pipes" + }, + { + "description": "This is an array parameter that is sent as multi format (multiple parameter instances)", + "name": "parameterArrayMulti", + "in": "query", + "required": true, + "nullable": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } }, - "put": { - "tags": [ - "Response" - ], - "operationId": "CallWithResponses", - "responses": { - "default": { - "description": "Message for default response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "200": { - "description": "Message for 200 response", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "@namespace.string": { - "type": "string", - "readOnly": true - }, - "@namespace.integer": { - "type": "integer", - "readOnly": true - }, - "value": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - }, - "readOnly": true - } - } - } - } - } - }, - "201": { - "description": "Message for 201 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelThatExtends" - } - } - } - }, - "202": { - "description": "Message for 202 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelThatExtendsExtends" - } - } - } - }, - "500": { - "description": "Message for 500 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "501": { - "description": "Message for 501 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "502": { - "description": "Message for 502 error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } - } + "collectionFormat": "multi" + } + ] + } + }, + "/api/v{api-version}/types": { + "get": { + "tags": ["Types"], + "operationId": "Types", + "parameters": [ + { + "description": "This is a number parameter", + "name": "parameterNumber", + "in": "query", + "required": true, + "schema": { + "type": "number", + "default": 123 } - }, - "/api/v{api-version}/collectionFormat": { - "get": { - "tags": [ - "CollectionFormat" - ], - "operationId": "CollectionFormat", - "parameters": [ - { - "description": "This is an array parameter that is sent as csv format (comma-separated values)", - "name": "parameterArrayCSV", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "collectionFormat": "csv" - }, - { - "description": "This is an array parameter that is sent as ssv format (space-separated values)", - "name": "parameterArraySSV", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "collectionFormat": "ssv" - }, - { - "description": "This is an array parameter that is sent as tsv format (tab-separated values)", - "name": "parameterArrayTSV", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "collectionFormat": "tsv" - }, - { - "description": "This is an array parameter that is sent as pipes format (pipe-separated values)", - "name": "parameterArrayPipes", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "collectionFormat": "pipes" - }, - { - "description": "This is an array parameter that is sent as multi format (multiple parameter instances)", - "name": "parameterArrayMulti", - "in": "query", - "required": true, - "nullable": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "collectionFormat": "multi" - } - ] + }, + { + "description": "This is a string parameter", + "name": "parameterString", + "in": "query", + "required": true, + "schema": { + "type": "string", + "default": "default", + "nullable": true } - }, - "/api/v{api-version}/types": { - "get": { - "tags": [ - "Types" - ], - "operationId": "Types", - "parameters": [ - { - "description": "This is a number parameter", - "name": "parameterNumber", - "in": "query", - "required": true, - "schema": { - "type": "number", - "default": 123 - } - }, - { - "description": "This is a string parameter", - "name": "parameterString", - "in": "query", - "required": true, - "schema": { - "type": "string", - "default": "default", - "nullable": true - } - }, - { - "description": "This is a boolean parameter", - "name": "parameterBoolean", - "in": "query", - "required": true, - "schema": { - "type": "boolean", - "default": true, - "nullable": true - } - }, - { - "description": "This is an object parameter", - "name": "parameterObject", - "in": "query", - "required": true, - "schema": { - "type": "object", - "default": null, - "nullable": true - } - }, - { - "description": "This is an array parameter", - "name": "parameterArray", - "in": "query", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "nullable": true - } - }, - { - "description": "This is a dictionary parameter", - "name": "parameterDictionary", - "in": "query", - "required": true, - "schema": { - "type": "object", - "items": { - "type": "string" - }, - "nullable": true - } - }, - { - "description": "This is an enum parameter", - "name": "parameterEnum", - "in": "query", - "required": true, - "schema": { - "enum": [ - "Success", - "Warning", - "Error" - ], - "nullable": true - } - }, - { - "description": "This is a number parameter", - "name": "id", - "in": "path", - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "200": { - "description": "Response is a simple number", - "content": { - "application/json": { - "schema": { - "type": "number" - } - } - } - }, - "201": { - "description": "Response is a simple string", - "content": { - "application/json": { - "schema": { - "type": "string" - } - } - } - }, - "202": { - "description": "Response is a simple boolean", - "content": { - "application/json": { - "schema": { - "type": "boolean" - } - } - } - }, - "203": { - "description": "Response is a simple object", - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - } - } - } + }, + { + "description": "This is a boolean parameter", + "name": "parameterBoolean", + "in": "query", + "required": true, + "schema": { + "type": "boolean", + "default": true, + "nullable": true } - }, - "/api/v{api-version}/upload": { - "post": { - "tags": [ - "Upload" - ], - "operationId": "UploadFile", - "parameters": [ - { - "description": "Supply a file reference for upload", - "name": "file", - "in": "formData", - "required": true, - "schema": { - "type": "file" - } - }, - { - "name": "api-version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "nullable": true - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "boolean" - } - } - } - } - } + }, + { + "description": "This is an object parameter", + "name": "parameterObject", + "in": "query", + "required": true, + "schema": { + "type": "object", + "default": null, + "nullable": true } - }, - "/api/v{api-version}/complex": { - "get": { - "tags": [ - "Complex" - ], - "operationId": "ComplexTypes", - "parameters": [ - { - "description": "Parameter containing object", - "name": "parameterObject", - "in": "query", - "required": true, - "schema": { - "type": "object", - "properties": { - "first": { - "type": "object", - "properties": { - "second": { - "type": "object", - "properties": { - "third": { - "type": "string" - } - } - } - } - } - } - } - }, - { - "description": "Parameter containing reference", - "name": "parameterReference", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - ], - "responses": { - "200": { - "description": "Successful response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } - }, - "400": { - "description": "400 server error" - }, - "500": { - "description": "500 server error" - } - } + }, + { + "description": "This is an array parameter", + "name": "parameterArray", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true } - }, - "/api/v{api-version}/multipart": { - "post": { - "tags": [ - "multipart" - ], - "operationId": "MultipartRequest", - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "content": { - "type": "string", - "format": "binary" - }, - "data": { - "oneOf": [ - { - "$ref": "#/components/schemas/ModelWithString" - } - ], - "nullable": true - } - } - }, - "encoding": { - "content": { - "style": "form" - }, - "data": { - "style": "form" - } - } - } - } - } - }, - "get": { - "tags": [ - "multipart" - ], - "operationId": "MultipartResponse", - "responses": { - "200": { - "description": "OK", - "content": { - "multipart/mixed": { - "schema": { - "type": "object", - "properties": { - "file": { - "type": "string", - "format": "binary" - }, - "metadata": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" - } - } - } - } - } - } - } - } + }, + { + "description": "This is a dictionary parameter", + "name": "parameterDictionary", + "in": "query", + "required": true, + "schema": { + "type": "object", + "items": { + "type": "string" + }, + "nullable": true + } + }, + { + "description": "This is an enum parameter", + "name": "parameterEnum", + "in": "query", + "required": true, + "schema": { + "enum": ["Success", "Warning", "Error"], + "nullable": true + } + }, + { + "description": "This is a number parameter", + "name": "id", + "in": "path", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Response is a simple number", + "content": { + "application/json": { + "schema": { + "type": "number" } + } } - }, - "/api/v{api-version}/complex/{id}": { - "put": { - "tags": [ - "Complex" - ], - "operationId": "ComplexParams", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "api-version", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json-patch+json": { - "schema": { - "required": [ - "key", - "name", - "parameters", - "type" - ], - "type": "object", - "properties": { - "key": { - "maxLength": 64, - "pattern": "^[a-zA-Z0-9_]*$", - "type": "string", - "nullable": true, - "readOnly": true - }, - "name": { - "maxLength": 255, - "type": "string", - "nullable": true - }, - "enabled": { - "type": "boolean", - "default": true - }, - "type": { - "enum": [ - "Monkey", - "Horse", - "Bird" - ], - "type": "string", - "readOnly": true - }, - "listOfModels": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - }, - "nullable": true - }, - "listOfStrings": { - "type": "array", - "items": { - "type": "string" - }, - "nullable": true - }, - "parameters": { - "type": "object", - "oneOf": [ - { - "$ref": "#/components/schemas/ModelWithString" - }, - { - "$ref": "#/components/schemas/ModelWithEnum" - }, - { - "$ref": "#/components/schemas/ModelWithArray" - }, - { - "$ref": "#/components/schemas/ModelWithDictionary" - } - ] - }, - "user": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int32", - "readOnly": true - }, - "name": { - "type": "string", - "nullable": true, - "readOnly": true - } - }, - "readOnly": true - } - } - } - } - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json; type=collection": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - } + }, + "201": { + "description": "Response is a simple string", + "content": { + "application/json": { + "schema": { + "type": "string" } + } } - }, - "/api/v{api-version}/header": { - "post": { - "tags": [ - "Header" - ], - "operationId": "CallWithResultFromHeader", - "responses": { - "200": { - "description": "Successful response", - "headers": { - "operation-location": { - "schema": { - "type": "string" - } - } - } - }, - "400": { - "description": "400 server error" - }, - "500": { - "description": "500 server error" - } + }, + "202": { + "description": "Response is a simple boolean", + "content": { + "application/json": { + "schema": { + "type": "boolean" } + } } - }, - "/api/v{api-version}/error": { - "post": { - "tags": [ - "Error" - ], - "operationId": "testErrorCode", - "parameters": [ - { - "description": "Status code to return", - "name": "status", - "in": "query", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Custom message: Successful response" - }, - "500": { - "description": "Custom message: Internal Server Error" - }, - "501": { - "description": "Custom message: Not Implemented" - }, - "502": { - "description": "Custom message: Bad Gateway" - }, - "503": { - "description": "Custom message: Service Unavailable" - } + }, + "203": { + "description": "Response is a simple object", + "content": { + "application/json": { + "schema": { + "type": "object" } + } } + } } + } }, - "components": { - "requestBodies": { - "SimpleRequestBody": { - "description": "A reusable request body", - "required": false, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - }, - "SimpleFormData": { - "description": "A reusable request body", - "required": false, - "content": { - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } + "/api/v{api-version}/upload": { + "post": { + "tags": ["Upload"], + "operationId": "UploadFile", + "parameters": [ + { + "description": "Supply a file reference for upload", + "name": "file", + "in": "formData", + "required": true, + "schema": { + "type": "file" } - }, - "parameters": { - "SimpleParameter": { - "description": "This is a reusable parameter", - "name": "parameter", - "in": "query", - "required": false, + }, + { + "name": "api-version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "nullable": true + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { "schema": { - "type": "string" + "type": "boolean" } + } } - }, - "schemas": { - "CommentWithBreaks": { - "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", - "type": "integer" - }, - "CommentWithBackticks": { - "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", - "type": "integer" - }, - "CommentWithSlashes": { - "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", - "type": "integer" - }, - "CommentWithExpressionPlaceholders": { - "description": "Testing expression placeholders in string: ${expression} should work", - "type": "integer" - }, - "CommentWithQuotes": { - "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", - "type": "integer" - }, - "CommentWithReservedCharacters": { - "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", - "type": "integer" - }, - "SimpleInteger": { - "description": "This is a simple number", - "type": "integer" - }, - "SimpleBoolean": { - "description": "This is a simple boolean", - "type": "boolean" - }, - "SimpleString": { - "description": "This is a simple string", - "type": "string" - }, - "SimpleFile": { - "description": "This is a simple file", - "type": "file" - }, - "SimpleReference": { - "description": "This is a simple reference", - "$ref": "#/components/schemas/ModelWithString" - }, - "SimpleStringWithPattern": { - "description": "This is a simple string", - "type": "string", - "nullable": true, - "maxLength": 64, - "pattern": "^[a-zA-Z0-9_]*$" - }, - "EnumWithStrings": { - "description": "This is a simple enum with strings", - "enum": [ - "Success", - "Warning", - "Error", - "'Single Quote'", - "\"Double Quotes\"" - ] - }, - "EnumWithNumbers": { - "description": "This is a simple enum with numbers", - "enum": [ - 1, - 2, - 3, - 1.1, - 1.20, - 1.300, - 100, - 200, - 300, - -100, - -200, - -300, - -1.1, - -1.20, - -1.300 - ] - }, - "EnumFromDescription": { - "description": "Success=1,Warning=2,Error=3", - "type": "number" - }, - "EnumWithExtensions": { - "description": "This is a simple enum with numbers", - "enum": [ - 200, - 400, - 500 - ], - "x-enum-varnames": [ - "CUSTOM_SUCCESS", - "CUSTOM_WARNING", - "CUSTOM_ERROR" - ], - "x-enum-descriptions": [ - "Used when the status of something is successful", - "Used when the status of something has a warning", - "Used when the status of something has an error" - ] - }, - "ArrayWithNumbers": { - "description": "This is a simple array with numbers", - "type": "array", - "items": { - "type": "integer" - } - }, - "ArrayWithBooleans": { - "description": "This is a simple array with booleans", - "type": "array", - "items": { - "type": "boolean" - } - }, - "ArrayWithStrings": { - "description": "This is a simple array with strings", - "type": "array", - "items": { - "type": "string" - } - }, - "ArrayWithReferences": { - "description": "This is a simple array with references", - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - }, - "ArrayWithArray": { - "description": "This is a simple array containing an array", - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "ArrayWithProperties": { - "description": "This is a simple array with properties", - "type": "array", - "items": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" - } - } - } - }, - "DictionaryWithString": { - "description": "This is a string dictionary", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "DictionaryWithReference": { - "description": "This is a string reference", - "type": "object", - "additionalProperties": { + } + } + } + }, + "/api/v{api-version}/complex": { + "get": { + "tags": ["Complex"], + "operationId": "ComplexTypes", + "parameters": [ + { + "description": "Parameter containing object", + "name": "parameterObject", + "in": "query", + "required": true, + "schema": { + "type": "object", + "properties": { + "first": { + "type": "object", + "properties": { + "second": { + "type": "object", + "properties": { + "third": { + "type": "string" + } + } + } + } + } + } + } + }, + { + "description": "Parameter containing reference", + "name": "parameterReference", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/ModelWithString" + } } - }, - "DictionaryWithArray": { - "description": "This is a complex dictionary", - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "DictionaryWithDictionary": { - "description": "This is a string dictionary", - "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "DictionaryWithProperties": { - "description": "This is a complex dictionary", - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "foo": { - "type": "string" - }, - "bar": { - "type": "string" - } - } - } - }, - "ModelWithInteger": { - "description": "This is a model with one number property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple number property", - "type": "integer" - } - } - }, - "ModelWithBoolean": { - "description": "This is a model with one boolean property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple boolean property", - "type": "boolean" - } - } - }, - "ModelWithString": { - "description": "This is a model with one string property", - "type": "object", - "properties": { - "prop": { - "description": "This is a simple string property", - "type": "string" - } - } - }, - "ModelWithNullableString": { - "description": "This is a model with one string property", - "type": "object", - "required": [ - "nullableRequiredProp1", - "nullableRequiredProp2" - ], - "properties": { - "nullableProp1": { - "description": "This is a simple string property", - "type": "string", - "nullable": true - }, - "nullableRequiredProp1": { - "description": "This is a simple string property", - "type": "string", - "nullable": true - }, - "nullableProp2": { - "description": "This is a simple string property", - "type": [ - "string", - "null" - ] - }, - "nullableRequiredProp2": { - "description": "This is a simple string property", - "type": [ - "string", - "null" - ] - } - } - }, - "ModelWithEnum": { - "description": "This is a model with one enum", - "type": "object", - "properties": { - "test": { - "description": "This is a simple enum with strings", - "enum": [ - "Success", - "Warning", - "Error" - ] - }, - "statusCode": { - "description": "These are the HTTP error code enums", - "enum": [ - "100", - "200 FOO", - "300 FOO_BAR", - "400 foo-bar", - "500 foo.bar", - "600 foo&bar" - ] - }, - "bool": { - "description": "Simple boolean enum", - "type": "boolean", - "enum": [ - true - ] - } - } - }, - "ModelWithEnumFromDescription": { - "description": "This is a model with one enum", - "type": "object", - "properties": { - "test": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - } - }, - "ModelWithNestedEnums": { - "description": "This is a model with nested enums", - "type": "object", - "properties": { - "dictionaryWithEnum": { - "type": "object", - "additionalProperties": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - "dictionaryWithEnumFromDescription": { - "type": "object", - "additionalProperties": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - }, - "arrayWithEnum": { - "type": "array", - "items": { - "enum": [ - "Success", - "Warning", - "Error" - ] - } - }, - "arrayWithDescription": { - "type": "array", - "items": { - "type": "integer", - "description": "Success=1,Warning=2,Error=3" - } - } - } - }, - "ModelWithReference": { - "description": "This is a model with one property containing a reference", - "type": "object", - "properties": { - "prop": { - "$ref": "#/components/schemas/ModelWithProperties" - } - } - }, - "ModelWithArray": { - "description": "This is a model with one property containing an array", - "type": "object", - "properties": { - "prop": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ModelWithString" - } - }, - "propWithFile": { - "type": "array", - "items": { - "type": "file" - } - }, - "propWithNumber": { - "type": "array", - "items": { - "type": "number" - } - } - } - }, - "ModelWithDictionary": { - "description": "This is a model with one property containing a dictionary", - "type": "object", - "properties": { - "prop": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - }, - "DeprecatedModel": { - "deprecated": true, - "description": "This is a deprecated model with a deprecated property", - "type": "object", - "properties": { - "prop": { - "deprecated": true, - "description": "This is a deprecated property", - "type": "string" - } - } - }, - "ModelWithCircularReference": { - "description": "This is a model with one property containing a circular reference", - "type": "object", - "properties": { - "prop": { - "$ref": "#/components/schemas/ModelWithCircularReference" - } - } - }, - "CompositionWithOneOf": { - "description": "This is a model with one property with a 'one of' relationship", - "type": "object", - "properties": { - "propA": { - "type": "object", - "oneOf": [ - { - "$ref": "#/components/schemas/ModelWithString" - }, - { - "$ref": "#/components/schemas/ModelWithEnum" - }, - { - "$ref": "#/components/schemas/ModelWithArray" - }, - { - "$ref": "#/components/schemas/ModelWithDictionary" - } - ] - } - } - }, - "CompositionWithOneOfAnonymous": { - "description": "This is a model with one property with a 'one of' relationship where the options are not $ref", - "type": "object", - "properties": { - "propA": { - "type": "object", - "oneOf": [ - { - "description": "Anonymous object type", - "type": "object", - "properties": { - "propA": { - "type": "string" - } - } - }, - { - "description": "Anonymous string type", - "type": "string" - }, - { - "description": "Anonymous integer type", - "type": "integer" - } - ] - } - } - }, - "ModelCircle": { - "description": "Circle", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "kind": { - "type": "string" - }, - "radius": { - "type": "number" - } - } - }, - "ModelSquare": { - "description": "Square", - "type": "object", - "required": [ - "kind" - ], - "properties": { - "kind": { - "type": "string" - }, - "sideLength": { - "type": "number" - } - } - }, - "CompositionWithOneOfDiscriminator": { - "description": "This is a model with one property with a 'one of' relationship where the options are not $ref", - "type": "object", - "oneOf": [ - { - "$ref": "#/components/schemas/ModelCircle" - }, - { - "$ref": "#/components/schemas/ModelSquare" - } - ], - "discriminator": { - "propertyName": "kind", - "mapping": { - "circle": "#/components/schemas/ModelCircle", - "square": "#/components/schemas/ModelSquare" - } - } - }, - "CompositionWithAnyOf": { - "description": "This is a model with one property with a 'any of' relationship", - "type": "object", - "properties": { - "propA": { - "type": "object", - "anyOf": [ - { - "$ref": "#/components/schemas/ModelWithString" - }, - { - "$ref": "#/components/schemas/ModelWithEnum" - }, - { - "$ref": "#/components/schemas/ModelWithArray" - }, - { - "$ref": "#/components/schemas/ModelWithDictionary" - } - ] - } - } - }, - "CompositionWithAnyOfAnonymous": { - "description": "This is a model with one property with a 'any of' relationship where the options are not $ref", - "type": "object", - "properties": { - "propA": { - "type": "object", - "anyOf": [ - { - "description": "Anonymous object type", - "type": "object", - "properties": { - "propA": { - "type": "string" - } - } - }, - { - "description": "Anonymous string type", - "type": "string" - }, - { - "description": "Anonymous integer type", - "type": "integer" - } - ] - } - } - }, - "CompositionWithOneOfAndNullable": { - "description": "This is a model with one property with a 'one of' relationship", - "type": "object", - "properties": { - "propA": { - "nullable": true, - "type": "object", - "oneOf": [ - { - "type": "object", - "properties": { - "boolean": { - "type": "boolean" - } - } - }, - { - "$ref": "#/components/schemas/ModelWithEnum" - }, - { - "$ref": "#/components/schemas/ModelWithArray" - }, - { - "$ref": "#/components/schemas/ModelWithDictionary" - } - ] - } - } - }, - "CompositionWithOneOfAndSimpleDictionary": { - "description": "This is a model that contains a simple dictionary within composition", - "type": "object", - "properties": { - "propA": { - "oneOf": [ - { - "type": "boolean" - }, - { - "type": "object", - "additionalProperties": { - "type": "number" - } - } - ] - } - } - }, - "CompositionWithOneOfAndSimpleArrayDictionary": { - "description": "This is a model that contains a dictionary of simple arrays within composition", - "type": "object", - "properties": { - "propA": { - "oneOf": [ - { - "type": "boolean" - }, - { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "boolean" - } - } - } - ] - } - } - }, - "CompositionWithOneOfAndComplexArrayDictionary": { - "description": "This is a model that contains a dictionary of complex arrays (composited) within composition", - "type": "object", - "properties": { - "propA": { - "oneOf": [ - { - "type": "boolean" - }, - { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ] - } - } - } - ] - } - } - }, - "CompositionWithAllOfAndNullable": { - "description": "This is a model with one property with a 'all of' relationship", - "type": "object", - "properties": { - "propA": { - "nullable": true, - "type": "object", - "allOf": [ - { - "type": "object", - "properties": { - "boolean": { - "type": "boolean" - } - } - }, - { - "$ref": "#/components/schemas/ModelWithEnum" - }, - { - "$ref": "#/components/schemas/ModelWithArray" - }, - { - "$ref": "#/components/schemas/ModelWithDictionary" - } - ] - } - } - }, - "CompositionWithAnyOfAndNullable": { - "description": "This is a model with one property with a 'any of' relationship", - "type": "object", - "properties": { - "propA": { - "nullable": true, - "type": "object", - "anyOf": [ - { - "type": "object", - "properties": { - "boolean": { - "type": "boolean" - } - } - }, - { - "$ref": "#/components/schemas/ModelWithEnum" - }, - { - "$ref": "#/components/schemas/ModelWithArray" - }, - { - "$ref": "#/components/schemas/ModelWithDictionary" - } - ] - } - } - }, - "CompositionBaseModel": { - "description": "This is a base model with two simple optional properties", + } + } + }, + "400": { + "description": "400 server error" + }, + "500": { + "description": "500 server error" + } + } + } + }, + "/api/v{api-version}/multipart": { + "post": { + "tags": ["multipart"], + "operationId": "MultipartRequest", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { "type": "object", "properties": { - "firstName": { - "type": "string" + "content": { + "type": "string", + "format": "binary" + }, + "data": { + "oneOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + } + ], + "nullable": true + } + } + }, + "encoding": { + "content": { + "style": "form" + }, + "data": { + "style": "form" + } + } + } + } + } + }, + "get": { + "tags": ["multipart"], + "operationId": "MultipartResponse", + "responses": { + "200": { + "description": "OK", + "content": { + "multipart/mixed": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" }, - "lastname": { - "type": "string" + "metadata": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } } + } } - }, - "CompositionExtendedModel": { - "description": "This is a model that extends the base model", - "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/CompositionBaseModel" - } - ], - "properties": { - "age": { - "type": "number" - } - }, - "required": [ - "firstName", - "lastname", - "age" - ] - }, - "ModelWithProperties": { - "description": "This is a model with one nested property", + } + } + } + } + } + }, + "/api/v{api-version}/complex/{id}": { + "put": { + "tags": ["Complex"], + "operationId": "ComplexParams", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "api-version", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json-patch+json": { + "schema": { + "required": ["key", "name", "parameters", "type"], "type": "object", - "required": [ - "required", - "requiredAndReadOnly", - "requiredAndNullable" - ], "properties": { - "required": { - "type": "string" - }, - "requiredAndReadOnly": { - "type": "string", - "readOnly": true - }, - "requiredAndNullable": { - "type": "string", - "nullable": true - }, - "string": { - "type": "string" - }, - "number": { - "type": "number" + "key": { + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$", + "type": "string", + "nullable": true, + "readOnly": true + }, + "name": { + "maxLength": 255, + "type": "string", + "nullable": true + }, + "enabled": { + "type": "boolean", + "default": true + }, + "type": { + "enum": ["Monkey", "Horse", "Bird"], + "type": "string", + "readOnly": true + }, + "listOfModels": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" }, - "boolean": { - "type": "boolean" + "nullable": true + }, + "listOfStrings": { + "type": "array", + "items": { + "type": "string" }, - "reference": { + "nullable": true + }, + "parameters": { + "type": "object", + "oneOf": [ + { "$ref": "#/components/schemas/ModelWithString" - }, - "property with space": { - "type": "string" - }, - "default": { - "type": "string" - }, - "try": { - "type": "string" - }, - "@namespace.string": { + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + }, + "user": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32", + "readOnly": true + }, + "name": { "type": "string", + "nullable": true, "readOnly": true + } }, - "@namespace.integer": { - "type": "integer", - "readOnly": true - } + "readOnly": true + } } - }, - "ModelWithNestedProperties": { - "description": "This is a model with one nested property", - "type": "object", - "required": [ - "first" - ], - "properties": { - "first": { - "type": "object", - "required": [ - "second" - ], - "readOnly": true, - "nullable": true, - "properties": { - "second": { - "type": "object", - "required": [ - "third" - ], - "readOnly": true, - "nullable": true, - "properties": { - "third": { - "type": "string", - "required": true, - "readOnly": true, - "nullable": true - } - } - } - } - } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json; type=collection": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" } - }, - "ModelWithDuplicateProperties": { - "description": "This is a model with duplicated properties", + } + } + } + } + } + }, + "/api/v{api-version}/header": { + "post": { + "tags": ["Header"], + "operationId": "CallWithResultFromHeader", + "responses": { + "200": { + "description": "Successful response", + "headers": { + "operation-location": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "400 server error" + }, + "500": { + "description": "500 server error" + } + } + } + }, + "/api/v{api-version}/error": { + "post": { + "tags": ["Error"], + "operationId": "testErrorCode", + "parameters": [ + { + "description": "Status code to return", + "name": "status", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Custom message: Successful response" + }, + "500": { + "description": "Custom message: Internal Server Error" + }, + "501": { + "description": "Custom message: Not Implemented" + }, + "502": { + "description": "Custom message: Bad Gateway" + }, + "503": { + "description": "Custom message: Service Unavailable" + } + } + } + } + }, + "components": { + "requestBodies": { + "SimpleRequestBody": { + "description": "A reusable request body", + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + }, + "SimpleFormData": { + "description": "A reusable request body", + "required": false, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + } + }, + "parameters": { + "SimpleParameter": { + "description": "This is a reusable parameter", + "name": "parameter", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + }, + "schemas": { + "CommentWithBreaks": { + "description": "Testing multiline comments in string: First line\nSecond line\n\nFourth line", + "type": "integer" + }, + "CommentWithBackticks": { + "description": "Testing backticks in string: `backticks` and ```multiple backticks``` should work", + "type": "integer" + }, + "CommentWithSlashes": { + "description": "Testing slashes in string: \\backwards\\\\\\ and /forwards/// should work", + "type": "integer" + }, + "CommentWithExpressionPlaceholders": { + "description": "Testing expression placeholders in string: ${expression} should work", + "type": "integer" + }, + "CommentWithQuotes": { + "description": "Testing quotes in string: 'single quote''' and \"double quotes\"\"\" should work", + "type": "integer" + }, + "CommentWithReservedCharacters": { + "description": "Testing reserved characters in string: /* inline */ and /** inline **/ should work", + "type": "integer" + }, + "SimpleInteger": { + "description": "This is a simple number", + "type": "integer" + }, + "SimpleBoolean": { + "description": "This is a simple boolean", + "type": "boolean" + }, + "SimpleString": { + "description": "This is a simple string", + "type": "string" + }, + "SimpleFile": { + "description": "This is a simple file", + "type": "file" + }, + "SimpleReference": { + "description": "This is a simple reference", + "$ref": "#/components/schemas/ModelWithString" + }, + "SimpleStringWithPattern": { + "description": "This is a simple string", + "type": "string", + "nullable": true, + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$" + }, + "EnumWithStrings": { + "description": "This is a simple enum with strings", + "enum": ["Success", "Warning", "Error", "'Single Quote'", "\"Double Quotes\""] + }, + "EnumWithNumbers": { + "description": "This is a simple enum with numbers", + "enum": [1, 2, 3, 1.1, 1.2, 1.3, 100, 200, 300, -100, -200, -300, -1.1, -1.2, -1.3] + }, + "EnumFromDescription": { + "description": "Success=1,Warning=2,Error=3", + "type": "number" + }, + "EnumWithExtensions": { + "description": "This is a simple enum with numbers", + "enum": [200, 400, 500], + "x-enum-varnames": ["CUSTOM_SUCCESS", "CUSTOM_WARNING", "CUSTOM_ERROR"], + "x-enum-descriptions": [ + "Used when the status of something is successful", + "Used when the status of something has a warning", + "Used when the status of something has an error" + ] + }, + "ArrayWithNumbers": { + "description": "This is a simple array with numbers", + "type": "array", + "items": { + "type": "integer" + } + }, + "ArrayWithBooleans": { + "description": "This is a simple array with booleans", + "type": "array", + "items": { + "type": "boolean" + } + }, + "ArrayWithStrings": { + "description": "This is a simple array with strings", + "type": "array", + "items": { + "type": "string" + } + }, + "ArrayWithReferences": { + "description": "This is a simple array with references", + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + }, + "ArrayWithArray": { + "description": "This is a simple array containing an array", + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + } + }, + "ArrayWithProperties": { + "description": "This is a simple array with properties", + "type": "array", + "items": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + }, + "DictionaryWithString": { + "description": "This is a string dictionary", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "DictionaryWithReference": { + "description": "This is a string reference", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ModelWithString" + } + }, + "DictionaryWithArray": { + "description": "This is a complex dictionary", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + } + }, + "DictionaryWithDictionary": { + "description": "This is a string dictionary", + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "DictionaryWithProperties": { + "description": "This is a complex dictionary", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "string" + } + } + } + }, + "ModelWithInteger": { + "description": "This is a model with one number property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple number property", + "type": "integer" + } + } + }, + "ModelWithBoolean": { + "description": "This is a model with one boolean property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple boolean property", + "type": "boolean" + } + } + }, + "ModelWithString": { + "description": "This is a model with one string property", + "type": "object", + "properties": { + "prop": { + "description": "This is a simple string property", + "type": "string" + } + } + }, + "ModelWithNullableString": { + "description": "This is a model with one string property", + "type": "object", + "required": ["nullableRequiredProp1", "nullableRequiredProp2"], + "properties": { + "nullableProp1": { + "description": "This is a simple string property", + "type": "string", + "nullable": true + }, + "nullableRequiredProp1": { + "description": "This is a simple string property", + "type": "string", + "nullable": true + }, + "nullableProp2": { + "description": "This is a simple string property", + "type": ["string", "null"] + }, + "nullableRequiredProp2": { + "description": "This is a simple string property", + "type": ["string", "null"] + } + } + }, + "ModelWithEnum": { + "description": "This is a model with one enum", + "type": "object", + "properties": { + "test": { + "description": "This is a simple enum with strings", + "enum": ["Success", "Warning", "Error"] + }, + "statusCode": { + "description": "These are the HTTP error code enums", + "enum": ["100", "200 FOO", "300 FOO_BAR", "400 foo-bar", "500 foo.bar", "600 foo&bar"] + }, + "bool": { + "description": "Simple boolean enum", + "type": "boolean", + "enum": [true] + } + } + }, + "ModelWithEnumFromDescription": { + "description": "This is a model with one enum", + "type": "object", + "properties": { + "test": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + } + }, + "ModelWithNestedEnums": { + "description": "This is a model with nested enums", + "type": "object", + "properties": { + "dictionaryWithEnum": { + "type": "object", + "additionalProperties": { + "enum": ["Success", "Warning", "Error"] + } + }, + "dictionaryWithEnumFromDescription": { + "type": "object", + "additionalProperties": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + }, + "arrayWithEnum": { + "type": "array", + "items": { + "enum": ["Success", "Warning", "Error"] + } + }, + "arrayWithDescription": { + "type": "array", + "items": { + "type": "integer", + "description": "Success=1,Warning=2,Error=3" + } + } + } + }, + "ModelWithReference": { + "description": "This is a model with one property containing a reference", + "type": "object", + "properties": { + "prop": { + "$ref": "#/components/schemas/ModelWithProperties" + } + } + }, + "ModelWithArray": { + "description": "This is a model with one property containing an array", + "type": "object", + "properties": { + "prop": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModelWithString" + } + }, + "propWithFile": { + "type": "array", + "items": { + "type": "file" + } + }, + "propWithNumber": { + "type": "array", + "items": { + "type": "number" + } + } + } + }, + "ModelWithDictionary": { + "description": "This is a model with one property containing a dictionary", + "type": "object", + "properties": { + "prop": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "DeprecatedModel": { + "deprecated": true, + "description": "This is a deprecated model with a deprecated property", + "type": "object", + "properties": { + "prop": { + "deprecated": true, + "description": "This is a deprecated property", + "type": "string" + } + } + }, + "ModelWithCircularReference": { + "description": "This is a model with one property containing a circular reference", + "type": "object", + "properties": { + "prop": { + "$ref": "#/components/schemas/ModelWithCircularReference" + } + } + }, + "CompositionWithOneOf": { + "description": "This is a model with one property with a 'one of' relationship", + "type": "object", + "properties": { + "propA": { + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionWithOneOfAnonymous": { + "description": "This is a model with one property with a 'one of' relationship where the options are not $ref", + "type": "object", + "properties": { + "propA": { + "type": "object", + "oneOf": [ + { + "description": "Anonymous object type", "type": "object", "properties": { - "prop": { - "$ref": "#/components/schemas/ModelWithString" - }, - "prop": { - "$ref": "#/components/schemas/ModelWithString" - }, - "prop": { - "$ref": "#/components/schemas/ModelWithString" - } + "propA": { + "type": "string" + } } - }, - "ModelWithOrderedProperties": { - "description": "This is a model with ordered properties", + }, + { + "description": "Anonymous string type", + "type": "string" + }, + { + "description": "Anonymous integer type", + "type": "integer" + } + ] + } + } + }, + "ModelCircle": { + "description": "Circle", + "type": "object", + "required": ["kind"], + "properties": { + "kind": { + "type": "string" + }, + "radius": { + "type": "number" + } + } + }, + "ModelSquare": { + "description": "Square", + "type": "object", + "required": ["kind"], + "properties": { + "kind": { + "type": "string" + }, + "sideLength": { + "type": "number" + } + } + }, + "CompositionWithOneOfDiscriminator": { + "description": "This is a model with one property with a 'one of' relationship where the options are not $ref", + "type": "object", + "oneOf": [ + { + "$ref": "#/components/schemas/ModelCircle" + }, + { + "$ref": "#/components/schemas/ModelSquare" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "circle": "#/components/schemas/ModelCircle", + "square": "#/components/schemas/ModelSquare" + } + } + }, + "CompositionWithAnyOf": { + "description": "This is a model with one property with a 'any of' relationship", + "type": "object", + "properties": { + "propA": { + "type": "object", + "anyOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionWithAnyOfAnonymous": { + "description": "This is a model with one property with a 'any of' relationship where the options are not $ref", + "type": "object", + "properties": { + "propA": { + "type": "object", + "anyOf": [ + { + "description": "Anonymous object type", "type": "object", "properties": { - "zebra": { - "type": "string" - }, - "apple": { - "type": "string" - }, - "hawaii": { - "type": "string" - } + "propA": { + "type": "string" + } } - }, - "ModelWithDuplicateImports": { - "description": "This is a model with duplicated imports", + }, + { + "description": "Anonymous string type", + "type": "string" + }, + { + "description": "Anonymous integer type", + "type": "integer" + } + ] + } + } + }, + "CompositionWithOneOfAndNullable": { + "description": "This is a model with one property with a 'one of' relationship", + "type": "object", + "properties": { + "propA": { + "nullable": true, + "type": "object", + "oneOf": [ + { "type": "object", "properties": { - "propA": { - "$ref": "#/components/schemas/ModelWithString" - }, - "propB": { - "$ref": "#/components/schemas/ModelWithString" - }, - "propC": { - "$ref": "#/components/schemas/ModelWithString" - } - } - }, - "ModelThatExtends": { - "description": "This is a model that extends another model", + "boolean": { + "type": "boolean" + } + } + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionWithOneOfAndSimpleDictionary": { + "description": "This is a model that contains a simple dictionary within composition", + "type": "object", + "properties": { + "propA": { + "oneOf": [ + { + "type": "boolean" + }, + { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ModelWithString" - }, - { - "type": "object", - "properties": { - "propExtendsA": { - "type": "string" - }, - "propExtendsB": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - ] - }, - "ModelThatExtendsExtends": { - "description": "This is a model that extends another model", + "additionalProperties": { + "type": "number" + } + } + ] + } + } + }, + "CompositionWithOneOfAndSimpleArrayDictionary": { + "description": "This is a model that contains a dictionary of simple arrays within composition", + "type": "object", + "properties": { + "propA": { + "oneOf": [ + { + "type": "boolean" + }, + { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ModelWithString" - }, - { - "$ref": "#/components/schemas/ModelThatExtends" - }, - { - "type": "object", - "properties": { - "propExtendsC": { - "type": "string" - }, - "propExtendsD": { - "$ref": "#/components/schemas/ModelWithString" - } - } - } - ] - }, - "ModelWithPattern": { - "description": "This is a model that contains a some patterns", + "additionalProperties": { + "type": "array", + "items": { + "type": "boolean" + } + } + } + ] + } + } + }, + "CompositionWithOneOfAndComplexArrayDictionary": { + "description": "This is a model that contains a dictionary of complex arrays (composited) within composition", + "type": "object", + "properties": { + "propA": { + "oneOf": [ + { + "type": "boolean" + }, + { "type": "object", - "required": [ - "key", - "name" - ], - "properties": { - "key": { - "maxLength": 64, - "pattern": "^[a-zA-Z0-9_]*$", - "type": "string" - }, - "name": { - "maxLength": 255, + "additionalProperties": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "number" + }, + { "type": "string" - }, - "enabled": { - "type": "boolean", - "readOnly": true - }, - "modified": { - "type": "string", - "format": "date-time", - "readOnly": true - }, - "id": { - "type": "string", - "pattern": "^\\d{2}-\\d{3}-\\d{4}$" - }, - "text": { - "type": "string", - "pattern": "^\\w+$" - }, - "patternWithSingleQuotes": { - "type": "string", - "pattern": "^[a-zA-Z0-9']*$" - } + } + ] + } } - }, - "File": { - "required": [ - "mime" - ], + } + ] + } + } + }, + "CompositionWithAllOfAndNullable": { + "description": "This is a model with one property with a 'all of' relationship", + "type": "object", + "properties": { + "propA": { + "nullable": true, + "type": "object", + "allOf": [ + { "type": "object", "properties": { - "id": { - "title": "Id", - "type": "string", - "readOnly": true, - "minLength": 1 - }, - "updated_at": { - "title": "Updated at", - "type": "string", - "format": "date-time", - "readOnly": true - }, - "created_at": { - "title": "Created at", - "type": "string", - "format": "date-time", - "readOnly": true - }, - "mime": { - "title": "Mime", - "type": "string", - "maxLength": 24, - "minLength": 1 - }, - "file": { - "title": "File", - "type": "string", - "readOnly": true, - "format": "uri" - } - } - }, - "default": { + "boolean": { + "type": "boolean" + } + } + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionWithAnyOfAndNullable": { + "description": "This is a model with one property with a 'any of' relationship", + "type": "object", + "properties": { + "propA": { + "nullable": true, + "type": "object", + "anyOf": [ + { "type": "object", "properties": { - "name": { - "type": "string" - } - } - }, - "Pageable": { + "boolean": { + "type": "boolean" + } + } + }, + { + "$ref": "#/components/schemas/ModelWithEnum" + }, + { + "$ref": "#/components/schemas/ModelWithArray" + }, + { + "$ref": "#/components/schemas/ModelWithDictionary" + } + ] + } + } + }, + "CompositionBaseModel": { + "description": "This is a base model with two simple optional properties", + "type": "object", + "properties": { + "firstName": { + "type": "string" + }, + "lastname": { + "type": "string" + } + } + }, + "CompositionExtendedModel": { + "description": "This is a model that extends the base model", + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/CompositionBaseModel" + } + ], + "properties": { + "age": { + "type": "number" + } + }, + "required": ["firstName", "lastname", "age"] + }, + "ModelWithProperties": { + "description": "This is a model with one nested property", + "type": "object", + "required": ["required", "requiredAndReadOnly", "requiredAndNullable"], + "properties": { + "required": { + "type": "string" + }, + "requiredAndReadOnly": { + "type": "string", + "readOnly": true + }, + "requiredAndNullable": { + "type": "string", + "nullable": true + }, + "string": { + "type": "string" + }, + "number": { + "type": "number" + }, + "boolean": { + "type": "boolean" + }, + "reference": { + "$ref": "#/components/schemas/ModelWithString" + }, + "property with space": { + "type": "string" + }, + "default": { + "type": "string" + }, + "try": { + "type": "string" + }, + "@namespace.string": { + "type": "string", + "readOnly": true + }, + "@namespace.integer": { + "type": "integer", + "readOnly": true + } + } + }, + "ModelWithNestedProperties": { + "description": "This is a model with one nested property", + "type": "object", + "required": ["first"], + "properties": { + "first": { + "type": "object", + "required": ["second"], + "readOnly": true, + "nullable": true, + "properties": { + "second": { "type": "object", + "required": ["third"], + "readOnly": true, + "nullable": true, "properties": { - "page": { - "minimum": 0, - "type": "integer", - "format": "int32" - }, - "size": { - "minimum": 1, - "type": "integer", - "format": "int32" - }, - "sort": { - "type": "array", - "items": { - "type": "string" - } - } + "third": { + "type": "string", + "required": true, + "readOnly": true, + "nullable": true + } } - }, - "FreeFormObjectWithoutAdditionalProperties": { - "description": "This is a free-form object without additionalProperties.", - "type": "object" - }, - "FreeFormObjectWithAdditionalPropertiesEqTrue": { - "description": "This is a free-form object with additionalProperties: true.", - "type": "object", - "additionalProperties": true - }, - "FreeFormObjectWithAdditionalPropertiesEqEmptyObject": { - "description": "This is a free-form object with additionalProperties: {}.", - "type": "object", - "additionalProperties": {} + } + } + } + } + }, + "ModelWithDuplicateProperties": { + "description": "This is a model with duplicated properties", + "type": "object", + "properties": { + "prop": { + "$ref": "#/components/schemas/ModelWithString" + }, + "prop": { + "$ref": "#/components/schemas/ModelWithString" + }, + "prop": { + "$ref": "#/components/schemas/ModelWithString" + } + } + }, + "ModelWithOrderedProperties": { + "description": "This is a model with ordered properties", + "type": "object", + "properties": { + "zebra": { + "type": "string" + }, + "apple": { + "type": "string" + }, + "hawaii": { + "type": "string" + } + } + }, + "ModelWithDuplicateImports": { + "description": "This is a model with duplicated imports", + "type": "object", + "properties": { + "propA": { + "$ref": "#/components/schemas/ModelWithString" + }, + "propB": { + "$ref": "#/components/schemas/ModelWithString" + }, + "propC": { + "$ref": "#/components/schemas/ModelWithString" + } + } + }, + "ModelThatExtends": { + "description": "This is a model that extends another model", + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "type": "object", + "properties": { + "propExtendsA": { + "type": "string" + }, + "propExtendsB": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + ] + }, + "ModelThatExtendsExtends": { + "description": "This is a model that extends another model", + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ModelWithString" + }, + { + "$ref": "#/components/schemas/ModelThatExtends" + }, + { + "type": "object", + "properties": { + "propExtendsC": { + "type": "string" + }, + "propExtendsD": { + "$ref": "#/components/schemas/ModelWithString" + } + } + } + ] + }, + "ModelWithPattern": { + "description": "This is a model that contains a some patterns", + "type": "object", + "required": ["key", "name"], + "properties": { + "key": { + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_]*$", + "type": "string" + }, + "name": { + "maxLength": 255, + "type": "string" + }, + "enabled": { + "type": "boolean", + "readOnly": true + }, + "modified": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "id": { + "type": "string", + "pattern": "^\\d{2}-\\d{3}-\\d{4}$" + }, + "text": { + "type": "string", + "pattern": "^\\w+$" + }, + "patternWithSingleQuotes": { + "type": "string", + "pattern": "^[a-zA-Z0-9']*$" + } + } + }, + "File": { + "required": ["mime"], + "type": "object", + "properties": { + "id": { + "title": "Id", + "type": "string", + "readOnly": true, + "minLength": 1 + }, + "updated_at": { + "title": "Updated at", + "type": "string", + "format": "date-time", + "readOnly": true + }, + "created_at": { + "title": "Created at", + "type": "string", + "format": "date-time", + "readOnly": true + }, + "mime": { + "title": "Mime", + "type": "string", + "maxLength": 24, + "minLength": 1 + }, + "file": { + "title": "File", + "type": "string", + "readOnly": true, + "format": "uri" + } + } + }, + "default": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "Pageable": { + "type": "object", + "properties": { + "page": { + "minimum": 0, + "type": "integer", + "format": "int32" + }, + "size": { + "minimum": 1, + "type": "integer", + "format": "int32" + }, + "sort": { + "type": "array", + "items": { + "type": "string" } + } } + }, + "FreeFormObjectWithoutAdditionalProperties": { + "description": "This is a free-form object without additionalProperties.", + "type": "object" + }, + "FreeFormObjectWithAdditionalPropertiesEqTrue": { + "description": "This is a free-form object with additionalProperties: true.", + "type": "object", + "additionalProperties": true + }, + "FreeFormObjectWithAdditionalPropertiesEqEmptyObject": { + "description": "This is a free-form object with additionalProperties: {}.", + "type": "object", + "additionalProperties": {} + } } + } } diff --git a/types/index.d.ts b/types/index.d.ts index 1e8d698ad..2cdbe5926 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,39 +1,39 @@ export declare enum HttpClient { - FETCH = 'fetch', - XHR = 'xhr', - NODE = 'node', - AXIOS = 'axios', + FETCH = 'fetch', + XHR = 'xhr', + NODE = 'node', + AXIOS = 'axios', } export declare enum Indent { - SPACE_4 = '4', - SPACE_2 = '2', - TAB = 'tab', + SPACE_4 = '4', + SPACE_2 = '2', + TAB = 'tab', } export type Options = { - input: string | Record; - output: string; - httpClient?: HttpClient | 'fetch' | 'xhr' | 'node' | 'axios'; - clientName?: string; - useOptions?: boolean; - exportCore?: boolean; - exportServices?: boolean; - exportModels?: boolean; - exportSchemas?: boolean; - indent?: Indent | '4' | '2' | 'tab'; - postfixServices?: string; - postfixModels?: string; - request?: string; - write?: boolean; + input: string | Record; + output: string; + httpClient?: HttpClient | 'fetch' | 'xhr' | 'node' | 'axios'; + clientName?: string; + useOptions?: boolean; + exportCore?: boolean; + exportServices?: boolean; + exportModels?: boolean; + exportSchemas?: boolean; + indent?: Indent | '4' | '2' | 'tab'; + postfixServices?: string; + postfixModels?: string; + request?: string; + write?: boolean; }; export declare function generate(options: Options): Promise; declare type OpenAPI = { - HttpClient: HttpClient; - Indent: Indent; - generate: typeof generate; + HttpClient: HttpClient; + Indent: Indent; + generate: typeof generate; }; export default OpenAPI; From 872713d0e5e58a705b7ddfc2b0b3f9182d90373a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sun, 12 Nov 2023 23:20:48 +0000 Subject: [PATCH 21/48] =?UTF-8?q?=E2=9C=85=20bump=20up=20codecoverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- src/utils/formatIndentation.spec.ts | 17 +++++++++++++++++ src/utils/isEqual.spec.ts | 22 ++++++++++++++++++++++ src/utils/isEqual.ts | 3 +++ src/utils/writeClientCore.spec.ts | 29 ++++++++++++++++++++++++++--- src/utils/writeClientCore.ts | 2 +- 5 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 src/utils/formatIndentation.spec.ts create mode 100644 src/utils/isEqual.spec.ts diff --git a/src/utils/formatIndentation.spec.ts b/src/utils/formatIndentation.spec.ts new file mode 100644 index 000000000..e71a23a26 --- /dev/null +++ b/src/utils/formatIndentation.spec.ts @@ -0,0 +1,17 @@ +import { EOL } from 'os'; +import { Indent } from '../Indent'; +import { formatIndentation } from './formatIndentation'; + +describe('formatIndentation', () => { + it('should produce correct result', () => { + expect(formatIndentation('test', Indent.TAB)).toStrictEqual(`test${EOL}`); + expect(formatIndentation('test', Indent.SPACE_2)).toStrictEqual(`test${EOL}`); + expect(formatIndentation('test', Indent.SPACE_4)).toStrictEqual(`test${EOL}`); + expect(formatIndentation('\ttest', Indent.TAB)).toStrictEqual(`\ttest${EOL}`); + expect(formatIndentation('\ttest', Indent.SPACE_2)).toStrictEqual(` test${EOL}`); + expect(formatIndentation('\ttest', Indent.SPACE_4)).toStrictEqual(` test${EOL}`); + expect(formatIndentation('abc\n\ttest', Indent.TAB)).toStrictEqual(`abc${EOL}\ttest${EOL}`); + expect(formatIndentation('abc\n\ttest', Indent.SPACE_2)).toStrictEqual(`abc${EOL} test${EOL}`); + expect(formatIndentation('abc\n\ttest', Indent.SPACE_4)).toStrictEqual(`abc${EOL} test${EOL}`); + }); +}); diff --git a/src/utils/isEqual.spec.ts b/src/utils/isEqual.spec.ts new file mode 100644 index 000000000..c35fdfe7e --- /dev/null +++ b/src/utils/isEqual.spec.ts @@ -0,0 +1,22 @@ +import { isEqual } from './isEqual'; + +describe('isEqual', () => { + it('should produce correct result', () => { + expect(isEqual('foo', 'foo')).toBeTruthy(); + expect(isEqual('foo', 'bar')).toBeFalsy(); + expect(isEqual('1', 1)).toBeFalsy(); + expect(isEqual({}, {})).toBeTruthy(); + expect(isEqual({ a: 1 }, { a: 1 })).toBeTruthy(); + expect(isEqual({ a: 1 }, { b: 2 })).toBeFalsy(); + expect(isEqual({ a: 1 }, { a: '1' })).toBeFalsy(); + expect(isEqual({ a: 1 }, { b: 1 })).toBeFalsy(); + expect(isEqual({ a: 1 }, {})).toBeFalsy(); + expect(isEqual([], [])).toBeTruthy(); + expect(isEqual([1], [1])).toBeTruthy(); + expect(isEqual([1], [2])).toBeFalsy(); + expect(isEqual([1], ['1'])).toBeFalsy(); + expect(isEqual([1], [])).toBeFalsy(); + expect(isEqual({}, [])).toBeFalsy(); + expect(isEqual(NaN, NaN)).toBeTruthy(); + }); +}); diff --git a/src/utils/isEqual.ts b/src/utils/isEqual.ts index 742382751..b514cb64f 100644 --- a/src/utils/isEqual.ts +++ b/src/utils/isEqual.ts @@ -15,6 +15,9 @@ export const isEqual = (a: any, b: any): boolean => { } return true; } + if (Array.isArray(a) || Array.isArray(b)) { + return false; + } const keysA = Object.keys(a); const keysB = Object.keys(b); diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index 613a9ff01..463b52b3c 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -1,10 +1,10 @@ import { EOL } from 'os'; import { resolve } from 'path'; -import type { Client } from '../client/interfaces/Client'; import { HttpClient } from '../HttpClient'; import { Indent } from '../Indent'; -import { writeFile } from './fileSystem'; +import type { Client } from '../client/interfaces/Client'; +import { exists, writeFile } from './fileSystem'; import type { Templates } from './registerHandlebarTemplates'; import { writeClientCore } from './writeClientCore'; @@ -39,7 +39,9 @@ describe('writeClientCore', () => { }, }; - await writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4); + // @ts-ignore + exists.mockReturnValue(true); + await writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4, 'MyClient'); expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); @@ -47,5 +49,26 @@ describe('writeClientCore', () => { expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/CancelablePromise.ts'), `cancelablePromise${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); + + // @ts-ignore + exists.mockReturnValue(true); + await writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4, 'MyClient', 'request-copy.ts'); + + expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiRequestOptions.ts'), `apiRequestOptions${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/CancelablePromise.ts'), `cancelablePromise${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/BaseHttpRequest.ts'), `baseHttpRequest${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/FetchHttpRequest.ts'), `httpRequest${EOL}`); + + // @ts-ignore + exists.mockReturnValue(false); + await expect(() => + writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4, 'MyClient', 'request-copy.ts'), + ).rejects.toThrowError( + new Error(`Custom request file "${resolve(process.cwd(), './request-copy.ts')}" does not exists`), + ); }); }); diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts index 082c028a7..874e7ff83 100644 --- a/src/utils/writeClientCore.ts +++ b/src/utils/writeClientCore.ts @@ -1,8 +1,8 @@ import { resolve } from 'path'; -import type { Client } from '../client/interfaces/Client'; import type { HttpClient } from '../HttpClient'; import type { Indent } from '../Indent'; +import type { Client } from '../client/interfaces/Client'; import { copyFile, exists, writeFile } from './fileSystem'; import { formatIndentation as i } from './formatIndentation'; import { getHttpRequestName } from './getHttpRequestName'; From a58061f1d2f8517ce3f1997cd847a0de9657f142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sun, 12 Nov 2023 23:35:57 +0000 Subject: [PATCH 22/48] =?UTF-8?q?=E2=9C=85=20expect=20writeClient=20to=20b?= =?UTF-8?q?e=20ran?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- src/index.spec.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/index.spec.ts b/src/index.spec.ts index 40a8c07ba..be3237e58 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,4 +1,7 @@ import OpenAPI from './index'; +import * as Writer from './utils/writeClient'; + +const mock = jest.spyOn(Writer, 'writeClient'); describe('index', () => { it('parses v2 without issues', async () => { @@ -32,4 +35,32 @@ describe('index', () => { write: false, }); }); + it('parses and writes v2 without issues', async () => { + mock.mockClear(); + mock.mockImplementation(() => Promise.resolve()); + await OpenAPI.generate({ + input: './test/spec/v2.json', + output: './generated/v2/', + }); + expect(mock).toBeCalledTimes(1); + }); + + it('parses and writes v3 without issues', async () => { + mock.mockClear(); + mock.mockImplementation(() => Promise.resolve()); + await OpenAPI.generate({ + input: './test/spec/v3.json', + output: './generated/v3/', + }); + expect(mock).toBeCalledTimes(1); + }); + + it('fails with wrong input', async () => { + await expect(() => + OpenAPI.generate({ + input: { test: 1 }, + output: './generated/v3/', + }), + ).rejects.toThrowError('Unsupported Open API version: "undefined"'); + }); }); From 24b12946dd9359b749aceda549ad388e821fa385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sun, 12 Nov 2023 23:48:12 +0000 Subject: [PATCH 23/48] =?UTF-8?q?=F0=9F=93=9D=20add=20build=20badge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 507eab13a..556aa9fff 100644 --- a/README.md +++ b/README.md @@ -99,5 +99,5 @@ Support [coverage-image]: https://img.shields.io/codecov/c/github/maxa-ondrej/openapi-typescript-codegen.svg [downloads-url]: http://npm-stat.com/charts.html?package=@majkit/openapi [downloads-image]: http://img.shields.io/npm/dm/@majkit/openapi.svg -[build-url]: https://circleci.com/gh/maxa-ondrej/openapi-typescript-codegen -[build-image]: https://circleci.com/gh/maxa-ondrej/openapi-typescript-codegen.svg?style=svg +[build-url]: https://dl.circleci.com/status-badge/redirect/circleci/Y53CrcVgMSBZm7DzvzFD9k/AgUdrXXFjtCoKjN45w9nRx/tree/master +[build-image]: https://dl.circleci.com/status-badge/img/circleci/Y53CrcVgMSBZm7DzvzFD9k/AgUdrXXFjtCoKjN45w9nRx/tree/master.svg?style=svg From ef601d0206a3fd03ee31b7ab956d18b0406002c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sun, 12 Nov 2023 23:52:42 +0000 Subject: [PATCH 24/48] =?UTF-8?q?=F0=9F=90=9B=20badge=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 556aa9fff..457879759 100644 --- a/README.md +++ b/README.md @@ -100,4 +100,4 @@ Support [downloads-url]: http://npm-stat.com/charts.html?package=@majkit/openapi [downloads-image]: http://img.shields.io/npm/dm/@majkit/openapi.svg [build-url]: https://dl.circleci.com/status-badge/redirect/circleci/Y53CrcVgMSBZm7DzvzFD9k/AgUdrXXFjtCoKjN45w9nRx/tree/master -[build-image]: https://dl.circleci.com/status-badge/img/circleci/Y53CrcVgMSBZm7DzvzFD9k/AgUdrXXFjtCoKjN45w9nRx/tree/master.svg?style=svg +[build-image]: https://dl.circleci.com/status-badge/img/circleci/Y53CrcVgMSBZm7DzvzFD9k/AgUdrXXFjtCoKjN45w9nRx/tree/master.svg?style=svg&circle-token=28fbb9706b426e5447418405ca9e2ed1d983a79e From 022e80cd3ae592c890a9d4960b3e27bd50c3c23e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 13 Nov 2023 21:20:19 +0000 Subject: [PATCH 25/48] =?UTF-8?q?=E2=9C=A8=20decode=20api=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 240 +++-- pnpm-lock.yaml | 15 +- src/client/interfaces/Operation.d.ts | 1 - src/openApi/v2/parser/getOperation.ts | 21 +- src/openApi/v2/parser/getOperationErrors.ts | 17 - src/openApi/v2/parser/getOperationResults.ts | 86 +- src/openApi/v3/parser/getOperation.ts | 3 - src/openApi/v3/parser/getOperationErrors.ts | 13 - src/openApi/v3/parser/getOperationResults.ts | 86 +- src/templates/core/ApiError.hbs | 11 + src/templates/core/ApiRequestOptions.hbs | 11 +- src/templates/core/ApiResponse.hbs | 11 + src/templates/core/CancelablePromise.hbs | 129 --- src/templates/core/axios/getRequestBody.hbs | 5 +- src/templates/core/axios/request.hbs | 78 +- src/templates/core/fetch/getRequestBody.hbs | 12 +- src/templates/core/fetch/request.hbs | 80 +- .../core/functions/convertRequestBody.hbs | 26 + .../core/functions/decodeResponse.hbs | 8 + src/templates/core/node/getRequestBody.hbs | 12 +- src/templates/core/node/request.hbs | 76 +- src/templates/core/xhr/getRequestBody.hbs | 12 +- src/templates/core/xhr/request.hbs | 78 +- src/templates/exportService.hbs | 9 +- src/templates/partials/base.hbs | 4 +- src/templates/partials/typeInterface.hbs | 4 +- src/utils/registerHandlebarTemplates.ts | 16 +- src/utils/writeClient.spec.ts | 4 +- src/utils/writeClientClass.spec.ts | 4 +- src/utils/writeClientCore.spec.ts | 6 +- src/utils/writeClientCore.ts | 2 +- src/utils/writeClientIndex.spec.ts | 2 +- src/utils/writeClientModels.spec.ts | 4 +- src/utils/writeClientSchemas.spec.ts | 4 +- src/utils/writeClientServices.spec.ts | 4 +- test/__snapshots__/index.spec.ts.snap | 884 ++++++------------ test/index.spec.ts | 2 +- 37 files changed, 695 insertions(+), 1285 deletions(-) delete mode 100644 src/openApi/v2/parser/getOperationErrors.ts delete mode 100644 src/openApi/v3/parser/getOperationErrors.ts create mode 100644 src/templates/core/ApiResponse.hbs delete mode 100644 src/templates/core/CancelablePromise.hbs create mode 100644 src/templates/core/functions/convertRequestBody.hbs create mode 100644 src/templates/core/functions/decodeResponse.hbs diff --git a/package.json b/package.json index aa953dcdf..b8d5fec37 100644 --- a/package.json +++ b/package.json @@ -1,130 +1,116 @@ { - "name": "@majkit/openapi", - "version": "0.27.2", - "description": "Library that generates Typescript clients based on the OpenAPI specification.", - "author": "Majkit", - "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", - "repository": { - "type": "git", - "url": "git+https://github.com/maxa-ondrej/openapi-typescript-codegen.git" - }, - "bugs": { - "url": "https://github.com/maxa-ondrej/openapi-typescript-codegen/issues" - }, - "license": "MIT", - "keywords": [ - "openapi", - "swagger", - "generator", - "typescript", - "yaml", - "json", - "fetch", - "xhr", - "axios", - "angular", - "node" - ], - "maintainers": [ - { - "name": "Ondrej Maxa", - "email": "info@majksa.cz" - } - ], - "main": "dist/index.js", - "types": "types/index.d.ts", - "bin": { - "openapi": "bin/index.js" - }, - "files": [ - "bin/index.js", - "dist/index.js", - "types/index.d.ts" - ], - "scripts": { - "clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache", - "build": "rollup --config --environment NODE_ENV:development", - "build:watch": "rollup --config --environment NODE_ENV:development --watch", - "release": "rollup --config --environment NODE_ENV:production", - "validate": "tsc --project tsconfig.json --noEmit", - "run": "node ./test/index.js", - "test": "jest --selectProjects UNIT", - "test:update": "jest --selectProjects UNIT --updateSnapshot", - "test:watch": "jest --selectProjects UNIT --watch", - "test:coverage": "jest --selectProjects UNIT --coverage", - "test:e2e": "jest --selectProjects E2E --runInBand --verbose", - "eslint": "eslint .", - "eslint:fix": "eslint . --fix", - "prepare": "npm run clean && npm run release", - "docker": "docker build -t @majkit/openapi ." - }, - "dependencies": { - "@majkit/fp-ts-schema": "^1.1.1", - "camelcase": "^6.3.0", - "commander": "^11.0.0", - "fs-extra": "^11.1.1", - "handlebars": "^4.7.7", - "json-schema-ref-parser": "^9.0.9" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^16.2.9", - "@angular/animations": "16.1.3", - "@angular/cli": "16.1.3", - "@angular/common": "16.1.3", - "@angular/compiler": "16.1.3", - "@angular/compiler-cli": "16.1.3", - "@angular/core": "16.1.3", - "@angular/forms": "16.1.3", - "@angular/platform-browser": "16.1.3", - "@angular/platform-browser-dynamic": "16.1.3", - "@angular/router": "16.1.3", - "@babel/cli": "7.23.0", - "@babel/core": "7.23.2", - "@babel/preset-env": "7.23.2", - "@babel/preset-typescript": "7.23.2", - "@biomejs/biome": "^1.3.3", - "@rollup/plugin-commonjs": "25.0.7", - "@rollup/plugin-node-resolve": "15.2.3", - "@rollup/plugin-typescript": "11.1.5", - "@types/cross-spawn": "6.0.4", - "@types/express": "4.17.20", - "@types/fs-extra": "^11.0.1", - "@types/glob": "8.1.0", - "@types/jest": "29.5.6", - "@types/node": "20.8.9", - "@types/node-fetch": "2.6.4", - "@types/qs": "6.9.9", - "@typescript-eslint/eslint-plugin": "6.9.0", - "@typescript-eslint/parser": "6.9.1", - "abort-controller": "3.0.0", - "axios": "1.6.0", - "codecov": "3.8.3", - "cross-spawn": "7.0.3", - "eslint": "8.52.0", - "eslint-config-prettier": "8.10.0", - "eslint-plugin-prettier": "5.0.1", - "eslint-plugin-simple-import-sort": "10.0.0", - "express": "4.18.2", - "form-data": "4.0.0", - "glob": "10.3.10", - "jest": "29.7.0", - "jest-cli": "29.7.0", - "node-fetch": "2.6.9", - "prettier": "3.0.3", - "puppeteer": "20.9.0", - "qs": "6.11.2", - "rimraf": "5.0.5", - "rollup": "3.26.1", - "rollup-plugin-terser": "7.0.2", - "rxjs": "7.8.1", - "ts-node": "10.9.1", - "tslib": "2.6.2", - "typescript": "5.1.6", - "zone.js": "0.13.3" - }, - "overrides": { - "node-fetch": "2.6.9", - "rollup": "3.26.1", - "typescript": "5.1.6" + "name": "@majkit/openapi", + "version": "0.28.0", + "description": "Library that generates Typescript clients based on the OpenAPI specification.", + "author": "Majkit", + "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", + "repository": { + "type": "git", + "url": "git+https://github.com/maxa-ondrej/openapi-typescript-codegen.git" + }, + "bugs": { + "url": "https://github.com/maxa-ondrej/openapi-typescript-codegen/issues" + }, + "license": "MIT", + "keywords": ["openapi", "swagger", "generator", "typescript", "yaml", "json", "fetch", "xhr", "axios", "node"], + "maintainers": [ + { + "name": "Ondrej Maxa", + "email": "info@majksa.cz" } + ], + "main": "dist/index.js", + "types": "types/index.d.ts", + "bin": { + "openapi": "bin/index.js" + }, + "files": ["bin/index.js", "dist/index.js", "types/index.d.ts"], + "scripts": { + "clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache", + "build": "rollup --config --environment NODE_ENV:development", + "build:watch": "rollup --config --environment NODE_ENV:development --watch", + "release": "rollup --config --environment NODE_ENV:production", + "validate": "tsc --project tsconfig.json --noEmit", + "run": "node ./test/index.js", + "test": "jest --selectProjects UNIT", + "test:update": "jest --selectProjects UNIT --updateSnapshot", + "test:watch": "jest --selectProjects UNIT --watch", + "test:coverage": "jest --selectProjects UNIT --coverage", + "test:e2e": "jest --selectProjects E2E --runInBand --verbose", + "eslint": "eslint .", + "eslint:fix": "eslint . --fix", + "prepare": "npm run clean && npm run release", + "docker": "docker build -t @majkit/openapi ." + }, + "peerDependencies": { + "@majkit/fp-ts-schema": "^1.1.4" + }, + "dependencies": { + "camelcase": "^6.3.0", + "commander": "^11.0.0", + "fs-extra": "^11.1.1", + "handlebars": "^4.7.7", + "json-schema-ref-parser": "^9.0.9" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^16.2.9", + "@angular/animations": "16.1.3", + "@angular/cli": "16.1.3", + "@angular/common": "16.1.3", + "@angular/compiler": "16.1.3", + "@angular/compiler-cli": "16.1.3", + "@angular/core": "16.1.3", + "@angular/forms": "16.1.3", + "@angular/platform-browser": "16.1.3", + "@angular/platform-browser-dynamic": "16.1.3", + "@angular/router": "16.1.3", + "@babel/cli": "7.23.0", + "@babel/core": "7.23.2", + "@babel/preset-env": "7.23.2", + "@babel/preset-typescript": "7.23.2", + "@biomejs/biome": "^1.3.3", + "@rollup/plugin-commonjs": "25.0.7", + "@rollup/plugin-node-resolve": "15.2.3", + "@rollup/plugin-typescript": "11.1.5", + "@types/cross-spawn": "6.0.4", + "@types/express": "4.17.20", + "@types/fs-extra": "^11.0.1", + "@types/glob": "8.1.0", + "@types/jest": "29.5.6", + "@types/node": "20.8.9", + "@types/node-fetch": "2.6.4", + "@types/qs": "6.9.9", + "@typescript-eslint/eslint-plugin": "6.9.0", + "@typescript-eslint/parser": "6.9.1", + "abort-controller": "3.0.0", + "axios": "1.6.0", + "codecov": "3.8.3", + "cross-spawn": "7.0.3", + "eslint": "8.52.0", + "eslint-config-prettier": "8.10.0", + "eslint-plugin-prettier": "5.0.1", + "eslint-plugin-simple-import-sort": "10.0.0", + "express": "4.18.2", + "form-data": "4.0.0", + "glob": "10.3.10", + "jest": "29.7.0", + "jest-cli": "29.7.0", + "node-fetch": "2.6.9", + "prettier": "3.0.3", + "puppeteer": "20.9.0", + "qs": "6.11.2", + "rimraf": "5.0.5", + "rollup": "3.26.1", + "rollup-plugin-terser": "7.0.2", + "rxjs": "7.8.1", + "ts-node": "10.9.1", + "tslib": "2.6.2", + "typescript": "5.1.6", + "zone.js": "0.13.3" + }, + "overrides": { + "node-fetch": "2.6.9", + "rollup": "3.26.1", + "typescript": "5.1.6" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1aaf33a3e..7d952bf24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: '@majkit/fp-ts-schema': - specifier: ^1.1.1 - version: 1.1.1 + specifier: ^1.1.4 + version: 1.1.4(fp-ts@2.16.1) camelcase: specifier: ^6.3.0 version: 6.3.0 @@ -3498,11 +3498,12 @@ packages: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: true - /@majkit/fp-ts-schema@1.1.1: - resolution: {integrity: sha512-ldFsUOuBgCjRs872T0/PdLAKA9ZX3M3yuD2nCDIcFDe2HBxG0a4E+O+uiGWLudJkkQdwKXNKdBwzBSGAP5ys9w==} + /@majkit/fp-ts-schema@1.1.4(fp-ts@2.16.1): + resolution: {integrity: sha512-rpJFlzJY4epzjD+hns4OhNeK+lu7vlMRVhUBahr+NQcrSHCQkUOf+GNAt3nq8Vsu4Mf1j9N1iw6onVsoQqHzBA==} + peerDependencies: + fp-ts: ^2.16.1 dependencies: fp-ts: 2.16.1 - schemawax: 1.0.12 dev: false /@ngtools/webpack@16.2.10(@angular/compiler-cli@16.1.3)(typescript@5.1.6)(webpack@5.88.2): @@ -9559,10 +9560,6 @@ packages: ajv-keywords: 5.1.0(ajv@8.12.0) dev: true - /schemawax@1.0.12: - resolution: {integrity: sha512-1N6jkJHStJs24CRSb5UGgye83wxQAx3bOeJ8zaJ+QXBcUyd+xxSgZ6H9GlpYxqlddeXgOmamxS+afYZGNKWsCw==} - dev: false - /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true diff --git a/src/client/interfaces/Operation.d.ts b/src/client/interfaces/Operation.d.ts index 3229c1ffd..ad76fe036 100644 --- a/src/client/interfaces/Operation.d.ts +++ b/src/client/interfaces/Operation.d.ts @@ -10,7 +10,6 @@ export interface Operation extends OperationParameters { deprecated: boolean; method: string; path: string; - errors: OperationError[]; results: OperationResponse[]; responseHeader: string | null; } diff --git a/src/openApi/v2/parser/getOperation.ts b/src/openApi/v2/parser/getOperation.ts index 52498331d..5c49850a8 100644 --- a/src/openApi/v2/parser/getOperation.ts +++ b/src/openApi/v2/parser/getOperation.ts @@ -2,7 +2,6 @@ import type { Operation } from '../../../client/interfaces/Operation'; import type { OperationParameters } from '../../../client/interfaces/OperationParameters'; import type { OpenApi } from '../interfaces/OpenApi'; import type { OpenApiOperation } from '../interfaces/OpenApiOperation'; -import { getOperationErrors } from './getOperationErrors'; import { getOperationName } from './getOperationName'; import { getOperationParameters } from './getOperationParameters'; import { getOperationResponseHeader } from './getOperationResponseHeader'; @@ -39,7 +38,6 @@ export const getOperation = ( parametersCookie: [...pathParams.parametersCookie], parametersBody: pathParams.parametersBody, imports: [], - errors: [], results: [], responseHeader: null, }; @@ -61,13 +59,22 @@ export const getOperation = ( if (op.responses) { const operationResponses = getOperationResponses(openApi, op.responses); const operationResults = getOperationResults(operationResponses); - operation.errors = getOperationErrors(operationResponses); operation.responseHeader = getOperationResponseHeader(operationResults); - operationResults.forEach((operationResult) => { - operation.results.push(operationResult); - operation.imports.push(...operationResult.imports); - }); + const types = { + 'application/json': 1, + 'x-www-form-urlencoded': 2, + 'application/xml': 3, + } as const; + + operationResults + .sort((a, b) => (types[a.type as keyof typeof types] ?? 4) - (types[b.type as keyof typeof types] ?? 4)) + .filter(($, i1, arr) => arr.filter(({ code }, i2) => i1 > i2 && code === $.code).length === 0) + .sort((a, b) => a.code - b.code) + .forEach((operationResult) => { + operation.results.push(operationResult); + operation.imports.push(...operationResult.imports); + }); } operation.parameters = operation.parameters.sort(sortByRequired); diff --git a/src/openApi/v2/parser/getOperationErrors.ts b/src/openApi/v2/parser/getOperationErrors.ts deleted file mode 100644 index ad03bebe2..000000000 --- a/src/openApi/v2/parser/getOperationErrors.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { OperationError } from '../../../client/interfaces/OperationError'; -import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; - -/** - * - * @param operationResponses - */ -export const getOperationErrors = (operationResponses: OperationResponse[]): OperationError[] => { - return operationResponses - .filter((operationResponse) => { - return operationResponse.code >= 300 && operationResponse.description; - }) - .map((response) => ({ - code: response.code, - description: response.description!, - })); -}; diff --git a/src/openApi/v2/parser/getOperationResults.ts b/src/openApi/v2/parser/getOperationResults.ts index 67238ebbd..a99c94546 100644 --- a/src/openApi/v2/parser/getOperationResults.ts +++ b/src/openApi/v2/parser/getOperationResults.ts @@ -9,44 +9,50 @@ const areEqual = (a: Model, b: Model): boolean => { return equal; }; -export const getOperationResults = (operationResponses: OperationResponse[]): OperationResponse[] => { - const operationResults: OperationResponse[] = []; - - // Filter out success response codes, but skip "204 No Content" - operationResponses.forEach((operationResponse) => { - const { code } = operationResponse; - if (code !== 204 && ((code >= 200 && code < 300) || code === 0)) { - operationResults.push(operationResponse); - } - }); - - if (!operationResults.length) { - operationResults.push({ - in: 'response', - name: '', - code: 200, - description: '', - export: 'generic', - type: 'void', - base: 'void', - template: null, - link: null, - isDefinition: false, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }); - } - - return operationResults.filter((operationResult, index, arr) => { - return ( - arr.findIndex((item) => { - return areEqual(item, operationResult); - }) === index - ); - }); +export const getOperationResults = (operationResults: OperationResponse[]): OperationResponse[] => { + return operationResults.length === 0 + ? [ + { + in: 'response', + name: '', + code: 0, + description: '', + export: 'generic', + type: 'void', + base: 'void', + template: null, + link: null, + isDefinition: false, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }, + ] + : operationResults.map(($) => + $.code === 204 + ? { + in: 'response', + name: '', + code: 204, + description: '', + export: 'generic', + type: 'void', + base: 'void', + template: null, + link: null, + isDefinition: false, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + } + : $, + ); }; diff --git a/src/openApi/v3/parser/getOperation.ts b/src/openApi/v3/parser/getOperation.ts index d701dc0a6..080e4ed05 100644 --- a/src/openApi/v3/parser/getOperation.ts +++ b/src/openApi/v3/parser/getOperation.ts @@ -3,7 +3,6 @@ import type { OperationParameters } from '../../../client/interfaces/OperationPa import type { OpenApi } from '../interfaces/OpenApi'; import type { OpenApiOperation } from '../interfaces/OpenApiOperation'; import type { OpenApiRequestBody } from '../interfaces/OpenApiRequestBody'; -import { getOperationErrors } from './getOperationErrors'; import { getOperationName } from './getOperationName'; import { getOperationParameters } from './getOperationParameters'; import { getOperationRequestBody } from './getOperationRequestBody'; @@ -42,7 +41,6 @@ export const getOperation = ( parametersCookie: [...pathParams.parametersCookie], parametersBody: pathParams.parametersBody, imports: [], - errors: [], results: [], responseHeader: null, }; @@ -72,7 +70,6 @@ export const getOperation = ( if (op.responses) { const operationResponses = getOperationResponses(openApi, op.responses); const operationResults = getOperationResults(operationResponses); - operation.errors = getOperationErrors(operationResponses); operation.responseHeader = getOperationResponseHeader(operationResults); const types = { diff --git a/src/openApi/v3/parser/getOperationErrors.ts b/src/openApi/v3/parser/getOperationErrors.ts deleted file mode 100644 index 2b9cb5996..000000000 --- a/src/openApi/v3/parser/getOperationErrors.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { OperationError } from '../../../client/interfaces/OperationError'; -import type { OperationResponse } from '../../../client/interfaces/OperationResponse'; - -export const getOperationErrors = (operationResponses: OperationResponse[]): OperationError[] => { - return operationResponses - .filter((operationResponse) => { - return operationResponse.code >= 300 && operationResponse.description; - }) - .map((response) => ({ - code: response.code, - description: response.description!, - })); -}; diff --git a/src/openApi/v3/parser/getOperationResults.ts b/src/openApi/v3/parser/getOperationResults.ts index 67238ebbd..a99c94546 100644 --- a/src/openApi/v3/parser/getOperationResults.ts +++ b/src/openApi/v3/parser/getOperationResults.ts @@ -9,44 +9,50 @@ const areEqual = (a: Model, b: Model): boolean => { return equal; }; -export const getOperationResults = (operationResponses: OperationResponse[]): OperationResponse[] => { - const operationResults: OperationResponse[] = []; - - // Filter out success response codes, but skip "204 No Content" - operationResponses.forEach((operationResponse) => { - const { code } = operationResponse; - if (code !== 204 && ((code >= 200 && code < 300) || code === 0)) { - operationResults.push(operationResponse); - } - }); - - if (!operationResults.length) { - operationResults.push({ - in: 'response', - name: '', - code: 200, - description: '', - export: 'generic', - type: 'void', - base: 'void', - template: null, - link: null, - isDefinition: false, - isReadOnly: false, - isRequired: false, - isNullable: false, - imports: [], - enum: [], - enums: [], - properties: [], - }); - } - - return operationResults.filter((operationResult, index, arr) => { - return ( - arr.findIndex((item) => { - return areEqual(item, operationResult); - }) === index - ); - }); +export const getOperationResults = (operationResults: OperationResponse[]): OperationResponse[] => { + return operationResults.length === 0 + ? [ + { + in: 'response', + name: '', + code: 0, + description: '', + export: 'generic', + type: 'void', + base: 'void', + template: null, + link: null, + isDefinition: false, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + }, + ] + : operationResults.map(($) => + $.code === 204 + ? { + in: 'response', + name: '', + code: 204, + description: '', + export: 'generic', + type: 'void', + base: 'void', + template: null, + link: null, + isDefinition: false, + isReadOnly: false, + isRequired: false, + isNullable: false, + imports: [], + enum: [], + enums: [], + properties: [], + } + : $, + ); }; diff --git a/src/templates/core/ApiError.hbs b/src/templates/core/ApiError.hbs index 3c78b3a1b..787bbb4bf 100644 --- a/src/templates/core/ApiError.hbs +++ b/src/templates/core/ApiError.hbs @@ -22,3 +22,14 @@ export class ApiError>> extends Error { this.request = request; } } + +export class HTTPError extends Error { + cause: unknown; + + constructor(originalError: unknown) { + super(`${originalError}`); + + this.cause = originalError; + this.name = 'HTTPError'; + } +} diff --git a/src/templates/core/ApiRequestOptions.hbs b/src/templates/core/ApiRequestOptions.hbs index f3fedc14c..9782b9c49 100644 --- a/src/templates/core/ApiRequestOptions.hbs +++ b/src/templates/core/ApiRequestOptions.hbs @@ -1,14 +1,5 @@ {{>header}} -import type * as D from '@majkit/fp-ts-schema'; - -export type ApiResponse>> = { - [key in keyof T]: { - readonly status: key; - readonly body: key extends number ? D.Output : never; - }; -}[keyof T]; - export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; @@ -19,7 +10,7 @@ export type ApiRequestOptions>> = { readonly formData?: Record; readonly body?: any; readonly mediaType?: string; - readonly responseDecoders?: T; + readonly decoders?: T; readonly responseHeader?: string; readonly errors?: Record; }; diff --git a/src/templates/core/ApiResponse.hbs b/src/templates/core/ApiResponse.hbs new file mode 100644 index 000000000..182f1e83d --- /dev/null +++ b/src/templates/core/ApiResponse.hbs @@ -0,0 +1,11 @@ +{{>header}} + +import type { Decoder, Output, DecoderError } from '@majkit/fp-ts-schema'; +import type { Either } from 'fp-ts/lib/Either'; + +export type ApiResponse>> = { + [key in keyof T]: key extends number ? Either; + }> : never; +}[keyof T]; diff --git a/src/templates/core/CancelablePromise.hbs b/src/templates/core/CancelablePromise.hbs deleted file mode 100644 index b7db949b8..000000000 --- a/src/templates/core/CancelablePromise.hbs +++ /dev/null @@ -1,129 +0,0 @@ -{{>header}} - -export class CancelError extends Error { - - constructor(message: string) { - super(message); - this.name = 'CancelError'; - } - - public get isCancelled(): boolean { - return true; - } -} - -export interface OnCancel { - readonly isResolved: boolean; - readonly isRejected: boolean; - readonly isCancelled: boolean; - - (cancelHandler: () => void): void; -} - -export class CancelablePromise implements Promise { - #isResolved: boolean; - #isRejected: boolean; - #isCancelled: boolean; - readonly #cancelHandlers: (() => void)[]; - readonly #promise: Promise; - #resolve?: (value: T | PromiseLike) => void; - #reject?: (reason?: any) => void; - - constructor( - executor: ( - resolve: (value: T | PromiseLike) => void, - reject: (reason?: any) => void, - onCancel: OnCancel - ) => void - ) { - this.#isResolved = false; - this.#isRejected = false; - this.#isCancelled = false; - this.#cancelHandlers = []; - this.#promise = new Promise((resolve, reject) => { - this.#resolve = resolve; - this.#reject = reject; - - const onResolve = (value: T | PromiseLike): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isResolved = true; - if (this.#resolve) this.#resolve(value); - }; - - const onReject = (reason?: any): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isRejected = true; - if (this.#reject) this.#reject(reason); - }; - - const onCancel = (cancelHandler: () => void): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#cancelHandlers.push(cancelHandler); - }; - - Object.defineProperty(onCancel, 'isResolved', { - get: (): boolean => this.#isResolved, - }); - - Object.defineProperty(onCancel, 'isRejected', { - get: (): boolean => this.#isRejected, - }); - - Object.defineProperty(onCancel, 'isCancelled', { - get: (): boolean => this.#isCancelled, - }); - - return executor(onResolve, onReject, onCancel as OnCancel); - }); - } - - get [Symbol.toStringTag]() { - return "Cancellable Promise"; - } - - public then( - onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onRejected?: ((reason: any) => TResult2 | PromiseLike) | null - ): Promise { - return this.#promise.then(onFulfilled, onRejected); - } - - public catch( - onRejected?: ((reason: any) => TResult | PromiseLike) | null - ): Promise { - return this.#promise.catch(onRejected); - } - - public finally(onFinally?: (() => void) | null): Promise { - return this.#promise.finally(onFinally); - } - - public cancel(): void { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isCancelled = true; - if (this.#cancelHandlers.length) { - try { - for (const cancelHandler of this.#cancelHandlers) { - cancelHandler(); - } - } catch (error) { - console.warn('Cancellation threw an error', error); - return; - } - } - this.#cancelHandlers.length = 0; - if (this.#reject) this.#reject(new CancelError('Request aborted')); - } - - public get isCancelled(): boolean { - return this.#isCancelled; - } -} diff --git a/src/templates/core/axios/getRequestBody.hbs b/src/templates/core/axios/getRequestBody.hbs index b61b468e1..229c4d3f4 100644 --- a/src/templates/core/axios/getRequestBody.hbs +++ b/src/templates/core/axios/getRequestBody.hbs @@ -1,6 +1,9 @@ +{{>functions/convertRequestBody}} + + export const getRequestBody = (options: ApiRequestOptions): any => { if (options.body) { - return options.body; + return convertRequestBody(options.body); } return undefined; }; diff --git a/src/templates/core/axios/request.hbs b/src/templates/core/axios/request.hbs index 67bc95d45..c3a833d08 100644 --- a/src/templates/core/axios/request.hbs +++ b/src/templates/core/axios/request.hbs @@ -4,13 +4,14 @@ import axios from 'axios'; import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios'; import FormData from 'form-data'; -import { ApiError } from './ApiError'; -import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; +import * as D from '@majkit/fp-ts-schema'; +import { ApiError, HTTPError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; +import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; -import { either } from 'fp-ts'; +import { right, left } from 'fp-ts/lib/Either'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; {{>functions/isDefined}} @@ -60,34 +61,7 @@ import { either } from 'fp-ts'; {{>axios/getResponseBody}} -{{>functions/catchErrorCodes}} - -const flattenOption = (body: unknown): any => - typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' - && (body._tag === 'None' || body._tag === 'Some') - ? body._tag === 'Some' && 'value' in body - ? body.value : undefined - : body; - -const convertRequestBody = (body: unknown): any => - typeof body === 'object' && body !== null - ? (() => { - const flattened = flattenOption(body); - if (flattened === undefined) { - return undefined; - } - if (Array.isArray(flattened)) { - return flattened.map(value => convertRequestBody(value)); - } - if (isBlob(flattened) || isFormData(flattened)) { - return flattened; - } - if (typeof flattened === 'object' && flattened !== null) { - return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); - } - return flattened; - })() - : body; +{{>functions/decodeResponse}} /** * Request method @@ -95,34 +69,26 @@ const convertRequestBody = (body: unknown): any => * @param options The request options from the service * @param axiosClient The axios client instance to use */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise>> => { - return new CancelablePromise(async (resolve, reject, onCancel) => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): TaskEither> => { + return async () => { try { - options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options, formData); - - if (!onCancel.isCancelled) { - const response = await sendRequest(config, options, url, body, formData, headers, onCancel, axiosClient); - const responseBody = getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - - const result: ApiResult = { - url, - ok: isSuccess(response.status), - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - }; - - catchErrorCodes(options, result); - - resolve(options.responseDecoders[response.status].decode(result.body)); - } + const response = await sendRequest(config, options, url, body, formData, headers, onCancel, axiosClient); + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + const result: ApiResult = { + url, + ok: isSuccess(response.status), + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + return right(decodeResponse(result, options)); } catch (error) { - resolve(either.left(error as ApiError)); + return left(new HTTPError(error)); } - }); + }; }; diff --git a/src/templates/core/fetch/getRequestBody.hbs b/src/templates/core/fetch/getRequestBody.hbs index a82b2719d..fb234c2ba 100644 --- a/src/templates/core/fetch/getRequestBody.hbs +++ b/src/templates/core/fetch/getRequestBody.hbs @@ -1,11 +1,15 @@ +{{>functions/convertRequestBody}} + + export const getRequestBody = (options: ApiRequestOptions): any => { if (options.body !== undefined) { + const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { - return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body; + return JSON.stringify(body) + } else if (isString(body) || isBlob(body) || isFormData(body)) { + return body; } else { - return JSON.stringify(options.body); + return JSON.stringify(body); } } return undefined; diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index 7fb4f4346..2025f0be1 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -1,14 +1,13 @@ {{>header}} -import { ApiError } from './ApiError'; -import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; +import * as D from '@majkit/fp-ts-schema'; +import { ApiError, HTTPError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; +import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; -import type * as D from '@majkit/fp-ts-schema'; -import { either } from 'fp-ts'; -import type { Either } from 'fp-ts/lib/Either'; +import { right, left } from 'fp-ts/lib/Either'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; {{>functions/isDefined}} @@ -55,68 +54,33 @@ import type { Either } from 'fp-ts/lib/Either'; {{>fetch/getResponseBody}} -{{>functions/catchErrorCodes}} - -const flattenOption = (body: unknown): any => - typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' - && (body._tag === 'None' || body._tag === 'Some') - ? body._tag === 'Some' && 'value' in body - ? body.value : undefined - : body; - -const convertRequestBody = (body: unknown): any => - typeof body === 'object' && body !== null - ? (() => { - const flattened = flattenOption(body); - if (flattened === undefined) { - return undefined; - } - if (Array.isArray(flattened)) { - return flattened.map(value => convertRequestBody(value)); - } - if (isBlob(flattened) || isFormData(flattened)) { - return flattened; - } - if (typeof flattened === 'object' && flattened !== null) { - return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); - } - return flattened; - })() - : body; +{{>functions/decodeResponse}} /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { - return new CancelablePromise(async (resolve, reject, onCancel) => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { + return async () => { try { - options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - - if (!onCancel.isCancelled) { - const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - - const result: ApiResult = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - }; - - catchErrorCodes(options, result); - - resolve(options.responseDecoders[response.status].decode(result.body)); - } + const response = await sendRequest(options, url, body, formData, headers, onCancel); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + return right(decodeResponse(result, options)); } catch (error) { - resolve(either.left(error as ApiError)); + return left(new HTTPError(error)); } - }); + }; }; diff --git a/src/templates/core/functions/convertRequestBody.hbs b/src/templates/core/functions/convertRequestBody.hbs new file mode 100644 index 000000000..d37630360 --- /dev/null +++ b/src/templates/core/functions/convertRequestBody.hbs @@ -0,0 +1,26 @@ +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(convertRequestBody); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; diff --git a/src/templates/core/functions/decodeResponse.hbs b/src/templates/core/functions/decodeResponse.hbs new file mode 100644 index 000000000..90b4eae3c --- /dev/null +++ b/src/templates/core/functions/decodeResponse.hbs @@ -0,0 +1,8 @@ +const decodeResponse = >>(result: ApiResult, options: ApiRequestOptions): ApiResponse => { + const decoder = options.decoders[result.status] ?? options.decoders[0] ?? D.unknown; + const body = decoder.decode(result.data); + return { + status: result.status, + body: body, + }; +} diff --git a/src/templates/core/node/getRequestBody.hbs b/src/templates/core/node/getRequestBody.hbs index a60421623..6000cbc15 100644 --- a/src/templates/core/node/getRequestBody.hbs +++ b/src/templates/core/node/getRequestBody.hbs @@ -1,11 +1,15 @@ +{{>functions/convertRequestBody}} + + export const getRequestBody = (options: ApiRequestOptions): any => { if (options.body !== undefined) { + const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { - return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body as any; + return JSON.stringify(body) + } else if (isString(body) || isBlob(body) || isFormData(body)) { + return body as any; } else { - return JSON.stringify(options.body); + return JSON.stringify(body); } } return undefined; diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index 163e1f3a9..a102a67b6 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -5,13 +5,14 @@ import fetch, { Headers } from 'node-fetch'; import type { RequestInit, Response } from 'node-fetch'; import type { AbortSignal } from 'node-fetch/externals'; +import * as D from '@majkit/fp-ts-schema'; import { ApiError } from './ApiError'; -import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; +import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; +import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; -import { either } from 'fp-ts'; +import { right, left } from 'fp-ts/lib/Either'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; {{>functions/isDefined}} @@ -58,68 +59,33 @@ import { either } from 'fp-ts'; {{>node/getResponseBody}} -{{>functions/catchErrorCodes}} - -const flattenOption = (body: unknown): any => - typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' - && (body._tag === 'None' || body._tag === 'Some') - ? body._tag === 'Some' && 'value' in body - ? body.value : undefined - : body; - -const convertRequestBody = (body: unknown): any => - typeof body === 'object' && body !== null - ? (() => { - const flattened = flattenOption(body); - if (flattened === undefined) { - return undefined; - } - if (Array.isArray(flattened)) { - return flattened.map(value => convertRequestBody(value)); - } - if (isBlob(flattened) || isFormData(flattened)) { - return flattened; - } - if (typeof flattened === 'object' && flattened !== null) { - return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); - } - return flattened; - })() - : body; +{{>functions/decodeResponse}} /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { - return new CancelablePromise(async (resolve, reject, onCancel) => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { + return async () => { try { - options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - - if (!onCancel.isCancelled) { - const response = await sendRequest(options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - - const result: ApiResult = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - }; - - catchErrorCodes(options, result); - - resolve(options.responseDecoders[response.status].decode(result.body)); - } + const response = await sendRequest(options, url, body, formData, headers, onCancel); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + return right(decodeResponse(result, options)); } catch (error) { - resolve(either.left(error as ApiError)); + return left(new HTTPError(error)); } - }); + }; }; diff --git a/src/templates/core/xhr/getRequestBody.hbs b/src/templates/core/xhr/getRequestBody.hbs index a82b2719d..fb234c2ba 100644 --- a/src/templates/core/xhr/getRequestBody.hbs +++ b/src/templates/core/xhr/getRequestBody.hbs @@ -1,11 +1,15 @@ +{{>functions/convertRequestBody}} + + export const getRequestBody = (options: ApiRequestOptions): any => { if (options.body !== undefined) { + const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { - return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body; + return JSON.stringify(body) + } else if (isString(body) || isBlob(body) || isFormData(body)) { + return body; } else { - return JSON.stringify(options.body); + return JSON.stringify(body); } } return undefined; diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 87aef9e13..9bf111247 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -1,12 +1,13 @@ {{>header}} -import { ApiError } from './ApiError'; -import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; +import * as D from '@majkit/fp-ts-schema'; +import { ApiError, HTTPError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; +import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; -import { either } from 'fp-ts'; +import { right, left } from 'fp-ts/lib/Either'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; {{>functions/isDefined}} @@ -56,68 +57,33 @@ import { either } from 'fp-ts'; {{>xhr/getResponseBody}} -{{>functions/catchErrorCodes}} - -const flattenOption = (body: unknown): any => - typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' - && (body._tag === 'None' || body._tag === 'Some') - ? body._tag === 'Some' && 'value' in body - ? body.value : undefined - : body; - -const convertRequestBody = (body: unknown): any => - typeof body === 'object' && body !== null - ? (() => { - const flattened = flattenOption(body); - if (flattened === undefined) { - return undefined; - } - if (Array.isArray(flattened)) { - return flattened.map(value => convertRequestBody(value)); - } - if (isBlob(flattened) || isFormData(flattened)) { - return flattened; - } - if (typeof flattened === 'object' && flattened !== null) { - return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); - } - return flattened; - })() - : body; +{{>functions/decodeResponse}} /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { - return new CancelablePromise(async (resolve, reject, onCancel) => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { + return async () => { try { - options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - - if (!onCancel.isCancelled) { - const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - - const result: ApiResult = { - url, - ok: isSuccess(response.status), - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - }; - - catchErrorCodes(options, result); - - resolve(options.responseDecoders[response.status].decode(result.body)); - } + const response = await sendRequest(config, options, url, body, formData, headers, onCancel); + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + const result: ApiResult = { + url, + ok: isSuccess(response.status), + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + return right(decodeResponse(result, options)); } catch (error) { - resolve(either.left(error as ApiError)); + return left(new HTTPError(error)); } - }); + }; }; diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index ee1d73578..7c128677c 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -96,19 +96,12 @@ export class {{{name}}}{{{@root.postfix}}} { responseHeader: '{{{responseHeader}}}', {{/if}} {{#if results}} - responseDecoders: { + decoders: { {{#each results}} {{{code}}}: {{>type}}, {{/each}} }, {{/if}} - {{#if errors}} - errors: { - {{#each errors}} - {{{code}}}: `{{{escapeDescription description}}}`, - {{/each}} - }, - {{/if}} }); } diff --git a/src/templates/partials/base.hbs b/src/templates/partials/base.hbs index a10dc45e0..e176504a1 100644 --- a/src/templates/partials/base.hbs +++ b/src/templates/partials/base.hbs @@ -14,9 +14,7 @@ D.string {{~else equals base 'void'~}} D.succeed(undefined) {{~else equals base 'any'~}} -D.createDecoder({ - forceDecode: (data) => data, -}) +D.unknown {{~else equals base 'date'~}} D.createDecoder({ forceDecode: (data) => { diff --git a/src/templates/partials/typeInterface.hbs b/src/templates/partials/typeInterface.hbs index 2d00caf21..06d10d2f8 100644 --- a/src/templates/partials/typeInterface.hbs +++ b/src/templates/partials/typeInterface.hbs @@ -13,7 +13,5 @@ D.object({ }) {{~/isNullable}} {{~else~}} -D.createDecoder({ - forceDecode: (data) => data, -}) +D.unknown {{~/if~}} diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index cb9edb240..e28377786 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -4,15 +4,17 @@ import { HttpClient } from '../HttpClient'; import templateClient from '../templates/client.hbs'; import templateCoreApiError from '../templates/core/ApiError.hbs'; import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs'; +import templateCoreApiResponse from '../templates/core/ApiResponse.hbs'; import templateCoreApiResult from '../templates/core/ApiResult.hbs'; +import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs'; +import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs'; +import templateCoreSettings from '../templates/core/OpenAPI.hbs'; import axiosGetHeaders from '../templates/core/axios/getHeaders.hbs'; import axiosGetRequestBody from '../templates/core/axios/getRequestBody.hbs'; import axiosGetResponseBody from '../templates/core/axios/getResponseBody.hbs'; import axiosGetResponseHeader from '../templates/core/axios/getResponseHeader.hbs'; import axiosRequest from '../templates/core/axios/request.hbs'; import axiosSendRequest from '../templates/core/axios/sendRequest.hbs'; -import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs'; -import templateCancelablePromise from '../templates/core/CancelablePromise.hbs'; import fetchGetHeaders from '../templates/core/fetch/getHeaders.hbs'; import fetchGetRequestBody from '../templates/core/fetch/getRequestBody.hbs'; import fetchGetResponseBody from '../templates/core/fetch/getResponseBody.hbs'; @@ -21,6 +23,8 @@ import fetchRequest from '../templates/core/fetch/request.hbs'; import fetchSendRequest from '../templates/core/fetch/sendRequest.hbs'; import functionBase64 from '../templates/core/functions/base64.hbs'; import functionCatchErrorCodes from '../templates/core/functions/catchErrorCodes.hbs'; +import functionConvertRequestBody from '../templates/core/functions/convertRequestBody.hbs'; +import functionDecodeResponse from '../templates/core/functions/decodeResponse.hbs'; import functionGetFormData from '../templates/core/functions/getFormData.hbs'; import functionGetQueryString from '../templates/core/functions/getQueryString.hbs'; import functionGetUrl from '../templates/core/functions/getUrl.hbs'; @@ -31,14 +35,12 @@ import functionIsString from '../templates/core/functions/isString.hbs'; import functionIsStringWithValue from '../templates/core/functions/isStringWithValue.hbs'; import functionIsSuccess from '../templates/core/functions/isSuccess.hbs'; import functionResolve from '../templates/core/functions/resolve.hbs'; -import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs'; import nodeGetHeaders from '../templates/core/node/getHeaders.hbs'; import nodeGetRequestBody from '../templates/core/node/getRequestBody.hbs'; import nodeGetResponseBody from '../templates/core/node/getResponseBody.hbs'; import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs'; import nodeRequest from '../templates/core/node/request.hbs'; import nodeSendRequest from '../templates/core/node/sendRequest.hbs'; -import templateCoreSettings from '../templates/core/OpenAPI.hbs'; import templateCoreRequest from '../templates/core/request.hbs'; import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs'; import xhrGetRequestBody from '../templates/core/xhr/getRequestBody.hbs'; @@ -87,8 +89,8 @@ export interface Templates { settings: Handlebars.TemplateDelegate; apiError: Handlebars.TemplateDelegate; apiRequestOptions: Handlebars.TemplateDelegate; + apiResponse: Handlebars.TemplateDelegate; apiResult: Handlebars.TemplateDelegate; - cancelablePromise: Handlebars.TemplateDelegate; request: Handlebars.TemplateDelegate; baseHttpRequest: Handlebars.TemplateDelegate; httpRequest: Handlebars.TemplateDelegate; @@ -118,8 +120,8 @@ export const registerHandlebarTemplates = (root: { settings: Handlebars.template(templateCoreSettings), apiError: Handlebars.template(templateCoreApiError), apiRequestOptions: Handlebars.template(templateCoreApiRequestOptions), + apiResponse: Handlebars.template(templateCoreApiResponse), apiResult: Handlebars.template(templateCoreApiResult), - cancelablePromise: Handlebars.template(templateCancelablePromise), request: Handlebars.template(templateCoreRequest), baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest), httpRequest: Handlebars.template(templateCoreHttpRequest), @@ -153,6 +155,8 @@ export const registerHandlebarTemplates = (root: { // Generic functions used in 'request' file @see src/templates/core/request.hbs for more info Handlebars.registerPartial('functions/catchErrorCodes', Handlebars.template(functionCatchErrorCodes)); + Handlebars.registerPartial('functions/convertRequestBody', Handlebars.template(functionConvertRequestBody)); + Handlebars.registerPartial('functions/decodeResponse', Handlebars.template(functionDecodeResponse)); Handlebars.registerPartial('functions/getFormData', Handlebars.template(functionGetFormData)); Handlebars.registerPartial('functions/getQueryString', Handlebars.template(functionGetQueryString)); Handlebars.registerPartial('functions/getUrl', Handlebars.template(functionGetUrl)); diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index dcc516306..9049dfc22 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -1,6 +1,6 @@ -import type { Client } from '../client/interfaces/Client'; import { HttpClient } from '../HttpClient'; import { Indent } from '../Indent'; +import type { Client } from '../client/interfaces/Client'; import { mkdir, rmdir, writeFile } from './fileSystem'; import type { Templates } from './registerHandlebarTemplates'; import { writeClient } from './writeClient'; @@ -28,8 +28,8 @@ describe('writeClient', () => { settings: () => 'settings', apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', + apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts index 698a28608..d138b2cd9 100644 --- a/src/utils/writeClientClass.spec.ts +++ b/src/utils/writeClientClass.spec.ts @@ -1,6 +1,6 @@ -import type { Client } from '../client/interfaces/Client'; import { HttpClient } from '../HttpClient'; import { Indent } from '../Indent'; +import type { Client } from '../client/interfaces/Client'; import { writeFile } from './fileSystem'; import type { Templates } from './registerHandlebarTemplates'; import { writeClientClass } from './writeClientClass'; @@ -28,8 +28,8 @@ describe('writeClientClass', () => { settings: () => 'settings', apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', + apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index 463b52b3c..da528c99c 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -31,8 +31,8 @@ describe('writeClientCore', () => { settings: () => 'settings', apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', + apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', httpRequest: () => 'httpRequest', @@ -46,8 +46,8 @@ describe('writeClientCore', () => { expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiRequestOptions.ts'), `apiRequestOptions${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiResponse.ts'), `apiResponse${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/CancelablePromise.ts'), `cancelablePromise${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); // @ts-ignore @@ -57,8 +57,8 @@ describe('writeClientCore', () => { expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiRequestOptions.ts'), `apiRequestOptions${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/ApiResponse.ts'), `apiResponse${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/CancelablePromise.ts'), `cancelablePromise${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/BaseHttpRequest.ts'), `baseHttpRequest${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/FetchHttpRequest.ts'), `httpRequest${EOL}`); diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts index 874e7ff83..aef34bd98 100644 --- a/src/utils/writeClientCore.ts +++ b/src/utils/writeClientCore.ts @@ -40,8 +40,8 @@ export const writeClientCore = async ( await writeFile(resolve(outputPath, 'OpenAPI.ts'), i(templates.core.settings(context), indent)); await writeFile(resolve(outputPath, 'ApiError.ts'), i(templates.core.apiError(context), indent)); await writeFile(resolve(outputPath, 'ApiRequestOptions.ts'), i(templates.core.apiRequestOptions(context), indent)); + await writeFile(resolve(outputPath, 'ApiResponse.ts'), i(templates.core.apiResponse(context), indent)); await writeFile(resolve(outputPath, 'ApiResult.ts'), i(templates.core.apiResult(context), indent)); - await writeFile(resolve(outputPath, 'CancelablePromise.ts'), i(templates.core.cancelablePromise(context), indent)); await writeFile(resolve(outputPath, 'request.ts'), i(templates.core.request(context), indent)); if (isDefined(clientName)) { diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index 6336f581a..511604812 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -28,8 +28,8 @@ describe('writeClientIndex', () => { settings: () => 'settings', apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', + apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index 6b6ff227a..aa67c9b66 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -1,9 +1,9 @@ import { EOL } from 'os'; import { resolve } from 'path'; -import type { Model } from '../client/interfaces/Model'; import { HttpClient } from '../HttpClient'; import { Indent } from '../Indent'; +import type { Model } from '../client/interfaces/Model'; import { writeFile } from './fileSystem'; import type { Templates } from './registerHandlebarTemplates'; import { writeClientModels } from './writeClientModels'; @@ -44,8 +44,8 @@ describe('writeClientModels', () => { settings: () => 'settings', apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', + apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index 256b87a4e..068881a48 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -1,9 +1,9 @@ import { EOL } from 'os'; import { resolve } from 'path'; -import type { Model } from '../client/interfaces/Model'; import { HttpClient } from '../HttpClient'; import { Indent } from '../Indent'; +import type { Model } from '../client/interfaces/Model'; import { writeFile } from './fileSystem'; import type { Templates } from './registerHandlebarTemplates'; import { writeClientSchemas } from './writeClientSchemas'; @@ -44,8 +44,8 @@ describe('writeClientSchemas', () => { settings: () => 'settings', apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', + apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index 1bb7e518b..dfbe1e28e 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -1,9 +1,9 @@ import { EOL } from 'os'; import { resolve } from 'path'; -import type { Service } from '../client/interfaces/Service'; import { HttpClient } from '../HttpClient'; import { Indent } from '../Indent'; +import type { Service } from '../client/interfaces/Service'; import { writeFile } from './fileSystem'; import type { Templates } from './registerHandlebarTemplates'; import { writeClientServices } from './writeClientServices'; @@ -32,8 +32,8 @@ describe('writeClientServices', () => { settings: () => 'settings', apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', + apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', - cancelablePromise: () => 'cancelablePromise', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', httpRequest: () => 'httpRequest', diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index eff6fd73b..1beffe91e 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -27,6 +27,17 @@ export class ApiError>> extends Error { this.request = request; } } + +export class HTTPError extends Error { + cause: unknown; + + constructor(originalError: unknown) { + super(\`\${originalError}\`); + + this.cause = originalError; + this.name = 'HTTPError'; + } +} " `; @@ -35,15 +46,6 @@ exports[`v2 should generate: test/generated/v2/core/ApiRequestOptions.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type * as D from '@majkit/fp-ts-schema'; - -export type ApiResponse>> = { - [key in keyof T]: { - readonly status: key; - readonly body: key extends number ? D.Output : never; - }; -}[keyof T]; - export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; @@ -54,13 +56,30 @@ export type ApiRequestOptions>> = { readonly formData?: Record; readonly body?: any; readonly mediaType?: string; - readonly responseDecoders?: T; + readonly decoders?: T; readonly responseHeader?: string; readonly errors?: Record; }; " `; +exports[`v2 should generate: test/generated/v2/core/ApiResponse.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { Decoder, Output, DecoderError } from '@majkit/fp-ts-schema'; +import type { Either } from 'fp-ts/lib/Either'; + +export type ApiResponse>> = { + [key in keyof T]: key extends number ? Either; + }> : never; +}[keyof T]; +" +`; + exports[`v2 should generate: test/generated/v2/core/ApiResult.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ @@ -76,141 +95,6 @@ export type ApiResult = { " `; -exports[`v2 should generate: test/generated/v2/core/CancelablePromise.ts 1`] = ` -"/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export class CancelError extends Error { - - constructor(message: string) { - super(message); - this.name = 'CancelError'; - } - - public get isCancelled(): boolean { - return true; - } -} - -export interface OnCancel { - readonly isResolved: boolean; - readonly isRejected: boolean; - readonly isCancelled: boolean; - - (cancelHandler: () => void): void; -} - -export class CancelablePromise implements Promise { - #isResolved: boolean; - #isRejected: boolean; - #isCancelled: boolean; - readonly #cancelHandlers: (() => void)[]; - readonly #promise: Promise; - #resolve?: (value: T | PromiseLike) => void; - #reject?: (reason?: any) => void; - - constructor( - executor: ( - resolve: (value: T | PromiseLike) => void, - reject: (reason?: any) => void, - onCancel: OnCancel - ) => void - ) { - this.#isResolved = false; - this.#isRejected = false; - this.#isCancelled = false; - this.#cancelHandlers = []; - this.#promise = new Promise((resolve, reject) => { - this.#resolve = resolve; - this.#reject = reject; - - const onResolve = (value: T | PromiseLike): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isResolved = true; - if (this.#resolve) this.#resolve(value); - }; - - const onReject = (reason?: any): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isRejected = true; - if (this.#reject) this.#reject(reason); - }; - - const onCancel = (cancelHandler: () => void): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#cancelHandlers.push(cancelHandler); - }; - - Object.defineProperty(onCancel, 'isResolved', { - get: (): boolean => this.#isResolved, - }); - - Object.defineProperty(onCancel, 'isRejected', { - get: (): boolean => this.#isRejected, - }); - - Object.defineProperty(onCancel, 'isCancelled', { - get: (): boolean => this.#isCancelled, - }); - - return executor(onResolve, onReject, onCancel as OnCancel); - }); - } - - get [Symbol.toStringTag]() { - return "Cancellable Promise"; - } - - public then( - onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onRejected?: ((reason: any) => TResult2 | PromiseLike) | null - ): Promise { - return this.#promise.then(onFulfilled, onRejected); - } - - public catch( - onRejected?: ((reason: any) => TResult | PromiseLike) | null - ): Promise { - return this.#promise.catch(onRejected); - } - - public finally(onFinally?: (() => void) | null): Promise { - return this.#promise.finally(onFinally); - } - - public cancel(): void { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isCancelled = true; - if (this.#cancelHandlers.length) { - try { - for (const cancelHandler of this.#cancelHandlers) { - cancelHandler(); - } - } catch (error) { - console.warn('Cancellation threw an error', error); - return; - } - } - this.#cancelHandlers.length = 0; - if (this.#reject) this.#reject(new CancelError('Request aborted')); - } - - public get isCancelled(): boolean { - return this.#isCancelled; - } -} -" -`; - exports[`v2 should generate: test/generated/v2/core/OpenAPI.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ @@ -253,15 +137,14 @@ exports[`v2 should generate: test/generated/v2/core/request.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import { ApiError } from './ApiError'; -import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; +import * as D from '@majkit/fp-ts-schema'; +import { ApiError, HTTPError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; +import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; -import type * as D from '@majkit/fp-ts-schema'; -import { either } from 'fp-ts'; -import type { Either } from 'fp-ts/lib/Either'; +import { right, left } from 'fp-ts/lib/Either'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; export const isDefined = (value: T | null | undefined): value is Exclude => { return value !== undefined && value !== null; @@ -431,14 +314,42 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio return new Headers(headers); }; +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(convertRequestBody); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; + export const getRequestBody = (options: ApiRequestOptions): any => { if (options.body !== undefined) { + const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { - return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body; + return JSON.stringify(body) + } else if (isString(body) || isBlob(body) || isFormData(body)) { + return body; } else { - return JSON.stringify(options.body); + return JSON.stringify(body); } } return undefined; @@ -501,101 +412,41 @@ export const getResponseBody = async (response: Response): Promise => { return undefined; }; -export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { - const errors: Record = { - 400: 'Bad Request', - 401: 'Unauthorized', - 403: 'Forbidden', - 404: 'Not Found', - 500: 'Internal Server Error', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - ...options.errors, - } - - const error = errors[result.status]; - if (error) { - throw new ApiError(options, result, error); - } - - if (!result.ok) { - const errorStatus = result.status ?? 'unknown'; - const errorStatusText = result.statusText ?? 'unknown'; - const errorBody = (() => { - try { - return JSON.stringify(result.body, null, 2); - } catch (e) { - return undefined; - } - })(); - - throw new ApiError(options, result, - \`Generic Error: status: \${errorStatus}; status text: \${errorStatusText}; body: \${errorBody}\` - ); - } -}; -const flattenOption = (body: unknown): any => - typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' - && (body._tag === 'None' || body._tag === 'Some') - ? body._tag === 'Some' && 'value' in body - ? body.value : undefined - : body; - -const convertRequestBody = (body: unknown): any => - typeof body === 'object' && body !== null - ? (() => { - const flattened = flattenOption(body); - if (flattened === undefined) { - return undefined; - } - if (Array.isArray(flattened)) { - return flattened.map(value => convertRequestBody(value)); - } - if (isBlob(flattened) || isFormData(flattened)) { - return flattened; - } - if (typeof flattened === 'object' && flattened !== null) { - return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); - } - return flattened; - })() - : body; - +const decodeResponse = >>(result: ApiResult, options: ApiRequestOptions): ApiResponse => { + const decoder = options.decoders[result.status] ?? options.decoders[0] ?? D.unknown; + const body = decoder.decode(result.data); + return { + status: result.status, + body: body, + }; +} /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { - return new CancelablePromise(async (resolve, reject, onCancel) => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { + return async () => { try { - options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - - if (!onCancel.isCancelled) { - const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - - const result: ApiResult = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - }; - - catchErrorCodes(options, result); - - resolve(options.responseDecoders[response.status].decode(result.body)); - } + const response = await sendRequest(options, url, body, formData, headers, onCancel); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + return right(decodeResponse(result, options)); } catch (error) { - resolve(either.left(error as ApiError)); + return left(new HTTPError(error)); } - }); + }; }; " `; @@ -2304,12 +2155,10 @@ export class ComplexService { 'parameterObject': parameterObject, 'parameterReference': parameterReference, }, - responseDecoders: { + decoders: { 200: D.array(ModelWithString), - }, - errors: { - 400: \`400 server error\`, - 500: \`500 server error\`, + 400: D.unknown, + 500: D.unknown, }, }); } @@ -2546,16 +2395,12 @@ export class ErrorService { query: { 'status': status, }, - responseDecoders: { - 200: D.createDecoder({ - forceDecode: (data) => data, - }), - }, - errors: { - 500: \`Custom message: Internal Server Error\`, - 501: \`Custom message: Not Implemented\`, - 502: \`Custom message: Bad Gateway\`, - 503: \`Custom message: Service Unavailable\`, + decoders: { + 200: D.unknown, + 500: D.unknown, + 501: D.unknown, + 502: D.unknown, + 503: D.unknown, }, }); } @@ -2578,12 +2423,10 @@ export class HeaderService { method: 'POST', url: '/api/v{api-version}/header', responseHeader: 'operation-location', - responseDecoders: { + decoders: { 200: D.string, - }, - errors: { - 400: \`400 server error\`, - 500: \`500 server error\`, + 400: D.unknown, + 500: D.unknown, }, }); } @@ -2605,8 +2448,8 @@ export class MultipleTags1Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/a', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -2614,8 +2457,8 @@ export class MultipleTags1Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -2637,8 +2480,8 @@ export class MultipleTags2Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/a', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -2646,8 +2489,8 @@ export class MultipleTags2Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -2669,8 +2512,8 @@ export class MultipleTags3Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -2692,8 +2535,8 @@ export class NoContentService { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/no-content', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -2805,7 +2648,7 @@ export class ResponseService { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/response', - responseDecoders: { + decoders: { 0: ModelWithString, }, }); @@ -2814,13 +2657,13 @@ export class ResponseService { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/response', - responseDecoders: { + decoders: { 0: ModelWithString, - }, - errors: { - 500: \`Message for 500 error\`, - 501: \`Message for 501 error\`, - 502: \`Message for 502 error\`, + 201: ModelWithString, + 202: ModelWithString, + 500: ModelWithString, + 501: ModelWithString, + 502: ModelWithString, }, }); } @@ -2828,7 +2671,7 @@ export class ResponseService { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/response', - responseDecoders: { + decoders: { 0: ModelWithString, 200: D.object({ '@namespace.string': D.optional(D.string), @@ -2837,11 +2680,9 @@ export class ResponseService { }), 201: ModelThatExtends, 202: ModelThatExtendsExtends, - }, - errors: { - 500: \`Message for 500 error\`, - 501: \`Message for 501 error\`, - 502: \`Message for 502 error\`, + 500: ModelWithString, + 501: ModelWithString, + 502: ModelWithString, }, }); } @@ -2922,9 +2763,7 @@ export class TypesService { parameterNumber: D.number, parameterString: D.string, parameterBoolean: D.boolean, - parameterObject: D.createDecoder({ - forceDecode: (data) => data, - }), + parameterObject: D.unknown, id: D.optional(D.number), }); public static types( @@ -2952,13 +2791,11 @@ export class TypesService { 'parameterDictionary': parameterDictionary, 'parameterEnum': parameterEnum, }, - responseDecoders: { + decoders: { 200: D.number, 201: D.string, 202: D.boolean, - 203: D.createDecoder({ - forceDecode: (data) => data, - }), + 203: D.unknown, }, }); } @@ -2993,6 +2830,17 @@ export class ApiError>> extends Error { this.request = request; } } + +export class HTTPError extends Error { + cause: unknown; + + constructor(originalError: unknown) { + super(\`\${originalError}\`); + + this.cause = originalError; + this.name = 'HTTPError'; + } +} " `; @@ -3001,15 +2849,6 @@ exports[`v3 should generate: test/generated/v3/core/ApiRequestOptions.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type * as D from '@majkit/fp-ts-schema'; - -export type ApiResponse>> = { - [key in keyof T]: { - readonly status: key; - readonly body: key extends number ? D.Output : never; - }; -}[keyof T]; - export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; @@ -3020,13 +2859,30 @@ export type ApiRequestOptions>> = { readonly formData?: Record; readonly body?: any; readonly mediaType?: string; - readonly responseDecoders?: T; + readonly decoders?: T; readonly responseHeader?: string; readonly errors?: Record; }; " `; +exports[`v3 should generate: test/generated/v3/core/ApiResponse.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { Decoder, Output, DecoderError } from '@majkit/fp-ts-schema'; +import type { Either } from 'fp-ts/lib/Either'; + +export type ApiResponse>> = { + [key in keyof T]: key extends number ? Either; + }> : never; +}[keyof T]; +" +`; + exports[`v3 should generate: test/generated/v3/core/ApiResult.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ @@ -3042,141 +2898,6 @@ export type ApiResult = { " `; -exports[`v3 should generate: test/generated/v3/core/CancelablePromise.ts 1`] = ` -"/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export class CancelError extends Error { - - constructor(message: string) { - super(message); - this.name = 'CancelError'; - } - - public get isCancelled(): boolean { - return true; - } -} - -export interface OnCancel { - readonly isResolved: boolean; - readonly isRejected: boolean; - readonly isCancelled: boolean; - - (cancelHandler: () => void): void; -} - -export class CancelablePromise implements Promise { - #isResolved: boolean; - #isRejected: boolean; - #isCancelled: boolean; - readonly #cancelHandlers: (() => void)[]; - readonly #promise: Promise; - #resolve?: (value: T | PromiseLike) => void; - #reject?: (reason?: any) => void; - - constructor( - executor: ( - resolve: (value: T | PromiseLike) => void, - reject: (reason?: any) => void, - onCancel: OnCancel - ) => void - ) { - this.#isResolved = false; - this.#isRejected = false; - this.#isCancelled = false; - this.#cancelHandlers = []; - this.#promise = new Promise((resolve, reject) => { - this.#resolve = resolve; - this.#reject = reject; - - const onResolve = (value: T | PromiseLike): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isResolved = true; - if (this.#resolve) this.#resolve(value); - }; - - const onReject = (reason?: any): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isRejected = true; - if (this.#reject) this.#reject(reason); - }; - - const onCancel = (cancelHandler: () => void): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#cancelHandlers.push(cancelHandler); - }; - - Object.defineProperty(onCancel, 'isResolved', { - get: (): boolean => this.#isResolved, - }); - - Object.defineProperty(onCancel, 'isRejected', { - get: (): boolean => this.#isRejected, - }); - - Object.defineProperty(onCancel, 'isCancelled', { - get: (): boolean => this.#isCancelled, - }); - - return executor(onResolve, onReject, onCancel as OnCancel); - }); - } - - get [Symbol.toStringTag]() { - return "Cancellable Promise"; - } - - public then( - onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onRejected?: ((reason: any) => TResult2 | PromiseLike) | null - ): Promise { - return this.#promise.then(onFulfilled, onRejected); - } - - public catch( - onRejected?: ((reason: any) => TResult | PromiseLike) | null - ): Promise { - return this.#promise.catch(onRejected); - } - - public finally(onFinally?: (() => void) | null): Promise { - return this.#promise.finally(onFinally); - } - - public cancel(): void { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isCancelled = true; - if (this.#cancelHandlers.length) { - try { - for (const cancelHandler of this.#cancelHandlers) { - cancelHandler(); - } - } catch (error) { - console.warn('Cancellation threw an error', error); - return; - } - } - this.#cancelHandlers.length = 0; - if (this.#reject) this.#reject(new CancelError('Request aborted')); - } - - public get isCancelled(): boolean { - return this.#isCancelled; - } -} -" -`; - exports[`v3 should generate: test/generated/v3/core/OpenAPI.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ @@ -3219,15 +2940,14 @@ exports[`v3 should generate: test/generated/v3/core/request.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import { ApiError } from './ApiError'; -import type { ApiRequestOptions, ApiResponse } from './ApiRequestOptions'; +import * as D from '@majkit/fp-ts-schema'; +import { ApiError, HTTPError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; +import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; -import type * as D from '@majkit/fp-ts-schema'; -import { either } from 'fp-ts'; -import type { Either } from 'fp-ts/lib/Either'; +import { right, left } from 'fp-ts/lib/Either'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; export const isDefined = (value: T | null | undefined): value is Exclude => { return value !== undefined && value !== null; @@ -3397,14 +3117,42 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio return new Headers(headers); }; +const flattenOption = (body: unknown): any => + typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' + && (body._tag === 'None' || body._tag === 'Some') + ? body._tag === 'Some' && 'value' in body + ? body.value : undefined + : body; + +const convertRequestBody = (body: unknown): any => + typeof body === 'object' && body !== null + ? (() => { + const flattened = flattenOption(body); + if (flattened === undefined) { + return undefined; + } + if (Array.isArray(flattened)) { + return flattened.map(convertRequestBody); + } + if (isBlob(flattened) || isFormData(flattened)) { + return flattened; + } + if (typeof flattened === 'object' && flattened !== null) { + return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); + } + return flattened; + })() + : body; + export const getRequestBody = (options: ApiRequestOptions): any => { if (options.body !== undefined) { + const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { - return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body; + return JSON.stringify(body) + } else if (isString(body) || isBlob(body) || isFormData(body)) { + return body; } else { - return JSON.stringify(options.body); + return JSON.stringify(body); } } return undefined; @@ -3467,101 +3215,41 @@ export const getResponseBody = async (response: Response): Promise => { return undefined; }; -export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { - const errors: Record = { - 400: 'Bad Request', - 401: 'Unauthorized', - 403: 'Forbidden', - 404: 'Not Found', - 500: 'Internal Server Error', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - ...options.errors, - } - - const error = errors[result.status]; - if (error) { - throw new ApiError(options, result, error); - } - - if (!result.ok) { - const errorStatus = result.status ?? 'unknown'; - const errorStatusText = result.statusText ?? 'unknown'; - const errorBody = (() => { - try { - return JSON.stringify(result.body, null, 2); - } catch (e) { - return undefined; - } - })(); - - throw new ApiError(options, result, - \`Generic Error: status: \${errorStatus}; status text: \${errorStatusText}; body: \${errorBody}\` - ); - } -}; -const flattenOption = (body: unknown): any => - typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' - && (body._tag === 'None' || body._tag === 'Some') - ? body._tag === 'Some' && 'value' in body - ? body.value : undefined - : body; - -const convertRequestBody = (body: unknown): any => - typeof body === 'object' && body !== null - ? (() => { - const flattened = flattenOption(body); - if (flattened === undefined) { - return undefined; - } - if (Array.isArray(flattened)) { - return flattened.map(value => convertRequestBody(value)); - } - if (isBlob(flattened) || isFormData(flattened)) { - return flattened; - } - if (typeof flattened === 'object' && flattened !== null) { - return Object.fromEntries(Object.entries(flattened).map(([key, value]) => [key, convertRequestBody(value)])); - } - return flattened; - })() - : body; - +const decodeResponse = >>(result: ApiResult, options: ApiRequestOptions): ApiResponse => { + const decoder = options.decoders[result.status] ?? options.decoders[0] ?? D.unknown; + const body = decoder.decode(result.data); + return { + status: result.status, + body: body, + }; +} /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise>> => { - return new CancelablePromise(async (resolve, reject, onCancel) => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { + return async () => { try { - options = convertRequestBody(options); const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - - if (!onCancel.isCancelled) { - const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - - const result: ApiResult = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - }; - - catchErrorCodes(options, result); - - resolve(options.responseDecoders[response.status].decode(result.body)); - } + const response = await sendRequest(options, url, body, formData, headers, onCancel); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + return right(decodeResponse(result, options)); } catch (error) { - resolve(either.left(error as ApiError)); + return left(new HTTPError(error)); } - }); + }; }; " `; @@ -4230,9 +3918,7 @@ exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithAddition /* tslint:disable */ /* eslint-disable */ import * as D from '@majkit/fp-ts-schema'; -export const FreeFormObjectWithAdditionalPropertiesEqEmptyObject = D.record(D.createDecoder({ - forceDecode: (data) => data, -})); +export const FreeFormObjectWithAdditionalPropertiesEqEmptyObject = D.record(D.unknown); export type FreeFormObjectWithAdditionalPropertiesEqEmptyObjectType = D.Output; " `; @@ -4243,9 +3929,7 @@ exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithAddition /* tslint:disable */ /* eslint-disable */ import * as D from '@majkit/fp-ts-schema'; -export const FreeFormObjectWithAdditionalPropertiesEqTrue = D.record(D.createDecoder({ - forceDecode: (data) => data, -})); +export const FreeFormObjectWithAdditionalPropertiesEqTrue = D.record(D.unknown); export type FreeFormObjectWithAdditionalPropertiesEqTrueType = D.Output; " `; @@ -4256,9 +3940,7 @@ exports[`v3 should generate: test/generated/v3/models/FreeFormObjectWithoutAddit /* tslint:disable */ /* eslint-disable */ import * as D from '@majkit/fp-ts-schema'; -export const FreeFormObjectWithoutAdditionalProperties = D.record(D.createDecoder({ - forceDecode: (data) => data, -})); +export const FreeFormObjectWithoutAdditionalProperties = D.record(D.unknown); export type FreeFormObjectWithoutAdditionalPropertiesType = D.Output; " `; @@ -6170,12 +5852,10 @@ export class ComplexService { 'parameterObject': parameterObject, 'parameterReference': parameterReference, }, - responseDecoders: { + decoders: { 200: D.array(ModelWithString), - }, - errors: { - 400: \`400 server error\`, - 500: \`500 server error\`, + 400: D.unknown, + 500: D.unknown, }, }); } @@ -6207,7 +5887,7 @@ export class ComplexService { }, body: requestBody, mediaType: 'application/json-patch+json', - responseDecoders: { + decoders: { 200: ModelWithString, }, }); @@ -6382,24 +6062,12 @@ import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class DescriptionsService { private static callWithDescriptionsDecoder = D.object({ - parameterWithBreaks: D.optional(D.createDecoder({ - forceDecode: (data) => data, - })), - parameterWithBackticks: D.optional(D.createDecoder({ - forceDecode: (data) => data, - })), - parameterWithSlashes: D.optional(D.createDecoder({ - forceDecode: (data) => data, - })), - parameterWithExpressionPlaceholders: D.optional(D.createDecoder({ - forceDecode: (data) => data, - })), - parameterWithQuotes: D.optional(D.createDecoder({ - forceDecode: (data) => data, - })), - parameterWithReservedCharacters: D.optional(D.createDecoder({ - forceDecode: (data) => data, - })), + parameterWithBreaks: D.optional(D.unknown), + parameterWithBackticks: D.optional(D.unknown), + parameterWithSlashes: D.optional(D.unknown), + parameterWithExpressionPlaceholders: D.optional(D.unknown), + parameterWithQuotes: D.optional(D.unknown), + parameterWithReservedCharacters: D.optional(D.unknown), }); public static callWithDescriptions( parameterWithBreaks: D.Output['parameterWithBreaks'] = option.none, @@ -6486,16 +6154,12 @@ export class ErrorService { query: { 'status': status, }, - responseDecoders: { - 200: D.createDecoder({ - forceDecode: (data) => data, - }), - }, - errors: { - 500: \`Custom message: Internal Server Error\`, - 501: \`Custom message: Not Implemented\`, - 502: \`Custom message: Bad Gateway\`, - 503: \`Custom message: Service Unavailable\`, + decoders: { + 200: D.unknown, + 500: D.unknown, + 501: D.unknown, + 502: D.unknown, + 503: D.unknown, }, }); } @@ -6551,12 +6215,10 @@ export class HeaderService { method: 'POST', url: '/api/v{api-version}/header', responseHeader: 'operation-location', - responseDecoders: { + decoders: { 200: D.string, - }, - errors: { - 400: \`400 server error\`, - 500: \`500 server error\`, + 400: D.unknown, + 500: D.unknown, }, }); } @@ -6602,7 +6264,7 @@ export class MultipartService { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multipart', - responseDecoders: { + decoders: { 200: D.object({ file: D.optional(D.createDecoder({ forceDecode: (data) => { @@ -6638,8 +6300,8 @@ export class MultipleTags1Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/a', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -6647,8 +6309,8 @@ export class MultipleTags1Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -6670,8 +6332,8 @@ export class MultipleTags2Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/a', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -6679,8 +6341,8 @@ export class MultipleTags2Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -6702,8 +6364,8 @@ export class MultipleTags3Service { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/multiple-tags/b', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -6725,8 +6387,8 @@ export class NoContentService { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/no-content', - responseDecoders: { - 200: D.succeed(undefined), + decoders: { + 204: D.succeed(undefined), }, }); } @@ -6921,7 +6583,7 @@ export class ResponseService { return __request(OpenAPI, { method: 'GET', url: '/api/v{api-version}/response', - responseDecoders: { + decoders: { 0: ModelWithString, }, }); @@ -6930,13 +6592,13 @@ export class ResponseService { return __request(OpenAPI, { method: 'POST', url: '/api/v{api-version}/response', - responseDecoders: { + decoders: { 0: ModelWithString, - }, - errors: { - 500: \`Message for 500 error\`, - 501: \`Message for 501 error\`, - 502: \`Message for 502 error\`, + 201: ModelWithString, + 202: ModelWithString, + 500: ModelWithString, + 501: ModelWithString, + 502: ModelWithString, }, }); } @@ -6944,7 +6606,7 @@ export class ResponseService { return __request(OpenAPI, { method: 'PUT', url: '/api/v{api-version}/response', - responseDecoders: { + decoders: { 0: ModelWithString, 200: D.object({ '@namespace.string': D.optional(D.string), @@ -6953,11 +6615,9 @@ export class ResponseService { }), 201: ModelThatExtends, 202: ModelThatExtendsExtends, - }, - errors: { - 500: \`Message for 500 error\`, - 501: \`Message for 501 error\`, - 502: \`Message for 502 error\`, + 500: ModelWithString, + 501: ModelWithString, + 502: ModelWithString, }, }); } @@ -7033,16 +6693,12 @@ import { request as __request } from '../core/request'; export class TypesService { private static typesDecoder = D.object({ parameterArray: D.nullable(D.array(D.string)), - parameterDictionary: D.nullable(D.record(D.createDecoder({ - forceDecode: (data) => data, - }))), + parameterDictionary: D.nullable(D.record(D.unknown)), parameterEnum: D.nullable(D.literalUnion('Success', 'Warning', 'Error')), parameterNumber: D.number, parameterString: D.nullable(D.string), parameterBoolean: D.nullable(D.boolean), - parameterObject: D.nullable(D.record(D.createDecoder({ - forceDecode: (data) => data, - }))), + parameterObject: D.nullable(D.record(D.unknown)), id: D.optional(D.number), }); public static types( @@ -7070,13 +6726,11 @@ export class TypesService { 'parameterDictionary': parameterDictionary, 'parameterEnum': parameterEnum, }, - responseDecoders: { + decoders: { 200: D.number, 201: D.string, 202: D.boolean, - 203: D.record(D.createDecoder({ - forceDecode: (data) => data, - })), + 203: D.record(D.unknown), }, }); } @@ -7113,7 +6767,7 @@ export class UploadService { formData: { 'file': file, }, - responseDecoders: { + decoders: { 200: D.boolean, }, }); diff --git a/test/index.spec.ts b/test/index.spec.ts index ef0e23a38..f766bf771 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -1,7 +1,7 @@ import { readFileSync } from 'fs'; import { sync } from 'glob'; -import { generate, HttpClient } from '../'; +import { HttpClient, generate } from '../'; describe('v2', () => { it('should generate', async () => { From 39b1c27d15632656a565591570f026f5ec5e0c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 13 Nov 2023 21:37:20 +0000 Subject: [PATCH 26/48] =?UTF-8?q?=E2=9C=A8=20setup=20autodeploy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .circleci/config.yml | 93 ++++++++++++++++++++++++++++++++------------ package.json | 4 +- 2 files changed, 70 insertions(+), 27 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 935b6fd82..f1683e6a9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,28 +2,71 @@ version: 2.1 orbs: codecov: codecov/codecov@3.3.0 jobs: - build: - docker: - - image: 'cimg/node:lts-browsers' - resource_class: large - working_directory: ~/repo - steps: - - checkout - - restore_cache: - keys: - - 'v1-dependencies-{{ checksum "package-lock.json" }}' - - v1-dependencies- - - run: - name: Install dependencies - command: npm install - - save_cache: - key: 'v1-dependencies-{{ checksum "package-lock.json" }}' - paths: - - node_modules - - run: - name: Build library - command: npm run release - - run: - name: Run unit tests - command: npm run test:coverage - - codecov/upload + test: + docker: + - image: 'cimg/node:lts-browsers' + resource_class: large + working_directory: ~/repo + steps: + - checkout + - restore_cache: + keys: + - 'v1-dependencies-{{ checksum "pnpm-lock.yaml" }}' + - v1-dependencies- + - run: + name: Install dependencies + command: pnpm install + - save_cache: + key: 'v1-dependencies-{{ checksum "pnpm-lock.yaml" }}' + paths: + - node_modules + - run: + name: Build library + command: pnpm run prepublish + - run: + name: Run unit tests + command: pnpm jest --ci --runInBand --reporters=default --reporters=jest-junit --coverage + environment: + JEST_JUNIT_OUTPUT_DIR: ./reports/ + JEST_JUNIT_ADD_FILE_ATTRIBUTE: "true" + - store_test_results: + path: ./reports/ + - codecov/upload + publish: + docker: + - image: 'cimg/node:lts-browsers' + resource_class: large + working_directory: ~/repo + steps: + - checkout + - restore_cache: + keys: + - 'v1-dependencies-{{ checksum "pnpm-lock.yaml" }}' + - v1-dependencies- + - run: + name: Install dependencies + command: pnpm install + - save_cache: + key: 'v1-dependencies-{{ checksum "pnpm-lock.yaml" }}' + paths: + - node_modules + - run: + name: Build library + command: pnpm run prepublish + - run: + name: Publish to NPM + command: | + npm set //registry.npmjs.org/:_authToken=$NPM_TOKEN + pnpm publish + +workflows: + main: + jobs: + - test + - publish: + requires: + - test + filters: + branches: + only: + - master diff --git a/package.json b/package.json index b8d5fec37..6f4e62f8c 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache", "build": "rollup --config --environment NODE_ENV:development", "build:watch": "rollup --config --environment NODE_ENV:development --watch", - "release": "rollup --config --environment NODE_ENV:production", + "prepublish": "rollup --config --environment NODE_ENV:production", "validate": "tsc --project tsconfig.json --noEmit", "run": "node ./test/index.js", "test": "jest --selectProjects UNIT", @@ -39,7 +39,7 @@ "test:e2e": "jest --selectProjects E2E --runInBand --verbose", "eslint": "eslint .", "eslint:fix": "eslint . --fix", - "prepare": "npm run clean && npm run release", + "prepare": "npm run clean && npm run prepublish", "docker": "docker build -t @majkit/openapi ." }, "peerDependencies": { From ead08c625d805b07cc020608011b5bec2f64cba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 13 Nov 2023 21:39:19 +0000 Subject: [PATCH 27/48] =?UTF-8?q?=F0=9F=90=9B=20install=20jest-junit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- .circleci/config.yml | 2 +- package.json | 20 ++++++++++++++++++-- pnpm-lock.yaml | 17 +++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f1683e6a9..89a5bce1a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,7 +25,7 @@ jobs: command: pnpm run prepublish - run: name: Run unit tests - command: pnpm jest --ci --runInBand --reporters=default --reporters=jest-junit --coverage + command: pnpm jest --ci --runInBand --reporters=default --reporters=jest-junit --coverage --selectProjects UNIT environment: JEST_JUNIT_OUTPUT_DIR: ./reports/ JEST_JUNIT_ADD_FILE_ATTRIBUTE: "true" diff --git a/package.json b/package.json index 6f4e62f8c..1635daf3f 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,18 @@ "url": "https://github.com/maxa-ondrej/openapi-typescript-codegen/issues" }, "license": "MIT", - "keywords": ["openapi", "swagger", "generator", "typescript", "yaml", "json", "fetch", "xhr", "axios", "node"], + "keywords": [ + "openapi", + "swagger", + "generator", + "typescript", + "yaml", + "json", + "fetch", + "xhr", + "axios", + "node" + ], "maintainers": [ { "name": "Ondrej Maxa", @@ -24,7 +35,11 @@ "bin": { "openapi": "bin/index.js" }, - "files": ["bin/index.js", "dist/index.js", "types/index.d.ts"], + "files": [ + "bin/index.js", + "dist/index.js", + "types/index.d.ts" + ], "scripts": { "clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache", "build": "rollup --config --environment NODE_ENV:development", @@ -95,6 +110,7 @@ "glob": "10.3.10", "jest": "29.7.0", "jest-cli": "29.7.0", + "jest-junit": "^16.0.0", "node-fetch": "2.6.9", "prettier": "3.0.3", "puppeteer": "20.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d952bf24..d5cec0f3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -151,6 +151,9 @@ devDependencies: jest-cli: specifier: 29.7.0 version: 29.7.0(@types/node@20.8.9)(ts-node@10.9.1) + jest-junit: + specifier: ^16.0.0 + version: 16.0.0 node-fetch: specifier: 2.6.9 version: 2.6.9 @@ -7442,6 +7445,16 @@ packages: fsevents: 2.3.3 dev: true + /jest-junit@16.0.0: + resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} + engines: {node: '>=10.12.0'} + dependencies: + mkdirp: 1.0.4 + strip-ansi: 6.0.1 + uuid: 8.3.2 + xml: 1.0.1 + dev: true + /jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10880,6 +10893,10 @@ packages: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} dev: true + /xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + dev: true + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true From 89fed75feb2f7abdb209a06e37b9a4e6e7d3277b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 13 Nov 2023 21:41:27 +0000 Subject: [PATCH 28/48] =?UTF-8?q?=F0=9F=94=A5=20migrate=20to=20pnpm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package-lock.json | 18665 -------------------------------------------- 1 file changed, 18665 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3f3eff152..000000000 --- a/package-lock.json +++ /dev/null @@ -1,18665 +0,0 @@ -{ - "name": "@majkit/openapi", - "version": "0.27.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@majkit/openapi", - "version": "0.27.1", - "license": "MIT", - "dependencies": { - "@majkit/fp-ts-schema": "^1.1.1", - "camelcase": "^6.3.0", - "commander": "^11.0.0", - "fs-extra": "^11.1.1", - "handlebars": "^4.7.7", - "json-schema-ref-parser": "^9.0.9" - }, - "bin": { - "openapi": "bin/index.js" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^16.2.9", - "@angular/animations": "16.1.3", - "@angular/cli": "16.1.3", - "@angular/common": "16.1.3", - "@angular/compiler": "16.1.3", - "@angular/compiler-cli": "16.1.3", - "@angular/core": "16.1.3", - "@angular/forms": "16.1.3", - "@angular/platform-browser": "16.1.3", - "@angular/platform-browser-dynamic": "16.1.3", - "@angular/router": "16.1.3", - "@babel/cli": "7.23.0", - "@babel/core": "7.23.2", - "@babel/preset-env": "7.23.2", - "@babel/preset-typescript": "7.23.2", - "@rollup/plugin-commonjs": "25.0.7", - "@rollup/plugin-node-resolve": "15.2.3", - "@rollup/plugin-typescript": "11.1.5", - "@types/cross-spawn": "6.0.4", - "@types/express": "4.17.20", - "@types/fs-extra": "^11.0.1", - "@types/glob": "8.1.0", - "@types/jest": "29.5.6", - "@types/node": "20.8.9", - "@types/node-fetch": "2.6.4", - "@types/qs": "6.9.9", - "@typescript-eslint/eslint-plugin": "6.9.0", - "@typescript-eslint/parser": "6.9.1", - "abort-controller": "3.0.0", - "axios": "1.6.0", - "codecov": "3.8.3", - "cross-spawn": "7.0.3", - "eslint": "8.52.0", - "eslint-config-prettier": "8.10.0", - "eslint-plugin-prettier": "5.0.1", - "eslint-plugin-simple-import-sort": "10.0.0", - "express": "4.18.2", - "form-data": "4.0.0", - "glob": "10.3.10", - "jest": "29.7.0", - "jest-cli": "29.7.0", - "node-fetch": "2.6.9", - "prettier": "3.0.3", - "puppeteer": "20.9.0", - "qs": "6.11.2", - "rimraf": "5.0.5", - "rollup": "3.26.1", - "rollup-plugin-terser": "7.0.2", - "rxjs": "7.8.1", - "ts-node": "10.9.1", - "tslib": "2.6.2", - "typescript": "5.1.6", - "zone.js": "0.13.3" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/architect": { - "version": "0.1601.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.3.tgz", - "integrity": "sha512-HvW51cCEoIYe2mYqcmnm2RZiMMFbFn7iIdsjbCJe7etFhcG+Y3hGDZMh4IFSiQiss+pwPSYOvQY2zwGrndMgLw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.1.3", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-angular": { - "version": "16.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.9.tgz", - "integrity": "sha512-S1C4UYxRVyNt3C0wCxbT2jZ1dN5i37kS0mol3PQjbR8gQ0GQzHmzhjTBl1oImo8aouET9yhrk9etk65oat4mBQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.9", - "@angular-devkit/build-webpack": "0.1602.9", - "@angular-devkit/core": "16.2.9", - "@babel/core": "7.22.9", - "@babel/generator": "7.22.9", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.22.9", - "@babel/preset-env": "7.22.9", - "@babel/runtime": "7.22.6", - "@babel/template": "7.22.5", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.9", - "@vitejs/plugin-basic-ssl": "1.0.1", - "ansi-colors": "4.1.3", - "autoprefixer": "10.4.14", - "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.21.5", - "chokidar": "3.5.3", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", - "css-loader": "6.8.1", - "esbuild-wasm": "0.18.17", - "fast-glob": "3.3.1", - "guess-parser": "0.4.22", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.2.0", - "karma-source-map-support": "1.4.0", - "less": "4.1.3", - "less-loader": "11.1.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "magic-string": "0.30.1", - "mini-css-extract-plugin": "2.7.6", - "mrmime": "1.0.1", - "open": "8.4.2", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "2.3.1", - "piscina": "4.0.0", - "postcss": "8.4.31", - "postcss-loader": "7.3.3", - "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.64.1", - "sass-loader": "13.3.2", - "semver": "7.5.4", - "source-map-loader": "4.0.1", - "source-map-support": "0.5.21", - "terser": "5.19.2", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "tslib": "2.6.1", - "vite": "4.4.7", - "webpack": "5.88.2", - "webpack-dev-middleware": "6.1.1", - "webpack-dev-server": "4.15.1", - "webpack-merge": "5.9.0", - "webpack-subresource-integrity": "5.1.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "esbuild": "0.18.17" - }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "@angular/localize": "^16.0.0", - "@angular/platform-server": "^16.0.0", - "@angular/service-worker": "^16.0.0", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", - "karma": "^6.3.0", - "ng-packagr": "^16.0.0", - "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.2" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, - "karma": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "protractor": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1602.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.9.tgz", - "integrity": "sha512-U3vfb/e2sFfg0D9FyyRBXRPP7g4FBFtGK8Q3JPmvAVsHHwi5AUFRNR7YBChB/T5TMNY077HcTyEirVh2FeUpdA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.2.9", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "16.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.9.tgz", - "integrity": "sha512-dcHWjHBNGm3yCeNz19y8A1At4KgyC6XHNnbFL0y+nnZYiaESXjUoXJYKASedI6A+Bpl0HNq2URhH6bL6Af3+4w==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", - "@babel/plugin-transform-parameters": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", - "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.9.tgz", - "integrity": "sha512-+3IxovfBPR2Vy730mGa0SVKkd5LQVom85gjXOs7WcnnnZmfc1q/BtFlqTgW1UWvTxP8IQdm7UYWVclQfL/WExw==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1602.9", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^4.0.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1602.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.9.tgz", - "integrity": "sha512-U3vfb/e2sFfg0D9FyyRBXRPP7g4FBFtGK8Q3JPmvAVsHHwi5AUFRNR7YBChB/T5TMNY077HcTyEirVh2FeUpdA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.2.9", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "16.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.9.tgz", - "integrity": "sha512-dcHWjHBNGm3yCeNz19y8A1At4KgyC6XHNnbFL0y+nnZYiaESXjUoXJYKASedI6A+Bpl0HNq2URhH6bL6Af3+4w==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/core": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.3.tgz", - "integrity": "sha512-cFhNdJHumNMZGD3NYxOtNuMGRQXeDnKbwvK+IJmKAttXt8na6EvURR/ZxZOI7rl/YRVX+vcNSdtXz3hE6g+Isw==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.3.tgz", - "integrity": "sha512-hWEuQnfQOgcSs4YX6iF4QR/34ROeSPaMi7lQOYg33hStg+pnk/JDdIU0f2nrIIz3t0jqAj+5VXVLBJvOCd84vg==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.1.3", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/animations": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.3.tgz", - "integrity": "sha512-ET6ahrlbOyTYXOTouKs2VJxx0CMTrYkfz0HfI6IHnSKBC6wguDxXYnamMouHgrCkDDEB5qClfGHyS9se0AOX4w==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/core": "16.1.3" - } - }, - "node_modules/@angular/cli": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.3.tgz", - "integrity": "sha512-D0gU12z/N2oJ+s6pggAnWYrTUZ+2duGb3Y5oUyClsubz7JWpAwHjSZpb8exPUrgYhr+qIEMGO685y1JazJQ2tA==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1601.3", - "@angular-devkit/core": "16.1.3", - "@angular-devkit/schematics": "16.1.3", - "@schematics/angular": "16.1.3", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.2.0", - "npm-package-arg": "10.1.0", - "npm-pick-manifest": "8.0.1", - "open": "8.4.2", - "ora": "5.4.1", - "pacote": "15.2.0", - "resolve": "1.22.2", - "semver": "7.5.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/common": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.3.tgz", - "integrity": "sha512-ZzJ6EwQHUkiZYV0zH/UxyUYW5uxomsyk7tdtqZIxAR5m2ktYkQ5XlqgPjBO8voF54Rs5Ot43RkPCLesbZyJDsw==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/core": "16.1.3", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/compiler": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.3.tgz", - "integrity": "sha512-7Ckvssk9+s5xLyXvp72IwAw5vd/Osa3tR6oiQatdbw+O3XjLO04QycoGXwkp/fYVexGsjFyOn6QJ5n1F/PYPbQ==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/core": "16.1.3" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } - } - }, - "node_modules/@angular/compiler-cli": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.3.tgz", - "integrity": "sha512-aUqnIV9rRTBNgiQRS0Gv6lhghaGj1vpVRyXgiE4VnTR9uBONSsGKMNALYBBhXRTSk2e0cvutt0ubLgmNpdyWyQ==", - "dev": true, - "dependencies": { - "@babel/core": "7.22.5", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.1.2", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/compiler": "16.1.3", - "typescript": ">=4.9.3 <5.2" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/core": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.3.tgz", - "integrity": "sha512-yhRo9hVS8KhfcEgzciWuRWF4Pnnko98bmSJTqd7u8Kys6z3Uj0qgXMssXHIPUALe3mQKjVkdSZPLIZ9/CaVn/Q==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.13.0" - } - }, - "node_modules/@angular/forms": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.3.tgz", - "integrity": "sha512-9tJHgoi/Jmeo30zfnReVZWFcd1WthR+QwYUNwPev+ys58u1mB0cDGORvROySmC2YUyXFSpXt8sxwyWCkYvaV2w==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": "16.1.3", - "@angular/core": "16.1.3", - "@angular/platform-browser": "16.1.3", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.3.tgz", - "integrity": "sha512-qZA6Lua2fpBe+KD/QArY/4hilypSZFcTcJsPjZwIzo5pavXqYDI8BVghwh5dcZoUa56hVRDJjv+XW6kl8m9Tdw==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/animations": "16.1.3", - "@angular/common": "16.1.3", - "@angular/core": "16.1.3" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.3.tgz", - "integrity": "sha512-UHxSWpPB5+FSv8zm8T+4ZikLqyy+VE6GlOLp/DdgEz77j81rz2C1pMqozwTnVbD16XbI4rhTp+RFY3C9ArWOtw==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": "16.1.3", - "@angular/compiler": "16.1.3", - "@angular/core": "16.1.3", - "@angular/platform-browser": "16.1.3" - } - }, - "node_modules/@angular/router": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.3.tgz", - "integrity": "sha512-bkn8cWGBKKZidDaP+R7g/S/6miSfH8iP24d2k86Awo+vaO+7G/5WWGfKJMKK8UNM/A5ueX6ugAZrMHpQ9e6Y4w==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": "16.1.3", - "@angular/core": "16.1.3", - "@angular/platform-browser": "16.1.3", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/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/@apidevtools/json-schema-ref-parser/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/@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, - "node_modules/@babel/cli": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.0.tgz", - "integrity": "sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "commander": "^4.0.1", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/cli/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@babel/cli/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/cli/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.2", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", - "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/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==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/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==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@majkit/fp-ts-schema": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@majkit/fp-ts-schema/-/fp-ts-schema-1.1.1.tgz", - "integrity": "sha512-ldFsUOuBgCjRs872T0/PdLAKA9ZX3M3yuD2nCDIcFDe2HBxG0a4E+O+uiGWLudJkkQdwKXNKdBwzBSGAP5ys9w==", - "dependencies": { - "fp-ts": "^2.16.1", - "schemawax": "^1.0.12" - } - }, - "node_modules/@ngtools/webpack": { - "version": "16.2.9", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.9.tgz", - "integrity": "sha512-rOclD7FfT4OSwVA0nDnULbJS6TORJ0+sQiuT2ebaNFErYr3LOm6Zut05tnmzFw8q1cePrILbG+xpnbggNr9Pyw==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.2", - "webpack": "^5.54.0" - } - }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pkgr/utils/node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dev": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@puppeteer/browsers/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.5.tgz", - "integrity": "sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0||^4.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@schematics/angular": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.3.tgz", - "integrity": "sha512-bNSxCLf6f+/dsQ1k3PhcZhrC/qgJSCpM6h3m6ATpjR+tYW/v7WR1OyE5r3DQmDe7NJSazBvpbrRtg8xjRsMzvw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.1.3", - "@angular-devkit/schematics": "16.1.3", - "jsonc-parser": "3.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sigstore/bundle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.0.0.tgz", - "integrity": "sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.0.tgz", - "integrity": "sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", - "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", - "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cross-spawn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.4.tgz", - "integrity": "sha512-GGLpeThc2Bu8FBGmVn76ZU3lix17qZensEI4/MPty0aZpm2CHfgEMis31pf5X5EiudYKcPAsWciAsCALoPo5dw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.1.tgz", - "integrity": "sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.3.tgz", - "integrity": "sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==", - "dev": true, - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", - "dev": true, - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.6", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", - "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" - }, - "node_modules/@types/jsonfile": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", - "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", - "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", - "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.35", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", - "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", - "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", - "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/type-utils": "6.9.0", - "@typescript-eslint/utils": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", - "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", - "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.0", - "@typescript-eslint/utils": "6.9.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", - "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", - "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", - "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/typescript-estree": "6.9.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", - "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", - "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@wessberg/ts-evaluator": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", - "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", - "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "jsdom": "^16.4.0", - "object-path": "^0.11.5", - "tslib": "^2.0.3" - }, - "engines": { - "node": ">=10.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" - }, - "peerDependencies": { - "typescript": ">=3.2.x || >= 4.x" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": ">=0.6.10" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-ftp": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", - "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/bonjour-service/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", - "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001547", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", - "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/codecov": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", - "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", - "deprecated": "https://about.codecov.io/blog/codecov-uploader-deprecation-plan/", - "dev": true, - "dependencies": { - "argv": "0.0.2", - "ignore-walk": "3.0.4", - "js-yaml": "3.14.1", - "teeny-request": "7.1.1", - "urlgrey": "1.0.0" - }, - "bin": { - "codecov": "bin/codecov" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "engines": { - "node": ">=16" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", - "dev": true, - "dependencies": { - "browserslist": "^4.22.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/cosmiconfig/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==", - "dev": true - }, - "node_modules/cosmiconfig/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==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" - } - }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/critters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/critters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-uri-to-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", - "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/data-urls/node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-browser/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/default-browser/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/default-browser/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.552", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.552.tgz", - "integrity": "sha512-qMPzA5TEuOAbLFmbpNvO4qkBRe2B5dAxl6H4KxqRNy9cvBeHT2EyzecX0bumBfRhHN8cQJrx6NPd0AAoCCPKQw==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=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==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", - "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-simple-import-sort": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", - "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", - "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/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==", - "dev": true - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-fifo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz", - "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dev": true, - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fast-url-parser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.1.tgz", - "integrity": "sha512-by7U5W8dkIzcvDofUcO42yl9JbnHTEDBrzu3pt5fKT+Z4Oy85I21K80EYJYdjQGC2qum4Vo55Ag57iiIK4FYuA==" - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", - "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.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==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", - "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", - "dev": true, - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^5.0.1", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/get-uri/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/get-uri/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/get-uri/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "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==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/guess-parser": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", - "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", - "dev": true, - "dependencies": { - "@wessberg/ts-evaluator": "0.0.27" - }, - "peerDependencies": { - "typescript": ">=3.7.5" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "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/handlebars/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/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", - "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-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==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.5.tgz", - "integrity": "sha512-Ratx+B8WeXLAtRJn26hrhY8S1+Jz6pxPMrkrdkgb/NstTNiqMhX0/oFVu5wX+g5n6JlEu2LPsDJmY8nRP4+alw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/jsdom/node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsdom/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "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/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "dependencies": { - "source-map-support": "^0.5.5" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", - "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", - "dev": true, - "dependencies": { - "klona": "^2.0.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/less/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "dependencies": { - "webpack-sources": "^3.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/needle": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", - "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", - "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-packlist/node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz", - "integrity": "sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==", - "dev": true, - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", - "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", - "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", - "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", - "dev": true, - "dependencies": { - "degenerator": "^5.0.0", - "ip": "^1.1.8", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", - "dev": true, - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", - "dev": true, - "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", - "dev": true, - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/piscina": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", - "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", - "dev": true, - "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" - }, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", - "dev": true, - "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", - "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", - "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-20.9.0.tgz", - "integrity": "sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "cosmiconfig": "8.2.0", - "puppeteer-core": "20.9.0" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/pure-rand": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", - "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "dev": true, - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.1.tgz", - "integrity": "sha512-I5gJCSpSMr3U9wv4D5YA8g7w7cj3eaSDeo7t+JcaFQOmoOUBgu4K9iMp8k3EZnwbJrjQxUMSKxMyB8qEQzzaSg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sass": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-loader": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", - "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", - "dev": true, - "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schemawax": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/schemawax/-/schemawax-1.0.12.tgz", - "integrity": "sha512-1N6jkJHStJs24CRSb5UGgye83wxQAx3bOeJ8zaJ+QXBcUyd+xxSgZ6H9GlpYxqlddeXgOmamxS+afYZGNKWsCw==" - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/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==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sigstore": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.8.0.tgz", - "integrity": "sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.0.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", - "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" - } - }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "dev": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/streamx": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", - "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==", - "dev": true, - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, - "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==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "dev": true - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dev": true, - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/teeny-request": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", - "integrity": "sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==", - "dev": true, - "dependencies": { - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/teeny-request/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/teeny-request/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.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==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/urlgrey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", - "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==", - "dev": true, - "dependencies": { - "fast-url-parser": "^1.1.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", - "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.26", - "rollup": "^3.25.2" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", - "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.12", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-merge": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", - "dev": true, - "dependencies": { - "typed-assert": "^1.0.8" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", - "webpack": "^5.12.0" - }, - "peerDependenciesMeta": { - "html-webpack-plugin": { - "optional": true - } - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "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/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "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/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zone.js": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", - "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - } - } - } -} From 5e04bfb37126474f4b015f1011cee9956ceea8cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 13 Nov 2023 21:50:35 +0000 Subject: [PATCH 29/48] =?UTF-8?q?=F0=9F=90=9B=20update=20build=20image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- README.md | 4 ++-- package.json | 23 ++++------------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 457879759..e6e90dc86 100644 --- a/README.md +++ b/README.md @@ -99,5 +99,5 @@ Support [coverage-image]: https://img.shields.io/codecov/c/github/maxa-ondrej/openapi-typescript-codegen.svg [downloads-url]: http://npm-stat.com/charts.html?package=@majkit/openapi [downloads-image]: http://img.shields.io/npm/dm/@majkit/openapi.svg -[build-url]: https://dl.circleci.com/status-badge/redirect/circleci/Y53CrcVgMSBZm7DzvzFD9k/AgUdrXXFjtCoKjN45w9nRx/tree/master -[build-image]: https://dl.circleci.com/status-badge/img/circleci/Y53CrcVgMSBZm7DzvzFD9k/AgUdrXXFjtCoKjN45w9nRx/tree/master.svg?style=svg&circle-token=28fbb9706b426e5447418405ca9e2ed1d983a79e +[build-url]: https://circleci.com/gh/maxa-ondrej/openapi-typescript-codegen/tree/master.svg +[build-image]: https://circleci.com/gh/maxa-ondrej/openapi-typescript-codegen/tree/master.svg?style=svg diff --git a/package.json b/package.json index 1635daf3f..050f14216 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.28.0", + "version": "0.28.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", @@ -12,18 +12,7 @@ "url": "https://github.com/maxa-ondrej/openapi-typescript-codegen/issues" }, "license": "MIT", - "keywords": [ - "openapi", - "swagger", - "generator", - "typescript", - "yaml", - "json", - "fetch", - "xhr", - "axios", - "node" - ], + "keywords": ["openapi", "swagger", "generator", "typescript", "yaml", "json", "fetch", "xhr", "axios", "node"], "maintainers": [ { "name": "Ondrej Maxa", @@ -35,11 +24,7 @@ "bin": { "openapi": "bin/index.js" }, - "files": [ - "bin/index.js", - "dist/index.js", - "types/index.d.ts" - ], + "files": ["bin/index.js", "dist/index.js", "types/index.d.ts"], "scripts": { "clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache", "build": "rollup --config --environment NODE_ENV:development", @@ -58,7 +43,7 @@ "docker": "docker build -t @majkit/openapi ." }, "peerDependencies": { - "@majkit/fp-ts-schema": "^1.1.4" + "@majkit/fp-ts-schema": "^1.1.5" }, "dependencies": { "camelcase": "^6.3.0", From dab1ed8a5ab2c7acb15694d2c417f105e4087fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 13 Nov 2023 21:51:52 +0000 Subject: [PATCH 30/48] =?UTF-8?q?=F0=9F=90=9B=20update=20lockfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5cec0f3d..435be82ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: '@majkit/fp-ts-schema': - specifier: ^1.1.4 - version: 1.1.4(fp-ts@2.16.1) + specifier: ^1.1.5 + version: 1.1.5(fp-ts@2.16.1) camelcase: specifier: ^6.3.0 version: 6.3.0 @@ -3501,8 +3501,8 @@ packages: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: true - /@majkit/fp-ts-schema@1.1.4(fp-ts@2.16.1): - resolution: {integrity: sha512-rpJFlzJY4epzjD+hns4OhNeK+lu7vlMRVhUBahr+NQcrSHCQkUOf+GNAt3nq8Vsu4Mf1j9N1iw6onVsoQqHzBA==} + /@majkit/fp-ts-schema@1.1.5(fp-ts@2.16.1): + resolution: {integrity: sha512-A+n5dY6OWoHJH2/s8M1hMCuZ+FY1DTA/mGgRjIw21rGpjV0HJD2NN+3A8QBUo1oTDpDlukOV1SWr8ysLGW6QxQ==} peerDependencies: fp-ts: ^2.16.1 dependencies: From 1dfc5121feb1c06bd7256f2e0d537ab2a9953887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 13 Nov 2023 22:10:38 +0000 Subject: [PATCH 31/48] =?UTF-8?q?=F0=9F=90=9B=20http=20request=20client=20?= =?UTF-8?q?typedefinitions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- README.md | 2 +- package.json | 2 +- src/templates/core/BaseHttpRequest.hbs | 7 +++++-- src/templates/core/HttpRequest.hbs | 5 +---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e6e90dc86..fe28b9808 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ ## Install ``` -pnpm install @majkit/openapi -D +pnpm install @majkit/openapi @majkit/fp-ts-schema -D ``` ## Usage diff --git a/package.json b/package.json index 050f14216..6521c6691 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.28.1", + "version": "0.28.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/core/BaseHttpRequest.hbs b/src/templates/core/BaseHttpRequest.hbs index c4c992a82..3831d3c08 100644 --- a/src/templates/core/BaseHttpRequest.hbs +++ b/src/templates/core/BaseHttpRequest.hbs @@ -1,12 +1,15 @@ {{>header}} +import type { HTTPError } from './ApiError'; +import type { ApiResult } from './ApiResult'; import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { CancelablePromise } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import type * as D from '@majkit/fp-ts-schema'; export abstract class BaseHttpRequest { constructor(public readonly config: OpenAPIConfig) {} - public abstract request(options: ApiRequestOptions): CancelablePromise; + public abstract request>>(options: ApiRequestOptions): TaskEither>; } diff --git a/src/templates/core/HttpRequest.hbs b/src/templates/core/HttpRequest.hbs index 1e19036ea..5bcc3ed2c 100644 --- a/src/templates/core/HttpRequest.hbs +++ b/src/templates/core/HttpRequest.hbs @@ -2,7 +2,6 @@ import type { ApiRequestOptions } from './ApiRequestOptions'; import { BaseHttpRequest } from './BaseHttpRequest'; -import type { CancelablePromise } from './CancelablePromise'; import type { OpenAPIConfig } from './OpenAPI'; import { request as __request } from './request'; @@ -15,10 +14,8 @@ export class {{httpRequest}} extends BaseHttpRequest { /** * Request method * @param options The request options from the service - * @returns CancelablePromise - * @throws ApiError */ - public override request(options: ApiRequestOptions): CancelablePromise { + public override request(options: ApiRequestOptions) { return __request(this.config, options); } } From be8ae3192acb12d3544b9698e762d599561e5770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 13 Nov 2023 23:50:31 +0000 Subject: [PATCH 32/48] =?UTF-8?q?=F0=9F=90=9B=20remove=20linter=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- src/index.ts | 4 +- src/templates/core/ApiError.hbs | 35 --- src/templates/core/ApiRequestOptions.hbs | 16 +- src/templates/core/ApiResponse.hbs | 8 +- src/templates/core/ApiResult.hbs | 2 +- src/templates/core/BaseHttpRequest.hbs | 6 +- src/templates/core/HttpError.hbs | 12 + src/templates/core/HttpRequest.hbs | 3 +- src/templates/core/OpenAPI.hbs | 2 +- src/templates/core/axios/getHeaders.hbs | 2 +- src/templates/core/axios/getRequestBody.hbs | 2 +- src/templates/core/axios/getResponseBody.hbs | 2 +- .../core/axios/getResponseHeader.hbs | 2 +- src/templates/core/axios/request.hbs | 8 +- src/templates/core/axios/sendRequest.hbs | 16 +- src/templates/core/fetch/getHeaders.hbs | 2 +- src/templates/core/fetch/getRequestBody.hbs | 2 +- src/templates/core/fetch/getResponseBody.hbs | 2 +- src/templates/core/fetch/request.hbs | 8 +- src/templates/core/fetch/sendRequest.hbs | 12 +- .../core/functions/catchErrorCodes.hbs | 35 --- .../core/functions/convertRequestBody.hbs | 4 +- .../core/functions/decodeResponse.hbs | 8 +- src/templates/core/functions/getFormData.hbs | 4 +- .../core/functions/getQueryString.hbs | 8 +- src/templates/core/functions/getUrl.hbs | 2 +- src/templates/core/functions/isBlob.hbs | 6 +- src/templates/core/functions/isFormData.hbs | 2 +- src/templates/core/functions/isString.hbs | 2 +- .../core/functions/isStringWithValue.hbs | 2 +- src/templates/core/functions/resolve.hbs | 6 +- src/templates/core/node/getHeaders.hbs | 2 +- src/templates/core/node/getRequestBody.hbs | 8 +- src/templates/core/node/getResponseBody.hbs | 2 +- src/templates/core/node/request.hbs | 10 +- src/templates/core/node/sendRequest.hbs | 12 +- src/templates/core/xhr/getHeaders.hbs | 2 +- src/templates/core/xhr/getRequestBody.hbs | 2 +- src/templates/core/xhr/getResponseBody.hbs | 2 +- src/templates/core/xhr/request.hbs | 8 +- src/templates/core/xhr/sendRequest.hbs | 9 +- src/templates/exportService.hbs | 2 +- src/templates/index.hbs | 3 +- src/utils/registerHandlebarTemplates.spec.ts | 2 +- src/utils/registerHandlebarTemplates.ts | 8 +- src/utils/writeClient.spec.ts | 2 +- src/utils/writeClientClass.spec.ts | 2 +- src/utils/writeClientCore.spec.ts | 6 +- src/utils/writeClientCore.ts | 2 +- src/utils/writeClientIndex.spec.ts | 2 +- src/utils/writeClientModels.spec.ts | 2 +- src/utils/writeClientSchemas.spec.ts | 2 +- src/utils/writeClientServices.spec.ts | 2 +- test/__snapshots__/index.spec.ts.snap | 290 ++++++++---------- 55 files changed, 244 insertions(+), 365 deletions(-) delete mode 100644 src/templates/core/ApiError.hbs create mode 100644 src/templates/core/HttpError.hbs delete mode 100644 src/templates/core/functions/catchErrorCodes.hbs diff --git a/package.json b/package.json index 6521c6691..355ea1b37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.28.2", + "version": "0.28.3", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/index.ts b/src/index.ts index 34dbd719e..b5fcf53dd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import { Indent } from './Indent'; import { parse as parseV2 } from './openApi/v2'; import { parse as parseV3 } from './openApi/v3'; import { getOpenApiSpec } from './utils/getOpenApiSpec'; -import { getOpenApiVersion, OpenApiVersion } from './utils/getOpenApiVersion'; +import { OpenApiVersion, getOpenApiVersion } from './utils/getOpenApiVersion'; import { isString } from './utils/isString'; import { postProcessClient } from './utils/postProcessClient'; import { registerHandlebarTemplates } from './utils/registerHandlebarTemplates'; @@ -13,7 +13,7 @@ export { HttpClient } from './HttpClient'; export { Indent } from './Indent'; export type Options = { - input: string | Record; + input: string | Record; output: string; httpClient?: HttpClient; clientName?: string; diff --git a/src/templates/core/ApiError.hbs b/src/templates/core/ApiError.hbs deleted file mode 100644 index 787bbb4bf..000000000 --- a/src/templates/core/ApiError.hbs +++ /dev/null @@ -1,35 +0,0 @@ -{{>header}} - -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import type * as D from '@majkit/fp-ts-schema'; - -export class ApiError>> extends Error { - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: any; - public readonly request: ApiRequestOptions; - - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { - super(message); - - this.name = 'ApiError'; - this.url = response.url; - this.status = response.status; - this.statusText = response.statusText; - this.body = response.body; - this.request = request; - } -} - -export class HTTPError extends Error { - cause: unknown; - - constructor(originalError: unknown) { - super(`${originalError}`); - - this.cause = originalError; - this.name = 'HTTPError'; - } -} diff --git a/src/templates/core/ApiRequestOptions.hbs b/src/templates/core/ApiRequestOptions.hbs index 9782b9c49..ad143f822 100644 --- a/src/templates/core/ApiRequestOptions.hbs +++ b/src/templates/core/ApiRequestOptions.hbs @@ -1,14 +1,16 @@ {{>header}} -export type ApiRequestOptions>> = { +import type { Decoder } from '@majkit/fp-ts-schema'; + +export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; - readonly path?: Record; - readonly cookies?: Record; - readonly headers?: Record; - readonly query?: Record; - readonly formData?: Record; - readonly body?: any; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: unknown; readonly mediaType?: string; readonly decoders?: T; readonly responseHeader?: string; diff --git a/src/templates/core/ApiResponse.hbs b/src/templates/core/ApiResponse.hbs index 182f1e83d..d54c8dbf5 100644 --- a/src/templates/core/ApiResponse.hbs +++ b/src/templates/core/ApiResponse.hbs @@ -3,9 +3,9 @@ import type { Decoder, Output, DecoderError } from '@majkit/fp-ts-schema'; import type { Either } from 'fp-ts/lib/Either'; -export type ApiResponse>> = { - [key in keyof T]: key extends number ? Either>> = { + [key in keyof T]: key extends number ? { readonly status: key extends 0 ? number : key; - readonly body: Output; - }> : never; + readonly body: Either>; + } : never; }[keyof T]; diff --git a/src/templates/core/ApiResult.hbs b/src/templates/core/ApiResult.hbs index a768b8c5a..7e80139f5 100644 --- a/src/templates/core/ApiResult.hbs +++ b/src/templates/core/ApiResult.hbs @@ -5,5 +5,5 @@ export type ApiResult = { readonly ok: boolean; readonly status: number; readonly statusText: string; - readonly body: any; + readonly body: unknown; }; diff --git a/src/templates/core/BaseHttpRequest.hbs b/src/templates/core/BaseHttpRequest.hbs index 3831d3c08..a2aea731d 100644 --- a/src/templates/core/BaseHttpRequest.hbs +++ b/src/templates/core/BaseHttpRequest.hbs @@ -1,7 +1,7 @@ {{>header}} -import type { HTTPError } from './ApiError'; -import type { ApiResult } from './ApiResult'; +import type { HttpError } from './HttpError'; +import type { ApiResponse } from './ApiResponse'; import type { ApiRequestOptions } from './ApiRequestOptions'; import type { OpenAPIConfig } from './OpenAPI'; import type { TaskEither } from 'fp-ts/lib/TaskEither'; @@ -11,5 +11,5 @@ export abstract class BaseHttpRequest { constructor(public readonly config: OpenAPIConfig) {} - public abstract request>>(options: ApiRequestOptions): TaskEither>; + public abstract request>>(options: ApiRequestOptions): TaskEither>; } diff --git a/src/templates/core/HttpError.hbs b/src/templates/core/HttpError.hbs new file mode 100644 index 000000000..5c89a3476 --- /dev/null +++ b/src/templates/core/HttpError.hbs @@ -0,0 +1,12 @@ +{{>header}} + +export class HttpError extends Error { + cause: unknown; + + constructor(originalError: unknown) { + super(`${originalError}`); + + this.cause = originalError; + this.name = 'HttpError'; + } +} diff --git a/src/templates/core/HttpRequest.hbs b/src/templates/core/HttpRequest.hbs index 5bcc3ed2c..109589d42 100644 --- a/src/templates/core/HttpRequest.hbs +++ b/src/templates/core/HttpRequest.hbs @@ -4,6 +4,7 @@ import type { ApiRequestOptions } from './ApiRequestOptions'; import { BaseHttpRequest } from './BaseHttpRequest'; import type { OpenAPIConfig } from './OpenAPI'; import { request as __request } from './request'; +import type { Decoder } from '@majkit/fp-ts-schema'; export class {{httpRequest}} extends BaseHttpRequest { @@ -15,7 +16,7 @@ export class {{httpRequest}} extends BaseHttpRequest { * Request method * @param options The request options from the service */ - public override request(options: ApiRequestOptions) { + public override request>>(options: ApiRequestOptions) { return __request(this.config, options); } } diff --git a/src/templates/core/OpenAPI.hbs b/src/templates/core/OpenAPI.hbs index 0ab1e0cfb..e03d5694b 100644 --- a/src/templates/core/OpenAPI.hbs +++ b/src/templates/core/OpenAPI.hbs @@ -3,7 +3,7 @@ import type { ApiRequestOptions } from './ApiRequestOptions'; import type * as D from '@majkit/fp-ts-schema'; -type Resolver = (options: ApiRequestOptions>>) => Promise; +type Resolver = (options: ApiRequestOptions>>) => Promise; type Headers = Record; export type OpenAPIConfig = { diff --git a/src/templates/core/axios/getHeaders.hbs b/src/templates/core/axios/getHeaders.hbs index 3643cd5b3..8a94e585a 100644 --- a/src/templates/core/axios/getHeaders.hbs +++ b/src/templates/core/axios/getHeaders.hbs @@ -1,4 +1,4 @@ -export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise> => { +export const getHeaders = async >>(config: OpenAPIConfig, options: ApiRequestOptions, formData?: FormData): Promise> => { const token = await resolve(options, config.TOKEN); const username = await resolve(options, config.USERNAME); const password = await resolve(options, config.PASSWORD); diff --git a/src/templates/core/axios/getRequestBody.hbs b/src/templates/core/axios/getRequestBody.hbs index 229c4d3f4..15c24b461 100644 --- a/src/templates/core/axios/getRequestBody.hbs +++ b/src/templates/core/axios/getRequestBody.hbs @@ -1,7 +1,7 @@ {{>functions/convertRequestBody}} -export const getRequestBody = (options: ApiRequestOptions): any => { +export const getRequestBody = >>(options: ApiRequestOptions): unknown => { if (options.body) { return convertRequestBody(options.body); } diff --git a/src/templates/core/axios/getResponseBody.hbs b/src/templates/core/axios/getResponseBody.hbs index c73057c3c..5878045d0 100644 --- a/src/templates/core/axios/getResponseBody.hbs +++ b/src/templates/core/axios/getResponseBody.hbs @@ -1,4 +1,4 @@ -export const getResponseBody = (response: AxiosResponse): any => { +export const getResponseBody = (response: AxiosResponse): unknown => { if (response.status !== 204) { return response.data; } diff --git a/src/templates/core/axios/getResponseHeader.hbs b/src/templates/core/axios/getResponseHeader.hbs index 6a28e2f16..f191da9f3 100644 --- a/src/templates/core/axios/getResponseHeader.hbs +++ b/src/templates/core/axios/getResponseHeader.hbs @@ -1,4 +1,4 @@ -export const getResponseHeader = (response: AxiosResponse, responseHeader?: string): string | undefined => { +export const getResponseHeader = (response: AxiosResponse, responseHeader?: string): string | undefined => { if (responseHeader) { const content = response.headers[responseHeader]; if (isString(content)) { diff --git a/src/templates/core/axios/request.hbs b/src/templates/core/axios/request.hbs index c3a833d08..d52c7cbf8 100644 --- a/src/templates/core/axios/request.hbs +++ b/src/templates/core/axios/request.hbs @@ -5,7 +5,7 @@ import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } fro import FormData from 'form-data'; import * as D from '@majkit/fp-ts-schema'; -import { ApiError, HTTPError } from './ApiError'; +import { HttpError } from './HttpError'; import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import type { ApiResponse } from './ApiResponse'; @@ -69,14 +69,14 @@ import type { TaskEither } from 'fp-ts/lib/TaskEither'; * @param options The request options from the service * @param axiosClient The axios client instance to use */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): TaskEither> => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): TaskEither> => { return async () => { try { const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options, formData); - const response = await sendRequest(config, options, url, body, formData, headers, onCancel, axiosClient); + const response = await sendRequest(config, options, url, body, formData, headers, axiosClient); const responseBody = getResponseBody(response); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { @@ -88,7 +88,7 @@ export const request = >>(config: Ope }; return right(decodeResponse(result, options)); } catch (error) { - return left(new HTTPError(error)); + return left(new HttpError(error)); } }; }; diff --git a/src/templates/core/axios/sendRequest.hbs b/src/templates/core/axios/sendRequest.hbs index 51492bf3f..c356a63b7 100644 --- a/src/templates/core/axios/sendRequest.hbs +++ b/src/templates/core/axios/sendRequest.hbs @@ -1,30 +1,24 @@ -export const sendRequest = async ( +export const sendRequest = async >>( config: OpenAPIConfig, - options: ApiRequestOptions, + options: ApiRequestOptions, url: string, - body: any, + body: unknown, formData: FormData | undefined, headers: Record, - onCancel: OnCancel, axiosClient: AxiosInstance -): Promise> => { - const source = axios.CancelToken.source(); - +): Promise> => { const requestConfig: AxiosRequestConfig = { url, headers, data: body ?? formData, method: options.method, withCredentials: config.WITH_CREDENTIALS, - cancelToken: source.token, }; - onCancel(() => source.cancel('The user aborted a request.')); - try { return await axiosClient.request(requestConfig); } catch (error) { - const axiosError = error as AxiosError; + const axiosError = error as AxiosError; if (axiosError.response) { return axiosError.response; } diff --git a/src/templates/core/fetch/getHeaders.hbs b/src/templates/core/fetch/getHeaders.hbs index 3aca7aef3..5a57ae85d 100644 --- a/src/templates/core/fetch/getHeaders.hbs +++ b/src/templates/core/fetch/getHeaders.hbs @@ -1,4 +1,4 @@ -export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { +export const getHeaders = async >>(config: OpenAPIConfig, options: ApiRequestOptions): Promise => { const token = await resolve(options, config.TOKEN); const username = await resolve(options, config.USERNAME); const password = await resolve(options, config.PASSWORD); diff --git a/src/templates/core/fetch/getRequestBody.hbs b/src/templates/core/fetch/getRequestBody.hbs index fb234c2ba..c0979c688 100644 --- a/src/templates/core/fetch/getRequestBody.hbs +++ b/src/templates/core/fetch/getRequestBody.hbs @@ -1,7 +1,7 @@ {{>functions/convertRequestBody}} -export const getRequestBody = (options: ApiRequestOptions): any => { +export const getRequestBody = >>(options: ApiRequestOptions) => { if (options.body !== undefined) { const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 1011380ee..556324656 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -1,4 +1,4 @@ -export const getResponseBody = async (response: Response): Promise => { +export const getResponseBody = async (response: Response): Promise => { if (response.status !== 204) { try { const contentType = response.headers.get('Content-Type'); diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index 2025f0be1..f43ceb934 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -1,7 +1,7 @@ {{>header}} import * as D from '@majkit/fp-ts-schema'; -import { ApiError, HTTPError } from './ApiError'; +import { HttpError } from './HttpError'; import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import type { ApiResponse } from './ApiResponse'; @@ -61,14 +61,14 @@ import type { TaskEither } from 'fp-ts/lib/TaskEither'; * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { return async () => { try { const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - const response = await sendRequest(options, url, body, formData, headers, onCancel); + const response = await sendRequest(config, options, url, body, formData, headers); const responseBody = await getResponseBody(response); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { @@ -80,7 +80,7 @@ export const request = >>(config: Ope }; return right(decodeResponse(result, options)); } catch (error) { - return left(new HTTPError(error)); + return left(new HttpError(error)); } }; }; diff --git a/src/templates/core/fetch/sendRequest.hbs b/src/templates/core/fetch/sendRequest.hbs index 73f71f428..8df445437 100644 --- a/src/templates/core/fetch/sendRequest.hbs +++ b/src/templates/core/fetch/sendRequest.hbs @@ -1,26 +1,20 @@ -export const sendRequest = async ( +export const sendRequest = async >>( config: OpenAPIConfig, - options: ApiRequestOptions, + options: ApiRequestOptions, url: string, - body: any, + body: string | undefined | Blob | FormData, formData: FormData | undefined, headers: Headers, - onCancel: OnCancel ): Promise => { - const controller = new AbortController(); - const request: RequestInit = { headers, body: body ?? formData, method: options.method, - signal: controller.signal, }; if (config.WITH_CREDENTIALS) { request.credentials = config.CREDENTIALS; } - onCancel(() => controller.abort()); - return await fetch(url, request); }; diff --git a/src/templates/core/functions/catchErrorCodes.hbs b/src/templates/core/functions/catchErrorCodes.hbs deleted file mode 100644 index 42f69d071..000000000 --- a/src/templates/core/functions/catchErrorCodes.hbs +++ /dev/null @@ -1,35 +0,0 @@ - - -export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { - const errors: Record = { - 400: 'Bad Request', - 401: 'Unauthorized', - 403: 'Forbidden', - 404: 'Not Found', - 500: 'Internal Server Error', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - ...options.errors, - } - - const error = errors[result.status]; - if (error) { - throw new ApiError(options, result, error); - } - - if (!result.ok) { - const errorStatus = result.status ?? 'unknown'; - const errorStatusText = result.statusText ?? 'unknown'; - const errorBody = (() => { - try { - return JSON.stringify(result.body, null, 2); - } catch (e) { - return undefined; - } - })(); - - throw new ApiError(options, result, - `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` - ); - } -}; diff --git a/src/templates/core/functions/convertRequestBody.hbs b/src/templates/core/functions/convertRequestBody.hbs index d37630360..1b795e438 100644 --- a/src/templates/core/functions/convertRequestBody.hbs +++ b/src/templates/core/functions/convertRequestBody.hbs @@ -1,11 +1,11 @@ -const flattenOption = (body: unknown): any => +const flattenOption = (body: unknown): unknown => typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' && (body._tag === 'None' || body._tag === 'Some') ? body._tag === 'Some' && 'value' in body ? body.value : undefined : body; -const convertRequestBody = (body: unknown): any => +const convertRequestBody = (body: unknown): unknown => typeof body === 'object' && body !== null ? (() => { const flattened = flattenOption(body); diff --git a/src/templates/core/functions/decodeResponse.hbs b/src/templates/core/functions/decodeResponse.hbs index 90b4eae3c..468bdd65e 100644 --- a/src/templates/core/functions/decodeResponse.hbs +++ b/src/templates/core/functions/decodeResponse.hbs @@ -1,8 +1,8 @@ const decodeResponse = >>(result: ApiResult, options: ApiRequestOptions): ApiResponse => { - const decoder = options.decoders[result.status] ?? options.decoders[0] ?? D.unknown; - const body = decoder.decode(result.data); + const decoder = options.decoders?.[result.status] ?? options.decoders?.[0] ?? D.unknown; + const body = decoder.decode(result.body); return { status: result.status, - body: body, - }; + body, + } as ApiResponse; } diff --git a/src/templates/core/functions/getFormData.hbs b/src/templates/core/functions/getFormData.hbs index b21930d39..fbcb950c8 100644 --- a/src/templates/core/functions/getFormData.hbs +++ b/src/templates/core/functions/getFormData.hbs @@ -1,8 +1,8 @@ -export const getFormData = (options: ApiRequestOptions): FormData | undefined => { +export const getFormData = >>(options: ApiRequestOptions): FormData | undefined => { if (options.formData) { const formData = new FormData(); - const process = (key: string, value: any) => { + const process = (key: string, value: unknown) => { if (isString(value) || isBlob(value)) { formData.append(key, value); } else { diff --git a/src/templates/core/functions/getQueryString.hbs b/src/templates/core/functions/getQueryString.hbs index 7946851dd..e1e0035bb 100644 --- a/src/templates/core/functions/getQueryString.hbs +++ b/src/templates/core/functions/getQueryString.hbs @@ -1,17 +1,17 @@ -export const getQueryString = (params: Record): string => { +export const getQueryString = (params: Record): string => { const qs: string[] = []; - const append = (key: string, value: any) => { + const append = (key: string, value: unknown) => { qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); }; - const process = (key: string, value: any) => { + const process = (key: string, value: unknown) => { if (isDefined(value)) { if (Array.isArray(value)) { value.forEach(v => { process(key, v); }); - } else if (typeof value === 'object') { + } else if (typeof value === 'object' && value !== null) { Object.entries(value).forEach(([k, v]) => { process(`${key}[${k}]`, v); }); diff --git a/src/templates/core/functions/getUrl.hbs b/src/templates/core/functions/getUrl.hbs index fe181ab2e..c9a15bbe6 100644 --- a/src/templates/core/functions/getUrl.hbs +++ b/src/templates/core/functions/getUrl.hbs @@ -1,4 +1,4 @@ -const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { +const getUrl = >>(config: OpenAPIConfig, options: ApiRequestOptions): string => { const encoder = config.ENCODE_PATH || encodeURI; const path = options.url diff --git a/src/templates/core/functions/isBlob.hbs b/src/templates/core/functions/isBlob.hbs index d75c5b515..60c9d4f41 100644 --- a/src/templates/core/functions/isBlob.hbs +++ b/src/templates/core/functions/isBlob.hbs @@ -1,6 +1,10 @@ -export const isBlob = (value: any): value is Blob => { +export const isBlob = (value: unknown): value is Blob => { return ( typeof value === 'object' && + value !== null && + 'type' in value && + 'stream' in value && + 'arrayBuffer' in value && typeof value.type === 'string' && typeof value.stream === 'function' && typeof value.arrayBuffer === 'function' && diff --git a/src/templates/core/functions/isFormData.hbs b/src/templates/core/functions/isFormData.hbs index 98ec89ed5..3c8649575 100644 --- a/src/templates/core/functions/isFormData.hbs +++ b/src/templates/core/functions/isFormData.hbs @@ -1,3 +1,3 @@ -export const isFormData = (value: any): value is FormData => { +export const isFormData = (value: unknown): value is FormData => { return value instanceof FormData; }; diff --git a/src/templates/core/functions/isString.hbs b/src/templates/core/functions/isString.hbs index 71e1586af..1b70a8a7f 100644 --- a/src/templates/core/functions/isString.hbs +++ b/src/templates/core/functions/isString.hbs @@ -1,3 +1,3 @@ -export const isString = (value: any): value is string => { +export const isString = (value: unknown): value is string => { return typeof value === 'string'; }; diff --git a/src/templates/core/functions/isStringWithValue.hbs b/src/templates/core/functions/isStringWithValue.hbs index f5bd03a26..6e69d331c 100644 --- a/src/templates/core/functions/isStringWithValue.hbs +++ b/src/templates/core/functions/isStringWithValue.hbs @@ -1,3 +1,3 @@ -export const isStringWithValue = (value: any): value is string => { +export const isStringWithValue = (value: unknown): value is string => { return isString(value) && value !== ''; }; diff --git a/src/templates/core/functions/resolve.hbs b/src/templates/core/functions/resolve.hbs index bdab21649..5ca2f9094 100644 --- a/src/templates/core/functions/resolve.hbs +++ b/src/templates/core/functions/resolve.hbs @@ -1,8 +1,8 @@ -type Resolver = (options: ApiRequestOptions) => Promise; +type Resolver>,E> = (options: ApiRequestOptions) => Promise; -export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { +export const resolve = async >,E>(options: ApiRequestOptions, resolver?: E | Resolver): Promise => { if (typeof resolver === 'function') { - return (resolver as Resolver)(options); + return (resolver as Resolver)(options); } return resolver; }; diff --git a/src/templates/core/node/getHeaders.hbs b/src/templates/core/node/getHeaders.hbs index bfd25ce9d..503e7b8dc 100644 --- a/src/templates/core/node/getHeaders.hbs +++ b/src/templates/core/node/getHeaders.hbs @@ -1,4 +1,4 @@ -export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { +export const getHeaders = async >>(config: OpenAPIConfig, options: ApiRequestOptions): Promise => { const token = await resolve(options, config.TOKEN); const username = await resolve(options, config.USERNAME); const password = await resolve(options, config.PASSWORD); diff --git a/src/templates/core/node/getRequestBody.hbs b/src/templates/core/node/getRequestBody.hbs index 6000cbc15..3b5260ba9 100644 --- a/src/templates/core/node/getRequestBody.hbs +++ b/src/templates/core/node/getRequestBody.hbs @@ -1,13 +1,15 @@ {{>functions/convertRequestBody}} -export const getRequestBody = (options: ApiRequestOptions): any => { +export const getRequestBody = async >>(options: ApiRequestOptions) => { if (options.body !== undefined) { const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { return JSON.stringify(body) - } else if (isString(body) || isBlob(body) || isFormData(body)) { - return body as any; + } else if (isString(body) || isFormData(body)) { + return body; + } else if (isBlob(body)) { + return await body.arrayBuffer(); } else { return JSON.stringify(body); } diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index 1011380ee..556324656 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -1,4 +1,4 @@ -export const getResponseBody = async (response: Response): Promise => { +export const getResponseBody = async (response: Response): Promise => { if (response.status !== 204) { try { const contentType = response.headers.get('Content-Type'); diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index a102a67b6..e85b912eb 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -6,7 +6,7 @@ import type { RequestInit, Response } from 'node-fetch'; import type { AbortSignal } from 'node-fetch/externals'; import * as D from '@majkit/fp-ts-schema'; -import { ApiError } from './ApiError'; +import { HttpError } from './HttpError'; import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import type { ApiResponse } from './ApiResponse'; @@ -66,14 +66,14 @@ import type { TaskEither } from 'fp-ts/lib/TaskEither'; * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { return async () => { try { const url = getUrl(config, options); const formData = getFormData(options); - const body = getRequestBody(options); + const body = await getRequestBody(options); const headers = await getHeaders(config, options); - const response = await sendRequest(options, url, body, formData, headers, onCancel); + const response = await sendRequest(options, url, body, formData, headers); const responseBody = await getResponseBody(response); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { @@ -85,7 +85,7 @@ export const request = >>(config: Ope }; return right(decodeResponse(result, options)); } catch (error) { - return left(new HTTPError(error)); + return left(new HttpError(error)); } }; }; diff --git a/src/templates/core/node/sendRequest.hbs b/src/templates/core/node/sendRequest.hbs index a2ebf86d4..19791b100 100644 --- a/src/templates/core/node/sendRequest.hbs +++ b/src/templates/core/node/sendRequest.hbs @@ -1,21 +1,15 @@ -export const sendRequest = async ( - options: ApiRequestOptions, +export const sendRequest = async >>( + options: ApiRequestOptions, url: string, - body: any, + body: RequestInit['body'], formData: FormData | undefined, headers: Headers, - onCancel: OnCancel ): Promise => { - const controller = new AbortController(); - const request: RequestInit = { headers, method: options.method, body: body ?? formData, - signal: controller.signal as AbortSignal, }; - onCancel(() => controller.abort()); - return await fetch(url, request); }; diff --git a/src/templates/core/xhr/getHeaders.hbs b/src/templates/core/xhr/getHeaders.hbs index fe6130d4f..5a57ae85d 100644 --- a/src/templates/core/xhr/getHeaders.hbs +++ b/src/templates/core/xhr/getHeaders.hbs @@ -1,4 +1,4 @@ -export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { +export const getHeaders = async >>(config: OpenAPIConfig, options: ApiRequestOptions): Promise => { const token = await resolve(options, config.TOKEN); const username = await resolve(options, config.USERNAME); const password = await resolve(options, config.PASSWORD); diff --git a/src/templates/core/xhr/getRequestBody.hbs b/src/templates/core/xhr/getRequestBody.hbs index fb234c2ba..c0979c688 100644 --- a/src/templates/core/xhr/getRequestBody.hbs +++ b/src/templates/core/xhr/getRequestBody.hbs @@ -1,7 +1,7 @@ {{>functions/convertRequestBody}} -export const getRequestBody = (options: ApiRequestOptions): any => { +export const getRequestBody = >>(options: ApiRequestOptions) => { if (options.body !== undefined) { const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index ccf83b1ff..0a9c85013 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -1,4 +1,4 @@ -export const getResponseBody = (xhr: XMLHttpRequest): any => { +export const getResponseBody = (xhr: XMLHttpRequest): unknown => { if (xhr.status !== 204) { try { const contentType = xhr.getResponseHeader('Content-Type'); diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 9bf111247..77ef9d6ef 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -1,7 +1,7 @@ {{>header}} import * as D from '@majkit/fp-ts-schema'; -import { ApiError, HTTPError } from './ApiError'; +import { HttpError } from './HttpError'; import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import type { ApiResponse } from './ApiResponse'; @@ -64,14 +64,14 @@ import type { TaskEither } from 'fp-ts/lib/TaskEither'; * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { return async () => { try { const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - const response = await sendRequest(config, options, url, body, formData, headers, onCancel); + const response = await sendRequest(config, options, url, body, formData, headers); const responseBody = getResponseBody(response); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { @@ -83,7 +83,7 @@ export const request = >>(config: Ope }; return right(decodeResponse(result, options)); } catch (error) { - return left(new HTTPError(error)); + return left(new HttpError(error)); } }; }; diff --git a/src/templates/core/xhr/sendRequest.hbs b/src/templates/core/xhr/sendRequest.hbs index 0badf8daa..b4c672dc2 100644 --- a/src/templates/core/xhr/sendRequest.hbs +++ b/src/templates/core/xhr/sendRequest.hbs @@ -1,11 +1,10 @@ -export const sendRequest = async ( +export const sendRequest = async >>( config: OpenAPIConfig, - options: ApiRequestOptions, + options: ApiRequestOptions, url: string, - body: any, + body: string | undefined | Blob | FormData, formData: FormData | undefined, headers: Headers, - onCancel: OnCancel ): Promise => { const xhr = new XMLHttpRequest(); xhr.open(options.method, url, true); @@ -20,7 +19,5 @@ export const sendRequest = async ( xhr.onabort = () => reject(new Error('Request aborted')); xhr.onerror = () => reject(new Error('Network error')); xhr.send(body ?? formData); - - onCancel(() => xhr.abort()); }); }; diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 7c128677c..bea7997b6 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -24,7 +24,7 @@ export class {{{name}}}{{{@root.postfix}}} { {{#each operations}} {{#if parameters}} - private static {{{name}}}Decoder = D.object({ + private {{#unless @root.exportClient}}static {{/unless}}{{{name}}}Decoder = D.object({ {{#if @root.useOptions~}} {{#each parameters}} {{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}, diff --git a/src/templates/index.hbs b/src/templates/index.hbs index 176dcc3d6..50c5db343 100644 --- a/src/templates/index.hbs +++ b/src/templates/index.hbs @@ -5,11 +5,10 @@ export { {{{clientName}}} } from './{{{clientName}}}'; {{/if}} {{#if @root.exportCore}} -export { ApiError } from './core/ApiError'; +export { HttpError } from './core/HttpError'; {{#if @root.exportClient}} export { BaseHttpRequest } from './core/BaseHttpRequest'; {{/if}} -export { CancelablePromise, CancelError } from './core/CancelablePromise'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; {{/if}} diff --git a/src/utils/registerHandlebarTemplates.spec.ts b/src/utils/registerHandlebarTemplates.spec.ts index 4f066ea8e..e40c103f3 100644 --- a/src/utils/registerHandlebarTemplates.spec.ts +++ b/src/utils/registerHandlebarTemplates.spec.ts @@ -12,7 +12,7 @@ describe('registerHandlebarTemplates', () => { expect(templates.exports.schema).toBeDefined(); expect(templates.exports.service).toBeDefined(); expect(templates.core.settings).toBeDefined(); - expect(templates.core.apiError).toBeDefined(); + expect(templates.core.httpError).toBeDefined(); expect(templates.core.apiRequestOptions).toBeDefined(); expect(templates.core.apiResult).toBeDefined(); expect(templates.core.request).toBeDefined(); diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index e28377786..307b2a516 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -2,11 +2,11 @@ import Handlebars from 'handlebars/runtime'; import { HttpClient } from '../HttpClient'; import templateClient from '../templates/client.hbs'; -import templateCoreApiError from '../templates/core/ApiError.hbs'; import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs'; import templateCoreApiResponse from '../templates/core/ApiResponse.hbs'; import templateCoreApiResult from '../templates/core/ApiResult.hbs'; import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs'; +import templateCoreHttpError from '../templates/core/HttpError.hbs'; import templateCoreHttpRequest from '../templates/core/HttpRequest.hbs'; import templateCoreSettings from '../templates/core/OpenAPI.hbs'; import axiosGetHeaders from '../templates/core/axios/getHeaders.hbs'; @@ -22,7 +22,6 @@ import fetchGetResponseHeader from '../templates/core/fetch/getResponseHeader.hb import fetchRequest from '../templates/core/fetch/request.hbs'; import fetchSendRequest from '../templates/core/fetch/sendRequest.hbs'; import functionBase64 from '../templates/core/functions/base64.hbs'; -import functionCatchErrorCodes from '../templates/core/functions/catchErrorCodes.hbs'; import functionConvertRequestBody from '../templates/core/functions/convertRequestBody.hbs'; import functionDecodeResponse from '../templates/core/functions/decodeResponse.hbs'; import functionGetFormData from '../templates/core/functions/getFormData.hbs'; @@ -87,12 +86,12 @@ export interface Templates { }; core: { settings: Handlebars.TemplateDelegate; - apiError: Handlebars.TemplateDelegate; apiRequestOptions: Handlebars.TemplateDelegate; apiResponse: Handlebars.TemplateDelegate; apiResult: Handlebars.TemplateDelegate; request: Handlebars.TemplateDelegate; baseHttpRequest: Handlebars.TemplateDelegate; + httpError: Handlebars.TemplateDelegate; httpRequest: Handlebars.TemplateDelegate; }; } @@ -118,12 +117,12 @@ export const registerHandlebarTemplates = (root: { }, core: { settings: Handlebars.template(templateCoreSettings), - apiError: Handlebars.template(templateCoreApiError), apiRequestOptions: Handlebars.template(templateCoreApiRequestOptions), apiResponse: Handlebars.template(templateCoreApiResponse), apiResult: Handlebars.template(templateCoreApiResult), request: Handlebars.template(templateCoreRequest), baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest), + httpError: Handlebars.template(templateCoreHttpError), httpRequest: Handlebars.template(templateCoreHttpRequest), }, }; @@ -154,7 +153,6 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('base', Handlebars.template(partialBase)); // Generic functions used in 'request' file @see src/templates/core/request.hbs for more info - Handlebars.registerPartial('functions/catchErrorCodes', Handlebars.template(functionCatchErrorCodes)); Handlebars.registerPartial('functions/convertRequestBody', Handlebars.template(functionConvertRequestBody)); Handlebars.registerPartial('functions/decodeResponse', Handlebars.template(functionDecodeResponse)); Handlebars.registerPartial('functions/getFormData', Handlebars.template(functionGetFormData)); diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 9049dfc22..14605c0e0 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -26,12 +26,12 @@ describe('writeClient', () => { }, core: { settings: () => 'settings', - apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', + httpError: () => 'httpError', httpRequest: () => 'httpRequest', }, }; diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts index d138b2cd9..1b347dbfb 100644 --- a/src/utils/writeClientClass.spec.ts +++ b/src/utils/writeClientClass.spec.ts @@ -26,12 +26,12 @@ describe('writeClientClass', () => { }, core: { settings: () => 'settings', - apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', + httpError: () => 'httpError', httpRequest: () => 'httpRequest', }, }; diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index da528c99c..5d003b040 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -29,12 +29,12 @@ describe('writeClientCore', () => { }, core: { settings: () => 'settings', - apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', + httpError: () => 'httpError', httpRequest: () => 'httpRequest', }, }; @@ -44,7 +44,7 @@ describe('writeClientCore', () => { await writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4, 'MyClient'); expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/HttpError.ts'), `httpError${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiRequestOptions.ts'), `apiRequestOptions${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiResponse.ts'), `apiResponse${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); @@ -55,11 +55,11 @@ describe('writeClientCore', () => { await writeClientCore(client, templates, '/', HttpClient.FETCH, Indent.SPACE_4, 'MyClient', 'request-copy.ts'); expect(writeFile).toBeCalledWith(resolve('/', '/OpenAPI.ts'), `settings${EOL}`); - expect(writeFile).toBeCalledWith(resolve('/', '/ApiError.ts'), `apiError${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiRequestOptions.ts'), `apiRequestOptions${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiResponse.ts'), `apiResponse${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/HttpError.ts'), `httpError${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/BaseHttpRequest.ts'), `baseHttpRequest${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/FetchHttpRequest.ts'), `httpRequest${EOL}`); diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts index aef34bd98..f5ccc941f 100644 --- a/src/utils/writeClientCore.ts +++ b/src/utils/writeClientCore.ts @@ -38,7 +38,7 @@ export const writeClientCore = async ( }; await writeFile(resolve(outputPath, 'OpenAPI.ts'), i(templates.core.settings(context), indent)); - await writeFile(resolve(outputPath, 'ApiError.ts'), i(templates.core.apiError(context), indent)); + await writeFile(resolve(outputPath, 'HttpError.ts'), i(templates.core.httpError(context), indent)); await writeFile(resolve(outputPath, 'ApiRequestOptions.ts'), i(templates.core.apiRequestOptions(context), indent)); await writeFile(resolve(outputPath, 'ApiResponse.ts'), i(templates.core.apiResponse(context), indent)); await writeFile(resolve(outputPath, 'ApiResult.ts'), i(templates.core.apiResult(context), indent)); diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index 511604812..e5190881e 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -26,12 +26,12 @@ describe('writeClientIndex', () => { }, core: { settings: () => 'settings', - apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', + httpError: () => 'httpError', httpRequest: () => 'httpRequest', }, }; diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index aa67c9b66..144be8b13 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -42,12 +42,12 @@ describe('writeClientModels', () => { }, core: { settings: () => 'settings', - apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', + httpError: () => 'httpError', httpRequest: () => 'httpRequest', }, }; diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index 068881a48..664f5d8d9 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -42,12 +42,12 @@ describe('writeClientSchemas', () => { }, core: { settings: () => 'settings', - apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', + httpError: () => 'httpError', httpRequest: () => 'httpRequest', }, }; diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index dfbe1e28e..88443277d 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -30,12 +30,12 @@ describe('writeClientServices', () => { }, core: { settings: () => 'settings', - apiError: () => 'apiError', apiRequestOptions: () => 'apiRequestOptions', apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', baseHttpRequest: () => 'baseHttpRequest', + httpError: () => 'httpError', httpRequest: () => 'httpRequest', }, }; diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 1beffe91e..84a33cf70 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -1,60 +1,21 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`v2 should generate: test/generated/v2/core/ApiError.ts 1`] = ` -"/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import type * as D from '@majkit/fp-ts-schema'; - -export class ApiError>> extends Error { - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: any; - public readonly request: ApiRequestOptions; - - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { - super(message); - - this.name = 'ApiError'; - this.url = response.url; - this.status = response.status; - this.statusText = response.statusText; - this.body = response.body; - this.request = request; - } -} - -export class HTTPError extends Error { - cause: unknown; - - constructor(originalError: unknown) { - super(\`\${originalError}\`); - - this.cause = originalError; - this.name = 'HTTPError'; - } -} -" -`; - exports[`v2 should generate: test/generated/v2/core/ApiRequestOptions.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type ApiRequestOptions>> = { +import type { Decoder } from '@majkit/fp-ts-schema'; + +export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; - readonly path?: Record; - readonly cookies?: Record; - readonly headers?: Record; - readonly query?: Record; - readonly formData?: Record; - readonly body?: any; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: unknown; readonly mediaType?: string; readonly decoders?: T; readonly responseHeader?: string; @@ -71,11 +32,11 @@ exports[`v2 should generate: test/generated/v2/core/ApiResponse.ts 1`] = ` import type { Decoder, Output, DecoderError } from '@majkit/fp-ts-schema'; import type { Either } from 'fp-ts/lib/Either'; -export type ApiResponse>> = { - [key in keyof T]: key extends number ? Either>> = { + [key in keyof T]: key extends number ? { readonly status: key extends 0 ? number : key; - readonly body: Output; - }> : never; + readonly body: Either>; + } : never; }[keyof T]; " `; @@ -90,11 +51,29 @@ export type ApiResult = { readonly ok: boolean; readonly status: number; readonly statusText: string; - readonly body: any; + readonly body: unknown; }; " `; +exports[`v2 should generate: test/generated/v2/core/HttpError.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class HttpError extends Error { + cause: unknown; + + constructor(originalError: unknown) { + super(\`\${originalError}\`); + + this.cause = originalError; + this.name = 'HttpError'; + } +} +" +`; + exports[`v2 should generate: test/generated/v2/core/OpenAPI.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ @@ -103,7 +82,7 @@ exports[`v2 should generate: test/generated/v2/core/OpenAPI.ts 1`] = ` import type { ApiRequestOptions } from './ApiRequestOptions'; import type * as D from '@majkit/fp-ts-schema'; -type Resolver = (options: ApiRequestOptions>>) => Promise; +type Resolver = (options: ApiRequestOptions>>) => Promise; type Headers = Record; export type OpenAPIConfig = { @@ -138,7 +117,7 @@ exports[`v2 should generate: test/generated/v2/core/request.ts 1`] = ` /* tslint:disable */ /* eslint-disable */ import * as D from '@majkit/fp-ts-schema'; -import { ApiError, HTTPError } from './ApiError'; +import { HttpError } from './HttpError'; import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import type { ApiResponse } from './ApiResponse'; @@ -150,17 +129,21 @@ export const isDefined = (value: T | null | undefined): value is Exclude { +export const isString = (value: unknown): value is string => { return typeof value === 'string'; }; -export const isStringWithValue = (value: any): value is string => { +export const isStringWithValue = (value: unknown): value is string => { return isString(value) && value !== ''; }; -export const isBlob = (value: any): value is Blob => { +export const isBlob = (value: unknown): value is Blob => { return ( typeof value === 'object' && + value !== null && + 'type' in value && + 'stream' in value && + 'arrayBuffer' in value && typeof value.type === 'string' && typeof value.stream === 'function' && typeof value.arrayBuffer === 'function' && @@ -171,7 +154,7 @@ export const isBlob = (value: any): value is Blob => { ); }; -export const isFormData = (value: any): value is FormData => { +export const isFormData = (value: unknown): value is FormData => { return value instanceof FormData; }; @@ -184,20 +167,20 @@ export const base64 = (str: string): string => { } }; -export const getQueryString = (params: Record): string => { +export const getQueryString = (params: Record): string => { const qs: string[] = []; - const append = (key: string, value: any) => { + const append = (key: string, value: unknown) => { qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); }; - const process = (key: string, value: any) => { + const process = (key: string, value: unknown) => { if (isDefined(value)) { if (Array.isArray(value)) { value.forEach(v => { process(key, v); }); - } else if (typeof value === 'object') { + } else if (typeof value === 'object' && value !== null) { Object.entries(value).forEach(([k, v]) => { process(\`\${key}[\${k}]\`, v); }); @@ -218,7 +201,7 @@ export const getQueryString = (params: Record): string => { return ''; }; -const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { +const getUrl = >>(config: OpenAPIConfig, options: ApiRequestOptions): string => { const encoder = config.ENCODE_PATH || encodeURI; const path = options.url @@ -237,11 +220,11 @@ const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { return url; }; -export const getFormData = (options: ApiRequestOptions): FormData | undefined => { +export const getFormData = >>(options: ApiRequestOptions): FormData | undefined => { if (options.formData) { const formData = new FormData(); - const process = (key: string, value: any) => { + const process = (key: string, value: unknown) => { if (isString(value) || isBlob(value)) { formData.append(key, value); } else { @@ -264,16 +247,16 @@ export const getFormData = (options: ApiRequestOptions): FormData | undefined => return undefined; }; -type Resolver = (options: ApiRequestOptions) => Promise; +type Resolver>,E> = (options: ApiRequestOptions) => Promise; -export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { +export const resolve = async >,E>(options: ApiRequestOptions, resolver?: E | Resolver): Promise => { if (typeof resolver === 'function') { - return (resolver as Resolver)(options); + return (resolver as Resolver)(options); } return resolver; }; -export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { +export const getHeaders = async >>(config: OpenAPIConfig, options: ApiRequestOptions): Promise => { const token = await resolve(options, config.TOKEN); const username = await resolve(options, config.USERNAME); const password = await resolve(options, config.PASSWORD); @@ -314,14 +297,14 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio return new Headers(headers); }; -const flattenOption = (body: unknown): any => +const flattenOption = (body: unknown): unknown => typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' && (body._tag === 'None' || body._tag === 'Some') ? body._tag === 'Some' && 'value' in body ? body.value : undefined : body; -const convertRequestBody = (body: unknown): any => +const convertRequestBody = (body: unknown): unknown => typeof body === 'object' && body !== null ? (() => { const flattened = flattenOption(body); @@ -341,7 +324,7 @@ const convertRequestBody = (body: unknown): any => })() : body; -export const getRequestBody = (options: ApiRequestOptions): any => { +export const getRequestBody = >>(options: ApiRequestOptions) => { if (options.body !== undefined) { const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { @@ -355,30 +338,24 @@ export const getRequestBody = (options: ApiRequestOptions): any => { return undefined; }; -export const sendRequest = async ( +export const sendRequest = async >>( config: OpenAPIConfig, - options: ApiRequestOptions, + options: ApiRequestOptions, url: string, - body: any, + body: string | undefined | Blob | FormData, formData: FormData | undefined, headers: Headers, - onCancel: OnCancel ): Promise => { - const controller = new AbortController(); - const request: RequestInit = { headers, body: body ?? formData, method: options.method, - signal: controller.signal, }; if (config.WITH_CREDENTIALS) { request.credentials = config.CREDENTIALS; } - onCancel(() => controller.abort()); - return await fetch(url, request); }; @@ -392,7 +369,7 @@ export const getResponseHeader = (response: Response, responseHeader?: string): return undefined; }; -export const getResponseBody = async (response: Response): Promise => { +export const getResponseBody = async (response: Response): Promise => { if (response.status !== 204) { try { const contentType = response.headers.get('Content-Type'); @@ -413,26 +390,26 @@ export const getResponseBody = async (response: Response): Promise => { }; const decodeResponse = >>(result: ApiResult, options: ApiRequestOptions): ApiResponse => { - const decoder = options.decoders[result.status] ?? options.decoders[0] ?? D.unknown; - const body = decoder.decode(result.data); + const decoder = options.decoders?.[result.status] ?? options.decoders?.[0] ?? D.unknown; + const body = decoder.decode(result.body); return { status: result.status, - body: body, - }; + body, + } as ApiResponse; } /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { return async () => { try { const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - const response = await sendRequest(options, url, body, formData, headers, onCancel); + const response = await sendRequest(config, options, url, body, formData, headers); const responseBody = await getResponseBody(response); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { @@ -444,7 +421,7 @@ export const request = >>(config: Ope }; return right(decodeResponse(result, options)); } catch (error) { - return left(new HTTPError(error)); + return left(new HttpError(error)); } }; }; @@ -456,8 +433,7 @@ exports[`v2 should generate: test/generated/v2/index.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export { ApiError } from './core/ApiError'; -export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { HttpError } from './core/HttpError'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; @@ -2803,42 +2779,19 @@ export class TypesService { " `; -exports[`v3 should generate: test/generated/v3/core/ApiError.ts 1`] = ` +exports[`v3 should generate: test/generated/v3/core/HttpError.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import type * as D from '@majkit/fp-ts-schema'; - -export class ApiError>> extends Error { - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: any; - public readonly request: ApiRequestOptions; - - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { - super(message); - - this.name = 'ApiError'; - this.url = response.url; - this.status = response.status; - this.statusText = response.statusText; - this.body = response.body; - this.request = request; - } -} - -export class HTTPError extends Error { +export class HttpError extends Error { cause: unknown; constructor(originalError: unknown) { super(\`\${originalError}\`); this.cause = originalError; - this.name = 'HTTPError'; + this.name = 'HttpError'; } } " @@ -2849,15 +2802,17 @@ exports[`v3 should generate: test/generated/v3/core/ApiRequestOptions.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type ApiRequestOptions>> = { +import type { Decoder } from '@majkit/fp-ts-schema'; + +export type ApiRequestOptions>> = { readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; readonly url: string; - readonly path?: Record; - readonly cookies?: Record; - readonly headers?: Record; - readonly query?: Record; - readonly formData?: Record; - readonly body?: any; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: unknown; readonly mediaType?: string; readonly decoders?: T; readonly responseHeader?: string; @@ -2874,11 +2829,11 @@ exports[`v3 should generate: test/generated/v3/core/ApiResponse.ts 1`] = ` import type { Decoder, Output, DecoderError } from '@majkit/fp-ts-schema'; import type { Either } from 'fp-ts/lib/Either'; -export type ApiResponse>> = { - [key in keyof T]: key extends number ? Either>> = { + [key in keyof T]: key extends number ? { readonly status: key extends 0 ? number : key; - readonly body: Output; - }> : never; + readonly body: Either>; + } : never; }[keyof T]; " `; @@ -2893,7 +2848,7 @@ export type ApiResult = { readonly ok: boolean; readonly status: number; readonly statusText: string; - readonly body: any; + readonly body: unknown; }; " `; @@ -2906,7 +2861,7 @@ exports[`v3 should generate: test/generated/v3/core/OpenAPI.ts 1`] = ` import type { ApiRequestOptions } from './ApiRequestOptions'; import type * as D from '@majkit/fp-ts-schema'; -type Resolver = (options: ApiRequestOptions>>) => Promise; +type Resolver = (options: ApiRequestOptions>>) => Promise; type Headers = Record; export type OpenAPIConfig = { @@ -2941,7 +2896,7 @@ exports[`v3 should generate: test/generated/v3/core/request.ts 1`] = ` /* tslint:disable */ /* eslint-disable */ import * as D from '@majkit/fp-ts-schema'; -import { ApiError, HTTPError } from './ApiError'; +import { HttpError } from './HttpError'; import type { ApiRequestOptions } from './ApiRequestOptions'; import type { ApiResult } from './ApiResult'; import type { ApiResponse } from './ApiResponse'; @@ -2953,17 +2908,21 @@ export const isDefined = (value: T | null | undefined): value is Exclude { +export const isString = (value: unknown): value is string => { return typeof value === 'string'; }; -export const isStringWithValue = (value: any): value is string => { +export const isStringWithValue = (value: unknown): value is string => { return isString(value) && value !== ''; }; -export const isBlob = (value: any): value is Blob => { +export const isBlob = (value: unknown): value is Blob => { return ( typeof value === 'object' && + value !== null && + 'type' in value && + 'stream' in value && + 'arrayBuffer' in value && typeof value.type === 'string' && typeof value.stream === 'function' && typeof value.arrayBuffer === 'function' && @@ -2974,7 +2933,7 @@ export const isBlob = (value: any): value is Blob => { ); }; -export const isFormData = (value: any): value is FormData => { +export const isFormData = (value: unknown): value is FormData => { return value instanceof FormData; }; @@ -2987,20 +2946,20 @@ export const base64 = (str: string): string => { } }; -export const getQueryString = (params: Record): string => { +export const getQueryString = (params: Record): string => { const qs: string[] = []; - const append = (key: string, value: any) => { + const append = (key: string, value: unknown) => { qs.push(\`\${encodeURIComponent(key)}=\${encodeURIComponent(String(value))}\`); }; - const process = (key: string, value: any) => { + const process = (key: string, value: unknown) => { if (isDefined(value)) { if (Array.isArray(value)) { value.forEach(v => { process(key, v); }); - } else if (typeof value === 'object') { + } else if (typeof value === 'object' && value !== null) { Object.entries(value).forEach(([k, v]) => { process(\`\${key}[\${k}]\`, v); }); @@ -3021,7 +2980,7 @@ export const getQueryString = (params: Record): string => { return ''; }; -const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { +const getUrl = >>(config: OpenAPIConfig, options: ApiRequestOptions): string => { const encoder = config.ENCODE_PATH || encodeURI; const path = options.url @@ -3040,11 +2999,11 @@ const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { return url; }; -export const getFormData = (options: ApiRequestOptions): FormData | undefined => { +export const getFormData = >>(options: ApiRequestOptions): FormData | undefined => { if (options.formData) { const formData = new FormData(); - const process = (key: string, value: any) => { + const process = (key: string, value: unknown) => { if (isString(value) || isBlob(value)) { formData.append(key, value); } else { @@ -3067,16 +3026,16 @@ export const getFormData = (options: ApiRequestOptions): FormData | undefined => return undefined; }; -type Resolver = (options: ApiRequestOptions) => Promise; +type Resolver>,E> = (options: ApiRequestOptions) => Promise; -export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { +export const resolve = async >,E>(options: ApiRequestOptions, resolver?: E | Resolver): Promise => { if (typeof resolver === 'function') { - return (resolver as Resolver)(options); + return (resolver as Resolver)(options); } return resolver; }; -export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { +export const getHeaders = async >>(config: OpenAPIConfig, options: ApiRequestOptions): Promise => { const token = await resolve(options, config.TOKEN); const username = await resolve(options, config.USERNAME); const password = await resolve(options, config.PASSWORD); @@ -3117,14 +3076,14 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio return new Headers(headers); }; -const flattenOption = (body: unknown): any => +const flattenOption = (body: unknown): unknown => typeof body === 'object' && body !== null && '_tag' in body && typeof body._tag === 'string' && (body._tag === 'None' || body._tag === 'Some') ? body._tag === 'Some' && 'value' in body ? body.value : undefined : body; -const convertRequestBody = (body: unknown): any => +const convertRequestBody = (body: unknown): unknown => typeof body === 'object' && body !== null ? (() => { const flattened = flattenOption(body); @@ -3144,7 +3103,7 @@ const convertRequestBody = (body: unknown): any => })() : body; -export const getRequestBody = (options: ApiRequestOptions): any => { +export const getRequestBody = >>(options: ApiRequestOptions) => { if (options.body !== undefined) { const body = convertRequestBody(options.body); if (options.mediaType?.includes('/json')) { @@ -3158,30 +3117,24 @@ export const getRequestBody = (options: ApiRequestOptions): any => { return undefined; }; -export const sendRequest = async ( +export const sendRequest = async >>( config: OpenAPIConfig, - options: ApiRequestOptions, + options: ApiRequestOptions, url: string, - body: any, + body: string | undefined | Blob | FormData, formData: FormData | undefined, headers: Headers, - onCancel: OnCancel ): Promise => { - const controller = new AbortController(); - const request: RequestInit = { headers, body: body ?? formData, method: options.method, - signal: controller.signal, }; if (config.WITH_CREDENTIALS) { request.credentials = config.CREDENTIALS; } - onCancel(() => controller.abort()); - return await fetch(url, request); }; @@ -3195,7 +3148,7 @@ export const getResponseHeader = (response: Response, responseHeader?: string): return undefined; }; -export const getResponseBody = async (response: Response): Promise => { +export const getResponseBody = async (response: Response): Promise => { if (response.status !== 204) { try { const contentType = response.headers.get('Content-Type'); @@ -3216,26 +3169,26 @@ export const getResponseBody = async (response: Response): Promise => { }; const decodeResponse = >>(result: ApiResult, options: ApiRequestOptions): ApiResponse => { - const decoder = options.decoders[result.status] ?? options.decoders[0] ?? D.unknown; - const body = decoder.decode(result.data); + const decoder = options.decoders?.[result.status] ?? options.decoders?.[0] ?? D.unknown; + const body = decoder.decode(result.body); return { status: result.status, - body: body, - }; + body, + } as ApiResponse; } /** * Request method * @param config The OpenAPI configuration object * @param options The request options from the service */ -export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { +export const request = >>(config: OpenAPIConfig, options: ApiRequestOptions): TaskEither> => { return async () => { try { const url = getUrl(config, options); const formData = getFormData(options); const body = getRequestBody(options); const headers = await getHeaders(config, options); - const response = await sendRequest(options, url, body, formData, headers, onCancel); + const response = await sendRequest(config, options, url, body, formData, headers); const responseBody = await getResponseBody(response); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { @@ -3247,7 +3200,7 @@ export const request = >>(config: Ope }; return right(decodeResponse(result, options)); } catch (error) { - return left(new HTTPError(error)); + return left(new HttpError(error)); } }; }; @@ -3259,8 +3212,7 @@ exports[`v3 should generate: test/generated/v3/index.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export { ApiError } from './core/ApiError'; -export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { HttpError } from './core/HttpError'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; From c1a00eae3e64c97a2bdfb528e2043edb20cc3c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Wed, 15 Nov 2023 20:51:09 +0000 Subject: [PATCH 33/48] =?UTF-8?q?=E2=9C=A8=20fp-ts=20map=20integration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- src/templates/core/axios/request.hbs | 4 + src/templates/core/fetch/request.hbs | 4 + src/templates/core/node/request.hbs | 4 + src/templates/core/request.hbs | 48 +++++++++- src/templates/core/xhr/request.hbs | 4 + test/__snapshots__/index.spec.ts.snap | 124 ++++++++++++++++++++++---- 7 files changed, 167 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 355ea1b37..f2bd91f78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.28.3", + "version": "0.28.4", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/core/axios/request.hbs b/src/templates/core/axios/request.hbs index d52c7cbf8..93433bf87 100644 --- a/src/templates/core/axios/request.hbs +++ b/src/templates/core/axios/request.hbs @@ -12,6 +12,10 @@ import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; import { right, left } from 'fp-ts/lib/Either'; import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import { pipe } from 'fp-ts/lib/function'; {{>functions/isDefined}} diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index f43ceb934..29e6170de 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -8,6 +8,10 @@ import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; import { right, left } from 'fp-ts/lib/Either'; import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import { pipe } from 'fp-ts/lib/function'; {{>functions/isDefined}} diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index e85b912eb..99b0f7cd4 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -13,6 +13,10 @@ import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; import { right, left } from 'fp-ts/lib/Either'; import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import { pipe } from 'fp-ts/lib/function'; {{>functions/isDefined}} diff --git a/src/templates/core/request.hbs b/src/templates/core/request.hbs index 6c3920733..05c77355d 100644 --- a/src/templates/core/request.hbs +++ b/src/templates/core/request.hbs @@ -1,4 +1,44 @@ -{{~#equals @root.httpClient 'xhr'}}{{>xhr/request}}{{/equals~}} -{{~#equals @root.httpClient 'axios'}}{{>axios/request}}{{/equals~}} -{{~#equals @root.httpClient 'fetch'}}{{>fetch/request}}{{/equals~}} -{{~#equals @root.httpClient 'node'}}{{>node/request}}{{/equals~}} +{{~#equals @root.httpClient 'xhr'}}{{>xhr/request}}{{/equals}} +{{~#equals @root.httpClient 'axios'}}{{>axios/request}}{{/equals}} +{{~#equals @root.httpClient 'fetch'}}{{>fetch/request}}{{/equals}} +{{~#equals @root.httpClient 'node'}}{{>node/request}}{{/equals}} + +type ErrMatcher = { + DecodeErr: (err: D.DecoderError) => B; +}; + +type ErrsMatcher = ErrMatcher & { + HttpErr: (err: HttpError) => B; +}; + +type Matchers>>, B> = { + [E in T as E['status']]: E['body'] extends Either ? ($: X) => B : never; +}; + +type DefMatcher>>, B> = { + _: T['body'] extends Either ? ($: X) => B : never; +}; + +export const match = + < + T extends ApiResponse>>, + B, + M extends Partial> & DefMatcher & ErrMatcher, + >( + matchers: M, + ) => + (response: T): B => + either.isLeft(response.body) + ? matchers.DecodeErr(response.body.left) + : ((matchers[response.status as keyof typeof matchers] as ((d: unknown) => B) | undefined) ?? matchers._)( + response.body.right, + ); + +type TEMatchers>>, B> = Matchers & + DefMatcher & + ErrsMatcher; + +export const matchT = + >>, M extends TEMatchers>(matchers: M) => + (te: TaskEither) => + pipe(te, taskEither.match(matchers.HttpErr, match(matchers))) as Task ? B : never>; diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 77ef9d6ef..7e6ea4411 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -8,6 +8,10 @@ import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; import { right, left } from 'fp-ts/lib/Either'; import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import { pipe } from 'fp-ts/lib/function'; {{>functions/isDefined}} diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 84a33cf70..82d56167c 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -124,6 +124,10 @@ import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; import { right, left } from 'fp-ts/lib/Either'; import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import { pipe } from 'fp-ts/lib/function'; export const isDefined = (value: T | null | undefined): value is Exclude => { return value !== undefined && value !== null; @@ -425,6 +429,46 @@ export const request = >>(config: Ope } }; }; + +type ErrMatcher = { + DecodeErr: (err: D.DecoderError) => B; +}; + +type ErrsMatcher = ErrMatcher & { + HttpErr: (err: HttpError) => B; +}; + +type Matchers>>, B> = { + [E in T as E['status']]: E['body'] extends Either ? ($: X) => B : never; +}; + +type DefMatcher>>, B> = { + _: T['body'] extends Either ? ($: X) => B : never; +}; + +export const match = + < + T extends ApiResponse>>, + B, + M extends Partial> & DefMatcher & ErrMatcher, + >( + matchers: M, + ) => + (response: T): B => + either.isLeft(response.body) + ? matchers.DecodeErr(response.body.left) + : ((matchers[response.status as keyof typeof matchers] as ((d: unknown) => B) | undefined) ?? matchers._)( + response.body.right, + ); + +type TEMatchers>>, B> = Matchers & + DefMatcher & + ErrsMatcher; + +export const matchT = + >>, M extends TEMatchers>(matchers: M) => + (te: TaskEither) => + pipe(te, taskEither.match(matchers.HttpErr, match(matchers))) as Task ? B : never>; " `; @@ -2779,24 +2823,6 @@ export class TypesService { " `; -exports[`v3 should generate: test/generated/v3/core/HttpError.ts 1`] = ` -"/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export class HttpError extends Error { - cause: unknown; - - constructor(originalError: unknown) { - super(\`\${originalError}\`); - - this.cause = originalError; - this.name = 'HttpError'; - } -} -" -`; - exports[`v3 should generate: test/generated/v3/core/ApiRequestOptions.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ @@ -2853,6 +2879,24 @@ export type ApiResult = { " `; +exports[`v3 should generate: test/generated/v3/core/HttpError.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class HttpError extends Error { + cause: unknown; + + constructor(originalError: unknown) { + super(\`\${originalError}\`); + + this.cause = originalError; + this.name = 'HttpError'; + } +} +" +`; + exports[`v3 should generate: test/generated/v3/core/OpenAPI.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ @@ -2903,6 +2947,10 @@ import type { ApiResponse } from './ApiResponse'; import type { OpenAPIConfig } from './OpenAPI'; import { right, left } from 'fp-ts/lib/Either'; import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import { pipe } from 'fp-ts/lib/function'; export const isDefined = (value: T | null | undefined): value is Exclude => { return value !== undefined && value !== null; @@ -3204,6 +3252,46 @@ export const request = >>(config: Ope } }; }; + +type ErrMatcher = { + DecodeErr: (err: D.DecoderError) => B; +}; + +type ErrsMatcher = ErrMatcher & { + HttpErr: (err: HttpError) => B; +}; + +type Matchers>>, B> = { + [E in T as E['status']]: E['body'] extends Either ? ($: X) => B : never; +}; + +type DefMatcher>>, B> = { + _: T['body'] extends Either ? ($: X) => B : never; +}; + +export const match = + < + T extends ApiResponse>>, + B, + M extends Partial> & DefMatcher & ErrMatcher, + >( + matchers: M, + ) => + (response: T): B => + either.isLeft(response.body) + ? matchers.DecodeErr(response.body.left) + : ((matchers[response.status as keyof typeof matchers] as ((d: unknown) => B) | undefined) ?? matchers._)( + response.body.right, + ); + +type TEMatchers>>, B> = Matchers & + DefMatcher & + ErrsMatcher; + +export const matchT = + >>, M extends TEMatchers>(matchers: M) => + (te: TaskEither) => + pipe(te, taskEither.match(matchers.HttpErr, match(matchers))) as Task ? B : never>; " `; From bd505bf3af1a0f6d213f8e1ed4dfd93975649eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Wed, 15 Nov 2023 20:58:49 +0000 Subject: [PATCH 34/48] =?UTF-8?q?=E2=9C=A8=20better=20export?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 2 +- src/templates/index.hbs | 2 ++ test/__snapshots__/index.spec.ts.snap | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f2bd91f78..b1f7b5f22 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.28.4", + "version": "0.28.5", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/index.hbs b/src/templates/index.hbs index 50c5db343..6cc7dcf76 100644 --- a/src/templates/index.hbs +++ b/src/templates/index.hbs @@ -5,6 +5,8 @@ export { {{{clientName}}} } from './{{{clientName}}}'; {{/if}} {{#if @root.exportCore}} +import { match, matchT } from './core/request'; +export const response = { match, matchT }; export { HttpError } from './core/HttpError'; {{#if @root.exportClient}} export { BaseHttpRequest } from './core/BaseHttpRequest'; diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index 82d56167c..e09066345 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -477,6 +477,8 @@ exports[`v2 should generate: test/generated/v2/index.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import { match, matchT } from './core/request'; +export const response = { match, matchT }; export { HttpError } from './core/HttpError'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; @@ -3300,6 +3302,8 @@ exports[`v3 should generate: test/generated/v3/index.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import { match, matchT } from './core/request'; +export const response = { match, matchT }; export { HttpError } from './core/HttpError'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; From 4627c0d7ac2d6402f71ff5844ac1e3f03ffebeda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Thu, 16 Nov 2023 23:36:02 +0000 Subject: [PATCH 35/48] =?UTF-8?q?=E2=9C=A8=20server=20side=20events?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- docs/axios-support.md | 6 +- package.json | 2 +- samples/spec/v3.json | 11 +- src/templates/core/fetch/getResponseBody.hbs | 5 + src/templates/core/fetch/sendRequest.hbs | 2 +- src/templates/core/node/getResponseBody.hbs | 5 + src/templates/core/request.hbs | 40 -- src/templates/core/response.hbs | 50 ++ src/templates/core/sse.hbs | 305 ++++++++ src/templates/core/xhr/getResponseBody.hbs | 5 + src/templates/exportService.hbs | 1 + src/templates/index.hbs | 5 +- src/templates/partials/typeArray.hbs | 10 + src/utils/registerHandlebarTemplates.ts | 6 + src/utils/writeClient.spec.ts | 2 + src/utils/writeClientClass.spec.ts | 2 + src/utils/writeClientCore.spec.ts | 4 + src/utils/writeClientCore.ts | 2 + src/utils/writeClientIndex.spec.ts | 2 + src/utils/writeClientModels.spec.ts | 2 + src/utils/writeClientSchemas.spec.ts | 2 + src/utils/writeClientServices.spec.ts | 2 + test/__snapshots__/index.spec.ts.snap | 715 ++++++++++++++++++- 23 files changed, 1124 insertions(+), 62 deletions(-) create mode 100644 src/templates/core/response.hbs create mode 100644 src/templates/core/sse.hbs diff --git a/docs/axios-support.md b/docs/axios-support.md index 2fe7e09a2..b775f2ac7 100644 --- a/docs/axios-support.md +++ b/docs/axios-support.md @@ -6,8 +6,8 @@ If you want to generate the Axios based client then you can specify `--client ax `openapi --input ./spec.json --output ./generated --client axios` -The only downside is that this client needs some additional dependencies to work (due to the missing FormData -classes in Node.js). +The only downsides are that this client needs some additional dependencies to work (due to the missing FormData +classes in Node.js) and it does not supports server side events. ``` npm install axios --save-dev @@ -71,4 +71,4 @@ import { GeneratedClient } from './generated/client'; const client = new GeneratedClient({ BASE: 'http://localhost:8123' }, AxiosHttpRequestWithRetry) -``` \ No newline at end of file +``` diff --git a/package.json b/package.json index b1f7b5f22..47aa332e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.28.5", + "version": "0.29.0", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/samples/spec/v3.json b/samples/spec/v3.json index de11b3bce..d41b20a3c 100644 --- a/samples/spec/v3.json +++ b/samples/spec/v3.json @@ -181,17 +181,10 @@ "200": { "description": "successful operation", "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { + "text/event-stream": { "schema": { "type": "array", + "format": "event-stream", "items": { "$ref": "#/components/schemas/Pet" } diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 556324656..40d6b825f 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -4,7 +4,12 @@ export const getResponseBody = async (response: Response): Promise => { const contentType = response.headers.get('Content-Type'); if (contentType) { const jsonTypes = ['application/json', 'application/problem+json'] + const eventStreamTypes = ['text/event-stream']; const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + const isEventStream = eventStreamTypes.some((type) => contentType.toLowerCase().startsWith(type)); + if (isEventStream) { + return response.body ?? undefined; + } if (isJSON) { return await response.json(); } else { diff --git a/src/templates/core/fetch/sendRequest.hbs b/src/templates/core/fetch/sendRequest.hbs index 8df445437..68fd4473a 100644 --- a/src/templates/core/fetch/sendRequest.hbs +++ b/src/templates/core/fetch/sendRequest.hbs @@ -8,7 +8,7 @@ export const sendRequest = async >>( ): Promise => { const request: RequestInit = { headers, - body: body ?? formData, + body: body ?? formData ?? null, method: options.method, }; diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index 556324656..40d6b825f 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -4,7 +4,12 @@ export const getResponseBody = async (response: Response): Promise => { const contentType = response.headers.get('Content-Type'); if (contentType) { const jsonTypes = ['application/json', 'application/problem+json'] + const eventStreamTypes = ['text/event-stream']; const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + const isEventStream = eventStreamTypes.some((type) => contentType.toLowerCase().startsWith(type)); + if (isEventStream) { + return response.body ?? undefined; + } if (isJSON) { return await response.json(); } else { diff --git a/src/templates/core/request.hbs b/src/templates/core/request.hbs index 05c77355d..5775235bb 100644 --- a/src/templates/core/request.hbs +++ b/src/templates/core/request.hbs @@ -2,43 +2,3 @@ {{~#equals @root.httpClient 'axios'}}{{>axios/request}}{{/equals}} {{~#equals @root.httpClient 'fetch'}}{{>fetch/request}}{{/equals}} {{~#equals @root.httpClient 'node'}}{{>node/request}}{{/equals}} - -type ErrMatcher = { - DecodeErr: (err: D.DecoderError) => B; -}; - -type ErrsMatcher = ErrMatcher & { - HttpErr: (err: HttpError) => B; -}; - -type Matchers>>, B> = { - [E in T as E['status']]: E['body'] extends Either ? ($: X) => B : never; -}; - -type DefMatcher>>, B> = { - _: T['body'] extends Either ? ($: X) => B : never; -}; - -export const match = - < - T extends ApiResponse>>, - B, - M extends Partial> & DefMatcher & ErrMatcher, - >( - matchers: M, - ) => - (response: T): B => - either.isLeft(response.body) - ? matchers.DecodeErr(response.body.left) - : ((matchers[response.status as keyof typeof matchers] as ((d: unknown) => B) | undefined) ?? matchers._)( - response.body.right, - ); - -type TEMatchers>>, B> = Matchers & - DefMatcher & - ErrsMatcher; - -export const matchT = - >>, M extends TEMatchers>(matchers: M) => - (te: TaskEither) => - pipe(te, taskEither.match(matchers.HttpErr, match(matchers))) as Task ? B : never>; diff --git a/src/templates/core/response.hbs b/src/templates/core/response.hbs new file mode 100644 index 000000000..084788d1f --- /dev/null +++ b/src/templates/core/response.hbs @@ -0,0 +1,50 @@ +{{>header}} + +import * as D from '@majkit/fp-ts-schema'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { pipe } from 'fp-ts/lib/function'; +import type { ApiResponse } from './ApiResponse'; +import type { HttpError } from './HttpError'; + +type ErrMatcher = { + DecodeErr: (err: D.DecoderError) => B; +}; + +type ErrsMatcher = ErrMatcher & { + HttpErr: (err: HttpError) => B; +}; + +type Matchers>>, B> = { + [E in T as E['status']]: E['body'] extends Either ? ($: X) => B : never; +}; + +type DefMatcher>>, B> = { + _: T['body'] extends Either ? ($: X) => B : never; +}; + +export const match = + < + T extends ApiResponse>>, + B, + M extends Partial> & DefMatcher & ErrMatcher, + >( + matchers: M, + ) => + (response: T): B => + either.isLeft(response.body) + ? matchers.DecodeErr(response.body.left) + : ((matchers[response.status as keyof typeof matchers] as ((d: unknown) => B) | undefined) ?? matchers._)( + response.body.right, + ); + +type TEMatchers>>, B> = Matchers & + DefMatcher & + ErrsMatcher; + +export const matchT = + >>, M extends TEMatchers>(matchers: M) => + (te: TaskEither) => + pipe(te, taskEither.match(matchers.HttpErr, match(matchers))) as Task ? B : never>; diff --git a/src/templates/core/sse.hbs b/src/templates/core/sse.hbs new file mode 100644 index 000000000..4c45c1f50 --- /dev/null +++ b/src/templates/core/sse.hbs @@ -0,0 +1,305 @@ +{{>header}} + +import * as D from '@majkit/fp-ts-schema'; +import type { Decoder, DecoderError } from '@majkit/fp-ts-schema'; +import { json } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; + +/** + * Represents a message sent in an event stream + * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format + */ +type EventSourceMessage = { + /** The event ID to set the EventSource object's last event ID value. */ + id: string; + /** A string identifying the type of event described. */ + event: string; + /** The event data */ + data: string; + /** The reconnection interval (in milliseconds) to wait before retrying the connection */ + retry?: number | undefined; +}; + +/** + * Converts a ReadableStream into a callback pattern. + * @param stream The input ReadableStream. + * @param onChunk A function that will be called on each new byte chunk in the stream. + * @returns A promise that will be resolved when the stream closes. + */ +const getBytes = async (stream: ReadableStream, onChunk: (arr: Uint8Array) => void): Promise => { + const reader = stream.getReader(); + let result = await reader.read(); + while (!result.done) { + onChunk(result.value); + result = await reader.read(); + } +}; + +enum ControlChars { + NewLine = 10, + CarriageReturn = 13, + Space = 32, + Colon = 58, +} + +const concat = (a: Uint8Array, b: Uint8Array) => { + const res = new Uint8Array(a.length + b.length); + res.set(a); + res.set(b, a.length); + return res; +}; + +const newMessage = (): EventSourceMessage => ({ + data: '', + event: '', + id: '', + retry: undefined, +}); + +/** + * Parses arbitary byte chunks into EventSource line buffers. + * Each line should be of the format "field: value" and ends with \r, \n, or \r\n. + * @param onLine A function that will be called on each new EventSource line. + * @returns A function that should be called for each incoming byte chunk. + */ +const getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => { + let buffer: Uint8Array | undefined; + let position: number; // current read position + let fieldLength: number; // length of the `field` portion of the line + let discardTrailingNewline = false; + + // return a function that can process each incoming byte chunk: + return function onChunk(arr: Uint8Array) { + if (buffer === undefined) { + buffer = arr; + position = 0; + fieldLength = -1; + } else { + // we're still parsing the old line. Append the new bytes into buffer: + buffer = concat(buffer, arr); + } + + const bufLength = buffer.length; + let lineStart = 0; // index where the current line starts + while (position < bufLength) { + if (discardTrailingNewline) { + if (buffer[position] === ControlChars.NewLine) { + lineStart = ++position; // skip to next char + } + + discardTrailingNewline = false; + } + + // start looking forward till the end of line: + let lineEnd = -1; // index of the \r or \n char + for (; position < bufLength && lineEnd === -1; ++position) { + switch (buffer[position]) { + case ControlChars.Colon: + if (fieldLength === -1) { + // first colon in line + fieldLength = position - lineStart; + } + break; + // @ts-ignore:7029 \r case below should fallthrough to \n: + case ControlChars.CarriageReturn: + discardTrailingNewline = true; + case ControlChars.NewLine: + lineEnd = position; + break; + } + } + + if (lineEnd === -1) { + // We reached the end of the buffer but the line hasn't ended. + // Wait for the next arr and then continue parsing: + break; + } + + // we've reached the line end, send it out: + onLine(buffer.subarray(lineStart, lineEnd), fieldLength); + lineStart = position; // we're now on the next line + fieldLength = -1; + } + + if (lineStart === bufLength) { + buffer = undefined; // we've finished reading it + } else if (lineStart !== 0) { + // Create a new view into buffer beginning at lineStart so we don't + // need to copy over the previous lines when we get the new arr: + buffer = buffer.subarray(lineStart); + position -= lineStart; + } + }; +}; + +/** + * Parses line buffers into EventSourceMessages. + * @param onId A function that will be called on each `id` field. + * @param onRetry A function that will be called on each `retry` field. + * @param onMessage A function that will be called on each message. + * @returns A function that should be called for each incoming line buffer. + */ +export const getMessages = (onMessage?: (msg: EventSourceMessage) => void) => { + let message = newMessage(); + const decoder = new TextDecoder(); + + // return a function that can process each incoming line buffer: + return function onLine(line: Uint8Array, fieldLength: number) { + if (line.length === 0) { + // empty line denotes end of message. Trigger the callback and start a new message: + onMessage?.(message); + message = newMessage(); + } else if (fieldLength > 0) { + // exclude comments and lines with no values + // line is of format ":" or ": " + // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation + const field = decoder.decode(line.subarray(0, fieldLength)); + const valueOffset = fieldLength + (line[fieldLength + 1] === ControlChars.Space ? 2 : 1); + const value = decoder.decode(line.subarray(valueOffset)); + + switch (field) { + case 'data': + // if this message already has data, append the new value to the old. + // otherwise, just set to the new value: + message.data = message.data ? `${message.data}\n${value}` : value; // otherwise, + break; + case 'event': + message.event = value; + break; + default: + break; + } + } + }; +}; + +export type Subscriber = (value: T) => void; + +export type Unsubscriber = () => void; + +export type Invalidator = (value?: T) => void; + +type SubscribeInvalidateTuple = [Subscriber, Invalidator]; + +export type EventsPromise = { + subscribe: (run: Subscriber) => Unsubscriber; + listen: (listener: (value: S) => void) => Unsubscriber; +} & PromiseLike; + +type Queued = [SubscribeInvalidateTuple, T]; + +const writable = (initial: T) => { + const subscriber_queue: Queued[] = []; + let value = initial; + let stop: Unsubscriber | null = null; + const subscribers = new Set>(); + const set = (new_value: T): void => { + value = new_value; + if (stop) { + // store is ready + const run_queue = !subscriber_queue.length; + for (const subscriber of subscribers) { + subscriber[1](); + subscriber_queue.push([subscriber, value]); + } + if (run_queue) { + for (const sub of subscriber_queue) { + sub[0][0](sub[1]); + } + subscriber_queue.length = 0; + } + } + }; + + const subscribe = (run: Subscriber, invalidate: Invalidator = () => {}): Unsubscriber => { + const subscriber: SubscribeInvalidateTuple = [run, invalidate]; + subscribers.add(subscriber); + if (subscribers.size === 1) { + stop = () => {}; + } + run(value); + return () => { + subscribers.delete(subscriber); + if (subscribers.size === 0 && stop) { + stop(); + stop = null; + } + }; + }; + return { set, subscribe }; +}; + +export const EventsPromise = ( + initial: S, + onChange: ($: { state: S; data: Either }) => S, + source: ReadableStream, + parse: (data: string) => Either, +) => { + let currentState = initial; + const state = writable(initial); + let resolve: (value: S) => void; + const promise = new Promise((_resolve) => { + resolve = _resolve; + }); + getBytes( + source, + getLines( + getMessages(($) => { + const data = parse($.data); + currentState = onChange({ state: currentState, data }); + state.set(currentState); + }), + ), + ).then(() => resolve(currentState)); + const returned: EventsPromise = { + then: promise.then.bind(promise), + subscribe: (run) => state.subscribe(run), + listen: (listener): Unsubscriber => state.subscribe(listener), + }; + return returned; +}; + +export const listen = + (listener: (value: S) => void) => + (promise: EventsPromise) => { + promise.listen(listener); + return promise; + }; + +export type OnChange = ($: { state: S; data: Either }) => S; +export type SSEStateChange = { + onChange: OnChange; + initialState: S; +}; +export type SSEStateChangeUnion> = SSEStateChange; +export type SSEStateChangeObject> = { + [K in keyof D]: SSEStateChange; +}; +export type StateChange> = SSEStateChangeUnion | SSEStateChangeObject; + +const decode = + (decoder: Decoder) => + (source: ReadableStream) => + (onChange: ($: { state: S; data: Either }) => S) => + (initialState: S) => + EventsPromise(initialState, onChange, source, ($) => { + const rawDecode = decoder.decode($); + if (rawDecode._tag === 'Right') { + return rawDecode; + } + const jsonObj = json.parse($); + if (jsonObj._tag === 'Right') { + return decoder.decode(jsonObj.right); + } + return rawDecode; + }); + +export const decoder = (entity: Decoder) => + D.createDecoder({ + forceDecode: (input) => { + if (input instanceof ReadableStream) { + return decode(entity)(input); + } + throw new Error('Expected ReadableStream'); + }, + }); diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index 0a9c85013..6d0110ca4 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -4,7 +4,12 @@ export const getResponseBody = (xhr: XMLHttpRequest): unknown => { const contentType = xhr.getResponseHeader('Content-Type'); if (contentType) { const jsonTypes = ['application/json', 'application/problem+json'] + const eventStreamTypes = ['text/event-stream']; const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + const isEventStream = eventStreamTypes.some((type) => contentType.toLowerCase().startsWith(type)); + if (isEventStream) { + return new ReadableStream(new TextEncoder().encode(xhr.responseText)); + } if (isJSON) { return JSON.parse(xhr.responseText); } else { diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index bea7997b6..ee90519ec 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -1,5 +1,6 @@ {{>header}} +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; {{#if imports}} diff --git a/src/templates/index.hbs b/src/templates/index.hbs index 6cc7dcf76..45c0f0561 100644 --- a/src/templates/index.hbs +++ b/src/templates/index.hbs @@ -4,9 +4,10 @@ export { {{{clientName}}} } from './{{{clientName}}}'; {{/if}} +export * as response from './core/response'; +export * as sse from './core/sse'; + {{#if @root.exportCore}} -import { match, matchT } from './core/request'; -export const response = { match, matchT }; export { HttpError } from './core/HttpError'; {{#if @root.exportClient}} export { BaseHttpRequest } from './core/BaseHttpRequest'; diff --git a/src/templates/partials/typeArray.hbs b/src/templates/partials/typeArray.hbs index 8449556c4..46ac3acaa 100644 --- a/src/templates/partials/typeArray.hbs +++ b/src/templates/partials/typeArray.hbs @@ -1,4 +1,13 @@ {{#>isNullable~}} +{{~#equals format 'event-stream'~}} +SSE.decoder( + {{~#if link~}} + {{~>type link~}} + {{~else~}} + {{~>base~}} + {{~/if~}} +) +{{~else~}} D.array( {{~#if link~}} {{~>type link~}} @@ -6,4 +15,5 @@ D.array( {{~>base~}} {{~/if~}} ) +{{~/equals~}} {{~/isNullable}} diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index 307b2a516..ffb728111 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -41,6 +41,8 @@ import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs' import nodeRequest from '../templates/core/node/request.hbs'; import nodeSendRequest from '../templates/core/node/sendRequest.hbs'; import templateCoreRequest from '../templates/core/request.hbs'; +import templateCoreResponse from '../templates/core/response.hbs'; +import templateCoreSSE from '../templates/core/sse.hbs'; import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs'; import xhrGetRequestBody from '../templates/core/xhr/getRequestBody.hbs'; import xhrGetResponseBody from '../templates/core/xhr/getResponseBody.hbs'; @@ -90,6 +92,8 @@ export interface Templates { apiResponse: Handlebars.TemplateDelegate; apiResult: Handlebars.TemplateDelegate; request: Handlebars.TemplateDelegate; + response: Handlebars.TemplateDelegate; + sse: Handlebars.TemplateDelegate; baseHttpRequest: Handlebars.TemplateDelegate; httpError: Handlebars.TemplateDelegate; httpRequest: Handlebars.TemplateDelegate; @@ -121,6 +125,8 @@ export const registerHandlebarTemplates = (root: { apiResponse: Handlebars.template(templateCoreApiResponse), apiResult: Handlebars.template(templateCoreApiResult), request: Handlebars.template(templateCoreRequest), + response: Handlebars.template(templateCoreResponse), + sse: Handlebars.template(templateCoreSSE), baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest), httpError: Handlebars.template(templateCoreHttpError), httpRequest: Handlebars.template(templateCoreHttpRequest), diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 14605c0e0..e3591a51a 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -30,6 +30,8 @@ describe('writeClient', () => { apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', + response: () => 'response', + sse: () => 'sse', baseHttpRequest: () => 'baseHttpRequest', httpError: () => 'httpError', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts index 1b347dbfb..2cee3f952 100644 --- a/src/utils/writeClientClass.spec.ts +++ b/src/utils/writeClientClass.spec.ts @@ -30,6 +30,8 @@ describe('writeClientClass', () => { apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', + response: () => 'response', + sse: () => 'sse', baseHttpRequest: () => 'baseHttpRequest', httpError: () => 'httpError', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index 5d003b040..67b6d7b7a 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -33,6 +33,8 @@ describe('writeClientCore', () => { apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', + response: () => 'response', + sse: () => 'sse', baseHttpRequest: () => 'baseHttpRequest', httpError: () => 'httpError', httpRequest: () => 'httpRequest', @@ -59,6 +61,8 @@ describe('writeClientCore', () => { expect(writeFile).toBeCalledWith(resolve('/', '/ApiResponse.ts'), `apiResponse${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/ApiResult.ts'), `apiResult${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/request.ts'), `request${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/response.ts'), `response${EOL}`); + expect(writeFile).toBeCalledWith(resolve('/', '/sse.ts'), `sse${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/HttpError.ts'), `httpError${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/BaseHttpRequest.ts'), `baseHttpRequest${EOL}`); expect(writeFile).toBeCalledWith(resolve('/', '/FetchHttpRequest.ts'), `httpRequest${EOL}`); diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts index f5ccc941f..f4782848a 100644 --- a/src/utils/writeClientCore.ts +++ b/src/utils/writeClientCore.ts @@ -43,6 +43,8 @@ export const writeClientCore = async ( await writeFile(resolve(outputPath, 'ApiResponse.ts'), i(templates.core.apiResponse(context), indent)); await writeFile(resolve(outputPath, 'ApiResult.ts'), i(templates.core.apiResult(context), indent)); await writeFile(resolve(outputPath, 'request.ts'), i(templates.core.request(context), indent)); + await writeFile(resolve(outputPath, 'response.ts'), i(templates.core.response(context), indent)); + await writeFile(resolve(outputPath, 'sse.ts'), i(templates.core.sse(context), indent)); if (isDefined(clientName)) { await writeFile(resolve(outputPath, 'BaseHttpRequest.ts'), i(templates.core.baseHttpRequest(context), indent)); diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index e5190881e..a8d1b55df 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -30,6 +30,8 @@ describe('writeClientIndex', () => { apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', + response: () => 'response', + sse: () => 'sse', baseHttpRequest: () => 'baseHttpRequest', httpError: () => 'httpError', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index 144be8b13..49ac6745e 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -46,6 +46,8 @@ describe('writeClientModels', () => { apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', + response: () => 'response', + sse: () => 'sse', baseHttpRequest: () => 'baseHttpRequest', httpError: () => 'httpError', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index 664f5d8d9..9dbf09ff3 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -46,6 +46,8 @@ describe('writeClientSchemas', () => { apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', + response: () => 'response', + sse: () => 'sse', baseHttpRequest: () => 'baseHttpRequest', httpError: () => 'httpError', httpRequest: () => 'httpRequest', diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index 88443277d..4cc627e1d 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -34,6 +34,8 @@ describe('writeClientServices', () => { apiResponse: () => 'apiResponse', apiResult: () => 'apiResult', request: () => 'request', + response: () => 'response', + sse: () => 'sse', baseHttpRequest: () => 'baseHttpRequest', httpError: () => 'httpError', httpRequest: () => 'httpRequest', diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index e09066345..dbca99679 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -352,7 +352,7 @@ export const sendRequest = async >>( ): Promise => { const request: RequestInit = { headers, - body: body ?? formData, + body: body ?? formData ?? null, method: options.method, }; @@ -379,7 +379,12 @@ export const getResponseBody = async (response: Response): Promise => { const contentType = response.headers.get('Content-Type'); if (contentType) { const jsonTypes = ['application/json', 'application/problem+json'] + const eventStreamTypes = ['text/event-stream']; const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + const isEventStream = eventStreamTypes.some((type) => contentType.toLowerCase().startsWith(type)); + if (isEventStream) { + return response.body ?? undefined; + } if (isJSON) { return await response.json(); } else { @@ -429,6 +434,22 @@ export const request = >>(config: Ope } }; }; +" +`; + +exports[`v2 should generate: test/generated/v2/core/response.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import * as D from '@majkit/fp-ts-schema'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { pipe } from 'fp-ts/lib/function'; +import type { ApiResponse } from './ApiResponse'; +import type { HttpError } from './HttpError'; type ErrMatcher = { DecodeErr: (err: D.DecoderError) => B; @@ -472,13 +493,325 @@ export const matchT = " `; +exports[`v2 should generate: test/generated/v2/core/sse.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import * as D from '@majkit/fp-ts-schema'; +import type { Decoder, DecoderError } from '@majkit/fp-ts-schema'; +import { json } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; + +/** + * Represents a message sent in an event stream + * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format + */ +type EventSourceMessage = { + /** The event ID to set the EventSource object's last event ID value. */ + id: string; + /** A string identifying the type of event described. */ + event: string; + /** The event data */ + data: string; + /** The reconnection interval (in milliseconds) to wait before retrying the connection */ + retry?: number | undefined; +}; + +/** + * Converts a ReadableStream into a callback pattern. + * @param stream The input ReadableStream. + * @param onChunk A function that will be called on each new byte chunk in the stream. + * @returns A promise that will be resolved when the stream closes. + */ +const getBytes = async (stream: ReadableStream, onChunk: (arr: Uint8Array) => void): Promise => { + const reader = stream.getReader(); + let result = await reader.read(); + while (!result.done) { + onChunk(result.value); + result = await reader.read(); + } +}; + +enum ControlChars { + NewLine = 10, + CarriageReturn = 13, + Space = 32, + Colon = 58, +} + +const concat = (a: Uint8Array, b: Uint8Array) => { + const res = new Uint8Array(a.length + b.length); + res.set(a); + res.set(b, a.length); + return res; +}; + +const newMessage = (): EventSourceMessage => ({ + data: '', + event: '', + id: '', + retry: undefined, +}); + +/** + * Parses arbitary byte chunks into EventSource line buffers. + * Each line should be of the format "field: value" and ends with \\r, \\n, or \\r\\n. + * @param onLine A function that will be called on each new EventSource line. + * @returns A function that should be called for each incoming byte chunk. + */ +const getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => { + let buffer: Uint8Array | undefined; + let position: number; // current read position + let fieldLength: number; // length of the \`field\` portion of the line + let discardTrailingNewline = false; + + // return a function that can process each incoming byte chunk: + return function onChunk(arr: Uint8Array) { + if (buffer === undefined) { + buffer = arr; + position = 0; + fieldLength = -1; + } else { + // we're still parsing the old line. Append the new bytes into buffer: + buffer = concat(buffer, arr); + } + + const bufLength = buffer.length; + let lineStart = 0; // index where the current line starts + while (position < bufLength) { + if (discardTrailingNewline) { + if (buffer[position] === ControlChars.NewLine) { + lineStart = ++position; // skip to next char + } + + discardTrailingNewline = false; + } + + // start looking forward till the end of line: + let lineEnd = -1; // index of the \\r or \\n char + for (; position < bufLength && lineEnd === -1; ++position) { + switch (buffer[position]) { + case ControlChars.Colon: + if (fieldLength === -1) { + // first colon in line + fieldLength = position - lineStart; + } + break; + // @ts-ignore:7029 \\r case below should fallthrough to \\n: + case ControlChars.CarriageReturn: + discardTrailingNewline = true; + case ControlChars.NewLine: + lineEnd = position; + break; + } + } + + if (lineEnd === -1) { + // We reached the end of the buffer but the line hasn't ended. + // Wait for the next arr and then continue parsing: + break; + } + + // we've reached the line end, send it out: + onLine(buffer.subarray(lineStart, lineEnd), fieldLength); + lineStart = position; // we're now on the next line + fieldLength = -1; + } + + if (lineStart === bufLength) { + buffer = undefined; // we've finished reading it + } else if (lineStart !== 0) { + // Create a new view into buffer beginning at lineStart so we don't + // need to copy over the previous lines when we get the new arr: + buffer = buffer.subarray(lineStart); + position -= lineStart; + } + }; +}; + +/** + * Parses line buffers into EventSourceMessages. + * @param onId A function that will be called on each \`id\` field. + * @param onRetry A function that will be called on each \`retry\` field. + * @param onMessage A function that will be called on each message. + * @returns A function that should be called for each incoming line buffer. + */ +export const getMessages = (onMessage?: (msg: EventSourceMessage) => void) => { + let message = newMessage(); + const decoder = new TextDecoder(); + + // return a function that can process each incoming line buffer: + return function onLine(line: Uint8Array, fieldLength: number) { + if (line.length === 0) { + // empty line denotes end of message. Trigger the callback and start a new message: + onMessage?.(message); + message = newMessage(); + } else if (fieldLength > 0) { + // exclude comments and lines with no values + // line is of format ":" or ": " + // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation + const field = decoder.decode(line.subarray(0, fieldLength)); + const valueOffset = fieldLength + (line[fieldLength + 1] === ControlChars.Space ? 2 : 1); + const value = decoder.decode(line.subarray(valueOffset)); + + switch (field) { + case 'data': + // if this message already has data, append the new value to the old. + // otherwise, just set to the new value: + message.data = message.data ? \`\${message.data}\\n\${value}\` : value; // otherwise, + break; + case 'event': + message.event = value; + break; + default: + break; + } + } + }; +}; + +export type Subscriber = (value: T) => void; + +export type Unsubscriber = () => void; + +export type Invalidator = (value?: T) => void; + +type SubscribeInvalidateTuple = [Subscriber, Invalidator]; + +export type EventsPromise = { + subscribe: (run: Subscriber) => Unsubscriber; + listen: (listener: (value: S) => void) => Unsubscriber; +} & PromiseLike; + +type Queued = [SubscribeInvalidateTuple, T]; + +const writable = (initial: T) => { + const subscriber_queue: Queued[] = []; + let value = initial; + let stop: Unsubscriber | null = null; + const subscribers = new Set>(); + const set = (new_value: T): void => { + value = new_value; + if (stop) { + // store is ready + const run_queue = !subscriber_queue.length; + for (const subscriber of subscribers) { + subscriber[1](); + subscriber_queue.push([subscriber, value]); + } + if (run_queue) { + for (const sub of subscriber_queue) { + sub[0][0](sub[1]); + } + subscriber_queue.length = 0; + } + } + }; + + const subscribe = (run: Subscriber, invalidate: Invalidator = () => {}): Unsubscriber => { + const subscriber: SubscribeInvalidateTuple = [run, invalidate]; + subscribers.add(subscriber); + if (subscribers.size === 1) { + stop = () => {}; + } + run(value); + return () => { + subscribers.delete(subscriber); + if (subscribers.size === 0 && stop) { + stop(); + stop = null; + } + }; + }; + return { set, subscribe }; +}; + +export const EventsPromise = ( + initial: S, + onChange: ($: { state: S; data: Either }) => S, + source: ReadableStream, + parse: (data: string) => Either, +) => { + let currentState = initial; + const state = writable(initial); + let resolve: (value: S) => void; + const promise = new Promise((_resolve) => { + resolve = _resolve; + }); + getBytes( + source, + getLines( + getMessages(($) => { + const data = parse($.data); + currentState = onChange({ state: currentState, data }); + state.set(currentState); + }), + ), + ).then(() => resolve(currentState)); + const returned: EventsPromise = { + then: promise.then.bind(promise), + subscribe: (run) => state.subscribe(run), + listen: (listener): Unsubscriber => state.subscribe(listener), + }; + return returned; +}; + +export const listen = + (listener: (value: S) => void) => + (promise: EventsPromise) => { + promise.listen(listener); + return promise; + }; + +export type OnChange = ($: { state: S; data: Either }) => S; +export type SSEStateChange = { + onChange: OnChange; + initialState: S; +}; +export type SSEStateChangeUnion> = SSEStateChange; +export type SSEStateChangeObject> = { + [K in keyof D]: SSEStateChange; +}; +export type StateChange> = SSEStateChangeUnion | SSEStateChangeObject; + +const decode = + (decoder: Decoder) => + (source: ReadableStream) => + (onChange: ($: { state: S; data: Either }) => S) => + (initialState: S) => + EventsPromise(initialState, onChange, source, ($) => { + const rawDecode = decoder.decode($); + if (rawDecode._tag === 'Right') { + return rawDecode; + } + const jsonObj = json.parse($); + if (jsonObj._tag === 'Right') { + return decoder.decode(jsonObj.right); + } + return rawDecode; + }); + +export const decoder = (entity: Decoder) => + D.createDecoder({ + forceDecode: (input) => { + if (input instanceof ReadableStream) { + return decode(entity)(input); + } + throw new Error('Expected ReadableStream'); + }, + }); +" +`; + exports[`v2 should generate: test/generated/v2/index.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import { match, matchT } from './core/request'; -export const response = { match, matchT }; +export * as response from './core/response'; +export * as sse from './core/sse'; + export { HttpError } from './core/HttpError'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; @@ -2110,6 +2443,7 @@ exports[`v2 should generate: test/generated/v2/services/CollectionFormatService. /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2150,6 +2484,7 @@ exports[`v2 should generate: test/generated/v2/services/ComplexService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelWithString } from '../models/ModelWithString'; @@ -2193,6 +2528,7 @@ exports[`v2 should generate: test/generated/v2/services/DefaultService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2213,6 +2549,7 @@ exports[`v2 should generate: test/generated/v2/services/DefaultsService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelWithString } from '../models/ModelWithString'; @@ -2319,6 +2656,7 @@ exports[`v2 should generate: test/generated/v2/services/DescriptionsService.ts 1 /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2362,6 +2700,7 @@ exports[`v2 should generate: test/generated/v2/services/DuplicateService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2400,6 +2739,7 @@ exports[`v2 should generate: test/generated/v2/services/ErrorService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2435,6 +2775,7 @@ exports[`v2 should generate: test/generated/v2/services/HeaderService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2461,6 +2802,7 @@ exports[`v2 should generate: test/generated/v2/services/MultipleTags1Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2493,6 +2835,7 @@ exports[`v2 should generate: test/generated/v2/services/MultipleTags2Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2525,6 +2868,7 @@ exports[`v2 should generate: test/generated/v2/services/MultipleTags3Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2548,6 +2892,7 @@ exports[`v2 should generate: test/generated/v2/services/NoContentService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2571,6 +2916,7 @@ exports[`v2 should generate: test/generated/v2/services/ParametersService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2658,6 +3004,7 @@ exports[`v2 should generate: test/generated/v2/services/ResponseService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelThatExtends } from '../models/ModelThatExtends'; @@ -2717,6 +3064,7 @@ exports[`v2 should generate: test/generated/v2/services/SimpleService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -2773,6 +3121,7 @@ exports[`v2 should generate: test/generated/v2/services/TypesService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -3177,7 +3526,7 @@ export const sendRequest = async >>( ): Promise => { const request: RequestInit = { headers, - body: body ?? formData, + body: body ?? formData ?? null, method: options.method, }; @@ -3204,7 +3553,12 @@ export const getResponseBody = async (response: Response): Promise => { const contentType = response.headers.get('Content-Type'); if (contentType) { const jsonTypes = ['application/json', 'application/problem+json'] + const eventStreamTypes = ['text/event-stream']; const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + const isEventStream = eventStreamTypes.some((type) => contentType.toLowerCase().startsWith(type)); + if (isEventStream) { + return response.body ?? undefined; + } if (isJSON) { return await response.json(); } else { @@ -3254,6 +3608,22 @@ export const request = >>(config: Ope } }; }; +" +`; + +exports[`v3 should generate: test/generated/v3/core/response.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import * as D from '@majkit/fp-ts-schema'; +import { either, taskEither } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; +import type { Task } from 'fp-ts/lib/Task'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import { pipe } from 'fp-ts/lib/function'; +import type { ApiResponse } from './ApiResponse'; +import type { HttpError } from './HttpError'; type ErrMatcher = { DecodeErr: (err: D.DecoderError) => B; @@ -3297,13 +3667,325 @@ export const matchT = " `; +exports[`v3 should generate: test/generated/v3/core/sse.ts 1`] = ` +"/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import * as D from '@majkit/fp-ts-schema'; +import type { Decoder, DecoderError } from '@majkit/fp-ts-schema'; +import { json } from 'fp-ts'; +import type { Either } from 'fp-ts/lib/Either'; + +/** + * Represents a message sent in an event stream + * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format + */ +type EventSourceMessage = { + /** The event ID to set the EventSource object's last event ID value. */ + id: string; + /** A string identifying the type of event described. */ + event: string; + /** The event data */ + data: string; + /** The reconnection interval (in milliseconds) to wait before retrying the connection */ + retry?: number | undefined; +}; + +/** + * Converts a ReadableStream into a callback pattern. + * @param stream The input ReadableStream. + * @param onChunk A function that will be called on each new byte chunk in the stream. + * @returns A promise that will be resolved when the stream closes. + */ +const getBytes = async (stream: ReadableStream, onChunk: (arr: Uint8Array) => void): Promise => { + const reader = stream.getReader(); + let result = await reader.read(); + while (!result.done) { + onChunk(result.value); + result = await reader.read(); + } +}; + +enum ControlChars { + NewLine = 10, + CarriageReturn = 13, + Space = 32, + Colon = 58, +} + +const concat = (a: Uint8Array, b: Uint8Array) => { + const res = new Uint8Array(a.length + b.length); + res.set(a); + res.set(b, a.length); + return res; +}; + +const newMessage = (): EventSourceMessage => ({ + data: '', + event: '', + id: '', + retry: undefined, +}); + +/** + * Parses arbitary byte chunks into EventSource line buffers. + * Each line should be of the format "field: value" and ends with \\r, \\n, or \\r\\n. + * @param onLine A function that will be called on each new EventSource line. + * @returns A function that should be called for each incoming byte chunk. + */ +const getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => { + let buffer: Uint8Array | undefined; + let position: number; // current read position + let fieldLength: number; // length of the \`field\` portion of the line + let discardTrailingNewline = false; + + // return a function that can process each incoming byte chunk: + return function onChunk(arr: Uint8Array) { + if (buffer === undefined) { + buffer = arr; + position = 0; + fieldLength = -1; + } else { + // we're still parsing the old line. Append the new bytes into buffer: + buffer = concat(buffer, arr); + } + + const bufLength = buffer.length; + let lineStart = 0; // index where the current line starts + while (position < bufLength) { + if (discardTrailingNewline) { + if (buffer[position] === ControlChars.NewLine) { + lineStart = ++position; // skip to next char + } + + discardTrailingNewline = false; + } + + // start looking forward till the end of line: + let lineEnd = -1; // index of the \\r or \\n char + for (; position < bufLength && lineEnd === -1; ++position) { + switch (buffer[position]) { + case ControlChars.Colon: + if (fieldLength === -1) { + // first colon in line + fieldLength = position - lineStart; + } + break; + // @ts-ignore:7029 \\r case below should fallthrough to \\n: + case ControlChars.CarriageReturn: + discardTrailingNewline = true; + case ControlChars.NewLine: + lineEnd = position; + break; + } + } + + if (lineEnd === -1) { + // We reached the end of the buffer but the line hasn't ended. + // Wait for the next arr and then continue parsing: + break; + } + + // we've reached the line end, send it out: + onLine(buffer.subarray(lineStart, lineEnd), fieldLength); + lineStart = position; // we're now on the next line + fieldLength = -1; + } + + if (lineStart === bufLength) { + buffer = undefined; // we've finished reading it + } else if (lineStart !== 0) { + // Create a new view into buffer beginning at lineStart so we don't + // need to copy over the previous lines when we get the new arr: + buffer = buffer.subarray(lineStart); + position -= lineStart; + } + }; +}; + +/** + * Parses line buffers into EventSourceMessages. + * @param onId A function that will be called on each \`id\` field. + * @param onRetry A function that will be called on each \`retry\` field. + * @param onMessage A function that will be called on each message. + * @returns A function that should be called for each incoming line buffer. + */ +export const getMessages = (onMessage?: (msg: EventSourceMessage) => void) => { + let message = newMessage(); + const decoder = new TextDecoder(); + + // return a function that can process each incoming line buffer: + return function onLine(line: Uint8Array, fieldLength: number) { + if (line.length === 0) { + // empty line denotes end of message. Trigger the callback and start a new message: + onMessage?.(message); + message = newMessage(); + } else if (fieldLength > 0) { + // exclude comments and lines with no values + // line is of format ":" or ": " + // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation + const field = decoder.decode(line.subarray(0, fieldLength)); + const valueOffset = fieldLength + (line[fieldLength + 1] === ControlChars.Space ? 2 : 1); + const value = decoder.decode(line.subarray(valueOffset)); + + switch (field) { + case 'data': + // if this message already has data, append the new value to the old. + // otherwise, just set to the new value: + message.data = message.data ? \`\${message.data}\\n\${value}\` : value; // otherwise, + break; + case 'event': + message.event = value; + break; + default: + break; + } + } + }; +}; + +export type Subscriber = (value: T) => void; + +export type Unsubscriber = () => void; + +export type Invalidator = (value?: T) => void; + +type SubscribeInvalidateTuple = [Subscriber, Invalidator]; + +export type EventsPromise = { + subscribe: (run: Subscriber) => Unsubscriber; + listen: (listener: (value: S) => void) => Unsubscriber; +} & PromiseLike; + +type Queued = [SubscribeInvalidateTuple, T]; + +const writable = (initial: T) => { + const subscriber_queue: Queued[] = []; + let value = initial; + let stop: Unsubscriber | null = null; + const subscribers = new Set>(); + const set = (new_value: T): void => { + value = new_value; + if (stop) { + // store is ready + const run_queue = !subscriber_queue.length; + for (const subscriber of subscribers) { + subscriber[1](); + subscriber_queue.push([subscriber, value]); + } + if (run_queue) { + for (const sub of subscriber_queue) { + sub[0][0](sub[1]); + } + subscriber_queue.length = 0; + } + } + }; + + const subscribe = (run: Subscriber, invalidate: Invalidator = () => {}): Unsubscriber => { + const subscriber: SubscribeInvalidateTuple = [run, invalidate]; + subscribers.add(subscriber); + if (subscribers.size === 1) { + stop = () => {}; + } + run(value); + return () => { + subscribers.delete(subscriber); + if (subscribers.size === 0 && stop) { + stop(); + stop = null; + } + }; + }; + return { set, subscribe }; +}; + +export const EventsPromise = ( + initial: S, + onChange: ($: { state: S; data: Either }) => S, + source: ReadableStream, + parse: (data: string) => Either, +) => { + let currentState = initial; + const state = writable(initial); + let resolve: (value: S) => void; + const promise = new Promise((_resolve) => { + resolve = _resolve; + }); + getBytes( + source, + getLines( + getMessages(($) => { + const data = parse($.data); + currentState = onChange({ state: currentState, data }); + state.set(currentState); + }), + ), + ).then(() => resolve(currentState)); + const returned: EventsPromise = { + then: promise.then.bind(promise), + subscribe: (run) => state.subscribe(run), + listen: (listener): Unsubscriber => state.subscribe(listener), + }; + return returned; +}; + +export const listen = + (listener: (value: S) => void) => + (promise: EventsPromise) => { + promise.listen(listener); + return promise; + }; + +export type OnChange = ($: { state: S; data: Either }) => S; +export type SSEStateChange = { + onChange: OnChange; + initialState: S; +}; +export type SSEStateChangeUnion> = SSEStateChange; +export type SSEStateChangeObject> = { + [K in keyof D]: SSEStateChange; +}; +export type StateChange> = SSEStateChangeUnion | SSEStateChangeObject; + +const decode = + (decoder: Decoder) => + (source: ReadableStream) => + (onChange: ($: { state: S; data: Either }) => S) => + (initialState: S) => + EventsPromise(initialState, onChange, source, ($) => { + const rawDecode = decoder.decode($); + if (rawDecode._tag === 'Right') { + return rawDecode; + } + const jsonObj = json.parse($); + if (jsonObj._tag === 'Right') { + return decoder.decode(jsonObj.right); + } + return rawDecode; + }); + +export const decoder = (entity: Decoder) => + D.createDecoder({ + forceDecode: (input) => { + if (input instanceof ReadableStream) { + return decode(entity)(input); + } + throw new Error('Expected ReadableStream'); + }, + }); +" +`; + exports[`v3 should generate: test/generated/v3/index.ts 1`] = ` "/* generated using openapi-typescript-codegen -- do no edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import { match, matchT } from './core/request'; -export const response = { match, matchT }; +export * as response from './core/response'; +export * as sse from './core/sse'; + export { HttpError } from './core/HttpError'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; @@ -5826,6 +6508,7 @@ exports[`v3 should generate: test/generated/v3/services/CollectionFormatService. /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -5866,6 +6549,7 @@ exports[`v3 should generate: test/generated/v3/services/ComplexService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelWithArray } from '../models/ModelWithArray'; @@ -5945,6 +6629,7 @@ exports[`v3 should generate: test/generated/v3/services/DefaultService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -5965,6 +6650,7 @@ exports[`v3 should generate: test/generated/v3/services/DefaultsService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelWithString } from '../models/ModelWithString'; @@ -6071,6 +6757,7 @@ exports[`v3 should generate: test/generated/v3/services/DeprecatedService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { DeprecatedModel } from '../models/DeprecatedModel'; @@ -6100,6 +6787,7 @@ exports[`v3 should generate: test/generated/v3/services/DescriptionsService.ts 1 /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6143,6 +6831,7 @@ exports[`v3 should generate: test/generated/v3/services/DuplicateService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6181,6 +6870,7 @@ exports[`v3 should generate: test/generated/v3/services/ErrorService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6216,6 +6906,7 @@ exports[`v3 should generate: test/generated/v3/services/FormDataService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelWithString } from '../models/ModelWithString'; @@ -6249,6 +6940,7 @@ exports[`v3 should generate: test/generated/v3/services/HeaderService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6275,6 +6967,7 @@ exports[`v3 should generate: test/generated/v3/services/MultipartService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelWithString } from '../models/ModelWithString'; @@ -6335,6 +7028,7 @@ exports[`v3 should generate: test/generated/v3/services/MultipleTags1Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6367,6 +7061,7 @@ exports[`v3 should generate: test/generated/v3/services/MultipleTags2Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6399,6 +7094,7 @@ exports[`v3 should generate: test/generated/v3/services/MultipleTags3Service.ts /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6422,6 +7118,7 @@ exports[`v3 should generate: test/generated/v3/services/NoContentService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6445,6 +7142,7 @@ exports[`v3 should generate: test/generated/v3/services/ParametersService.ts 1`] /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelWithString } from '../models/ModelWithString'; @@ -6582,6 +7280,7 @@ exports[`v3 should generate: test/generated/v3/services/RequestBodyService.ts 1` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelWithString } from '../models/ModelWithString'; @@ -6615,6 +7314,7 @@ exports[`v3 should generate: test/generated/v3/services/ResponseService.ts 1`] = /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { ModelThatExtends } from '../models/ModelThatExtends'; @@ -6674,6 +7374,7 @@ exports[`v3 should generate: test/generated/v3/services/SimpleService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6730,6 +7431,7 @@ exports[`v3 should generate: test/generated/v3/services/TypesService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; @@ -6787,6 +7489,7 @@ exports[`v3 should generate: test/generated/v3/services/UploadService.ts 1`] = ` /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; import { option } from 'fp-ts'; import { OpenAPI } from '../core/OpenAPI'; From c9d37c3d57e2dc5fcfa24aab43962a56c4bb2fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Sat, 25 Nov 2023 21:31:56 +0000 Subject: [PATCH 36/48] =?UTF-8?q?=E2=9C=A8=20organize=20dependencies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ondřej Maxa --- package.json | 8 +++----- pnpm-lock.yaml | 14 +++----------- rollup.config.mjs | 13 ++++++++++--- src/utils/getOpenApiSpec.ts | 2 +- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 47aa332e3..34ec8e44f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.29.0", + "version": "0.29.1", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", @@ -42,15 +42,13 @@ "prepare": "npm run clean && npm run prepublish", "docker": "docker build -t @majkit/openapi ." }, - "peerDependencies": { - "@majkit/fp-ts-schema": "^1.1.5" - }, "dependencies": { "camelcase": "^6.3.0", "commander": "^11.0.0", "fs-extra": "^11.1.1", "handlebars": "^4.7.7", - "json-schema-ref-parser": "^9.0.9" + "@apidevtools/json-schema-ref-parser": "^9.0.9", + "@majkit/fp-ts-schema": "^1.1.5" }, "devDependencies": { "@angular-devkit/build-angular": "^16.2.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 435be82ff..0e9ffbc59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@apidevtools/json-schema-ref-parser': + specifier: ^9.0.9 + version: 9.0.9 '@majkit/fp-ts-schema': specifier: ^1.1.5 version: 1.1.5(fp-ts@2.16.1) @@ -20,9 +23,6 @@ dependencies: handlebars: specifier: ^4.7.7 version: 4.7.8 - json-schema-ref-parser: - specifier: ^9.0.9 - version: 9.0.9 devDependencies: '@angular-devkit/build-angular': @@ -7802,14 +7802,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /json-schema-ref-parser@9.0.9: - resolution: {integrity: sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==} - engines: {node: '>=10'} - deprecated: Please switch to @apidevtools/json-schema-ref-parser - dependencies: - '@apidevtools/json-schema-ref-parser': 9.0.9 - dev: false - /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true diff --git a/rollup.config.mjs b/rollup.config.mjs index a21925ba8..c87344d8e 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -1,9 +1,9 @@ +import { readFileSync } from 'fs'; +import { dirname, extname, resolve } from 'path'; import commonjs from '@rollup/plugin-commonjs'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import typescript from '@rollup/plugin-typescript'; -import { readFileSync } from 'fs'; import handlebars from 'handlebars'; -import { dirname, extname, resolve } from 'path'; import { terser } from 'rollup-plugin-terser'; const { precompile } = handlebars; @@ -71,6 +71,13 @@ export default { file: './dist/index.js', format: 'cjs', }, - external: ['camelcase', 'commander', 'fs-extra', 'handlebars', 'json-schema-ref-parser'], + external: [ + 'camelcase', + 'commander', + 'fs-extra', + 'handlebars', + '@apidevtools/json-schema-ref-parser', + '@majkit/fp-ts-schema', + ], plugins: getPlugins(), }; diff --git a/src/utils/getOpenApiSpec.ts b/src/utils/getOpenApiSpec.ts index 6ca35e313..ce73d6265 100644 --- a/src/utils/getOpenApiSpec.ts +++ b/src/utils/getOpenApiSpec.ts @@ -1,4 +1,4 @@ -import RefParser from 'json-schema-ref-parser'; +import RefParser from '@apidevtools/json-schema-ref-parser'; /** * Load and parse te open api spec. If the file extension is ".yml" or ".yaml" From 8534fcfb42006e83f7bbdcb871dd5ef69026e8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 11 Mar 2024 15:12:25 +0100 Subject: [PATCH 37/48] feat: fix parameter types --- .eslintrc.json | 45 ++++++------- .prettierrc.json | 8 --- jest.config.ts | 4 +- package.json | 11 +-- pnpm-lock.yaml | 97 ++++++++++++++------------- src/templates/exportService.hbs | 26 +++---- src/templates/partials/parameters.hbs | 16 ++++- test/__snapshots__/index.spec.ts.snap | 29 ++++---- 8 files changed, 123 insertions(+), 113 deletions(-) delete mode 100644 .prettierrc.json diff --git a/.eslintrc.json b/.eslintrc.json index dccdbd128..22e5f3fe1 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,25 +1,24 @@ { - "parser": "@typescript-eslint/parser", - "extends": ["plugin:@typescript-eslint/recommended", "plugin:prettier/recommended", "prettier"], - "env": { - "es6": true, - "node": true, - "jest": true - }, - "plugins": ["simple-import-sort"], - "rules": { - "@typescript-eslint/no-explicit-any": 0, - "@typescript-eslint/no-inferrable-types": 0, - "@typescript-eslint/no-non-null-assertion": 0, - "@typescript-eslint/no-var-requires": 0, - "@typescript-eslint/ban-ts-ignore": 0, - "@typescript-eslint/ban-ts-comment": 0, - "@typescript-eslint/explicit-function-return-type": 0, - "@typescript-eslint/explicit-module-boundary-types": 0, - "sort-imports": "off", - "import/order": "off", - "simple-import-sort/imports": "error", - "simple-import-sort/exports": "error", - "prettier/prettier": ["error"] - } + "parser": "@typescript-eslint/parser", + "extends": ["plugin:@typescript-eslint/recommended"], + "env": { + "es6": true, + "node": true, + "jest": true + }, + "plugins": ["simple-import-sort"], + "rules": { + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-inferrable-types": 0, + "@typescript-eslint/no-non-null-assertion": 0, + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/ban-ts-ignore": 0, + "@typescript-eslint/ban-ts-comment": 0, + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/explicit-module-boundary-types": 0, + "sort-imports": "off", + "import/order": "off", + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error" + } } diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 197f347ac..000000000 --- a/.prettierrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "trailingComma": "es5", - "arrowParens": "avoid", - "printWidth": 120, - "tabWidth": 4 -} diff --git a/jest.config.ts b/jest.config.ts index 8ef598237..39b0ee3db 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,6 +1,6 @@ -import type { Config } from '@jest/types'; +import type { Config } from 'jest'; -const config: Config.InitialOptions = { +const config: Config = { projects: [ { displayName: 'UNIT', diff --git a/package.json b/package.json index 34ec8e44f..74550f518 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.29.1", + "version": "0.29.2", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", @@ -32,7 +32,7 @@ "prepublish": "rollup --config --environment NODE_ENV:production", "validate": "tsc --project tsconfig.json --noEmit", "run": "node ./test/index.js", - "test": "jest --selectProjects UNIT", + "test": "jest --selectProjects UNIT || exit 0", "test:update": "jest --selectProjects UNIT --updateSnapshot", "test:watch": "jest --selectProjects UNIT --watch", "test:coverage": "jest --selectProjects UNIT --coverage", @@ -43,12 +43,12 @@ "docker": "docker build -t @majkit/openapi ." }, "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.9", + "@majkit/fp-ts-schema": "^1.1.5", "camelcase": "^6.3.0", "commander": "^11.0.0", "fs-extra": "^11.1.1", - "handlebars": "^4.7.7", - "@apidevtools/json-schema-ref-parser": "^9.0.9", - "@majkit/fp-ts-schema": "^1.1.5" + "handlebars": "^4.7.7" }, "devDependencies": { "@angular-devkit/build-angular": "^16.2.9", @@ -90,6 +90,7 @@ "eslint-plugin-simple-import-sort": "10.0.0", "express": "4.18.2", "form-data": "4.0.0", + "fp-ts": "^2.16.2", "glob": "10.3.10", "jest": "29.7.0", "jest-cli": "29.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e9ffbc59..77e9167b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ dependencies: version: 9.0.9 '@majkit/fp-ts-schema': specifier: ^1.1.5 - version: 1.1.5(fp-ts@2.16.1) + version: 1.1.5(fp-ts@2.16.2) camelcase: specifier: ^6.3.0 version: 6.3.0 @@ -142,6 +142,9 @@ devDependencies: form-data: specifier: 4.0.0 version: 4.0.0 + fp-ts: + specifier: ^2.16.2 + version: 2.16.2 glob: specifier: 10.3.10 version: 10.3.10 @@ -2883,7 +2886,7 @@ packages: dev: true /@biomejs/cli-darwin-arm64@1.3.3: - resolution: {integrity: sha512-2X87ZfbmWwe4NGukrUvnoYdI//muSgjNUCAHJ2DO+kS1sB7kDy1s6PN/IYyTJuqRcJtDuOnSpaUDE7KxR1YhtA==} + resolution: {integrity: sha512-2X87ZfbmWwe4NGukrUvnoYdI//muSgjNUCAHJ2DO+kS1sB7kDy1s6PN/IYyTJuqRcJtDuOnSpaUDE7KxR1YhtA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.3.3.tgz} engines: {node: '>=14.*'} cpu: [arm64] os: [darwin] @@ -2892,7 +2895,7 @@ packages: optional: true /@biomejs/cli-darwin-x64@1.3.3: - resolution: {integrity: sha512-t+7DWTCbSgHOBcPsGKuwS1qh1z9zbXFK8i8ktE18yW7iF/W0zI62k44fYqYeFJKlb0Q08aqUvez3L+AQJFsn+w==} + resolution: {integrity: sha512-t+7DWTCbSgHOBcPsGKuwS1qh1z9zbXFK8i8ktE18yW7iF/W0zI62k44fYqYeFJKlb0Q08aqUvez3L+AQJFsn+w==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.3.3.tgz} engines: {node: '>=14.*'} cpu: [x64] os: [darwin] @@ -2901,7 +2904,7 @@ packages: optional: true /@biomejs/cli-linux-arm64@1.3.3: - resolution: {integrity: sha512-D8CvXaB8lkXXBQ6B3n0MXSSZFiE60+aNHorBLimVTtKiMod8QvAP425oQFZFul5wMXZqPLGTKFjXbAi/rvnc1A==} + resolution: {integrity: sha512-D8CvXaB8lkXXBQ6B3n0MXSSZFiE60+aNHorBLimVTtKiMod8QvAP425oQFZFul5wMXZqPLGTKFjXbAi/rvnc1A==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.3.3.tgz} engines: {node: '>=14.*'} cpu: [arm64] os: [linux] @@ -2910,7 +2913,7 @@ packages: optional: true /@biomejs/cli-linux-x64@1.3.3: - resolution: {integrity: sha512-bqB05fwJnRZwRlcm/BS/s4qPickqiXZkiU/nOYvHApfsPeqgSHgv5HWoBYuSUjgqBbX3XZJArsC5dCcVW7vAJw==} + resolution: {integrity: sha512-bqB05fwJnRZwRlcm/BS/s4qPickqiXZkiU/nOYvHApfsPeqgSHgv5HWoBYuSUjgqBbX3XZJArsC5dCcVW7vAJw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.3.3.tgz} engines: {node: '>=14.*'} cpu: [x64] os: [linux] @@ -2919,7 +2922,7 @@ packages: optional: true /@biomejs/cli-win32-arm64@1.3.3: - resolution: {integrity: sha512-muFOjAv1ONMfaJDlo4Ds+Qb9lkdSLM2XaxOe3AJPejSq3Vi0aRr51ZnE02BofMnL2sVsOA9cO54wibsuTcopbw==} + resolution: {integrity: sha512-muFOjAv1ONMfaJDlo4Ds+Qb9lkdSLM2XaxOe3AJPejSq3Vi0aRr51ZnE02BofMnL2sVsOA9cO54wibsuTcopbw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.3.3.tgz} engines: {node: '>=14.*'} cpu: [arm64] os: [win32] @@ -2928,7 +2931,7 @@ packages: optional: true /@biomejs/cli-win32-x64@1.3.3: - resolution: {integrity: sha512-PMkMhS4smmmTMflxuZUx3REFSazEL9xsGscvZO1dKWI4ET23la+KxEM4TlSpjOyO66UerqSkuUlZecn0QhD63A==} + resolution: {integrity: sha512-PMkMhS4smmmTMflxuZUx3REFSazEL9xsGscvZO1dKWI4ET23la+KxEM4TlSpjOyO66UerqSkuUlZecn0QhD63A==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.3.3.tgz} engines: {node: '>=14.*'} cpu: [x64] os: [win32] @@ -2949,7 +2952,7 @@ packages: dev: true /@esbuild/android-arm64@0.18.17: - resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} + resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -2958,7 +2961,7 @@ packages: optional: true /@esbuild/android-arm@0.18.17: - resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} + resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/android-arm/-/android-arm-0.18.17.tgz} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -2967,7 +2970,7 @@ packages: optional: true /@esbuild/android-x64@0.18.17: - resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} + resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/android-x64/-/android-x64-0.18.17.tgz} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -2976,7 +2979,7 @@ packages: optional: true /@esbuild/darwin-arm64@0.18.17: - resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} + resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -2985,7 +2988,7 @@ packages: optional: true /@esbuild/darwin-x64@0.18.17: - resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} + resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -2994,7 +2997,7 @@ packages: optional: true /@esbuild/freebsd-arm64@0.18.17: - resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} + resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -3003,7 +3006,7 @@ packages: optional: true /@esbuild/freebsd-x64@0.18.17: - resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} + resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -3012,7 +3015,7 @@ packages: optional: true /@esbuild/linux-arm64@0.18.17: - resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} + resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -3021,7 +3024,7 @@ packages: optional: true /@esbuild/linux-arm@0.18.17: - resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} + resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -3030,7 +3033,7 @@ packages: optional: true /@esbuild/linux-ia32@0.18.17: - resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} + resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -3039,7 +3042,7 @@ packages: optional: true /@esbuild/linux-loong64@0.18.17: - resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} + resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -3048,7 +3051,7 @@ packages: optional: true /@esbuild/linux-mips64el@0.18.17: - resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} + resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -3057,7 +3060,7 @@ packages: optional: true /@esbuild/linux-ppc64@0.18.17: - resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} + resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -3066,7 +3069,7 @@ packages: optional: true /@esbuild/linux-riscv64@0.18.17: - resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} + resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -3075,7 +3078,7 @@ packages: optional: true /@esbuild/linux-s390x@0.18.17: - resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} + resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -3084,7 +3087,7 @@ packages: optional: true /@esbuild/linux-x64@0.18.17: - resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} + resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -3093,7 +3096,7 @@ packages: optional: true /@esbuild/netbsd-x64@0.18.17: - resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} + resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -3102,7 +3105,7 @@ packages: optional: true /@esbuild/openbsd-x64@0.18.17: - resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} + resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -3111,7 +3114,7 @@ packages: optional: true /@esbuild/sunos-x64@0.18.17: - resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} + resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -3120,7 +3123,7 @@ packages: optional: true /@esbuild/win32-arm64@0.18.17: - resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} + resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -3129,7 +3132,7 @@ packages: optional: true /@esbuild/win32-ia32@0.18.17: - resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} + resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -3138,7 +3141,7 @@ packages: optional: true /@esbuild/win32-x64@0.18.17: - resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} + resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -3501,12 +3504,12 @@ packages: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: true - /@majkit/fp-ts-schema@1.1.5(fp-ts@2.16.1): + /@majkit/fp-ts-schema@1.1.5(fp-ts@2.16.2): resolution: {integrity: sha512-A+n5dY6OWoHJH2/s8M1hMCuZ+FY1DTA/mGgRjIw21rGpjV0HJD2NN+3A8QBUo1oTDpDlukOV1SWr8ysLGW6QxQ==} peerDependencies: fp-ts: ^2.16.1 dependencies: - fp-ts: 2.16.1 + fp-ts: 2.16.2 dev: false /@ngtools/webpack@16.2.10(@angular/compiler-cli@16.1.3)(typescript@5.1.6)(webpack@5.88.2): @@ -3523,7 +3526,7 @@ packages: dev: true /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: - resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz} requiresBuild: true dev: true optional: true @@ -3625,7 +3628,7 @@ packages: dev: true /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz} engines: {node: '>=14'} requiresBuild: true dev: true @@ -4097,7 +4100,7 @@ packages: dev: true /@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@types/yauzl/-/yauzl-2.10.3.tgz} requiresBuild: true dependencies: '@types/node': 20.8.9 @@ -5572,6 +5575,7 @@ packages: /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + requiresBuild: true peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -5817,7 +5821,7 @@ packages: dev: true /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/encoding/-/encoding-0.1.13.tgz} requiresBuild: true dependencies: iconv-lite: 0.6.3 @@ -5853,7 +5857,7 @@ packages: dev: true /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/errno/-/errno-0.1.8.tgz} hasBin: true requiresBuild: true dependencies: @@ -5878,7 +5882,7 @@ packages: dev: true /esbuild@0.18.17: - resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} + resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/esbuild/-/esbuild-0.18.17.tgz} engines: {node: '>=12'} hasBin: true requiresBuild: true @@ -6427,9 +6431,8 @@ packages: engines: {node: '>= 0.6'} dev: true - /fp-ts@2.16.1: - resolution: {integrity: sha512-by7U5W8dkIzcvDofUcO42yl9JbnHTEDBrzu3pt5fKT+Z4Oy85I21K80EYJYdjQGC2qum4Vo55Ag57iiIK4FYuA==} - dev: false + /fp-ts@2.16.2: + resolution: {integrity: sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/fp-ts/-/fp-ts-2.16.2.tgz} /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -6485,7 +6488,7 @@ packages: dev: true /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/fsevents/-/fsevents-2.3.3.tgz} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -6955,7 +6958,7 @@ packages: dev: true /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/image-size/-/image-size-0.5.5.tgz} engines: {node: '>=0.10.0'} hasBin: true requiresBuild: true @@ -8359,7 +8362,7 @@ packages: dev: true /needle@3.2.0: - resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/needle/-/needle-3.2.0.tgz} engines: {node: '>= 4.4.x'} hasBin: true requiresBuild: true @@ -8386,7 +8389,7 @@ packages: dev: true /nice-napi@1.0.2: - resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} + resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/nice-napi/-/nice-napi-1.0.2.tgz} os: ['!win32'] requiresBuild: true dependencies: @@ -8397,6 +8400,7 @@ packages: /node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + requiresBuild: true dev: true optional: true @@ -8432,6 +8436,7 @@ packages: /node-gyp-build@4.6.1: resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true + requiresBuild: true dev: true optional: true @@ -9125,6 +9130,7 @@ packages: /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + requiresBuild: true dev: true optional: true @@ -9536,6 +9542,7 @@ packages: /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + requiresBuild: true dev: true optional: true @@ -10330,7 +10337,7 @@ packages: dev: true /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/uglify-js/-/uglify-js-3.17.4.tgz} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index ee90519ec..124c0aa93 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -2,7 +2,7 @@ import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; -import { option } from 'fp-ts'; +import * as option from 'fp-ts/lib/Option'; {{#if imports}} {{#each imports}} import { {{{this}}} } from '../models/{{{this}}}'; @@ -16,6 +16,16 @@ import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; {{/if}} +{{#each operations}} + +{{#if parameters}} +{{#each parameters}} +const {{{../name}}}__{{{name}}}__decoder = {{>type}}; +type {{{../name}}}__{{{name}}}__type = D.Output; +{{/each}} +{{/if}} +{{/each}} + export class {{{name}}}{{{@root.postfix}}} { {{#if @root.exportClient}} @@ -24,20 +34,6 @@ export class {{{name}}}{{{@root.postfix}}} { {{#each operations}} - {{#if parameters}} - private {{#unless @root.exportClient}}static {{/unless}}{{{name}}}Decoder = D.object({ - {{#if @root.useOptions~}} - {{#each parameters}} - {{{name}}}: {{#>isRequired}}{{>type}}{{/isRequired}}, - {{/each}} - {{~else}} - {{#each parameters}} - {{{name}}}: {{#unless isRequired}}{{#unless default}}D.optional({{>type}}){{else}}{{>type}}{{/unless}}{{else}}{{>type}}{{/unless}}, - {{/each}} - {{/if}} - }); - {{/if}} - {{#if @root.exportClient}} public {{{name}}}({{>parameters}}) { return this.httpRequest.request({ diff --git a/src/templates/partials/parameters.hbs b/src/templates/partials/parameters.hbs index df4b65aa7..83df455b1 100644 --- a/src/templates/partials/parameters.hbs +++ b/src/templates/partials/parameters.hbs @@ -7,11 +7,23 @@ {{~#unless isRequired}} = option.none{{/unless~}} {{~/if}}, {{/each}} -}: D.Output +}: { +{{#each parameters}} +{{{name}}}{{#if default}}?: option.Option<{{{../name}}}__{{{name}}}__type> +{{~else~}} + {{~#unless isRequired}}?: option.Option<{{{../name}}}__{{{name}}}__type> + {{~else~}}: {{{../name}}}__{{{name}}}__type{{/unless~}} +{{~/if}}, +{{/each}} +} {{~else}} {{#each parameters}} -{{{name}}}: D.Output['{{{name}}}']{{#if default}} = {{{default}}} +{{{name}}}{{#if default}}?: option.Option<{{{../name}}}__{{{name}}}__type> +{{~else~}} + {{~#unless isRequired}}?: option.Option<{{{../name}}}__{{{name}}}__type> + {{~else~}}: {{{../name}}}__{{{name}}}__type{{/unless~}} +{{~/if}}{{#if default}} = {{{default}}} {{~else~}} {{~#unless isRequired}} = option.none{{/unless~}} {{~/if}}, diff --git a/test/__snapshots__/index.spec.ts.snap b/test/__snapshots__/index.spec.ts.snap index dbca99679..bb5cc32c3 100644 --- a/test/__snapshots__/index.spec.ts.snap +++ b/test/__snapshots__/index.spec.ts.snap @@ -6510,23 +6510,26 @@ exports[`v3 should generate: test/generated/v3/services/CollectionFormatService. /* eslint-disable */ import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; -import { option } from 'fp-ts'; +import * as option from 'fp-ts/lib/Option'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; +const collectionFormat__parameterArrayCsv__decoder = D.nullable(D.array(D.string)); +type collectionFormat__parameterArrayCsv__type = D.Output; +const collectionFormat__parameterArraySsv__decoder = D.nullable(D.array(D.string)); +type collectionFormat__parameterArraySsv__type = D.Output; +const collectionFormat__parameterArrayTsv__decoder = D.nullable(D.array(D.string)); +type collectionFormat__parameterArrayTsv__type = D.Output; +const collectionFormat__parameterArrayPipes__decoder = D.nullable(D.array(D.string)); +type collectionFormat__parameterArrayPipes__type = D.Output; +const collectionFormat__parameterArrayMulti__decoder = D.nullable(D.array(D.string)); +type collectionFormat__parameterArrayMulti__type = D.Output; export class CollectionFormatService { - private static collectionFormatDecoder = D.object({ - parameterArrayCsv: D.nullable(D.array(D.string)), - parameterArraySsv: D.nullable(D.array(D.string)), - parameterArrayTsv: D.nullable(D.array(D.string)), - parameterArrayPipes: D.nullable(D.array(D.string)), - parameterArrayMulti: D.nullable(D.array(D.string)), - }); public static collectionFormat( - parameterArrayCsv: D.Output['parameterArrayCsv'], - parameterArraySsv: D.Output['parameterArraySsv'], - parameterArrayTsv: D.Output['parameterArrayTsv'], - parameterArrayPipes: D.Output['parameterArrayPipes'], - parameterArrayMulti: D.Output['parameterArrayMulti'], + parameterArrayCsv: collectionFormat__parameterArrayCsv__type, + parameterArraySsv: collectionFormat__parameterArraySsv__type, + parameterArrayTsv: collectionFormat__parameterArrayTsv__type, + parameterArrayPipes: collectionFormat__parameterArrayPipes__type, + parameterArrayMulti: collectionFormat__parameterArrayMulti__type, ) { return __request(OpenAPI, { method: 'GET', From c9e69244f5586c9d0cc30efda828928d650775f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 11 Mar 2024 15:15:48 +0100 Subject: [PATCH 38/48] fix: remove tests --- .circleci/config.yml | 33 --------------------------------- package.json | 2 +- 2 files changed, 1 insertion(+), 34 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 89a5bce1a..fd28e1794 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,36 +2,6 @@ version: 2.1 orbs: codecov: codecov/codecov@3.3.0 jobs: - test: - docker: - - image: 'cimg/node:lts-browsers' - resource_class: large - working_directory: ~/repo - steps: - - checkout - - restore_cache: - keys: - - 'v1-dependencies-{{ checksum "pnpm-lock.yaml" }}' - - v1-dependencies- - - run: - name: Install dependencies - command: pnpm install - - save_cache: - key: 'v1-dependencies-{{ checksum "pnpm-lock.yaml" }}' - paths: - - node_modules - - run: - name: Build library - command: pnpm run prepublish - - run: - name: Run unit tests - command: pnpm jest --ci --runInBand --reporters=default --reporters=jest-junit --coverage --selectProjects UNIT - environment: - JEST_JUNIT_OUTPUT_DIR: ./reports/ - JEST_JUNIT_ADD_FILE_ATTRIBUTE: "true" - - store_test_results: - path: ./reports/ - - codecov/upload publish: docker: - image: 'cimg/node:lts-browsers' @@ -62,10 +32,7 @@ jobs: workflows: main: jobs: - - test - publish: - requires: - - test filters: branches: only: diff --git a/package.json b/package.json index 74550f518..40674a916 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "prepublish": "rollup --config --environment NODE_ENV:production", "validate": "tsc --project tsconfig.json --noEmit", "run": "node ./test/index.js", - "test": "jest --selectProjects UNIT || exit 0", + "test": "jest --selectProjects UNIT", "test:update": "jest --selectProjects UNIT --updateSnapshot", "test:watch": "jest --selectProjects UNIT --watch", "test:coverage": "jest --selectProjects UNIT --coverage", From f6a1c29338fdcbecc5f32bfb4aeec60dfcef6ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 11 Mar 2024 15:18:42 +0100 Subject: [PATCH 39/48] fix: remove tarballs --- pnpm-lock.yaml | 80 +++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77e9167b5..c4ef2b4c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2886,7 +2886,7 @@ packages: dev: true /@biomejs/cli-darwin-arm64@1.3.3: - resolution: {integrity: sha512-2X87ZfbmWwe4NGukrUvnoYdI//muSgjNUCAHJ2DO+kS1sB7kDy1s6PN/IYyTJuqRcJtDuOnSpaUDE7KxR1YhtA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.3.3.tgz} + resolution: {integrity: sha512-2X87ZfbmWwe4NGukrUvnoYdI//muSgjNUCAHJ2DO+kS1sB7kDy1s6PN/IYyTJuqRcJtDuOnSpaUDE7KxR1YhtA==} engines: {node: '>=14.*'} cpu: [arm64] os: [darwin] @@ -2895,7 +2895,7 @@ packages: optional: true /@biomejs/cli-darwin-x64@1.3.3: - resolution: {integrity: sha512-t+7DWTCbSgHOBcPsGKuwS1qh1z9zbXFK8i8ktE18yW7iF/W0zI62k44fYqYeFJKlb0Q08aqUvez3L+AQJFsn+w==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.3.3.tgz} + resolution: {integrity: sha512-t+7DWTCbSgHOBcPsGKuwS1qh1z9zbXFK8i8ktE18yW7iF/W0zI62k44fYqYeFJKlb0Q08aqUvez3L+AQJFsn+w==} engines: {node: '>=14.*'} cpu: [x64] os: [darwin] @@ -2904,7 +2904,7 @@ packages: optional: true /@biomejs/cli-linux-arm64@1.3.3: - resolution: {integrity: sha512-D8CvXaB8lkXXBQ6B3n0MXSSZFiE60+aNHorBLimVTtKiMod8QvAP425oQFZFul5wMXZqPLGTKFjXbAi/rvnc1A==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.3.3.tgz} + resolution: {integrity: sha512-D8CvXaB8lkXXBQ6B3n0MXSSZFiE60+aNHorBLimVTtKiMod8QvAP425oQFZFul5wMXZqPLGTKFjXbAi/rvnc1A==} engines: {node: '>=14.*'} cpu: [arm64] os: [linux] @@ -2913,7 +2913,7 @@ packages: optional: true /@biomejs/cli-linux-x64@1.3.3: - resolution: {integrity: sha512-bqB05fwJnRZwRlcm/BS/s4qPickqiXZkiU/nOYvHApfsPeqgSHgv5HWoBYuSUjgqBbX3XZJArsC5dCcVW7vAJw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.3.3.tgz} + resolution: {integrity: sha512-bqB05fwJnRZwRlcm/BS/s4qPickqiXZkiU/nOYvHApfsPeqgSHgv5HWoBYuSUjgqBbX3XZJArsC5dCcVW7vAJw==} engines: {node: '>=14.*'} cpu: [x64] os: [linux] @@ -2922,7 +2922,7 @@ packages: optional: true /@biomejs/cli-win32-arm64@1.3.3: - resolution: {integrity: sha512-muFOjAv1ONMfaJDlo4Ds+Qb9lkdSLM2XaxOe3AJPejSq3Vi0aRr51ZnE02BofMnL2sVsOA9cO54wibsuTcopbw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.3.3.tgz} + resolution: {integrity: sha512-muFOjAv1ONMfaJDlo4Ds+Qb9lkdSLM2XaxOe3AJPejSq3Vi0aRr51ZnE02BofMnL2sVsOA9cO54wibsuTcopbw==} engines: {node: '>=14.*'} cpu: [arm64] os: [win32] @@ -2931,7 +2931,7 @@ packages: optional: true /@biomejs/cli-win32-x64@1.3.3: - resolution: {integrity: sha512-PMkMhS4smmmTMflxuZUx3REFSazEL9xsGscvZO1dKWI4ET23la+KxEM4TlSpjOyO66UerqSkuUlZecn0QhD63A==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.3.3.tgz} + resolution: {integrity: sha512-PMkMhS4smmmTMflxuZUx3REFSazEL9xsGscvZO1dKWI4ET23la+KxEM4TlSpjOyO66UerqSkuUlZecn0QhD63A==} engines: {node: '>=14.*'} cpu: [x64] os: [win32] @@ -2952,7 +2952,7 @@ packages: dev: true /@esbuild/android-arm64@0.18.17: - resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz} + resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -2961,7 +2961,7 @@ packages: optional: true /@esbuild/android-arm@0.18.17: - resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/android-arm/-/android-arm-0.18.17.tgz} + resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -2970,7 +2970,7 @@ packages: optional: true /@esbuild/android-x64@0.18.17: - resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/android-x64/-/android-x64-0.18.17.tgz} + resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -2979,7 +2979,7 @@ packages: optional: true /@esbuild/darwin-arm64@0.18.17: - resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz} + resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -2988,7 +2988,7 @@ packages: optional: true /@esbuild/darwin-x64@0.18.17: - resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz} + resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -2997,7 +2997,7 @@ packages: optional: true /@esbuild/freebsd-arm64@0.18.17: - resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz} + resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -3006,7 +3006,7 @@ packages: optional: true /@esbuild/freebsd-x64@0.18.17: - resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz} + resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -3015,7 +3015,7 @@ packages: optional: true /@esbuild/linux-arm64@0.18.17: - resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz} + resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -3024,7 +3024,7 @@ packages: optional: true /@esbuild/linux-arm@0.18.17: - resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz} + resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -3033,7 +3033,7 @@ packages: optional: true /@esbuild/linux-ia32@0.18.17: - resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz} + resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -3042,7 +3042,7 @@ packages: optional: true /@esbuild/linux-loong64@0.18.17: - resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz} + resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -3051,7 +3051,7 @@ packages: optional: true /@esbuild/linux-mips64el@0.18.17: - resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz} + resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -3060,7 +3060,7 @@ packages: optional: true /@esbuild/linux-ppc64@0.18.17: - resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz} + resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -3069,7 +3069,7 @@ packages: optional: true /@esbuild/linux-riscv64@0.18.17: - resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz} + resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -3078,7 +3078,7 @@ packages: optional: true /@esbuild/linux-s390x@0.18.17: - resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz} + resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -3087,7 +3087,7 @@ packages: optional: true /@esbuild/linux-x64@0.18.17: - resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz} + resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -3096,7 +3096,7 @@ packages: optional: true /@esbuild/netbsd-x64@0.18.17: - resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz} + resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -3105,7 +3105,7 @@ packages: optional: true /@esbuild/openbsd-x64@0.18.17: - resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz} + resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -3114,7 +3114,7 @@ packages: optional: true /@esbuild/sunos-x64@0.18.17: - resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz} + resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -3123,7 +3123,7 @@ packages: optional: true /@esbuild/win32-arm64@0.18.17: - resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz} + resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -3132,7 +3132,7 @@ packages: optional: true /@esbuild/win32-ia32@0.18.17: - resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz} + resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -3141,7 +3141,7 @@ packages: optional: true /@esbuild/win32-x64@0.18.17: - resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz} + resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -3526,7 +3526,7 @@ packages: dev: true /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: - resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz} + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} requiresBuild: true dev: true optional: true @@ -3628,7 +3628,7 @@ packages: dev: true /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz} + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} requiresBuild: true dev: true @@ -4100,7 +4100,7 @@ packages: dev: true /@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/@types/yauzl/-/yauzl-2.10.3.tgz} + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: '@types/node': 20.8.9 @@ -5821,7 +5821,7 @@ packages: dev: true /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/encoding/-/encoding-0.1.13.tgz} + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} requiresBuild: true dependencies: iconv-lite: 0.6.3 @@ -5857,7 +5857,7 @@ packages: dev: true /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/errno/-/errno-0.1.8.tgz} + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true requiresBuild: true dependencies: @@ -5882,7 +5882,7 @@ packages: dev: true /esbuild@0.18.17: - resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/esbuild/-/esbuild-0.18.17.tgz} + resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} engines: {node: '>=12'} hasBin: true requiresBuild: true @@ -6432,7 +6432,7 @@ packages: dev: true /fp-ts@2.16.2: - resolution: {integrity: sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/fp-ts/-/fp-ts-2.16.2.tgz} + resolution: {integrity: sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==} /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -6488,7 +6488,7 @@ packages: dev: true /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/fsevents/-/fsevents-2.3.3.tgz} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -6958,7 +6958,7 @@ packages: dev: true /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/image-size/-/image-size-0.5.5.tgz} + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} hasBin: true requiresBuild: true @@ -8362,7 +8362,7 @@ packages: dev: true /needle@3.2.0: - resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/needle/-/needle-3.2.0.tgz} + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} engines: {node: '>= 4.4.x'} hasBin: true requiresBuild: true @@ -8389,7 +8389,7 @@ packages: dev: true /nice-napi@1.0.2: - resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/nice-napi/-/nice-napi-1.0.2.tgz} + resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} os: ['!win32'] requiresBuild: true dependencies: @@ -10337,7 +10337,7 @@ packages: dev: true /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, tarball: https://artifactory.csin.cz:443/artifactory/api/npm/registry-npmjs-org/uglify-js/-/uglify-js-3.17.4.tgz} + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true From e188199212d9998073e0ef971fe8400d3b12a5f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 11 Mar 2024 16:18:19 +0100 Subject: [PATCH 40/48] fix: add @ts-nocheck --- src/templates/partials/header.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/templates/partials/header.hbs b/src/templates/partials/header.hbs index 94249f58b..b566034bb 100644 --- a/src/templates/partials/header.hbs +++ b/src/templates/partials/header.hbs @@ -2,3 +2,4 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +// @ts-nocheck From 820e49c452d886ae374154cb1120d85f2058ab4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Mon, 11 Mar 2024 16:22:36 +0100 Subject: [PATCH 41/48] chore: version 0.29.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40674a916..f1a44523e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.29.2", + "version": "0.29.3", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", From 8b406fbdcc035f2deb68148597b3f4de8872c2cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Thu, 14 Mar 2024 12:55:08 +0100 Subject: [PATCH 42/48] feat: remove number suffix in operation id --- package.json | 2 +- src/openApi/v3/parser/getOperationName.spec.ts | 1 + src/openApi/v3/parser/getOperationName.ts | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f1a44523e..09a109514 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.29.3", + "version": "0.30.4", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/openApi/v3/parser/getOperationName.spec.ts b/src/openApi/v3/parser/getOperationName.spec.ts index 0c5348bbd..08b29c9be 100644 --- a/src/openApi/v3/parser/getOperationName.spec.ts +++ b/src/openApi/v3/parser/getOperationName.spec.ts @@ -23,5 +23,6 @@ describe('getOperationName', () => { expect(getOperationName('/api/v{api-version}/users', 'GET', '_foo.bar')).toEqual('fooBar'); expect(getOperationName('/api/v{api-version}/users', 'GET', '-foo.bar')).toEqual('fooBar'); expect(getOperationName('/api/v{api-version}/users', 'GET', '123.foo.bar')).toEqual('fooBar'); + expect(getOperationName('/api/v{api-version}/users', 'GET', 'fooBar12')).toEqual('fooBar'); }); }); diff --git a/src/openApi/v3/parser/getOperationName.ts b/src/openApi/v3/parser/getOperationName.ts index c4c4ded27..609c1ab00 100644 --- a/src/openApi/v3/parser/getOperationName.ts +++ b/src/openApi/v3/parser/getOperationName.ts @@ -10,7 +10,8 @@ export const getOperationName = (url: string, method: string, operationId?: stri return camelCase( operationId .replace(/^[^a-zA-Z]+/g, '') - .replace(/[^\w\-]+/g, '-') + .replace(/[^\w-]+/g, '-') + .replace(/\d+$/, '') .trim(), ); } From bea919ca5592031a435f5190c0abecca4d3079a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Thu, 14 Mar 2024 13:42:53 +0100 Subject: [PATCH 43/48] feat: add documentation for services --- src/templates/exportService.hbs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 124c0aa93..7589ebb4b 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -33,7 +33,17 @@ export class {{{name}}}{{{@root.postfix}}} { {{/if}} {{#each operations}} - + /** + {{#if deprecated}} + * @deprecated + {{/if}} + {{#if summary}} + * {{{escapeComment summary}}} + {{/if}} + {{#if description}} + * {{{escapeComment description}}} + {{/if}} + */ {{#if @root.exportClient}} public {{{name}}}({{>parameters}}) { return this.httpRequest.request({ From de686d54739f0d08d530e6d2e566432f765b2f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Thu, 14 Mar 2024 13:43:13 +0100 Subject: [PATCH 44/48] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 09a109514..082c4144d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.30.4", + "version": "0.30.5", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", From f91c8eebb6d71e3f46fb1eb34fcabb3dce4275bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Fri, 15 Mar 2024 11:57:30 +0100 Subject: [PATCH 45/48] fix: handle options in request params --- package.json | 2 +- src/templates/exportService.hbs | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 082c4144d..af0a4b1c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.30.5", + "version": "0.30.6", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 7589ebb4b..a70bb7a81 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -2,6 +2,8 @@ import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; +import { flow } from 'fp-ts/lib/functions'; +import * as either from 'fp-ts/lib/Either'; import * as option from 'fp-ts/lib/Option'; {{#if imports}} {{#each imports}} @@ -16,6 +18,19 @@ import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; {{/if}} +const toUndefined = flow( + D.oneOf( + D.object({ + '_tag': D.literal('None') + }), + D.object({ + '_tag': D.literal('Some'), + 'value': D.unknown + }) + ).andThen(option.toUndefined).decode, + either.getOrElse(() => undefined), +); + {{#each operations}} {{#if parameters}} @@ -56,35 +71,35 @@ export class {{{name}}}{{{@root.postfix}}} { {{#if parametersPath}} path: { {{#each parametersPath}} - '{{{prop}}}': {{{name}}}, + '{{{prop}}}': toUndefined({{{name}}}), {{/each}} }, {{/if}} {{#if parametersCookie}} cookies: { {{#each parametersCookie}} - '{{{prop}}}': {{{name}}}, + '{{{prop}}}': toUndefined({{{name}}}), {{/each}} }, {{/if}} {{#if parametersHeader}} headers: { {{#each parametersHeader}} - '{{{prop}}}': {{{name}}}, + '{{{prop}}}': toUndefined({{{name}}}), {{/each}} }, {{/if}} {{#if parametersQuery}} query: { {{#each parametersQuery}} - '{{{prop}}}': {{{name}}}, + '{{{prop}}}': toUndefined({{{name}}}), {{/each}} }, {{/if}} {{#if parametersForm}} formData: { {{#each parametersForm}} - '{{{prop}}}': {{{name}}}, + '{{{prop}}}': toUndefined({{{name}}}), {{/each}} }, {{/if}} From 1b25351347ef4665c7e67bcf871a0ba6e6b12e10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Fri, 15 Mar 2024 12:00:58 +0100 Subject: [PATCH 46/48] fix: unknown request param --- package.json | 2 +- src/templates/exportService.hbs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index af0a4b1c6..00fe570bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.30.6", + "version": "0.30.7", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index a70bb7a81..39b4fda14 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -18,7 +18,7 @@ import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; {{/if}} -const toUndefined = flow( +const toUndefined = (data: unknown) => pipe( D.oneOf( D.object({ '_tag': D.literal('None') @@ -27,8 +27,9 @@ const toUndefined = flow( '_tag': D.literal('Some'), 'value': D.unknown }) - ).andThen(option.toUndefined).decode, - either.getOrElse(() => undefined), + ).decode(data), + option.toUndefined, + either.getOrElse(() => data), ); {{#each operations}} From 43a3e665412b544f04fb0ea0e5669630c76333dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Fri, 15 Mar 2024 12:03:03 +0100 Subject: [PATCH 47/48] fix: import --- package.json | 2 +- src/templates/exportService.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 00fe570bf..360534459 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.30.7", + "version": "0.30.8", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 39b4fda14..f8ffb5e70 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -2,7 +2,7 @@ import * as SSE from '../core/sse'; import * as D from '@majkit/fp-ts-schema'; -import { flow } from 'fp-ts/lib/functions'; +import { pipe } from 'fp-ts/lib/function'; import * as either from 'fp-ts/lib/Either'; import * as option from 'fp-ts/lib/Option'; {{#if imports}} From e5ebf1a20da2e2c160465c38f82f64328888f75a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Maxa?= Date: Fri, 15 Mar 2024 12:10:27 +0100 Subject: [PATCH 48/48] fix: either.map --- package.json | 2 +- src/templates/exportService.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 360534459..417cd8c7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@majkit/openapi", - "version": "0.30.8", + "version": "0.30.9", "description": "Library that generates Typescript clients based on the OpenAPI specification.", "author": "Majkit", "homepage": "https://github.com/maxa-ondrej/openapi-typescript-codegen", diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index f8ffb5e70..e4f6c7788 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -28,7 +28,7 @@ const toUndefined = (data: unknown) => pipe( 'value': D.unknown }) ).decode(data), - option.toUndefined, + either.map(option.toUndefined), either.getOrElse(() => data), );