fork of hey-api/openapi-ts because I need some additional things
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'main' of https://github.com/nicolas-chaulet/openapi-typescript-codegen into feat/clients

Lubos 36424515 b1d232d6

+1527 -799
+5
.changeset/smart-buttons-mate.md
··· 1 + --- 2 + "@hey-api/openapi-ts": patch 3 + --- 4 + 5 + fix: comment position in JavaScript enums
+4 -4
examples/openapi-ts-axios/package.json
··· 21 21 "@hey-api/openapi-ts": "workspace:*", 22 22 "@types/react": "18.3.1", 23 23 "@types/react-dom": "18.3.0", 24 - "@typescript-eslint/eslint-plugin": "7.7.1", 25 - "@typescript-eslint/parser": "7.7.1", 24 + "@typescript-eslint/eslint-plugin": "7.8.0", 25 + "@typescript-eslint/parser": "7.8.0", 26 26 "@vitejs/plugin-react": "4.2.1", 27 - "eslint": "9.1.1", 27 + "eslint": "9.2.0", 28 28 "eslint-plugin-react-hooks": "4.6.2", 29 29 "eslint-plugin-react-refresh": "0.4.6", 30 30 "prettier": "3.2.5", 31 31 "typescript": "5.4.5", 32 - "vite": "5.2.10" 32 + "vite": "5.2.11" 33 33 } 34 34 }
+4 -4
examples/openapi-ts-fetch/package.json
··· 20 20 "@hey-api/openapi-ts": "workspace:*", 21 21 "@types/react": "18.3.1", 22 22 "@types/react-dom": "18.3.0", 23 - "@typescript-eslint/eslint-plugin": "7.7.1", 24 - "@typescript-eslint/parser": "7.7.1", 23 + "@typescript-eslint/eslint-plugin": "7.8.0", 24 + "@typescript-eslint/parser": "7.8.0", 25 25 "@vitejs/plugin-react": "4.2.1", 26 - "eslint": "9.1.1", 26 + "eslint": "9.2.0", 27 27 "eslint-plugin-react-hooks": "4.6.2", 28 28 "eslint-plugin-react-refresh": "0.4.6", 29 29 "prettier": "3.2.5", 30 30 "typescript": "5.4.5", 31 - "vite": "5.2.10" 31 + "vite": "5.2.11" 32 32 } 33 33 }
+6 -6
package.json
··· 39 39 "@rollup/plugin-terser": "0.4.4", 40 40 "@rollup/plugin-typescript": "11.1.6", 41 41 "@svitejs/changesets-changelog-github-compact": "1.1.0", 42 - "@types/node": "20.12.7", 43 - "@vitest/coverage-v8": "1.5.2", 44 - "eslint": "9.1.1", 42 + "@types/node": "20.12.8", 43 + "@vitest/coverage-v8": "1.6.0", 44 + "eslint": "9.2.0", 45 45 "eslint-config-prettier": "9.1.0", 46 46 "eslint-plugin-simple-import-sort": "12.1.0", 47 47 "eslint-plugin-sort-keys-fix": "1.1.2", ··· 50 50 "lint-staged": "15.2.2", 51 51 "prettier": "3.2.5", 52 52 "rimraf": "5.0.5", 53 - "rollup": "4.17.0", 53 + "rollup": "4.17.2", 54 54 "rollup-plugin-dts": "6.1.0", 55 55 "typescript": "5.4.5", 56 - "typescript-eslint": "7.7.1", 57 - "vitest": "1.5.2" 56 + "typescript-eslint": "7.8.0", 57 + "vitest": "1.6.0" 58 58 }, 59 59 "packageManager": "pnpm@8.15.7+sha256.50783dd0fa303852de2dd1557cd4b9f07cb5b018154a6e76d0f40635d6cee019" 60 60 }
+6
packages/openapi-ts/CHANGELOG.md
··· 1 1 # @hey-api/openapi-ts 2 2 3 + ## 0.43.2 4 + 5 + ### Patch Changes 6 + 7 + - fix: deduplicate exported data and response types ([#538](https://github.com/hey-api/openapi-ts/pull/538)) 8 + 3 9 ## 0.43.1 4 10 5 11 ### Patch Changes
+11 -11
packages/openapi-ts/package.json
··· 1 1 { 2 2 "name": "@hey-api/openapi-ts", 3 - "version": "0.43.1", 3 + "version": "0.43.2", 4 4 "type": "module", 5 5 "description": "Turn your OpenAPI specification into a beautiful TypeScript client", 6 6 "homepage": "https://heyapi.vercel.app/", ··· 69 69 }, 70 70 "devDependencies": { 71 71 "@angular-devkit/build-angular": "17.3.6", 72 - "@angular/animations": "17.3.6", 72 + "@angular/animations": "17.3.7", 73 73 "@angular/cli": "17.3.6", 74 - "@angular/common": "17.3.6", 75 - "@angular/compiler": "17.3.6", 76 - "@angular/compiler-cli": "17.3.6", 77 - "@angular/core": "17.3.6", 78 - "@angular/forms": "17.3.6", 79 - "@angular/platform-browser": "17.3.6", 80 - "@angular/platform-browser-dynamic": "17.3.6", 81 - "@angular/router": "17.3.6", 74 + "@angular/common": "17.3.7", 75 + "@angular/compiler": "17.3.7", 76 + "@angular/compiler-cli": "17.3.7", 77 + "@angular/core": "17.3.7", 78 + "@angular/forms": "17.3.7", 79 + "@angular/platform-browser": "17.3.7", 80 + "@angular/platform-browser-dynamic": "17.3.7", 81 + "@angular/router": "17.3.7", 82 82 "@rollup/plugin-json": "6.1.0", 83 83 "@rollup/plugin-node-resolve": "15.2.3", 84 84 "@types/cross-spawn": "6.0.6", 85 85 "@types/express": "4.17.21", 86 86 "axios": "1.6.8", 87 87 "cross-spawn": "7.0.3", 88 - "eslint": "9.1.1", 88 + "eslint": "9.2.0", 89 89 "express": "4.19.2", 90 90 "glob": "10.3.12", 91 91 "node-fetch": "3.3.2",
+14 -10
packages/openapi-ts/src/compiler/typedef.ts
··· 27 27 28 28 /** 29 29 * Create a type alias declaration. Example `export type X = Y;`. 30 - * @param name - the name of the type. 31 - * @param type - the type. 32 - * @param comments - comments to add if any. 30 + * @param comment (optional) comments to add 31 + * @param name the name of the type 32 + * @param type the type 33 33 * @returns ts.TypeAliasDeclaration 34 34 */ 35 - export const createTypeAliasDeclaration = ( 36 - name: string, 37 - type: string | ts.TypeNode, 38 - comments?: Comments, 39 - ): ts.TypeAliasDeclaration => { 35 + export const createTypeAliasDeclaration = ({ 36 + comment, 37 + name, 38 + type, 39 + }: { 40 + comment?: Comments; 41 + name: string; 42 + type: string | ts.TypeNode; 43 + }): ts.TypeAliasDeclaration => { 40 44 const node = ts.factory.createTypeAliasDeclaration( 41 45 [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)], 42 46 ts.factory.createIdentifier(name), 43 47 [], 44 48 createTypeNode(type), 45 49 ); 46 - if (comments) { 47 - addLeadingJSDocComment(node, comments); 50 + if (comment) { 51 + addLeadingJSDocComment(node, comment); 48 52 } 49 53 return node; 50 54 };
+15
packages/openapi-ts/src/openApi/common/interfaces/client.ts
··· 84 84 uniqueItems?: boolean; 85 85 } 86 86 87 + export interface ModelMeta { 88 + /** 89 + * Ref to the type in OpenAPI specification. 90 + */ 91 + $ref: string; 92 + /** 93 + * Name passed to the initial `getModel()` call. 94 + */ 95 + name: string; 96 + } 97 + 87 98 export interface Model extends Schema { 88 99 /** 89 100 * **Experimental.** Contains list of original refs so they can be used ··· 109 120 | 'reference'; 110 121 imports: string[]; 111 122 link: Model | null; 123 + meta?: ModelMeta; 124 + /** 125 + * @deprecated use `meta.name` instead 126 + */ 112 127 name: string; 113 128 properties: Model[]; 114 129 template: string | null;
+22 -12
packages/openapi-ts/src/openApi/common/parser/__tests__/type.spec.ts
··· 1 - import { describe, expect, it } from 'vitest'; 1 + import { describe, expect, it, vi } from 'vitest'; 2 2 3 + import type { Config } from '../../../../types/config'; 3 4 import { getMappedType, getType } from '../type'; 5 + 6 + vi.mock('../../../../utils/config', () => { 7 + const config: Partial<Config> = { 8 + types: {}, 9 + }; 10 + return { 11 + getConfig: () => config, 12 + }; 13 + }); 4 14 5 15 describe('getMappedType', () => { 6 16 it.each([ ··· 32 42 33 43 describe('getType', () => { 34 44 it('should convert int', () => { 35 - const type = getType('int'); 45 + const type = getType({ type: 'int' }); 36 46 expect(type.type).toEqual('number'); 37 47 expect(type.base).toEqual('number'); 38 48 expect(type.template).toEqual(null); ··· 41 51 }); 42 52 43 53 it('should convert string', () => { 44 - const type = getType('string'); 54 + const type = getType({ type: 'string' }); 45 55 expect(type.type).toEqual('string'); 46 56 expect(type.base).toEqual('string'); 47 57 expect(type.template).toEqual(null); ··· 50 60 }); 51 61 52 62 it('should convert string array', () => { 53 - const type = getType('array[string]'); 63 + const type = getType({ type: 'array[string]' }); 54 64 expect(type.type).toEqual('string[]'); 55 65 expect(type.base).toEqual('string'); 56 66 expect(type.template).toEqual(null); ··· 59 69 }); 60 70 61 71 it('should convert template with primary', () => { 62 - const type = getType('#/components/schemas/Link[string]'); 72 + const type = getType({ type: '#/components/schemas/Link[string]' }); 63 73 expect(type.type).toEqual('Link<string>'); 64 74 expect(type.base).toEqual('Link'); 65 75 expect(type.template).toEqual('string'); ··· 68 78 }); 69 79 70 80 it('should convert template with model', () => { 71 - const type = getType('#/components/schemas/Link[Model]'); 81 + const type = getType({ type: '#/components/schemas/Link[Model]' }); 72 82 expect(type.type).toEqual('Link<Model>'); 73 83 expect(type.base).toEqual('Link'); 74 84 expect(type.template).toEqual('Model'); ··· 77 87 }); 78 88 79 89 it('should have double imports', () => { 80 - const type = getType('#/components/schemas/Link[Link]'); 90 + const type = getType({ type: '#/components/schemas/Link[Link]' }); 81 91 expect(type.type).toEqual('Link<Link>'); 82 92 expect(type.base).toEqual('Link'); 83 93 expect(type.template).toEqual('Link'); ··· 86 96 }); 87 97 88 98 it('should support dot', () => { 89 - const type = getType('#/components/schemas/model.000'); 99 + const type = getType({ type: '#/components/schemas/model.000' }); 90 100 expect(type.type).toEqual('model_000'); 91 101 expect(type.base).toEqual('model_000'); 92 102 expect(type.template).toEqual(null); ··· 95 105 }); 96 106 97 107 it('should support dashes', () => { 98 - const type = getType('#/components/schemas/some_special-schema'); 108 + const type = getType({ type: '#/components/schemas/some_special-schema' }); 99 109 expect(type.type).toEqual('some_special_schema'); 100 110 expect(type.base).toEqual('some_special_schema'); 101 111 expect(type.template).toEqual(null); ··· 104 114 }); 105 115 106 116 it('should support dollar sign', () => { 107 - const type = getType('#/components/schemas/$some+special+schema'); 117 + const type = getType({ type: '#/components/schemas/$some+special+schema' }); 108 118 expect(type.type).toEqual('$some_special_schema'); 109 119 expect(type.base).toEqual('$some_special_schema'); 110 120 expect(type.template).toEqual(null); ··· 113 123 }); 114 124 115 125 it('should support multiple base types', () => { 116 - const type = getType(['string', 'int']); 126 + const type = getType({ type: ['string', 'int'] }); 117 127 expect(type.type).toEqual('string | number'); 118 128 expect(type.base).toEqual('string | number'); 119 129 expect(type.template).toEqual(null); ··· 122 132 }); 123 133 124 134 it('should support multiple nullable types', () => { 125 - const type = getType(['string', 'null']); 135 + const type = getType({ type: ['string', 'null'] }); 126 136 expect(type.type).toEqual('string'); 127 137 expect(type.base).toEqual('string'); 128 138 expect(type.template).toEqual(null);
+17 -12
packages/openapi-ts/src/openApi/common/parser/type.ts
··· 1 + import { transformTypeName } from '../../../utils/transform'; 1 2 import { isDefinitionTypeNullable } from '../../v3/parser/inferType'; 2 3 import type { Type } from '../interfaces/Type'; 3 4 import { ensureValidTypeScriptJavaScriptIdentifier } from './sanitize'; ··· 50 51 * @param type String or String[] value like "integer", "Link[Model]" or ["string", "null"]. 51 52 * @param format String value like "binary" or "date". 52 53 */ 53 - export const getType = ( 54 - type: string | string[] = 'unknown', 55 - format?: string, 56 - ): Type => { 54 + export const getType = ({ 55 + format, 56 + type = 'unknown', 57 + }: { 58 + format?: string; 59 + type?: string | string[]; 60 + }): Type => { 57 61 const result: Type = { 58 62 $refs: [], 59 63 base: 'unknown', ··· 89 93 if (/\[.*\]$/g.test(typeWithoutNamespace)) { 90 94 const matches = typeWithoutNamespace.match(/(.*?)\[(.*)\]$/); 91 95 if (matches?.length) { 92 - const match1 = getType( 93 - ensureValidTypeScriptJavaScriptIdentifier(matches[1]), 94 - ); 95 - const match2 = getType( 96 - ensureValidTypeScriptJavaScriptIdentifier(matches[2]), 97 - ); 96 + const match1 = getType({ 97 + type: ensureValidTypeScriptJavaScriptIdentifier(matches[1]), 98 + }); 99 + const match2 = getType({ 100 + type: ensureValidTypeScriptJavaScriptIdentifier(matches[2]), 101 + }); 98 102 99 103 if (match1.type === 'unknown[]') { 100 104 result.type = `${match2.type}[]`; ··· 122 126 } 123 127 124 128 if (typeWithoutNamespace) { 125 - let encodedType = 126 - ensureValidTypeScriptJavaScriptIdentifier(typeWithoutNamespace); 129 + let encodedType = transformTypeName( 130 + ensureValidTypeScriptJavaScriptIdentifier(typeWithoutNamespace), 131 + ); 127 132 if (type.startsWith('#/components/parameters/')) { 128 133 // prefix parameter names to avoid conflicts, assuming people are mostly 129 134 // interested in importing schema types and don't care about this naming
+1 -2
packages/openapi-ts/src/openApi/v2/index.ts
··· 17 17 const services = getServices(openApi); 18 18 19 19 return { 20 - enumNames: [], 21 20 models, 22 21 server, 23 - serviceTypes: [], 24 22 services, 23 + types: {}, 25 24 version, 26 25 }; 27 26 };
+27 -18
packages/openapi-ts/src/openApi/v2/parser/getModel.ts
··· 1 - import type { Model } from '../../common/interfaces/client'; 1 + import type { Model, ModelMeta } from '../../common/interfaces/client'; 2 2 import { getEnums } from '../../common/parser/getEnums'; 3 3 import { getPattern } from '../../common/parser/getPattern'; 4 4 import { getType } from '../../common/parser/type'; ··· 7 7 import { getModelComposition } from './getModelComposition'; 8 8 import { getModelProperties } from './getModelProperties'; 9 9 10 - export const getModel = ( 11 - openApi: OpenApi, 12 - definition: OpenApiSchema, 13 - isDefinition: boolean = false, 14 - name: string = '', 15 - ): Model => { 10 + export const getModel = ({ 11 + definition, 12 + isDefinition = false, 13 + meta, 14 + openApi, 15 + }: { 16 + definition: OpenApiSchema; 17 + isDefinition?: boolean; 18 + meta?: ModelMeta; 19 + openApi: OpenApi; 20 + }): Model => { 16 21 const model: Model = { 17 22 $refs: [], 18 23 base: 'unknown', ··· 33 38 maxLength: definition.maxLength, 34 39 maxProperties: definition.maxProperties, 35 40 maximum: definition.maximum, 41 + meta, 36 42 minItems: definition.minItems, 37 43 minLength: definition.minLength, 38 44 minProperties: definition.minProperties, 39 45 minimum: definition.minimum, 40 46 multipleOf: definition.multipleOf, 41 - name, 47 + name: meta?.name ?? '', 42 48 pattern: getPattern(definition.pattern), 43 49 properties: [], 44 50 template: null, ··· 47 53 }; 48 54 49 55 if (definition.$ref) { 50 - const definitionRef = getType(definition.$ref); 56 + const definitionRef = getType({ type: definition.$ref }); 51 57 model.export = 'reference'; 52 58 model.type = definitionRef.type; 53 59 model.base = definitionRef.base; ··· 69 75 70 76 if (definition.type === 'array' && definition.items) { 71 77 if (definition.items.$ref) { 72 - const arrayItems = getType(definition.items.$ref); 78 + const arrayItems = getType({ type: definition.items.$ref }); 73 79 model.export = 'array'; 74 80 model.type = arrayItems.type; 75 81 model.base = arrayItems.base; ··· 77 83 model.imports.push(...arrayItems.imports); 78 84 return model; 79 85 } else { 80 - const arrayItems = getModel(openApi, definition.items); 86 + const arrayItems = getModel({ definition: definition.items, openApi }); 81 87 model.export = 'array'; 82 88 model.type = arrayItems.type; 83 89 model.base = arrayItems.base; ··· 93 99 typeof definition.additionalProperties === 'object' 94 100 ) { 95 101 if (definition.additionalProperties.$ref) { 96 - const additionalProperties = getType( 97 - definition.additionalProperties.$ref, 98 - ); 102 + const additionalProperties = getType({ 103 + type: definition.additionalProperties.$ref, 104 + }); 99 105 model.export = 'dictionary'; 100 106 model.type = additionalProperties.type; 101 107 model.base = additionalProperties.base; ··· 103 109 model.imports.push(...additionalProperties.imports); 104 110 return model; 105 111 } else { 106 - const additionalProperties = getModel( 112 + const additionalProperties = getModel({ 113 + definition: definition.additionalProperties, 107 114 openApi, 108 - definition.additionalProperties, 109 - ); 115 + }); 110 116 model.export = 'dictionary'; 111 117 model.type = additionalProperties.type; 112 118 model.base = additionalProperties.base; ··· 153 159 154 160 // If the schema has a type than it can be a basic or generic type. 155 161 if (definition.type) { 156 - const definitionType = getType(definition.type, definition.format); 162 + const definitionType = getType({ 163 + format: definition.format, 164 + type: definition.type, 165 + }); 157 166 model.export = 'generic'; 158 167 model.type = definitionType.type; 159 168 model.base = definitionType.base;
+1 -1
packages/openapi-ts/src/openApi/v2/parser/getModelComposition.ts
··· 26 26 const properties: Model[] = []; 27 27 28 28 definitions 29 - .map((definition) => getModel(openApi, definition)) 29 + .map((definition) => getModel({ definition, openApi })) 30 30 .filter((model) => { 31 31 const hasProperties = model.properties.length; 32 32 const hasEnums = model.enums.length;
+2 -2
packages/openapi-ts/src/openApi/v2/parser/getModelProperties.ts
··· 20 20 ([propertyName, property]) => { 21 21 const propertyRequired = !!definition.required?.includes(propertyName); 22 22 if (property.$ref) { 23 - const model = getType(property.$ref); 23 + const model = getType({ type: property.$ref }); 24 24 models.push({ 25 25 $refs: [], 26 26 base: model.base, ··· 54 54 uniqueItems: property.uniqueItems, 55 55 }); 56 56 } else { 57 - const model = getModel(openApi, property); 57 + const model = getModel({ definition: property, openApi }); 58 58 models.push({ 59 59 $refs: [], 60 60 base: model.base,
+9 -6
packages/openapi-ts/src/openApi/v2/parser/getModels.ts
··· 9 9 10 10 Object.entries(openApi.definitions ?? {}).forEach( 11 11 ([definitionName, definition]) => { 12 - const definitionType = getType(definitionName); 13 - const model = getModel( 12 + const definitionType = getType({ type: definitionName }); 13 + const model = getModel({ 14 + definition, 15 + isDefinition: true, 16 + meta: { 17 + $ref: `#/definitions/${definitionName}`, 18 + name: definitionType.base.replace(reservedWords, '_$1'), 19 + }, 14 20 openApi, 15 - definition, 16 - true, 17 - definitionType.base.replace(reservedWords, '_$1'), 18 - ); 21 + }); 19 22 models = [...models, model]; 20 23 }, 21 24 );
+15 -6
packages/openapi-ts/src/openApi/v2/parser/getOperationParameter.ts
··· 49 49 }; 50 50 51 51 if (parameter.$ref) { 52 - const definitionRef = getType(parameter.$ref); 52 + const definitionRef = getType({ type: parameter.$ref }); 53 53 operationParameter.export = 'reference'; 54 54 operationParameter.type = definitionRef.type; 55 55 operationParameter.base = definitionRef.base; ··· 72 72 } 73 73 74 74 if (parameter.type === 'array' && parameter.items) { 75 - const items = getType(parameter.items.type, parameter.items.format); 75 + const items = getType({ 76 + format: parameter.items.format, 77 + type: parameter.items.type, 78 + }); 76 79 operationParameter.export = 'array'; 77 80 operationParameter.type = items.type; 78 81 operationParameter.base = items.base; ··· 83 86 } 84 87 85 88 if (parameter.type === 'object' && parameter.items) { 86 - const items = getType(parameter.items.type, parameter.items.format); 89 + const items = getType({ 90 + format: parameter.items.format, 91 + type: parameter.items.type, 92 + }); 87 93 operationParameter.export = 'dictionary'; 88 94 operationParameter.type = items.type; 89 95 operationParameter.base = items.base; ··· 99 105 schema = getRef<OpenApiSchema>(openApi, schema); 100 106 } 101 107 if (schema.$ref) { 102 - const model = getType(schema.$ref); 108 + const model = getType({ type: schema.$ref }); 103 109 operationParameter.export = 'reference'; 104 110 operationParameter.type = model.type; 105 111 operationParameter.base = model.base; ··· 108 114 operationParameter.default = getDefault(parameter, operationParameter); 109 115 return operationParameter; 110 116 } else { 111 - const model = getModel(openApi, schema); 117 + const model = getModel({ definition: schema, openApi }); 112 118 operationParameter.export = model.export; 113 119 operationParameter.type = model.type; 114 120 operationParameter.base = model.base; ··· 125 131 126 132 // If the parameter has a type than it can be a basic or generic type. 127 133 if (parameter.type) { 128 - const definitionType = getType(parameter.type, parameter.format); 134 + const definitionType = getType({ 135 + format: parameter.format, 136 + type: parameter.type, 137 + }); 129 138 operationParameter.export = 'generic'; 130 139 operationParameter.type = definitionType.type; 131 140 operationParameter.base = definitionType.base;
+2 -2
packages/openapi-ts/src/openApi/v2/parser/getOperationResponse.ts
··· 43 43 schema = getRef<OpenApiSchema>(openApi, schema); 44 44 } 45 45 if (schema.$ref) { 46 - const model = getType(schema.$ref); 46 + const model = getType({ type: schema.$ref }); 47 47 operationResponse.export = 'reference'; 48 48 operationResponse.type = model.type; 49 49 operationResponse.base = model.base; ··· 51 51 operationResponse.imports.push(...model.imports); 52 52 return operationResponse; 53 53 } else { 54 - const model = getModel(openApi, schema); 54 + const model = getModel({ definition: schema, openApi }); 55 55 operationResponse.export = model.export; 56 56 operationResponse.type = model.type; 57 57 operationResponse.base = model.base;
+5 -2
packages/openapi-ts/src/openApi/v2/parser/getRequiredPropertiesFromComposition.ts
··· 17 17 .reduce((properties, definition) => { 18 18 if (definition.$ref) { 19 19 const schema = getRef<OpenApiSchema>(openApi, definition); 20 - return [...properties, ...getModel(openApi, schema).properties]; 20 + return [ 21 + ...properties, 22 + ...getModel({ definition: schema, openApi }).properties, 23 + ]; 21 24 } 22 - return [...properties, ...getModel(openApi, definition).properties]; 25 + return [...properties, ...getModel({ definition, openApi }).properties]; 23 26 }, [] as Model[]) 24 27 .filter( 25 28 (property) => !property.isRequired && required.includes(property.name),
+1 -2
packages/openapi-ts/src/openApi/v3/index.ts
··· 17 17 const services = getServices(openApi); 18 18 19 19 return { 20 - enumNames: [], 21 20 models, 22 21 server, 23 - serviceTypes: [], 24 22 services, 23 + types: {}, 25 24 version, 26 25 }; 27 26 };
+29 -13
packages/openapi-ts/src/openApi/v3/parser/__tests__/getModel.spec.ts
··· 1 - import { describe, expect, it } from 'vitest'; 1 + import { describe, expect, it, vi } from 'vitest'; 2 2 3 + import type { Config } from '../../../../types/config'; 3 4 import { reservedWords } from '../../../common/parser/reservedWords'; 4 5 import { getType } from '../../../common/parser/type'; 5 6 import { getModel } from '../getModel'; 7 + 8 + vi.mock('../../../../utils/config', () => { 9 + const config: Partial<Config> = { 10 + types: {}, 11 + }; 12 + return { 13 + getConfig: () => config, 14 + }; 15 + }); 6 16 7 17 const openApi = { 8 18 components: { ··· 80 90 describe('getModel', () => { 81 91 it('Parses any of', () => { 82 92 const definition = openApi.components.schemas.CompositionWithAnyOfAndNull; 83 - const definitionType = getType('CompositionWithAnyOfAndNull'); 84 - const model = getModel( 93 + const definitionType = getType({ type: 'CompositionWithAnyOfAndNull' }); 94 + const model = getModel({ 95 + definition, 96 + isDefinition: true, 97 + meta: { 98 + $ref: '', 99 + name: definitionType.base.replace(reservedWords, '_$1'), 100 + }, 85 101 openApi, 86 - definition, 87 - true, 88 - definitionType.base.replace(reservedWords, '_$1'), 89 - ); 102 + }); 90 103 expect(model.properties[0].properties.length).toBe(2); 91 104 }); 92 105 93 106 it('Parses any of 2', () => { 94 107 const definition = openApi.components.schemas.CompositionWithAny; 95 - const definitionType = getType('CompositionWithAny'); 96 - const model = getModel( 108 + const definitionType = getType({ type: 'CompositionWithAny' }); 109 + const model = getModel({ 110 + definition, 111 + isDefinition: true, 112 + meta: { 113 + $ref: '', 114 + name: definitionType.base.replace(reservedWords, '_$1'), 115 + }, 97 116 openApi, 98 - definition, 99 - true, 100 - definitionType.base.replace(reservedWords, '_$1'), 101 - ); 117 + }); 102 118 expect(model.properties[0].properties.length).toBe(3); 103 119 }); 104 120 });
+24 -14
packages/openapi-ts/src/openApi/v3/parser/getModel.ts
··· 1 - import type { Model } from '../../common/interfaces/client'; 1 + import type { Model, ModelMeta } from '../../common/interfaces/client'; 2 2 import { getDefault } from '../../common/parser/getDefault'; 3 3 import { getEnums } from '../../common/parser/getEnums'; 4 4 import { getPattern } from '../../common/parser/getPattern'; ··· 19 19 isDefinitionNullable, 20 20 } from './inferType'; 21 21 22 - export const getModel = ( 23 - openApi: OpenApi, 24 - definition: OpenApiSchema, 25 - isDefinition: boolean = false, 26 - name: string = '', 27 - parentDefinition: OpenApiSchema | null = null, 28 - ): Model => { 22 + export const getModel = ({ 23 + definition, 24 + isDefinition = false, 25 + meta, 26 + openApi, 27 + parentDefinition = null, 28 + }: { 29 + definition: OpenApiSchema; 30 + isDefinition?: boolean; 31 + meta?: ModelMeta; 32 + openApi: OpenApi; 33 + parentDefinition?: OpenApiSchema | null; 34 + }): Model => { 29 35 const definitionTypes = getDefinitionTypes(definition); 30 36 const inferredType = inferType(definition, definitionTypes); 31 37 ··· 50 56 maxLength: definition.maxLength, 51 57 maxProperties: definition.maxProperties, 52 58 maximum: definition.maximum, 59 + meta, 53 60 minItems: definition.minItems, 54 61 minLength: definition.minLength, 55 62 minProperties: definition.minProperties, 56 63 minimum: definition.minimum, 57 64 multipleOf: definition.multipleOf, 58 - name, 65 + name: meta?.name ?? '', 59 66 pattern: getPattern(definition.pattern), 60 67 properties: [], 61 68 template: null, ··· 64 71 }; 65 72 66 73 if (definition.$ref) { 67 - const definitionRef = getType(definition.$ref); 74 + const definitionRef = getType({ type: definition.$ref }); 68 75 model.$refs = [...model.$refs, definition.$ref]; 69 76 model.base = definitionRef.base; 70 77 model.export = 'reference'; ··· 89 96 90 97 if (definitionTypes.includes('array') && definition.items) { 91 98 if (definition.items.$ref) { 92 - const arrayItems = getType(definition.items.$ref); 99 + const arrayItems = getType({ type: definition.items.$ref }); 93 100 model.$refs = [...model.$refs, definition.items.$ref]; 94 101 model.base = arrayItems.base; 95 102 model.export = 'array'; ··· 108 115 (definition) => !getDefinitionTypes(definition).includes('array'), 109 116 ) 110 117 ) { 111 - return getModel(openApi, definition.items); 118 + return getModel({ definition: definition.items, openApi }); 112 119 } 113 120 } 114 121 ··· 121 128 anyOf: definition.items, 122 129 } 123 130 : definition.items; 124 - const arrayItems = getModel(openApi, arrayItemsDefinition); 131 + const arrayItems = getModel({ definition: arrayItemsDefinition, openApi }); 125 132 model.base = arrayItems.base; 126 133 model.export = 'array'; 127 134 model.$refs = [...model.$refs, ...arrayItems.$refs]; ··· 198 205 199 206 // If the schema has a type than it can be a basic or generic type. 200 207 if (definitionTypes.length) { 201 - const definitionType = getType(definition.type, definition.format); 208 + const definitionType = getType({ 209 + format: definition.format, 210 + type: definition.type, 211 + }); 202 212 model.base = definitionType.base; 203 213 model.export = 'generic'; 204 214 model.$refs = [...model.$refs, ...definitionType.$refs];
+3 -1
packages/openapi-ts/src/openApi/v3/parser/getModelComposition.ts
··· 62 62 const properties: Model[] = []; 63 63 64 64 definitions 65 - .map((def) => getModel(openApi, def, undefined, undefined, definition)) 65 + .map((def) => 66 + getModel({ definition: def, openApi, parentDefinition: definition }), 67 + ) 66 68 .forEach((model) => { 67 69 composition.$refs = [...composition.$refs, ...model.$refs]; 68 70 composition.imports = [...composition.imports, ...model.imports];
+4 -4
packages/openapi-ts/src/openApi/v3/parser/getModelProperties.ts
··· 26 26 typeof definition.additionalProperties === 'object' 27 27 ? definition.additionalProperties 28 28 : {}; 29 - const apModel = getModel(openApi, ap); 29 + const apModel = getModel({ definition: ap, openApi }); 30 30 31 31 if (ap.$ref) { 32 - const apType = getType(ap.$ref); 32 + const apType = getType({ type: ap.$ref }); 33 33 model.base = apType.base; 34 34 model.default = getDefault(definition, model); 35 35 model.export = 'dictionary'; ··· 133 133 type: 'string', 134 134 }); 135 135 } else if (property.$ref) { 136 - const model = getType(property.$ref); 136 + const model = getType({ type: property.$ref }); 137 137 models.push({ 138 138 ...propertyValues, 139 139 $refs: model.$refs, ··· 149 149 type: model.type, 150 150 }); 151 151 } else { 152 - const model = getModel(openApi, property); 152 + const model = getModel({ definition: property, openApi }); 153 153 models.push({ 154 154 ...propertyValues, 155 155 $refs: model.$refs,
+32 -14
packages/openapi-ts/src/openApi/v3/parser/getModels.ts
··· 13 13 14 14 Object.entries(openApi.components.schemas ?? {}).forEach( 15 15 ([definitionName, definition]) => { 16 - const definitionType = getType(definitionName); 17 - const model = getModel( 18 - openApi, 16 + const definitionType = getType({ type: definitionName }); 17 + const model = getModel({ 19 18 definition, 20 - true, 21 - definitionType.base.replace(reservedWords, '_$1'), 22 - ); 19 + isDefinition: true, 20 + meta: { 21 + $ref: `#/components/schemas/${definitionName}`, 22 + name: definitionType.base.replace(reservedWords, '_$1'), 23 + }, 24 + openApi, 25 + }); 23 26 models = [...models, model]; 24 27 }, 25 28 ); ··· 31 34 return; 32 35 } 33 36 34 - const definitionType = getType(definitionName); 35 - const model = getModel( 37 + const definitionType = getType({ type: definitionName }); 38 + const model = getModel({ 39 + definition: schema, 40 + isDefinition: true, 41 + meta: { 42 + $ref: `#/components/parameters/${definitionName}`, 43 + /** 44 + * Prefix parameter names to avoid name conflicts with schemas. 45 + * Assuming people are mostly interested in importing schema types 46 + * and don't care about this name as much. It should be resolved in 47 + * a cleaner way, there just isn't a good deduplication strategy 48 + * today. This is a workaround in the meantime, hopefully reducing 49 + * the chance of conflicts. 50 + * 51 + * Example where this would break: schema named `ParameterFoo` and 52 + * parameter named `Foo` (this would transform to `ParameterFoo`) 53 + * 54 + * Note: there's a related code to this workaround in `getType()` 55 + * method that needs to be cleaned up when this is addressed. 56 + */ 57 + name: `Parameter${definitionType.base.replace(reservedWords, '_$1')}`, 58 + }, 36 59 openApi, 37 - schema, 38 - true, 39 - // prefix parameter names to avoid conflicts, assuming people are mostly 40 - // interested in importing schema types and don't care about this naming 41 - `Parameter${definitionType.base.replace(reservedWords, '_$1')}`, 42 - ); 60 + }); 43 61 model.deprecated = definition.deprecated; 44 62 model.description = definition.description || null; 45 63 models = [...models, model];
+3 -3
packages/openapi-ts/src/openApi/v3/parser/getOperationParameter.ts
··· 38 38 }; 39 39 40 40 if (parameter.$ref) { 41 - const definitionRef = getType(parameter.$ref); 41 + const definitionRef = getType({ type: parameter.$ref }); 42 42 operationParameter.export = 'reference'; 43 43 operationParameter.type = definitionRef.type; 44 44 operationParameter.base = definitionRef.base; ··· 60 60 schema = getRef<OpenApiSchema>(openApi, schema); 61 61 } 62 62 if (schema.$ref) { 63 - const model = getType(schema.$ref); 63 + const model = getType({ type: schema.$ref }); 64 64 operationParameter.export = 'reference'; 65 65 operationParameter.type = model.type; 66 66 operationParameter.base = model.base; ··· 73 73 operationParameter.default = getDefault(schema); 74 74 return operationParameter; 75 75 } else { 76 - const model = getModel(openApi, schema); 76 + const model = getModel({ definition: schema, openApi }); 77 77 operationParameter.export = model.export; 78 78 operationParameter.type = model.type; 79 79 operationParameter.base = model.base;
+2 -2
packages/openapi-ts/src/openApi/v3/parser/getOperationRequestBody.ts
··· 48 48 break; 49 49 } 50 50 if (content.schema.$ref) { 51 - const model = getType(content.schema.$ref); 51 + const model = getType({ type: content.schema.$ref }); 52 52 requestBody.export = 'reference'; 53 53 requestBody.type = model.type; 54 54 requestBody.base = model.base; ··· 57 57 requestBody.imports = [...requestBody.imports, ...model.imports]; 58 58 return requestBody; 59 59 } else { 60 - const model = getModel(openApi, content.schema); 60 + const model = getModel({ definition: content.schema, openApi }); 61 61 requestBody.export = model.export; 62 62 requestBody.type = model.type; 63 63 requestBody.base = model.base;
+2 -2
packages/openapi-ts/src/openApi/v3/parser/getOperationResponse.ts
··· 41 41 content.schema = getRef<OpenApiSchema>(openApi, content.schema); 42 42 } 43 43 if (content.schema.$ref) { 44 - const model = getType(content.schema.$ref); 44 + const model = getType({ type: content.schema.$ref }); 45 45 operationResponse.base = model.base; 46 46 operationResponse.export = 'reference'; 47 47 operationResponse.$refs = [...operationResponse.$refs, ...model.$refs]; ··· 53 53 operationResponse.type = model.type; 54 54 return operationResponse; 55 55 } else { 56 - const model = getModel(openApi, content.schema); 56 + const model = getModel({ definition: content.schema, openApi }); 57 57 operationResponse.export = model.export; 58 58 operationResponse.type = model.type; 59 59 operationResponse.base = model.base;
+5 -2
packages/openapi-ts/src/openApi/v3/parser/getRequiredPropertiesFromComposition.ts
··· 17 17 .reduce((properties, definition) => { 18 18 if (definition.$ref) { 19 19 const schema = getRef<OpenApiSchema>(openApi, definition); 20 - return [...properties, ...getModel(openApi, schema).properties]; 20 + return [ 21 + ...properties, 22 + ...getModel({ definition: schema, openApi }).properties, 23 + ]; 21 24 } 22 - return [...properties, ...getModel(openApi, definition).properties]; 25 + return [...properties, ...getModel({ definition, openApi }).properties]; 23 26 }, [] as Model[]) 24 27 .filter( 25 28 (property) => !property.isRequired && required.includes(property.name),
+5 -4
packages/openapi-ts/src/types/client.ts
··· 1 1 import { Model, Service } from '../openApi'; 2 + import type { ModelMeta } from '../openApi/common/interfaces/client'; 2 3 3 4 export interface Client { 4 - // holds unique enum names to avoid duplicate type exports 5 - enumNames: string[]; 6 5 models: Model[]; 7 6 server: string; 8 7 services: Service[]; 9 - // holds unique service type names to avoid duplicate type exports 10 - serviceTypes: string[]; 8 + /** 9 + * Map of generated types, keys are type names 10 + */ 11 + types: Record<string, ModelMeta>; 11 12 version: string; 12 13 }
-24
packages/openapi-ts/src/utils/enum.ts
··· 1 1 import type { Enum } from '../openApi'; 2 - import type { Client } from '../types/client'; 3 - import { unescapeName } from './escape'; 4 2 import { unique } from './unique'; 5 3 6 4 /** ··· 34 32 key = 'empty_string'; 35 33 } 36 34 return key.toUpperCase(); 37 - }; 38 - 39 - /** 40 - * Enums can't contain hyphens in their name. Additionally, name might've been 41 - * already escaped, so we need to remove quotes around it. 42 - * {@link https://github.com/ferdikoomen/openapi-typescript-codegen/issues/1969} 43 - */ 44 - export const enumName = (client: Client, name?: string) => { 45 - if (!name) { 46 - return null; 47 - } 48 - const escapedName = unescapeName(name).replace( 49 - /[-_]([a-z])/gi, 50 - ($0, $1: string) => $1.toLocaleUpperCase(), 51 - ); 52 - const result = 53 - escapedName.charAt(0).toLocaleUpperCase() + escapedName.slice(1); 54 - if (client.enumNames.includes(result)) { 55 - return null; 56 - } 57 - client.enumNames = [...client.enumNames, result]; 58 - return result; 59 35 }; 60 36 61 37 export const enumUnionType = (enums: Enum[]) =>
+1 -2
packages/openapi-ts/src/utils/postprocess.ts
··· 10 10 export function postProcessClient(client: Client): Client { 11 11 return { 12 12 ...client, 13 - enumNames: [], 14 13 models: client.models.map((model) => postProcessModel(model)), 15 - serviceTypes: [], 16 14 services: client.services.map((service) => postProcessService(service)), 15 + types: {}, 17 16 }; 18 17 } 19 18
+1 -2
packages/openapi-ts/src/utils/write/__tests__/class.spec.ts
··· 30 30 }); 31 31 32 32 const client: Parameters<typeof writeClientClass>[2] = { 33 - enumNames: [], 34 33 models: [], 35 34 server: 'http://localhost:8080', 36 - serviceTypes: [], 37 35 services: [], 36 + types: {}, 38 37 version: 'v1', 39 38 }; 40 39
+1 -2
packages/openapi-ts/src/utils/write/__tests__/client.spec.ts
··· 29 29 }); 30 30 31 31 const client: Parameters<typeof writeClient>[1] = { 32 - enumNames: [], 33 32 models: [], 34 33 server: 'http://localhost:8080', 35 - serviceTypes: [], 36 34 services: [], 35 + types: {}, 37 36 version: 'v1', 38 37 }; 39 38
+3 -6
packages/openapi-ts/src/utils/write/__tests__/core.spec.ts
··· 17 17 18 18 it('writes to filesystem', async () => { 19 19 const client: Parameters<typeof writeCore>[1] = { 20 - enumNames: [], 21 20 models: [], 22 21 server: 'http://localhost:8080', 23 - serviceTypes: [], 24 22 services: [], 23 + types: {}, 25 24 version: '1.0', 26 25 }; 27 26 ··· 73 72 74 73 it('uses client server value for base', async () => { 75 74 const client: Parameters<typeof writeCore>[1] = { 76 - enumNames: [], 77 75 models: [], 78 76 server: 'http://localhost:8080', 79 - serviceTypes: [], 80 77 services: [], 78 + types: {}, 81 79 version: '1.0', 82 80 }; 83 81 ··· 111 109 112 110 it('uses custom value for base', async () => { 113 111 const client: Parameters<typeof writeCore>[1] = { 114 - enumNames: [], 115 112 models: [], 116 113 server: 'http://localhost:8080', 117 - serviceTypes: [], 118 114 services: [], 115 + types: {}, 119 116 version: '1.0', 120 117 }; 121 118
+5 -2
packages/openapi-ts/src/utils/write/__tests__/models.spec.ts
··· 30 30 }); 31 31 32 32 const client: Parameters<typeof processTypes>[0]['client'] = { 33 - enumNames: [], 34 33 models: [ 35 34 { 36 35 $refs: [], ··· 45 44 isReadOnly: false, 46 45 isRequired: false, 47 46 link: null, 47 + meta: { 48 + $ref: '#/components/schemas/User', 49 + name: 'User', 50 + }, 48 51 name: 'User', 49 52 properties: [], 50 53 template: null, ··· 52 55 }, 53 56 ], 54 57 server: 'http://localhost:8080', 55 - serviceTypes: [], 56 58 services: [], 59 + types: {}, 57 60 version: 'v1', 58 61 }; 59 62
+1 -2
packages/openapi-ts/src/utils/write/__tests__/services.spec.ts
··· 27 27 }); 28 28 29 29 const client: Parameters<typeof processServices>[0]['client'] = { 30 - enumNames: [], 31 30 models: [], 32 31 server: 'http://localhost:8080', 33 - serviceTypes: [], 34 32 services: [ 35 33 { 36 34 $refs: [], ··· 39 37 operations: [], 40 38 }, 41 39 ], 40 + types: {}, 42 41 version: 'v1', 43 42 }; 44 43
+8
packages/openapi-ts/src/utils/write/schemas.ts
··· 23 23 'x-enum-descriptions', 24 24 'x-enum-varnames', 25 25 'x-enumNames', 26 + 'title', 26 27 ].includes(key) 27 28 ) { 28 29 // @ts-ignore 29 30 delete result[key]; 30 31 return; 31 32 } 33 + } 34 + 35 + // refs are encoded probably by json-schema-ref-parser, didn't investigate 36 + // further 37 + if (key === '$ref' && typeof value === 'string') { 38 + // @ts-ignore 39 + result[key] = decodeURIComponent(value); 32 40 } 33 41 34 42 if (value && typeof value === 'object') {
+93 -20
packages/openapi-ts/src/utils/write/services.ts
··· 8 8 TypeScriptFile, 9 9 } from '../../compiler'; 10 10 import type { ObjectValue } from '../../compiler/types'; 11 - import type { Operation, OperationParameter, Service } from '../../openApi'; 11 + import type { 12 + Model, 13 + Operation, 14 + OperationParameter, 15 + Service, 16 + } from '../../openApi'; 12 17 import type { Client } from '../../types/client'; 13 18 import { getConfig } from '../config'; 14 19 import { escapeComment, escapeName } from '../escape'; 15 20 import { modelIsRequired } from '../required'; 16 21 import { transformServiceName } from '../transform'; 17 22 import { unique } from '../unique'; 23 + import { uniqueTypeName } from './type'; 18 24 19 25 type OnNode = (node: Node) => void; 20 26 type OnImport = (importedType: string) => void; 21 27 22 - export const operationDataTypeName = (operation: Operation) => 23 - `${camelcase(operation.name, { pascalCase: true })}Data`; 28 + const generateImport = ({ 29 + meta, 30 + onImport, 31 + ...uniqueTypeNameArgs 32 + }: Pick<Parameters<typeof uniqueTypeName>[0], 'client' | 'nameTransformer'> & 33 + Pick<Model, 'meta'> & { 34 + onImport: OnImport; 35 + }) => { 36 + // generate imports only for top-level models 37 + if (!meta) { 38 + return; 39 + } 40 + 41 + const { name } = uniqueTypeName({ meta, ...uniqueTypeNameArgs }); 42 + onImport(name); 43 + }; 44 + 45 + export const operationDataTypeName = (name: string) => 46 + `${camelcase(name, { pascalCase: true })}Data`; 24 47 25 - export const operationResponseTypeName = (operation: Operation) => 26 - `${camelcase(operation.name, { pascalCase: true })}Response`; 48 + export const operationResponseTypeName = (name: string) => 49 + `${camelcase(name, { pascalCase: true })}Response`; 27 50 28 - const toOperationParamType = (operation: Operation): FunctionParameter[] => { 51 + const toOperationParamType = ( 52 + client: Client, 53 + operation: Operation, 54 + ): FunctionParameter[] => { 29 55 if (!operation.parameters.length) { 30 56 return []; 31 57 } 32 58 33 59 const config = getConfig(); 34 60 35 - const importedType = operationDataTypeName(operation); 61 + const { name: importedType } = uniqueTypeName({ 62 + client, 63 + meta: { 64 + // TODO: this should be exact ref to operation for consistency, 65 + // but name should work too as operation ID is unique 66 + $ref: operation.name, 67 + name: operation.name, 68 + }, 69 + nameTransformer: operationDataTypeName, 70 + }); 36 71 37 72 if (config.useOptions) { 38 73 const isRequired = operation.parameters.some( ··· 58 93 }); 59 94 }; 60 95 61 - const toOperationReturnType = (operation: Operation) => { 96 + const toOperationReturnType = (client: Client, operation: Operation) => { 62 97 const config = getConfig(); 63 98 64 99 let returnType = compiler.typedef.basic('void'); ··· 67 102 // can't remove this logic without removing request/name config 68 103 // as it complicates things 69 104 if (operation.results.length) { 70 - const importedType = operationResponseTypeName(operation); 105 + const { name: importedType } = uniqueTypeName({ 106 + client, 107 + meta: { 108 + // TODO: this should be exact ref to operation for consistency, 109 + // but name should work too as operation ID is unique 110 + $ref: operation.name, 111 + name: operation.name, 112 + }, 113 + nameTransformer: operationResponseTypeName, 114 + }); 71 115 returnType = compiler.typedef.union([importedType]); 72 116 } 73 117 ··· 217 261 }); 218 262 }; 219 263 220 - const toOperationStatements = (operation: Operation) => { 264 + const toOperationStatements = (client: Client, operation: Operation) => { 221 265 const config = getConfig(); 222 266 223 267 const options = toRequestOptions(operation); 224 268 225 269 if (config.client.startsWith('@hey-api')) { 226 270 const returnType = operation.results.length 227 - ? operationResponseTypeName(operation) 271 + ? uniqueTypeName({ 272 + client, 273 + meta: { 274 + // TODO: this should be exact ref to operation for consistency, 275 + // but name should work too as operation ID is unique 276 + $ref: operation.name, 277 + name: operation.name, 278 + }, 279 + nameTransformer: operationResponseTypeName, 280 + }).name 228 281 : 'void'; 229 282 return [ 230 283 compiler.return.functionCall({ ··· 262 315 }; 263 316 264 317 export const processService = ( 318 + client: Client, 265 319 service: Service, 266 320 onNode: OnNode, 267 321 onImport: OnImport, ··· 270 324 271 325 service.operations.forEach((operation) => { 272 326 if (operation.parameters.length) { 273 - const importedType = operationDataTypeName(operation); 274 - onImport(importedType); 327 + generateImport({ 328 + client, 329 + meta: { 330 + // TODO: this should be exact ref to operation for consistency, 331 + // but name should work too as operation ID is unique 332 + $ref: operation.name, 333 + name: operation.name, 334 + }, 335 + nameTransformer: operationDataTypeName, 336 + onImport, 337 + }); 275 338 } 276 339 277 340 if (operation.results.length) { 278 - const importedType = operationResponseTypeName(operation); 279 - onImport(importedType); 341 + generateImport({ 342 + client, 343 + meta: { 344 + // TODO: this should be exact ref to operation for consistency, 345 + // but name should work too as operation ID is unique 346 + $ref: operation.name, 347 + name: operation.name, 348 + }, 349 + nameTransformer: operationResponseTypeName, 350 + onImport, 351 + }); 280 352 } 281 353 }); 282 354 283 355 if (config.client.startsWith('@hey-api')) { 284 356 service.operations.forEach((operation) => { 285 357 const expression = compiler.types.function({ 286 - parameters: toOperationParamType(operation), 287 - statements: toOperationStatements(operation), 358 + parameters: toOperationParamType(client, operation), 359 + statements: toOperationStatements(client, operation), 288 360 }); 289 361 const statement = compiler.export.const({ 290 362 comment: toOperationComment(operation), ··· 302 374 comment: toOperationComment(operation), 303 375 isStatic: config.name === undefined && config.client !== 'angular', 304 376 name: operation.name, 305 - parameters: toOperationParamType(operation), 306 - returnType: toOperationReturnType(operation), 307 - statements: toOperationStatements(operation), 377 + parameters: toOperationParamType(client, operation), 378 + returnType: toOperationReturnType(client, operation), 379 + statements: toOperationStatements(client, operation), 308 380 }); 309 381 return node; 310 382 }); ··· 368 440 369 441 for (const service of client.services) { 370 442 processService( 443 + client, 371 444 service, 372 445 (node) => { 373 446 files.services?.add(node);
+59 -9
packages/openapi-ts/src/utils/write/type.ts
··· 1 1 import { compiler, type Property, type TypeNode } from '../../compiler'; 2 - import { Model } from '../../openApi'; 2 + import type { Model } from '../../openApi'; 3 + import type { Client } from '../../types/client'; 3 4 import { getConfig } from '../config'; 4 5 import { enumValue } from '../enum'; 5 6 import { escapeComment } from '../escape'; 6 7 import { modelIsRequired } from '../required'; 7 - import { transformTypeName } from '../transform'; 8 8 import { unique } from '../unique'; 9 9 10 10 const base = (model: Model) => { ··· 16 16 17 17 if (config.types.dates && model.format === 'date-time') { 18 18 return compiler.typedef.basic('Date'); 19 - } 20 - 21 - // transform root level model names 22 - if (model.base === model.type && model.$refs.length) { 23 - if (model.$refs.some((ref) => ref.endsWith(model.base))) { 24 - return compiler.typedef.basic(transformTypeName(model.base)); 25 - } 26 19 } 27 20 28 21 return compiler.typedef.basic(model.base); ··· 135 128 return typeReference(model); 136 129 } 137 130 }; 131 + 132 + interface UniqueTypeNameResult { 133 + /** 134 + * Did this function add a new property to the `client.types` object? 135 + */ 136 + created: boolean; 137 + /** 138 + * Unique name for the exported type. 139 + */ 140 + name: string; 141 + } 142 + 143 + /** 144 + * Generates a unique name for the exported type for given model meta. 145 + * @param args.client Internal client instance 146 + * @param args.count Unique key for deduplication 147 + * @param args.meta Meta property from the model 148 + * @param args.nameTransformer Function for transforming name into the final 149 + * value. In different contexts, a different strategy might be used. For 150 + * example, slashes `/` are invalid in TypeScript identifiers, but okay in 151 + * a JavaScript object key name. 152 + * @returns {UniqueTypeNameResult} 153 + */ 154 + export const uniqueTypeName = ({ 155 + client, 156 + count = 1, 157 + meta, 158 + nameTransformer, 159 + }: Pick<Required<Model>, 'meta'> & { 160 + client: Client; 161 + count?: number; 162 + nameTransformer?: (value: string) => string; 163 + }): UniqueTypeNameResult => { 164 + let result: UniqueTypeNameResult = { 165 + created: false, 166 + name: meta.name, 167 + }; 168 + if (nameTransformer) { 169 + result.name = nameTransformer(result.name); 170 + } 171 + if (count > 1) { 172 + result.name = `${result.name}${count}`; 173 + } 174 + const type = client.types[result.name]; 175 + if (!type) { 176 + client.types[result.name] = meta; 177 + result.created = true; 178 + } else if (type.$ref !== meta.$ref) { 179 + result = uniqueTypeName({ 180 + client, 181 + count: count + 1, 182 + meta, 183 + nameTransformer, 184 + }); 185 + } 186 + return result; 187 + };
+140 -79
packages/openapi-ts/src/utils/write/types.ts
··· 5 5 TypeScriptFile, 6 6 } from '../../compiler'; 7 7 import type { Model, OperationParameter, Service } from '../../openApi'; 8 - import { ensureValidTypeScriptJavaScriptIdentifier } from '../../openApi/common/parser/sanitize'; 9 8 import type { Client } from '../../types/client'; 10 9 import { getConfig } from '../config'; 11 - import { enumKey, enumName, enumUnionType, enumValue } from '../enum'; 10 + import { enumKey, enumUnionType, enumValue } from '../enum'; 12 11 import { escapeComment } from '../escape'; 13 12 import { sortByName, sorterByName } from '../sort'; 14 - import { transformTypeName } from '../transform'; 15 13 import { operationDataTypeName, operationResponseTypeName } from './services'; 16 - import { toType } from './type'; 14 + import { toType, uniqueTypeName } from './type'; 17 15 18 16 type OnNode = (node: Node) => void; 19 17 ··· 38 36 type: '', 39 37 }; 40 38 39 + const generateEnum = ({ 40 + leadingComment, 41 + comments, 42 + meta, 43 + obj, 44 + onNode, 45 + ...uniqueTypeNameArgs 46 + }: Omit<Parameters<typeof compiler.types.enum>[0], 'name'> & 47 + Pick<Parameters<typeof uniqueTypeName>[0], 'client' | 'nameTransformer'> & 48 + Pick<Model, 'meta'> & { 49 + onNode: OnNode; 50 + }) => { 51 + // generate types only for top-level models 52 + if (!meta) { 53 + return; 54 + } 55 + 56 + const { created, name } = uniqueTypeName({ meta, ...uniqueTypeNameArgs }); 57 + if (created) { 58 + const node = compiler.types.enum({ 59 + comments, 60 + leadingComment, 61 + name, 62 + obj, 63 + }); 64 + onNode(node); 65 + } 66 + }; 67 + 68 + const generateType = ({ 69 + comment, 70 + meta, 71 + onCreated, 72 + onNode, 73 + type, 74 + ...uniqueTypeNameArgs 75 + }: Omit<Parameters<typeof compiler.typedef.alias>[0], 'name'> & 76 + Pick<Parameters<typeof uniqueTypeName>[0], 'client' | 'nameTransformer'> & 77 + Pick<Model, 'meta'> & { 78 + onCreated?: (name: string) => void; 79 + onNode: OnNode; 80 + }) => { 81 + // generate types only for top-level models 82 + if (!meta) { 83 + return; 84 + } 85 + 86 + const { created, name } = uniqueTypeName({ meta, ...uniqueTypeNameArgs }); 87 + if (created) { 88 + const node = compiler.typedef.alias({ comment, name, type }); 89 + onNode(node); 90 + 91 + onCreated?.(name); 92 + } 93 + }; 94 + 41 95 const processComposition = (client: Client, model: Model, onNode: OnNode) => { 42 96 processType(client, model, onNode); 43 97 model.enums.forEach((enumerator) => processEnum(client, enumerator, onNode)); ··· 67 121 } 68 122 }); 69 123 70 - // ignore duplicate enum names 71 - const name = enumName(client, model.name)!; 72 - if (name === null) { 73 - return; 74 - } 75 - 76 124 const comment = [ 77 125 model.description && escapeComment(model.description), 78 126 model.deprecated && '@deprecated', 79 127 ]; 80 128 81 - if (config.types.enums !== 'typescript') { 82 - const node = compiler.typedef.alias( 83 - ensureValidTypeScriptJavaScriptIdentifier(model.name), 84 - enumUnionType(model.enum), 85 - comment, 86 - ); 87 - onNode(node); 88 - } 89 - 90 129 if (config.types.enums === 'typescript') { 91 - const node = compiler.types.enum({ 130 + generateEnum({ 131 + client, 92 132 comments, 93 133 leadingComment: comment, 94 - name, 134 + meta: model.meta, 95 135 obj: properties, 136 + onNode, 96 137 }); 97 - onNode(node); 138 + return; 98 139 } 99 140 100 - if (config.types.enums === 'javascript') { 101 - const expression = compiler.types.object({ 102 - comments, 103 - leadingComment: comment, 104 - multiLine: true, 105 - obj: properties, 106 - unescape: true, 107 - }); 108 - const node = compiler.export.const({ 109 - constAssertion: true, 110 - expression, 111 - name, 112 - }); 113 - onNode(node); 114 - } 141 + generateType({ 142 + client, 143 + comment, 144 + meta: model.meta, 145 + onCreated: (name) => { 146 + // create a separate JavaScript object export 147 + if (config.types.enums === 'javascript') { 148 + const expression = compiler.types.object({ 149 + comments, 150 + multiLine: true, 151 + obj: properties, 152 + unescape: true, 153 + }); 154 + const node = compiler.export.const({ 155 + comment, 156 + constAssertion: true, 157 + expression, 158 + name, 159 + }); 160 + onNode(node); 161 + } 162 + }, 163 + onNode, 164 + type: enumUnionType(model.enum), 165 + }); 115 166 }; 116 167 117 168 const processType = (client: Client, model: Model, onNode: OnNode) => { 118 - const comment = [ 119 - model.description && escapeComment(model.description), 120 - model.deprecated && '@deprecated', 121 - ]; 122 - const node = compiler.typedef.alias( 123 - transformTypeName(model.name), 124 - toType(model), 125 - comment, 126 - ); 127 - onNode(node); 169 + generateType({ 170 + client, 171 + comment: [ 172 + model.description && escapeComment(model.description), 173 + model.deprecated && '@deprecated', 174 + ], 175 + meta: model.meta, 176 + onNode, 177 + type: toType(model), 178 + }); 128 179 }; 129 180 130 181 const processModel = (client: Client, model: Model, onNode: OnNode) => { ··· 239 290 methodMap.set('req', operationProperties); 240 291 241 292 // create type export for operation data 242 - const name = operationDataTypeName(operation); 243 - if (!client.serviceTypes.includes(name)) { 244 - client.serviceTypes = [...client.serviceTypes, name]; 245 - const type = toType({ 293 + generateType({ 294 + client, 295 + meta: { 296 + // TODO: this should be exact ref to operation for consistency, 297 + // but name should work too as operation ID is unique 298 + $ref: operation.name, 299 + name: operation.name, 300 + }, 301 + nameTransformer: operationDataTypeName, 302 + onNode, 303 + type: toType({ 246 304 ...emptyModel, 247 305 isRequired: true, 248 306 properties: operationProperties, 249 - }); 250 - const node = compiler.typedef.alias(name, type); 251 - onNode(node); 252 - } 307 + }), 308 + }); 253 309 } 254 310 255 311 if (hasRes) { ··· 268 324 }); 269 325 270 326 // create type export for operation response 271 - const name = operationResponseTypeName(operation); 272 - if (!client.serviceTypes.includes(name)) { 273 - client.serviceTypes = [...client.serviceTypes, name]; 274 - let responseProperties: Model[] = []; 275 - operation.results.map((result) => { 276 - if ( 277 - result.code === 'default' || 278 - (result.code >= 200 && result.code < 300) 279 - ) { 280 - responseProperties = [...responseProperties, result]; 281 - } 282 - }); 283 - const type = toType({ 327 + generateType({ 328 + client, 329 + meta: { 330 + // TODO: this should be exact ref to operation for consistency, 331 + // but name should work too as operation ID is unique 332 + $ref: operation.name, 333 + name: operation.name, 334 + }, 335 + nameTransformer: operationResponseTypeName, 336 + onNode, 337 + type: toType({ 284 338 ...emptyModel, 285 339 export: 'any-of', 286 340 isRequired: true, 287 - properties: responseProperties, 288 - }); 289 - const node = compiler.typedef.alias(name, type); 290 - onNode(node); 291 - } 341 + properties: operation.results.filter( 342 + (result) => 343 + result.code === 'default' || 344 + (result.code >= 200 && result.code < 300), 345 + ), 346 + }), 347 + }); 292 348 } 293 349 294 350 if (hasErr) { ··· 353 409 return pathKey; 354 410 }); 355 411 356 - const type = toType({ 357 - ...emptyModel, 358 - properties, 412 + generateType({ 413 + client, 414 + meta: { 415 + $ref: '@hey-api/openapi-ts', 416 + name: serviceExportedNamespace(), 417 + }, 418 + onNode, 419 + type: toType({ 420 + ...emptyModel, 421 + properties, 422 + }), 359 423 }); 360 - const namespace = serviceExportedNamespace(); 361 - const node = compiler.typedef.alias(namespace, type); 362 - onNode(node); 363 424 }; 364 425 365 426 export const processTypes = async ({
+51
packages/openapi-ts/test/__snapshots__/test/generated/v2/types.gen.ts.snap
··· 79 79 export type EnumWithStrings = 'Success' | 'Warning' | 'Error' | "'Single Quote'" | '"Double Quotes"' | 'Non-ascii: øæåôöØÆÅÔÖ字符串'; 80 80 81 81 /** 82 + * This is a simple enum with strings 83 + */ 84 + export const EnumWithStrings = { 85 + SUCCESS: 'Success', 86 + WARNING: 'Warning', 87 + ERROR: 'Error', 88 + _SINGLE_QUOTE_: "'Single Quote'", 89 + _DOUBLE_QUOTES_: '"Double Quotes"', 90 + 'NON_ASCII__ØÆÅÔÖ_ØÆÅÔÖ字符串': 'Non-ascii: øæåôöØÆÅÔÖ字符串' 91 + } as const; 92 + 93 + /** 82 94 * This is a simple enum with numbers 83 95 */ 84 96 export type EnumWithNumbers = 1 | 2 | 3 | 1.1 | 1.2 | 1.3 | 100 | 200 | 300 | -100 | -200 | -300 | -1.1 | -1.2 | -1.3; 85 97 86 98 /** 99 + * This is a simple enum with numbers 100 + */ 101 + export const EnumWithNumbers = { 102 + '_1': 1, 103 + '_2': 2, 104 + '_3': 3, 105 + '_1.1': 1.1, 106 + '_1.2': 1.2, 107 + '_1.3': 1.3, 108 + '_100': 100, 109 + '_200': 200, 110 + '_300': 300, 111 + '_-100': -100, 112 + '_-200': -200, 113 + '_-300': -300, 114 + '_-1.1': -1.1, 115 + '_-1.2': -1.2, 116 + '_-1.3': -1.3 117 + } as const; 118 + 119 + /** 87 120 * Success=1,Warning=2,Error=3 88 121 */ 89 122 export type EnumFromDescription = number; ··· 92 125 * This is a simple enum with numbers 93 126 */ 94 127 export type EnumWithExtensions = 200 | 400 | 500; 128 + 129 + /** 130 + * This is a simple enum with numbers 131 + */ 132 + export const EnumWithExtensions = { 133 + /** 134 + * Used when the status of something is successful 135 + */ 136 + CUSTOM_SUCCESS: 200, 137 + /** 138 + * Used when the status of something has a warning 139 + */ 140 + CUSTOM_WARNING: 400, 141 + /** 142 + * Used when the status of something has an error 143 + */ 144 + CUSTOM_ERROR: 500 145 + } as const; 95 146 96 147 /** 97 148 * This is a simple array with numbers
+28 -3
packages/openapi-ts/test/__snapshots__/test/generated/v3/schemas.gen.ts.snap
··· 764 764 } 765 765 } as const; 766 766 767 - export const $Enum1 = { 767 + export const $e_num_1Период = { 768 768 enum: ['Bird', 'Dog'], 769 769 type: 'string' 770 770 } as const; ··· 784 784 items: { 785 785 anyOf: [ 786 786 { 787 - '$ref': '#/components/schemas/Enum1' 787 + '$ref': '#/components/schemas/3e-num_1Период' 788 788 }, 789 789 { 790 790 '$ref': '#/components/schemas/ConstValue' ··· 1367 1367 required: ['bar'], 1368 1368 properties: { 1369 1369 bar: { 1370 - '$ref': '#/components/schemas/NonAsciiString%C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85%C3%B6%C3%B4%C3%AA%C3%8A%E5%AD%97%E7%AC%A6%E4%B8%B2' 1370 + '$ref': '#/components/schemas/NonAsciiStringæøåÆØÅöôêÊ字符串' 1371 1371 } 1372 1372 }, 1373 1373 additionalProperties: false ··· 1685 1685 </pre>` 1686 1686 } 1687 1687 } 1688 + } as const; 1689 + 1690 + export const $ParameterSimpleParameterUnused = { 1691 + description: 'Model used to test deduplication strategy (unused)', 1692 + type: 'string' 1693 + } as const; 1694 + 1695 + export const $PostServiceWithEmptyTagResponse = { 1696 + description: 'Model used to test deduplication strategy', 1697 + type: 'string' 1698 + } as const; 1699 + 1700 + export const $PostServiceWithEmptyTagResponse2 = { 1701 + description: 'Model used to test deduplication strategy', 1702 + type: 'string' 1703 + } as const; 1704 + 1705 + export const $DeleteFooData = { 1706 + description: 'Model used to test deduplication strategy', 1707 + type: 'string' 1708 + } as const; 1709 + 1710 + export const $DeleteFooData2 = { 1711 + description: 'Model used to test deduplication strategy', 1712 + type: 'string' 1688 1713 } as const;
+3 -3
packages/openapi-ts/test/__snapshots__/test/generated/v3/services.gen.ts.snap
··· 3 3 import type { CancelablePromise } from './core/CancelablePromise'; 4 4 import { OpenAPI } from './core/OpenAPI'; 5 5 import { request as __request } from './core/request'; 6 - import type { PostServiceWithEmptyTagData, PostServiceWithEmptyTagResponse, ApiVversionOdataControllerCountResponse, DeleteFooData, CallWithParametersData, CallWithWeirdParameterNamesData, GetCallWithOptionalParamData, PostCallWithOptionalParamData, CallWithDescriptionsData, DeprecatedCallData, PostApiRequestBodyData, PostApiFormDataData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, CallWithNoContentResponseResponse, CallWithResponseAndNoContentResponseResponse, CallWithResponseResponse, CallWithDuplicateResponsesResponse, CallWithResponsesResponse, DummyAResponse, DummyBResponse, CollectionFormatData, TypesData, TypesResponse, UploadFileData, UploadFileResponse, FileResponseData, FileResponseResponse, ComplexTypesData, ComplexTypesResponse, ComplexParamsData, ComplexParamsResponse, MultipartRequestData, MultipartResponseResponse, CallWithResultFromHeaderResponse, TestErrorCodeData, TestErrorCodeResponse, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response } from './types.gen'; 6 + import type { PostServiceWithEmptyTagData, PostServiceWithEmptyTagResponse3, ApiVversionOdataControllerCountResponse, DeleteFooData3, CallWithParametersData, CallWithWeirdParameterNamesData, GetCallWithOptionalParamData, PostCallWithOptionalParamData, CallWithDescriptionsData, DeprecatedCallData, PostApiRequestBodyData, PostApiFormDataData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, CallWithNoContentResponseResponse, CallWithResponseAndNoContentResponseResponse, CallWithResponseResponse, CallWithDuplicateResponsesResponse, CallWithResponsesResponse, DummyAResponse, DummyBResponse, CollectionFormatData, TypesData, TypesResponse, UploadFileData, UploadFileResponse, FileResponseData, FileResponseResponse, ComplexTypesData, ComplexTypesResponse, ComplexParamsData, ComplexParamsResponse, MultipartRequestData, MultipartResponseResponse, CallWithResultFromHeaderResponse, TestErrorCodeData, TestErrorCodeResponse, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response } from './types.gen'; 7 7 8 8 export class DefaultService { 9 9 /** ··· 22 22 * @returns ModelWithReadOnlyAndWriteOnly 23 23 * @throws ApiError 24 24 */ 25 - public static postServiceWithEmptyTag(data: PostServiceWithEmptyTagData): CancelablePromise<PostServiceWithEmptyTagResponse> { 25 + public static postServiceWithEmptyTag(data: PostServiceWithEmptyTagData): CancelablePromise<PostServiceWithEmptyTagResponse3> { 26 26 return __request(OpenAPI, { 27 27 method: 'POST', 28 28 url: '/api/v{api-version}/no-tag', ··· 124 124 * @param data.bar bar in method 125 125 * @throws ApiError 126 126 */ 127 - public static deleteFoo(data: DeleteFooData): CancelablePromise<void> { 127 + public static deleteFoo(data: DeleteFooData3): CancelablePromise<void> { 128 128 return __request(OpenAPI, { 129 129 method: 'DELETE', 130 130 url: '/api/v{api-version}/foo/{foo}/bar/{bar}',
+109 -4
packages/openapi-ts/test/__snapshots__/test/generated/v3/types.gen.ts.snap
··· 86 86 */ 87 87 export type EnumWithStrings = 'Success' | 'Warning' | 'Error' | "'Single Quote'" | '"Double Quotes"' | 'Non-ascii: øæåôöØÆÅÔÖ字符串'; 88 88 89 + /** 90 + * This is a simple enum with strings 91 + */ 92 + export const EnumWithStrings = { 93 + SUCCESS: 'Success', 94 + WARNING: 'Warning', 95 + ERROR: 'Error', 96 + _SINGLE_QUOTE_: "'Single Quote'", 97 + _DOUBLE_QUOTES_: '"Double Quotes"', 98 + 'NON_ASCII__ØÆÅÔÖ_ØÆÅÔÖ字符串': 'Non-ascii: øæåôöØÆÅÔÖ字符串' 99 + } as const; 100 + 89 101 export type EnumWithReplacedCharacters = "'Single Quote'" | '"Double Quotes"' | 'øæåôöØÆÅÔÖ字符串' | 3.1 | ''; 90 102 103 + export const EnumWithReplacedCharacters = { 104 + _SINGLE_QUOTE_: "'Single Quote'", 105 + _DOUBLE_QUOTES_: '"Double Quotes"', 106 + 'ØÆÅÔÖ_ØÆÅÔÖ字符串': 'øæåôöØÆÅÔÖ字符串', 107 + '_3.1': 3.1, 108 + EMPTY_STRING: '' 109 + } as const; 110 + 91 111 /** 92 112 * This is a simple enum with numbers 93 113 */ 94 114 export type EnumWithNumbers = 1 | 2 | 3 | 1.1 | 1.2 | 1.3 | 100 | 200 | 300 | -100 | -200 | -300 | -1.1 | -1.2 | -1.3; 95 115 96 116 /** 117 + * This is a simple enum with numbers 118 + */ 119 + export const EnumWithNumbers = { 120 + '_1': 1, 121 + '_2': 2, 122 + '_3': 3, 123 + '_1.1': 1.1, 124 + '_1.2': 1.2, 125 + '_1.3': 1.3, 126 + '_100': 100, 127 + '_200': 200, 128 + '_300': 300, 129 + '_-100': -100, 130 + '_-200': -200, 131 + '_-300': -300, 132 + '_-1.1': -1.1, 133 + '_-1.2': -1.2, 134 + '_-1.3': -1.3 135 + } as const; 136 + 137 + /** 97 138 * Success=1,Warning=2,Error=3 98 139 */ 99 140 export type EnumFromDescription = number; ··· 103 144 */ 104 145 export type EnumWithExtensions = 200 | 400 | 500; 105 146 147 + /** 148 + * This is a simple enum with numbers 149 + */ 150 + export const EnumWithExtensions = { 151 + /** 152 + * Used when the status of something is successful 153 + */ 154 + CUSTOM_SUCCESS: 200, 155 + /** 156 + * Used when the status of something has a warning 157 + */ 158 + CUSTOM_WARNING: 400, 159 + /** 160 + * Used when the status of something has an error 161 + */ 162 + CUSTOM_ERROR: 500 163 + } as const; 164 + 106 165 export type EnumWithXEnumNames = 0 | 1 | 2; 166 + 167 + export const EnumWithXEnumNames = { 168 + zero: 0, 169 + one: 1, 170 + two: 2 171 + } as const; 107 172 108 173 /** 109 174 * This is a simple array with numbers ··· 445 510 propA?: Array<(ModelWithDictionary | null)> | Array<(ModelWithArray | null)>; 446 511 }; 447 512 448 - export type Enum1 = 'Bird' | 'Dog'; 513 + export type e_num_1Период = 'Bird' | 'Dog'; 514 + 515 + export const e_num_1Период = { 516 + BIRD: 'Bird', 517 + DOG: 'Dog' 518 + } as const; 449 519 450 520 export type ConstValue = "ConstValue"; 451 521 ··· 453 523 * This is a model with one property with a 'any of' relationship where the options are not $ref 454 524 */ 455 525 export type CompositionWithNestedAnyOfAndNull = { 456 - propA?: Array<(Enum1 | ConstValue)> | null; 526 + propA?: Array<(e_num_1Период | ConstValue)> | null; 457 527 }; 458 528 459 529 /** ··· 718 788 719 789 export type ModelWithNestedArrayEnumsDataFoo = 'foo' | 'bar'; 720 790 791 + export const ModelWithNestedArrayEnumsDataFoo = { 792 + FOO: 'foo', 793 + BAR: 'bar' 794 + } as const; 795 + 721 796 export type ModelWithNestedArrayEnumsDataBar = 'baz' | 'qux'; 797 + 798 + export const ModelWithNestedArrayEnumsDataBar = { 799 + BAZ: 'baz', 800 + QUX: 'qux' 801 + } as const; 722 802 723 803 export type ModelWithNestedArrayEnumsData = { 724 804 foo?: Array<ModelWithNestedArrayEnumsDataFoo>; ··· 811 891 }; 812 892 813 893 /** 894 + * Model used to test deduplication strategy (unused) 895 + */ 896 + export type ParameterSimpleParameterUnused = string; 897 + 898 + /** 899 + * Model used to test deduplication strategy 900 + */ 901 + export type PostServiceWithEmptyTagResponse = string; 902 + 903 + /** 904 + * Model used to test deduplication strategy 905 + */ 906 + export type PostServiceWithEmptyTagResponse2 = string; 907 + 908 + /** 909 + * Model used to test deduplication strategy 910 + */ 911 + export type DeleteFooData = string; 912 + 913 + /** 914 + * Model used to test deduplication strategy 915 + */ 916 + export type DeleteFooData2 = string; 917 + 918 + /** 814 919 * This is a reusable parameter 815 920 */ 816 921 export type ParameterSimpleParameter = string; ··· 824 929 requestBody: ModelWithReadOnlyAndWriteOnly | ModelWithArrayReadOnlyAndWriteOnly; 825 930 }; 826 931 827 - export type PostServiceWithEmptyTagResponse = ModelWithReadOnlyAndWriteOnly; 932 + export type PostServiceWithEmptyTagResponse3 = ModelWithReadOnlyAndWriteOnly; 828 933 829 934 export type ApiVversionOdataControllerCountResponse = Model_From_Zendesk; 830 935 831 - export type DeleteFooData = { 936 + export type DeleteFooData3 = { 832 937 /** 833 938 * bar in method 834 939 */
+3 -3
packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/services.gen.ts.snap
··· 5 5 import type { Observable } from 'rxjs'; 6 6 import { OpenAPI } from './core/OpenAPI'; 7 7 import { request as __request } from './core/request'; 8 - import type { PostServiceWithEmptyTagData, PostServiceWithEmptyTagResponse, ApiVversionOdataControllerCountResponse, DeleteFooData, CallWithParametersData, CallWithWeirdParameterNamesData, GetCallWithOptionalParamData, PostCallWithOptionalParamData, CallWithDescriptionsData, DeprecatedCallData, PostApiRequestBodyData, PostApiFormDataData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, CallWithNoContentResponseResponse, CallWithResponseAndNoContentResponseResponse, CallWithResponseResponse, CallWithDuplicateResponsesResponse, CallWithResponsesResponse, DummyAResponse, DummyBResponse, CollectionFormatData, TypesData, TypesResponse, UploadFileData, UploadFileResponse, FileResponseData, FileResponseResponse, ComplexTypesData, ComplexTypesResponse, ComplexParamsData, ComplexParamsResponse, MultipartRequestData, MultipartResponseResponse, CallWithResultFromHeaderResponse, TestErrorCodeData, TestErrorCodeResponse, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response } from './types.gen'; 8 + import type { PostServiceWithEmptyTagData, PostServiceWithEmptyTagResponse3, ApiVversionOdataControllerCountResponse, DeleteFooData3, CallWithParametersData, CallWithWeirdParameterNamesData, GetCallWithOptionalParamData, PostCallWithOptionalParamData, CallWithDescriptionsData, DeprecatedCallData, PostApiRequestBodyData, PostApiFormDataData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, CallWithNoContentResponseResponse, CallWithResponseAndNoContentResponseResponse, CallWithResponseResponse, CallWithDuplicateResponsesResponse, CallWithResponsesResponse, DummyAResponse, DummyBResponse, CollectionFormatData, TypesData, TypesResponse, UploadFileData, UploadFileResponse, FileResponseData, FileResponseResponse, ComplexTypesData, ComplexTypesResponse, ComplexParamsData, ComplexParamsResponse, MultipartRequestData, MultipartResponseResponse, CallWithResultFromHeaderResponse, TestErrorCodeData, TestErrorCodeResponse, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response } from './types.gen'; 9 9 10 10 @Injectable({ 11 11 providedIn: 'root' ··· 29 29 * @returns ModelWithReadOnlyAndWriteOnly 30 30 * @throws ApiError 31 31 */ 32 - public postServiceWithEmptyTag(data: PostServiceWithEmptyTagData): Observable<PostServiceWithEmptyTagResponse> { 32 + public postServiceWithEmptyTag(data: PostServiceWithEmptyTagData): Observable<PostServiceWithEmptyTagResponse3> { 33 33 return __request(OpenAPI, this.http, { 34 34 method: 'POST', 35 35 url: '/api/v{api-version}/no-tag', ··· 141 141 * @param data.bar bar in method 142 142 * @throws ApiError 143 143 */ 144 - public deleteFoo(data: DeleteFooData): Observable<void> { 144 + public deleteFoo(data: DeleteFooData3): Observable<void> { 145 145 return __request(OpenAPI, this.http, { 146 146 method: 'DELETE', 147 147 url: '/api/v{api-version}/foo/{foo}/bar/{bar}',
+29 -4
packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/types.gen.ts.snap
··· 445 445 propA?: Array<(ModelWithDictionary | null)> | Array<(ModelWithArray | null)>; 446 446 }; 447 447 448 - export type Enum1 = 'Bird' | 'Dog'; 448 + export type e_num_1Период = 'Bird' | 'Dog'; 449 449 450 450 export type ConstValue = "ConstValue"; 451 451 ··· 453 453 * This is a model with one property with a 'any of' relationship where the options are not $ref 454 454 */ 455 455 export type CompositionWithNestedAnyOfAndNull = { 456 - propA?: Array<(Enum1 | ConstValue)> | null; 456 + propA?: Array<(e_num_1Период | ConstValue)> | null; 457 457 }; 458 458 459 459 /** ··· 811 811 }; 812 812 813 813 /** 814 + * Model used to test deduplication strategy (unused) 815 + */ 816 + export type ParameterSimpleParameterUnused = string; 817 + 818 + /** 819 + * Model used to test deduplication strategy 820 + */ 821 + export type PostServiceWithEmptyTagResponse = string; 822 + 823 + /** 824 + * Model used to test deduplication strategy 825 + */ 826 + export type PostServiceWithEmptyTagResponse2 = string; 827 + 828 + /** 829 + * Model used to test deduplication strategy 830 + */ 831 + export type DeleteFooData = string; 832 + 833 + /** 834 + * Model used to test deduplication strategy 835 + */ 836 + export type DeleteFooData2 = string; 837 + 838 + /** 814 839 * This is a reusable parameter 815 840 */ 816 841 export type ParameterSimpleParameter = string; ··· 824 849 requestBody: ModelWithReadOnlyAndWriteOnly | ModelWithArrayReadOnlyAndWriteOnly; 825 850 }; 826 851 827 - export type PostServiceWithEmptyTagResponse = ModelWithReadOnlyAndWriteOnly; 852 + export type PostServiceWithEmptyTagResponse3 = ModelWithReadOnlyAndWriteOnly; 828 853 829 854 export type ApiVversionOdataControllerCountResponse = Model_From_Zendesk; 830 855 831 - export type DeleteFooData = { 856 + export type DeleteFooData3 = { 832 857 /** 833 858 * bar in method 834 859 */
+3 -3
packages/openapi-ts/test/__snapshots__/test/generated/v3_client/services.gen.ts.snap
··· 2 2 3 3 import type { CancelablePromise } from './core/CancelablePromise'; 4 4 import type { BaseHttpRequest } from './core/BaseHttpRequest'; 5 - import type { PostServiceWithEmptyTagData, PostServiceWithEmptyTagResponse, ApiVversionOdataControllerCountResponse, DeleteFooData, CallWithParametersData, CallWithWeirdParameterNamesData, GetCallWithOptionalParamData, PostCallWithOptionalParamData, CallWithDescriptionsData, DeprecatedCallData, PostApiRequestBodyData, PostApiFormDataData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, CallWithNoContentResponseResponse, CallWithResponseAndNoContentResponseResponse, CallWithResponseResponse, CallWithDuplicateResponsesResponse, CallWithResponsesResponse, DummyAResponse, DummyBResponse, CollectionFormatData, TypesData, TypesResponse, UploadFileData, UploadFileResponse, FileResponseData, FileResponseResponse, ComplexTypesData, ComplexTypesResponse, ComplexParamsData, ComplexParamsResponse, MultipartRequestData, MultipartResponseResponse, CallWithResultFromHeaderResponse, TestErrorCodeData, TestErrorCodeResponse, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response } from './types.gen'; 5 + import type { PostServiceWithEmptyTagData, PostServiceWithEmptyTagResponse3, ApiVversionOdataControllerCountResponse, DeleteFooData3, CallWithParametersData, CallWithWeirdParameterNamesData, GetCallWithOptionalParamData, PostCallWithOptionalParamData, CallWithDescriptionsData, DeprecatedCallData, PostApiRequestBodyData, PostApiFormDataData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, CallWithNoContentResponseResponse, CallWithResponseAndNoContentResponseResponse, CallWithResponseResponse, CallWithDuplicateResponsesResponse, CallWithResponsesResponse, DummyAResponse, DummyBResponse, CollectionFormatData, TypesData, TypesResponse, UploadFileData, UploadFileResponse, FileResponseData, FileResponseResponse, ComplexTypesData, ComplexTypesResponse, ComplexParamsData, ComplexParamsResponse, MultipartRequestData, MultipartResponseResponse, CallWithResultFromHeaderResponse, TestErrorCodeData, TestErrorCodeResponse, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response } from './types.gen'; 6 6 7 7 export class DefaultService { 8 8 constructor(public readonly httpRequest: BaseHttpRequest) { } ··· 23 23 * @returns ModelWithReadOnlyAndWriteOnly 24 24 * @throws ApiError 25 25 */ 26 - public postServiceWithEmptyTag(data: PostServiceWithEmptyTagData): CancelablePromise<PostServiceWithEmptyTagResponse> { 26 + public postServiceWithEmptyTag(data: PostServiceWithEmptyTagData): CancelablePromise<PostServiceWithEmptyTagResponse3> { 27 27 return this.httpRequest.request({ 28 28 method: 'POST', 29 29 url: '/api/v{api-version}/no-tag', ··· 129 129 * @param data.bar bar in method 130 130 * @throws ApiError 131 131 */ 132 - public deleteFoo(data: DeleteFooData): CancelablePromise<void> { 132 + public deleteFoo(data: DeleteFooData3): CancelablePromise<void> { 133 133 return this.httpRequest.request({ 134 134 method: 'DELETE', 135 135 url: '/api/v{api-version}/foo/{foo}/bar/{bar}',
+29 -4
packages/openapi-ts/test/__snapshots__/test/generated/v3_client/types.gen.ts.snap
··· 445 445 propA?: Array<(ModelWithDictionary | null)> | Array<(ModelWithArray | null)>; 446 446 }; 447 447 448 - export type Enum1 = 'Bird' | 'Dog'; 448 + export type e_num_1Период = 'Bird' | 'Dog'; 449 449 450 450 export type ConstValue = "ConstValue"; 451 451 ··· 453 453 * This is a model with one property with a 'any of' relationship where the options are not $ref 454 454 */ 455 455 export type CompositionWithNestedAnyOfAndNull = { 456 - propA?: Array<(Enum1 | ConstValue)> | null; 456 + propA?: Array<(e_num_1Период | ConstValue)> | null; 457 457 }; 458 458 459 459 /** ··· 811 811 }; 812 812 813 813 /** 814 + * Model used to test deduplication strategy (unused) 815 + */ 816 + export type ParameterSimpleParameterUnused = string; 817 + 818 + /** 819 + * Model used to test deduplication strategy 820 + */ 821 + export type PostServiceWithEmptyTagResponse = string; 822 + 823 + /** 824 + * Model used to test deduplication strategy 825 + */ 826 + export type PostServiceWithEmptyTagResponse2 = string; 827 + 828 + /** 829 + * Model used to test deduplication strategy 830 + */ 831 + export type DeleteFooData = string; 832 + 833 + /** 834 + * Model used to test deduplication strategy 835 + */ 836 + export type DeleteFooData2 = string; 837 + 838 + /** 814 839 * This is a reusable parameter 815 840 */ 816 841 export type ParameterSimpleParameter = string; ··· 824 849 requestBody: ModelWithReadOnlyAndWriteOnly | ModelWithArrayReadOnlyAndWriteOnly; 825 850 }; 826 851 827 - export type PostServiceWithEmptyTagResponse = ModelWithReadOnlyAndWriteOnly; 852 + export type PostServiceWithEmptyTagResponse3 = ModelWithReadOnlyAndWriteOnly; 828 853 829 854 export type ApiVversionOdataControllerCountResponse = Model_From_Zendesk; 830 855 831 - export type DeleteFooData = { 856 + export type DeleteFooData3 = { 832 857 /** 833 858 * bar in method 834 859 */
+3 -3
packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/services.gen.ts.snap
··· 3 3 import type { CancelablePromise } from './core/CancelablePromise'; 4 4 import { OpenAPI } from './core/OpenAPI'; 5 5 import { request as __request } from './core/request'; 6 - import type { PostServiceWithEmptyTagData, PostServiceWithEmptyTagResponse, ApiVversionOdataControllerCountResponse, DeleteFooData, CallWithParametersData, CallWithWeirdParameterNamesData, GetCallWithOptionalParamData, PostCallWithOptionalParamData, CallWithDescriptionsData, DeprecatedCallData, PostApiRequestBodyData, PostApiFormDataData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, CallWithNoContentResponseResponse, CallWithResponseAndNoContentResponseResponse, CallWithResponseResponse, CallWithDuplicateResponsesResponse, CallWithResponsesResponse, DummyAResponse, DummyBResponse, CollectionFormatData, TypesData, TypesResponse, UploadFileData, UploadFileResponse, FileResponseData, FileResponseResponse, ComplexTypesData, ComplexTypesResponse, ComplexParamsData, ComplexParamsResponse, MultipartRequestData, MultipartResponseResponse, CallWithResultFromHeaderResponse, TestErrorCodeData, TestErrorCodeResponse, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response } from './types.gen'; 6 + import type { PostServiceWithEmptyTagData, PostServiceWithEmptyTagResponse3, ApiVversionOdataControllerCountResponse, DeleteFooData3, CallWithParametersData, CallWithWeirdParameterNamesData, GetCallWithOptionalParamData, PostCallWithOptionalParamData, CallWithDescriptionsData, DeprecatedCallData, PostApiRequestBodyData, PostApiFormDataData, CallWithDefaultParametersData, CallWithDefaultOptionalParametersData, CallToTestOrderOfParamsData, CallWithNoContentResponseResponse, CallWithResponseAndNoContentResponseResponse, CallWithResponseResponse, CallWithDuplicateResponsesResponse, CallWithResponsesResponse, DummyAResponse, DummyBResponse, CollectionFormatData, TypesData, TypesResponse, UploadFileData, UploadFileResponse, FileResponseData, FileResponseResponse, ComplexTypesData, ComplexTypesResponse, ComplexParamsData, ComplexParamsResponse, MultipartRequestData, MultipartResponseResponse, CallWithResultFromHeaderResponse, TestErrorCodeData, TestErrorCodeResponse, NonAsciiæøåÆøÅöôêÊ字符串Data, NonAsciiæøåÆøÅöôêÊ字符串Response } from './types.gen'; 7 7 8 8 export class DefaultService { 9 9 /** ··· 22 22 * @returns ModelWithReadOnlyAndWriteOnly 23 23 * @throws ApiError 24 24 */ 25 - public static postServiceWithEmptyTag(data: PostServiceWithEmptyTagData): CancelablePromise<PostServiceWithEmptyTagResponse> { 25 + public static postServiceWithEmptyTag(data: PostServiceWithEmptyTagData): CancelablePromise<PostServiceWithEmptyTagResponse3> { 26 26 return __request(OpenAPI, { 27 27 method: 'POST', 28 28 url: '/api/v{api-version}/no-tag', ··· 124 124 * @param data.bar bar in method 125 125 * @throws ApiError 126 126 */ 127 - public static deleteFoo(data: DeleteFooData): CancelablePromise<void> { 127 + public static deleteFoo(data: DeleteFooData3): CancelablePromise<void> { 128 128 return __request(OpenAPI, { 129 129 method: 'DELETE', 130 130 url: '/api/v{api-version}/foo/{foo}/bar/{bar}',
+91 -11
packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/types.gen.ts.snap
··· 84 84 /** 85 85 * This is a simple enum with strings 86 86 */ 87 - export type EnumWithStrings = 'Success' | 'Warning' | 'Error' | "'Single Quote'" | '"Double Quotes"' | 'Non-ascii: øæåôöØÆÅÔÖ字符串'; 87 + export enum EnumWithStrings { 88 + SUCCESS = 'Success', 89 + WARNING = 'Warning', 90 + ERROR = 'Error', 91 + _SINGLE_QUOTE_ = "'Single Quote'", 92 + _DOUBLE_QUOTES_ = '"Double Quotes"', 93 + NON_ASCII__ØÆÅÔÖ_ØÆÅÔÖ字符串 = 'Non-ascii: øæåôöØÆÅÔÖ字符串' 94 + } 88 95 89 - export type EnumWithReplacedCharacters = "'Single Quote'" | '"Double Quotes"' | 'øæåôöØÆÅÔÖ字符串' | 3.1 | ''; 96 + export enum EnumWithReplacedCharacters { 97 + _SINGLE_QUOTE_ = "'Single Quote'", 98 + _DOUBLE_QUOTES_ = '"Double Quotes"', 99 + ØÆÅÔÖ_ØÆÅÔÖ字符串 = 'øæåôöØÆÅÔÖ字符串', 100 + '_3.1' = 3.1, 101 + EMPTY_STRING = '' 102 + } 90 103 91 104 /** 92 105 * This is a simple enum with numbers 93 106 */ 94 - export type EnumWithNumbers = 1 | 2 | 3 | 1.1 | 1.2 | 1.3 | 100 | 200 | 300 | -100 | -200 | -300 | -1.1 | -1.2 | -1.3; 107 + export enum EnumWithNumbers { 108 + '_1' = 1, 109 + '_2' = 2, 110 + '_3' = 3, 111 + '_1.1' = 1.1, 112 + '_1.2' = 1.2, 113 + '_1.3' = 1.3, 114 + '_100' = 100, 115 + '_200' = 200, 116 + '_300' = 300, 117 + '_-100' = -100, 118 + '_-200' = -200, 119 + '_-300' = -300, 120 + '_-1.1' = -1.1, 121 + '_-1.2' = -1.2, 122 + '_-1.3' = -1.3 123 + } 95 124 96 125 /** 97 126 * Success=1,Warning=2,Error=3 ··· 101 130 /** 102 131 * This is a simple enum with numbers 103 132 */ 104 - export type EnumWithExtensions = 200 | 400 | 500; 133 + export enum EnumWithExtensions { 134 + /** 135 + * Used when the status of something is successful 136 + */ 137 + CUSTOM_SUCCESS = 200, 138 + /** 139 + * Used when the status of something has a warning 140 + */ 141 + CUSTOM_WARNING = 400, 142 + /** 143 + * Used when the status of something has an error 144 + */ 145 + CUSTOM_ERROR = 500 146 + } 105 147 106 - export type EnumWithXEnumNames = 0 | 1 | 2; 148 + export enum EnumWithXEnumNames { 149 + zero = 0, 150 + one = 1, 151 + two = 2 152 + } 107 153 108 154 /** 109 155 * This is a simple array with numbers ··· 445 491 propA?: Array<(ModelWithDictionary | null)> | Array<(ModelWithArray | null)>; 446 492 }; 447 493 448 - export type Enum1 = 'Bird' | 'Dog'; 494 + export enum e_num_1Период { 495 + BIRD = 'Bird', 496 + DOG = 'Dog' 497 + } 449 498 450 499 export type ConstValue = "ConstValue"; 451 500 ··· 453 502 * This is a model with one property with a 'any of' relationship where the options are not $ref 454 503 */ 455 504 export type CompositionWithNestedAnyOfAndNull = { 456 - propA?: Array<(Enum1 | ConstValue)> | null; 505 + propA?: Array<(e_num_1Период | ConstValue)> | null; 457 506 }; 458 507 459 508 /** ··· 716 765 foo: 'Corge'; 717 766 }; 718 767 719 - export type ModelWithNestedArrayEnumsDataFoo = 'foo' | 'bar'; 768 + export enum ModelWithNestedArrayEnumsDataFoo { 769 + FOO = 'foo', 770 + BAR = 'bar' 771 + } 720 772 721 - export type ModelWithNestedArrayEnumsDataBar = 'baz' | 'qux'; 773 + export enum ModelWithNestedArrayEnumsDataBar { 774 + BAZ = 'baz', 775 + QUX = 'qux' 776 + } 722 777 723 778 export type ModelWithNestedArrayEnumsData = { 724 779 foo?: Array<ModelWithNestedArrayEnumsDataFoo>; ··· 811 866 }; 812 867 813 868 /** 869 + * Model used to test deduplication strategy (unused) 870 + */ 871 + export type ParameterSimpleParameterUnused = string; 872 + 873 + /** 874 + * Model used to test deduplication strategy 875 + */ 876 + export type PostServiceWithEmptyTagResponse = string; 877 + 878 + /** 879 + * Model used to test deduplication strategy 880 + */ 881 + export type PostServiceWithEmptyTagResponse2 = string; 882 + 883 + /** 884 + * Model used to test deduplication strategy 885 + */ 886 + export type DeleteFooData = string; 887 + 888 + /** 889 + * Model used to test deduplication strategy 890 + */ 891 + export type DeleteFooData2 = string; 892 + 893 + /** 814 894 * This is a reusable parameter 815 895 */ 816 896 export type ParameterSimpleParameter = string; ··· 824 904 requestBody: ModelWithReadOnlyAndWriteOnly | ModelWithArrayReadOnlyAndWriteOnly; 825 905 }; 826 906 827 - export type PostServiceWithEmptyTagResponse = ModelWithReadOnlyAndWriteOnly; 907 + export type PostServiceWithEmptyTagResponse3 = ModelWithReadOnlyAndWriteOnly; 828 908 829 909 export type ApiVversionOdataControllerCountResponse = Model_From_Zendesk; 830 910 831 - export type DeleteFooData = { 911 + export type DeleteFooData3 = { 832 912 /** 833 913 * bar in method 834 914 */
+27 -2
packages/openapi-ts/test/__snapshots__/test/generated/v3_models/types.gen.ts.snap
··· 445 445 propA?: Array<(ModelWithDictionary | null)> | Array<(ModelWithArray | null)>; 446 446 }; 447 447 448 - export type Enum1 = 'Bird' | 'Dog'; 448 + export type e_num_1Период = 'Bird' | 'Dog'; 449 449 450 450 export type ConstValue = "ConstValue"; 451 451 ··· 453 453 * This is a model with one property with a 'any of' relationship where the options are not $ref 454 454 */ 455 455 export type CompositionWithNestedAnyOfAndNull = { 456 - propA?: Array<(Enum1 | ConstValue)> | null; 456 + propA?: Array<(e_num_1Период | ConstValue)> | null; 457 457 }; 458 458 459 459 /** ··· 809 809 */ 810 810 template?: string; 811 811 }; 812 + 813 + /** 814 + * Model used to test deduplication strategy (unused) 815 + */ 816 + export type ParameterSimpleParameterUnused = string; 817 + 818 + /** 819 + * Model used to test deduplication strategy 820 + */ 821 + export type PostServiceWithEmptyTagResponse = string; 822 + 823 + /** 824 + * Model used to test deduplication strategy 825 + */ 826 + export type PostServiceWithEmptyTagResponse2 = string; 827 + 828 + /** 829 + * Model used to test deduplication strategy 830 + */ 831 + export type DeleteFooData = string; 832 + 833 + /** 834 + * Model used to test deduplication strategy 835 + */ 836 + export type DeleteFooData2 = string; 812 837 813 838 /** 814 839 * This is a reusable parameter
+24 -11
packages/openapi-ts/test/__snapshots__/test/generated/v3_schemas_form/schemas.gen.ts.snap
··· 361 361 'foo-bar-baz-qux': { 362 362 type: 'string', 363 363 enum: ['3.0'], 364 - title: 'Foo-Bar-Baz-Qux', 365 364 default: '3.0' 366 365 } 367 366 } ··· 676 675 } 677 676 } as const; 678 677 679 - export const $Enum1 = { 678 + export const $e_num_1Период = { 680 679 enum: ['Bird', 'Dog'], 681 680 type: 'string' 682 681 } as const; ··· 695 694 items: { 696 695 anyOf: [ 697 696 { 698 - '$ref': '#/components/schemas/Enum1' 697 + '$ref': '#/components/schemas/3e-num_1Период' 699 698 }, 700 699 { 701 700 '$ref': '#/components/schemas/ConstValue' ··· 707 706 { 708 707 type: 'null' 709 708 } 710 - ], 711 - title: 'Scopes' 709 + ] 712 710 } 713 711 } 714 712 } as const; ··· 1106 1104 type: 'object', 1107 1105 properties: { 1108 1106 id: { 1109 - title: 'Id', 1110 1107 type: 'string', 1111 1108 readOnly: true, 1112 1109 minLength: 1 1113 1110 }, 1114 1111 updated_at: { 1115 - title: 'Updated at', 1116 1112 type: 'string', 1117 1113 format: 'date-time', 1118 1114 readOnly: true 1119 1115 }, 1120 1116 created_at: { 1121 - title: 'Created at', 1122 1117 type: 'string', 1123 1118 format: 'date-time', 1124 1119 readOnly: true 1125 1120 }, 1126 1121 mime: { 1127 - title: 'Mime', 1128 1122 type: 'string', 1129 1123 maxLength: 24, 1130 1124 minLength: 1 1131 1125 }, 1132 1126 file: { 1133 - title: 'File', 1134 1127 type: 'string', 1135 1128 readOnly: true, 1136 1129 format: 'uri' ··· 1257 1250 required: ['bar'], 1258 1251 properties: { 1259 1252 bar: { 1260 - '$ref': '#/components/schemas/NonAsciiString%C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85%C3%B6%C3%B4%C3%AA%C3%8A%E5%AD%97%E7%AC%A6%E4%B8%B2' 1253 + '$ref': '#/components/schemas/NonAsciiStringæøåÆØÅöôêÊ字符串' 1261 1254 } 1262 1255 }, 1263 1256 additionalProperties: false ··· 1544 1537 type: 'string' 1545 1538 } 1546 1539 } 1540 + } as const; 1541 + 1542 + export const $ParameterSimpleParameterUnused = { 1543 + type: 'string' 1544 + } as const; 1545 + 1546 + export const $PostServiceWithEmptyTagResponse = { 1547 + type: 'string' 1548 + } as const; 1549 + 1550 + export const $PostServiceWithEmptyTagResponse2 = { 1551 + type: 'string' 1552 + } as const; 1553 + 1554 + export const $DeleteFooData = { 1555 + type: 'string' 1556 + } as const; 1557 + 1558 + export const $DeleteFooData2 = { 1559 + type: 'string' 1547 1560 } as const;
+28 -3
packages/openapi-ts/test/__snapshots__/test/generated/v3_schemas_json/schemas.gen.ts.snap
··· 764 764 } 765 765 } as const; 766 766 767 - export const $Enum1 = { 767 + export const $e_num_1Период = { 768 768 enum: ['Bird', 'Dog'], 769 769 type: 'string' 770 770 } as const; ··· 784 784 items: { 785 785 anyOf: [ 786 786 { 787 - '$ref': '#/components/schemas/Enum1' 787 + '$ref': '#/components/schemas/3e-num_1Период' 788 788 }, 789 789 { 790 790 '$ref': '#/components/schemas/ConstValue' ··· 1367 1367 required: ['bar'], 1368 1368 properties: { 1369 1369 bar: { 1370 - '$ref': '#/components/schemas/NonAsciiString%C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85%C3%B6%C3%B4%C3%AA%C3%8A%E5%AD%97%E7%AC%A6%E4%B8%B2' 1370 + '$ref': '#/components/schemas/NonAsciiStringæøåÆØÅöôêÊ字符串' 1371 1371 } 1372 1372 }, 1373 1373 additionalProperties: false ··· 1685 1685 </pre>` 1686 1686 } 1687 1687 } 1688 + } as const; 1689 + 1690 + export const $ParameterSimpleParameterUnused = { 1691 + description: 'Model used to test deduplication strategy (unused)', 1692 + type: 'string' 1693 + } as const; 1694 + 1695 + export const $PostServiceWithEmptyTagResponse = { 1696 + description: 'Model used to test deduplication strategy', 1697 + type: 'string' 1698 + } as const; 1699 + 1700 + export const $PostServiceWithEmptyTagResponse2 = { 1701 + description: 'Model used to test deduplication strategy', 1702 + type: 'string' 1703 + } as const; 1704 + 1705 + export const $DeleteFooData = { 1706 + description: 'Model used to test deduplication strategy', 1707 + type: 'string' 1708 + } as const; 1709 + 1710 + export const $DeleteFooData2 = { 1711 + description: 'Model used to test deduplication strategy', 1712 + type: 'string' 1688 1713 } as const;
+1 -1
packages/openapi-ts/test/__snapshots__/test/generated/v3_services_name/services.gen.ts.snap
··· 95 95 * @param data.bar bar in method 96 96 * @throws ApiError 97 97 */ 98 - public static deleteFoo(data: DeleteFooData): CancelablePromise<void> { 98 + public static deleteFoo(data: DeleteFooData3): CancelablePromise<void> { 99 99 return __request(OpenAPI, { 100 100 method: 'DELETE', 101 101 url: '/api/v{api-version}/foo/{foo}/bar/{bar}',
+46 -60
packages/openapi-ts/test/index.spec.ts
··· 20 20 { 21 21 config: { 22 22 client: 'fetch', 23 - enums: 'javascript', 24 23 exportCore: true, 25 24 input: '', 26 25 output: '', 27 26 schemas: true, 28 27 services: true, 29 - types: true, 28 + types: { 29 + enums: 'javascript', 30 + }, 30 31 useOptions: true, 31 32 } as UserConfig, 32 33 description: 'generate fetch client', ··· 49 50 describe('OpenAPI v3', () => { 50 51 const config: UserConfig = { 51 52 client: 'fetch', 52 - enums: 'javascript', 53 53 exportCore: true, 54 54 input: '', 55 55 output: '', 56 56 schemas: true, 57 57 services: true, 58 - types: true, 58 + types: { 59 + enums: 'javascript', 60 + }, 59 61 useOptions: true, 60 62 }; 61 63 64 + const createConfig = (userConfig?: Partial<UserConfig>): UserConfig => ({ 65 + ...config, 66 + ...userConfig, 67 + }); 68 + 62 69 it.each([ 63 70 { 64 - config: { 65 - ...config, 66 - }, 71 + config: createConfig(), 67 72 description: 'generate fetch client', 68 73 name: 'v3', 69 74 }, 70 75 { 71 - config: { 72 - ...config, 76 + config: createConfig({ 73 77 client: 'angular', 74 - enums: false, 75 78 schemas: false, 76 - } as UserConfig, 79 + types: {}, 80 + }), 77 81 description: 'generate angular client', 78 82 name: 'v3_angular', 79 83 }, 80 84 { 81 - config: { 82 - ...config, 85 + config: createConfig({ 83 86 client: 'node', 84 - enums: false, 85 87 schemas: false, 86 88 services: false, 87 89 types: false, 88 - } as UserConfig, 90 + }), 89 91 description: 'generate node client', 90 92 name: 'v3_node', 91 93 }, 92 94 { 93 - config: { 94 - ...config, 95 + config: createConfig({ 95 96 client: 'axios', 96 - enums: false, 97 97 schemas: false, 98 98 services: false, 99 99 types: false, 100 - } as UserConfig, 100 + }), 101 101 description: 'generate axios client', 102 102 name: 'v3_axios', 103 103 }, 104 104 { 105 - config: { 106 - ...config, 105 + config: createConfig({ 107 106 client: 'xhr', 108 - enums: false, 109 107 schemas: false, 110 108 services: false, 111 109 types: false, 112 - } as UserConfig, 110 + }), 113 111 description: 'generate xhr client', 114 112 name: 'v3_xhr', 115 113 }, 116 114 { 117 - config: { 118 - ...config, 115 + config: createConfig({ 119 116 exportCore: false, 120 117 schemas: false, 121 118 services: false, ··· 123 120 dates: true, 124 121 include: '^ModelWithPattern', 125 122 }, 126 - } as UserConfig, 123 + }), 127 124 description: 'generate Date types', 128 125 name: 'v3_date', 129 126 }, 130 127 { 131 - config: { 132 - ...config, 128 + config: createConfig({ 133 129 schemas: false, 134 130 services: '^Defaults', 135 131 types: { ··· 137 133 include: '^ModelWithString', 138 134 }, 139 135 useOptions: false, 140 - } as UserConfig, 136 + }), 141 137 description: 'generate legacy positional arguments', 142 138 name: 'v3_legacy_positional_args', 143 139 }, 144 140 { 145 - config: { 146 - ...config, 141 + config: createConfig({ 147 142 schemas: false, 148 143 services: '^Defaults', 149 144 types: { 150 145 dates: true, 151 146 include: '^ModelWithString', 152 147 }, 153 - } as UserConfig, 148 + }), 154 149 description: 'generate optional arguments', 155 150 name: 'v3_options', 156 151 }, 157 152 { 158 - config: { 159 - ...config, 153 + config: createConfig({ 160 154 name: 'ApiClient', 161 155 schemas: false, 162 156 types: { 163 157 dates: true, 164 158 }, 165 - } as UserConfig, 159 + }), 166 160 description: 'generate client', 167 161 name: 'v3_client', 168 162 }, 169 163 { 170 - config: { 171 - ...config, 172 - enums: 'typescript', 164 + config: createConfig({ 173 165 schemas: false, 174 - } as UserConfig, 166 + types: { 167 + enums: 'typescript', 168 + }, 169 + }), 175 170 description: 'generate TypeScript enums', 176 171 name: 'v3_enums_typescript', 177 172 }, 178 173 { 179 - config: { 180 - ...config, 181 - enums: false, 174 + config: createConfig({ 182 175 exportCore: false, 183 176 schemas: false, 184 177 services: false, 185 - } as UserConfig, 178 + types: {}, 179 + }), 186 180 description: 'generate models', 187 181 name: 'v3_models', 188 182 }, 189 183 { 190 - config: { 191 - ...config, 192 - enums: false, 184 + config: createConfig({ 193 185 exportCore: false, 194 186 schemas: false, 195 187 services: false, 196 188 types: { 197 - include: '^(camelCaseCommentWithBreaks|ArrayWithProperties)', 189 + include: '^(CamelCaseCommentWithBreaks|ArrayWithProperties)', 198 190 name: 'PascalCase', 199 191 }, 200 - } as UserConfig, 192 + }), 201 193 description: 'generate pascalcase types', 202 194 name: 'v3_pascalcase', 203 195 }, 204 196 { 205 - config: { 206 - ...config, 207 - enums: false, 197 + config: createConfig({ 208 198 exportCore: false, 209 199 schemas: false, 210 200 services: { ··· 212 202 name: 'myAwesome{{name}}Api', 213 203 }, 214 204 types: false, 215 - } as UserConfig, 205 + }), 216 206 description: 'generate services with custom name', 217 207 name: 'v3_services_name', 218 208 }, 219 209 { 220 - config: { 221 - ...config, 222 - enums: false, 210 + config: createConfig({ 223 211 exportCore: false, 224 212 schemas: { 225 213 type: 'json', 226 214 }, 227 215 services: false, 228 216 types: false, 229 - } as UserConfig, 217 + }), 230 218 description: 'generate JSON Schemas', 231 219 name: 'v3_schemas_json', 232 220 }, 233 221 { 234 - config: { 235 - ...config, 236 - enums: false, 222 + config: createConfig({ 237 223 exportCore: false, 238 224 schemas: { 239 225 type: 'form', 240 226 }, 241 227 services: false, 242 228 types: false, 243 - } as UserConfig, 229 + }), 244 230 description: 'generate form validation schemas', 245 231 name: 'v3_schemas_form', 246 232 },
+2 -1
packages/openapi-ts/test/sample.cjs
··· 4 4 /** @type {import('../src/node/index').UserConfig} */ 5 5 const config = { 6 6 client: 'fetch', 7 - enums: 'javascript', 8 7 input: './test/spec/v3.json', 9 8 output: './test/generated/v3/', 10 9 schemas: { ··· 14 13 // export: false, 15 14 }, 16 15 types: { 16 + // enums: 'javascript', 17 17 // include: '^NestedAnyOfArraysNullable', 18 + // name: 'PascalCase', 18 19 }, 19 20 }; 20 21
+22 -2
packages/openapi-ts/test/spec/v3.json
··· 2367 2367 } 2368 2368 } 2369 2369 }, 2370 - "Enum1": { 2370 + "3e-num_1Период": { 2371 2371 "enum": ["Bird", "Dog"], 2372 2372 "type": "string" 2373 2373 }, ··· 2385 2385 "items": { 2386 2386 "anyOf": [ 2387 2387 { 2388 - "$ref": "#/components/schemas/Enum1" 2388 + "$ref": "#/components/schemas/3e-num_1Период" 2389 2389 }, 2390 2390 { 2391 2391 "$ref": "#/components/schemas/ConstValue" ··· 3222 3222 "description": "The template `that` should be used for parsing and importing the contents of the CSV file.\n\n<br/><p>There is one placeholder currently supported:<ul> <li><b>${x}</b> - refers to the n-th column in the CSV file, e.g. ${1}, ${2}, ...)</li></ul><p>Example of a correct JSON template:</p>\n<pre>\n[\n {\n \"resourceType\": \"Asset\",\n \"identifier\": {\n \"name\": \"${1}\",\n \"domain\": {\n \"name\": \"${2}\",\n \"community\": {\n \"name\": \"Some Community\"\n }\n }\n },\n \"attributes\" : {\n \"00000000-0000-0000-0000-000000003115\" : [ {\n \"value\" : \"${3}\" \n } ],\n \"00000000-0000-0000-0000-000000000222\" : [ {\n \"value\" : \"${4}\"\n } ]\n }\n }\n]\n</pre>" 3223 3223 } 3224 3224 } 3225 + }, 3226 + "ParameterSimpleParameterUnused": { 3227 + "description": "Model used to test deduplication strategy (unused)", 3228 + "type": "string" 3229 + }, 3230 + "PostServiceWithEmptyTagResponse": { 3231 + "description": "Model used to test deduplication strategy", 3232 + "type": "string" 3233 + }, 3234 + "PostServiceWithEmptyTagResponse2": { 3235 + "description": "Model used to test deduplication strategy", 3236 + "type": "string" 3237 + }, 3238 + "DeleteFooData": { 3239 + "description": "Model used to test deduplication strategy", 3240 + "type": "string" 3241 + }, 3242 + "DeleteFooData2": { 3243 + "description": "Model used to test deduplication strategy", 3244 + "type": "string" 3225 3245 } 3226 3246 } 3227 3247 }
+440 -374
pnpm-lock.yaml
··· 13 13 version: 2.27.1 14 14 '@rollup/plugin-commonjs': 15 15 specifier: 25.0.7 16 - version: 25.0.7(rollup@4.17.0) 16 + version: 25.0.7(rollup@4.17.2) 17 17 '@rollup/plugin-terser': 18 18 specifier: 0.4.4 19 - version: 0.4.4(rollup@4.17.0) 19 + version: 0.4.4(rollup@4.17.2) 20 20 '@rollup/plugin-typescript': 21 21 specifier: 11.1.6 22 - version: 11.1.6(rollup@4.17.0)(typescript@5.4.5) 22 + version: 11.1.6(rollup@4.17.2)(typescript@5.4.5) 23 23 '@svitejs/changesets-changelog-github-compact': 24 24 specifier: 1.1.0 25 25 version: 1.1.0 26 26 '@types/node': 27 - specifier: 20.12.7 28 - version: 20.12.7 27 + specifier: 20.12.8 28 + version: 20.12.8 29 29 '@vitest/coverage-v8': 30 - specifier: 1.5.2 31 - version: 1.5.2(vitest@1.5.2) 30 + specifier: 1.6.0 31 + version: 1.6.0(vitest@1.6.0) 32 32 eslint: 33 - specifier: 9.1.1 34 - version: 9.1.1 33 + specifier: 9.2.0 34 + version: 9.2.0 35 35 eslint-config-prettier: 36 36 specifier: 9.1.0 37 - version: 9.1.0(eslint@9.1.1) 37 + version: 9.1.0(eslint@9.2.0) 38 38 eslint-plugin-simple-import-sort: 39 39 specifier: 12.1.0 40 - version: 12.1.0(eslint@9.1.1) 40 + version: 12.1.0(eslint@9.2.0) 41 41 eslint-plugin-sort-keys-fix: 42 42 specifier: 1.1.2 43 43 version: 1.1.2 ··· 57 57 specifier: 5.0.5 58 58 version: 5.0.5 59 59 rollup: 60 - specifier: 4.17.0 61 - version: 4.17.0 60 + specifier: 4.17.2 61 + version: 4.17.2 62 62 rollup-plugin-dts: 63 63 specifier: 6.1.0 64 - version: 6.1.0(rollup@4.17.0)(typescript@5.4.5) 64 + version: 6.1.0(rollup@4.17.2)(typescript@5.4.5) 65 65 typescript: 66 66 specifier: 5.4.5 67 67 version: 5.4.5 68 68 typescript-eslint: 69 - specifier: 7.7.1 70 - version: 7.7.1(eslint@9.1.1)(typescript@5.4.5) 69 + specifier: 7.8.0 70 + version: 7.8.0(eslint@9.2.0)(typescript@5.4.5) 71 71 vitest: 72 - specifier: 1.5.2 73 - version: 1.5.2(@types/node@20.12.7) 72 + specifier: 1.6.0 73 + version: 1.6.0(@types/node@20.12.8) 74 74 75 75 docs: 76 76 dependencies: ··· 80 80 devDependencies: 81 81 vitepress: 82 82 specifier: 1.1.4 83 - version: 1.1.4(@algolia/client-search@4.23.3)(@types/node@20.12.7)(search-insights@2.13.0)(typescript@5.4.5) 83 + version: 1.1.4(@algolia/client-search@4.23.3)(@types/node@20.12.8)(search-insights@2.13.0)(typescript@5.4.5) 84 84 85 85 examples/openapi-ts-axios: 86 86 dependencies: ··· 107 107 specifier: 18.3.0 108 108 version: 18.3.0 109 109 '@typescript-eslint/eslint-plugin': 110 - specifier: 7.7.1 111 - version: 7.7.1(@typescript-eslint/parser@7.7.1)(eslint@9.1.1)(typescript@5.4.5) 110 + specifier: 7.8.0 111 + version: 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@9.2.0)(typescript@5.4.5) 112 112 '@typescript-eslint/parser': 113 - specifier: 7.7.1 114 - version: 7.7.1(eslint@9.1.1)(typescript@5.4.5) 113 + specifier: 7.8.0 114 + version: 7.8.0(eslint@9.2.0)(typescript@5.4.5) 115 115 '@vitejs/plugin-react': 116 116 specifier: 4.2.1 117 - version: 4.2.1(vite@5.2.10) 117 + version: 4.2.1(vite@5.2.11) 118 118 eslint: 119 - specifier: 9.1.1 120 - version: 9.1.1 119 + specifier: 9.2.0 120 + version: 9.2.0 121 121 eslint-plugin-react-hooks: 122 122 specifier: 4.6.2 123 - version: 4.6.2(eslint@9.1.1) 123 + version: 4.6.2(eslint@9.2.0) 124 124 eslint-plugin-react-refresh: 125 125 specifier: 0.4.6 126 - version: 0.4.6(eslint@9.1.1) 126 + version: 0.4.6(eslint@9.2.0) 127 127 prettier: 128 128 specifier: 3.2.5 129 129 version: 3.2.5 ··· 131 131 specifier: 5.4.5 132 132 version: 5.4.5 133 133 vite: 134 - specifier: 5.2.10 135 - version: 5.2.10(@types/node@20.12.7) 134 + specifier: 5.2.11 135 + version: 5.2.11(@types/node@20.12.8) 136 136 137 137 examples/openapi-ts-fetch: 138 138 dependencies: ··· 156 156 specifier: 18.3.0 157 157 version: 18.3.0 158 158 '@typescript-eslint/eslint-plugin': 159 - specifier: 7.7.1 160 - version: 7.7.1(@typescript-eslint/parser@7.7.1)(eslint@9.1.1)(typescript@5.4.5) 159 + specifier: 7.8.0 160 + version: 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@9.2.0)(typescript@5.4.5) 161 161 '@typescript-eslint/parser': 162 - specifier: 7.7.1 163 - version: 7.7.1(eslint@9.1.1)(typescript@5.4.5) 162 + specifier: 7.8.0 163 + version: 7.8.0(eslint@9.2.0)(typescript@5.4.5) 164 164 '@vitejs/plugin-react': 165 165 specifier: 4.2.1 166 - version: 4.2.1(vite@5.2.10) 166 + version: 4.2.1(vite@5.2.11) 167 167 eslint: 168 - specifier: 9.1.1 169 - version: 9.1.1 168 + specifier: 9.2.0 169 + version: 9.2.0 170 170 eslint-plugin-react-hooks: 171 171 specifier: 4.6.2 172 - version: 4.6.2(eslint@9.1.1) 172 + version: 4.6.2(eslint@9.2.0) 173 173 eslint-plugin-react-refresh: 174 174 specifier: 0.4.6 175 - version: 0.4.6(eslint@9.1.1) 175 + version: 0.4.6(eslint@9.2.0) 176 176 prettier: 177 177 specifier: 3.2.5 178 178 version: 3.2.5 ··· 180 180 specifier: 5.4.5 181 181 version: 5.4.5 182 182 vite: 183 - specifier: 5.2.10 184 - version: 5.2.10(@types/node@20.12.7) 183 + specifier: 5.2.11 184 + version: 5.2.11(@types/node@20.12.8) 185 185 186 186 packages/client-axios: 187 187 dependencies: ··· 221 221 devDependencies: 222 222 '@angular-devkit/build-angular': 223 223 specifier: 17.3.6 224 - version: 17.3.6(@angular/compiler-cli@17.3.6)(@types/express@4.17.21)(@types/node@20.12.7)(typescript@5.4.5) 224 + version: 17.3.6(@angular/compiler-cli@17.3.7)(@types/express@4.17.21)(@types/node@20.12.8)(typescript@5.4.5) 225 225 '@angular/animations': 226 - specifier: 17.3.6 227 - version: 17.3.6(@angular/core@17.3.6) 226 + specifier: 17.3.7 227 + version: 17.3.7(@angular/core@17.3.7) 228 228 '@angular/cli': 229 229 specifier: 17.3.6 230 230 version: 17.3.6 231 231 '@angular/common': 232 - specifier: 17.3.6 233 - version: 17.3.6(@angular/core@17.3.6)(rxjs@7.8.1) 232 + specifier: 17.3.7 233 + version: 17.3.7(@angular/core@17.3.7)(rxjs@7.8.1) 234 234 '@angular/compiler': 235 - specifier: 17.3.6 236 - version: 17.3.6(@angular/core@17.3.6) 235 + specifier: 17.3.7 236 + version: 17.3.7(@angular/core@17.3.7) 237 237 '@angular/compiler-cli': 238 - specifier: 17.3.6 239 - version: 17.3.6(@angular/compiler@17.3.6)(typescript@5.4.5) 238 + specifier: 17.3.7 239 + version: 17.3.7(@angular/compiler@17.3.7)(typescript@5.4.5) 240 240 '@angular/core': 241 - specifier: 17.3.6 242 - version: 17.3.6(rxjs@7.8.1)(zone.js@0.14.4) 241 + specifier: 17.3.7 242 + version: 17.3.7(rxjs@7.8.1)(zone.js@0.14.5) 243 243 '@angular/forms': 244 - specifier: 17.3.6 245 - version: 17.3.6(@angular/common@17.3.6)(@angular/core@17.3.6)(@angular/platform-browser@17.3.6)(rxjs@7.8.1) 244 + specifier: 17.3.7 245 + version: 17.3.7(@angular/common@17.3.7)(@angular/core@17.3.7)(@angular/platform-browser@17.3.7)(rxjs@7.8.1) 246 246 '@angular/platform-browser': 247 - specifier: 17.3.6 248 - version: 17.3.6(@angular/animations@17.3.6)(@angular/common@17.3.6)(@angular/core@17.3.6) 247 + specifier: 17.3.7 248 + version: 17.3.7(@angular/animations@17.3.7)(@angular/common@17.3.7)(@angular/core@17.3.7) 249 249 '@angular/platform-browser-dynamic': 250 - specifier: 17.3.6 251 - version: 17.3.6(@angular/common@17.3.6)(@angular/compiler@17.3.6)(@angular/core@17.3.6)(@angular/platform-browser@17.3.6) 250 + specifier: 17.3.7 251 + version: 17.3.7(@angular/common@17.3.7)(@angular/compiler@17.3.7)(@angular/core@17.3.7)(@angular/platform-browser@17.3.7) 252 252 '@angular/router': 253 - specifier: 17.3.6 254 - version: 17.3.6(@angular/common@17.3.6)(@angular/core@17.3.6)(@angular/platform-browser@17.3.6)(rxjs@7.8.1) 253 + specifier: 17.3.7 254 + version: 17.3.7(@angular/common@17.3.7)(@angular/core@17.3.7)(@angular/platform-browser@17.3.7)(rxjs@7.8.1) 255 255 '@rollup/plugin-json': 256 256 specifier: 6.1.0 257 - version: 6.1.0(rollup@4.17.0) 257 + version: 6.1.0(rollup@4.17.2) 258 258 '@rollup/plugin-node-resolve': 259 259 specifier: 15.2.3 260 - version: 15.2.3(rollup@4.17.0) 260 + version: 15.2.3(rollup@4.17.2) 261 261 '@types/cross-spawn': 262 262 specifier: 6.0.6 263 263 version: 6.0.6 ··· 271 271 specifier: 7.0.3 272 272 version: 7.0.3 273 273 eslint: 274 - specifier: 9.1.1 275 - version: 9.1.1 274 + specifier: 9.2.0 275 + version: 9.2.0 276 276 express: 277 277 specifier: 4.19.2 278 278 version: 4.19.2 ··· 293 293 version: 7.8.1 294 294 ts-node: 295 295 specifier: 10.9.2 296 - version: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) 296 + version: 10.9.2(@types/node@20.12.8)(typescript@5.4.5) 297 297 tslib: 298 298 specifier: 2.6.2 299 299 version: 2.6.2 ··· 471 471 - chokidar 472 472 dev: true 473 473 474 - /@angular-devkit/build-angular@17.3.6(@angular/compiler-cli@17.3.6)(@types/express@4.17.21)(@types/node@20.12.7)(typescript@5.4.5): 474 + /@angular-devkit/build-angular@17.3.6(@angular/compiler-cli@17.3.7)(@types/express@4.17.21)(@types/node@20.12.8)(typescript@5.4.5): 475 475 resolution: {integrity: sha512-K4CEZvhQZUUOpmXPVoI1YBM8BARbIlqE6FZRxakmnr+YOtVTYE5s+Dr1wgja8hZIohNz6L7j167G9Aut7oPU/w==} 476 476 engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} 477 477 peerDependencies: ··· 516 516 '@angular-devkit/architect': 0.1703.6 517 517 '@angular-devkit/build-webpack': 0.1703.6(webpack-dev-server@4.15.1)(webpack@5.90.3) 518 518 '@angular-devkit/core': 17.3.6 519 - '@angular/compiler-cli': 17.3.6(@angular/compiler@17.3.6)(typescript@5.4.5) 519 + '@angular/compiler-cli': 17.3.7(@angular/compiler@17.3.7)(typescript@5.4.5) 520 520 '@babel/core': 7.24.0 521 521 '@babel/generator': 7.23.6 522 522 '@babel/helper-annotate-as-pure': 7.22.5 ··· 527 527 '@babel/preset-env': 7.24.0(@babel/core@7.24.0) 528 528 '@babel/runtime': 7.24.0 529 529 '@discoveryjs/json-ext': 0.5.7 530 - '@ngtools/webpack': 17.3.6(@angular/compiler-cli@17.3.6)(typescript@5.4.5)(webpack@5.90.3) 530 + '@ngtools/webpack': 17.3.6(@angular/compiler-cli@17.3.7)(typescript@5.4.5)(webpack@5.90.3) 531 531 '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.1.7) 532 532 ansi-colors: 4.1.3 533 533 autoprefixer: 10.4.18(postcss@8.4.35) ··· 570 570 tslib: 2.6.2 571 571 typescript: 5.4.5 572 572 undici: 6.11.1 573 - vite: 5.1.7(@types/node@20.12.7)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) 573 + vite: 5.1.7(@types/node@20.12.8)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) 574 574 watchpack: 2.4.0 575 575 webpack: 5.90.3(esbuild@0.20.1) 576 576 webpack-dev-middleware: 6.1.2(webpack@5.90.3) ··· 644 644 - chokidar 645 645 dev: true 646 646 647 - /@angular/animations@17.3.6(@angular/core@17.3.6): 648 - resolution: {integrity: sha512-ev99cnmc1S/SXYz9OwOyZQyHXHiUf+ZwQFpjYBRPoyKqZV4sOYMlyBbfjBO/GgCVrsGfMvBsCI6PtY3yquuabA==} 647 + /@angular/animations@17.3.7(@angular/core@17.3.7): 648 + resolution: {integrity: sha512-ahenGALPPweeHgqtl9BMkGIAV4fUNI5kOWUrLNbKBfwIJN+aOBOYV1Jz6NKUQq6eYn/1ZYtm0f3lIkHIdtLKEw==} 649 649 engines: {node: ^18.13.0 || >=20.9.0} 650 650 peerDependencies: 651 - '@angular/core': 17.3.6 651 + '@angular/core': 17.3.7 652 652 dependencies: 653 - '@angular/core': 17.3.6(rxjs@7.8.1)(zone.js@0.14.4) 653 + '@angular/core': 17.3.7(rxjs@7.8.1)(zone.js@0.14.5) 654 654 tslib: 2.6.2 655 655 dev: true 656 656 ··· 683 683 - supports-color 684 684 dev: true 685 685 686 - /@angular/common@17.3.6(@angular/core@17.3.6)(rxjs@7.8.1): 687 - resolution: {integrity: sha512-ufviCFzQQKWcwc2j3Zi8bHbwkvqh4QU6GDH0u0usOee8xd8KrjgcYl3vD0r1/yxlDsd53Wg9kNRvz/fY+5qQoQ==} 686 + /@angular/common@17.3.7(@angular/core@17.3.7)(rxjs@7.8.1): 687 + resolution: {integrity: sha512-A7LRJu1vVCGGgrfZXjU+njz50SiU4weheKCar5PIUprcdIofS1IrHAJDqYh+kwXxkjXbZMOr/ijQY0+AESLEsw==} 688 688 engines: {node: ^18.13.0 || >=20.9.0} 689 689 peerDependencies: 690 - '@angular/core': 17.3.6 690 + '@angular/core': 17.3.7 691 691 rxjs: ^6.5.3 || ^7.4.0 692 692 dependencies: 693 - '@angular/core': 17.3.6(rxjs@7.8.1)(zone.js@0.14.4) 693 + '@angular/core': 17.3.7(rxjs@7.8.1)(zone.js@0.14.5) 694 694 rxjs: 7.8.1 695 695 tslib: 2.6.2 696 696 dev: true 697 697 698 - /@angular/compiler-cli@17.3.6(@angular/compiler@17.3.6)(typescript@5.4.5): 699 - resolution: {integrity: sha512-LaoUkY6uzcNocIEHJBvexvuU0a333IRQaG3Sj5IXhM1t864wTsfycn6yWJcQ7PhklB8BtNqiMbUQuEFtkxT8pg==} 698 + /@angular/compiler-cli@17.3.7(@angular/compiler@17.3.7)(typescript@5.4.5): 699 + resolution: {integrity: sha512-vSg5IQZ9jGmvYjpbfH8KbH4Sl1IVeE+Mr1ogcxkGEsURSRvKo7EWc0K7LSEI9+gg0VLamMiP9EyCJdPxiJeLJQ==} 700 700 engines: {node: ^18.13.0 || >=20.9.0} 701 701 hasBin: true 702 702 peerDependencies: 703 - '@angular/compiler': 17.3.6 703 + '@angular/compiler': 17.3.7 704 704 typescript: '>=5.2 <5.5' 705 705 dependencies: 706 - '@angular/compiler': 17.3.6(@angular/core@17.3.6) 706 + '@angular/compiler': 17.3.7(@angular/core@17.3.7) 707 707 '@babel/core': 7.23.9 708 708 '@jridgewell/sourcemap-codec': 1.4.15 709 709 chokidar: 3.6.0 ··· 717 717 - supports-color 718 718 dev: true 719 719 720 - /@angular/compiler@17.3.6(@angular/core@17.3.6): 721 - resolution: {integrity: sha512-ybx9O76RGv4J97IThiSVvvWukuGcuXu50KsBDPUd874BFT3ml0OcRGhXoMh/isz7EQipiiGgsA51cJVTLES5Zw==} 720 + /@angular/compiler@17.3.7(@angular/core@17.3.7): 721 + resolution: {integrity: sha512-AlKiqPoxnrpQ0hn13fIaQPSVodaVAIjBW4vpFyuKFqs2LBKg6iolwZ21s8rEI0KR2gXl+8ugj0/UZ6YADiVM5w==} 722 722 engines: {node: ^18.13.0 || >=20.9.0} 723 723 peerDependencies: 724 - '@angular/core': 17.3.6 724 + '@angular/core': 17.3.7 725 725 peerDependenciesMeta: 726 726 '@angular/core': 727 727 optional: true 728 728 dependencies: 729 - '@angular/core': 17.3.6(rxjs@7.8.1)(zone.js@0.14.4) 729 + '@angular/core': 17.3.7(rxjs@7.8.1)(zone.js@0.14.5) 730 730 tslib: 2.6.2 731 731 dev: true 732 732 733 - /@angular/core@17.3.6(rxjs@7.8.1)(zone.js@0.14.4): 734 - resolution: {integrity: sha512-8IoeZVNqyeHA+H2dR3VFfz76/TFN1BpXP0aABs2aIUNVQRYlKxALSm1UlavijX8IT0uvd/6GXwE3WgymTcg0wg==} 733 + /@angular/core@17.3.7(rxjs@7.8.1)(zone.js@0.14.5): 734 + resolution: {integrity: sha512-HWcrbxqnvIMSxFuQdN0KPt08bc87hqr0LKm89yuRTUwx/2sNJlNQUobk6aJj4trswGBttcRDT+GOS4DQP2Nr4g==} 735 735 engines: {node: ^18.13.0 || >=20.9.0} 736 736 peerDependencies: 737 737 rxjs: ^6.5.3 || ^7.4.0 ··· 739 739 dependencies: 740 740 rxjs: 7.8.1 741 741 tslib: 2.6.2 742 - zone.js: 0.14.4 742 + zone.js: 0.14.5 743 743 dev: true 744 744 745 - /@angular/forms@17.3.6(@angular/common@17.3.6)(@angular/core@17.3.6)(@angular/platform-browser@17.3.6)(rxjs@7.8.1): 746 - resolution: {integrity: sha512-WXxWhwvgRfYLNP2dB4Qe83tavEh2LnS4H0uoiecWHXijW2R9z8304X1vEyS1EtQK7o/s8fCVDVDjeY+hxLnCLw==} 745 + /@angular/forms@17.3.7(@angular/common@17.3.7)(@angular/core@17.3.7)(@angular/platform-browser@17.3.7)(rxjs@7.8.1): 746 + resolution: {integrity: sha512-FEhXh/VmT++XCoO8i7bBtzxG7Am/cE1zrr9aF+fWW+4jpWvJvVN1IaSiJxgBB+iPsOJ9lTBRwfRW3onlcDkhrw==} 747 747 engines: {node: ^18.13.0 || >=20.9.0} 748 748 peerDependencies: 749 - '@angular/common': 17.3.6 750 - '@angular/core': 17.3.6 751 - '@angular/platform-browser': 17.3.6 749 + '@angular/common': 17.3.7 750 + '@angular/core': 17.3.7 751 + '@angular/platform-browser': 17.3.7 752 752 rxjs: ^6.5.3 || ^7.4.0 753 753 dependencies: 754 - '@angular/common': 17.3.6(@angular/core@17.3.6)(rxjs@7.8.1) 755 - '@angular/core': 17.3.6(rxjs@7.8.1)(zone.js@0.14.4) 756 - '@angular/platform-browser': 17.3.6(@angular/animations@17.3.6)(@angular/common@17.3.6)(@angular/core@17.3.6) 754 + '@angular/common': 17.3.7(@angular/core@17.3.7)(rxjs@7.8.1) 755 + '@angular/core': 17.3.7(rxjs@7.8.1)(zone.js@0.14.5) 756 + '@angular/platform-browser': 17.3.7(@angular/animations@17.3.7)(@angular/common@17.3.7)(@angular/core@17.3.7) 757 757 rxjs: 7.8.1 758 758 tslib: 2.6.2 759 759 dev: true 760 760 761 - /@angular/platform-browser-dynamic@17.3.6(@angular/common@17.3.6)(@angular/compiler@17.3.6)(@angular/core@17.3.6)(@angular/platform-browser@17.3.6): 762 - resolution: {integrity: sha512-dI+mgEROmSll042+XqkSsvkMQe6Et6L9BBiYYe7VbIFaRR9Dz5Pw2SeBLb+Ou+gWaxXc2Wc+13n442WEYWZ7Ew==} 761 + /@angular/platform-browser-dynamic@17.3.7(@angular/common@17.3.7)(@angular/compiler@17.3.7)(@angular/core@17.3.7)(@angular/platform-browser@17.3.7): 762 + resolution: {integrity: sha512-9c2I4u0L1p2v1/lW8qy+WaNHisUWbyy6wqsv2v9FfCaSM49Lxymgo9LPFPC4qEG5ei5nE+eIQ2ocRiXXsf5QkQ==} 763 763 engines: {node: ^18.13.0 || >=20.9.0} 764 764 peerDependencies: 765 - '@angular/common': 17.3.6 766 - '@angular/compiler': 17.3.6 767 - '@angular/core': 17.3.6 768 - '@angular/platform-browser': 17.3.6 765 + '@angular/common': 17.3.7 766 + '@angular/compiler': 17.3.7 767 + '@angular/core': 17.3.7 768 + '@angular/platform-browser': 17.3.7 769 769 dependencies: 770 - '@angular/common': 17.3.6(@angular/core@17.3.6)(rxjs@7.8.1) 771 - '@angular/compiler': 17.3.6(@angular/core@17.3.6) 772 - '@angular/core': 17.3.6(rxjs@7.8.1)(zone.js@0.14.4) 773 - '@angular/platform-browser': 17.3.6(@angular/animations@17.3.6)(@angular/common@17.3.6)(@angular/core@17.3.6) 770 + '@angular/common': 17.3.7(@angular/core@17.3.7)(rxjs@7.8.1) 771 + '@angular/compiler': 17.3.7(@angular/core@17.3.7) 772 + '@angular/core': 17.3.7(rxjs@7.8.1)(zone.js@0.14.5) 773 + '@angular/platform-browser': 17.3.7(@angular/animations@17.3.7)(@angular/common@17.3.7)(@angular/core@17.3.7) 774 774 tslib: 2.6.2 775 775 dev: true 776 776 777 - /@angular/platform-browser@17.3.6(@angular/animations@17.3.6)(@angular/common@17.3.6)(@angular/core@17.3.6): 778 - resolution: {integrity: sha512-UikrgvMwtZIXp2pCP5AtkM7ibz2B5wBiGpnhhkYsqHKy9ndKVDA+3B5Z+/j9xeYYdsJAAtHl45zqILewyg+4iw==} 777 + /@angular/platform-browser@17.3.7(@angular/animations@17.3.7)(@angular/common@17.3.7)(@angular/core@17.3.7): 778 + resolution: {integrity: sha512-Nn8ZMaftAvO9dEwribWdNv+QBHhYIBrRkv85G6et80AXfXoYAr/xcfnQECRFtZgPmANqHC5auv/xrmExQG+Yeg==} 779 779 engines: {node: ^18.13.0 || >=20.9.0} 780 780 peerDependencies: 781 - '@angular/animations': 17.3.6 782 - '@angular/common': 17.3.6 783 - '@angular/core': 17.3.6 781 + '@angular/animations': 17.3.7 782 + '@angular/common': 17.3.7 783 + '@angular/core': 17.3.7 784 784 peerDependenciesMeta: 785 785 '@angular/animations': 786 786 optional: true 787 787 dependencies: 788 - '@angular/animations': 17.3.6(@angular/core@17.3.6) 789 - '@angular/common': 17.3.6(@angular/core@17.3.6)(rxjs@7.8.1) 790 - '@angular/core': 17.3.6(rxjs@7.8.1)(zone.js@0.14.4) 788 + '@angular/animations': 17.3.7(@angular/core@17.3.7) 789 + '@angular/common': 17.3.7(@angular/core@17.3.7)(rxjs@7.8.1) 790 + '@angular/core': 17.3.7(rxjs@7.8.1)(zone.js@0.14.5) 791 791 tslib: 2.6.2 792 792 dev: true 793 793 794 - /@angular/router@17.3.6(@angular/common@17.3.6)(@angular/core@17.3.6)(@angular/platform-browser@17.3.6)(rxjs@7.8.1): 795 - resolution: {integrity: sha512-Gws3zukTlPO5lIGP0bmWBkmbRIRKvpPq6vs3BqQlbKsrfBh45SPvIRbx+BSv6WYUchQzfW7DFDXnQtiTEGGQNg==} 794 + /@angular/router@17.3.7(@angular/common@17.3.7)(@angular/core@17.3.7)(@angular/platform-browser@17.3.7)(rxjs@7.8.1): 795 + resolution: {integrity: sha512-lMkuRrc1ZjP5JPDxNHqoAhB0uAnfPQ/q6mJrw1s8IZoVV6VyM+FxR5r13ajNcXWC38xy/YhBjpXPF1vBdxuLXg==} 796 796 engines: {node: ^18.13.0 || >=20.9.0} 797 797 peerDependencies: 798 - '@angular/common': 17.3.6 799 - '@angular/core': 17.3.6 800 - '@angular/platform-browser': 17.3.6 798 + '@angular/common': 17.3.7 799 + '@angular/core': 17.3.7 800 + '@angular/platform-browser': 17.3.7 801 801 rxjs: ^6.5.3 || ^7.4.0 802 802 dependencies: 803 - '@angular/common': 17.3.6(@angular/core@17.3.6)(rxjs@7.8.1) 804 - '@angular/core': 17.3.6(rxjs@7.8.1)(zone.js@0.14.4) 805 - '@angular/platform-browser': 17.3.6(@angular/animations@17.3.6)(@angular/common@17.3.6)(@angular/core@17.3.6) 803 + '@angular/common': 17.3.7(@angular/core@17.3.7)(rxjs@7.8.1) 804 + '@angular/core': 17.3.7(rxjs@7.8.1)(zone.js@0.14.5) 805 + '@angular/platform-browser': 17.3.7(@angular/animations@17.3.7)(@angular/common@17.3.7)(@angular/core@17.3.7) 806 806 rxjs: 7.8.1 807 807 tslib: 2.6.2 808 808 dev: true ··· 839 839 '@babel/helper-compilation-targets': 7.23.6 840 840 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) 841 841 '@babel/helpers': 7.24.4 842 - '@babel/parser': 7.24.4 842 + '@babel/parser': 7.24.5 843 843 '@babel/template': 7.24.0 844 844 '@babel/traverse': 7.24.1 845 - '@babel/types': 7.24.0 845 + '@babel/types': 7.24.5 846 846 convert-source-map: 2.0.0 847 847 debug: 4.3.4 848 848 gensync: 1.0.0-beta.2 ··· 862 862 '@babel/helper-compilation-targets': 7.23.6 863 863 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) 864 864 '@babel/helpers': 7.24.4 865 - '@babel/parser': 7.24.4 865 + '@babel/parser': 7.24.5 866 866 '@babel/template': 7.24.0 867 867 '@babel/traverse': 7.24.1 868 - '@babel/types': 7.24.0 868 + '@babel/types': 7.24.5 869 869 convert-source-map: 2.0.0 870 870 debug: 4.3.4 871 871 gensync: 1.0.0-beta.2 ··· 879 879 resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} 880 880 engines: {node: '>=6.9.0'} 881 881 dependencies: 882 - '@babel/types': 7.24.0 882 + '@babel/types': 7.24.5 883 883 '@jridgewell/gen-mapping': 0.3.5 884 884 '@jridgewell/trace-mapping': 0.3.25 885 885 jsesc: 2.5.2 ··· 889 889 resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} 890 890 engines: {node: '>=6.9.0'} 891 891 dependencies: 892 - '@babel/types': 7.24.0 892 + '@babel/types': 7.24.5 893 893 '@jridgewell/gen-mapping': 0.3.5 894 894 '@jridgewell/trace-mapping': 0.3.25 895 895 jsesc: 2.5.2 ··· 899 899 resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} 900 900 engines: {node: '>=6.9.0'} 901 901 dependencies: 902 - '@babel/types': 7.24.0 902 + '@babel/types': 7.24.5 903 903 dev: true 904 904 905 905 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: 906 906 resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} 907 907 engines: {node: '>=6.9.0'} 908 908 dependencies: 909 - '@babel/types': 7.24.0 909 + '@babel/types': 7.24.5 910 910 dev: true 911 911 912 912 /@babel/helper-compilation-targets@7.23.6: ··· 990 990 engines: {node: '>=6.9.0'} 991 991 dependencies: 992 992 '@babel/template': 7.24.0 993 - '@babel/types': 7.24.0 993 + '@babel/types': 7.24.5 994 994 dev: true 995 995 996 996 /@babel/helper-hoist-variables@7.22.5: 997 997 resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 998 998 engines: {node: '>=6.9.0'} 999 999 dependencies: 1000 - '@babel/types': 7.24.0 1000 + '@babel/types': 7.24.5 1001 1001 dev: true 1002 1002 1003 1003 /@babel/helper-member-expression-to-functions@7.23.0: 1004 1004 resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} 1005 1005 engines: {node: '>=6.9.0'} 1006 1006 dependencies: 1007 - '@babel/types': 7.24.0 1007 + '@babel/types': 7.24.5 1008 1008 dev: true 1009 1009 1010 1010 /@babel/helper-module-imports@7.24.3: 1011 1011 resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} 1012 1012 engines: {node: '>=6.9.0'} 1013 1013 dependencies: 1014 - '@babel/types': 7.24.0 1014 + '@babel/types': 7.24.5 1015 1015 dev: true 1016 1016 1017 1017 /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): ··· 1025 1025 '@babel/helper-module-imports': 7.24.3 1026 1026 '@babel/helper-simple-access': 7.22.5 1027 1027 '@babel/helper-split-export-declaration': 7.22.6 1028 - '@babel/helper-validator-identifier': 7.22.20 1028 + '@babel/helper-validator-identifier': 7.24.5 1029 1029 dev: true 1030 1030 1031 1031 /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): ··· 1039 1039 '@babel/helper-module-imports': 7.24.3 1040 1040 '@babel/helper-simple-access': 7.22.5 1041 1041 '@babel/helper-split-export-declaration': 7.22.6 1042 - '@babel/helper-validator-identifier': 7.22.20 1042 + '@babel/helper-validator-identifier': 7.24.5 1043 1043 dev: true 1044 1044 1045 1045 /@babel/helper-optimise-call-expression@7.22.5: 1046 1046 resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} 1047 1047 engines: {node: '>=6.9.0'} 1048 1048 dependencies: 1049 - '@babel/types': 7.24.0 1049 + '@babel/types': 7.24.5 1050 1050 dev: true 1051 1051 1052 1052 /@babel/helper-plugin-utils@7.24.0: ··· 1082 1082 resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 1083 1083 engines: {node: '>=6.9.0'} 1084 1084 dependencies: 1085 - '@babel/types': 7.24.0 1085 + '@babel/types': 7.24.5 1086 1086 dev: true 1087 1087 1088 1088 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: 1089 1089 resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} 1090 1090 engines: {node: '>=6.9.0'} 1091 1091 dependencies: 1092 - '@babel/types': 7.24.0 1092 + '@babel/types': 7.24.5 1093 1093 dev: true 1094 1094 1095 1095 /@babel/helper-split-export-declaration@7.22.6: 1096 1096 resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 1097 1097 engines: {node: '>=6.9.0'} 1098 1098 dependencies: 1099 - '@babel/types': 7.24.0 1099 + '@babel/types': 7.24.5 1100 1100 dev: true 1101 1101 1102 1102 /@babel/helper-string-parser@7.24.1: ··· 1104 1104 engines: {node: '>=6.9.0'} 1105 1105 dev: true 1106 1106 1107 - /@babel/helper-validator-identifier@7.22.20: 1108 - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 1107 + /@babel/helper-validator-identifier@7.24.5: 1108 + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} 1109 1109 engines: {node: '>=6.9.0'} 1110 1110 dev: true 1111 1111 ··· 1120 1120 dependencies: 1121 1121 '@babel/helper-function-name': 7.23.0 1122 1122 '@babel/template': 7.24.0 1123 - '@babel/types': 7.24.0 1123 + '@babel/types': 7.24.5 1124 1124 dev: true 1125 1125 1126 1126 /@babel/helpers@7.24.4: ··· 1129 1129 dependencies: 1130 1130 '@babel/template': 7.24.0 1131 1131 '@babel/traverse': 7.24.1 1132 - '@babel/types': 7.24.0 1132 + '@babel/types': 7.24.5 1133 1133 transitivePeerDependencies: 1134 1134 - supports-color 1135 1135 dev: true ··· 1137 1137 /@babel/highlight@7.24.2: 1138 1138 resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} 1139 1139 engines: {node: '>=6.9.0'} 1140 + requiresBuild: true 1140 1141 dependencies: 1141 - '@babel/helper-validator-identifier': 7.22.20 1142 + '@babel/helper-validator-identifier': 7.24.5 1142 1143 chalk: 2.4.2 1143 1144 js-tokens: 4.0.0 1144 1145 picocolors: 1.0.0 1145 1146 dev: true 1146 1147 1147 - /@babel/parser@7.24.4: 1148 - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} 1148 + /@babel/parser@7.24.5: 1149 + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} 1149 1150 engines: {node: '>=6.0.0'} 1150 1151 hasBin: true 1151 1152 dependencies: 1152 - '@babel/types': 7.24.0 1153 + '@babel/types': 7.24.5 1153 1154 dev: true 1154 1155 1155 1156 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.0): ··· 1631 1632 '@babel/helper-hoist-variables': 7.22.5 1632 1633 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) 1633 1634 '@babel/helper-plugin-utils': 7.24.0 1634 - '@babel/helper-validator-identifier': 7.22.20 1635 + '@babel/helper-validator-identifier': 7.24.5 1635 1636 dev: true 1636 1637 1637 1638 /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.0): ··· 2029 2030 dependencies: 2030 2031 '@babel/core': 7.24.0 2031 2032 '@babel/helper-plugin-utils': 7.24.0 2032 - '@babel/types': 7.24.0 2033 + '@babel/types': 7.24.5 2033 2034 esutils: 2.0.3 2034 2035 dev: true 2035 2036 ··· 2056 2057 engines: {node: '>=6.9.0'} 2057 2058 dependencies: 2058 2059 '@babel/code-frame': 7.24.2 2059 - '@babel/parser': 7.24.4 2060 - '@babel/types': 7.24.0 2060 + '@babel/parser': 7.24.5 2061 + '@babel/types': 7.24.5 2061 2062 dev: true 2062 2063 2063 2064 /@babel/traverse@7.24.1: ··· 2070 2071 '@babel/helper-function-name': 7.23.0 2071 2072 '@babel/helper-hoist-variables': 7.22.5 2072 2073 '@babel/helper-split-export-declaration': 7.22.6 2073 - '@babel/parser': 7.24.4 2074 - '@babel/types': 7.24.0 2074 + '@babel/parser': 7.24.5 2075 + '@babel/types': 7.24.5 2075 2076 debug: 4.3.4 2076 2077 globals: 11.12.0 2077 2078 transitivePeerDependencies: 2078 2079 - supports-color 2079 2080 dev: true 2080 2081 2081 - /@babel/types@7.24.0: 2082 - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} 2082 + /@babel/types@7.24.5: 2083 + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} 2083 2084 engines: {node: '>=6.9.0'} 2084 2085 dependencies: 2085 2086 '@babel/helper-string-parser': 7.24.1 2086 - '@babel/helper-validator-identifier': 7.22.20 2087 + '@babel/helper-validator-identifier': 7.24.5 2087 2088 to-fast-properties: 2.0.0 2088 2089 dev: true 2089 2090 ··· 2959 2960 dev: true 2960 2961 optional: true 2961 2962 2962 - /@eslint-community/eslint-utils@4.4.0(eslint@9.1.1): 2963 + /@eslint-community/eslint-utils@4.4.0(eslint@9.2.0): 2963 2964 resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 2964 2965 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 2965 2966 peerDependencies: 2966 2967 eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 2967 2968 dependencies: 2968 - eslint: 9.1.1 2969 + eslint: 9.2.0 2969 2970 eslint-visitor-keys: 3.4.3 2970 2971 dev: true 2971 2972 ··· 2991 2992 - supports-color 2992 2993 dev: true 2993 2994 2994 - /@eslint/js@9.1.1: 2995 - resolution: {integrity: sha512-5WoDz3Y19Bg2BnErkZTp0en+c/i9PvgFS7MBe1+m60HjFr0hrphlAGp4yzI7pxpt4xShln4ZyYp4neJm8hmOkQ==} 2995 + /@eslint/js@9.2.0: 2996 + resolution: {integrity: sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==} 2996 2997 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2997 2998 dev: true 2998 2999 ··· 3016 3017 resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 3017 3018 dev: true 3018 3019 3019 - /@humanwhocodes/retry@0.2.3: 3020 - resolution: {integrity: sha512-X38nUbachlb01YMlvPFojKoiXq+LzZvuSce70KPMPdeM1Rj03k4dR7lDslhbqXn3Ang4EU3+EAmwEAsbrjHW3g==} 3020 + /@humanwhocodes/retry@0.2.4: 3021 + resolution: {integrity: sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==} 3021 3022 engines: {node: '>=18.18'} 3022 3023 dev: true 3023 3024 ··· 3135 3136 read-yaml-file: 1.1.0 3136 3137 dev: true 3137 3138 3138 - /@ngtools/webpack@17.3.6(@angular/compiler-cli@17.3.6)(typescript@5.4.5)(webpack@5.90.3): 3139 + /@ngtools/webpack@17.3.6(@angular/compiler-cli@17.3.7)(typescript@5.4.5)(webpack@5.90.3): 3139 3140 resolution: {integrity: sha512-equxbgh2DKzZtiFMoVf1KD4yJcH1q8lpqQ/GSPPQUvONcmHrr+yqdRUdaJ7oZCyCYmXF/nByBxtMKtJr6nKZVg==} 3140 3141 engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} 3141 3142 peerDependencies: ··· 3143 3144 typescript: '>=5.2 <5.5' 3144 3145 webpack: ^5.54.0 3145 3146 dependencies: 3146 - '@angular/compiler-cli': 17.3.6(@angular/compiler@17.3.6)(typescript@5.4.5) 3147 + '@angular/compiler-cli': 17.3.7(@angular/compiler@17.3.7)(typescript@5.4.5) 3147 3148 typescript: 5.4.5 3148 3149 webpack: 5.90.3(esbuild@0.20.1) 3149 3150 dev: true ··· 3284 3285 - supports-color 3285 3286 dev: true 3286 3287 3287 - /@rollup/plugin-commonjs@25.0.7(rollup@4.17.0): 3288 + /@rollup/plugin-commonjs@25.0.7(rollup@4.17.2): 3288 3289 resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} 3289 3290 engines: {node: '>=14.0.0'} 3290 3291 peerDependencies: ··· 3293 3294 rollup: 3294 3295 optional: true 3295 3296 dependencies: 3296 - '@rollup/pluginutils': 5.1.0(rollup@4.17.0) 3297 + '@rollup/pluginutils': 5.1.0(rollup@4.17.2) 3297 3298 commondir: 1.0.1 3298 3299 estree-walker: 2.0.2 3299 3300 glob: 8.1.0 3300 3301 is-reference: 1.2.1 3301 3302 magic-string: 0.30.10 3302 - rollup: 4.17.0 3303 + rollup: 4.17.2 3303 3304 dev: true 3304 3305 3305 - /@rollup/plugin-json@6.1.0(rollup@4.17.0): 3306 + /@rollup/plugin-json@6.1.0(rollup@4.17.2): 3306 3307 resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} 3307 3308 engines: {node: '>=14.0.0'} 3308 3309 peerDependencies: ··· 3311 3312 rollup: 3312 3313 optional: true 3313 3314 dependencies: 3314 - '@rollup/pluginutils': 5.1.0(rollup@4.17.0) 3315 - rollup: 4.17.0 3315 + '@rollup/pluginutils': 5.1.0(rollup@4.17.2) 3316 + rollup: 4.17.2 3316 3317 dev: true 3317 3318 3318 - /@rollup/plugin-node-resolve@15.2.3(rollup@4.17.0): 3319 + /@rollup/plugin-node-resolve@15.2.3(rollup@4.17.2): 3319 3320 resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} 3320 3321 engines: {node: '>=14.0.0'} 3321 3322 peerDependencies: ··· 3324 3325 rollup: 3325 3326 optional: true 3326 3327 dependencies: 3327 - '@rollup/pluginutils': 5.1.0(rollup@4.17.0) 3328 + '@rollup/pluginutils': 5.1.0(rollup@4.17.2) 3328 3329 '@types/resolve': 1.20.2 3329 3330 deepmerge: 4.3.1 3330 3331 is-builtin-module: 3.2.1 3331 3332 is-module: 1.0.0 3332 3333 resolve: 1.22.8 3333 - rollup: 4.17.0 3334 + rollup: 4.17.2 3334 3335 dev: true 3335 3336 3336 - /@rollup/plugin-terser@0.4.4(rollup@4.17.0): 3337 + /@rollup/plugin-terser@0.4.4(rollup@4.17.2): 3337 3338 resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} 3338 3339 engines: {node: '>=14.0.0'} 3339 3340 peerDependencies: ··· 3342 3343 rollup: 3343 3344 optional: true 3344 3345 dependencies: 3345 - rollup: 4.17.0 3346 + rollup: 4.17.2 3346 3347 serialize-javascript: 6.0.2 3347 3348 smob: 1.5.0 3348 3349 terser: 5.30.3 3349 3350 dev: true 3350 3351 3351 - /@rollup/plugin-typescript@11.1.6(rollup@4.17.0)(typescript@5.4.5): 3352 + /@rollup/plugin-typescript@11.1.6(rollup@4.17.2)(typescript@5.4.5): 3352 3353 resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} 3353 3354 engines: {node: '>=14.0.0'} 3354 3355 peerDependencies: ··· 3361 3362 tslib: 3362 3363 optional: true 3363 3364 dependencies: 3364 - '@rollup/pluginutils': 5.1.0(rollup@4.17.0) 3365 + '@rollup/pluginutils': 5.1.0(rollup@4.17.2) 3365 3366 resolve: 1.22.8 3366 - rollup: 4.17.0 3367 + rollup: 4.17.2 3367 3368 typescript: 5.4.5 3368 3369 dev: true 3369 3370 3370 - /@rollup/pluginutils@5.1.0(rollup@4.17.0): 3371 + /@rollup/pluginutils@5.1.0(rollup@4.17.2): 3371 3372 resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} 3372 3373 engines: {node: '>=14.0.0'} 3373 3374 peerDependencies: ··· 3379 3380 '@types/estree': 1.0.5 3380 3381 estree-walker: 2.0.2 3381 3382 picomatch: 2.3.1 3382 - rollup: 4.17.0 3383 + rollup: 4.17.2 3383 3384 dev: true 3384 3385 3385 - /@rollup/rollup-android-arm-eabi@4.17.0: 3386 - resolution: {integrity: sha512-nNvLvC2fjC+3+bHYN9uaGF3gcyy7RHGZhtl8TB/kINj9hiOQza8kWJGZh47GRPMrqeseO8U+Z8ElDMCZlWBdHA==} 3386 + /@rollup/rollup-android-arm-eabi@4.17.2: 3387 + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} 3387 3388 cpu: [arm] 3388 3389 os: [android] 3389 3390 requiresBuild: true 3390 3391 dev: true 3391 3392 optional: true 3392 3393 3393 - /@rollup/rollup-android-arm64@4.17.0: 3394 - resolution: {integrity: sha512-+kjt6dvxnyTIAo7oHeYseYhDyZ7xRKTNl/FoQI96PHkJVxoChldJnne/LzYqpqidoK1/0kX0/q+5rrYqjpth6w==} 3394 + /@rollup/rollup-android-arm64@4.17.2: 3395 + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} 3395 3396 cpu: [arm64] 3396 3397 os: [android] 3397 3398 requiresBuild: true 3398 3399 dev: true 3399 3400 optional: true 3400 3401 3401 - /@rollup/rollup-darwin-arm64@4.17.0: 3402 - resolution: {integrity: sha512-Oj6Tp0unMpGTBjvNwbSRv3DopMNLu+mjBzhKTt2zLbDJ/45fB1pltr/rqrO4bE95LzuYwhYn127pop+x/pzf5w==} 3402 + /@rollup/rollup-darwin-arm64@4.17.2: 3403 + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} 3403 3404 cpu: [arm64] 3404 3405 os: [darwin] 3405 3406 requiresBuild: true 3406 3407 dev: true 3407 3408 optional: true 3408 3409 3409 - /@rollup/rollup-darwin-x64@4.17.0: 3410 - resolution: {integrity: sha512-3nJx0T+yptxMd+v93rBRxSPTAVCv8szu/fGZDJiKX7kvRe9sENj2ggXjCH/KK1xZEmJOhaNo0c9sGMgGdfkvEw==} 3410 + /@rollup/rollup-darwin-x64@4.17.2: 3411 + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} 3411 3412 cpu: [x64] 3412 3413 os: [darwin] 3413 3414 requiresBuild: true 3414 3415 dev: true 3415 3416 optional: true 3416 3417 3417 - /@rollup/rollup-linux-arm-gnueabihf@4.17.0: 3418 - resolution: {integrity: sha512-Vb2e8p9b2lxxgqyOlBHmp6hJMu/HSU6g//6Tbr7x5V1DlPCHWLOm37nSIVK314f+IHzORyAQSqL7+9tELxX3zQ==} 3418 + /@rollup/rollup-linux-arm-gnueabihf@4.17.2: 3419 + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} 3419 3420 cpu: [arm] 3420 3421 os: [linux] 3421 3422 requiresBuild: true 3422 3423 dev: true 3423 3424 optional: true 3424 3425 3425 - /@rollup/rollup-linux-arm-musleabihf@4.17.0: 3426 - resolution: {integrity: sha512-Md60KsmC5ZIaRq/bYYDloklgU+XLEZwS2EXXVcSpiUw+13/ZASvSWQ/P92rQ9YDCL6EIoXxuQ829JkReqdYbGg==} 3426 + /@rollup/rollup-linux-arm-musleabihf@4.17.2: 3427 + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} 3427 3428 cpu: [arm] 3428 3429 os: [linux] 3429 3430 requiresBuild: true 3430 3431 dev: true 3431 3432 optional: true 3432 3433 3433 - /@rollup/rollup-linux-arm64-gnu@4.17.0: 3434 - resolution: {integrity: sha512-zL5rBFtJ+2EGnMRm2TqKjdjgFqlotSU+ZJEN37nV+fiD3I6Gy0dUh3jBWN0wSlcXVDEJYW7YBe+/2j0N9unb2w==} 3434 + /@rollup/rollup-linux-arm64-gnu@4.17.2: 3435 + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} 3435 3436 cpu: [arm64] 3436 3437 os: [linux] 3437 3438 requiresBuild: true 3438 3439 dev: true 3439 3440 optional: true 3440 3441 3441 - /@rollup/rollup-linux-arm64-musl@4.17.0: 3442 - resolution: {integrity: sha512-s2xAyNkJqUdtRVgNK4NK4P9QttS538JuX/kfVQOdZDI5FIKVAUVdLW7qhGfmaySJ1EvN/Bnj9oPm5go9u8navg==} 3442 + /@rollup/rollup-linux-arm64-musl@4.17.2: 3443 + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} 3443 3444 cpu: [arm64] 3444 3445 os: [linux] 3445 3446 requiresBuild: true 3446 3447 dev: true 3447 3448 optional: true 3448 3449 3449 - /@rollup/rollup-linux-powerpc64le-gnu@4.17.0: 3450 - resolution: {integrity: sha512-7F99yzVT67B7IUNMjLD9QCFDCyHkyCJMS1dywZrGgVFJao4VJ9szrIEgH67cR+bXQgEaY01ur/WSL6B0jtcLyA==} 3450 + /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: 3451 + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} 3451 3452 cpu: [ppc64] 3452 3453 os: [linux] 3453 3454 requiresBuild: true 3454 3455 dev: true 3455 3456 optional: true 3456 3457 3457 - /@rollup/rollup-linux-riscv64-gnu@4.17.0: 3458 - resolution: {integrity: sha512-leFtyiXisfa3Sg9pgZJwRKITWnrQfhtqDjCamnZhkZuIsk1FXmYwKoTkp6lsCgimIcneFFkHKp/yGLxDesga4g==} 3458 + /@rollup/rollup-linux-riscv64-gnu@4.17.2: 3459 + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} 3459 3460 cpu: [riscv64] 3460 3461 os: [linux] 3461 3462 requiresBuild: true 3462 3463 dev: true 3463 3464 optional: true 3464 3465 3465 - /@rollup/rollup-linux-s390x-gnu@4.17.0: 3466 - resolution: {integrity: sha512-FtOgui6qMJ4jbSXTxElsy/60LEe/3U0rXkkz2G5CJ9rbHPAvjMvI+3qF0A0fwLQ5hW+/ZC6PbnS2KfRW9JkgDQ==} 3466 + /@rollup/rollup-linux-s390x-gnu@4.17.2: 3467 + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} 3467 3468 cpu: [s390x] 3468 3469 os: [linux] 3469 3470 requiresBuild: true 3470 3471 dev: true 3471 3472 optional: true 3472 3473 3473 - /@rollup/rollup-linux-x64-gnu@4.17.0: 3474 - resolution: {integrity: sha512-v6eiam/1w3HUfU/ZjzIDodencqgrSqzlNuNtiwH7PFJHYSo1ezL0/UIzmS2lpSJF1ORNaplXeKHYmmdt81vV2g==} 3474 + /@rollup/rollup-linux-x64-gnu@4.17.2: 3475 + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} 3475 3476 cpu: [x64] 3476 3477 os: [linux] 3477 3478 requiresBuild: true 3478 3479 dev: true 3479 3480 optional: true 3480 3481 3481 - /@rollup/rollup-linux-x64-musl@4.17.0: 3482 - resolution: {integrity: sha512-OUhkSdpM5ofVlVU2k4CwVubYwiwu1a4jYWPpubzN7Vzao73GoPBowHcCfaRSFRz1SszJ3HIsk3dZYk4kzbqjgw==} 3482 + /@rollup/rollup-linux-x64-musl@4.17.2: 3483 + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} 3483 3484 cpu: [x64] 3484 3485 os: [linux] 3485 3486 requiresBuild: true 3486 3487 dev: true 3487 3488 optional: true 3488 3489 3489 - /@rollup/rollup-win32-arm64-msvc@4.17.0: 3490 - resolution: {integrity: sha512-uL7UYO/MNJPGL/yflybI+HI+n6+4vlfZmQZOCb4I+z/zy1wisHT3exh7oNQsnL6Eso0EUTEfgQ/PaGzzXf6XyQ==} 3490 + /@rollup/rollup-win32-arm64-msvc@4.17.2: 3491 + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} 3491 3492 cpu: [arm64] 3492 3493 os: [win32] 3493 3494 requiresBuild: true 3494 3495 dev: true 3495 3496 optional: true 3496 3497 3497 - /@rollup/rollup-win32-ia32-msvc@4.17.0: 3498 - resolution: {integrity: sha512-4WnSgaUiUmXILwFqREdOcqvSj6GD/7FrvSjhaDjmwakX9w4Z2F8JwiSP1AZZbuRkPqzi444UI5FPv33VKOWYFQ==} 3498 + /@rollup/rollup-win32-ia32-msvc@4.17.2: 3499 + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} 3499 3500 cpu: [ia32] 3500 3501 os: [win32] 3501 3502 requiresBuild: true 3502 3503 dev: true 3503 3504 optional: true 3504 3505 3505 - /@rollup/rollup-win32-x64-msvc@4.17.0: 3506 - resolution: {integrity: sha512-ve+D8t1prRSRnF2S3pyDtTXDlvW1Pngbz76tjgYFQW1jxVSysmQCZfPoDAo4WP+Ano8zeYp85LsArZBI12HfwQ==} 3506 + /@rollup/rollup-win32-x64-msvc@4.17.2: 3507 + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} 3507 3508 cpu: [x64] 3508 3509 os: [win32] 3509 3510 requiresBuild: true ··· 3633 3634 /@types/babel__core@7.20.5: 3634 3635 resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 3635 3636 dependencies: 3636 - '@babel/parser': 7.24.4 3637 - '@babel/types': 7.24.0 3637 + '@babel/parser': 7.24.5 3638 + '@babel/types': 7.24.5 3638 3639 '@types/babel__generator': 7.6.8 3639 3640 '@types/babel__template': 7.4.4 3640 3641 '@types/babel__traverse': 7.20.5 ··· 3643 3644 /@types/babel__generator@7.6.8: 3644 3645 resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 3645 3646 dependencies: 3646 - '@babel/types': 7.24.0 3647 + '@babel/types': 7.24.5 3647 3648 dev: true 3648 3649 3649 3650 /@types/babel__template@7.4.4: 3650 3651 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 3651 3652 dependencies: 3652 - '@babel/parser': 7.24.4 3653 - '@babel/types': 7.24.0 3653 + '@babel/parser': 7.24.5 3654 + '@babel/types': 7.24.5 3654 3655 dev: true 3655 3656 3656 3657 /@types/babel__traverse@7.20.5: 3657 3658 resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} 3658 3659 dependencies: 3659 - '@babel/types': 7.24.0 3660 + '@babel/types': 7.24.5 3660 3661 dev: true 3661 3662 3662 3663 /@types/body-parser@1.19.5: 3663 3664 resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} 3664 3665 dependencies: 3665 3666 '@types/connect': 3.4.38 3666 - '@types/node': 20.12.7 3667 + '@types/node': 20.12.8 3667 3668 dev: true 3668 3669 3669 3670 /@types/bonjour@3.5.13: 3670 3671 resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} 3671 3672 dependencies: 3672 - '@types/node': 20.12.7 3673 + '@types/node': 20.12.8 3673 3674 dev: true 3674 3675 3675 3676 /@types/connect-history-api-fallback@1.5.4: 3676 3677 resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} 3677 3678 dependencies: 3678 3679 '@types/express-serve-static-core': 4.19.0 3679 - '@types/node': 20.12.7 3680 + '@types/node': 20.12.8 3680 3681 dev: true 3681 3682 3682 3683 /@types/connect@3.4.38: 3683 3684 resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 3684 3685 dependencies: 3685 - '@types/node': 20.12.7 3686 + '@types/node': 20.12.8 3686 3687 dev: true 3687 3688 3688 3689 /@types/cross-spawn@6.0.6: 3689 3690 resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} 3690 3691 dependencies: 3691 - '@types/node': 20.12.7 3692 + '@types/node': 20.12.8 3692 3693 dev: true 3693 3694 3694 3695 /@types/eslint-scope@3.7.7: ··· 3712 3713 /@types/express-serve-static-core@4.19.0: 3713 3714 resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} 3714 3715 dependencies: 3715 - '@types/node': 20.12.7 3716 + '@types/node': 20.12.8 3716 3717 '@types/qs': 6.9.15 3717 3718 '@types/range-parser': 1.2.7 3718 3719 '@types/send': 0.17.4 ··· 3734 3735 /@types/http-proxy@1.17.14: 3735 3736 resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} 3736 3737 dependencies: 3737 - '@types/node': 20.12.7 3738 + '@types/node': 20.12.8 3738 3739 dev: true 3739 3740 3740 3741 /@types/json-schema@7.0.15: ··· 3766 3767 /@types/node-forge@1.3.11: 3767 3768 resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} 3768 3769 dependencies: 3769 - '@types/node': 20.12.7 3770 + '@types/node': 20.12.8 3770 3771 dev: true 3771 3772 3772 3773 /@types/node@12.20.55: 3773 3774 resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 3774 3775 dev: true 3775 3776 3776 - /@types/node@20.12.7: 3777 - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} 3777 + /@types/node@20.12.8: 3778 + resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} 3778 3779 dependencies: 3779 3780 undici-types: 5.26.5 3780 3781 dev: true ··· 3824 3825 resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} 3825 3826 dependencies: 3826 3827 '@types/mime': 1.3.5 3827 - '@types/node': 20.12.7 3828 + '@types/node': 20.12.8 3828 3829 dev: true 3829 3830 3830 3831 /@types/serve-index@1.9.4: ··· 3837 3838 resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} 3838 3839 dependencies: 3839 3840 '@types/http-errors': 2.0.4 3840 - '@types/node': 20.12.7 3841 + '@types/node': 20.12.8 3841 3842 '@types/send': 0.17.4 3842 3843 dev: true 3843 3844 3844 3845 /@types/sockjs@0.3.36: 3845 3846 resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} 3846 3847 dependencies: 3847 - '@types/node': 20.12.7 3848 + '@types/node': 20.12.8 3848 3849 dev: true 3849 3850 3850 3851 /@types/web-bluetooth@0.0.20: ··· 3854 3855 /@types/ws@8.5.10: 3855 3856 resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} 3856 3857 dependencies: 3857 - '@types/node': 20.12.7 3858 + '@types/node': 20.12.8 3858 3859 dev: true 3859 3860 3860 3861 /@types/yauzl@2.10.3: 3861 3862 resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} 3862 3863 requiresBuild: true 3863 3864 dependencies: 3864 - '@types/node': 20.12.7 3865 + '@types/node': 20.12.8 3865 3866 dev: true 3866 3867 optional: true 3867 3868 3868 - /@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1)(eslint@9.1.1)(typescript@5.4.5): 3869 - resolution: {integrity: sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==} 3869 + /@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0)(eslint@9.2.0)(typescript@5.4.5): 3870 + resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} 3870 3871 engines: {node: ^18.18.0 || >=20.0.0} 3871 3872 peerDependencies: 3872 3873 '@typescript-eslint/parser': ^7.0.0 ··· 3877 3878 optional: true 3878 3879 dependencies: 3879 3880 '@eslint-community/regexpp': 4.10.0 3880 - '@typescript-eslint/parser': 7.7.1(eslint@9.1.1)(typescript@5.4.5) 3881 - '@typescript-eslint/scope-manager': 7.7.1 3882 - '@typescript-eslint/type-utils': 7.7.1(eslint@9.1.1)(typescript@5.4.5) 3883 - '@typescript-eslint/utils': 7.7.1(eslint@9.1.1)(typescript@5.4.5) 3884 - '@typescript-eslint/visitor-keys': 7.7.1 3881 + '@typescript-eslint/parser': 7.8.0(eslint@9.2.0)(typescript@5.4.5) 3882 + '@typescript-eslint/scope-manager': 7.8.0 3883 + '@typescript-eslint/type-utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) 3884 + '@typescript-eslint/utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) 3885 + '@typescript-eslint/visitor-keys': 7.8.0 3885 3886 debug: 4.3.4 3886 - eslint: 9.1.1 3887 + eslint: 9.2.0 3887 3888 graphemer: 1.4.0 3888 3889 ignore: 5.3.1 3889 3890 natural-compare: 1.4.0 ··· 3894 3895 - supports-color 3895 3896 dev: true 3896 3897 3897 - /@typescript-eslint/parser@7.7.1(eslint@9.1.1)(typescript@5.4.5): 3898 - resolution: {integrity: sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==} 3898 + /@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5): 3899 + resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} 3899 3900 engines: {node: ^18.18.0 || >=20.0.0} 3900 3901 peerDependencies: 3901 3902 eslint: ^8.56.0 ··· 3904 3905 typescript: 3905 3906 optional: true 3906 3907 dependencies: 3907 - '@typescript-eslint/scope-manager': 7.7.1 3908 - '@typescript-eslint/types': 7.7.1 3909 - '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5) 3910 - '@typescript-eslint/visitor-keys': 7.7.1 3908 + '@typescript-eslint/scope-manager': 7.8.0 3909 + '@typescript-eslint/types': 7.8.0 3910 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) 3911 + '@typescript-eslint/visitor-keys': 7.8.0 3911 3912 debug: 4.3.4 3912 - eslint: 9.1.1 3913 + eslint: 9.2.0 3913 3914 typescript: 5.4.5 3914 3915 transitivePeerDependencies: 3915 3916 - supports-color 3916 3917 dev: true 3917 3918 3918 - /@typescript-eslint/scope-manager@7.7.1: 3919 - resolution: {integrity: sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==} 3919 + /@typescript-eslint/scope-manager@7.8.0: 3920 + resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} 3920 3921 engines: {node: ^18.18.0 || >=20.0.0} 3921 3922 dependencies: 3922 - '@typescript-eslint/types': 7.7.1 3923 - '@typescript-eslint/visitor-keys': 7.7.1 3923 + '@typescript-eslint/types': 7.8.0 3924 + '@typescript-eslint/visitor-keys': 7.8.0 3924 3925 dev: true 3925 3926 3926 - /@typescript-eslint/type-utils@7.7.1(eslint@9.1.1)(typescript@5.4.5): 3927 - resolution: {integrity: sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==} 3927 + /@typescript-eslint/type-utils@7.8.0(eslint@9.2.0)(typescript@5.4.5): 3928 + resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} 3928 3929 engines: {node: ^18.18.0 || >=20.0.0} 3929 3930 peerDependencies: 3930 3931 eslint: ^8.56.0 ··· 3933 3934 typescript: 3934 3935 optional: true 3935 3936 dependencies: 3936 - '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5) 3937 - '@typescript-eslint/utils': 7.7.1(eslint@9.1.1)(typescript@5.4.5) 3937 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) 3938 + '@typescript-eslint/utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) 3938 3939 debug: 4.3.4 3939 - eslint: 9.1.1 3940 + eslint: 9.2.0 3940 3941 ts-api-utils: 1.3.0(typescript@5.4.5) 3941 3942 typescript: 5.4.5 3942 3943 transitivePeerDependencies: 3943 3944 - supports-color 3944 3945 dev: true 3945 3946 3946 - /@typescript-eslint/types@7.7.1: 3947 - resolution: {integrity: sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==} 3947 + /@typescript-eslint/types@7.8.0: 3948 + resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} 3948 3949 engines: {node: ^18.18.0 || >=20.0.0} 3949 3950 dev: true 3950 3951 3951 - /@typescript-eslint/typescript-estree@7.7.1(typescript@5.4.5): 3952 - resolution: {integrity: sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==} 3952 + /@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5): 3953 + resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} 3953 3954 engines: {node: ^18.18.0 || >=20.0.0} 3954 3955 peerDependencies: 3955 3956 typescript: '*' ··· 3957 3958 typescript: 3958 3959 optional: true 3959 3960 dependencies: 3960 - '@typescript-eslint/types': 7.7.1 3961 - '@typescript-eslint/visitor-keys': 7.7.1 3961 + '@typescript-eslint/types': 7.8.0 3962 + '@typescript-eslint/visitor-keys': 7.8.0 3962 3963 debug: 4.3.4 3963 3964 globby: 11.1.0 3964 3965 is-glob: 4.0.3 ··· 3970 3971 - supports-color 3971 3972 dev: true 3972 3973 3973 - /@typescript-eslint/utils@7.7.1(eslint@9.1.1)(typescript@5.4.5): 3974 - resolution: {integrity: sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==} 3974 + /@typescript-eslint/utils@7.8.0(eslint@9.2.0)(typescript@5.4.5): 3975 + resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} 3975 3976 engines: {node: ^18.18.0 || >=20.0.0} 3976 3977 peerDependencies: 3977 3978 eslint: ^8.56.0 3978 3979 dependencies: 3979 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.1.1) 3980 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0) 3980 3981 '@types/json-schema': 7.0.15 3981 3982 '@types/semver': 7.5.8 3982 - '@typescript-eslint/scope-manager': 7.7.1 3983 - '@typescript-eslint/types': 7.7.1 3984 - '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5) 3985 - eslint: 9.1.1 3983 + '@typescript-eslint/scope-manager': 7.8.0 3984 + '@typescript-eslint/types': 7.8.0 3985 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) 3986 + eslint: 9.2.0 3986 3987 semver: 7.6.0 3987 3988 transitivePeerDependencies: 3988 3989 - supports-color 3989 3990 - typescript 3990 3991 dev: true 3991 3992 3992 - /@typescript-eslint/visitor-keys@7.7.1: 3993 - resolution: {integrity: sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==} 3993 + /@typescript-eslint/visitor-keys@7.8.0: 3994 + resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} 3994 3995 engines: {node: ^18.18.0 || >=20.0.0} 3995 3996 dependencies: 3996 - '@typescript-eslint/types': 7.7.1 3997 + '@typescript-eslint/types': 7.8.0 3997 3998 eslint-visitor-keys: 3.4.3 3998 3999 dev: true 3999 4000 ··· 4003 4004 peerDependencies: 4004 4005 vite: ^3.0.0 || ^4.0.0 || ^5.0.0 4005 4006 dependencies: 4006 - vite: 5.1.7(@types/node@20.12.7)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) 4007 + vite: 5.1.7(@types/node@20.12.8)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) 4007 4008 dev: true 4008 4009 4009 - /@vitejs/plugin-react@4.2.1(vite@5.2.10): 4010 + /@vitejs/plugin-react@4.2.1(vite@5.2.11): 4010 4011 resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} 4011 4012 engines: {node: ^14.18.0 || >=16.0.0} 4012 4013 peerDependencies: ··· 4017 4018 '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.0) 4018 4019 '@types/babel__core': 7.20.5 4019 4020 react-refresh: 0.14.0 4020 - vite: 5.2.10(@types/node@20.12.7) 4021 + vite: 5.2.11(@types/node@20.12.8) 4021 4022 transitivePeerDependencies: 4022 4023 - supports-color 4023 4024 dev: true ··· 4029 4030 vite: ^5.0.0 4030 4031 vue: ^3.2.25 4031 4032 dependencies: 4032 - vite: 5.2.10(@types/node@20.12.7) 4033 + vite: 5.2.10(@types/node@20.12.8) 4033 4034 vue: 3.4.25(typescript@5.4.5) 4034 4035 dev: true 4035 4036 4036 - /@vitest/coverage-v8@1.5.2(vitest@1.5.2): 4037 - resolution: {integrity: sha512-QJqxRnbCwNtbbegK9E93rBmhN3dbfG1bC/o52Bqr0zGCYhQzwgwvrJBG7Q8vw3zilX6Ryy6oa/mkZku2lLJx1Q==} 4037 + /@vitest/coverage-v8@1.6.0(vitest@1.6.0): 4038 + resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} 4038 4039 peerDependencies: 4039 - vitest: 1.5.2 4040 + vitest: 1.6.0 4040 4041 dependencies: 4041 4042 '@ampproject/remapping': 2.3.0 4042 4043 '@bcoe/v8-coverage': 0.2.3 ··· 4051 4052 std-env: 3.7.0 4052 4053 strip-literal: 2.1.0 4053 4054 test-exclude: 6.0.0 4054 - vitest: 1.5.2(@types/node@20.12.7) 4055 + vitest: 1.6.0(@types/node@20.12.8) 4055 4056 transitivePeerDependencies: 4056 4057 - supports-color 4057 4058 dev: true 4058 4059 4059 - /@vitest/expect@1.5.2: 4060 - resolution: {integrity: sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==} 4060 + /@vitest/expect@1.6.0: 4061 + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} 4061 4062 dependencies: 4062 - '@vitest/spy': 1.5.2 4063 - '@vitest/utils': 1.5.2 4063 + '@vitest/spy': 1.6.0 4064 + '@vitest/utils': 1.6.0 4064 4065 chai: 4.4.1 4065 4066 dev: true 4066 4067 4067 - /@vitest/runner@1.5.2: 4068 - resolution: {integrity: sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==} 4068 + /@vitest/runner@1.6.0: 4069 + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} 4069 4070 dependencies: 4070 - '@vitest/utils': 1.5.2 4071 + '@vitest/utils': 1.6.0 4071 4072 p-limit: 5.0.0 4072 4073 pathe: 1.1.2 4073 4074 dev: true 4074 4075 4075 - /@vitest/snapshot@1.5.2: 4076 - resolution: {integrity: sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==} 4076 + /@vitest/snapshot@1.6.0: 4077 + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} 4077 4078 dependencies: 4078 4079 magic-string: 0.30.10 4079 4080 pathe: 1.1.2 4080 4081 pretty-format: 29.7.0 4081 4082 dev: true 4082 4083 4083 - /@vitest/spy@1.5.2: 4084 - resolution: {integrity: sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==} 4084 + /@vitest/spy@1.6.0: 4085 + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} 4085 4086 dependencies: 4086 4087 tinyspy: 2.2.1 4087 4088 dev: true 4088 4089 4089 - /@vitest/utils@1.5.2: 4090 - resolution: {integrity: sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==} 4090 + /@vitest/utils@1.6.0: 4091 + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} 4091 4092 dependencies: 4092 4093 diff-sequences: 29.6.3 4093 4094 estree-walker: 3.0.3 ··· 4098 4099 /@vue/compiler-core@3.4.25: 4099 4100 resolution: {integrity: sha512-Y2pLLopaElgWnMNolgG8w3C5nNUVev80L7hdQ5iIKPtMJvhVpG0zhnBG/g3UajJmZdvW0fktyZTotEHD1Srhbg==} 4100 4101 dependencies: 4101 - '@babel/parser': 7.24.4 4102 + '@babel/parser': 7.24.5 4102 4103 '@vue/shared': 3.4.25 4103 4104 entities: 4.5.0 4104 4105 estree-walker: 2.0.2 ··· 4115 4116 /@vue/compiler-sfc@3.4.25: 4116 4117 resolution: {integrity: sha512-m7rryuqzIoQpOBZ18wKyq05IwL6qEpZxFZfRxlNYuIPDqywrXQxgUwLXIvoU72gs6cRdY6wHD0WVZIFE4OEaAQ==} 4117 4118 dependencies: 4118 - '@babel/parser': 7.24.4 4119 + '@babel/parser': 7.24.5 4119 4120 '@vue/compiler-core': 3.4.25 4120 4121 '@vue/compiler-dom': 3.4.25 4121 4122 '@vue/compiler-ssr': 3.4.25 ··· 4477 4478 ajv: 8.12.0 4478 4479 dev: true 4479 4480 4481 + /ajv-formats@2.1.1(ajv@8.13.0): 4482 + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 4483 + peerDependencies: 4484 + ajv: ^8.0.0 4485 + peerDependenciesMeta: 4486 + ajv: 4487 + optional: true 4488 + dependencies: 4489 + ajv: 8.13.0 4490 + dev: true 4491 + 4480 4492 /ajv-keywords@3.5.2(ajv@6.12.6): 4481 4493 resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} 4482 4494 peerDependencies: ··· 4485 4497 ajv: 6.12.6 4486 4498 dev: true 4487 4499 4488 - /ajv-keywords@5.1.0(ajv@8.12.0): 4500 + /ajv-keywords@5.1.0(ajv@8.13.0): 4489 4501 resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} 4490 4502 peerDependencies: 4491 4503 ajv: ^8.8.2 4492 4504 dependencies: 4493 - ajv: 8.12.0 4505 + ajv: 8.13.0 4494 4506 fast-deep-equal: 3.1.3 4495 4507 dev: true 4496 4508 ··· 4512 4524 uri-js: 4.4.1 4513 4525 dev: true 4514 4526 4527 + /ajv@8.13.0: 4528 + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} 4529 + dependencies: 4530 + fast-deep-equal: 3.1.3 4531 + json-schema-traverse: 1.0.0 4532 + require-from-string: 2.0.2 4533 + uri-js: 4.4.1 4534 + dev: true 4535 + 4515 4536 /algoliasearch@4.23.3: 4516 4537 resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} 4517 4538 dependencies: ··· 6010 6031 source-map: 0.6.1 6011 6032 dev: true 6012 6033 6013 - /eslint-config-prettier@9.1.0(eslint@9.1.1): 6034 + /eslint-config-prettier@9.1.0(eslint@9.2.0): 6014 6035 resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 6015 6036 hasBin: true 6016 6037 peerDependencies: 6017 6038 eslint: '>=7.0.0' 6018 6039 dependencies: 6019 - eslint: 9.1.1 6040 + eslint: 9.2.0 6020 6041 dev: true 6021 6042 6022 - /eslint-plugin-react-hooks@4.6.2(eslint@9.1.1): 6043 + /eslint-plugin-react-hooks@4.6.2(eslint@9.2.0): 6023 6044 resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} 6024 6045 engines: {node: '>=10'} 6025 6046 peerDependencies: 6026 6047 eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 6027 6048 dependencies: 6028 - eslint: 9.1.1 6049 + eslint: 9.2.0 6029 6050 dev: true 6030 6051 6031 - /eslint-plugin-react-refresh@0.4.6(eslint@9.1.1): 6052 + /eslint-plugin-react-refresh@0.4.6(eslint@9.2.0): 6032 6053 resolution: {integrity: sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==} 6033 6054 peerDependencies: 6034 6055 eslint: '>=7' 6035 6056 dependencies: 6036 - eslint: 9.1.1 6057 + eslint: 9.2.0 6037 6058 dev: true 6038 6059 6039 - /eslint-plugin-simple-import-sort@12.1.0(eslint@9.1.1): 6060 + /eslint-plugin-simple-import-sort@12.1.0(eslint@9.2.0): 6040 6061 resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} 6041 6062 peerDependencies: 6042 6063 eslint: '>=5.0.0' 6043 6064 dependencies: 6044 - eslint: 9.1.1 6065 + eslint: 9.2.0 6045 6066 dev: true 6046 6067 6047 6068 /eslint-plugin-sort-keys-fix@1.1.2: ··· 6085 6106 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 6086 6107 dev: true 6087 6108 6088 - /eslint@9.1.1: 6089 - resolution: {integrity: sha512-b4cRQ0BeZcSEzPpY2PjFY70VbO32K7BStTGtBsnIGdTSEEQzBi8hPBcGQmTG2zUvFr9uLe0TK42bw8YszuHEqg==} 6109 + /eslint@9.2.0: 6110 + resolution: {integrity: sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==} 6090 6111 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 6091 6112 hasBin: true 6092 6113 dependencies: 6093 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.1.1) 6114 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0) 6094 6115 '@eslint-community/regexpp': 4.10.0 6095 6116 '@eslint/eslintrc': 3.0.2 6096 - '@eslint/js': 9.1.1 6117 + '@eslint/js': 9.2.0 6097 6118 '@humanwhocodes/config-array': 0.13.0 6098 6119 '@humanwhocodes/module-importer': 1.0.1 6099 - '@humanwhocodes/retry': 0.2.3 6120 + '@humanwhocodes/retry': 0.2.4 6100 6121 '@nodelib/fs.walk': 1.2.8 6101 6122 ajv: 6.12.6 6102 6123 chalk: 4.1.2 ··· 7394 7415 engines: {node: '>=8'} 7395 7416 dependencies: 7396 7417 '@babel/core': 7.24.0 7397 - '@babel/parser': 7.24.4 7418 + '@babel/parser': 7.24.5 7398 7419 '@istanbuljs/schema': 0.1.3 7399 7420 istanbul-lib-coverage: 3.2.2 7400 7421 semver: 6.3.1 ··· 7443 7464 resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 7444 7465 engines: {node: '>= 10.13.0'} 7445 7466 dependencies: 7446 - '@types/node': 20.12.7 7467 + '@types/node': 20.12.8 7447 7468 merge-stream: 2.0.0 7448 7469 supports-color: 8.1.1 7449 7470 dev: true ··· 7699 7720 resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} 7700 7721 engines: {node: '>=14'} 7701 7722 dependencies: 7702 - mlly: 1.6.1 7723 + mlly: 1.7.0 7703 7724 pkg-types: 1.1.0 7704 7725 dev: true 7705 7726 ··· 7818 7839 /magicast@0.3.4: 7819 7840 resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} 7820 7841 dependencies: 7821 - '@babel/parser': 7.24.4 7822 - '@babel/types': 7.24.0 7842 + '@babel/parser': 7.24.5 7843 + '@babel/types': 7.24.5 7823 7844 source-map-js: 1.2.0 7824 7845 dev: true 7825 7846 ··· 8102 8123 pathe: 1.1.2 8103 8124 pkg-types: 1.1.0 8104 8125 ufo: 1.5.3 8126 + dev: false 8127 + 8128 + /mlly@1.7.0: 8129 + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} 8130 + dependencies: 8131 + acorn: 8.11.3 8132 + pathe: 1.1.2 8133 + pkg-types: 1.1.0 8134 + ufo: 1.5.3 8105 8135 8106 8136 /mrmime@2.0.0: 8107 8137 resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} ··· 8766 8796 resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} 8767 8797 dependencies: 8768 8798 confbox: 0.1.7 8769 - mlly: 1.6.1 8799 + mlly: 1.7.0 8770 8800 pathe: 1.1.2 8771 8801 8772 8802 /possible-typed-array-names@1.0.0: ··· 9346 9376 glob: 10.3.12 9347 9377 dev: true 9348 9378 9349 - /rollup-plugin-dts@6.1.0(rollup@4.17.0)(typescript@5.4.5): 9379 + /rollup-plugin-dts@6.1.0(rollup@4.17.2)(typescript@5.4.5): 9350 9380 resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} 9351 9381 engines: {node: '>=16'} 9352 9382 peerDependencies: ··· 9354 9384 typescript: ^4.5 || ^5.0 9355 9385 dependencies: 9356 9386 magic-string: 0.30.10 9357 - rollup: 4.17.0 9387 + rollup: 4.17.2 9358 9388 typescript: 5.4.5 9359 9389 optionalDependencies: 9360 9390 '@babel/code-frame': 7.24.2 9361 9391 dev: true 9362 9392 9363 - /rollup@4.17.0: 9364 - resolution: {integrity: sha512-wZJSn0WMtWrxhYKQRt5Z6GIXlziOoMDFmbHmRfL3v+sBTAshx2DBq1AfMArB7eIjF63r4ocn2ZTAyUptg/7kmQ==} 9393 + /rollup@4.17.2: 9394 + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} 9365 9395 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 9366 9396 hasBin: true 9367 9397 dependencies: 9368 9398 '@types/estree': 1.0.5 9369 9399 optionalDependencies: 9370 - '@rollup/rollup-android-arm-eabi': 4.17.0 9371 - '@rollup/rollup-android-arm64': 4.17.0 9372 - '@rollup/rollup-darwin-arm64': 4.17.0 9373 - '@rollup/rollup-darwin-x64': 4.17.0 9374 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.0 9375 - '@rollup/rollup-linux-arm-musleabihf': 4.17.0 9376 - '@rollup/rollup-linux-arm64-gnu': 4.17.0 9377 - '@rollup/rollup-linux-arm64-musl': 4.17.0 9378 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.0 9379 - '@rollup/rollup-linux-riscv64-gnu': 4.17.0 9380 - '@rollup/rollup-linux-s390x-gnu': 4.17.0 9381 - '@rollup/rollup-linux-x64-gnu': 4.17.0 9382 - '@rollup/rollup-linux-x64-musl': 4.17.0 9383 - '@rollup/rollup-win32-arm64-msvc': 4.17.0 9384 - '@rollup/rollup-win32-ia32-msvc': 4.17.0 9385 - '@rollup/rollup-win32-x64-msvc': 4.17.0 9400 + '@rollup/rollup-android-arm-eabi': 4.17.2 9401 + '@rollup/rollup-android-arm64': 4.17.2 9402 + '@rollup/rollup-darwin-arm64': 4.17.2 9403 + '@rollup/rollup-darwin-x64': 4.17.2 9404 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 9405 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 9406 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 9407 + '@rollup/rollup-linux-arm64-musl': 4.17.2 9408 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 9409 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 9410 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 9411 + '@rollup/rollup-linux-x64-gnu': 4.17.2 9412 + '@rollup/rollup-linux-x64-musl': 4.17.2 9413 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 9414 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 9415 + '@rollup/rollup-win32-x64-msvc': 4.17.2 9386 9416 fsevents: 2.3.3 9387 9417 dev: true 9388 9418 ··· 9496 9526 engines: {node: '>= 12.13.0'} 9497 9527 dependencies: 9498 9528 '@types/json-schema': 7.0.15 9499 - ajv: 8.12.0 9500 - ajv-formats: 2.1.1(ajv@8.12.0) 9501 - ajv-keywords: 5.1.0(ajv@8.12.0) 9529 + ajv: 8.13.0 9530 + ajv-formats: 2.1.1(ajv@8.13.0) 9531 + ajv-keywords: 5.1.0(ajv@8.13.0) 9502 9532 dev: true 9503 9533 9504 9534 /search-insights@2.13.0: ··· 10232 10262 typescript: 5.4.5 10233 10263 dev: true 10234 10264 10235 - /ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5): 10265 + /ts-node@10.9.2(@types/node@20.12.8)(typescript@5.4.5): 10236 10266 resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 10237 10267 hasBin: true 10238 10268 peerDependencies: ··· 10251 10281 '@tsconfig/node12': 1.0.11 10252 10282 '@tsconfig/node14': 1.0.3 10253 10283 '@tsconfig/node16': 1.0.4 10254 - '@types/node': 20.12.7 10284 + '@types/node': 20.12.8 10255 10285 acorn: 8.11.3 10256 10286 acorn-walk: 8.3.2 10257 10287 arg: 4.1.3 ··· 10380 10410 resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} 10381 10411 dev: true 10382 10412 10383 - /typescript-eslint@7.7.1(eslint@9.1.1)(typescript@5.4.5): 10384 - resolution: {integrity: sha512-ykEBfa3xx3odjZy6GRED4SCPrjo0rgHwstLlEgLX4EMEuv7QeIDSmfV+S6Kk+XkbsYn4BDEcPvsci1X26lRpMQ==} 10413 + /typescript-eslint@7.8.0(eslint@9.2.0)(typescript@5.4.5): 10414 + resolution: {integrity: sha512-sheFG+/D8N/L7gC3WT0Q8sB97Nm573Yfr+vZFzl/4nBdYcmviBPtwGSX9TJ7wpVg28ocerKVOt+k2eGmHzcgVA==} 10385 10415 engines: {node: ^18.18.0 || >=20.0.0} 10386 10416 peerDependencies: 10387 10417 eslint: ^8.56.0 ··· 10390 10420 typescript: 10391 10421 optional: true 10392 10422 dependencies: 10393 - '@typescript-eslint/eslint-plugin': 7.7.1(@typescript-eslint/parser@7.7.1)(eslint@9.1.1)(typescript@5.4.5) 10394 - '@typescript-eslint/parser': 7.7.1(eslint@9.1.1)(typescript@5.4.5) 10395 - '@typescript-eslint/utils': 7.7.1(eslint@9.1.1)(typescript@5.4.5) 10396 - eslint: 9.1.1 10423 + '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@9.2.0)(typescript@5.4.5) 10424 + '@typescript-eslint/parser': 7.8.0(eslint@9.2.0)(typescript@5.4.5) 10425 + '@typescript-eslint/utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) 10426 + eslint: 9.2.0 10397 10427 typescript: 5.4.5 10398 10428 transitivePeerDependencies: 10399 10429 - supports-color ··· 10551 10581 engines: {node: '>= 0.8'} 10552 10582 dev: true 10553 10583 10554 - /vite-node@1.5.2(@types/node@20.12.7): 10555 - resolution: {integrity: sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==} 10584 + /vite-node@1.6.0(@types/node@20.12.8): 10585 + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} 10556 10586 engines: {node: ^18.0.0 || >=20.0.0} 10557 10587 hasBin: true 10558 10588 dependencies: ··· 10560 10590 debug: 4.3.4 10561 10591 pathe: 1.1.2 10562 10592 picocolors: 1.0.0 10563 - vite: 5.2.10(@types/node@20.12.7) 10593 + vite: 5.2.11(@types/node@20.12.8) 10564 10594 transitivePeerDependencies: 10565 10595 - '@types/node' 10566 10596 - less ··· 10572 10602 - terser 10573 10603 dev: true 10574 10604 10575 - /vite@5.1.7(@types/node@20.12.7)(less@4.2.0)(sass@1.71.1)(terser@5.29.1): 10605 + /vite@5.1.7(@types/node@20.12.8)(less@4.2.0)(sass@1.71.1)(terser@5.29.1): 10576 10606 resolution: {integrity: sha512-sgnEEFTZYMui/sTlH1/XEnVNHMujOahPLGMxn1+5sIT45Xjng1Ec1K78jRP15dSmVgg5WBin9yO81j3o9OxofA==} 10577 10607 engines: {node: ^18.0.0 || >=20.0.0} 10578 10608 hasBin: true ··· 10600 10630 terser: 10601 10631 optional: true 10602 10632 dependencies: 10603 - '@types/node': 20.12.7 10633 + '@types/node': 20.12.8 10604 10634 esbuild: 0.19.12 10605 10635 less: 4.2.0 10606 10636 postcss: 8.4.38 10607 - rollup: 4.17.0 10637 + rollup: 4.17.2 10608 10638 sass: 1.71.1 10609 10639 terser: 5.29.1 10610 10640 optionalDependencies: 10611 10641 fsevents: 2.3.3 10612 10642 dev: true 10613 10643 10614 - /vite@5.2.10(@types/node@20.12.7): 10644 + /vite@5.2.10(@types/node@20.12.8): 10615 10645 resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} 10616 10646 engines: {node: ^18.0.0 || >=20.0.0} 10617 10647 hasBin: true ··· 10639 10669 terser: 10640 10670 optional: true 10641 10671 dependencies: 10642 - '@types/node': 20.12.7 10672 + '@types/node': 20.12.8 10673 + esbuild: 0.20.2 10674 + postcss: 8.4.38 10675 + rollup: 4.17.2 10676 + optionalDependencies: 10677 + fsevents: 2.3.3 10678 + dev: true 10679 + 10680 + /vite@5.2.11(@types/node@20.12.8): 10681 + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} 10682 + engines: {node: ^18.0.0 || >=20.0.0} 10683 + hasBin: true 10684 + peerDependencies: 10685 + '@types/node': ^18.0.0 || >=20.0.0 10686 + less: '*' 10687 + lightningcss: ^1.21.0 10688 + sass: '*' 10689 + stylus: '*' 10690 + sugarss: '*' 10691 + terser: ^5.4.0 10692 + peerDependenciesMeta: 10693 + '@types/node': 10694 + optional: true 10695 + less: 10696 + optional: true 10697 + lightningcss: 10698 + optional: true 10699 + sass: 10700 + optional: true 10701 + stylus: 10702 + optional: true 10703 + sugarss: 10704 + optional: true 10705 + terser: 10706 + optional: true 10707 + dependencies: 10708 + '@types/node': 20.12.8 10643 10709 esbuild: 0.20.2 10644 10710 postcss: 8.4.38 10645 - rollup: 4.17.0 10711 + rollup: 4.17.2 10646 10712 optionalDependencies: 10647 10713 fsevents: 2.3.3 10648 10714 dev: true 10649 10715 10650 - /vitepress@1.1.4(@algolia/client-search@4.23.3)(@types/node@20.12.7)(search-insights@2.13.0)(typescript@5.4.5): 10716 + /vitepress@1.1.4(@algolia/client-search@4.23.3)(@types/node@20.12.8)(search-insights@2.13.0)(typescript@5.4.5): 10651 10717 resolution: {integrity: sha512-bWIzFZXpPB6NIDBuWnS20aMADH+FcFKDfQNYFvbOWij03PR29eImTceQHIzCKordjXYBhM/TjE5VKFTUJ3EheA==} 10652 10718 hasBin: true 10653 10719 peerDependencies: ··· 10672 10738 mark.js: 8.11.1 10673 10739 minisearch: 6.3.0 10674 10740 shiki: 1.3.0 10675 - vite: 5.2.10(@types/node@20.12.7) 10741 + vite: 5.2.10(@types/node@20.12.8) 10676 10742 vue: 3.4.25(typescript@5.4.5) 10677 10743 transitivePeerDependencies: 10678 10744 - '@algolia/client-search' ··· 10702 10768 - universal-cookie 10703 10769 dev: true 10704 10770 10705 - /vitest@1.5.2(@types/node@20.12.7): 10706 - resolution: {integrity: sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==} 10771 + /vitest@1.6.0(@types/node@20.12.8): 10772 + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} 10707 10773 engines: {node: ^18.0.0 || >=20.0.0} 10708 10774 hasBin: true 10709 10775 peerDependencies: 10710 10776 '@edge-runtime/vm': '*' 10711 10777 '@types/node': ^18.0.0 || >=20.0.0 10712 - '@vitest/browser': 1.5.2 10713 - '@vitest/ui': 1.5.2 10778 + '@vitest/browser': 1.6.0 10779 + '@vitest/ui': 1.6.0 10714 10780 happy-dom: '*' 10715 10781 jsdom: '*' 10716 10782 peerDependenciesMeta: ··· 10727 10793 jsdom: 10728 10794 optional: true 10729 10795 dependencies: 10730 - '@types/node': 20.12.7 10731 - '@vitest/expect': 1.5.2 10732 - '@vitest/runner': 1.5.2 10733 - '@vitest/snapshot': 1.5.2 10734 - '@vitest/spy': 1.5.2 10735 - '@vitest/utils': 1.5.2 10796 + '@types/node': 20.12.8 10797 + '@vitest/expect': 1.6.0 10798 + '@vitest/runner': 1.6.0 10799 + '@vitest/snapshot': 1.6.0 10800 + '@vitest/spy': 1.6.0 10801 + '@vitest/utils': 1.6.0 10736 10802 acorn-walk: 8.3.2 10737 10803 chai: 4.4.1 10738 10804 debug: 4.3.4 ··· 10745 10811 strip-literal: 2.1.0 10746 10812 tinybench: 2.8.0 10747 10813 tinypool: 0.8.4 10748 - vite: 5.2.10(@types/node@20.12.7) 10749 - vite-node: 1.5.2(@types/node@20.12.7) 10814 + vite: 5.2.11(@types/node@20.12.8) 10815 + vite-node: 1.6.0(@types/node@20.12.8) 10750 10816 why-is-node-running: 2.2.2 10751 10817 transitivePeerDependencies: 10752 10818 - less ··· 11213 11279 resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} 11214 11280 dev: true 11215 11281 11216 - /zone.js@0.14.4: 11217 - resolution: {integrity: sha512-NtTUvIlNELez7Q1DzKVIFZBzNb646boQMgpATo9z3Ftuu/gWvzxCW7jdjcUDoRGxRikrhVHB/zLXh1hxeJawvw==} 11282 + /zone.js@0.14.5: 11283 + resolution: {integrity: sha512-9XYWZzY6PhHOSdkYryNcMm7L8EK7a4q+GbTvxbIA2a9lMdRUpGuyaYvLDcg8D6bdn+JomSsbPcilVKg6SmUx6w==} 11218 11284 dependencies: 11219 11285 tslib: 2.6.2 11220 11286 dev: true