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

feat(client): implement Angular HTTP client for API interactions

- Added client generation code to handle API requests using Angular's HttpClient.
- Introduced utility functions for building URLs, merging configurations, and handling headers.
- Implemented request and response interceptors for enhanced request handling.
- Created types for request options, response styles, and client configuration.
- Developed authentication handling with support for various auth schemes.
- Added body and query parameter serialization utilities for request formatting.
- Established a flexible configuration system for client initialization and request customization.

Max Scopp f5efa9fc ee367da3

+663 -433
+4 -1
examples/openapi-ts-angular/package.json
··· 12 12 "typecheck": "tsc --noEmit" 13 13 }, 14 14 "dependencies": { 15 + "@angular/common": "20.1.6", 16 + "@angular/core": "20.1.6", 15 17 "@radix-ui/react-form": "0.1.1", 16 18 "@radix-ui/react-icons": "1.3.2", 17 19 "@radix-ui/themes": "3.1.6", 18 20 "react": "19.0.0", 19 - "react-dom": "19.0.0" 21 + "react-dom": "19.0.0", 22 + "rxjs": "7.8.2" 20 23 }, 21 24 "devDependencies": { 22 25 "@config/vite-base": "workspace:*",
+162
examples/openapi-ts-angular/src/client/client/client.gen.ts
··· 1 + import type { HttpResponse } from '@angular/common/http'; 2 + import { HttpClient, HttpEventType, HttpRequest } from '@angular/common/http'; 3 + import { 4 + assertInInjectionContext, 5 + inject, 6 + provideAppInitializer, 7 + } from '@angular/core'; 8 + import { firstValueFrom } from 'rxjs'; 9 + import { filter } from 'rxjs/operators'; 10 + 11 + import type { Client, Config, ResolvedRequestOptions } from './types.gen'; 12 + import { 13 + buildUrl, 14 + createConfig, 15 + createInterceptors, 16 + mergeConfigs, 17 + mergeHeaders, 18 + setAuthParams, 19 + } from './utils.gen'; 20 + 21 + export function provideHeyApiClient(client: Client) { 22 + return provideAppInitializer(() => { 23 + const httpClient = inject(HttpClient); 24 + client.setConfig({ httpClient }); 25 + }); 26 + } 27 + 28 + export const createClient = (config: Config = {}): Client => { 29 + let _config = mergeConfigs(createConfig(), config); 30 + 31 + const getConfig = (): Config => ({ ..._config }); 32 + 33 + const setConfig = (config: Config): Config => { 34 + _config = mergeConfigs(_config, config); 35 + return getConfig(); 36 + }; 37 + 38 + const interceptors = createInterceptors< 39 + HttpRequest<unknown>, 40 + HttpResponse<unknown>, 41 + unknown, 42 + ResolvedRequestOptions 43 + >(); 44 + 45 + const request: Client['request'] = async (options) => { 46 + const opts = { 47 + ..._config, 48 + ...options, 49 + headers: mergeHeaders(_config.headers, options.headers), 50 + httpClient: options.httpClient ?? _config.httpClient, 51 + serializedBody: undefined, 52 + }; 53 + 54 + if (!opts.httpClient) { 55 + assertInInjectionContext(request); 56 + opts.httpClient = inject(HttpClient); 57 + } 58 + 59 + if (opts.security) { 60 + await setAuthParams({ 61 + ...opts, 62 + security: opts.security, 63 + }); 64 + } 65 + 66 + if (opts.requestValidator) { 67 + await opts.requestValidator(opts); 68 + } 69 + 70 + if (opts.body && opts.bodySerializer) { 71 + opts.serializedBody = opts.bodySerializer(opts.body); 72 + } 73 + 74 + // remove Content-Type header if body is empty to avoid sending invalid requests 75 + if (opts.serializedBody === undefined || opts.serializedBody === '') { 76 + opts.headers.delete('Content-Type'); 77 + } 78 + 79 + const url = buildUrl(opts); 80 + 81 + let req = new HttpRequest<unknown>(opts.method, url, { 82 + redirect: 'follow', 83 + ...opts, 84 + body: opts.serializedBody, 85 + }); 86 + 87 + for (const fn of interceptors.request._fns) { 88 + if (fn) { 89 + req = await fn(req, opts); 90 + } 91 + } 92 + 93 + let response; 94 + const result = { 95 + request: req, 96 + response, 97 + }; 98 + 99 + try { 100 + response = await firstValueFrom( 101 + opts.httpClient 102 + .request(req) 103 + .pipe(filter((event) => event.type === HttpEventType.Response)), 104 + ); 105 + 106 + for (const fn of interceptors.response._fns) { 107 + if (fn) { 108 + response = await fn(response, req, opts); 109 + } 110 + } 111 + 112 + let bodyResponse = response.body as Record<string, unknown>; 113 + 114 + if (opts.responseValidator) { 115 + await opts.responseValidator(bodyResponse); 116 + } 117 + 118 + if (opts.responseTransformer) { 119 + bodyResponse = (await opts.responseTransformer(bodyResponse)) as Record< 120 + string, 121 + unknown 122 + >; 123 + } 124 + 125 + return ( 126 + opts.responseStyle === 'data' 127 + ? bodyResponse 128 + : { data: bodyResponse, ...result } 129 + ) as any; 130 + } catch (error) { 131 + for (const fn of interceptors.error._fns) { 132 + if (fn) { 133 + (await fn(error, response!, req, opts)) as string; 134 + } 135 + } 136 + 137 + return opts.responseStyle === 'data' 138 + ? undefined 139 + : { 140 + error, 141 + ...result, 142 + }; 143 + } 144 + }; 145 + 146 + return { 147 + buildUrl, 148 + connect: (options) => request({ ...options, method: 'CONNECT' }), 149 + delete: (options) => request({ ...options, method: 'DELETE' }), 150 + get: (options) => request({ ...options, method: 'GET' }), 151 + getConfig, 152 + head: (options) => request({ ...options, method: 'HEAD' }), 153 + interceptors, 154 + options: (options) => request({ ...options, method: 'OPTIONS' }), 155 + patch: (options) => request({ ...options, method: 'PATCH' }), 156 + post: (options) => request({ ...options, method: 'POST' }), 157 + put: (options) => request({ ...options, method: 'PUT' }), 158 + request, 159 + setConfig, 160 + trace: (options) => request({ ...options, method: 'TRACE' }), 161 + }; 162 + };
-193
examples/openapi-ts-angular/src/client/client/client.ts
··· 1 - import type { Client, Config, RequestOptions } from './types'; 2 - import { 3 - buildUrl, 4 - createConfig, 5 - createInterceptors, 6 - getParseAs, 7 - mergeConfigs, 8 - mergeHeaders, 9 - setAuthParams, 10 - } from './utils'; 11 - 12 - type ReqInit = Omit<RequestInit, 'body' | 'headers'> & { 13 - body?: any; 14 - headers: ReturnType<typeof mergeHeaders>; 15 - }; 16 - 17 - export const createClient = (config: Config = {}): Client => { 18 - let _config = mergeConfigs(createConfig(), config); 19 - 20 - const getConfig = (): Config => ({ ..._config }); 21 - 22 - const setConfig = (config: Config): Config => { 23 - _config = mergeConfigs(_config, config); 24 - return getConfig(); 25 - }; 26 - 27 - const interceptors = createInterceptors< 28 - Request, 29 - Response, 30 - unknown, 31 - RequestOptions 32 - >(); 33 - 34 - const request: Client['request'] = async (options) => { 35 - const opts = { 36 - ..._config, 37 - ...options, 38 - fetch: options.fetch ?? _config.fetch ?? globalThis.fetch, 39 - headers: mergeHeaders(_config.headers, options.headers), 40 - }; 41 - 42 - if (opts.security) { 43 - await setAuthParams({ 44 - ...opts, 45 - security: opts.security, 46 - }); 47 - } 48 - 49 - if (opts.requestValidator) { 50 - await opts.requestValidator(opts); 51 - } 52 - 53 - if (opts.body && opts.bodySerializer) { 54 - opts.body = opts.bodySerializer(opts.body); 55 - } 56 - 57 - // remove Content-Type header if body is empty to avoid sending invalid requests 58 - if (opts.body === undefined || opts.body === '') { 59 - opts.headers.delete('Content-Type'); 60 - } 61 - 62 - const url = buildUrl(opts); 63 - const requestInit: ReqInit = { 64 - redirect: 'follow', 65 - ...opts, 66 - }; 67 - 68 - let request = new Request(url, requestInit); 69 - 70 - for (const fn of interceptors.request._fns) { 71 - if (fn) { 72 - request = await fn(request, opts); 73 - } 74 - } 75 - 76 - // fetch must be assigned here, otherwise it would throw the error: 77 - // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation 78 - const _fetch = opts.fetch!; 79 - let response = await _fetch(request); 80 - 81 - for (const fn of interceptors.response._fns) { 82 - if (fn) { 83 - response = await fn(response, request, opts); 84 - } 85 - } 86 - 87 - const result = { 88 - request, 89 - response, 90 - }; 91 - 92 - if (response.ok) { 93 - if ( 94 - response.status === 204 || 95 - response.headers.get('Content-Length') === '0' 96 - ) { 97 - return opts.responseStyle === 'data' 98 - ? {} 99 - : { 100 - data: {}, 101 - ...result, 102 - }; 103 - } 104 - 105 - const parseAs = 106 - (opts.parseAs === 'auto' 107 - ? getParseAs(response.headers.get('Content-Type')) 108 - : opts.parseAs) ?? 'json'; 109 - 110 - let data: any; 111 - switch (parseAs) { 112 - case 'arrayBuffer': 113 - case 'blob': 114 - case 'formData': 115 - case 'json': 116 - case 'text': 117 - data = await response[parseAs](); 118 - break; 119 - case 'stream': 120 - return opts.responseStyle === 'data' 121 - ? response.body 122 - : { 123 - data: response.body, 124 - ...result, 125 - }; 126 - } 127 - 128 - if (parseAs === 'json') { 129 - if (opts.responseValidator) { 130 - await opts.responseValidator(data); 131 - } 132 - 133 - if (opts.responseTransformer) { 134 - data = await opts.responseTransformer(data); 135 - } 136 - } 137 - 138 - return opts.responseStyle === 'data' 139 - ? data 140 - : { 141 - data, 142 - ...result, 143 - }; 144 - } 145 - 146 - let error = await response.text(); 147 - 148 - try { 149 - error = JSON.parse(error); 150 - } catch { 151 - // noop 152 - } 153 - 154 - let finalError = error; 155 - 156 - for (const fn of interceptors.error._fns) { 157 - if (fn) { 158 - finalError = (await fn(error, response, request, opts)) as string; 159 - } 160 - } 161 - 162 - finalError = finalError || ({} as string); 163 - 164 - if (opts.throwOnError) { 165 - throw finalError; 166 - } 167 - 168 - // TODO: we probably want to return error and improve types 169 - return opts.responseStyle === 'data' 170 - ? undefined 171 - : { 172 - error: finalError, 173 - ...result, 174 - }; 175 - }; 176 - 177 - return { 178 - buildUrl, 179 - connect: (options) => request({ ...options, method: 'CONNECT' }), 180 - delete: (options) => request({ ...options, method: 'DELETE' }), 181 - get: (options) => request({ ...options, method: 'GET' }), 182 - getConfig, 183 - head: (options) => request({ ...options, method: 'HEAD' }), 184 - interceptors, 185 - options: (options) => request({ ...options, method: 'OPTIONS' }), 186 - patch: (options) => request({ ...options, method: 'PATCH' }), 187 - post: (options) => request({ ...options, method: 'POST' }), 188 - put: (options) => request({ ...options, method: 'PUT' }), 189 - request, 190 - setConfig, 191 - trace: (options) => request({ ...options, method: 'TRACE' }), 192 - }; 193 - };
+8 -7
examples/openapi-ts-angular/src/client/client/index.ts
··· 1 - export type { Auth } from '../core/auth'; 2 - export type { QuerySerializerOptions } from '../core/bodySerializer'; 1 + export type { Auth } from '../core/auth.gen'; 2 + export type { QuerySerializerOptions } from '../core/bodySerializer.gen'; 3 3 export { 4 4 formDataBodySerializer, 5 5 jsonBodySerializer, 6 6 urlSearchParamsBodySerializer, 7 - } from '../core/bodySerializer'; 8 - export { buildClientParams } from '../core/params'; 9 - export { createClient } from './client'; 7 + } from '../core/bodySerializer.gen'; 8 + export { buildClientParams } from '../core/params.gen'; 9 + export { createClient } from './client.gen'; 10 10 export type { 11 11 Client, 12 12 ClientOptions, ··· 16 16 OptionsLegacyParser, 17 17 RequestOptions, 18 18 RequestResult, 19 + ResolvedRequestOptions, 19 20 ResponseStyle, 20 21 TDataShape, 21 - } from './types'; 22 - export { createConfig, mergeHeaders } from './utils'; 22 + } from './types.gen'; 23 + export { createConfig, mergeHeaders } from './utils.gen';
+28 -38
examples/openapi-ts-angular/src/client/client/types.ts examples/openapi-ts-angular/src/client/client/types.gen.ts
··· 1 - import type { Auth } from '../core/auth'; 2 - import type { Client as CoreClient, Config as CoreConfig } from '../core/types'; 3 - import type { Middleware } from './utils'; 1 + import type { 2 + HttpClient, 3 + HttpRequest, 4 + HttpResponse, 5 + } from '@angular/common/http'; 6 + 7 + import type { Auth } from '../core/auth.gen'; 8 + import type { 9 + Client as CoreClient, 10 + Config as CoreConfig, 11 + } from '../core/types.gen'; 12 + import type { Middleware } from './utils.gen'; 4 13 5 14 export type ResponseStyle = 'data' | 'fields'; 6 15 ··· 12 21 */ 13 22 baseUrl?: T['baseUrl']; 14 23 /** 15 - * Fetch API implementation. You can use this option to provide a custom 16 - * fetch instance. 17 - * 18 - * @default globalThis.fetch 24 + * The HTTP client to use for making requests. 19 25 */ 20 - fetch?: (request: Request) => ReturnType<typeof fetch>; 21 - /** 22 - * Please don't use the Fetch client for Next.js applications. The `next` 23 - * options won't have any effect. 24 - * 25 - * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead. 26 - */ 27 - next?: never; 28 - /** 29 - * Return the response data parsed in a specified format. By default, `auto` 30 - * will infer the appropriate method from the `Content-Type` response header. 31 - * You can override this behavior with any of the {@link Body} methods. 32 - * Select `stream` if you don't want to parse response data at all. 33 - * 34 - * @default 'auto' 35 - */ 36 - parseAs?: 37 - | 'arrayBuffer' 38 - | 'auto' 39 - | 'blob' 40 - | 'formData' 41 - | 'json' 42 - | 'stream' 43 - | 'text'; 26 + httpClient?: HttpClient; 44 27 /** 45 28 * Should we return only data or multiple fields (data, error, response, etc.)? 46 29 * 47 30 * @default 'fields' 48 31 */ 49 32 responseStyle?: ResponseStyle; 50 - /** 51 - * Throw an error instead of returning it in the response? 52 - * 53 - * @default false 54 - */ 55 - throwOnError?: T['throwOnError']; 56 33 } 57 34 58 35 export interface RequestOptions< ··· 76 53 */ 77 54 security?: ReadonlyArray<Auth>; 78 55 url: Url; 56 + } 57 + 58 + export interface ResolvedRequestOptions< 59 + TResponseStyle extends ResponseStyle = 'fields', 60 + ThrowOnError extends boolean = boolean, 61 + Url extends string = string, 62 + > extends RequestOptions<TResponseStyle, ThrowOnError, Url> { 63 + serializedBody?: string; 79 64 } 80 65 81 66 export type RequestResult< ··· 160 145 ) => string; 161 146 162 147 export type Client = CoreClient<RequestFn, Config, MethodFn, BuildUrlFn> & { 163 - interceptors: Middleware<Request, Response, unknown, RequestOptions>; 148 + interceptors: Middleware< 149 + HttpRequest<unknown>, 150 + HttpResponse<unknown>, 151 + unknown, 152 + ResolvedRequestOptions 153 + >; 164 154 }; 165 155 166 156 /**
+10 -5
examples/openapi-ts-angular/src/client/client/utils.ts examples/openapi-ts-angular/src/client/client/utils.gen.ts
··· 1 - import { getAuthToken } from '../core/auth'; 1 + import { getAuthToken } from '../core/auth.gen'; 2 2 import type { 3 3 QuerySerializer, 4 4 QuerySerializerOptions, 5 - } from '../core/bodySerializer'; 6 - import { jsonBodySerializer } from '../core/bodySerializer'; 5 + } from '../core/bodySerializer.gen'; 6 + import { jsonBodySerializer } from '../core/bodySerializer.gen'; 7 7 import { 8 8 serializeArrayParam, 9 9 serializeObjectParam, 10 10 serializePrimitiveParam, 11 - } from '../core/pathSerializer'; 12 - import type { Client, ClientOptions, Config, RequestOptions } from './types'; 11 + } from '../core/pathSerializer.gen'; 12 + import type { 13 + Client, 14 + ClientOptions, 15 + Config, 16 + RequestOptions, 17 + } from './types.gen'; 13 18 14 19 interface PathSerializer { 15 20 path: Record<string, unknown>;
examples/openapi-ts-angular/src/client/core/auth.ts examples/openapi-ts-angular/src/client/core/auth.gen.ts
+10 -6
examples/openapi-ts-angular/src/client/core/bodySerializer.ts examples/openapi-ts-angular/src/client/core/bodySerializer.gen.ts
··· 2 2 ArrayStyle, 3 3 ObjectStyle, 4 4 SerializerOptions, 5 - } from './pathSerializer'; 5 + } from './pathSerializer.gen'; 6 6 7 7 export type QuerySerializer = (query: Record<string, unknown>) => string; 8 8 ··· 14 14 object?: SerializerOptions<ObjectStyle>; 15 15 } 16 16 17 - const serializeFormDataPair = (data: FormData, key: string, value: unknown) => { 17 + const serializeFormDataPair = ( 18 + data: FormData, 19 + key: string, 20 + value: unknown, 21 + ): void => { 18 22 if (typeof value === 'string' || value instanceof Blob) { 19 23 data.append(key, value); 20 24 } else { ··· 26 30 data: URLSearchParams, 27 31 key: string, 28 32 value: unknown, 29 - ) => { 33 + ): void => { 30 34 if (typeof value === 'string') { 31 35 data.append(key, value); 32 36 } else { ··· 37 41 export const formDataBodySerializer = { 38 42 bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 39 43 body: T, 40 - ) => { 44 + ): FormData => { 41 45 const data = new FormData(); 42 46 43 47 Object.entries(body).forEach(([key, value]) => { ··· 56 60 }; 57 61 58 62 export const jsonBodySerializer = { 59 - bodySerializer: <T>(body: T) => 63 + bodySerializer: <T>(body: T): string => 60 64 JSON.stringify(body, (_key, value) => 61 65 typeof value === 'bigint' ? value.toString() : value, 62 66 ), ··· 65 69 export const urlSearchParamsBodySerializer = { 66 70 bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 67 71 body: T, 68 - ) => { 72 + ): string => { 69 73 const data = new URLSearchParams(); 70 74 71 75 Object.entries(body).forEach(([key, value]) => {
+10
examples/openapi-ts-angular/src/client/core/params.ts examples/openapi-ts-angular/src/client/core/params.gen.ts
··· 3 3 export type Field = 4 4 | { 5 5 in: Exclude<Slot, 'body'>; 6 + /** 7 + * Field name. This is the name we want the user to see and use. 8 + */ 6 9 key: string; 10 + /** 11 + * Field mapped name. This is the name we want to use in the request. 12 + * If omitted, we use the same value as `key`. 13 + */ 7 14 map?: string; 8 15 } 9 16 | { 10 17 in: Extract<Slot, 'body'>; 18 + /** 19 + * Key isn't required for bodies. 20 + */ 11 21 key?: string; 12 22 map?: string; 13 23 };
examples/openapi-ts-angular/src/client/core/pathSerializer.ts examples/openapi-ts-angular/src/client/core/pathSerializer.gen.ts
+16 -2
examples/openapi-ts-angular/src/client/core/types.ts examples/openapi-ts-angular/src/client/core/types.gen.ts
··· 1 - import type { Auth, AuthToken } from './auth'; 1 + import type { Auth, AuthToken } from './auth.gen'; 2 2 import type { 3 3 BodySerializer, 4 4 QuerySerializer, 5 5 QuerySerializerOptions, 6 - } from './bodySerializer'; 6 + } from './bodySerializer.gen'; 7 7 8 8 export interface Client< 9 9 RequestFn = never, ··· 102 102 */ 103 103 responseValidator?: (data: unknown) => Promise<unknown>; 104 104 } 105 + 106 + type IsExactlyNeverOrNeverUndefined<T> = [T] extends [never] 107 + ? true 108 + : [T] extends [never | undefined] 109 + ? [undefined] extends [T] 110 + ? false 111 + : true 112 + : false; 113 + 114 + export type OmitNever<T extends Record<string, unknown>> = { 115 + [K in keyof T as IsExactlyNeverOrNeverUndefined<T[K]> extends true 116 + ? never 117 + : K]: T[K]; 118 + };
+4 -4
examples/openapi-ts-angular/src/client/sdk.gen.ts
··· 136 136 * Multiple status values can be provided with comma separated strings. 137 137 */ 138 138 export const findPetsByStatus = <ThrowOnError extends boolean = false>( 139 - options?: Options<FindPetsByStatusData, ThrowOnError>, 139 + options: Options<FindPetsByStatusData, ThrowOnError>, 140 140 ) => 141 - (options?.client ?? _heyApiClient).get< 141 + (options.client ?? _heyApiClient).get< 142 142 FindPetsByStatusResponses, 143 143 FindPetsByStatusErrors, 144 144 ThrowOnError ··· 158 158 * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. 159 159 */ 160 160 export const findPetsByTags = <ThrowOnError extends boolean = false>( 161 - options?: Options<FindPetsByTagsData, ThrowOnError>, 161 + options: Options<FindPetsByTagsData, ThrowOnError>, 162 162 ) => 163 - (options?.client ?? _heyApiClient).get< 163 + (options.client ?? _heyApiClient).get< 164 164 FindPetsByTagsResponses, 165 165 FindPetsByTagsErrors, 166 166 ThrowOnError
+4 -4
examples/openapi-ts-angular/src/client/types.gen.ts
··· 136 136 export type FindPetsByStatusData = { 137 137 body?: never; 138 138 path?: never; 139 - query?: { 139 + query: { 140 140 /** 141 141 * Status values that need to be considered for filter 142 142 */ 143 - status?: 'available' | 'pending' | 'sold'; 143 + status: 'available' | 'pending' | 'sold'; 144 144 }; 145 145 url: '/pet/findByStatus'; 146 146 }; ··· 169 169 export type FindPetsByTagsData = { 170 170 body?: never; 171 171 path?: never; 172 - query?: { 172 + query: { 173 173 /** 174 174 * Tags to filter by 175 175 */ 176 - tags?: Array<string>; 176 + tags: Array<string>; 177 177 }; 178 178 url: '/pet/findByTags'; 179 179 };
+3
packages/openapi-ts/package.json
··· 101 101 "typescript": "^5.5.3" 102 102 }, 103 103 "devDependencies": { 104 + "@angular/common": "20.1.6", 105 + "@angular/core": "20.1.6", 104 106 "@config/vite-base": "workspace:*", 105 107 "@types/bun": "1.2.19", 106 108 "@types/cross-spawn": "6.0.6", ··· 114 116 "node-fetch": "3.3.2", 115 117 "nuxt": "3.14.1592", 116 118 "prettier": "3.4.2", 119 + "rxjs": "7.8.2", 117 120 "ts-node": "10.9.2", 118 121 "tslib": "2.8.1", 119 122 "typescript": "5.8.3",
+61 -96
packages/openapi-ts/src/plugins/@hey-api/client-angular/bundle/client.ts
··· 1 + import type { HttpResponse } from '@angular/common/http'; 2 + import { HttpClient, HttpEventType, HttpRequest } from '@angular/common/http'; 3 + import { 4 + assertInInjectionContext, 5 + inject, 6 + provideAppInitializer, 7 + } from '@angular/core'; 8 + import { firstValueFrom } from 'rxjs'; 9 + import { filter } from 'rxjs/operators'; 10 + 1 11 import type { Client, Config, ResolvedRequestOptions } from './types'; 2 12 import { 3 13 buildUrl, 4 14 createConfig, 5 15 createInterceptors, 6 - getParseAs, 7 16 mergeConfigs, 8 17 mergeHeaders, 9 18 setAuthParams, 10 19 } from './utils'; 11 20 12 - type ReqInit = Omit<RequestInit, 'body' | 'headers'> & { 13 - body?: any; 14 - headers: ReturnType<typeof mergeHeaders>; 15 - }; 21 + export function provideHeyApiClient(client: Client) { 22 + return provideAppInitializer(() => { 23 + const httpClient = inject(HttpClient); 24 + client.setConfig({ httpClient }); 25 + }); 26 + } 16 27 17 28 export const createClient = (config: Config = {}): Client => { 18 29 let _config = mergeConfigs(createConfig(), config); ··· 25 36 }; 26 37 27 38 const interceptors = createInterceptors< 28 - Request, 29 - Response, 39 + HttpRequest<unknown>, 40 + HttpResponse<unknown>, 30 41 unknown, 31 42 ResolvedRequestOptions 32 43 >(); ··· 35 46 const opts = { 36 47 ..._config, 37 48 ...options, 38 - fetch: options.fetch ?? _config.fetch ?? globalThis.fetch, 39 49 headers: mergeHeaders(_config.headers, options.headers), 50 + httpClient: options.httpClient ?? _config.httpClient, 40 51 serializedBody: undefined, 41 52 }; 42 53 54 + if (!opts.httpClient) { 55 + assertInInjectionContext(request); 56 + opts.httpClient = inject(HttpClient); 57 + } 58 + 43 59 if (opts.security) { 44 60 await setAuthParams({ 45 61 ...opts, ··· 61 77 } 62 78 63 79 const url = buildUrl(opts); 64 - const requestInit: ReqInit = { 80 + 81 + let req = new HttpRequest<unknown>(opts.method, url, { 65 82 redirect: 'follow', 66 83 ...opts, 67 84 body: opts.serializedBody, 68 - }; 69 - 70 - let request = new Request(url, requestInit); 85 + }); 71 86 72 87 for (const fn of interceptors.request._fns) { 73 88 if (fn) { 74 - request = await fn(request, opts); 89 + req = await fn(req, opts); 75 90 } 76 91 } 77 92 78 - // fetch must be assigned here, otherwise it would throw the error: 79 - // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation 80 - const _fetch = opts.fetch!; 81 - let response = await _fetch(request); 82 - 83 - for (const fn of interceptors.response._fns) { 84 - if (fn) { 85 - response = await fn(response, request, opts); 86 - } 87 - } 88 - 93 + let response; 89 94 const result = { 90 - request, 95 + request: req, 91 96 response, 92 97 }; 93 98 94 - if (response.ok) { 95 - if ( 96 - response.status === 204 || 97 - response.headers.get('Content-Length') === '0' 98 - ) { 99 - return opts.responseStyle === 'data' 100 - ? {} 101 - : { 102 - data: {}, 103 - ...result, 104 - }; 99 + try { 100 + response = await firstValueFrom( 101 + opts.httpClient 102 + .request(req) 103 + .pipe(filter((event) => event.type === HttpEventType.Response)), 104 + ); 105 + 106 + for (const fn of interceptors.response._fns) { 107 + if (fn) { 108 + response = await fn(response, req, opts); 109 + } 105 110 } 106 111 107 - const parseAs = 108 - (opts.parseAs === 'auto' 109 - ? getParseAs(response.headers.get('Content-Type')) 110 - : opts.parseAs) ?? 'json'; 112 + let bodyResponse = response.body as Record<string, unknown>; 111 113 112 - let data: any; 113 - switch (parseAs) { 114 - case 'arrayBuffer': 115 - case 'blob': 116 - case 'formData': 117 - case 'json': 118 - case 'text': 119 - data = await response[parseAs](); 120 - break; 121 - case 'stream': 122 - return opts.responseStyle === 'data' 123 - ? response.body 124 - : { 125 - data: response.body, 126 - ...result, 127 - }; 114 + if (opts.responseValidator) { 115 + await opts.responseValidator(bodyResponse); 128 116 } 129 117 130 - if (parseAs === 'json') { 131 - if (opts.responseValidator) { 132 - await opts.responseValidator(data); 133 - } 118 + if (opts.responseTransformer) { 119 + bodyResponse = (await opts.responseTransformer(bodyResponse)) as Record< 120 + string, 121 + unknown 122 + >; 123 + } 134 124 135 - if (opts.responseTransformer) { 136 - data = await opts.responseTransformer(data); 125 + return ( 126 + opts.responseStyle === 'data' 127 + ? bodyResponse 128 + : { data: bodyResponse, ...result } 129 + ) as any; 130 + } catch (error) { 131 + for (const fn of interceptors.error._fns) { 132 + if (fn) { 133 + (await fn(error, response!, req, opts)) as string; 137 134 } 138 135 } 139 136 140 137 return opts.responseStyle === 'data' 141 - ? data 138 + ? undefined 142 139 : { 143 - data, 140 + error, 144 141 ...result, 145 142 }; 146 143 } 147 - 148 - const textError = await response.text(); 149 - let jsonError: unknown; 150 - 151 - try { 152 - jsonError = JSON.parse(textError); 153 - } catch { 154 - // noop 155 - } 156 - 157 - const error = jsonError ?? textError; 158 - let finalError = error; 159 - 160 - for (const fn of interceptors.error._fns) { 161 - if (fn) { 162 - finalError = (await fn(error, response, request, opts)) as string; 163 - } 164 - } 165 - 166 - finalError = finalError || ({} as string); 167 - 168 - if (opts.throwOnError) { 169 - throw finalError; 170 - } 171 - 172 - // TODO: we probably want to return error and improve types 173 - return opts.responseStyle === 'data' 174 - ? undefined 175 - : { 176 - error: finalError, 177 - ...result, 178 - }; 179 144 }; 180 145 181 146 return {
+14 -35
packages/openapi-ts/src/plugins/@hey-api/client-angular/bundle/types.ts
··· 1 + import type { 2 + HttpClient, 3 + HttpRequest, 4 + HttpResponse, 5 + } from '@angular/common/http'; 6 + 1 7 import type { Auth } from '../../client-core/bundle/auth'; 2 8 import type { 3 9 Client as CoreClient, ··· 15 21 */ 16 22 baseUrl?: T['baseUrl']; 17 23 /** 18 - * Fetch API implementation. You can use this option to provide a custom 19 - * fetch instance. 20 - * 21 - * @default globalThis.fetch 22 - */ 23 - fetch?: (request: Request) => ReturnType<typeof fetch>; 24 - /** 25 - * Please don't use the Fetch client for Next.js applications. The `next` 26 - * options won't have any effect. 27 - * 28 - * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead. 29 - */ 30 - next?: never; 31 - /** 32 - * Return the response data parsed in a specified format. By default, `auto` 33 - * will infer the appropriate method from the `Content-Type` response header. 34 - * You can override this behavior with any of the {@link Body} methods. 35 - * Select `stream` if you don't want to parse response data at all. 36 - * 37 - * @default 'auto' 24 + * The HTTP client to use for making requests. 38 25 */ 39 - parseAs?: 40 - | 'arrayBuffer' 41 - | 'auto' 42 - | 'blob' 43 - | 'formData' 44 - | 'json' 45 - | 'stream' 46 - | 'text'; 26 + httpClient?: HttpClient; 47 27 /** 48 28 * Should we return only data or multiple fields (data, error, response, etc.)? 49 29 * 50 30 * @default 'fields' 51 31 */ 52 32 responseStyle?: ResponseStyle; 53 - /** 54 - * Throw an error instead of returning it in the response? 55 - * 56 - * @default false 57 - */ 58 - throwOnError?: T['throwOnError']; 59 33 } 60 34 61 35 export interface RequestOptions< ··· 171 145 ) => string; 172 146 173 147 export type Client = CoreClient<RequestFn, Config, MethodFn, BuildUrlFn> & { 174 - interceptors: Middleware<Request, Response, unknown, ResolvedRequestOptions>; 148 + interceptors: Middleware< 149 + HttpRequest<unknown>, 150 + HttpResponse<unknown>, 151 + unknown, 152 + ResolvedRequestOptions 153 + >; 175 154 }; 176 155 177 156 /**
+1
packages/openapi-ts/src/plugins/@hey-api/client-angular/config.ts
··· 7 7 ...clientDefaultMeta, 8 8 config: { 9 9 ...clientDefaultConfig, 10 + httpResource: false, 10 11 throwOnError: false, 11 12 }, 12 13 handler: clientPluginHandler as HeyApiClientAngularPlugin['Handler'],
-1
packages/openapi-ts/src/utils/getHttpRequestName.ts
··· 6 6 */ 7 7 export const getHttpRequestName = (clientName: PluginClientNames): string => { 8 8 switch (clientName) { 9 - case '@hey-api/client-angular': 10 9 case 'legacy/angular': 11 10 return 'AngularHttpRequest'; 12 11 case 'legacy/axios':
+1
packages/openapi-ts/tsup.config.ts
··· 37 37 const pluginNames = [ 38 38 'client-axios', 39 39 'client-core', 40 + 'client-angular', 40 41 'client-fetch', 41 42 'client-next', 42 43 'client-nuxt',
+327 -41
pnpm-lock.yaml
··· 108 108 109 109 examples/openapi-ts-angular: 110 110 dependencies: 111 + '@angular/common': 112 + specifier: 20.1.6 113 + version: 20.1.6(@angular/core@20.1.6(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2) 114 + '@angular/core': 115 + specifier: 20.1.6 116 + version: 20.1.6(rxjs@7.8.2)(zone.js@0.15.0) 111 117 '@radix-ui/react-form': 112 118 specifier: 0.1.1 113 119 version: 0.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ··· 123 129 react-dom: 124 130 specifier: 19.0.0 125 131 version: 19.0.0(react@19.0.0) 132 + rxjs: 133 + specifier: 7.8.2 134 + version: 7.8.2 126 135 devDependencies: 127 136 '@config/vite-base': 128 137 specifier: workspace:* ··· 878 887 specifier: 7.7.2 879 888 version: 7.7.2 880 889 devDependencies: 890 + '@angular/common': 891 + specifier: 20.1.6 892 + version: 20.1.6(@angular/core@20.1.6(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2) 893 + '@angular/core': 894 + specifier: 20.1.6 895 + version: 20.1.6(rxjs@7.8.2)(zone.js@0.15.0) 881 896 '@config/vite-base': 882 897 specifier: workspace:* 883 898 version: link:../config-vite-base ··· 913 928 version: 3.3.2 914 929 nuxt: 915 930 specifier: 3.14.1592 916 - version: 3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.6.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.41.1)(sass@1.85.0)(terser@5.39.0)(typescript@5.8.3)(vite@6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0)) 931 + version: 3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.6.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.41.1)(sass@1.85.0)(terser@5.39.0)(typescript@5.8.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) 917 932 prettier: 918 933 specifier: 3.4.2 919 934 version: 3.4.2 935 + rxjs: 936 + specifier: 7.8.2 937 + version: 7.8.2 920 938 ts-node: 921 939 specifier: 10.9.2 922 940 version: 10.9.2(@types/node@22.10.5)(typescript@5.8.3) ··· 1306 1324 '@angular/core': 19.2.0 1307 1325 rxjs: ^6.5.3 || ^7.4.0 1308 1326 1327 + '@angular/common@20.1.6': 1328 + resolution: {integrity: sha512-VwV6u5y5NQg5u+Z5A50MCJNpxseny9Rv+csZe9zckH0ylqy9tLowbG6L7jrts36Ze2lwqRag0b+wB0TgrvaT0w==} 1329 + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} 1330 + peerDependencies: 1331 + '@angular/core': 20.1.6 1332 + rxjs: ^6.5.3 || ^7.4.0 1333 + 1309 1334 '@angular/compiler-cli@19.2.0': 1310 1335 resolution: {integrity: sha512-IFl3LNfFanspS4gHjn207TPuoJGGieuC9r+j3nDitUcFH49fbShYLGCB6xczvK+j68ZWCqv4voxAOmLyfA/Opw==} 1311 1336 engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} ··· 1329 1354 peerDependencies: 1330 1355 rxjs: ^6.5.3 || ^7.4.0 1331 1356 zone.js: ~0.15.0 1357 + 1358 + '@angular/core@20.1.6': 1359 + resolution: {integrity: sha512-Nz62f9FNcvjOxUivi50YtmEfSdrS7xqpPDoN/jwLkT5VmFfIUFF77sabTF5KTWHCDbp420e2UON6uEblfiRfaw==} 1360 + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} 1361 + peerDependencies: 1362 + '@angular/compiler': 20.1.6 1363 + rxjs: ^6.5.3 || ^7.4.0 1364 + zone.js: ~0.15.0 1365 + peerDependenciesMeta: 1366 + '@angular/compiler': 1367 + optional: true 1368 + zone.js: 1369 + optional: true 1332 1370 1333 1371 '@angular/forms@19.2.0': 1334 1372 resolution: {integrity: sha512-/GHQgiDPUr1vMXCB1O8c+O70DcoZykDBzOICCaz3kTu46rp48g6E6iaZVJoozI0iBwB8+rnuTPQnLWJ46w+wVg==} ··· 9980 10018 puppeteer@22.12.1: 9981 10019 resolution: {integrity: sha512-1GxY8dnEnHr1SLzdSDr0FCjM6JQfAh2E2I/EqzeF8a58DbGVk9oVjj4lFdqNoVbpgFSpAbz7VER9St7S1wDpNg==} 9982 10020 engines: {node: '>=18'} 10021 + deprecated: < 24.9.0 is no longer supported 9983 10022 hasBin: true 9984 10023 9985 10024 qjobs@1.2.0: ··· 10297 10336 rxjs@7.8.1: 10298 10337 resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} 10299 10338 10339 + rxjs@7.8.2: 10340 + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} 10341 + 10300 10342 sade@1.8.1: 10301 10343 resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 10302 10344 engines: {node: '>=6'} ··· 10614 10656 source-map@0.8.0-beta.0: 10615 10657 resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 10616 10658 engines: {node: '>= 8'} 10659 + deprecated: The work that was done in this beta branch won't be included in future versions 10617 10660 10618 10661 space-separated-tokens@2.0.2: 10619 10662 resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} ··· 12287 12330 dependencies: 12288 12331 '@ampproject/remapping': 2.3.0 12289 12332 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 12290 - '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0)) 12333 + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.2)))(webpack@5.98.0(esbuild@0.25.0)) 12291 12334 '@angular-devkit/core': 19.2.0(chokidar@4.0.3) 12292 12335 '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.4.2)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)))(terser@5.39.0)(typescript@5.8.3)(yaml@2.8.0) 12293 12336 '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.8.3) ··· 12337 12380 tree-kill: 1.2.2 12338 12381 tslib: 2.8.1 12339 12382 typescript: 5.8.3 12340 - webpack: 5.98.0(esbuild@0.25.2) 12341 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 12342 - webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 12383 + webpack: 5.98.0(esbuild@0.25.0) 12384 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.2)) 12385 + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.2)) 12343 12386 webpack-merge: 6.0.1 12344 12387 webpack-subresource-integrity: 5.1.0(webpack@5.98.0(esbuild@0.25.0)) 12345 12388 optionalDependencies: ··· 12373 12416 dependencies: 12374 12417 '@ampproject/remapping': 2.3.0 12375 12418 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 12376 - '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0)) 12419 + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.2)))(webpack@5.98.0(esbuild@0.25.0)) 12377 12420 '@angular-devkit/core': 19.2.0(chokidar@4.0.3) 12378 12421 '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.4.2)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)))(terser@5.39.0)(typescript@5.8.3)(yaml@2.8.0) 12379 12422 '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.8.3) ··· 12423 12466 tree-kill: 1.2.2 12424 12467 tslib: 2.8.1 12425 12468 typescript: 5.8.3 12426 - webpack: 5.98.0(esbuild@0.25.2) 12427 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 12428 - webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 12469 + webpack: 5.98.0(esbuild@0.25.0) 12470 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.2)) 12471 + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.2)) 12429 12472 webpack-merge: 6.0.1 12430 12473 webpack-subresource-integrity: 5.1.0(webpack@5.98.0(esbuild@0.25.0)) 12431 12474 optionalDependencies: ··· 12455 12498 - webpack-cli 12456 12499 - yaml 12457 12500 12458 - '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0))': 12501 + '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.2)))(webpack@5.98.0(esbuild@0.25.0))': 12459 12502 dependencies: 12460 12503 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 12461 12504 rxjs: 7.8.1 12462 - webpack: 5.98.0(esbuild@0.25.2) 12463 - webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 12505 + webpack: 5.98.0(esbuild@0.25.0) 12506 + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.2)) 12464 12507 transitivePeerDependencies: 12465 12508 - chokidar 12466 12509 ··· 12579 12622 rxjs: 7.8.1 12580 12623 tslib: 2.8.1 12581 12624 12625 + '@angular/common@20.1.6(@angular/core@20.1.6(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2)': 12626 + dependencies: 12627 + '@angular/core': 20.1.6(rxjs@7.8.2)(zone.js@0.15.0) 12628 + rxjs: 7.8.2 12629 + tslib: 2.8.1 12630 + 12582 12631 '@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.8.3)': 12583 12632 dependencies: 12584 12633 '@angular/compiler': 19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)) ··· 12604 12653 dependencies: 12605 12654 rxjs: 7.8.1 12606 12655 tslib: 2.8.1 12656 + zone.js: 0.15.0 12657 + 12658 + '@angular/core@20.1.6(rxjs@7.8.2)(zone.js@0.15.0)': 12659 + dependencies: 12660 + rxjs: 7.8.2 12661 + tslib: 2.8.1 12662 + optionalDependencies: 12607 12663 zone.js: 0.15.0 12608 12664 12609 12665 '@angular/forms@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0))(rxjs@7.8.1))(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(rxjs@7.8.1)': ··· 14655 14711 dependencies: 14656 14712 '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.8.3) 14657 14713 typescript: 5.8.3 14658 - webpack: 5.98.0(esbuild@0.25.2) 14714 + webpack: 5.98.0(esbuild@0.25.0) 14659 14715 14660 14716 '@nodelib/fs.scandir@2.1.5': 14661 14717 dependencies: ··· 14731 14787 - supports-color 14732 14788 14733 14789 '@nuxt/devalue@2.0.2': {} 14790 + 14791 + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))': 14792 + dependencies: 14793 + '@nuxt/kit': 3.15.4(magicast@0.3.5) 14794 + '@nuxt/schema': 3.16.2 14795 + execa: 7.2.0 14796 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) 14797 + transitivePeerDependencies: 14798 + - magicast 14799 + - supports-color 14734 14800 14735 14801 '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0))': 14736 14802 dependencies: ··· 14802 14868 - utf-8-validate 14803 14869 - vue 14804 14870 14871 + '@nuxt/devtools@1.7.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))(vue@3.5.13(typescript@5.8.3))': 14872 + dependencies: 14873 + '@antfu/utils': 0.7.10 14874 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) 14875 + '@nuxt/devtools-wizard': 1.7.0 14876 + '@nuxt/kit': 3.15.4(magicast@0.3.5) 14877 + '@vue/devtools-core': 7.6.8(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))(vue@3.5.13(typescript@5.8.3)) 14878 + '@vue/devtools-kit': 7.6.8 14879 + birpc: 0.2.19 14880 + consola: 3.4.2 14881 + cronstrue: 2.56.0 14882 + destr: 2.0.3 14883 + error-stack-parser-es: 0.1.5 14884 + execa: 7.2.0 14885 + fast-npm-meta: 0.2.2 14886 + flatted: 3.3.3 14887 + get-port-please: 3.1.2 14888 + hookable: 5.5.3 14889 + image-meta: 0.2.1 14890 + is-installed-globally: 1.0.0 14891 + launch-editor: 2.10.0 14892 + local-pkg: 0.5.1 14893 + magicast: 0.3.5 14894 + nypm: 0.4.1 14895 + ohash: 1.1.6 14896 + pathe: 1.1.2 14897 + perfect-debounce: 1.0.0 14898 + pkg-types: 1.3.1 14899 + rc9: 2.1.2 14900 + scule: 1.3.0 14901 + semver: 7.7.2 14902 + simple-git: 3.27.0 14903 + sirv: 3.0.1 14904 + tinyglobby: 0.2.12 14905 + unimport: 3.14.6(rollup@4.41.1) 14906 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) 14907 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.41.1)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) 14908 + vite-plugin-vue-inspector: 5.3.1(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) 14909 + which: 3.0.1 14910 + ws: 8.18.1 14911 + transitivePeerDependencies: 14912 + - bufferutil 14913 + - rollup 14914 + - supports-color 14915 + - utf-8-validate 14916 + - vue 14917 + 14805 14918 '@nuxt/devtools@1.7.0(rollup@4.41.1)(vite@6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.13(typescript@5.8.3))': 14806 14919 dependencies: 14807 14920 '@antfu/utils': 0.7.10 ··· 17148 17261 dependencies: 17149 17262 '@vue/devtools-kit': 7.7.2 17150 17263 17264 + '@vue/devtools-core@7.6.8(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))(vue@3.5.13(typescript@5.8.3))': 17265 + dependencies: 17266 + '@vue/devtools-kit': 7.7.2 17267 + '@vue/devtools-shared': 7.7.2 17268 + mitt: 3.0.1 17269 + nanoid: 5.1.5 17270 + pathe: 1.1.2 17271 + vite-hot-client: 0.2.4(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) 17272 + vue: 3.5.13(typescript@5.8.3) 17273 + transitivePeerDependencies: 17274 + - vite 17275 + 17151 17276 '@vue/devtools-core@7.6.8(vite@6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.13(typescript@5.8.3))': 17152 17277 dependencies: 17153 17278 '@vue/devtools-kit': 7.7.2 ··· 17703 17828 '@babel/core': 7.26.9 17704 17829 find-cache-dir: 4.0.0 17705 17830 schema-utils: 4.3.0 17706 - webpack: 5.98.0(esbuild@0.25.2) 17831 + webpack: 5.98.0(esbuild@0.25.0) 17707 17832 17708 17833 babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.9): 17709 17834 dependencies: ··· 18242 18367 normalize-path: 3.0.0 18243 18368 schema-utils: 4.3.0 18244 18369 serialize-javascript: 6.0.2 18245 - webpack: 5.98.0(esbuild@0.25.2) 18370 + webpack: 5.98.0(esbuild@0.25.0) 18246 18371 18247 18372 core-js-compat@3.41.0: 18248 18373 dependencies: ··· 18314 18439 postcss-value-parser: 4.2.0 18315 18440 semver: 7.7.2 18316 18441 optionalDependencies: 18317 - webpack: 5.98.0(esbuild@0.25.2) 18442 + webpack: 5.98.0(esbuild@0.25.0) 18318 18443 18319 18444 css-select@5.1.0: 18320 18445 dependencies: ··· 18982 19107 '@typescript-eslint/parser': 8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3) 18983 19108 eslint: 9.17.0(jiti@2.4.2) 18984 19109 eslint-import-resolver-node: 0.3.9 18985 - eslint-import-resolver-typescript: 3.8.5(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 18986 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.5(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 19110 + eslint-import-resolver-typescript: 3.8.5(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) 19111 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.5)(eslint@9.17.0(jiti@2.4.2)) 18987 19112 eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@2.4.2)) 18988 19113 eslint-plugin-react: 7.37.4(eslint@9.17.0(jiti@2.4.2)) 18989 19114 eslint-plugin-react-hooks: 5.2.0(eslint@9.17.0(jiti@2.4.2)) ··· 19006 19131 transitivePeerDependencies: 19007 19132 - supports-color 19008 19133 19009 - eslint-import-resolver-typescript@3.8.5(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)): 19134 + eslint-import-resolver-typescript@3.8.5(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)): 19010 19135 dependencies: 19011 19136 '@nolyfill/is-core-module': 1.0.39 19012 19137 debug: 4.4.0(supports-color@9.4.0) ··· 19017 19142 stable-hash: 0.0.4 19018 19143 tinyglobby: 0.2.12 19019 19144 optionalDependencies: 19020 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.5(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 19145 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.5)(eslint@9.17.0(jiti@2.4.2)) 19021 19146 transitivePeerDependencies: 19022 19147 - supports-color 19023 19148 19024 - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.5(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)): 19149 + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.5)(eslint@9.17.0(jiti@2.4.2)): 19025 19150 dependencies: 19026 19151 debug: 3.2.7 19027 19152 optionalDependencies: 19028 19153 '@typescript-eslint/parser': 8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3) 19029 19154 eslint: 9.17.0(jiti@2.4.2) 19030 19155 eslint-import-resolver-node: 0.3.9 19031 - eslint-import-resolver-typescript: 3.8.5(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 19156 + eslint-import-resolver-typescript: 3.8.5(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) 19032 19157 transitivePeerDependencies: 19033 19158 - supports-color 19034 19159 19035 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.5(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)): 19160 + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.5)(eslint@9.17.0(jiti@2.4.2)): 19036 19161 dependencies: 19037 19162 '@rtsao/scc': 1.1.0 19038 19163 array-includes: 3.1.8 ··· 19043 19168 doctrine: 2.1.0 19044 19169 eslint: 9.17.0(jiti@2.4.2) 19045 19170 eslint-import-resolver-node: 0.3.9 19046 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.5(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 19171 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.5)(eslint@9.17.0(jiti@2.4.2)) 19047 19172 hasown: 2.0.2 19048 19173 is-core-module: 2.16.1 19049 19174 is-glob: 4.0.3 ··· 20669 20794 dependencies: 20670 20795 less: 4.2.2 20671 20796 optionalDependencies: 20672 - webpack: 5.98.0(esbuild@0.25.2) 20797 + webpack: 5.98.0(esbuild@0.25.0) 20673 20798 20674 20799 less@4.2.2: 20675 20800 dependencies: ··· 20694 20819 dependencies: 20695 20820 webpack-sources: 3.2.3 20696 20821 optionalDependencies: 20697 - webpack: 5.98.0(esbuild@0.25.2) 20822 + webpack: 5.98.0(esbuild@0.25.0) 20698 20823 20699 20824 light-my-request@6.6.0: 20700 20825 dependencies: ··· 21022 21147 dependencies: 21023 21148 schema-utils: 4.3.0 21024 21149 tapable: 2.2.1 21025 - webpack: 5.98.0(esbuild@0.25.2) 21150 + webpack: 5.98.0(esbuild@0.25.0) 21026 21151 21027 21152 minimalistic-assert@1.0.1: {} 21028 21153 ··· 21590 21715 - vue-tsc 21591 21716 - xml2js 21592 21717 21718 + nuxt@3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.6.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.41.1)(sass@1.85.0)(terser@5.39.0)(typescript@5.8.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)): 21719 + dependencies: 21720 + '@nuxt/devalue': 2.0.2 21721 + '@nuxt/devtools': 1.7.0(rollup@4.41.1)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))(vue@3.5.13(typescript@5.8.3)) 21722 + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.41.1) 21723 + '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.41.1) 21724 + '@nuxt/telemetry': 2.6.5(magicast@0.3.5) 21725 + '@nuxt/vite-builder': 3.14.1592(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.41.1)(sass@1.85.0)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) 21726 + '@unhead/dom': 1.11.20 21727 + '@unhead/shared': 1.11.20 21728 + '@unhead/ssr': 1.11.20 21729 + '@unhead/vue': 1.11.20(vue@3.5.13(typescript@5.8.3)) 21730 + '@vue/shared': 3.5.13 21731 + acorn: 8.14.0 21732 + c12: 2.0.1(magicast@0.3.5) 21733 + chokidar: 4.0.3 21734 + compatx: 0.1.8 21735 + consola: 3.4.2 21736 + cookie-es: 1.2.2 21737 + defu: 6.1.4 21738 + destr: 2.0.3 21739 + devalue: 5.1.1 21740 + errx: 0.1.0 21741 + esbuild: 0.24.2 21742 + escape-string-regexp: 5.0.0 21743 + estree-walker: 3.0.3 21744 + globby: 14.1.0 21745 + h3: 1.15.1 21746 + hookable: 5.5.3 21747 + ignore: 6.0.2 21748 + impound: 0.2.2(rollup@4.41.1) 21749 + jiti: 2.4.2 21750 + klona: 2.0.6 21751 + knitwork: 1.2.0 21752 + magic-string: 0.30.17 21753 + mlly: 1.7.4 21754 + nanotar: 0.1.1 21755 + nitropack: 2.11.6(encoding@0.1.13)(typescript@5.8.3) 21756 + nuxi: 3.22.5 21757 + nypm: 0.3.12 21758 + ofetch: 1.4.1 21759 + ohash: 1.1.6 21760 + pathe: 1.1.2 21761 + perfect-debounce: 1.0.0 21762 + pkg-types: 1.3.1 21763 + radix3: 1.1.2 21764 + scule: 1.3.0 21765 + semver: 7.7.2 21766 + std-env: 3.8.1 21767 + strip-literal: 2.1.1 21768 + tinyglobby: 0.2.10 21769 + ufo: 1.5.4 21770 + ultrahtml: 1.5.3 21771 + uncrypto: 0.1.3 21772 + unctx: 2.4.1 21773 + unenv: 1.10.0 21774 + unhead: 1.11.20 21775 + unimport: 3.14.6(rollup@4.41.1) 21776 + unplugin: 1.16.1 21777 + unplugin-vue-router: 0.10.9(rollup@4.41.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.8.3)))(vue@3.5.13(typescript@5.8.3)) 21778 + unstorage: 1.15.0(db0@0.3.1)(ioredis@5.6.0) 21779 + untyped: 1.5.2 21780 + vue: 3.5.13(typescript@5.8.3) 21781 + vue-bundle-renderer: 2.1.1 21782 + vue-devtools-stub: 0.1.0 21783 + vue-router: 4.5.0(vue@3.5.13(typescript@5.8.3)) 21784 + optionalDependencies: 21785 + '@parcel/watcher': 2.5.1 21786 + '@types/node': 22.10.5 21787 + transitivePeerDependencies: 21788 + - '@azure/app-configuration' 21789 + - '@azure/cosmos' 21790 + - '@azure/data-tables' 21791 + - '@azure/identity' 21792 + - '@azure/keyvault-secrets' 21793 + - '@azure/storage-blob' 21794 + - '@biomejs/biome' 21795 + - '@capacitor/preferences' 21796 + - '@deno/kv' 21797 + - '@electric-sql/pglite' 21798 + - '@libsql/client' 21799 + - '@netlify/blobs' 21800 + - '@planetscale/database' 21801 + - '@upstash/redis' 21802 + - '@vercel/blob' 21803 + - '@vercel/kv' 21804 + - aws4fetch 21805 + - better-sqlite3 21806 + - bufferutil 21807 + - db0 21808 + - drizzle-orm 21809 + - encoding 21810 + - eslint 21811 + - idb-keyval 21812 + - ioredis 21813 + - less 21814 + - lightningcss 21815 + - magicast 21816 + - meow 21817 + - mysql2 21818 + - optionator 21819 + - rolldown 21820 + - rollup 21821 + - sass 21822 + - sass-embedded 21823 + - sqlite3 21824 + - stylelint 21825 + - stylus 21826 + - sugarss 21827 + - supports-color 21828 + - terser 21829 + - typescript 21830 + - uploadthing 21831 + - utf-8-validate 21832 + - vite 21833 + - vls 21834 + - vti 21835 + - vue-tsc 21836 + - xml2js 21837 + 21593 21838 nuxt@3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.6.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.41.1)(sass@1.85.0)(terser@5.39.0)(typescript@5.8.3)(vite@6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0)): 21594 21839 dependencies: 21595 21840 '@nuxt/devalue': 2.0.2 ··· 22232 22477 postcss: 8.5.2 22233 22478 semver: 7.7.2 22234 22479 optionalDependencies: 22235 - webpack: 5.98.0(esbuild@0.25.2) 22480 + webpack: 5.98.0(esbuild@0.25.0) 22236 22481 transitivePeerDependencies: 22237 22482 - typescript 22238 22483 ··· 22951 23196 queue-microtask: 1.2.3 22952 23197 22953 23198 rxjs@7.8.1: 23199 + dependencies: 23200 + tslib: 2.8.1 23201 + 23202 + rxjs@7.8.2: 22954 23203 dependencies: 22955 23204 tslib: 2.8.1 22956 23205 ··· 22994 23243 neo-async: 2.6.2 22995 23244 optionalDependencies: 22996 23245 sass: 1.85.0 22997 - webpack: 5.98.0(esbuild@0.25.2) 23246 + webpack: 5.98.0(esbuild@0.25.0) 22998 23247 22999 23248 sass@1.85.0: 23000 23249 dependencies: ··· 23336 23585 dependencies: 23337 23586 iconv-lite: 0.6.3 23338 23587 source-map-js: 1.2.1 23339 - webpack: 5.98.0(esbuild@0.25.2) 23588 + webpack: 5.98.0(esbuild@0.25.0) 23340 23589 23341 23590 source-map-support@0.5.21: 23342 23591 dependencies: ··· 23717 23966 23718 23967 term-size@2.2.1: {} 23719 23968 23720 - terser-webpack-plugin@5.3.14(esbuild@0.25.2)(webpack@5.98.0(esbuild@0.25.0)): 23969 + terser-webpack-plugin@5.3.14(esbuild@0.25.0)(webpack@5.98.0(esbuild@0.25.2)): 23721 23970 dependencies: 23722 23971 '@jridgewell/trace-mapping': 0.3.25 23723 23972 jest-worker: 27.5.1 23724 23973 schema-utils: 4.3.0 23725 23974 serialize-javascript: 6.0.2 23726 23975 terser: 5.39.0 23727 - webpack: 5.98.0(esbuild@0.25.2) 23976 + webpack: 5.98.0(esbuild@0.25.0) 23728 23977 optionalDependencies: 23729 - esbuild: 0.25.2 23978 + esbuild: 0.25.0 23730 23979 23731 23980 terser@5.39.0: 23732 23981 dependencies: ··· 24405 24654 '@types/unist': 3.0.3 24406 24655 vfile-message: 4.0.2 24407 24656 24657 + vite-hot-client@0.2.4(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)): 24658 + dependencies: 24659 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) 24660 + 24408 24661 vite-hot-client@0.2.4(vite@6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0)): 24409 24662 dependencies: 24410 24663 vite: 6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0) ··· 24488 24741 - rollup 24489 24742 - supports-color 24490 24743 24744 + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.41.1)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)): 24745 + dependencies: 24746 + '@antfu/utils': 0.7.10 24747 + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) 24748 + debug: 4.4.0(supports-color@9.4.0) 24749 + error-stack-parser-es: 0.1.5 24750 + fs-extra: 11.3.0 24751 + open: 10.1.0 24752 + perfect-debounce: 1.0.0 24753 + picocolors: 1.1.1 24754 + sirv: 3.0.1 24755 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) 24756 + optionalDependencies: 24757 + '@nuxt/kit': 3.15.4(magicast@0.3.5) 24758 + transitivePeerDependencies: 24759 + - rollup 24760 + - supports-color 24761 + 24491 24762 vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.41.1)(vite@6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0)): 24492 24763 dependencies: 24493 24764 '@antfu/utils': 0.7.10 ··· 24521 24792 - rollup 24522 24793 - supports-color 24523 24794 - vue 24795 + 24796 + vite-plugin-vue-inspector@5.3.1(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)): 24797 + dependencies: 24798 + '@babel/core': 7.26.10 24799 + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10) 24800 + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) 24801 + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) 24802 + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.10) 24803 + '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.26.10) 24804 + '@vue/compiler-dom': 3.5.13 24805 + kolorist: 1.8.0 24806 + magic-string: 0.30.17 24807 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) 24808 + transitivePeerDependencies: 24809 + - supports-color 24524 24810 24525 24811 vite-plugin-vue-inspector@5.3.1(vite@6.2.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.0)): 24526 24812 dependencies: ··· 24813 25099 24814 25100 webidl-conversions@7.0.0: {} 24815 25101 24816 - webpack-dev-middleware@7.4.2(webpack@5.98.0(esbuild@0.25.0)): 25102 + webpack-dev-middleware@7.4.2(webpack@5.98.0(esbuild@0.25.2)): 24817 25103 dependencies: 24818 25104 colorette: 2.0.20 24819 25105 memfs: 4.17.0 ··· 24822 25108 range-parser: 1.2.1 24823 25109 schema-utils: 4.3.0 24824 25110 optionalDependencies: 24825 - webpack: 5.98.0(esbuild@0.25.2) 25111 + webpack: 5.98.0(esbuild@0.25.0) 24826 25112 24827 - webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)): 25113 + webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.2)): 24828 25114 dependencies: 24829 25115 '@types/bonjour': 3.5.13 24830 25116 '@types/connect-history-api-fallback': 1.5.4 ··· 24851 25137 serve-index: 1.9.1 24852 25138 sockjs: 0.3.24 24853 25139 spdy: 4.0.2 24854 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 25140 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.2)) 24855 25141 ws: 8.18.1 24856 25142 optionalDependencies: 24857 - webpack: 5.98.0(esbuild@0.25.2) 25143 + webpack: 5.98.0(esbuild@0.25.0) 24858 25144 transitivePeerDependencies: 24859 25145 - bufferutil 24860 25146 - debug ··· 24872 25158 webpack-subresource-integrity@5.1.0(webpack@5.98.0(esbuild@0.25.0)): 24873 25159 dependencies: 24874 25160 typed-assert: 1.0.9 24875 - webpack: 5.98.0(esbuild@0.25.2) 25161 + webpack: 5.98.0(esbuild@0.25.0) 24876 25162 24877 25163 webpack-virtual-modules@0.6.2: {} 24878 25164 24879 - webpack@5.98.0(esbuild@0.25.2): 25165 + webpack@5.98.0(esbuild@0.25.0): 24880 25166 dependencies: 24881 25167 '@types/eslint-scope': 3.7.7 24882 25168 '@types/estree': 1.0.6 ··· 24898 25184 neo-async: 2.6.2 24899 25185 schema-utils: 4.3.0 24900 25186 tapable: 2.2.1 24901 - terser-webpack-plugin: 5.3.14(esbuild@0.25.2)(webpack@5.98.0(esbuild@0.25.0)) 25187 + terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(webpack@5.98.0(esbuild@0.25.2)) 24902 25188 watchpack: 2.4.2 24903 25189 webpack-sources: 3.2.3 24904 25190 transitivePeerDependencies: