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

feat(client-ky): add ky client example and build configuration

Add example project demonstrating ky client usage:
- Created @example/openapi-ts-ky package with React/Vite setup
- Configured to use @hey-api/client-ky plugin
- Includes generated client code from Swagger Petstore OpenAPI spec

Updated build configuration:
- Added 'client-ky' to tsdown.config.ts plugin list
- Ensures ky bundle files are copied to dist/clients/ky during build
- Enables runtime access to ky client implementation

This example allows typecheck validation in CI and serves as
documentation for ky client integration.

+4203 -220
+24
examples/openapi-ts-ky/.gitignore
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + pnpm-debug.log* 8 + lerna-debug.log* 9 + 10 + node_modules 11 + dist 12 + dist-ssr 13 + *.local 14 + 15 + # Editor directories and files 16 + .vscode/* 17 + !.vscode/extensions.json 18 + .idea 19 + .DS_Store 20 + *.suo 21 + *.ntvs* 22 + *.njsproj 23 + *.sln 24 + *.sw?
+7
examples/openapi-ts-ky/CHANGELOG.md
··· 1 + # @example/openapi-ts-ky 2 + 3 + ## 0.0.1 4 + 5 + ### Patch Changes 6 + 7 + - Initial release of ky client example
+13
examples/openapi-ts-ky/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> --> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <title>Hey API + Fetch API Demo</title> 8 + </head> 9 + <body> 10 + <div id="root"></div> 11 + <script type="module" src="/src/main.tsx"></script> 12 + </body> 13 + </html>
+20
examples/openapi-ts-ky/openapi-ts.config.ts
··· 1 + import { defineConfig } from '@hey-api/openapi-ts'; 2 + 3 + export default defineConfig({ 4 + input: 5 + 'https://raw.githubusercontent.com/swagger-api/swagger-petstore/master/src/main/resources/openapi.yaml', 6 + output: { 7 + format: 'prettier', 8 + lint: 'eslint', 9 + path: './src/client', 10 + }, 11 + plugins: [ 12 + '@hey-api/client-ky', 13 + '@hey-api/schemas', 14 + '@hey-api/sdk', 15 + { 16 + enums: 'javascript', 17 + name: '@hey-api/typescript', 18 + }, 19 + ], 20 + });
+40
examples/openapi-ts-ky/package.json
··· 1 + { 2 + "name": "@example/openapi-ts-ky", 3 + "private": true, 4 + "version": "0.0.1", 5 + "type": "module", 6 + "scripts": { 7 + "build": "tsc && vite build", 8 + "dev": "vite", 9 + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 10 + "openapi-ts": "openapi-ts", 11 + "preview": "vite preview", 12 + "typecheck": "tsc --noEmit" 13 + }, 14 + "dependencies": { 15 + "@radix-ui/react-form": "0.1.1", 16 + "@radix-ui/react-icons": "1.3.2", 17 + "@radix-ui/themes": "3.1.6", 18 + "ky": "1.14.0", 19 + "react": "19.0.0", 20 + "react-dom": "19.0.0" 21 + }, 22 + "devDependencies": { 23 + "@config/vite-base": "workspace:*", 24 + "@hey-api/openapi-ts": "workspace:*", 25 + "@types/react": "19.0.1", 26 + "@types/react-dom": "19.0.1", 27 + "@typescript-eslint/eslint-plugin": "8.29.1", 28 + "@typescript-eslint/parser": "8.29.1", 29 + "@vitejs/plugin-react": "4.4.0-beta.1", 30 + "autoprefixer": "10.4.19", 31 + "eslint": "9.17.0", 32 + "eslint-plugin-react-hooks": "5.2.0", 33 + "eslint-plugin-react-refresh": "0.4.7", 34 + "postcss": "8.4.41", 35 + "prettier": "3.4.2", 36 + "tailwindcss": "3.4.9", 37 + "typescript": "5.8.3", 38 + "vite": "7.1.2" 39 + } 40 + }
+6
examples/openapi-ts-ky/postcss.config.js
··· 1 + export default { 2 + plugins: { 3 + autoprefixer: {}, 4 + tailwindcss: {}, 5 + }, 6 + };
+3
examples/openapi-ts-ky/src/App.css
··· 1 + @tailwind base; 2 + @tailwind components; 3 + @tailwind utilities;
+243
examples/openapi-ts-ky/src/App.tsx
··· 1 + import './App.css'; 2 + 3 + import * as Form from '@radix-ui/react-form'; 4 + import { DownloadIcon, PlusIcon, ReloadIcon } from '@radix-ui/react-icons'; 5 + import { 6 + Avatar, 7 + Box, 8 + Button, 9 + Card, 10 + Container, 11 + Flex, 12 + Heading, 13 + Section, 14 + Text, 15 + TextField, 16 + } from '@radix-ui/themes'; 17 + import { useState } from 'react'; 18 + 19 + import { createClient } from './client/client'; 20 + import { PetSchema } from './client/schemas.gen'; 21 + import { addPet, getPetById, updatePet } from './client/sdk.gen'; 22 + import type { Pet } from './client/types.gen'; 23 + 24 + const localClient = createClient({ 25 + // set default base url for requests made by this client 26 + baseUrl: 'https://petstore3.swagger.io/api/v3', 27 + /** 28 + * Set default headers only for requests made by this client. This is to 29 + * demonstrate local clients and their configuration taking precedence over 30 + * internal service client. 31 + */ 32 + headers: { 33 + Authorization: 'Bearer <token_from_local_client>', 34 + }, 35 + }); 36 + 37 + localClient.interceptors.request.use((request, options) => { 38 + // Middleware is great for adding authorization tokens to requests made to 39 + // protected paths. Headers are set randomly here to allow surfacing the 40 + // default headers, too. 41 + if ( 42 + options.url === '/pet/{petId}' && 43 + options.method === 'GET' && 44 + Math.random() < 0.5 45 + ) { 46 + request.headers.set('Authorization', 'Bearer <token_from_interceptor>'); 47 + } 48 + return request; 49 + }); 50 + 51 + localClient.interceptors.error.use((error) => { 52 + console.log(error); 53 + return error; 54 + }); 55 + 56 + function App() { 57 + const [pet, setPet] = useState<Pet>(); 58 + const [isRequiredNameError, setIsRequiredNameError] = useState(false); 59 + 60 + const onAddPet = async (formData: FormData) => { 61 + // simple form field validation to demonstrate using schemas 62 + if (PetSchema.required.includes('name') && !formData.get('name')) { 63 + setIsRequiredNameError(true); 64 + return; 65 + } 66 + 67 + const { data, error } = await addPet({ 68 + body: { 69 + category: { 70 + id: 0, 71 + name: formData.get('category') as string, 72 + }, 73 + id: 0, 74 + name: formData.get('name') as string, 75 + photoUrls: ['string'], 76 + status: 'available', 77 + tags: [ 78 + { 79 + id: 0, 80 + name: 'string', 81 + }, 82 + ], 83 + }, 84 + }); 85 + if (error) { 86 + console.log(error); 87 + return; 88 + } 89 + setPet(data!); 90 + setIsRequiredNameError(false); 91 + }; 92 + 93 + const onGetPetById = async () => { 94 + const { data, error } = await getPetById({ 95 + client: localClient, 96 + path: { 97 + // random id 1-10 98 + petId: Math.floor(Math.random() * (10 - 1 + 1) + 1), 99 + }, 100 + }); 101 + if (error) { 102 + console.log(error); 103 + return; 104 + } 105 + setPet(data!); 106 + }; 107 + 108 + const onUpdatePet = async () => { 109 + const { data, error } = await updatePet({ 110 + body: { 111 + category: { 112 + id: 0, 113 + name: 'Cats', 114 + }, 115 + id: 2, 116 + name: 'Updated Kitty', 117 + photoUrls: ['string'], 118 + status: 'available', 119 + tags: [ 120 + { 121 + id: 0, 122 + name: 'string', 123 + }, 124 + ], 125 + }, 126 + // setting headers per request 127 + headers: { 128 + Authorization: 'Bearer <token_from_method>', 129 + }, 130 + }); 131 + if (error) { 132 + console.log(error); 133 + return; 134 + } 135 + setPet(data!); 136 + }; 137 + 138 + return ( 139 + <Box 140 + style={{ background: 'var(--gray-a2)', borderRadius: 'var(--radius-3)' }} 141 + > 142 + <Container size="1"> 143 + <Section size="1" /> 144 + <Flex align="center"> 145 + <a className="shrink-0" href="https://heyapi.dev/" target="_blank"> 146 + <img 147 + src="https://heyapi.dev/logo.png" 148 + className="h-16 w-16 transition duration-300 will-change-auto" 149 + alt="Hey API logo" 150 + /> 151 + </a> 152 + <Heading>@hey-api/openapi-ts 🤝 Fetch API</Heading> 153 + </Flex> 154 + <Section size="1" /> 155 + <Flex direction="column" gapY="2"> 156 + <Box maxWidth="240px"> 157 + <Card> 158 + <Flex gap="3" align="center"> 159 + <Avatar 160 + size="3" 161 + src={pet?.photoUrls[0]} 162 + radius="full" 163 + fallback={pet?.name.slice(0, 1) ?? 'N'} 164 + /> 165 + <Box> 166 + <Text as="div" size="2" weight="bold"> 167 + Name: {pet?.name ?? 'N/A'} 168 + </Text> 169 + <Text as="div" size="2" color="gray"> 170 + Category: {pet?.category?.name ?? 'N/A'} 171 + </Text> 172 + </Box> 173 + </Flex> 174 + </Card> 175 + </Box> 176 + <Button onClick={onGetPetById}> 177 + <DownloadIcon /> Get Random Pet 178 + </Button> 179 + </Flex> 180 + <Section size="1" /> 181 + <Flex direction="column" gapY="2"> 182 + <Form.Root 183 + className="w-[260px]" 184 + onSubmit={(event) => { 185 + event.preventDefault(); 186 + onAddPet(new FormData(event.currentTarget)); 187 + }} 188 + > 189 + <Form.Field className="grid mb-[10px]" name="email"> 190 + <div className="flex items-baseline justify-between"> 191 + <Form.Label className="text-[15px] font-medium leading-[35px] text-white"> 192 + Name 193 + </Form.Label> 194 + {isRequiredNameError && ( 195 + <Form.Message className="text-[13px] text-white opacity-[0.8]"> 196 + Please enter a name 197 + </Form.Message> 198 + )} 199 + </div> 200 + <Form.Control asChild> 201 + <TextField.Root placeholder="Kitty" name="name" type="text" /> 202 + </Form.Control> 203 + </Form.Field> 204 + <Form.Field className="grid mb-[10px]" name="question"> 205 + <div className="flex items-baseline justify-between"> 206 + <Form.Label className="text-[15px] font-medium leading-[35px] text-white"> 207 + Category 208 + </Form.Label> 209 + <Form.Message 210 + className="text-[13px] text-white opacity-[0.8]" 211 + match="valueMissing" 212 + > 213 + Please enter a category 214 + </Form.Message> 215 + </div> 216 + <Form.Control asChild> 217 + <TextField.Root 218 + placeholder="Cats" 219 + name="category" 220 + type="text" 221 + required 222 + /> 223 + </Form.Control> 224 + </Form.Field> 225 + <Flex gapX="2"> 226 + <Form.Submit asChild> 227 + <Button type="submit"> 228 + <PlusIcon /> Add Pet 229 + </Button> 230 + </Form.Submit> 231 + <Button onClick={onUpdatePet} type="button"> 232 + <ReloadIcon /> Update Pet 233 + </Button> 234 + </Flex> 235 + </Form.Root> 236 + </Flex> 237 + <Section size="1" /> 238 + </Container> 239 + </Box> 240 + ); 241 + } 242 + 243 + export default App;
+27
examples/openapi-ts-ky/src/client/client.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import { 4 + type ClientOptions, 5 + type Config, 6 + createClient, 7 + createConfig, 8 + } from './client'; 9 + import type { ClientOptions as ClientOptions2 } from './types.gen'; 10 + 11 + /** 12 + * The `createClientConfig()` function will be called on client initialization 13 + * and the returned object will become the client's initial configuration. 14 + * 15 + * You may want to initialize your client this way instead of calling 16 + * `setConfig()`. This is useful for example if you're using Next.js 17 + * to ensure your client always has the correct values. 18 + */ 19 + export type CreateClientConfig<T extends ClientOptions = ClientOptions2> = ( 20 + override?: Config<ClientOptions & T>, 21 + ) => Config<Required<ClientOptions> & T>; 22 + 23 + export const client = createClient( 24 + createConfig<ClientOptions2>({ 25 + baseUrl: 'https://petstore3.swagger.io/api/v3', 26 + }), 27 + );
+341
examples/openapi-ts-ky/src/client/client/client.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import type { HTTPError, Options as KyOptions } from 'ky'; 4 + import ky from 'ky'; 5 + 6 + import { createSseClient } from '../core/serverSentEvents.gen'; 7 + import type { HttpMethod } from '../core/types.gen'; 8 + import { getValidRequestBody } from '../core/utils.gen'; 9 + import type { 10 + Client, 11 + Config, 12 + RequestOptions, 13 + ResolvedRequestOptions, 14 + RetryOptions, 15 + } from './types.gen'; 16 + import type { Middleware } from './utils.gen'; 17 + import { 18 + buildUrl, 19 + createConfig, 20 + createInterceptors, 21 + getParseAs, 22 + mergeConfigs, 23 + mergeHeaders, 24 + setAuthParams, 25 + } from './utils.gen'; 26 + 27 + export const createClient = (config: Config = {}): Client => { 28 + let _config = mergeConfigs(createConfig(), config); 29 + 30 + const getConfig = (): Config => ({ ..._config }); 31 + 32 + const setConfig = (config: Config): Config => { 33 + _config = mergeConfigs(_config, config); 34 + return getConfig(); 35 + }; 36 + 37 + const interceptors = createInterceptors< 38 + Request, 39 + Response, 40 + unknown, 41 + ResolvedRequestOptions 42 + >(); 43 + 44 + const beforeRequest = async (options: RequestOptions) => { 45 + const opts = { 46 + ..._config, 47 + ...options, 48 + headers: mergeHeaders(_config.headers, options.headers), 49 + ky: options.ky ?? _config.ky ?? ky, 50 + serializedBody: undefined, 51 + }; 52 + 53 + if (opts.security) { 54 + await setAuthParams({ 55 + ...opts, 56 + security: opts.security, 57 + }); 58 + } 59 + 60 + if (opts.requestValidator) { 61 + await opts.requestValidator(opts); 62 + } 63 + 64 + if (opts.body !== undefined && opts.bodySerializer) { 65 + opts.serializedBody = opts.bodySerializer(opts.body); 66 + } 67 + 68 + if (opts.body === undefined || opts.serializedBody === '') { 69 + opts.headers.delete('Content-Type'); 70 + } 71 + 72 + const url = buildUrl(opts); 73 + 74 + return { opts, url }; 75 + }; 76 + 77 + const parseErrorResponse = async ( 78 + response: Response, 79 + request: Request, 80 + opts: ResolvedRequestOptions, 81 + interceptorsMiddleware: Middleware< 82 + Request, 83 + Response, 84 + unknown, 85 + ResolvedRequestOptions 86 + >, 87 + ) => { 88 + const result = { 89 + request, 90 + response, 91 + }; 92 + 93 + const textError = await response.text(); 94 + let jsonError: unknown; 95 + 96 + try { 97 + jsonError = JSON.parse(textError); 98 + } catch { 99 + jsonError = undefined; 100 + } 101 + 102 + const error = jsonError ?? textError; 103 + let finalError = error; 104 + 105 + for (const fn of interceptorsMiddleware.error.fns) { 106 + if (fn) { 107 + finalError = (await fn(error, response, request, opts)) as string; 108 + } 109 + } 110 + 111 + finalError = finalError || ({} as string); 112 + 113 + if (opts.throwOnError) { 114 + throw finalError; 115 + } 116 + 117 + return opts.responseStyle === 'data' 118 + ? undefined 119 + : { 120 + error: finalError, 121 + ...result, 122 + }; 123 + }; 124 + 125 + const request: Client['request'] = async (options) => { 126 + // @ts-expect-error 127 + const { opts, url } = await beforeRequest(options); 128 + 129 + const kyInstance = opts.ky!; 130 + 131 + const validBody = getValidRequestBody(opts); 132 + 133 + const kyOptions: KyOptions = { 134 + body: validBody as BodyInit, 135 + cache: opts.cache, 136 + credentials: opts.credentials, 137 + headers: opts.headers, 138 + integrity: opts.integrity, 139 + keepalive: opts.keepalive, 140 + method: opts.method as KyOptions['method'], 141 + mode: opts.mode, 142 + redirect: 'follow', 143 + referrer: opts.referrer, 144 + referrerPolicy: opts.referrerPolicy, 145 + signal: opts.signal, 146 + throwHttpErrors: opts.throwOnError ?? false, 147 + timeout: opts.timeout, 148 + ...(opts.kyOptions || {}), 149 + }; 150 + 151 + if (opts.retry && typeof opts.retry === 'object') { 152 + const retryOpts = opts.retry as RetryOptions; 153 + kyOptions.retry = { 154 + limit: retryOpts.limit ?? 2, 155 + methods: retryOpts.methods as Array< 156 + | 'get' 157 + | 'post' 158 + | 'put' 159 + | 'patch' 160 + | 'head' 161 + | 'delete' 162 + | 'options' 163 + | 'trace' 164 + >, 165 + statusCodes: retryOpts.statusCodes, 166 + }; 167 + } 168 + 169 + let request = new Request(url, { 170 + body: kyOptions.body as BodyInit, 171 + headers: kyOptions.headers as HeadersInit, 172 + method: kyOptions.method, 173 + }); 174 + 175 + for (const fn of interceptors.request.fns) { 176 + if (fn) { 177 + request = await fn(request, opts); 178 + } 179 + } 180 + 181 + let response: Response; 182 + 183 + try { 184 + response = await kyInstance(request, kyOptions); 185 + } catch (error) { 186 + if (error && typeof error === 'object' && 'response' in error) { 187 + const httpError = error as HTTPError; 188 + response = httpError.response; 189 + 190 + for (const fn of interceptors.response.fns) { 191 + if (fn) { 192 + response = await fn(response, request, opts); 193 + } 194 + } 195 + 196 + return parseErrorResponse(response, request, opts, interceptors); 197 + } 198 + 199 + throw error; 200 + } 201 + 202 + for (const fn of interceptors.response.fns) { 203 + if (fn) { 204 + response = await fn(response, request, opts); 205 + } 206 + } 207 + 208 + const result = { 209 + request, 210 + response, 211 + }; 212 + 213 + if (response.ok) { 214 + const parseAs = 215 + (opts.parseAs === 'auto' 216 + ? getParseAs(response.headers.get('Content-Type')) 217 + : opts.parseAs) ?? 'json'; 218 + 219 + if ( 220 + response.status === 204 || 221 + response.headers.get('Content-Length') === '0' 222 + ) { 223 + let emptyData: any; 224 + switch (parseAs) { 225 + case 'arrayBuffer': 226 + case 'blob': 227 + case 'text': 228 + emptyData = await response[parseAs](); 229 + break; 230 + case 'formData': 231 + emptyData = new FormData(); 232 + break; 233 + case 'stream': 234 + emptyData = response.body; 235 + break; 236 + case 'json': 237 + default: 238 + emptyData = {}; 239 + break; 240 + } 241 + return opts.responseStyle === 'data' 242 + ? emptyData 243 + : { 244 + data: emptyData, 245 + ...result, 246 + }; 247 + } 248 + 249 + let data: any; 250 + switch (parseAs) { 251 + case 'arrayBuffer': 252 + case 'blob': 253 + case 'formData': 254 + case 'json': 255 + case 'text': 256 + data = await response[parseAs](); 257 + break; 258 + case 'stream': 259 + return opts.responseStyle === 'data' 260 + ? response.body 261 + : { 262 + data: response.body, 263 + ...result, 264 + }; 265 + } 266 + 267 + if (parseAs === 'json') { 268 + if (opts.responseValidator) { 269 + await opts.responseValidator(data); 270 + } 271 + 272 + if (opts.responseTransformer) { 273 + data = await opts.responseTransformer(data); 274 + } 275 + } 276 + 277 + return opts.responseStyle === 'data' 278 + ? data 279 + : { 280 + data, 281 + ...result, 282 + }; 283 + } 284 + 285 + return parseErrorResponse(response, request, opts, interceptors); 286 + }; 287 + 288 + const makeMethodFn = 289 + (method: Uppercase<HttpMethod>) => (options: RequestOptions) => 290 + request({ ...options, method }); 291 + 292 + const makeSseFn = 293 + (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => { 294 + const { opts, url } = await beforeRequest(options); 295 + return createSseClient({ 296 + ...opts, 297 + body: opts.body as BodyInit | null | undefined, 298 + fetch: globalThis.fetch, 299 + headers: opts.headers as unknown as Record<string, string>, 300 + method, 301 + onRequest: async (url, init) => { 302 + let request = new Request(url, init); 303 + for (const fn of interceptors.request.fns) { 304 + if (fn) { 305 + request = await fn(request, opts); 306 + } 307 + } 308 + return request; 309 + }, 310 + url, 311 + }); 312 + }; 313 + 314 + return { 315 + buildUrl, 316 + connect: makeMethodFn('CONNECT'), 317 + delete: makeMethodFn('DELETE'), 318 + get: makeMethodFn('GET'), 319 + getConfig, 320 + head: makeMethodFn('HEAD'), 321 + interceptors, 322 + options: makeMethodFn('OPTIONS'), 323 + patch: makeMethodFn('PATCH'), 324 + post: makeMethodFn('POST'), 325 + put: makeMethodFn('PUT'), 326 + request, 327 + setConfig, 328 + sse: { 329 + connect: makeSseFn('CONNECT'), 330 + delete: makeSseFn('DELETE'), 331 + get: makeSseFn('GET'), 332 + head: makeSseFn('HEAD'), 333 + options: makeSseFn('OPTIONS'), 334 + patch: makeSseFn('PATCH'), 335 + post: makeSseFn('POST'), 336 + put: makeSseFn('PUT'), 337 + trace: makeSseFn('TRACE'), 338 + }, 339 + trace: makeMethodFn('TRACE'), 340 + } as Client; 341 + };
+26
examples/openapi-ts-ky/src/client/client/index.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + export type { Auth } from '../core/auth.gen'; 4 + export type { QuerySerializerOptions } from '../core/bodySerializer.gen'; 5 + export { 6 + formDataBodySerializer, 7 + jsonBodySerializer, 8 + urlSearchParamsBodySerializer, 9 + } from '../core/bodySerializer.gen'; 10 + export { buildClientParams } from '../core/params.gen'; 11 + export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen'; 12 + export { createClient } from './client.gen'; 13 + export type { 14 + Client, 15 + ClientOptions, 16 + Config, 17 + CreateClientConfig, 18 + Options, 19 + RequestOptions, 20 + RequestResult, 21 + ResolvedRequestOptions, 22 + ResponseStyle, 23 + RetryOptions, 24 + TDataShape, 25 + } from './types.gen'; 26 + export { createConfig, mergeHeaders } from './utils.gen';
+273
examples/openapi-ts-ky/src/client/client/types.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import type { Auth } from '../core/auth.gen'; 4 + import type { 5 + ServerSentEventsOptions, 6 + ServerSentEventsResult, 7 + } from '../core/serverSentEvents.gen'; 8 + import type { 9 + Client as CoreClient, 10 + Config as CoreConfig, 11 + } from '../core/types.gen'; 12 + import type { Middleware } from './utils.gen'; 13 + 14 + export type ResponseStyle = 'data' | 'fields'; 15 + 16 + export interface RetryOptions { 17 + /** 18 + * Maximum number of retry attempts 19 + * 20 + * @default 2 21 + */ 22 + limit?: number; 23 + /** 24 + * HTTP methods to retry 25 + * 26 + * @default ['get', 'put', 'head', 'delete', 'options', 'trace'] 27 + */ 28 + methods?: Array< 29 + 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head' | 'options' | 'trace' 30 + >; 31 + /** 32 + * HTTP status codes to retry 33 + * 34 + * @default [408, 413, 429, 500, 502, 503, 504] 35 + */ 36 + statusCodes?: number[]; 37 + } 38 + 39 + export interface Config<T extends ClientOptions = ClientOptions> 40 + extends Omit< 41 + import('ky').Options, 42 + 'body' | 'headers' | 'method' | 'prefixUrl' | 'retry' | 'throwHttpErrors' 43 + >, 44 + CoreConfig { 45 + /** 46 + * Base URL for all requests made by this client. 47 + */ 48 + baseUrl?: T['baseUrl']; 49 + /** 50 + * Ky instance to use. You can use this option to provide a custom 51 + * ky instance. 52 + */ 53 + ky?: typeof import('ky').default; 54 + /** 55 + * Additional ky-specific options that will be passed directly to ky. 56 + * This allows you to use any ky option not explicitly exposed in the config. 57 + */ 58 + kyOptions?: Omit<import('ky').Options, 'method' | 'prefixUrl'>; 59 + /** 60 + * Return the response data parsed in a specified format. By default, `auto` 61 + * will infer the appropriate method from the `Content-Type` response header. 62 + * You can override this behavior with any of the {@link Body} methods. 63 + * Select `stream` if you don't want to parse response data at all. 64 + * 65 + * @default 'auto' 66 + */ 67 + parseAs?: 68 + | 'arrayBuffer' 69 + | 'auto' 70 + | 'blob' 71 + | 'formData' 72 + | 'json' 73 + | 'stream' 74 + | 'text'; 75 + /** 76 + * Should we return only data or multiple fields (data, error, response, etc.)? 77 + * 78 + * @default 'fields' 79 + */ 80 + responseStyle?: ResponseStyle; 81 + /** 82 + * Retry configuration 83 + */ 84 + retry?: RetryOptions; 85 + /** 86 + * Throw an error instead of returning it in the response? 87 + * 88 + * @default false 89 + */ 90 + throwOnError?: T['throwOnError']; 91 + /** 92 + * Request timeout in milliseconds 93 + * 94 + * @default 10000 95 + */ 96 + timeout?: number; 97 + } 98 + 99 + export interface RequestOptions< 100 + TData = unknown, 101 + TResponseStyle extends ResponseStyle = 'fields', 102 + ThrowOnError extends boolean = boolean, 103 + Url extends string = string, 104 + > extends Config<{ 105 + responseStyle: TResponseStyle; 106 + throwOnError: ThrowOnError; 107 + }>, 108 + Pick< 109 + ServerSentEventsOptions<TData>, 110 + | 'onSseError' 111 + | 'onSseEvent' 112 + | 'sseDefaultRetryDelay' 113 + | 'sseMaxRetryAttempts' 114 + | 'sseMaxRetryDelay' 115 + > { 116 + /** 117 + * Any body that you want to add to your request. 118 + * 119 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 120 + */ 121 + body?: unknown; 122 + path?: Record<string, unknown>; 123 + query?: Record<string, unknown>; 124 + /** 125 + * Security mechanism(s) to use for the request. 126 + */ 127 + security?: ReadonlyArray<Auth>; 128 + url: Url; 129 + } 130 + 131 + export interface ResolvedRequestOptions< 132 + TResponseStyle extends ResponseStyle = 'fields', 133 + ThrowOnError extends boolean = boolean, 134 + Url extends string = string, 135 + > extends RequestOptions<unknown, TResponseStyle, ThrowOnError, Url> { 136 + serializedBody?: string; 137 + } 138 + 139 + export type RequestResult< 140 + TData = unknown, 141 + TError = unknown, 142 + ThrowOnError extends boolean = boolean, 143 + TResponseStyle extends ResponseStyle = 'fields', 144 + > = ThrowOnError extends true 145 + ? Promise< 146 + TResponseStyle extends 'data' 147 + ? TData extends Record<string, unknown> 148 + ? TData[keyof TData] 149 + : TData 150 + : { 151 + data: TData extends Record<string, unknown> 152 + ? TData[keyof TData] 153 + : TData; 154 + request: Request; 155 + response: Response; 156 + } 157 + > 158 + : Promise< 159 + TResponseStyle extends 'data' 160 + ? 161 + | (TData extends Record<string, unknown> 162 + ? TData[keyof TData] 163 + : TData) 164 + | undefined 165 + : ( 166 + | { 167 + data: TData extends Record<string, unknown> 168 + ? TData[keyof TData] 169 + : TData; 170 + error: undefined; 171 + } 172 + | { 173 + data: undefined; 174 + error: TError extends Record<string, unknown> 175 + ? TError[keyof TError] 176 + : TError; 177 + } 178 + ) & { 179 + request: Request; 180 + response: Response; 181 + } 182 + >; 183 + 184 + export interface ClientOptions { 185 + baseUrl?: string; 186 + responseStyle?: ResponseStyle; 187 + throwOnError?: boolean; 188 + } 189 + 190 + type MethodFn = < 191 + TData = unknown, 192 + TError = unknown, 193 + ThrowOnError extends boolean = false, 194 + TResponseStyle extends ResponseStyle = 'fields', 195 + >( 196 + options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'>, 197 + ) => RequestResult<TData, TError, ThrowOnError, TResponseStyle>; 198 + 199 + type SseFn = < 200 + TData = unknown, 201 + TError = unknown, 202 + ThrowOnError extends boolean = false, 203 + TResponseStyle extends ResponseStyle = 'fields', 204 + >( 205 + options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'>, 206 + ) => Promise<ServerSentEventsResult<TData, TError>>; 207 + 208 + type RequestFn = < 209 + TData = unknown, 210 + TError = unknown, 211 + ThrowOnError extends boolean = false, 212 + TResponseStyle extends ResponseStyle = 'fields', 213 + >( 214 + options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'> & 215 + Pick< 216 + Required<RequestOptions<TData, TResponseStyle, ThrowOnError>>, 217 + 'method' 218 + >, 219 + ) => RequestResult<TData, TError, ThrowOnError, TResponseStyle>; 220 + 221 + type BuildUrlFn = < 222 + TData extends { 223 + body?: unknown; 224 + path?: Record<string, unknown>; 225 + query?: Record<string, unknown>; 226 + url: string; 227 + }, 228 + >( 229 + options: TData & Options<TData>, 230 + ) => string; 231 + 232 + export type Client = CoreClient< 233 + RequestFn, 234 + Config, 235 + MethodFn, 236 + BuildUrlFn, 237 + SseFn 238 + > & { 239 + interceptors: Middleware<Request, Response, unknown, ResolvedRequestOptions>; 240 + }; 241 + 242 + /** 243 + * The `createClientConfig()` function will be called on client initialization 244 + * and the returned object will become the client's initial configuration. 245 + * 246 + * You may want to initialize your client this way instead of calling 247 + * `setConfig()`. This is useful for example if you're using Next.js 248 + * to ensure your client always has the correct values. 249 + */ 250 + export type CreateClientConfig<T extends ClientOptions = ClientOptions> = ( 251 + override?: Config<ClientOptions & T>, 252 + ) => Config<Required<ClientOptions> & T>; 253 + 254 + export interface TDataShape { 255 + body?: unknown; 256 + headers?: unknown; 257 + path?: unknown; 258 + query?: unknown; 259 + url: string; 260 + } 261 + 262 + type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 263 + 264 + export type Options< 265 + TData extends TDataShape = TDataShape, 266 + ThrowOnError extends boolean = boolean, 267 + TResponse = unknown, 268 + TResponseStyle extends ResponseStyle = 'fields', 269 + > = OmitKeys< 270 + RequestOptions<TResponse, TResponseStyle, ThrowOnError>, 271 + 'body' | 'path' | 'query' | 'url' 272 + > & 273 + ([TData] extends [never] ? unknown : Omit<TData, 'url'>);
+335
examples/openapi-ts-ky/src/client/client/utils.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import { getAuthToken } from '../core/auth.gen'; 4 + import type { QuerySerializerOptions } from '../core/bodySerializer.gen'; 5 + import { jsonBodySerializer } from '../core/bodySerializer.gen'; 6 + import { 7 + serializeArrayParam, 8 + serializeObjectParam, 9 + serializePrimitiveParam, 10 + } from '../core/pathSerializer.gen'; 11 + import { getUrl } from '../core/utils.gen'; 12 + import type { 13 + Client, 14 + ClientOptions, 15 + Config, 16 + RequestOptions, 17 + } from './types.gen'; 18 + 19 + export const createQuerySerializer = <T = unknown>({ 20 + parameters = {}, 21 + ...args 22 + }: QuerySerializerOptions = {}) => { 23 + const querySerializer = (queryParams: T) => { 24 + const search: string[] = []; 25 + if (queryParams && typeof queryParams === 'object') { 26 + for (const name in queryParams) { 27 + const value = queryParams[name]; 28 + 29 + if (value === undefined || value === null) { 30 + continue; 31 + } 32 + 33 + const options = parameters[name] || args; 34 + 35 + if (Array.isArray(value)) { 36 + const serializedArray = serializeArrayParam({ 37 + allowReserved: options.allowReserved, 38 + explode: true, 39 + name, 40 + style: 'form', 41 + value, 42 + ...options.array, 43 + }); 44 + if (serializedArray) search.push(serializedArray); 45 + } else if (typeof value === 'object') { 46 + const serializedObject = serializeObjectParam({ 47 + allowReserved: options.allowReserved, 48 + explode: true, 49 + name, 50 + style: 'deepObject', 51 + value: value as Record<string, unknown>, 52 + ...options.object, 53 + }); 54 + if (serializedObject) search.push(serializedObject); 55 + } else { 56 + const serializedPrimitive = serializePrimitiveParam({ 57 + allowReserved: options.allowReserved, 58 + name, 59 + value: value as string, 60 + }); 61 + if (serializedPrimitive) search.push(serializedPrimitive); 62 + } 63 + } 64 + } 65 + return search.join('&'); 66 + }; 67 + return querySerializer; 68 + }; 69 + 70 + /** 71 + * Infers parseAs value from provided Content-Type header. 72 + */ 73 + export const getParseAs = ( 74 + contentType: string | null, 75 + ): Exclude<Config['parseAs'], 'auto'> => { 76 + if (!contentType) { 77 + return 'stream'; 78 + } 79 + 80 + const cleanContent = contentType.split(';')[0]?.trim(); 81 + 82 + if (!cleanContent) { 83 + return; 84 + } 85 + 86 + if ( 87 + cleanContent.startsWith('application/json') || 88 + cleanContent.endsWith('+json') 89 + ) { 90 + return 'json'; 91 + } 92 + 93 + if (cleanContent === 'multipart/form-data') { 94 + return 'formData'; 95 + } 96 + 97 + if ( 98 + ['application/', 'audio/', 'image/', 'video/'].some((type) => 99 + cleanContent.startsWith(type), 100 + ) 101 + ) { 102 + return 'blob'; 103 + } 104 + 105 + if (cleanContent.startsWith('text/')) { 106 + return 'text'; 107 + } 108 + 109 + return; 110 + }; 111 + 112 + const checkForExistence = ( 113 + options: Pick<RequestOptions, 'auth' | 'query'> & { 114 + headers: Headers; 115 + }, 116 + name?: string, 117 + ): boolean => { 118 + if (!name) { 119 + return false; 120 + } 121 + if ( 122 + options.headers.has(name) || 123 + options.query?.[name] || 124 + options.headers.get('Cookie')?.includes(`${name}=`) 125 + ) { 126 + return true; 127 + } 128 + return false; 129 + }; 130 + 131 + export const setAuthParams = async ({ 132 + security, 133 + ...options 134 + }: Pick<Required<RequestOptions>, 'security'> & 135 + Pick<RequestOptions, 'auth' | 'query'> & { 136 + headers: Headers; 137 + }) => { 138 + for (const auth of security) { 139 + if (checkForExistence(options, auth.name)) { 140 + continue; 141 + } 142 + 143 + const token = await getAuthToken(auth, options.auth); 144 + 145 + if (!token) { 146 + continue; 147 + } 148 + 149 + const name = auth.name ?? 'Authorization'; 150 + 151 + switch (auth.in) { 152 + case 'query': 153 + if (!options.query) { 154 + options.query = {}; 155 + } 156 + options.query[name] = token; 157 + break; 158 + case 'cookie': 159 + options.headers.append('Cookie', `${name}=${token}`); 160 + break; 161 + case 'header': 162 + default: 163 + options.headers.set(name, token); 164 + break; 165 + } 166 + } 167 + }; 168 + 169 + export const buildUrl: Client['buildUrl'] = (options) => 170 + getUrl({ 171 + baseUrl: options.baseUrl as string, 172 + path: options.path, 173 + query: options.query, 174 + querySerializer: 175 + typeof options.querySerializer === 'function' 176 + ? options.querySerializer 177 + : createQuerySerializer(options.querySerializer), 178 + url: options.url, 179 + }); 180 + 181 + export const mergeConfigs = (a: Config, b: Config): Config => { 182 + const config = { ...a, ...b }; 183 + if (config.baseUrl?.endsWith('/')) { 184 + config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1); 185 + } 186 + config.headers = mergeHeaders(a.headers, b.headers); 187 + return config; 188 + }; 189 + 190 + const headersEntries = (headers: Headers): Array<[string, string]> => { 191 + const entries: Array<[string, string]> = []; 192 + headers.forEach((value, key) => { 193 + entries.push([key, value]); 194 + }); 195 + return entries; 196 + }; 197 + 198 + export const mergeHeaders = ( 199 + ...headers: Array<Required<Config>['headers'] | undefined> 200 + ): Headers => { 201 + const mergedHeaders = new Headers(); 202 + for (const header of headers) { 203 + if (!header) { 204 + continue; 205 + } 206 + 207 + const iterator = 208 + header instanceof Headers 209 + ? headersEntries(header) 210 + : Object.entries(header); 211 + 212 + for (const [key, value] of iterator) { 213 + if (value === null) { 214 + mergedHeaders.delete(key); 215 + } else if (Array.isArray(value)) { 216 + for (const v of value) { 217 + mergedHeaders.append(key, v as string); 218 + } 219 + } else if (value !== undefined) { 220 + mergedHeaders.set( 221 + key, 222 + typeof value === 'object' ? JSON.stringify(value) : (value as string), 223 + ); 224 + } 225 + } 226 + } 227 + return mergedHeaders; 228 + }; 229 + 230 + type ErrInterceptor<Err, Res, Req, Options> = ( 231 + error: Err, 232 + response: Res, 233 + request: Req, 234 + options: Options, 235 + ) => Err | Promise<Err>; 236 + 237 + type ReqInterceptor<Req, Options> = ( 238 + request: Req, 239 + options: Options, 240 + ) => Req | Promise<Req>; 241 + 242 + type ResInterceptor<Res, Req, Options> = ( 243 + response: Res, 244 + request: Req, 245 + options: Options, 246 + ) => Res | Promise<Res>; 247 + 248 + class Interceptors<Interceptor> { 249 + fns: Array<Interceptor | null> = []; 250 + 251 + clear(): void { 252 + this.fns = []; 253 + } 254 + 255 + eject(id: number | Interceptor): void { 256 + const index = this.getInterceptorIndex(id); 257 + if (this.fns[index]) { 258 + this.fns[index] = null; 259 + } 260 + } 261 + 262 + exists(id: number | Interceptor): boolean { 263 + const index = this.getInterceptorIndex(id); 264 + return Boolean(this.fns[index]); 265 + } 266 + 267 + getInterceptorIndex(id: number | Interceptor): number { 268 + if (typeof id === 'number') { 269 + return this.fns[id] ? id : -1; 270 + } 271 + return this.fns.indexOf(id); 272 + } 273 + 274 + update( 275 + id: number | Interceptor, 276 + fn: Interceptor, 277 + ): number | Interceptor | false { 278 + const index = this.getInterceptorIndex(id); 279 + if (this.fns[index]) { 280 + this.fns[index] = fn; 281 + return id; 282 + } 283 + return false; 284 + } 285 + 286 + use(fn: Interceptor): number { 287 + this.fns.push(fn); 288 + return this.fns.length - 1; 289 + } 290 + } 291 + 292 + export interface Middleware<Req, Res, Err, Options> { 293 + error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>; 294 + request: Interceptors<ReqInterceptor<Req, Options>>; 295 + response: Interceptors<ResInterceptor<Res, Req, Options>>; 296 + } 297 + 298 + export const createInterceptors = <Req, Res, Err, Options>(): Middleware< 299 + Req, 300 + Res, 301 + Err, 302 + Options 303 + > => ({ 304 + error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(), 305 + request: new Interceptors<ReqInterceptor<Req, Options>>(), 306 + response: new Interceptors<ResInterceptor<Res, Req, Options>>(), 307 + }); 308 + 309 + const defaultQuerySerializer = createQuerySerializer({ 310 + allowReserved: false, 311 + array: { 312 + explode: true, 313 + style: 'form', 314 + }, 315 + object: { 316 + explode: true, 317 + style: 'deepObject', 318 + }, 319 + }); 320 + 321 + const defaultHeaders = { 322 + 'Content-Type': 'application/json', 323 + }; 324 + 325 + export const createConfig = <T extends ClientOptions = ClientOptions>( 326 + override: Config<Omit<ClientOptions, keyof T> & T> = {}, 327 + ): Config<Omit<ClientOptions, keyof T> & T> => ({ 328 + ...jsonBodySerializer, 329 + headers: defaultHeaders, 330 + parseAs: 'auto', 331 + querySerializer: defaultQuerySerializer, 332 + throwOnError: false, 333 + timeout: 10000, 334 + ...override, 335 + });
+42
examples/openapi-ts-ky/src/client/core/auth.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + export type AuthToken = string | undefined; 4 + 5 + export interface Auth { 6 + /** 7 + * Which part of the request do we use to send the auth? 8 + * 9 + * @default 'header' 10 + */ 11 + in?: 'header' | 'query' | 'cookie'; 12 + /** 13 + * Header or query parameter name. 14 + * 15 + * @default 'Authorization' 16 + */ 17 + name?: string; 18 + scheme?: 'basic' | 'bearer'; 19 + type: 'apiKey' | 'http'; 20 + } 21 + 22 + export const getAuthToken = async ( 23 + auth: Auth, 24 + callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken, 25 + ): Promise<string | undefined> => { 26 + const token = 27 + typeof callback === 'function' ? await callback(auth) : callback; 28 + 29 + if (!token) { 30 + return; 31 + } 32 + 33 + if (auth.scheme === 'bearer') { 34 + return `Bearer ${token}`; 35 + } 36 + 37 + if (auth.scheme === 'basic') { 38 + return `Basic ${btoa(token)}`; 39 + } 40 + 41 + return token; 42 + };
+100
examples/openapi-ts-ky/src/client/core/bodySerializer.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import type { 4 + ArrayStyle, 5 + ObjectStyle, 6 + SerializerOptions, 7 + } from './pathSerializer.gen'; 8 + 9 + export type QuerySerializer = (query: Record<string, unknown>) => string; 10 + 11 + export type BodySerializer = (body: any) => any; 12 + 13 + type QuerySerializerOptionsObject = { 14 + allowReserved?: boolean; 15 + array?: Partial<SerializerOptions<ArrayStyle>>; 16 + object?: Partial<SerializerOptions<ObjectStyle>>; 17 + }; 18 + 19 + export type QuerySerializerOptions = QuerySerializerOptionsObject & { 20 + /** 21 + * Per-parameter serialization overrides. When provided, these settings 22 + * override the global array/object settings for specific parameter names. 23 + */ 24 + parameters?: Record<string, QuerySerializerOptionsObject>; 25 + }; 26 + 27 + const serializeFormDataPair = ( 28 + data: FormData, 29 + key: string, 30 + value: unknown, 31 + ): void => { 32 + if (typeof value === 'string' || value instanceof Blob) { 33 + data.append(key, value); 34 + } else if (value instanceof Date) { 35 + data.append(key, value.toISOString()); 36 + } else { 37 + data.append(key, JSON.stringify(value)); 38 + } 39 + }; 40 + 41 + const serializeUrlSearchParamsPair = ( 42 + data: URLSearchParams, 43 + key: string, 44 + value: unknown, 45 + ): void => { 46 + if (typeof value === 'string') { 47 + data.append(key, value); 48 + } else { 49 + data.append(key, JSON.stringify(value)); 50 + } 51 + }; 52 + 53 + export const formDataBodySerializer = { 54 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 55 + body: T, 56 + ): FormData => { 57 + const data = new FormData(); 58 + 59 + Object.entries(body).forEach(([key, value]) => { 60 + if (value === undefined || value === null) { 61 + return; 62 + } 63 + if (Array.isArray(value)) { 64 + value.forEach((v) => serializeFormDataPair(data, key, v)); 65 + } else { 66 + serializeFormDataPair(data, key, value); 67 + } 68 + }); 69 + 70 + return data; 71 + }, 72 + }; 73 + 74 + export const jsonBodySerializer = { 75 + bodySerializer: <T>(body: T): string => 76 + JSON.stringify(body, (_key, value) => 77 + typeof value === 'bigint' ? value.toString() : value, 78 + ), 79 + }; 80 + 81 + export const urlSearchParamsBodySerializer = { 82 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 83 + body: T, 84 + ): string => { 85 + const data = new URLSearchParams(); 86 + 87 + Object.entries(body).forEach(([key, value]) => { 88 + if (value === undefined || value === null) { 89 + return; 90 + } 91 + if (Array.isArray(value)) { 92 + value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); 93 + } else { 94 + serializeUrlSearchParamsPair(data, key, value); 95 + } 96 + }); 97 + 98 + return data.toString(); 99 + }, 100 + };
+176
examples/openapi-ts-ky/src/client/core/params.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + type Slot = 'body' | 'headers' | 'path' | 'query'; 4 + 5 + export type Field = 6 + | { 7 + in: Exclude<Slot, 'body'>; 8 + /** 9 + * Field name. This is the name we want the user to see and use. 10 + */ 11 + key: string; 12 + /** 13 + * Field mapped name. This is the name we want to use in the request. 14 + * If omitted, we use the same value as `key`. 15 + */ 16 + map?: string; 17 + } 18 + | { 19 + in: Extract<Slot, 'body'>; 20 + /** 21 + * Key isn't required for bodies. 22 + */ 23 + key?: string; 24 + map?: string; 25 + } 26 + | { 27 + /** 28 + * Field name. This is the name we want the user to see and use. 29 + */ 30 + key: string; 31 + /** 32 + * Field mapped name. This is the name we want to use in the request. 33 + * If `in` is omitted, `map` aliases `key` to the transport layer. 34 + */ 35 + map: Slot; 36 + }; 37 + 38 + export interface Fields { 39 + allowExtra?: Partial<Record<Slot, boolean>>; 40 + args?: ReadonlyArray<Field>; 41 + } 42 + 43 + export type FieldsConfig = ReadonlyArray<Field | Fields>; 44 + 45 + const extraPrefixesMap: Record<string, Slot> = { 46 + $body_: 'body', 47 + $headers_: 'headers', 48 + $path_: 'path', 49 + $query_: 'query', 50 + }; 51 + const extraPrefixes = Object.entries(extraPrefixesMap); 52 + 53 + type KeyMap = Map< 54 + string, 55 + | { 56 + in: Slot; 57 + map?: string; 58 + } 59 + | { 60 + in?: never; 61 + map: Slot; 62 + } 63 + >; 64 + 65 + const buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => { 66 + if (!map) { 67 + map = new Map(); 68 + } 69 + 70 + for (const config of fields) { 71 + if ('in' in config) { 72 + if (config.key) { 73 + map.set(config.key, { 74 + in: config.in, 75 + map: config.map, 76 + }); 77 + } 78 + } else if ('key' in config) { 79 + map.set(config.key, { 80 + map: config.map, 81 + }); 82 + } else if (config.args) { 83 + buildKeyMap(config.args, map); 84 + } 85 + } 86 + 87 + return map; 88 + }; 89 + 90 + interface Params { 91 + body: unknown; 92 + headers: Record<string, unknown>; 93 + path: Record<string, unknown>; 94 + query: Record<string, unknown>; 95 + } 96 + 97 + const stripEmptySlots = (params: Params) => { 98 + for (const [slot, value] of Object.entries(params)) { 99 + if (value && typeof value === 'object' && !Object.keys(value).length) { 100 + delete params[slot as Slot]; 101 + } 102 + } 103 + }; 104 + 105 + export const buildClientParams = ( 106 + args: ReadonlyArray<unknown>, 107 + fields: FieldsConfig, 108 + ) => { 109 + const params: Params = { 110 + body: {}, 111 + headers: {}, 112 + path: {}, 113 + query: {}, 114 + }; 115 + 116 + const map = buildKeyMap(fields); 117 + 118 + let config: FieldsConfig[number] | undefined; 119 + 120 + for (const [index, arg] of args.entries()) { 121 + if (fields[index]) { 122 + config = fields[index]; 123 + } 124 + 125 + if (!config) { 126 + continue; 127 + } 128 + 129 + if ('in' in config) { 130 + if (config.key) { 131 + const field = map.get(config.key)!; 132 + const name = field.map || config.key; 133 + if (field.in) { 134 + (params[field.in] as Record<string, unknown>)[name] = arg; 135 + } 136 + } else { 137 + params.body = arg; 138 + } 139 + } else { 140 + for (const [key, value] of Object.entries(arg ?? {})) { 141 + const field = map.get(key); 142 + 143 + if (field) { 144 + if (field.in) { 145 + const name = field.map || key; 146 + (params[field.in] as Record<string, unknown>)[name] = value; 147 + } else { 148 + params[field.map] = value; 149 + } 150 + } else { 151 + const extra = extraPrefixes.find(([prefix]) => 152 + key.startsWith(prefix), 153 + ); 154 + 155 + if (extra) { 156 + const [prefix, slot] = extra; 157 + (params[slot] as Record<string, unknown>)[ 158 + key.slice(prefix.length) 159 + ] = value; 160 + } else if ('allowExtra' in config && config.allowExtra) { 161 + for (const [slot, allowed] of Object.entries(config.allowExtra)) { 162 + if (allowed) { 163 + (params[slot as Slot] as Record<string, unknown>)[key] = value; 164 + break; 165 + } 166 + } 167 + } 168 + } 169 + } 170 + } 171 + } 172 + 173 + stripEmptySlots(params); 174 + 175 + return params; 176 + };
+181
examples/openapi-ts-ky/src/client/core/pathSerializer.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + interface SerializeOptions<T> 4 + extends SerializePrimitiveOptions, 5 + SerializerOptions<T> {} 6 + 7 + interface SerializePrimitiveOptions { 8 + allowReserved?: boolean; 9 + name: string; 10 + } 11 + 12 + export interface SerializerOptions<T> { 13 + /** 14 + * @default true 15 + */ 16 + explode: boolean; 17 + style: T; 18 + } 19 + 20 + export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 21 + export type ArraySeparatorStyle = ArrayStyle | MatrixStyle; 22 + type MatrixStyle = 'label' | 'matrix' | 'simple'; 23 + export type ObjectStyle = 'form' | 'deepObject'; 24 + type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; 25 + 26 + interface SerializePrimitiveParam extends SerializePrimitiveOptions { 27 + value: string; 28 + } 29 + 30 + export const separatorArrayExplode = (style: ArraySeparatorStyle) => { 31 + switch (style) { 32 + case 'label': 33 + return '.'; 34 + case 'matrix': 35 + return ';'; 36 + case 'simple': 37 + return ','; 38 + default: 39 + return '&'; 40 + } 41 + }; 42 + 43 + export const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { 44 + switch (style) { 45 + case 'form': 46 + return ','; 47 + case 'pipeDelimited': 48 + return '|'; 49 + case 'spaceDelimited': 50 + return '%20'; 51 + default: 52 + return ','; 53 + } 54 + }; 55 + 56 + export const separatorObjectExplode = (style: ObjectSeparatorStyle) => { 57 + switch (style) { 58 + case 'label': 59 + return '.'; 60 + case 'matrix': 61 + return ';'; 62 + case 'simple': 63 + return ','; 64 + default: 65 + return '&'; 66 + } 67 + }; 68 + 69 + export const serializeArrayParam = ({ 70 + allowReserved, 71 + explode, 72 + name, 73 + style, 74 + value, 75 + }: SerializeOptions<ArraySeparatorStyle> & { 76 + value: unknown[]; 77 + }) => { 78 + if (!explode) { 79 + const joinedValues = ( 80 + allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) 81 + ).join(separatorArrayNoExplode(style)); 82 + switch (style) { 83 + case 'label': 84 + return `.${joinedValues}`; 85 + case 'matrix': 86 + return `;${name}=${joinedValues}`; 87 + case 'simple': 88 + return joinedValues; 89 + default: 90 + return `${name}=${joinedValues}`; 91 + } 92 + } 93 + 94 + const separator = separatorArrayExplode(style); 95 + const joinedValues = value 96 + .map((v) => { 97 + if (style === 'label' || style === 'simple') { 98 + return allowReserved ? v : encodeURIComponent(v as string); 99 + } 100 + 101 + return serializePrimitiveParam({ 102 + allowReserved, 103 + name, 104 + value: v as string, 105 + }); 106 + }) 107 + .join(separator); 108 + return style === 'label' || style === 'matrix' 109 + ? separator + joinedValues 110 + : joinedValues; 111 + }; 112 + 113 + export const serializePrimitiveParam = ({ 114 + allowReserved, 115 + name, 116 + value, 117 + }: SerializePrimitiveParam) => { 118 + if (value === undefined || value === null) { 119 + return ''; 120 + } 121 + 122 + if (typeof value === 'object') { 123 + throw new Error( 124 + 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', 125 + ); 126 + } 127 + 128 + return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; 129 + }; 130 + 131 + export const serializeObjectParam = ({ 132 + allowReserved, 133 + explode, 134 + name, 135 + style, 136 + value, 137 + valueOnly, 138 + }: SerializeOptions<ObjectSeparatorStyle> & { 139 + value: Record<string, unknown> | Date; 140 + valueOnly?: boolean; 141 + }) => { 142 + if (value instanceof Date) { 143 + return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`; 144 + } 145 + 146 + if (style !== 'deepObject' && !explode) { 147 + let values: string[] = []; 148 + Object.entries(value).forEach(([key, v]) => { 149 + values = [ 150 + ...values, 151 + key, 152 + allowReserved ? (v as string) : encodeURIComponent(v as string), 153 + ]; 154 + }); 155 + const joinedValues = values.join(','); 156 + switch (style) { 157 + case 'form': 158 + return `${name}=${joinedValues}`; 159 + case 'label': 160 + return `.${joinedValues}`; 161 + case 'matrix': 162 + return `;${name}=${joinedValues}`; 163 + default: 164 + return joinedValues; 165 + } 166 + } 167 + 168 + const separator = separatorObjectExplode(style); 169 + const joinedValues = Object.entries(value) 170 + .map(([key, v]) => 171 + serializePrimitiveParam({ 172 + allowReserved, 173 + name: style === 'deepObject' ? `${name}[${key}]` : key, 174 + value: v as string, 175 + }), 176 + ) 177 + .join(separator); 178 + return style === 'label' || style === 'matrix' 179 + ? separator + joinedValues 180 + : joinedValues; 181 + };
+136
examples/openapi-ts-ky/src/client/core/queryKeySerializer.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + /** 4 + * JSON-friendly union that mirrors what Pinia Colada can hash. 5 + */ 6 + export type JsonValue = 7 + | null 8 + | string 9 + | number 10 + | boolean 11 + | JsonValue[] 12 + | { [key: string]: JsonValue }; 13 + 14 + /** 15 + * Replacer that converts non-JSON values (bigint, Date, etc.) to safe substitutes. 16 + */ 17 + export const queryKeyJsonReplacer = (_key: string, value: unknown) => { 18 + if ( 19 + value === undefined || 20 + typeof value === 'function' || 21 + typeof value === 'symbol' 22 + ) { 23 + return undefined; 24 + } 25 + if (typeof value === 'bigint') { 26 + return value.toString(); 27 + } 28 + if (value instanceof Date) { 29 + return value.toISOString(); 30 + } 31 + return value; 32 + }; 33 + 34 + /** 35 + * Safely stringifies a value and parses it back into a JsonValue. 36 + */ 37 + export const stringifyToJsonValue = (input: unknown): JsonValue | undefined => { 38 + try { 39 + const json = JSON.stringify(input, queryKeyJsonReplacer); 40 + if (json === undefined) { 41 + return undefined; 42 + } 43 + return JSON.parse(json) as JsonValue; 44 + } catch { 45 + return undefined; 46 + } 47 + }; 48 + 49 + /** 50 + * Detects plain objects (including objects with a null prototype). 51 + */ 52 + const isPlainObject = (value: unknown): value is Record<string, unknown> => { 53 + if (value === null || typeof value !== 'object') { 54 + return false; 55 + } 56 + const prototype = Object.getPrototypeOf(value as object); 57 + return prototype === Object.prototype || prototype === null; 58 + }; 59 + 60 + /** 61 + * Turns URLSearchParams into a sorted JSON object for deterministic keys. 62 + */ 63 + const serializeSearchParams = (params: URLSearchParams): JsonValue => { 64 + const entries = Array.from(params.entries()).sort(([a], [b]) => 65 + a.localeCompare(b), 66 + ); 67 + const result: Record<string, JsonValue> = {}; 68 + 69 + for (const [key, value] of entries) { 70 + const existing = result[key]; 71 + if (existing === undefined) { 72 + result[key] = value; 73 + continue; 74 + } 75 + 76 + if (Array.isArray(existing)) { 77 + (existing as string[]).push(value); 78 + } else { 79 + result[key] = [existing, value]; 80 + } 81 + } 82 + 83 + return result; 84 + }; 85 + 86 + /** 87 + * Normalizes any accepted value into a JSON-friendly shape for query keys. 88 + */ 89 + export const serializeQueryKeyValue = ( 90 + value: unknown, 91 + ): JsonValue | undefined => { 92 + if (value === null) { 93 + return null; 94 + } 95 + 96 + if ( 97 + typeof value === 'string' || 98 + typeof value === 'number' || 99 + typeof value === 'boolean' 100 + ) { 101 + return value; 102 + } 103 + 104 + if ( 105 + value === undefined || 106 + typeof value === 'function' || 107 + typeof value === 'symbol' 108 + ) { 109 + return undefined; 110 + } 111 + 112 + if (typeof value === 'bigint') { 113 + return value.toString(); 114 + } 115 + 116 + if (value instanceof Date) { 117 + return value.toISOString(); 118 + } 119 + 120 + if (Array.isArray(value)) { 121 + return stringifyToJsonValue(value); 122 + } 123 + 124 + if ( 125 + typeof URLSearchParams !== 'undefined' && 126 + value instanceof URLSearchParams 127 + ) { 128 + return serializeSearchParams(value); 129 + } 130 + 131 + if (isPlainObject(value)) { 132 + return stringifyToJsonValue(value); 133 + } 134 + 135 + return undefined; 136 + };
+264
examples/openapi-ts-ky/src/client/core/serverSentEvents.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import type { Config } from './types.gen'; 4 + 5 + export type ServerSentEventsOptions<TData = unknown> = Omit< 6 + RequestInit, 7 + 'method' 8 + > & 9 + Pick<Config, 'method' | 'responseTransformer' | 'responseValidator'> & { 10 + /** 11 + * Fetch API implementation. You can use this option to provide a custom 12 + * fetch instance. 13 + * 14 + * @default globalThis.fetch 15 + */ 16 + fetch?: typeof fetch; 17 + /** 18 + * Implementing clients can call request interceptors inside this hook. 19 + */ 20 + onRequest?: (url: string, init: RequestInit) => Promise<Request>; 21 + /** 22 + * Callback invoked when a network or parsing error occurs during streaming. 23 + * 24 + * This option applies only if the endpoint returns a stream of events. 25 + * 26 + * @param error The error that occurred. 27 + */ 28 + onSseError?: (error: unknown) => void; 29 + /** 30 + * Callback invoked when an event is streamed from the server. 31 + * 32 + * This option applies only if the endpoint returns a stream of events. 33 + * 34 + * @param event Event streamed from the server. 35 + * @returns Nothing (void). 36 + */ 37 + onSseEvent?: (event: StreamEvent<TData>) => void; 38 + serializedBody?: RequestInit['body']; 39 + /** 40 + * Default retry delay in milliseconds. 41 + * 42 + * This option applies only if the endpoint returns a stream of events. 43 + * 44 + * @default 3000 45 + */ 46 + sseDefaultRetryDelay?: number; 47 + /** 48 + * Maximum number of retry attempts before giving up. 49 + */ 50 + sseMaxRetryAttempts?: number; 51 + /** 52 + * Maximum retry delay in milliseconds. 53 + * 54 + * Applies only when exponential backoff is used. 55 + * 56 + * This option applies only if the endpoint returns a stream of events. 57 + * 58 + * @default 30000 59 + */ 60 + sseMaxRetryDelay?: number; 61 + /** 62 + * Optional sleep function for retry backoff. 63 + * 64 + * Defaults to using `setTimeout`. 65 + */ 66 + sseSleepFn?: (ms: number) => Promise<void>; 67 + url: string; 68 + }; 69 + 70 + export interface StreamEvent<TData = unknown> { 71 + data: TData; 72 + event?: string; 73 + id?: string; 74 + retry?: number; 75 + } 76 + 77 + export type ServerSentEventsResult< 78 + TData = unknown, 79 + TReturn = void, 80 + TNext = unknown, 81 + > = { 82 + stream: AsyncGenerator< 83 + TData extends Record<string, unknown> ? TData[keyof TData] : TData, 84 + TReturn, 85 + TNext 86 + >; 87 + }; 88 + 89 + export const createSseClient = <TData = unknown>({ 90 + onRequest, 91 + onSseError, 92 + onSseEvent, 93 + responseTransformer, 94 + responseValidator, 95 + sseDefaultRetryDelay, 96 + sseMaxRetryAttempts, 97 + sseMaxRetryDelay, 98 + sseSleepFn, 99 + url, 100 + ...options 101 + }: ServerSentEventsOptions): ServerSentEventsResult<TData> => { 102 + let lastEventId: string | undefined; 103 + 104 + const sleep = 105 + sseSleepFn ?? 106 + ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms))); 107 + 108 + const createStream = async function* () { 109 + let retryDelay: number = sseDefaultRetryDelay ?? 3000; 110 + let attempt = 0; 111 + const signal = options.signal ?? new AbortController().signal; 112 + 113 + while (true) { 114 + if (signal.aborted) break; 115 + 116 + attempt++; 117 + 118 + const headers = 119 + options.headers instanceof Headers 120 + ? options.headers 121 + : new Headers(options.headers as Record<string, string> | undefined); 122 + 123 + if (lastEventId !== undefined) { 124 + headers.set('Last-Event-ID', lastEventId); 125 + } 126 + 127 + try { 128 + const requestInit: RequestInit = { 129 + redirect: 'follow', 130 + ...options, 131 + body: options.serializedBody, 132 + headers, 133 + signal, 134 + }; 135 + let request = new Request(url, requestInit); 136 + if (onRequest) { 137 + request = await onRequest(url, requestInit); 138 + } 139 + // fetch must be assigned here, otherwise it would throw the error: 140 + // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation 141 + const _fetch = options.fetch ?? globalThis.fetch; 142 + const response = await _fetch(request); 143 + 144 + if (!response.ok) 145 + throw new Error( 146 + `SSE failed: ${response.status} ${response.statusText}`, 147 + ); 148 + 149 + if (!response.body) throw new Error('No body in SSE response'); 150 + 151 + const reader = response.body 152 + .pipeThrough(new TextDecoderStream()) 153 + .getReader(); 154 + 155 + let buffer = ''; 156 + 157 + const abortHandler = () => { 158 + try { 159 + reader.cancel(); 160 + } catch { 161 + // noop 162 + } 163 + }; 164 + 165 + signal.addEventListener('abort', abortHandler); 166 + 167 + try { 168 + while (true) { 169 + const { done, value } = await reader.read(); 170 + if (done) break; 171 + buffer += value; 172 + 173 + const chunks = buffer.split('\n\n'); 174 + buffer = chunks.pop() ?? ''; 175 + 176 + for (const chunk of chunks) { 177 + const lines = chunk.split('\n'); 178 + const dataLines: Array<string> = []; 179 + let eventName: string | undefined; 180 + 181 + for (const line of lines) { 182 + if (line.startsWith('data:')) { 183 + dataLines.push(line.replace(/^data:\s*/, '')); 184 + } else if (line.startsWith('event:')) { 185 + eventName = line.replace(/^event:\s*/, ''); 186 + } else if (line.startsWith('id:')) { 187 + lastEventId = line.replace(/^id:\s*/, ''); 188 + } else if (line.startsWith('retry:')) { 189 + const parsed = Number.parseInt( 190 + line.replace(/^retry:\s*/, ''), 191 + 10, 192 + ); 193 + if (!Number.isNaN(parsed)) { 194 + retryDelay = parsed; 195 + } 196 + } 197 + } 198 + 199 + let data: unknown; 200 + let parsedJson = false; 201 + 202 + if (dataLines.length) { 203 + const rawData = dataLines.join('\n'); 204 + try { 205 + data = JSON.parse(rawData); 206 + parsedJson = true; 207 + } catch { 208 + data = rawData; 209 + } 210 + } 211 + 212 + if (parsedJson) { 213 + if (responseValidator) { 214 + await responseValidator(data); 215 + } 216 + 217 + if (responseTransformer) { 218 + data = await responseTransformer(data); 219 + } 220 + } 221 + 222 + onSseEvent?.({ 223 + data, 224 + event: eventName, 225 + id: lastEventId, 226 + retry: retryDelay, 227 + }); 228 + 229 + if (dataLines.length) { 230 + yield data as any; 231 + } 232 + } 233 + } 234 + } finally { 235 + signal.removeEventListener('abort', abortHandler); 236 + reader.releaseLock(); 237 + } 238 + 239 + break; // exit loop on normal completion 240 + } catch (error) { 241 + // connection failed or aborted; retry after delay 242 + onSseError?.(error); 243 + 244 + if ( 245 + sseMaxRetryAttempts !== undefined && 246 + attempt >= sseMaxRetryAttempts 247 + ) { 248 + break; // stop after firing error 249 + } 250 + 251 + // exponential backoff: double retry each attempt, cap at 30s 252 + const backoff = Math.min( 253 + retryDelay * 2 ** (attempt - 1), 254 + sseMaxRetryDelay ?? 30000, 255 + ); 256 + await sleep(backoff); 257 + } 258 + } 259 + }; 260 + 261 + const stream = createStream(); 262 + 263 + return { stream }; 264 + };
+118
examples/openapi-ts-ky/src/client/core/types.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import type { Auth, AuthToken } from './auth.gen'; 4 + import type { 5 + BodySerializer, 6 + QuerySerializer, 7 + QuerySerializerOptions, 8 + } from './bodySerializer.gen'; 9 + 10 + export type HttpMethod = 11 + | 'connect' 12 + | 'delete' 13 + | 'get' 14 + | 'head' 15 + | 'options' 16 + | 'patch' 17 + | 'post' 18 + | 'put' 19 + | 'trace'; 20 + 21 + export type Client< 22 + RequestFn = never, 23 + Config = unknown, 24 + MethodFn = never, 25 + BuildUrlFn = never, 26 + SseFn = never, 27 + > = { 28 + /** 29 + * Returns the final request URL. 30 + */ 31 + buildUrl: BuildUrlFn; 32 + getConfig: () => Config; 33 + request: RequestFn; 34 + setConfig: (config: Config) => Config; 35 + } & { 36 + [K in HttpMethod]: MethodFn; 37 + } & ([SseFn] extends [never] 38 + ? { sse?: never } 39 + : { sse: { [K in HttpMethod]: SseFn } }); 40 + 41 + export interface Config { 42 + /** 43 + * Auth token or a function returning auth token. The resolved value will be 44 + * added to the request payload as defined by its `security` array. 45 + */ 46 + auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 47 + /** 48 + * A function for serializing request body parameter. By default, 49 + * {@link JSON.stringify()} will be used. 50 + */ 51 + bodySerializer?: BodySerializer | null; 52 + /** 53 + * An object containing any HTTP headers that you want to pre-populate your 54 + * `Headers` object with. 55 + * 56 + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 57 + */ 58 + headers?: 59 + | RequestInit['headers'] 60 + | Record< 61 + string, 62 + | string 63 + | number 64 + | boolean 65 + | (string | number | boolean)[] 66 + | null 67 + | undefined 68 + | unknown 69 + >; 70 + /** 71 + * The request method. 72 + * 73 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 74 + */ 75 + method?: Uppercase<HttpMethod>; 76 + /** 77 + * A function for serializing request query parameters. By default, arrays 78 + * will be exploded in form style, objects will be exploded in deepObject 79 + * style, and reserved characters are percent-encoded. 80 + * 81 + * This method will have no effect if the native `paramsSerializer()` Axios 82 + * API function is used. 83 + * 84 + * {@link https://swagger.io/docs/specification/serialization/#query View examples} 85 + */ 86 + querySerializer?: QuerySerializer | QuerySerializerOptions; 87 + /** 88 + * A function validating request data. This is useful if you want to ensure 89 + * the request conforms to the desired shape, so it can be safely sent to 90 + * the server. 91 + */ 92 + requestValidator?: (data: unknown) => Promise<unknown>; 93 + /** 94 + * A function transforming response data before it's returned. This is useful 95 + * for post-processing data, e.g. converting ISO strings into Date objects. 96 + */ 97 + responseTransformer?: (data: unknown) => Promise<unknown>; 98 + /** 99 + * A function validating response data. This is useful if you want to ensure 100 + * the response conforms to the desired shape, so it can be safely passed to 101 + * the transformers and returned to the user. 102 + */ 103 + responseValidator?: (data: unknown) => Promise<unknown>; 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 + };
+143
examples/openapi-ts-ky/src/client/core/utils.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import type { BodySerializer, QuerySerializer } from './bodySerializer.gen'; 4 + import { 5 + type ArraySeparatorStyle, 6 + serializeArrayParam, 7 + serializeObjectParam, 8 + serializePrimitiveParam, 9 + } from './pathSerializer.gen'; 10 + 11 + export interface PathSerializer { 12 + path: Record<string, unknown>; 13 + url: string; 14 + } 15 + 16 + export const PATH_PARAM_RE = /\{[^{}]+\}/g; 17 + 18 + export const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { 19 + let url = _url; 20 + const matches = _url.match(PATH_PARAM_RE); 21 + if (matches) { 22 + for (const match of matches) { 23 + let explode = false; 24 + let name = match.substring(1, match.length - 1); 25 + let style: ArraySeparatorStyle = 'simple'; 26 + 27 + if (name.endsWith('*')) { 28 + explode = true; 29 + name = name.substring(0, name.length - 1); 30 + } 31 + 32 + if (name.startsWith('.')) { 33 + name = name.substring(1); 34 + style = 'label'; 35 + } else if (name.startsWith(';')) { 36 + name = name.substring(1); 37 + style = 'matrix'; 38 + } 39 + 40 + const value = path[name]; 41 + 42 + if (value === undefined || value === null) { 43 + continue; 44 + } 45 + 46 + if (Array.isArray(value)) { 47 + url = url.replace( 48 + match, 49 + serializeArrayParam({ explode, name, style, value }), 50 + ); 51 + continue; 52 + } 53 + 54 + if (typeof value === 'object') { 55 + url = url.replace( 56 + match, 57 + serializeObjectParam({ 58 + explode, 59 + name, 60 + style, 61 + value: value as Record<string, unknown>, 62 + valueOnly: true, 63 + }), 64 + ); 65 + continue; 66 + } 67 + 68 + if (style === 'matrix') { 69 + url = url.replace( 70 + match, 71 + `;${serializePrimitiveParam({ 72 + name, 73 + value: value as string, 74 + })}`, 75 + ); 76 + continue; 77 + } 78 + 79 + const replaceValue = encodeURIComponent( 80 + style === 'label' ? `.${value as string}` : (value as string), 81 + ); 82 + url = url.replace(match, replaceValue); 83 + } 84 + } 85 + return url; 86 + }; 87 + 88 + export const getUrl = ({ 89 + baseUrl, 90 + path, 91 + query, 92 + querySerializer, 93 + url: _url, 94 + }: { 95 + baseUrl?: string; 96 + path?: Record<string, unknown>; 97 + query?: Record<string, unknown>; 98 + querySerializer: QuerySerializer; 99 + url: string; 100 + }) => { 101 + const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; 102 + let url = (baseUrl ?? '') + pathUrl; 103 + if (path) { 104 + url = defaultPathSerializer({ path, url }); 105 + } 106 + let search = query ? querySerializer(query) : ''; 107 + if (search.startsWith('?')) { 108 + search = search.substring(1); 109 + } 110 + if (search) { 111 + url += `?${search}`; 112 + } 113 + return url; 114 + }; 115 + 116 + export function getValidRequestBody(options: { 117 + body?: unknown; 118 + bodySerializer?: BodySerializer | null; 119 + serializedBody?: unknown; 120 + }) { 121 + const hasBody = options.body !== undefined; 122 + const isSerializedBody = hasBody && options.bodySerializer; 123 + 124 + if (isSerializedBody) { 125 + if ('serializedBody' in options) { 126 + const hasSerializedBody = 127 + options.serializedBody !== undefined && options.serializedBody !== ''; 128 + 129 + return hasSerializedBody ? options.serializedBody : null; 130 + } 131 + 132 + // not all clients implement a serializedBody property (i.e. client-axios) 133 + return options.body !== '' ? options.body : null; 134 + } 135 + 136 + // plain/text body 137 + if (hasBody) { 138 + return options.body; 139 + } 140 + 141 + // no body was provided 142 + return undefined; 143 + }
+4
examples/openapi-ts-ky/src/client/index.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + export * from './sdk.gen'; 4 + export type * from './types.gen';
+188
examples/openapi-ts-ky/src/client/schemas.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + export const OrderSchema = { 4 + properties: { 5 + complete: { 6 + type: 'boolean', 7 + }, 8 + id: { 9 + example: 10, 10 + format: 'int64', 11 + type: 'integer', 12 + }, 13 + petId: { 14 + example: 198772, 15 + format: 'int64', 16 + type: 'integer', 17 + }, 18 + quantity: { 19 + example: 7, 20 + format: 'int32', 21 + type: 'integer', 22 + }, 23 + shipDate: { 24 + format: 'date-time', 25 + type: 'string', 26 + }, 27 + status: { 28 + description: 'Order Status', 29 + enum: ['placed', 'approved', 'delivered'], 30 + example: 'approved', 31 + type: 'string', 32 + }, 33 + }, 34 + type: 'object', 35 + 'x-swagger-router-model': 'io.swagger.petstore.model.Order', 36 + xml: { 37 + name: 'order', 38 + }, 39 + } as const; 40 + 41 + export const CategorySchema = { 42 + properties: { 43 + id: { 44 + example: 1, 45 + format: 'int64', 46 + type: 'integer', 47 + }, 48 + name: { 49 + example: 'Dogs', 50 + type: 'string', 51 + }, 52 + }, 53 + type: 'object', 54 + 'x-swagger-router-model': 'io.swagger.petstore.model.Category', 55 + xml: { 56 + name: 'category', 57 + }, 58 + } as const; 59 + 60 + export const UserSchema = { 61 + properties: { 62 + email: { 63 + example: 'john@email.com', 64 + type: 'string', 65 + }, 66 + firstName: { 67 + example: 'John', 68 + type: 'string', 69 + }, 70 + id: { 71 + example: 10, 72 + format: 'int64', 73 + type: 'integer', 74 + }, 75 + lastName: { 76 + example: 'James', 77 + type: 'string', 78 + }, 79 + password: { 80 + example: '12345', 81 + type: 'string', 82 + }, 83 + phone: { 84 + example: '12345', 85 + type: 'string', 86 + }, 87 + userStatus: { 88 + description: 'User Status', 89 + example: 1, 90 + format: 'int32', 91 + type: 'integer', 92 + }, 93 + username: { 94 + example: 'theUser', 95 + type: 'string', 96 + }, 97 + }, 98 + type: 'object', 99 + 'x-swagger-router-model': 'io.swagger.petstore.model.User', 100 + xml: { 101 + name: 'user', 102 + }, 103 + } as const; 104 + 105 + export const TagSchema = { 106 + properties: { 107 + id: { 108 + format: 'int64', 109 + type: 'integer', 110 + }, 111 + name: { 112 + type: 'string', 113 + }, 114 + }, 115 + type: 'object', 116 + 'x-swagger-router-model': 'io.swagger.petstore.model.Tag', 117 + xml: { 118 + name: 'tag', 119 + }, 120 + } as const; 121 + 122 + export const PetSchema = { 123 + properties: { 124 + category: { 125 + $ref: '#/components/schemas/Category', 126 + }, 127 + id: { 128 + example: 10, 129 + format: 'int64', 130 + type: 'integer', 131 + }, 132 + name: { 133 + example: 'doggie', 134 + type: 'string', 135 + }, 136 + photoUrls: { 137 + items: { 138 + type: 'string', 139 + xml: { 140 + name: 'photoUrl', 141 + }, 142 + }, 143 + type: 'array', 144 + xml: { 145 + wrapped: true, 146 + }, 147 + }, 148 + status: { 149 + description: 'pet status in the store', 150 + enum: ['available', 'pending', 'sold'], 151 + type: 'string', 152 + }, 153 + tags: { 154 + items: { 155 + $ref: '#/components/schemas/Tag', 156 + }, 157 + type: 'array', 158 + xml: { 159 + wrapped: true, 160 + }, 161 + }, 162 + }, 163 + required: ['name', 'photoUrls'], 164 + type: 'object', 165 + 'x-swagger-router-model': 'io.swagger.petstore.model.Pet', 166 + xml: { 167 + name: 'pet', 168 + }, 169 + } as const; 170 + 171 + export const ApiResponseSchema = { 172 + properties: { 173 + code: { 174 + format: 'int32', 175 + type: 'integer', 176 + }, 177 + message: { 178 + type: 'string', 179 + }, 180 + type: { 181 + type: 'string', 182 + }, 183 + }, 184 + type: 'object', 185 + xml: { 186 + name: '##default', 187 + }, 188 + } as const;
+486
examples/openapi-ts-ky/src/client/sdk.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + import type { Client, Options as Options2, TDataShape } from './client'; 4 + import { client } from './client.gen'; 5 + import type { 6 + AddPetData, 7 + AddPetErrors, 8 + AddPetResponses, 9 + CreateUserData, 10 + CreateUserErrors, 11 + CreateUserResponses, 12 + CreateUsersWithListInputData, 13 + CreateUsersWithListInputErrors, 14 + CreateUsersWithListInputResponses, 15 + DeleteOrderData, 16 + DeleteOrderErrors, 17 + DeleteOrderResponses, 18 + DeletePetData, 19 + DeletePetErrors, 20 + DeletePetResponses, 21 + DeleteUserData, 22 + DeleteUserErrors, 23 + DeleteUserResponses, 24 + FindPetsByStatusData, 25 + FindPetsByStatusErrors, 26 + FindPetsByStatusResponses, 27 + FindPetsByTagsData, 28 + FindPetsByTagsErrors, 29 + FindPetsByTagsResponses, 30 + GetInventoryData, 31 + GetInventoryErrors, 32 + GetInventoryResponses, 33 + GetOrderByIdData, 34 + GetOrderByIdErrors, 35 + GetOrderByIdResponses, 36 + GetPetByIdData, 37 + GetPetByIdErrors, 38 + GetPetByIdResponses, 39 + GetUserByNameData, 40 + GetUserByNameErrors, 41 + GetUserByNameResponses, 42 + LoginUserData, 43 + LoginUserErrors, 44 + LoginUserResponses, 45 + LogoutUserData, 46 + LogoutUserErrors, 47 + LogoutUserResponses, 48 + PlaceOrderData, 49 + PlaceOrderErrors, 50 + PlaceOrderResponses, 51 + UpdatePetData, 52 + UpdatePetErrors, 53 + UpdatePetResponses, 54 + UpdatePetWithFormData, 55 + UpdatePetWithFormErrors, 56 + UpdatePetWithFormResponses, 57 + UpdateUserData, 58 + UpdateUserErrors, 59 + UpdateUserResponses, 60 + UploadFileData, 61 + UploadFileErrors, 62 + UploadFileResponses, 63 + } from './types.gen'; 64 + 65 + export type Options< 66 + TData extends TDataShape = TDataShape, 67 + ThrowOnError extends boolean = boolean, 68 + > = Options2<TData, ThrowOnError> & { 69 + /** 70 + * You can provide a client instance returned by `createClient()` instead of 71 + * individual options. This might be also useful if you want to implement a 72 + * custom client. 73 + */ 74 + client?: Client; 75 + /** 76 + * You can pass arbitrary values through the `meta` object. This can be 77 + * used to access values that aren't defined as part of the SDK function. 78 + */ 79 + meta?: Record<string, unknown>; 80 + }; 81 + 82 + /** 83 + * Add a new pet to the store. 84 + * 85 + * Add a new pet to the store. 86 + */ 87 + export const addPet = <ThrowOnError extends boolean = false>( 88 + options: Options<AddPetData, ThrowOnError>, 89 + ) => 90 + (options.client ?? client).post<AddPetResponses, AddPetErrors, ThrowOnError>({ 91 + security: [ 92 + { 93 + scheme: 'bearer', 94 + type: 'http', 95 + }, 96 + ], 97 + url: '/pet', 98 + ...options, 99 + headers: { 100 + 'Content-Type': 'application/json', 101 + ...options.headers, 102 + }, 103 + }); 104 + 105 + /** 106 + * Update an existing pet. 107 + * 108 + * Update an existing pet by Id. 109 + */ 110 + export const updatePet = <ThrowOnError extends boolean = false>( 111 + options: Options<UpdatePetData, ThrowOnError>, 112 + ) => 113 + (options.client ?? client).put< 114 + UpdatePetResponses, 115 + UpdatePetErrors, 116 + ThrowOnError 117 + >({ 118 + security: [ 119 + { 120 + scheme: 'bearer', 121 + type: 'http', 122 + }, 123 + ], 124 + url: '/pet', 125 + ...options, 126 + headers: { 127 + 'Content-Type': 'application/json', 128 + ...options.headers, 129 + }, 130 + }); 131 + 132 + /** 133 + * Finds Pets by status. 134 + * 135 + * Multiple status values can be provided with comma separated strings. 136 + */ 137 + export const findPetsByStatus = <ThrowOnError extends boolean = false>( 138 + options: Options<FindPetsByStatusData, ThrowOnError>, 139 + ) => 140 + (options.client ?? client).get< 141 + FindPetsByStatusResponses, 142 + FindPetsByStatusErrors, 143 + ThrowOnError 144 + >({ 145 + security: [ 146 + { 147 + scheme: 'bearer', 148 + type: 'http', 149 + }, 150 + ], 151 + url: '/pet/findByStatus', 152 + ...options, 153 + }); 154 + 155 + /** 156 + * Finds Pets by tags. 157 + * 158 + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. 159 + */ 160 + export const findPetsByTags = <ThrowOnError extends boolean = false>( 161 + options: Options<FindPetsByTagsData, ThrowOnError>, 162 + ) => 163 + (options.client ?? client).get< 164 + FindPetsByTagsResponses, 165 + FindPetsByTagsErrors, 166 + ThrowOnError 167 + >({ 168 + security: [ 169 + { 170 + scheme: 'bearer', 171 + type: 'http', 172 + }, 173 + ], 174 + url: '/pet/findByTags', 175 + ...options, 176 + }); 177 + 178 + /** 179 + * Deletes a pet. 180 + * 181 + * Delete a pet. 182 + */ 183 + export const deletePet = <ThrowOnError extends boolean = false>( 184 + options: Options<DeletePetData, ThrowOnError>, 185 + ) => 186 + (options.client ?? client).delete< 187 + DeletePetResponses, 188 + DeletePetErrors, 189 + ThrowOnError 190 + >({ 191 + security: [ 192 + { 193 + scheme: 'bearer', 194 + type: 'http', 195 + }, 196 + ], 197 + url: '/pet/{petId}', 198 + ...options, 199 + }); 200 + 201 + /** 202 + * Find pet by ID. 203 + * 204 + * Returns a single pet. 205 + */ 206 + export const getPetById = <ThrowOnError extends boolean = false>( 207 + options: Options<GetPetByIdData, ThrowOnError>, 208 + ) => 209 + (options.client ?? client).get< 210 + GetPetByIdResponses, 211 + GetPetByIdErrors, 212 + ThrowOnError 213 + >({ 214 + security: [ 215 + { 216 + name: 'api_key', 217 + type: 'apiKey', 218 + }, 219 + { 220 + scheme: 'bearer', 221 + type: 'http', 222 + }, 223 + ], 224 + url: '/pet/{petId}', 225 + ...options, 226 + }); 227 + 228 + /** 229 + * Updates a pet in the store with form data. 230 + * 231 + * Updates a pet resource based on the form data. 232 + */ 233 + export const updatePetWithForm = <ThrowOnError extends boolean = false>( 234 + options: Options<UpdatePetWithFormData, ThrowOnError>, 235 + ) => 236 + (options.client ?? client).post< 237 + UpdatePetWithFormResponses, 238 + UpdatePetWithFormErrors, 239 + ThrowOnError 240 + >({ 241 + security: [ 242 + { 243 + scheme: 'bearer', 244 + type: 'http', 245 + }, 246 + ], 247 + url: '/pet/{petId}', 248 + ...options, 249 + }); 250 + 251 + /** 252 + * Uploads an image. 253 + * 254 + * Upload image of the pet. 255 + */ 256 + export const uploadFile = <ThrowOnError extends boolean = false>( 257 + options: Options<UploadFileData, ThrowOnError>, 258 + ) => 259 + (options.client ?? client).post< 260 + UploadFileResponses, 261 + UploadFileErrors, 262 + ThrowOnError 263 + >({ 264 + bodySerializer: null, 265 + security: [ 266 + { 267 + scheme: 'bearer', 268 + type: 'http', 269 + }, 270 + ], 271 + url: '/pet/{petId}/uploadImage', 272 + ...options, 273 + headers: { 274 + 'Content-Type': 'application/octet-stream', 275 + ...options.headers, 276 + }, 277 + }); 278 + 279 + /** 280 + * Returns pet inventories by status. 281 + * 282 + * Returns a map of status codes to quantities. 283 + */ 284 + export const getInventory = <ThrowOnError extends boolean = false>( 285 + options?: Options<GetInventoryData, ThrowOnError>, 286 + ) => 287 + (options?.client ?? client).get< 288 + GetInventoryResponses, 289 + GetInventoryErrors, 290 + ThrowOnError 291 + >({ 292 + security: [ 293 + { 294 + name: 'api_key', 295 + type: 'apiKey', 296 + }, 297 + ], 298 + url: '/store/inventory', 299 + ...options, 300 + }); 301 + 302 + /** 303 + * Place an order for a pet. 304 + * 305 + * Place a new order in the store. 306 + */ 307 + export const placeOrder = <ThrowOnError extends boolean = false>( 308 + options?: Options<PlaceOrderData, ThrowOnError>, 309 + ) => 310 + (options?.client ?? client).post< 311 + PlaceOrderResponses, 312 + PlaceOrderErrors, 313 + ThrowOnError 314 + >({ 315 + url: '/store/order', 316 + ...options, 317 + headers: { 318 + 'Content-Type': 'application/json', 319 + ...options?.headers, 320 + }, 321 + }); 322 + 323 + /** 324 + * Delete purchase order by identifier. 325 + * 326 + * For valid response try integer IDs with value < 1000. Anything above 1000 or non-integers will generate API errors. 327 + */ 328 + export const deleteOrder = <ThrowOnError extends boolean = false>( 329 + options: Options<DeleteOrderData, ThrowOnError>, 330 + ) => 331 + (options.client ?? client).delete< 332 + DeleteOrderResponses, 333 + DeleteOrderErrors, 334 + ThrowOnError 335 + >({ 336 + url: '/store/order/{orderId}', 337 + ...options, 338 + }); 339 + 340 + /** 341 + * Find purchase order by ID. 342 + * 343 + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. 344 + */ 345 + export const getOrderById = <ThrowOnError extends boolean = false>( 346 + options: Options<GetOrderByIdData, ThrowOnError>, 347 + ) => 348 + (options.client ?? client).get< 349 + GetOrderByIdResponses, 350 + GetOrderByIdErrors, 351 + ThrowOnError 352 + >({ 353 + url: '/store/order/{orderId}', 354 + ...options, 355 + }); 356 + 357 + /** 358 + * Create user. 359 + * 360 + * This can only be done by the logged in user. 361 + */ 362 + export const createUser = <ThrowOnError extends boolean = false>( 363 + options?: Options<CreateUserData, ThrowOnError>, 364 + ) => 365 + (options?.client ?? client).post< 366 + CreateUserResponses, 367 + CreateUserErrors, 368 + ThrowOnError 369 + >({ 370 + url: '/user', 371 + ...options, 372 + headers: { 373 + 'Content-Type': 'application/json', 374 + ...options?.headers, 375 + }, 376 + }); 377 + 378 + /** 379 + * Creates list of users with given input array. 380 + * 381 + * Creates list of users with given input array. 382 + */ 383 + export const createUsersWithListInput = <ThrowOnError extends boolean = false>( 384 + options?: Options<CreateUsersWithListInputData, ThrowOnError>, 385 + ) => 386 + (options?.client ?? client).post< 387 + CreateUsersWithListInputResponses, 388 + CreateUsersWithListInputErrors, 389 + ThrowOnError 390 + >({ 391 + url: '/user/createWithList', 392 + ...options, 393 + headers: { 394 + 'Content-Type': 'application/json', 395 + ...options?.headers, 396 + }, 397 + }); 398 + 399 + /** 400 + * Logs user into the system. 401 + * 402 + * Log into the system. 403 + */ 404 + export const loginUser = <ThrowOnError extends boolean = false>( 405 + options?: Options<LoginUserData, ThrowOnError>, 406 + ) => 407 + (options?.client ?? client).get< 408 + LoginUserResponses, 409 + LoginUserErrors, 410 + ThrowOnError 411 + >({ 412 + url: '/user/login', 413 + ...options, 414 + }); 415 + 416 + /** 417 + * Logs out current logged in user session. 418 + * 419 + * Log user out of the system. 420 + */ 421 + export const logoutUser = <ThrowOnError extends boolean = false>( 422 + options?: Options<LogoutUserData, ThrowOnError>, 423 + ) => 424 + (options?.client ?? client).get< 425 + LogoutUserResponses, 426 + LogoutUserErrors, 427 + ThrowOnError 428 + >({ 429 + url: '/user/logout', 430 + ...options, 431 + }); 432 + 433 + /** 434 + * Delete user resource. 435 + * 436 + * This can only be done by the logged in user. 437 + */ 438 + export const deleteUser = <ThrowOnError extends boolean = false>( 439 + options: Options<DeleteUserData, ThrowOnError>, 440 + ) => 441 + (options.client ?? client).delete< 442 + DeleteUserResponses, 443 + DeleteUserErrors, 444 + ThrowOnError 445 + >({ 446 + url: '/user/{username}', 447 + ...options, 448 + }); 449 + 450 + /** 451 + * Get user by user name. 452 + * 453 + * Get user detail based on username. 454 + */ 455 + export const getUserByName = <ThrowOnError extends boolean = false>( 456 + options: Options<GetUserByNameData, ThrowOnError>, 457 + ) => 458 + (options.client ?? client).get< 459 + GetUserByNameResponses, 460 + GetUserByNameErrors, 461 + ThrowOnError 462 + >({ 463 + url: '/user/{username}', 464 + ...options, 465 + }); 466 + 467 + /** 468 + * Update user resource. 469 + * 470 + * This can only be done by the logged in user. 471 + */ 472 + export const updateUser = <ThrowOnError extends boolean = false>( 473 + options: Options<UpdateUserData, ThrowOnError>, 474 + ) => 475 + (options.client ?? client).put< 476 + UpdateUserResponses, 477 + UpdateUserErrors, 478 + ThrowOnError 479 + >({ 480 + url: '/user/{username}', 481 + ...options, 482 + headers: { 483 + 'Content-Type': 'application/json', 484 + ...options.headers, 485 + }, 486 + });
+699
examples/openapi-ts-ky/src/client/types.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + export type ClientOptions = { 4 + baseUrl: 'https://petstore3.swagger.io/api/v3' | (string & {}); 5 + }; 6 + 7 + export type Order = { 8 + complete?: boolean; 9 + id?: number; 10 + petId?: number; 11 + quantity?: number; 12 + shipDate?: string; 13 + /** 14 + * Order Status 15 + */ 16 + status?: 'placed' | 'approved' | 'delivered'; 17 + }; 18 + 19 + export type Category = { 20 + id?: number; 21 + name?: string; 22 + }; 23 + 24 + export type User = { 25 + email?: string; 26 + firstName?: string; 27 + id?: number; 28 + lastName?: string; 29 + password?: string; 30 + phone?: string; 31 + /** 32 + * User Status 33 + */ 34 + userStatus?: number; 35 + username?: string; 36 + }; 37 + 38 + export type Tag = { 39 + id?: number; 40 + name?: string; 41 + }; 42 + 43 + export type Pet = { 44 + category?: Category; 45 + id?: number; 46 + name: string; 47 + photoUrls: Array<string>; 48 + /** 49 + * pet status in the store 50 + */ 51 + status?: 'available' | 'pending' | 'sold'; 52 + tags?: Array<Tag>; 53 + }; 54 + 55 + export type ApiResponse = { 56 + code?: number; 57 + message?: string; 58 + type?: string; 59 + }; 60 + 61 + export type Pet2 = Pet; 62 + 63 + /** 64 + * List of user object 65 + */ 66 + export type UserArray = Array<User>; 67 + 68 + export type AddPetData = { 69 + /** 70 + * Create a new pet in the store 71 + */ 72 + body: Pet; 73 + path?: never; 74 + query?: never; 75 + url: '/pet'; 76 + }; 77 + 78 + export type AddPetErrors = { 79 + /** 80 + * Invalid input 81 + */ 82 + 400: unknown; 83 + /** 84 + * Validation exception 85 + */ 86 + 422: unknown; 87 + /** 88 + * Unexpected error 89 + */ 90 + default: unknown; 91 + }; 92 + 93 + export type AddPetResponses = { 94 + /** 95 + * Successful operation 96 + */ 97 + 200: Pet; 98 + }; 99 + 100 + export type AddPetResponse = AddPetResponses[keyof AddPetResponses]; 101 + 102 + export type UpdatePetData = { 103 + /** 104 + * Update an existent pet in the store 105 + */ 106 + body: Pet; 107 + path?: never; 108 + query?: never; 109 + url: '/pet'; 110 + }; 111 + 112 + export type UpdatePetErrors = { 113 + /** 114 + * Invalid ID supplied 115 + */ 116 + 400: unknown; 117 + /** 118 + * Pet not found 119 + */ 120 + 404: unknown; 121 + /** 122 + * Validation exception 123 + */ 124 + 422: unknown; 125 + /** 126 + * Unexpected error 127 + */ 128 + default: unknown; 129 + }; 130 + 131 + export type UpdatePetResponses = { 132 + /** 133 + * Successful operation 134 + */ 135 + 200: Pet; 136 + }; 137 + 138 + export type UpdatePetResponse = UpdatePetResponses[keyof UpdatePetResponses]; 139 + 140 + export type FindPetsByStatusData = { 141 + body?: never; 142 + path?: never; 143 + query: { 144 + /** 145 + * Status values that need to be considered for filter 146 + */ 147 + status: 'available' | 'pending' | 'sold'; 148 + }; 149 + url: '/pet/findByStatus'; 150 + }; 151 + 152 + export type FindPetsByStatusErrors = { 153 + /** 154 + * Invalid status value 155 + */ 156 + 400: unknown; 157 + /** 158 + * Unexpected error 159 + */ 160 + default: unknown; 161 + }; 162 + 163 + export type FindPetsByStatusResponses = { 164 + /** 165 + * successful operation 166 + */ 167 + 200: Array<Pet>; 168 + }; 169 + 170 + export type FindPetsByStatusResponse = 171 + FindPetsByStatusResponses[keyof FindPetsByStatusResponses]; 172 + 173 + export type FindPetsByTagsData = { 174 + body?: never; 175 + path?: never; 176 + query: { 177 + /** 178 + * Tags to filter by 179 + */ 180 + tags: Array<string>; 181 + }; 182 + url: '/pet/findByTags'; 183 + }; 184 + 185 + export type FindPetsByTagsErrors = { 186 + /** 187 + * Invalid tag value 188 + */ 189 + 400: unknown; 190 + /** 191 + * Unexpected error 192 + */ 193 + default: unknown; 194 + }; 195 + 196 + export type FindPetsByTagsResponses = { 197 + /** 198 + * successful operation 199 + */ 200 + 200: Array<Pet>; 201 + }; 202 + 203 + export type FindPetsByTagsResponse = 204 + FindPetsByTagsResponses[keyof FindPetsByTagsResponses]; 205 + 206 + export type DeletePetData = { 207 + body?: never; 208 + headers?: { 209 + api_key?: string; 210 + }; 211 + path: { 212 + /** 213 + * Pet id to delete 214 + */ 215 + petId: number; 216 + }; 217 + query?: never; 218 + url: '/pet/{petId}'; 219 + }; 220 + 221 + export type DeletePetErrors = { 222 + /** 223 + * Invalid pet value 224 + */ 225 + 400: unknown; 226 + /** 227 + * Unexpected error 228 + */ 229 + default: unknown; 230 + }; 231 + 232 + export type DeletePetResponses = { 233 + /** 234 + * Pet deleted 235 + */ 236 + 200: unknown; 237 + }; 238 + 239 + export type GetPetByIdData = { 240 + body?: never; 241 + path: { 242 + /** 243 + * ID of pet to return 244 + */ 245 + petId: number; 246 + }; 247 + query?: never; 248 + url: '/pet/{petId}'; 249 + }; 250 + 251 + export type GetPetByIdErrors = { 252 + /** 253 + * Invalid ID supplied 254 + */ 255 + 400: unknown; 256 + /** 257 + * Pet not found 258 + */ 259 + 404: unknown; 260 + /** 261 + * Unexpected error 262 + */ 263 + default: unknown; 264 + }; 265 + 266 + export type GetPetByIdResponses = { 267 + /** 268 + * successful operation 269 + */ 270 + 200: Pet; 271 + }; 272 + 273 + export type GetPetByIdResponse = GetPetByIdResponses[keyof GetPetByIdResponses]; 274 + 275 + export type UpdatePetWithFormData = { 276 + body?: never; 277 + path: { 278 + /** 279 + * ID of pet that needs to be updated 280 + */ 281 + petId: number; 282 + }; 283 + query?: { 284 + /** 285 + * Name of pet that needs to be updated 286 + */ 287 + name?: string; 288 + /** 289 + * Status of pet that needs to be updated 290 + */ 291 + status?: string; 292 + }; 293 + url: '/pet/{petId}'; 294 + }; 295 + 296 + export type UpdatePetWithFormErrors = { 297 + /** 298 + * Invalid input 299 + */ 300 + 400: unknown; 301 + /** 302 + * Unexpected error 303 + */ 304 + default: unknown; 305 + }; 306 + 307 + export type UpdatePetWithFormResponses = { 308 + /** 309 + * successful operation 310 + */ 311 + 200: Pet; 312 + }; 313 + 314 + export type UpdatePetWithFormResponse = 315 + UpdatePetWithFormResponses[keyof UpdatePetWithFormResponses]; 316 + 317 + export type UploadFileData = { 318 + body?: Blob | File; 319 + path: { 320 + /** 321 + * ID of pet to update 322 + */ 323 + petId: number; 324 + }; 325 + query?: { 326 + /** 327 + * Additional Metadata 328 + */ 329 + additionalMetadata?: string; 330 + }; 331 + url: '/pet/{petId}/uploadImage'; 332 + }; 333 + 334 + export type UploadFileErrors = { 335 + /** 336 + * No file uploaded 337 + */ 338 + 400: unknown; 339 + /** 340 + * Pet not found 341 + */ 342 + 404: unknown; 343 + /** 344 + * Unexpected error 345 + */ 346 + default: unknown; 347 + }; 348 + 349 + export type UploadFileResponses = { 350 + /** 351 + * successful operation 352 + */ 353 + 200: ApiResponse; 354 + }; 355 + 356 + export type UploadFileResponse = UploadFileResponses[keyof UploadFileResponses]; 357 + 358 + export type GetInventoryData = { 359 + body?: never; 360 + path?: never; 361 + query?: never; 362 + url: '/store/inventory'; 363 + }; 364 + 365 + export type GetInventoryErrors = { 366 + /** 367 + * Unexpected error 368 + */ 369 + default: unknown; 370 + }; 371 + 372 + export type GetInventoryResponses = { 373 + /** 374 + * successful operation 375 + */ 376 + 200: { 377 + [key: string]: number; 378 + }; 379 + }; 380 + 381 + export type GetInventoryResponse = 382 + GetInventoryResponses[keyof GetInventoryResponses]; 383 + 384 + export type PlaceOrderData = { 385 + body?: Order; 386 + path?: never; 387 + query?: never; 388 + url: '/store/order'; 389 + }; 390 + 391 + export type PlaceOrderErrors = { 392 + /** 393 + * Invalid input 394 + */ 395 + 400: unknown; 396 + /** 397 + * Validation exception 398 + */ 399 + 422: unknown; 400 + /** 401 + * Unexpected error 402 + */ 403 + default: unknown; 404 + }; 405 + 406 + export type PlaceOrderResponses = { 407 + /** 408 + * successful operation 409 + */ 410 + 200: Order; 411 + }; 412 + 413 + export type PlaceOrderResponse = PlaceOrderResponses[keyof PlaceOrderResponses]; 414 + 415 + export type DeleteOrderData = { 416 + body?: never; 417 + path: { 418 + /** 419 + * ID of the order that needs to be deleted 420 + */ 421 + orderId: number; 422 + }; 423 + query?: never; 424 + url: '/store/order/{orderId}'; 425 + }; 426 + 427 + export type DeleteOrderErrors = { 428 + /** 429 + * Invalid ID supplied 430 + */ 431 + 400: unknown; 432 + /** 433 + * Order not found 434 + */ 435 + 404: unknown; 436 + /** 437 + * Unexpected error 438 + */ 439 + default: unknown; 440 + }; 441 + 442 + export type DeleteOrderResponses = { 443 + /** 444 + * order deleted 445 + */ 446 + 200: unknown; 447 + }; 448 + 449 + export type GetOrderByIdData = { 450 + body?: never; 451 + path: { 452 + /** 453 + * ID of order that needs to be fetched 454 + */ 455 + orderId: number; 456 + }; 457 + query?: never; 458 + url: '/store/order/{orderId}'; 459 + }; 460 + 461 + export type GetOrderByIdErrors = { 462 + /** 463 + * Invalid ID supplied 464 + */ 465 + 400: unknown; 466 + /** 467 + * Order not found 468 + */ 469 + 404: unknown; 470 + /** 471 + * Unexpected error 472 + */ 473 + default: unknown; 474 + }; 475 + 476 + export type GetOrderByIdResponses = { 477 + /** 478 + * successful operation 479 + */ 480 + 200: Order; 481 + }; 482 + 483 + export type GetOrderByIdResponse = 484 + GetOrderByIdResponses[keyof GetOrderByIdResponses]; 485 + 486 + export type CreateUserData = { 487 + /** 488 + * Created user object 489 + */ 490 + body?: User; 491 + path?: never; 492 + query?: never; 493 + url: '/user'; 494 + }; 495 + 496 + export type CreateUserErrors = { 497 + /** 498 + * Unexpected error 499 + */ 500 + default: unknown; 501 + }; 502 + 503 + export type CreateUserResponses = { 504 + /** 505 + * successful operation 506 + */ 507 + 200: User; 508 + }; 509 + 510 + export type CreateUserResponse = CreateUserResponses[keyof CreateUserResponses]; 511 + 512 + export type CreateUsersWithListInputData = { 513 + body?: Array<User>; 514 + path?: never; 515 + query?: never; 516 + url: '/user/createWithList'; 517 + }; 518 + 519 + export type CreateUsersWithListInputErrors = { 520 + /** 521 + * Unexpected error 522 + */ 523 + default: unknown; 524 + }; 525 + 526 + export type CreateUsersWithListInputResponses = { 527 + /** 528 + * Successful operation 529 + */ 530 + 200: User; 531 + }; 532 + 533 + export type CreateUsersWithListInputResponse = 534 + CreateUsersWithListInputResponses[keyof CreateUsersWithListInputResponses]; 535 + 536 + export type LoginUserData = { 537 + body?: never; 538 + path?: never; 539 + query?: { 540 + /** 541 + * The password for login in clear text 542 + */ 543 + password?: string; 544 + /** 545 + * The user name for login 546 + */ 547 + username?: string; 548 + }; 549 + url: '/user/login'; 550 + }; 551 + 552 + export type LoginUserErrors = { 553 + /** 554 + * Invalid username/password supplied 555 + */ 556 + 400: unknown; 557 + /** 558 + * Unexpected error 559 + */ 560 + default: unknown; 561 + }; 562 + 563 + export type LoginUserResponses = { 564 + /** 565 + * successful operation 566 + */ 567 + 200: string; 568 + }; 569 + 570 + export type LoginUserResponse = LoginUserResponses[keyof LoginUserResponses]; 571 + 572 + export type LogoutUserData = { 573 + body?: never; 574 + path?: never; 575 + query?: never; 576 + url: '/user/logout'; 577 + }; 578 + 579 + export type LogoutUserErrors = { 580 + /** 581 + * Unexpected error 582 + */ 583 + default: unknown; 584 + }; 585 + 586 + export type LogoutUserResponses = { 587 + /** 588 + * successful operation 589 + */ 590 + 200: unknown; 591 + }; 592 + 593 + export type DeleteUserData = { 594 + body?: never; 595 + path: { 596 + /** 597 + * The name that needs to be deleted 598 + */ 599 + username: string; 600 + }; 601 + query?: never; 602 + url: '/user/{username}'; 603 + }; 604 + 605 + export type DeleteUserErrors = { 606 + /** 607 + * Invalid username supplied 608 + */ 609 + 400: unknown; 610 + /** 611 + * User not found 612 + */ 613 + 404: unknown; 614 + /** 615 + * Unexpected error 616 + */ 617 + default: unknown; 618 + }; 619 + 620 + export type DeleteUserResponses = { 621 + /** 622 + * User deleted 623 + */ 624 + 200: unknown; 625 + }; 626 + 627 + export type GetUserByNameData = { 628 + body?: never; 629 + path: { 630 + /** 631 + * The name that needs to be fetched. Use user1 for testing 632 + */ 633 + username: string; 634 + }; 635 + query?: never; 636 + url: '/user/{username}'; 637 + }; 638 + 639 + export type GetUserByNameErrors = { 640 + /** 641 + * Invalid username supplied 642 + */ 643 + 400: unknown; 644 + /** 645 + * User not found 646 + */ 647 + 404: unknown; 648 + /** 649 + * Unexpected error 650 + */ 651 + default: unknown; 652 + }; 653 + 654 + export type GetUserByNameResponses = { 655 + /** 656 + * successful operation 657 + */ 658 + 200: User; 659 + }; 660 + 661 + export type GetUserByNameResponse = 662 + GetUserByNameResponses[keyof GetUserByNameResponses]; 663 + 664 + export type UpdateUserData = { 665 + /** 666 + * Update an existent user in the store 667 + */ 668 + body?: User; 669 + path: { 670 + /** 671 + * name that need to be deleted 672 + */ 673 + username: string; 674 + }; 675 + query?: never; 676 + url: '/user/{username}'; 677 + }; 678 + 679 + export type UpdateUserErrors = { 680 + /** 681 + * bad request 682 + */ 683 + 400: unknown; 684 + /** 685 + * user not found 686 + */ 687 + 404: unknown; 688 + /** 689 + * Unexpected error 690 + */ 691 + default: unknown; 692 + }; 693 + 694 + export type UpdateUserResponses = { 695 + /** 696 + * successful operation 697 + */ 698 + 200: unknown; 699 + };
+26
examples/openapi-ts-ky/src/main.tsx
··· 1 + import '@radix-ui/themes/styles.css'; 2 + 3 + import { Theme } from '@radix-ui/themes'; 4 + import React from 'react'; 5 + import ReactDOM from 'react-dom/client'; 6 + 7 + import App from './App.tsx'; 8 + import { client } from './client/client.gen'; 9 + 10 + // configure internal service client 11 + client.setConfig({ 12 + // set default base url for requests 13 + baseUrl: 'https://petstore3.swagger.io/api/v3', 14 + // set default headers for requests 15 + headers: { 16 + Authorization: 'Bearer <token_from_service_client>', 17 + }, 18 + }); 19 + 20 + ReactDOM.createRoot(document.getElementById('root')!).render( 21 + <React.StrictMode> 22 + <Theme appearance="dark"> 23 + <App /> 24 + </Theme> 25 + </React.StrictMode>, 26 + );
+1
examples/openapi-ts-ky/src/vite-env.d.ts
··· 1 + /// <reference types="vite/client" />
+8
examples/openapi-ts-ky/tailwind.config.js
··· 1 + /** @type {import('tailwindcss').Config} */ 2 + export default { 3 + content: ['./index.html', './src/**/*.{html,js,ts,jsx,tsx}'], 4 + plugins: [], 5 + theme: { 6 + extend: {}, 7 + }, 8 + };
+25
examples/openapi-ts-ky/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2020", 4 + "useDefineForClassFields": true, 5 + "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 + "module": "ESNext", 7 + "skipLibCheck": true, 8 + 9 + /* Bundler mode */ 10 + "moduleResolution": "bundler", 11 + "allowImportingTsExtensions": true, 12 + "resolveJsonModule": true, 13 + "isolatedModules": true, 14 + "noEmit": true, 15 + "jsx": "react-jsx", 16 + 17 + /* Linting */ 18 + "strict": true, 19 + "noUnusedLocals": true, 20 + "noUnusedParameters": false, 21 + "noFallthroughCasesInSwitch": true 22 + }, 23 + "include": ["src"], 24 + "references": [{ "path": "./tsconfig.node.json" }] 25 + }
+11
examples/openapi-ts-ky/tsconfig.node.json
··· 1 + { 2 + "compilerOptions": { 3 + "composite": true, 4 + "skipLibCheck": true, 5 + "module": "ESNext", 6 + "moduleResolution": "bundler", 7 + "allowSyntheticDefaultImports": true, 8 + "strict": true 9 + }, 10 + "include": ["vite.config.ts"] 11 + }
+7
examples/openapi-ts-ky/vite.config.ts
··· 1 + import { createViteConfig } from '@config/vite-base'; 2 + import react from '@vitejs/plugin-react'; 3 + 4 + // https://vitejs.dev/config/ 5 + export default createViteConfig({ 6 + plugins: [react()], 7 + });
+1
packages/openapi-ts/tsdown.config.ts
··· 39 39 'client-axios', 40 40 'client-core', 41 41 'client-fetch', 42 + 'client-ky', 42 43 'client-next', 43 44 'client-nuxt', 44 45 'client-ofetch',
+229 -220
pnpm-lock.yaml
··· 530 530 specifier: 7.1.2 531 531 version: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 532 532 533 + examples/openapi-ts-ky: 534 + dependencies: 535 + '@radix-ui/react-form': 536 + specifier: 0.1.1 537 + 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) 538 + '@radix-ui/react-icons': 539 + specifier: 1.3.2 540 + version: 1.3.2(react@19.0.0) 541 + '@radix-ui/themes': 542 + specifier: 3.1.6 543 + version: 3.1.6(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 544 + ky: 545 + specifier: 1.14.0 546 + version: 1.14.0 547 + react: 548 + specifier: 19.0.0 549 + version: 19.0.0 550 + react-dom: 551 + specifier: 19.0.0 552 + version: 19.0.0(react@19.0.0) 553 + devDependencies: 554 + '@config/vite-base': 555 + specifier: workspace:* 556 + version: link:../../packages/config-vite-base 557 + '@hey-api/openapi-ts': 558 + specifier: workspace:* 559 + version: link:../../packages/openapi-ts 560 + '@types/react': 561 + specifier: 19.0.1 562 + version: 19.0.1 563 + '@types/react-dom': 564 + specifier: 19.0.1 565 + version: 19.0.1 566 + '@typescript-eslint/eslint-plugin': 567 + specifier: 8.29.1 568 + version: 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) 569 + '@typescript-eslint/parser': 570 + specifier: 8.29.1 571 + version: 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) 572 + '@vitejs/plugin-react': 573 + specifier: 4.4.0-beta.1 574 + version: 4.4.0-beta.1(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 575 + autoprefixer: 576 + specifier: 10.4.19 577 + version: 10.4.19(postcss@8.4.41) 578 + eslint: 579 + specifier: 9.17.0 580 + version: 9.17.0(jiti@2.6.1) 581 + eslint-plugin-react-hooks: 582 + specifier: 5.2.0 583 + version: 5.2.0(eslint@9.17.0(jiti@2.6.1)) 584 + eslint-plugin-react-refresh: 585 + specifier: 0.4.7 586 + version: 0.4.7(eslint@9.17.0(jiti@2.6.1)) 587 + postcss: 588 + specifier: 8.4.41 589 + version: 8.4.41 590 + prettier: 591 + specifier: 3.4.2 592 + version: 3.4.2 593 + tailwindcss: 594 + specifier: 3.4.9 595 + version: 3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)) 596 + typescript: 597 + specifier: 5.8.3 598 + version: 5.8.3 599 + vite: 600 + specifier: 7.1.2 601 + version: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 602 + 533 603 examples/openapi-ts-next: 534 604 dependencies: 535 605 next: ··· 1308 1378 version: 1.14.0 1309 1379 nuxt: 1310 1380 specifier: 3.14.1592 1311 - version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.45)(rollup@4.50.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 1381 + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.45)(rollup@4.50.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) 1312 1382 ofetch: 1313 1383 specifier: 1.4.1 1314 1384 version: 1.4.1 ··· 2143 2213 2144 2214 '@babel/generator@7.26.9': 2145 2215 resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} 2146 - engines: {node: '>=6.9.0'} 2147 - 2148 - '@babel/generator@7.28.3': 2149 - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} 2150 2216 engines: {node: '>=6.9.0'} 2151 2217 2152 2218 '@babel/generator@7.28.5': ··· 12732 12798 resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} 12733 12799 engines: {node: '>=12.0.0'} 12734 12800 12735 - tinyglobby@0.2.14: 12736 - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 12737 - engines: {node: '>=12.0.0'} 12738 - 12739 12801 tinyglobby@0.2.15: 12740 12802 resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 12741 12803 engines: {node: '>=12.0.0'} ··· 13538 13600 yaml: 13539 13601 optional: true 13540 13602 13541 - vite@6.3.5: 13542 - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 13543 - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 13544 - hasBin: true 13545 - peerDependencies: 13546 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 13547 - jiti: '>=1.21.0' 13548 - less: '*' 13549 - lightningcss: ^1.21.0 13550 - sass: '*' 13551 - sass-embedded: '*' 13552 - stylus: '*' 13553 - sugarss: '*' 13554 - terser: ^5.16.0 13555 - tsx: ^4.8.1 13556 - yaml: ^2.4.2 13557 - peerDependenciesMeta: 13558 - '@types/node': 13559 - optional: true 13560 - jiti: 13561 - optional: true 13562 - less: 13563 - optional: true 13564 - lightningcss: 13565 - optional: true 13566 - sass: 13567 - optional: true 13568 - sass-embedded: 13569 - optional: true 13570 - stylus: 13571 - optional: true 13572 - sugarss: 13573 - optional: true 13574 - terser: 13575 - optional: true 13576 - tsx: 13577 - optional: true 13578 - yaml: 13579 - optional: true 13580 - 13581 13603 vite@6.4.1: 13582 13604 resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} 13583 13605 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} ··· 14241 14263 dependencies: 14242 14264 '@ampproject/remapping': 2.3.0 14243 14265 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 14244 - '@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)) 14266 + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0)) 14245 14267 '@angular-devkit/core': 19.2.0(chokidar@4.0.3) 14246 14268 '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/platform-server@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))))(@angular/ssr@19.2.15(5c03da8199d2fcdf9ff93b70f9349edd))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(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.1) 14247 14269 '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) ··· 14259 14281 '@vitejs/plugin-basic-ssl': 1.2.0(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 14260 14282 ansi-colors: 4.1.3 14261 14283 autoprefixer: 10.4.20(postcss@8.5.2) 14262 - babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0) 14284 + babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)) 14263 14285 browserslist: 4.25.4 14264 14286 copy-webpack-plugin: 12.0.2(webpack@5.98.0) 14265 14287 css-loader: 7.1.2(webpack@5.98.0) ··· 14279 14301 picomatch: 4.0.2 14280 14302 piscina: 4.8.0 14281 14303 postcss: 8.5.2 14282 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) 14304 + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) 14283 14305 resolve-url-loader: 5.0.0 14284 14306 rxjs: 7.8.1 14285 14307 sass: 1.85.0 ··· 14292 14314 tslib: 2.8.1 14293 14315 typescript: 5.8.3 14294 14316 webpack: 5.98.0(esbuild@0.25.0) 14295 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 14296 - webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 14317 + webpack-dev-middleware: 7.4.2(webpack@5.98.0) 14318 + webpack-dev-server: 5.2.0(webpack@5.98.0) 14297 14319 webpack-merge: 6.0.1 14298 14320 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) 14299 14321 optionalDependencies: ··· 14329 14351 dependencies: 14330 14352 '@ampproject/remapping': 2.3.0 14331 14353 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 14332 - '@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)) 14354 + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0)) 14333 14355 '@angular-devkit/core': 19.2.0(chokidar@4.0.3) 14334 14356 '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/platform-server@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))))(@angular/ssr@19.2.15(5c03da8199d2fcdf9ff93b70f9349edd))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(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.1) 14335 14357 '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) ··· 14347 14369 '@vitejs/plugin-basic-ssl': 1.2.0(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 14348 14370 ansi-colors: 4.1.3 14349 14371 autoprefixer: 10.4.20(postcss@8.5.2) 14350 - babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0) 14372 + babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)) 14351 14373 browserslist: 4.25.4 14352 14374 copy-webpack-plugin: 12.0.2(webpack@5.98.0) 14353 14375 css-loader: 7.1.2(webpack@5.98.0) ··· 14367 14389 picomatch: 4.0.2 14368 14390 piscina: 4.8.0 14369 14391 postcss: 8.5.2 14370 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) 14392 + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) 14371 14393 resolve-url-loader: 5.0.0 14372 14394 rxjs: 7.8.1 14373 14395 sass: 1.85.0 ··· 14380 14402 tslib: 2.8.1 14381 14403 typescript: 5.8.3 14382 14404 webpack: 5.98.0(esbuild@0.25.0) 14383 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 14384 - webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 14405 + webpack-dev-middleware: 7.4.2(webpack@5.98.0) 14406 + webpack-dev-server: 5.2.0(webpack@5.98.0) 14385 14407 webpack-merge: 6.0.1 14386 14408 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) 14387 14409 optionalDependencies: ··· 14455 14477 picomatch: 4.0.2 14456 14478 piscina: 4.8.0 14457 14479 postcss: 8.5.2 14458 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) 14480 + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) 14459 14481 resolve-url-loader: 5.0.0 14460 14482 rxjs: 7.8.1 14461 14483 sass: 1.85.0 ··· 14468 14490 tslib: 2.8.1 14469 14491 typescript: 5.8.3 14470 14492 webpack: 5.98.0(esbuild@0.25.4) 14471 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 14493 + webpack-dev-middleware: 7.4.2(webpack@5.98.0) 14472 14494 webpack-dev-server: 5.2.2(webpack@5.98.0) 14473 14495 webpack-merge: 6.0.1 14474 14496 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) ··· 14556 14578 tslib: 2.8.1 14557 14579 typescript: 5.9.3 14558 14580 webpack: 5.98.0(esbuild@0.25.4) 14559 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 14581 + webpack-dev-middleware: 7.4.2(webpack@5.98.0) 14560 14582 webpack-dev-server: 5.2.2(webpack@5.98.0) 14561 14583 webpack-merge: 6.0.1 14562 14584 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) ··· 14588 14610 - webpack-cli 14589 14611 - yaml 14590 14612 14591 - '@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))': 14613 + '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0))': 14592 14614 dependencies: 14593 14615 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 14594 14616 rxjs: 7.8.1 14595 14617 webpack: 5.98.0(esbuild@0.25.0) 14596 - webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 14618 + webpack-dev-server: 5.2.0(webpack@5.98.0) 14597 14619 transitivePeerDependencies: 14598 14620 - chokidar 14599 14621 ··· 15230 15252 '@babel/traverse': 7.28.3 15231 15253 '@babel/types': 7.28.2 15232 15254 convert-source-map: 2.0.0 15233 - debug: 4.4.1 15255 + debug: 4.4.3 15234 15256 gensync: 1.0.0-beta.2 15235 15257 json5: 2.2.3 15236 15258 semver: 6.3.1 ··· 15250 15272 '@babel/traverse': 7.28.3 15251 15273 '@babel/types': 7.28.2 15252 15274 convert-source-map: 2.0.0 15253 - debug: 4.4.1 15275 + debug: 4.4.3 15254 15276 gensync: 1.0.0-beta.2 15255 15277 json5: 2.2.3 15256 15278 semver: 6.3.1 ··· 15261 15283 dependencies: 15262 15284 '@ampproject/remapping': 2.3.0 15263 15285 '@babel/code-frame': 7.27.1 15264 - '@babel/generator': 7.28.3 15286 + '@babel/generator': 7.28.5 15265 15287 '@babel/helper-compilation-targets': 7.27.2 15266 15288 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) 15267 15289 '@babel/helpers': 7.28.3 15268 - '@babel/parser': 7.28.3 15290 + '@babel/parser': 7.28.5 15269 15291 '@babel/template': 7.27.2 15270 15292 '@babel/traverse': 7.28.3 15271 - '@babel/types': 7.28.2 15293 + '@babel/types': 7.28.5 15272 15294 convert-source-map: 2.0.0 15273 - debug: 4.4.1 15295 + debug: 4.4.3 15274 15296 gensync: 1.0.0-beta.2 15275 15297 json5: 2.2.3 15276 15298 semver: 6.3.1 ··· 15293 15315 '@jridgewell/trace-mapping': 0.3.30 15294 15316 jsesc: 3.1.0 15295 15317 15296 - '@babel/generator@7.28.3': 15297 - dependencies: 15298 - '@babel/parser': 7.28.5 15299 - '@babel/types': 7.28.2 15300 - '@jridgewell/gen-mapping': 0.3.13 15301 - '@jridgewell/trace-mapping': 0.3.30 15302 - jsesc: 3.1.0 15303 - 15304 15318 '@babel/generator@7.28.5': 15305 15319 dependencies: 15306 15320 '@babel/parser': 7.28.5 ··· 15315 15329 15316 15330 '@babel/helper-annotate-as-pure@7.27.3': 15317 15331 dependencies: 15318 - '@babel/types': 7.28.2 15332 + '@babel/types': 7.28.5 15319 15333 15320 15334 '@babel/helper-compilation-targets@7.27.2': 15321 15335 dependencies: ··· 15412 15426 '@babel/helper-module-imports@7.27.1': 15413 15427 dependencies: 15414 15428 '@babel/traverse': 7.28.3 15415 - '@babel/types': 7.28.2 15429 + '@babel/types': 7.28.5 15416 15430 transitivePeerDependencies: 15417 15431 - supports-color 15418 15432 ··· 15420 15434 dependencies: 15421 15435 '@babel/core': 7.26.10 15422 15436 '@babel/helper-module-imports': 7.27.1 15423 - '@babel/helper-validator-identifier': 7.27.1 15437 + '@babel/helper-validator-identifier': 7.28.5 15424 15438 '@babel/traverse': 7.28.3 15425 15439 transitivePeerDependencies: 15426 15440 - supports-color ··· 15429 15443 dependencies: 15430 15444 '@babel/core': 7.26.9 15431 15445 '@babel/helper-module-imports': 7.27.1 15432 - '@babel/helper-validator-identifier': 7.27.1 15446 + '@babel/helper-validator-identifier': 7.28.5 15433 15447 '@babel/traverse': 7.28.3 15434 15448 transitivePeerDependencies: 15435 15449 - supports-color ··· 15438 15452 dependencies: 15439 15453 '@babel/core': 7.28.3 15440 15454 '@babel/helper-module-imports': 7.27.1 15441 - '@babel/helper-validator-identifier': 7.27.1 15455 + '@babel/helper-validator-identifier': 7.28.5 15442 15456 '@babel/traverse': 7.28.3 15443 15457 transitivePeerDependencies: 15444 15458 - supports-color ··· 15497 15511 '@babel/helper-skip-transparent-expression-wrappers@7.27.1': 15498 15512 dependencies: 15499 15513 '@babel/traverse': 7.28.3 15500 - '@babel/types': 7.28.2 15514 + '@babel/types': 7.28.5 15501 15515 transitivePeerDependencies: 15502 15516 - supports-color 15503 15517 ··· 15524 15538 '@babel/helpers@7.28.3': 15525 15539 dependencies: 15526 15540 '@babel/template': 7.27.2 15527 - '@babel/types': 7.28.2 15541 + '@babel/types': 7.28.5 15528 15542 15529 15543 '@babel/parser@7.28.3': 15530 15544 dependencies: 15531 - '@babel/types': 7.28.2 15545 + '@babel/types': 7.28.5 15532 15546 15533 15547 '@babel/parser@7.28.5': 15534 15548 dependencies: ··· 16537 16551 dependencies: 16538 16552 '@babel/core': 7.26.10 16539 16553 '@babel/helper-plugin-utils': 7.27.1 16540 - '@babel/types': 7.28.2 16554 + '@babel/types': 7.28.5 16541 16555 esutils: 2.0.3 16542 16556 16543 16557 '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.9)': 16544 16558 dependencies: 16545 16559 '@babel/core': 7.26.9 16546 16560 '@babel/helper-plugin-utils': 7.27.1 16547 - '@babel/types': 7.28.2 16561 + '@babel/types': 7.28.5 16548 16562 esutils: 2.0.3 16549 16563 16550 16564 '@babel/runtime@7.26.10': ··· 16563 16577 dependencies: 16564 16578 '@babel/code-frame': 7.27.1 16565 16579 '@babel/parser': 7.28.5 16566 - '@babel/types': 7.28.2 16580 + '@babel/types': 7.28.5 16567 16581 16568 16582 '@babel/traverse@7.28.3': 16569 16583 dependencies: 16570 16584 '@babel/code-frame': 7.27.1 16571 - '@babel/generator': 7.28.3 16585 + '@babel/generator': 7.28.5 16572 16586 '@babel/helper-globals': 7.28.0 16573 16587 '@babel/parser': 7.28.5 16574 16588 '@babel/template': 7.27.2 16575 - '@babel/types': 7.28.2 16589 + '@babel/types': 7.28.5 16576 16590 debug: 4.4.3 16577 16591 transitivePeerDependencies: 16578 16592 - supports-color ··· 16580 16594 '@babel/types@7.28.0': 16581 16595 dependencies: 16582 16596 '@babel/helper-string-parser': 7.27.1 16583 - '@babel/helper-validator-identifier': 7.27.1 16597 + '@babel/helper-validator-identifier': 7.28.5 16584 16598 16585 16599 '@babel/types@7.28.2': 16586 16600 dependencies: ··· 17328 17342 '@eslint/config-array@0.19.2': 17329 17343 dependencies: 17330 17344 '@eslint/object-schema': 2.1.6 17331 - debug: 4.4.1 17345 + debug: 4.4.3 17332 17346 minimatch: 3.1.2 17333 17347 transitivePeerDependencies: 17334 17348 - supports-color ··· 17344 17358 '@eslint/eslintrc@3.3.1': 17345 17359 dependencies: 17346 17360 ajv: 6.12.6 17347 - debug: 4.4.1 17361 + debug: 4.4.3 17348 17362 espree: 10.4.0 17349 17363 globals: 14.0.0 17350 17364 ignore: 5.3.2 ··· 18110 18124 18111 18125 '@nuxt/devalue@2.0.2': {} 18112 18126 18113 - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))': 18127 + '@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.43.1))': 18114 18128 dependencies: 18115 18129 '@nuxt/kit': 3.15.4(magicast@0.3.5) 18116 18130 '@nuxt/schema': 3.16.2 18117 18131 execa: 7.2.0 18118 - vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 18132 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) 18119 18133 transitivePeerDependencies: 18120 18134 - magicast 18121 18135 - supports-color 18122 18136 18123 - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': 18137 + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))': 18124 18138 dependencies: 18125 18139 '@nuxt/kit': 3.15.4(magicast@0.3.5) 18126 18140 '@nuxt/schema': 3.16.2 18127 18141 execa: 7.2.0 18128 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 18142 + vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 18129 18143 transitivePeerDependencies: 18130 18144 - magicast 18131 18145 - supports-color 18132 18146 18133 - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))': 18147 + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': 18134 18148 dependencies: 18135 18149 '@nuxt/kit': 3.15.4(magicast@0.3.5) 18136 18150 '@nuxt/schema': 3.16.2 18137 18151 execa: 7.2.0 18138 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 18152 + vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 18139 18153 transitivePeerDependencies: 18140 18154 - magicast 18141 18155 - supports-color ··· 18200 18214 - utf-8-validate 18201 18215 - vue 18202 18216 18203 - '@nuxt/devtools@1.7.0(rollup@4.50.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 18217 + '@nuxt/devtools@1.7.0(rollup@4.50.0)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1))(vue@3.5.23(typescript@5.9.3))': 18204 18218 dependencies: 18205 18219 '@antfu/utils': 0.7.10 18206 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18220 + '@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.43.1)) 18207 18221 '@nuxt/devtools-wizard': 1.7.0 18208 18222 '@nuxt/kit': 3.15.4(magicast@0.3.5) 18209 - '@vue/devtools-core': 7.6.8(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3)) 18223 + '@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.43.1))(vue@3.5.23(typescript@5.9.3)) 18210 18224 '@vue/devtools-kit': 7.6.8 18211 18225 birpc: 0.2.19 18212 18226 consola: 3.4.2 ··· 18235 18249 sirv: 3.0.2 18236 18250 tinyglobby: 0.2.15 18237 18251 unimport: 3.14.6(rollup@4.50.0) 18238 - vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 18239 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18240 - vite-plugin-vue-inspector: 5.3.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18252 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) 18253 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) 18254 + vite-plugin-vue-inspector: 5.3.2(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) 18241 18255 which: 3.0.1 18242 18256 ws: 8.18.3 18243 18257 transitivePeerDependencies: ··· 18247 18261 - utf-8-validate 18248 18262 - vue 18249 18263 18250 - '@nuxt/devtools@1.7.0(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 18264 + '@nuxt/devtools@1.7.0(rollup@4.50.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 18251 18265 dependencies: 18252 18266 '@antfu/utils': 0.7.10 18253 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 18267 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18254 18268 '@nuxt/devtools-wizard': 1.7.0 18255 18269 '@nuxt/kit': 3.15.4(magicast@0.3.5) 18256 - '@vue/devtools-core': 7.6.8(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3)) 18270 + '@vue/devtools-core': 7.6.8(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3)) 18257 18271 '@vue/devtools-kit': 7.6.8 18258 18272 birpc: 0.2.19 18259 18273 consola: 3.4.2 ··· 18282 18296 sirv: 3.0.2 18283 18297 tinyglobby: 0.2.15 18284 18298 unimport: 3.14.6(rollup@4.50.0) 18285 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 18286 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 18287 - vite-plugin-vue-inspector: 5.3.2(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 18299 + vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 18300 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18301 + vite-plugin-vue-inspector: 5.3.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18288 18302 which: 3.0.1 18289 18303 ws: 8.18.3 18290 18304 transitivePeerDependencies: ··· 18294 18308 - utf-8-validate 18295 18309 - vue 18296 18310 18297 - '@nuxt/devtools@1.7.0(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 18311 + '@nuxt/devtools@1.7.0(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 18298 18312 dependencies: 18299 18313 '@antfu/utils': 0.7.10 18300 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18314 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 18301 18315 '@nuxt/devtools-wizard': 1.7.0 18302 18316 '@nuxt/kit': 3.15.4(magicast@0.3.5) 18303 - '@vue/devtools-core': 7.6.8(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3)) 18317 + '@vue/devtools-core': 7.6.8(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3)) 18304 18318 '@vue/devtools-kit': 7.6.8 18305 18319 birpc: 0.2.19 18306 18320 consola: 3.4.2 ··· 18329 18343 sirv: 3.0.2 18330 18344 tinyglobby: 0.2.15 18331 18345 unimport: 3.14.6(rollup@4.50.0) 18332 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 18333 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18334 - vite-plugin-vue-inspector: 5.3.2(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 18346 + vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 18347 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 18348 + vite-plugin-vue-inspector: 5.3.2(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 18335 18349 which: 3.0.1 18336 18350 ws: 8.18.3 18337 18351 transitivePeerDependencies: ··· 18430 18444 errx: 0.1.0 18431 18445 exsolve: 1.0.7 18432 18446 ignore: 7.0.5 18433 - jiti: 2.5.1 18447 + jiti: 2.6.1 18434 18448 klona: 2.0.6 18435 18449 knitwork: 1.2.0 18436 18450 mlly: 1.8.0 ··· 18440 18454 scule: 1.3.0 18441 18455 semver: 7.7.2 18442 18456 std-env: 3.9.0 18443 - tinyglobby: 0.2.14 18457 + tinyglobby: 0.2.15 18444 18458 ufo: 1.6.1 18445 18459 unctx: 2.4.1 18446 18460 unimport: 5.2.0 ··· 18557 18571 tinyexec: 0.3.2 18558 18572 ufo: 1.6.1 18559 18573 unplugin: 2.3.10 18560 - vite: 6.3.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 18574 + vite: 6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 18561 18575 vitest-environment-nuxt: 1.0.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jiti@2.6.1)(jsdom@23.0.0)(less@4.2.2)(magicast@0.3.5)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.10.5)(jiti@2.6.1)(jsdom@23.0.0)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) 18562 18576 vue: 3.5.23(typescript@5.9.3) 18563 18577 optionalDependencies: ··· 20062 20076 '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)))(svelte@5.19.9)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))': 20063 20077 dependencies: 20064 20078 '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 20065 - debug: 4.4.1 20079 + debug: 4.4.3 20066 20080 svelte: 5.19.9 20067 20081 vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 20068 20082 transitivePeerDependencies: ··· 20176 20190 20177 20191 '@types/babel__core@7.20.5': 20178 20192 dependencies: 20179 - '@babel/parser': 7.28.3 20180 - '@babel/types': 7.28.2 20193 + '@babel/parser': 7.28.5 20194 + '@babel/types': 7.28.5 20181 20195 '@types/babel__generator': 7.27.0 20182 20196 '@types/babel__template': 7.4.4 20183 20197 '@types/babel__traverse': 7.28.0 20184 20198 20185 20199 '@types/babel__generator@7.27.0': 20186 20200 dependencies: 20187 - '@babel/types': 7.28.2 20201 + '@babel/types': 7.28.5 20188 20202 20189 20203 '@types/babel__template@7.4.4': 20190 20204 dependencies: 20191 20205 '@babel/parser': 7.28.5 20192 - '@babel/types': 7.28.2 20206 + '@babel/types': 7.28.5 20193 20207 20194 20208 '@types/babel__traverse@7.28.0': 20195 20209 dependencies: 20196 - '@babel/types': 7.28.2 20210 + '@babel/types': 7.28.5 20197 20211 20198 20212 '@types/body-parser@1.19.6': 20199 20213 dependencies: ··· 20448 20462 '@typescript-eslint/types': 8.29.1 20449 20463 '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) 20450 20464 '@typescript-eslint/visitor-keys': 8.29.1 20451 - debug: 4.4.1 20465 + debug: 4.4.3 20452 20466 eslint: 9.17.0(jiti@2.6.1) 20453 20467 typescript: 5.8.3 20454 20468 transitivePeerDependencies: ··· 20460 20474 '@typescript-eslint/types': 8.29.1 20461 20475 '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.9.3) 20462 20476 '@typescript-eslint/visitor-keys': 8.29.1 20463 - debug: 4.4.1 20477 + debug: 4.4.3 20464 20478 eslint: 9.17.0(jiti@2.6.1) 20465 20479 typescript: 5.9.3 20466 20480 transitivePeerDependencies: ··· 20493 20507 dependencies: 20494 20508 '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) 20495 20509 '@typescript-eslint/utils': 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) 20496 - debug: 4.4.1 20510 + debug: 4.4.3 20497 20511 eslint: 9.17.0(jiti@2.6.1) 20498 20512 ts-api-utils: 2.1.0(typescript@5.8.3) 20499 20513 typescript: 5.8.3 ··· 20504 20518 dependencies: 20505 20519 '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.9.3) 20506 20520 '@typescript-eslint/utils': 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.9.3) 20507 - debug: 4.4.1 20521 + debug: 4.4.3 20508 20522 eslint: 9.17.0(jiti@2.6.1) 20509 20523 ts-api-utils: 2.1.0(typescript@5.9.3) 20510 20524 typescript: 5.9.3 ··· 20535 20549 dependencies: 20536 20550 '@typescript-eslint/types': 8.29.1 20537 20551 '@typescript-eslint/visitor-keys': 8.29.1 20538 - debug: 4.4.1 20552 + debug: 4.4.3 20539 20553 fast-glob: 3.3.3 20540 20554 is-glob: 4.0.3 20541 20555 minimatch: 9.0.5 ··· 20549 20563 dependencies: 20550 20564 '@typescript-eslint/types': 8.29.1 20551 20565 '@typescript-eslint/visitor-keys': 8.29.1 20552 - debug: 4.4.1 20566 + debug: 4.4.3 20553 20567 fast-glob: 3.3.3 20554 20568 is-glob: 4.0.3 20555 20569 minimatch: 9.0.5 ··· 20577 20591 20578 20592 '@typescript-eslint/utils@5.62.0(eslint@9.17.0(jiti@2.6.1))(typescript@5.9.3)': 20579 20593 dependencies: 20580 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.17.0(jiti@2.6.1)) 20594 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.17.0(jiti@2.6.1)) 20581 20595 '@types/json-schema': 7.0.15 20582 20596 '@types/semver': 7.7.1 20583 20597 '@typescript-eslint/scope-manager': 5.62.0 ··· 20592 20606 20593 20607 '@typescript-eslint/utils@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3)': 20594 20608 dependencies: 20595 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.17.0(jiti@2.6.1)) 20609 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.17.0(jiti@2.6.1)) 20596 20610 '@typescript-eslint/scope-manager': 8.29.1 20597 20611 '@typescript-eslint/types': 8.29.1 20598 20612 '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) ··· 20603 20617 20604 20618 '@typescript-eslint/utils@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.9.3)': 20605 20619 dependencies: 20606 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.17.0(jiti@2.6.1)) 20620 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.17.0(jiti@2.6.1)) 20607 20621 '@typescript-eslint/scope-manager': 8.29.1 20608 20622 '@typescript-eslint/types': 8.29.1 20609 20623 '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.9.3) ··· 20851 20865 chai: 5.3.3 20852 20866 tinyrainbow: 2.0.0 20853 20867 20854 - '@vitest/mocker@3.1.1(vite@6.3.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))': 20868 + '@vitest/mocker@3.1.1(vite@6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))': 20855 20869 dependencies: 20856 20870 '@vitest/spy': 3.1.1 20857 20871 estree-walker: 3.0.3 20858 20872 magic-string: 0.30.18 20859 20873 optionalDependencies: 20860 - vite: 6.3.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 20874 + vite: 6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 20861 20875 20862 20876 '@vitest/mocker@3.2.4(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))': 20863 20877 dependencies: ··· 21079 21093 dependencies: 21080 21094 '@vue/devtools-kit': 8.0.3 21081 21095 21082 - '@vue/devtools-core@7.6.8(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 21096 + '@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.43.1))(vue@3.5.23(typescript@5.9.3))': 21083 21097 dependencies: 21084 21098 '@vue/devtools-kit': 7.7.7 21085 21099 '@vue/devtools-shared': 7.7.7 21086 21100 mitt: 3.0.1 21087 21101 nanoid: 5.1.5 21088 21102 pathe: 1.1.2 21089 - vite-hot-client: 0.2.4(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 21103 + 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.43.1)) 21090 21104 vue: 3.5.23(typescript@5.9.3) 21091 21105 transitivePeerDependencies: 21092 21106 - vite 21093 21107 21094 - '@vue/devtools-core@7.6.8(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 21108 + '@vue/devtools-core@7.6.8(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 21095 21109 dependencies: 21096 21110 '@vue/devtools-kit': 7.7.7 21097 21111 '@vue/devtools-shared': 7.7.7 21098 21112 mitt: 3.0.1 21099 21113 nanoid: 5.1.5 21100 21114 pathe: 1.1.2 21101 - vite-hot-client: 0.2.4(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 21115 + vite-hot-client: 0.2.4(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 21102 21116 vue: 3.5.23(typescript@5.9.3) 21103 21117 transitivePeerDependencies: 21104 21118 - vite 21105 21119 21106 - '@vue/devtools-core@7.6.8(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 21120 + '@vue/devtools-core@7.6.8(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3))': 21107 21121 dependencies: 21108 21122 '@vue/devtools-kit': 7.7.7 21109 21123 '@vue/devtools-shared': 7.7.7 21110 21124 mitt: 3.0.1 21111 21125 nanoid: 5.1.5 21112 21126 pathe: 1.1.2 21113 - vite-hot-client: 0.2.4(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 21127 + vite-hot-client: 0.2.4(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) 21114 21128 vue: 3.5.23(typescript@5.9.3) 21115 21129 transitivePeerDependencies: 21116 21130 - vite ··· 21743 21757 21744 21758 axios@1.8.2: 21745 21759 dependencies: 21746 - follow-redirects: 1.15.11(debug@4.4.1) 21760 + follow-redirects: 1.15.11(debug@4.4.3) 21747 21761 form-data: 4.0.4 21748 21762 proxy-from-env: 1.1.0 21749 21763 transitivePeerDependencies: ··· 21760 21774 schema-utils: 4.3.2 21761 21775 webpack: 5.98.0(esbuild@0.25.0) 21762 21776 21763 - babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.98.0): 21777 + babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)): 21764 21778 dependencies: 21765 21779 '@babel/core': 7.26.9 21766 21780 find-cache-dir: 4.0.0 ··· 21968 21982 defu: 6.1.4 21969 21983 dotenv: 16.6.1 21970 21984 giget: 1.2.5 21971 - jiti: 2.5.1 21985 + jiti: 2.6.1 21972 21986 mlly: 1.8.0 21973 21987 ohash: 1.1.6 21974 21988 pathe: 1.1.2 ··· 21986 22000 dotenv: 17.2.3 21987 22001 exsolve: 1.0.7 21988 22002 giget: 2.0.0 21989 - jiti: 2.5.1 22003 + jiti: 2.6.1 21990 22004 ohash: 2.0.11 21991 22005 pathe: 2.0.3 21992 22006 perfect-debounce: 1.0.0 ··· 23189 23203 '@typescript-eslint/parser': 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) 23190 23204 eslint: 9.17.0(jiti@2.6.1) 23191 23205 eslint-import-resolver-node: 0.3.9 23192 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23193 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23206 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)) 23207 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) 23194 23208 eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@2.6.1)) 23195 23209 eslint-plugin-react: 7.37.5(eslint@9.17.0(jiti@2.6.1)) 23196 23210 eslint-plugin-react-hooks: 5.2.0(eslint@9.17.0(jiti@2.6.1)) ··· 23217 23231 transitivePeerDependencies: 23218 23232 - supports-color 23219 23233 23220 - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): 23234 + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)): 23221 23235 dependencies: 23222 23236 '@nolyfill/is-core-module': 1.0.39 23223 - debug: 4.4.1 23237 + debug: 4.4.3 23224 23238 eslint: 9.17.0(jiti@2.6.1) 23225 23239 get-tsconfig: 4.10.1 23226 23240 is-bun-module: 2.0.0 23227 23241 stable-hash: 0.0.5 23228 - tinyglobby: 0.2.14 23242 + tinyglobby: 0.2.15 23229 23243 unrs-resolver: 1.11.1 23230 23244 optionalDependencies: 23231 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23245 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) 23232 23246 transitivePeerDependencies: 23233 23247 - supports-color 23234 23248 23235 - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): 23249 + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)): 23236 23250 dependencies: 23237 23251 debug: 3.2.7 23238 23252 optionalDependencies: 23239 23253 '@typescript-eslint/parser': 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) 23240 23254 eslint: 9.17.0(jiti@2.6.1) 23241 23255 eslint-import-resolver-node: 0.3.9 23242 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23256 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)) 23243 23257 transitivePeerDependencies: 23244 23258 - supports-color 23245 23259 23246 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): 23260 + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)): 23247 23261 dependencies: 23248 23262 '@rtsao/scc': 1.1.0 23249 23263 array-includes: 3.1.9 ··· 23254 23268 doctrine: 2.1.0 23255 23269 eslint: 9.17.0(jiti@2.6.1) 23256 23270 eslint-import-resolver-node: 0.3.9 23257 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23271 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) 23258 23272 hasown: 2.0.2 23259 23273 is-core-module: 2.16.1 23260 23274 is-glob: 4.0.3 ··· 23431 23445 ajv: 6.12.6 23432 23446 chalk: 4.1.2 23433 23447 cross-spawn: 7.0.6 23434 - debug: 4.4.1 23448 + debug: 4.4.3 23435 23449 escape-string-regexp: 4.0.0 23436 23450 eslint-scope: 8.4.0 23437 23451 eslint-visitor-keys: 4.2.1 ··· 23847 23861 dependencies: 23848 23862 tabbable: 6.2.0 23849 23863 23850 - follow-redirects@1.15.11(debug@4.4.1): 23864 + follow-redirects@1.15.11(debug@4.4.3): 23851 23865 optionalDependencies: 23852 - debug: 4.4.1 23866 + debug: 4.4.3 23853 23867 23854 23868 for-each@0.3.5: 23855 23869 dependencies: ··· 24243 24257 http-proxy-agent@7.0.2: 24244 24258 dependencies: 24245 24259 agent-base: 7.1.4 24246 - debug: 4.4.1 24260 + debug: 4.4.3 24247 24261 transitivePeerDependencies: 24248 24262 - supports-color 24249 24263 24250 24264 http-proxy-middleware@2.0.9(@types/express@4.17.21): 24251 24265 dependencies: 24252 24266 '@types/http-proxy': 1.17.16 24253 - http-proxy: 1.18.1(debug@4.4.1) 24267 + http-proxy: 1.18.1(debug@4.4.3) 24254 24268 is-glob: 4.0.3 24255 24269 is-plain-obj: 3.0.0 24256 24270 micromatch: 4.0.8 ··· 24262 24276 http-proxy-middleware@3.0.3: 24263 24277 dependencies: 24264 24278 '@types/http-proxy': 1.17.16 24265 - debug: 4.4.1 24266 - http-proxy: 1.18.1(debug@4.4.1) 24279 + debug: 4.4.3 24280 + http-proxy: 1.18.1(debug@4.4.3) 24267 24281 is-glob: 4.0.3 24268 24282 is-plain-object: 5.0.0 24269 24283 micromatch: 4.0.8 ··· 24273 24287 http-proxy-middleware@3.0.5: 24274 24288 dependencies: 24275 24289 '@types/http-proxy': 1.17.16 24276 - debug: 4.4.1 24277 - http-proxy: 1.18.1(debug@4.4.1) 24290 + debug: 4.4.3 24291 + http-proxy: 1.18.1(debug@4.4.3) 24278 24292 is-glob: 4.0.3 24279 24293 is-plain-object: 5.0.0 24280 24294 micromatch: 4.0.8 24281 24295 transitivePeerDependencies: 24282 24296 - supports-color 24283 24297 24284 - http-proxy@1.18.1(debug@4.4.1): 24298 + http-proxy@1.18.1(debug@4.4.3): 24285 24299 dependencies: 24286 24300 eventemitter3: 4.0.7 24287 - follow-redirects: 1.15.11(debug@4.4.1) 24301 + follow-redirects: 1.15.11(debug@4.4.3) 24288 24302 requires-port: 1.0.0 24289 24303 transitivePeerDependencies: 24290 24304 - debug ··· 24294 24308 https-proxy-agent@7.0.6: 24295 24309 dependencies: 24296 24310 agent-base: 7.1.4 24297 - debug: 4.4.1 24311 + debug: 4.4.3 24298 24312 transitivePeerDependencies: 24299 24313 - supports-color 24300 24314 ··· 24675 24689 24676 24690 istanbul-lib-source-maps@4.0.1: 24677 24691 dependencies: 24678 - debug: 4.4.1 24692 + debug: 4.4.3 24679 24693 istanbul-lib-coverage: 3.2.2 24680 24694 source-map: 0.6.1 24681 24695 transitivePeerDependencies: ··· 24684 24698 istanbul-lib-source-maps@5.0.6: 24685 24699 dependencies: 24686 24700 '@jridgewell/trace-mapping': 0.3.30 24687 - debug: 4.4.1 24701 + debug: 4.4.3 24688 24702 istanbul-lib-coverage: 3.2.2 24689 24703 transitivePeerDependencies: 24690 24704 - supports-color ··· 24880 24894 dom-serialize: 2.2.1 24881 24895 glob: 7.2.3 24882 24896 graceful-fs: 4.2.11 24883 - http-proxy: 1.18.1(debug@4.4.1) 24897 + http-proxy: 1.18.1(debug@4.4.3) 24884 24898 isbinaryfile: 4.0.10 24885 24899 lodash: 4.17.21 24886 24900 log4js: 6.9.1 ··· 25125 25139 log4js@6.9.1: 25126 25140 dependencies: 25127 25141 date-format: 4.0.14 25128 - debug: 4.4.1 25142 + debug: 4.4.3 25129 25143 flatted: 3.3.3 25130 25144 rfdc: 1.4.1 25131 25145 streamroller: 3.1.5 ··· 26238 26252 - vue-tsc 26239 26253 - xml2js 26240 26254 26241 - nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.45)(rollup@4.50.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 26255 + nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.45)(rollup@4.50.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)): 26242 26256 dependencies: 26243 26257 '@nuxt/devalue': 2.0.2 26244 - '@nuxt/devtools': 1.7.0(rollup@4.50.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3)) 26258 + '@nuxt/devtools': 1.7.0(rollup@4.50.0)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1))(vue@3.5.23(typescript@5.9.3)) 26245 26259 '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.50.0) 26246 26260 '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.50.0) 26247 26261 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) ··· 26297 26311 unhead: 1.11.20 26298 26312 unimport: 3.14.6(rollup@4.50.0) 26299 26313 unplugin: 1.16.1 26300 - unplugin-vue-router: 0.10.9(rollup@4.50.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.9.3)))(vue@3.5.23(typescript@5.9.3)) 26314 + unplugin-vue-router: 0.10.9(rollup@4.50.0)(vue-router@4.5.0(vue@3.5.23(typescript@5.9.3)))(vue@3.5.23(typescript@5.9.3)) 26301 26315 unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) 26302 26316 untyped: 1.5.2 26303 26317 vue: 3.5.23(typescript@5.9.3) ··· 26359 26373 - vue-tsc 26360 26374 - xml2js 26361 26375 26362 - nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.45)(rollup@4.50.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 26376 + nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.45)(rollup@4.50.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 26363 26377 dependencies: 26364 26378 '@nuxt/devalue': 2.0.2 26365 - '@nuxt/devtools': 1.7.0(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3)) 26379 + '@nuxt/devtools': 1.7.0(rollup@4.50.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.23(typescript@5.9.3)) 26366 26380 '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.50.0) 26367 26381 '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.50.0) 26368 26382 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) ··· 26418 26432 unhead: 1.11.20 26419 26433 unimport: 3.14.6(rollup@4.50.0) 26420 26434 unplugin: 1.16.1 26421 - unplugin-vue-router: 0.10.9(rollup@4.50.0)(vue-router@4.5.0(vue@3.5.23(typescript@5.9.3)))(vue@3.5.23(typescript@5.9.3)) 26435 + unplugin-vue-router: 0.10.9(rollup@4.50.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.9.3)))(vue@3.5.23(typescript@5.9.3)) 26422 26436 unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) 26423 26437 untyped: 1.5.2 26424 26438 vue: 3.5.23(typescript@5.9.3) ··· 26995 27009 ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.9.3) 26996 27010 optional: true 26997 27011 26998 - postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0): 27012 + postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)): 26999 27013 dependencies: 27000 27014 cosmiconfig: 9.0.0(typescript@5.8.3) 27001 27015 jiti: 1.21.7 ··· 28721 28735 fdir: 6.5.0(picomatch@4.0.3) 28722 28736 picomatch: 4.0.3 28723 28737 28724 - tinyglobby@0.2.14: 28725 - dependencies: 28726 - fdir: 6.5.0(picomatch@4.0.3) 28727 - picomatch: 4.0.3 28728 - 28729 28738 tinyglobby@0.2.15: 28730 28739 dependencies: 28731 28740 fdir: 6.5.0(picomatch@4.0.3) ··· 29159 29168 pkg-types: 2.3.0 29160 29169 scule: 1.3.0 29161 29170 strip-literal: 3.0.0 29162 - tinyglobby: 0.2.14 29171 + tinyglobby: 0.2.15 29163 29172 unplugin: 2.3.10 29164 29173 unplugin-utils: 0.2.5 29165 29174 ··· 29374 29383 '@babel/types': 7.28.2 29375 29384 citty: 0.1.6 29376 29385 defu: 6.1.4 29377 - jiti: 2.5.1 29386 + jiti: 2.6.1 29378 29387 knitwork: 1.2.0 29379 29388 scule: 1.3.0 29380 29389 transitivePeerDependencies: ··· 29384 29393 dependencies: 29385 29394 citty: 0.1.6 29386 29395 defu: 6.1.4 29387 - jiti: 2.5.1 29396 + jiti: 2.6.1 29388 29397 knitwork: 1.2.0 29389 29398 scule: 1.3.0 29390 29399 ··· 29478 29487 vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29479 29488 vite-hot-client: 2.1.0(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 29480 29489 29490 + 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.43.1)): 29491 + dependencies: 29492 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) 29493 + 29481 29494 vite-hot-client@0.2.4(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29482 29495 dependencies: 29483 29496 vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) ··· 29486 29499 dependencies: 29487 29500 vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 29488 29501 29489 - vite-hot-client@0.2.4(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29490 - dependencies: 29491 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29492 - 29493 29502 vite-hot-client@2.1.0(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29494 29503 dependencies: 29495 29504 vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) ··· 29533 29542 vite-node@3.1.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1): 29534 29543 dependencies: 29535 29544 cac: 6.7.14 29536 - debug: 4.4.1 29545 + debug: 4.4.3 29537 29546 es-module-lexer: 1.7.0 29538 29547 pathe: 2.0.3 29539 - vite: 6.3.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29548 + vite: 6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29540 29549 transitivePeerDependencies: 29541 29550 - '@types/node' 29542 29551 - jiti ··· 29554 29563 vite-node@3.2.4(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1): 29555 29564 dependencies: 29556 29565 cac: 6.7.14 29557 - debug: 4.4.1 29566 + debug: 4.4.3 29558 29567 es-module-lexer: 1.7.0 29559 29568 pathe: 2.0.3 29560 29569 vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) ··· 29634 29643 - rollup 29635 29644 - supports-color 29636 29645 29637 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29646 + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)): 29638 29647 dependencies: 29639 29648 '@antfu/utils': 0.7.10 29640 29649 '@rollup/pluginutils': 5.2.0(rollup@4.50.0) ··· 29645 29654 perfect-debounce: 1.0.0 29646 29655 picocolors: 1.1.1 29647 29656 sirv: 3.0.2 29648 - vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29657 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) 29649 29658 optionalDependencies: 29650 29659 '@nuxt/kit': 3.15.4(magicast@0.3.5) 29651 29660 transitivePeerDependencies: 29652 29661 - rollup 29653 29662 - supports-color 29654 29663 29655 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): 29664 + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29656 29665 dependencies: 29657 29666 '@antfu/utils': 0.7.10 29658 29667 '@rollup/pluginutils': 5.2.0(rollup@4.50.0) ··· 29663 29672 perfect-debounce: 1.0.0 29664 29673 picocolors: 1.1.1 29665 29674 sirv: 3.0.2 29666 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 29675 + vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29667 29676 optionalDependencies: 29668 29677 '@nuxt/kit': 3.15.4(magicast@0.3.5) 29669 29678 transitivePeerDependencies: 29670 29679 - rollup 29671 29680 - supports-color 29672 29681 29673 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29682 + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.50.0)(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): 29674 29683 dependencies: 29675 29684 '@antfu/utils': 0.7.10 29676 29685 '@rollup/pluginutils': 5.2.0(rollup@4.50.0) ··· 29681 29690 perfect-debounce: 1.0.0 29682 29691 picocolors: 1.1.1 29683 29692 sirv: 3.0.2 29684 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29693 + vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 29685 29694 optionalDependencies: 29686 29695 '@nuxt/kit': 3.15.4(magicast@0.3.5) 29687 29696 transitivePeerDependencies: ··· 29691 29700 vite-plugin-inspect@11.3.3(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29692 29701 dependencies: 29693 29702 ansis: 4.1.0 29694 - debug: 4.4.1 29703 + debug: 4.4.3 29695 29704 error-stack-parser-es: 1.0.5 29696 29705 ohash: 2.0.11 29697 29706 open: 10.2.0 ··· 29718 29727 - supports-color 29719 29728 - vue 29720 29729 29721 - vite-plugin-vue-inspector@5.3.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29730 + vite-plugin-vue-inspector@5.3.2(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)): 29722 29731 dependencies: 29723 29732 '@babel/core': 7.28.3 29724 29733 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) ··· 29729 29738 '@vue/compiler-dom': 3.5.21 29730 29739 kolorist: 1.8.0 29731 29740 magic-string: 0.30.18 29732 - vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29741 + vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) 29733 29742 transitivePeerDependencies: 29734 29743 - supports-color 29735 29744 29736 - vite-plugin-vue-inspector@5.3.2(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): 29745 + vite-plugin-vue-inspector@5.3.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29737 29746 dependencies: 29738 29747 '@babel/core': 7.28.3 29739 29748 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) ··· 29744 29753 '@vue/compiler-dom': 3.5.21 29745 29754 kolorist: 1.8.0 29746 29755 magic-string: 0.30.18 29747 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 29756 + vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29748 29757 transitivePeerDependencies: 29749 29758 - supports-color 29750 29759 29751 - vite-plugin-vue-inspector@5.3.2(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)): 29760 + vite-plugin-vue-inspector@5.3.2(vite@7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): 29752 29761 dependencies: 29753 29762 '@babel/core': 7.28.3 29754 29763 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) ··· 29759 29768 '@vue/compiler-dom': 3.5.21 29760 29769 kolorist: 1.8.0 29761 29770 magic-string: 0.30.18 29762 - vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 29771 + vite: 7.1.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) 29763 29772 transitivePeerDependencies: 29764 29773 - supports-color 29765 29774 ··· 29815 29824 terser: 5.39.0 29816 29825 yaml: 2.8.1 29817 29826 29818 - vite@6.3.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1): 29827 + vite@6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1): 29819 29828 dependencies: 29820 29829 esbuild: 0.25.9 29821 29830 fdir: 6.5.0(picomatch@4.0.3) ··· 29829 29838 jiti: 2.6.1 29830 29839 less: 4.2.2 29831 29840 sass: 1.85.0 29832 - terser: 5.43.1 29841 + terser: 5.39.0 29833 29842 yaml: 2.8.1 29834 29843 29835 - vite@6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1): 29844 + vite@6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1): 29836 29845 dependencies: 29837 29846 esbuild: 0.25.9 29838 29847 fdir: 6.5.0(picomatch@4.0.3) ··· 29846 29855 jiti: 2.6.1 29847 29856 less: 4.2.2 29848 29857 sass: 1.85.0 29849 - terser: 5.39.0 29858 + terser: 5.43.1 29850 29859 yaml: 2.8.1 29851 29860 29852 29861 vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1): ··· 30001 30010 vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.10.5)(jiti@2.6.1)(jsdom@23.0.0)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1): 30002 30011 dependencies: 30003 30012 '@vitest/expect': 3.1.1 30004 - '@vitest/mocker': 3.1.1(vite@6.3.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 30013 + '@vitest/mocker': 3.1.1(vite@6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1)) 30005 30014 '@vitest/pretty-format': 3.2.4 30006 30015 '@vitest/runner': 3.1.1 30007 30016 '@vitest/snapshot': 3.1.1 ··· 30017 30026 tinyexec: 0.3.2 30018 30027 tinypool: 1.1.1 30019 30028 tinyrainbow: 2.0.0 30020 - vite: 6.3.5(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 30029 + vite: 6.4.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 30021 30030 vite-node: 3.1.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.1) 30022 30031 why-is-node-running: 2.3.0 30023 30032 optionalDependencies: ··· 30124 30133 30125 30134 vue-eslint-parser@9.4.3(eslint@9.17.0(jiti@2.6.1)): 30126 30135 dependencies: 30127 - debug: 4.4.1 30136 + debug: 4.4.3 30128 30137 eslint: 9.17.0(jiti@2.6.1) 30129 30138 eslint-scope: 7.2.2 30130 30139 eslint-visitor-keys: 3.4.3 ··· 30223 30232 30224 30233 webidl-conversions@7.0.0: {} 30225 30234 30226 - webpack-dev-middleware@7.4.2(webpack@5.98.0(esbuild@0.25.0)): 30235 + webpack-dev-middleware@7.4.2(webpack@5.98.0): 30227 30236 dependencies: 30228 30237 colorette: 2.0.20 30229 30238 memfs: 4.38.2 ··· 30234 30243 optionalDependencies: 30235 30244 webpack: 5.98.0(esbuild@0.25.0) 30236 30245 30237 - webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)): 30246 + webpack-dev-server@5.2.0(webpack@5.98.0): 30238 30247 dependencies: 30239 30248 '@types/bonjour': 3.5.13 30240 30249 '@types/connect-history-api-fallback': 1.5.4 ··· 30261 30270 serve-index: 1.9.1 30262 30271 sockjs: 0.3.24 30263 30272 spdy: 4.0.2 30264 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 30273 + webpack-dev-middleware: 7.4.2(webpack@5.98.0) 30265 30274 ws: 8.18.3 30266 30275 optionalDependencies: 30267 30276 webpack: 5.98.0(esbuild@0.25.0) ··· 30299 30308 serve-index: 1.9.1 30300 30309 sockjs: 0.3.24 30301 30310 spdy: 4.0.2 30302 - webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 30311 + webpack-dev-middleware: 7.4.2(webpack@5.98.0) 30303 30312 ws: 8.18.3 30304 30313 optionalDependencies: 30305 30314 webpack: 5.98.0(esbuild@0.25.0)