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

Merge pull request #1600 from hey-api/refactor/client-bundle-index

fix: bundle clients from compiled index file

authored by

Lubos and committed by
GitHub
1b73773e 7eebbefb

+2046 -4735
+8
.changeset/eight-squids-crash.md
··· 1 + --- 2 + '@hey-api/client-axios': patch 3 + '@hey-api/client-fetch': patch 4 + '@hey-api/client-nuxt': patch 5 + '@hey-api/openapi-ts': patch 6 + --- 7 + 8 + fix: bundle clients from compiled index file
+1 -2
examples/openapi-ts-sample/openapi-ts.config.ts
··· 2 2 3 3 export default defineConfig({ 4 4 client: '@hey-api/client-fetch', 5 - input: 6 - '../../packages/openapi-ts/test/spec/2.0.x/body-response-text-plain.yaml', 5 + input: '../../packages/openapi-ts/test/spec/3.1.x/body-nested-array.yaml', 7 6 output: { 8 7 format: 'prettier', 9 8 lint: 'eslint',
+3 -1
examples/openapi-ts-sample/src/App.tsx
··· 14 14 function App() { 15 15 const onClick = async () => { 16 16 postFoo({ 17 - body: 'foo', 17 + body: { 18 + foo: [[1, 2]], 19 + }, 18 20 }); 19 21 }; 20 22
+5 -4
examples/openapi-ts-sample/src/client/sdk.gen.ts
··· 3 3 import { 4 4 createClient, 5 5 createConfig, 6 + formDataBodySerializer, 6 7 type Options, 7 8 } from '@hey-api/client-fetch'; 8 9 9 - import type { PostFooData, PostFooResponse } from './types.gen'; 10 + import type { PostFooData } from './types.gen'; 10 11 11 12 export const client = createClient(createConfig()); 12 13 13 14 export const postFoo = <ThrowOnError extends boolean = false>( 14 15 options: Options<PostFooData, ThrowOnError>, 15 16 ) => 16 - (options?.client ?? client).post<PostFooResponse, unknown, ThrowOnError>({ 17 - bodySerializer: null, 17 + (options?.client ?? client).post<unknown, unknown, ThrowOnError>({ 18 + ...formDataBodySerializer, 18 19 url: '/foo', 19 20 ...options, 20 21 headers: { 21 - 'Content-Type': 'text/plain', 22 + 'Content-Type': null, 22 23 ...options?.headers, 23 24 }, 24 25 });
+4 -4
examples/openapi-ts-sample/src/client/types.gen.ts
··· 1 1 // This file is auto-generated by @hey-api/openapi-ts 2 2 3 3 export type PostFooData = { 4 - body: string; 4 + body: { 5 + foo: Array<Array<number>>; 6 + }; 5 7 path?: never; 6 8 query?: never; 7 9 url: '/foo'; ··· 11 13 /** 12 14 * OK 13 15 */ 14 - 200: string; 16 + 200: unknown; 15 17 }; 16 - 17 - export type PostFooResponse = PostFooResponses[keyof PostFooResponses];
+2
package.json
··· 57 57 "husky": "9.1.7", 58 58 "lint-staged": "15.3.0", 59 59 "prettier": "3.4.2", 60 + "rollup": "4.31.0", 61 + "rollup-plugin-dts": "6.1.1", 60 62 "tsup": "8.3.5", 61 63 "typescript": "5.5.3", 62 64 "typescript-eslint": "8.19.1",
+2 -1
packages/client-axios/package.json
··· 54 54 "src" 55 55 ], 56 56 "scripts": { 57 - "build": "tsup && pnpm check-exports", 57 + "build": "tsup && rollup -c && pnpm check-exports", 58 58 "check-exports": "attw --pack .", 59 59 "dev": "tsup --watch", 60 60 "prepublishOnly": "pnpm build", ··· 68 68 "axios": ">= 1.0.0 < 2" 69 69 }, 70 70 "devDependencies": { 71 + "@hey-api/client-core": "workspace:*", 71 72 "axios": "1.7.9" 72 73 } 73 74 }
+30
packages/client-axios/rollup.config.mjs
··· 1 + import path from 'node:path'; 2 + 3 + import { defineConfig } from 'rollup'; 4 + import dts from 'rollup-plugin-dts'; 5 + 6 + const files = ['index.d.ts', 'index.d.cts']; 7 + 8 + export default files.map((file) => 9 + defineConfig({ 10 + external: (id) => { 11 + const normalizedId = id.split(path.sep).join('/'); 12 + if (normalizedId === '@hey-api/client-core') { 13 + return false; 14 + } 15 + return ( 16 + !normalizedId.startsWith('/') && !/^[a-zA-Z]:\//.test(normalizedId) 17 + ); 18 + }, 19 + input: `./dist/${file}`, 20 + output: { 21 + file: `./dist/${file}`, 22 + format: 'es', 23 + }, 24 + plugins: [ 25 + dts({ 26 + respectExternal: true, 27 + }), 28 + ], 29 + }), 30 + );
+2 -57
packages/client-axios/src/__tests__/utils.test.ts
··· 1 + import type { Auth } from '@hey-api/client-core'; 1 2 import { describe, expect, it, vi } from 'vitest'; 2 3 3 - import type { Auth } from '../types'; 4 - import { 5 - axiosHeadersKeywords, 6 - getAuthToken, 7 - mergeHeaders, 8 - setAuthParams, 9 - } from '../utils'; 10 - 11 - describe('getAuthToken', () => { 12 - it('returns bearer token', async () => { 13 - const auth = vi.fn().mockReturnValue('foo'); 14 - const token = await getAuthToken( 15 - { 16 - scheme: 'bearer', 17 - type: 'http', 18 - }, 19 - auth, 20 - ); 21 - expect(auth).toHaveBeenCalled(); 22 - expect(token).toBe('Bearer foo'); 23 - }); 24 - 25 - it('returns basic token', async () => { 26 - const auth = vi.fn().mockReturnValue('foo:bar'); 27 - const token = await getAuthToken( 28 - { 29 - scheme: 'basic', 30 - type: 'http', 31 - }, 32 - auth, 33 - ); 34 - expect(auth).toHaveBeenCalled(); 35 - expect(token).toBe(`Basic ${btoa('foo:bar')}`); 36 - }); 37 - 38 - it('returns raw token', async () => { 39 - const auth = vi.fn().mockReturnValue('foo'); 40 - const token = await getAuthToken( 41 - { 42 - type: 'http', 43 - }, 44 - auth, 45 - ); 46 - expect(auth).toHaveBeenCalled(); 47 - expect(token).toBe('foo'); 48 - }); 49 - 50 - it('returns nothing when auth function is undefined', async () => { 51 - const token = await getAuthToken( 52 - { 53 - type: 'http', 54 - }, 55 - undefined, 56 - ); 57 - expect(token).toBeUndefined(); 58 - }); 59 - }); 4 + import { axiosHeadersKeywords, mergeHeaders, setAuthParams } from '../utils'; 60 5 61 6 describe('mergeHeaders', () => { 62 7 it.each(axiosHeadersKeywords)(
+3 -3
packages/client-axios/src/index.ts
··· 110 110 }; 111 111 112 112 export type { 113 - Auth, 114 113 Client, 115 114 Config, 116 115 Options, ··· 118 117 RequestOptions, 119 118 RequestResult, 120 119 } from './types'; 120 + export { createConfig } from './utils'; 121 + export type { Auth, QuerySerializerOptions } from '@hey-api/client-core'; 121 122 export { 122 - createConfig, 123 123 formDataBodySerializer, 124 124 jsonBodySerializer, 125 125 urlSearchParamsBodySerializer, 126 - } from './utils'; 126 + } from '@hey-api/client-core';
+6 -13
packages/client-axios/src/types.ts
··· 1 + import type { 2 + Auth, 3 + BodySerializer, 4 + QuerySerializer, 5 + QuerySerializerOptions, 6 + } from '@hey-api/client-core'; 1 7 import type { 2 8 AxiosError, 3 9 AxiosInstance, ··· 5 11 AxiosStatic, 6 12 CreateAxiosDefaults, 7 13 } from 'axios'; 8 - 9 - import type { 10 - BodySerializer, 11 - QuerySerializer, 12 - QuerySerializerOptions, 13 - } from './utils'; 14 14 15 15 type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 16 16 ··· 94 94 * @default false 95 95 */ 96 96 throwOnError?: ThrowOnError; 97 - } 98 - 99 - export interface Auth { 100 - in?: 'header' | 'query'; 101 - name?: string; 102 - scheme?: 'basic' | 'bearer'; 103 - type: 'apiKey' | 'http'; 104 97 } 105 98 106 99 type AuthToken = string | undefined;
+13 -275
packages/client-axios/src/utils.ts
··· 1 - import type { Auth, Client, Config, RequestOptions } from './types'; 1 + import type { 2 + ArraySeparatorStyle, 3 + QuerySerializer, 4 + QuerySerializerOptions, 5 + } from '@hey-api/client-core'; 6 + import { 7 + getAuthToken, 8 + serializeArrayParam, 9 + serializeObjectParam, 10 + serializePrimitiveParam, 11 + } from '@hey-api/client-core'; 12 + 13 + import type { Client, Config, RequestOptions } from './types'; 2 14 3 15 interface PathSerializer { 4 16 path: Record<string, unknown>; ··· 7 19 8 20 const PATH_PARAM_RE = /\{[^{}]+\}/g; 9 21 10 - type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 11 - type MatrixStyle = 'label' | 'matrix' | 'simple'; 12 - type ArraySeparatorStyle = ArrayStyle | MatrixStyle; 13 - type ObjectStyle = 'form' | 'deepObject'; 14 - type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; 15 - 16 - export type QuerySerializer = (query: Record<string, unknown>) => string; 17 - 18 - export type BodySerializer = (body: any) => any; 19 - 20 - interface SerializerOptions<T> { 21 - /** 22 - * @default true 23 - */ 24 - explode: boolean; 25 - style: T; 26 - } 27 - 28 - interface SerializeOptions<T> 29 - extends SerializePrimitiveOptions, 30 - SerializerOptions<T> {} 31 - interface SerializePrimitiveOptions { 32 - allowReserved?: boolean; 33 - name: string; 34 - } 35 - interface SerializePrimitiveParam extends SerializePrimitiveOptions { 36 - value: string; 37 - } 38 - 39 - export interface QuerySerializerOptions { 40 - allowReserved?: boolean; 41 - array?: SerializerOptions<ArrayStyle>; 42 - object?: SerializerOptions<ObjectStyle>; 43 - } 44 - 45 - const serializePrimitiveParam = ({ 46 - allowReserved, 47 - name, 48 - value, 49 - }: SerializePrimitiveParam) => { 50 - if (value === undefined || value === null) { 51 - return ''; 52 - } 53 - 54 - if (typeof value === 'object') { 55 - throw new Error( 56 - 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', 57 - ); 58 - } 59 - 60 - return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; 61 - }; 62 - 63 - const separatorArrayExplode = (style: ArraySeparatorStyle) => { 64 - switch (style) { 65 - case 'label': 66 - return '.'; 67 - case 'matrix': 68 - return ';'; 69 - case 'simple': 70 - return ','; 71 - default: 72 - return '&'; 73 - } 74 - }; 75 - 76 - const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { 77 - switch (style) { 78 - case 'form': 79 - return ','; 80 - case 'pipeDelimited': 81 - return '|'; 82 - case 'spaceDelimited': 83 - return '%20'; 84 - default: 85 - return ','; 86 - } 87 - }; 88 - 89 - const separatorObjectExplode = (style: ObjectSeparatorStyle) => { 90 - switch (style) { 91 - case 'label': 92 - return '.'; 93 - case 'matrix': 94 - return ';'; 95 - case 'simple': 96 - return ','; 97 - default: 98 - return '&'; 99 - } 100 - }; 101 - 102 - const serializeArrayParam = ({ 103 - allowReserved, 104 - explode, 105 - name, 106 - style, 107 - value, 108 - }: SerializeOptions<ArraySeparatorStyle> & { 109 - value: unknown[]; 110 - }) => { 111 - if (!explode) { 112 - const joinedValues = ( 113 - allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) 114 - ).join(separatorArrayNoExplode(style)); 115 - switch (style) { 116 - case 'label': 117 - return `.${joinedValues}`; 118 - case 'matrix': 119 - return `;${name}=${joinedValues}`; 120 - case 'simple': 121 - return joinedValues; 122 - default: 123 - return `${name}=${joinedValues}`; 124 - } 125 - } 126 - 127 - const separator = separatorArrayExplode(style); 128 - const joinedValues = value 129 - .map((v) => { 130 - if (style === 'label' || style === 'simple') { 131 - return allowReserved ? v : encodeURIComponent(v as string); 132 - } 133 - 134 - return serializePrimitiveParam({ 135 - allowReserved, 136 - name, 137 - value: v as string, 138 - }); 139 - }) 140 - .join(separator); 141 - return style === 'label' || style === 'matrix' 142 - ? separator + joinedValues 143 - : joinedValues; 144 - }; 145 - 146 - const serializeObjectParam = ({ 147 - allowReserved, 148 - explode, 149 - name, 150 - style, 151 - value, 152 - }: SerializeOptions<ObjectSeparatorStyle> & { 153 - value: Record<string, unknown>; 154 - }) => { 155 - if (style !== 'deepObject' && !explode) { 156 - let values: string[] = []; 157 - Object.entries(value).forEach(([key, v]) => { 158 - values = [ 159 - ...values, 160 - key, 161 - allowReserved ? (v as string) : encodeURIComponent(v as string), 162 - ]; 163 - }); 164 - const joinedValues = values.join(','); 165 - switch (style) { 166 - case 'form': 167 - return `${name}=${joinedValues}`; 168 - case 'label': 169 - return `.${joinedValues}`; 170 - case 'matrix': 171 - return `;${name}=${joinedValues}`; 172 - default: 173 - return joinedValues; 174 - } 175 - } 176 - 177 - const separator = separatorObjectExplode(style); 178 - const joinedValues = Object.entries(value) 179 - .map(([key, v]) => 180 - serializePrimitiveParam({ 181 - allowReserved, 182 - name: style === 'deepObject' ? `${name}[${key}]` : key, 183 - value: v as string, 184 - }), 185 - ) 186 - .join(separator); 187 - return style === 'label' || style === 'matrix' 188 - ? separator + joinedValues 189 - : joinedValues; 190 - }; 191 - 192 22 const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { 193 23 let url = _url; 194 24 const matches = _url.match(PATH_PARAM_RE); ··· 318 148 return querySerializer; 319 149 }; 320 150 321 - export const getAuthToken = async ( 322 - auth: Auth, 323 - callback: RequestOptions['auth'], 324 - ): Promise<string | undefined> => { 325 - const token = 326 - typeof callback === 'function' ? await callback(auth) : callback; 327 - 328 - if (!token) { 329 - return; 330 - } 331 - 332 - if (auth.scheme === 'bearer') { 333 - return `Bearer ${token}`; 334 - } 335 - 336 - if (auth.scheme === 'basic') { 337 - return `Basic ${btoa(token)}`; 338 - } 339 - 340 - return token; 341 - }; 342 - 343 151 export const setAuthParams = async ({ 344 152 security, 345 153 ...options ··· 413 221 return url; 414 222 }; 415 223 416 - const serializeFormDataPair = ( 417 - formData: FormData, 418 - key: string, 419 - value: unknown, 420 - ) => { 421 - if (typeof value === 'string' || value instanceof Blob) { 422 - formData.append(key, value); 423 - } else { 424 - formData.append(key, JSON.stringify(value)); 425 - } 426 - }; 427 - 428 224 export const mergeConfigs = (a: Config, b: Config): Config => { 429 225 const config = { ...a, ...b }; 430 226 config.headers = mergeHeaders(a.headers, b.headers); ··· 482 278 } 483 279 } 484 280 return mergedHeaders; 485 - }; 486 - 487 - export const formDataBodySerializer = { 488 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 489 - body: T, 490 - ) => { 491 - const formData = new FormData(); 492 - 493 - Object.entries(body).forEach(([key, value]) => { 494 - if (value === undefined || value === null) { 495 - return; 496 - } 497 - if (Array.isArray(value)) { 498 - value.forEach((v) => serializeFormDataPair(formData, key, v)); 499 - } else { 500 - serializeFormDataPair(formData, key, value); 501 - } 502 - }); 503 - 504 - return formData; 505 - }, 506 - }; 507 - 508 - export const jsonBodySerializer = { 509 - bodySerializer: <T>(body: T) => JSON.stringify(body), 510 - }; 511 - 512 - const serializeUrlSearchParamsPair = ( 513 - data: URLSearchParams, 514 - key: string, 515 - value: unknown, 516 - ) => { 517 - if (typeof value === 'string') { 518 - data.append(key, value); 519 - } else { 520 - data.append(key, JSON.stringify(value)); 521 - } 522 - }; 523 - 524 - export const urlSearchParamsBodySerializer = { 525 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 526 - body: T, 527 - ) => { 528 - const data = new URLSearchParams(); 529 - 530 - Object.entries(body).forEach(([key, value]) => { 531 - if (value === undefined || value === null) { 532 - return; 533 - } 534 - if (Array.isArray(value)) { 535 - value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); 536 - } else { 537 - serializeUrlSearchParamsPair(data, key, value); 538 - } 539 - }); 540 - 541 - return data; 542 - }, 543 281 }; 544 282 545 283 export const createConfig = (override: Config = {}): Config => ({
+21
packages/client-core/LICENSE.md
··· 1 + MIT License 2 + 3 + Copyright (c) Hey API 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
+34 -9
packages/client-core/package.json
··· 2 2 "name": "@hey-api/client-core", 3 3 "version": "0.1.2", 4 4 "private": true, 5 - "type": "module", 6 5 "description": "Core utilities for type-safe @hey-api/openapi-ts clients", 7 6 "homepage": "https://heyapi.dev/", 8 7 "repository": { ··· 13 12 "url": "https://github.com/hey-api/openapi-ts/issues" 14 13 }, 15 14 "license": "MIT", 15 + "author": { 16 + "email": "lubos@heyapi.dev", 17 + "name": "Hey API", 18 + "url": "https://heyapi.dev" 19 + }, 20 + "type": "module", 21 + "main": "./dist/index.cjs", 22 + "module": "./dist/index.js", 23 + "types": "./dist/index.d.ts", 16 24 "exports": { 17 - "import": "./dist/node/index.mjs", 18 - "require": "./dist/node/index.cjs", 19 - "types": "./dist/node/index.d.ts" 25 + ".": { 26 + "import": { 27 + "types": "./dist/index.d.ts", 28 + "default": "./dist/index.js" 29 + }, 30 + "require": { 31 + "types": "./dist/index.d.cts", 32 + "default": "./dist/index.cjs" 33 + } 34 + }, 35 + "./package.json": "./package.json" 20 36 }, 37 + "sideEffects": false, 38 + "files": [ 39 + "dist", 40 + "LICENSE.md", 41 + "src" 42 + ], 21 43 "scripts": { 44 + "build": "tsup && pnpm check-exports", 45 + "check-exports": "attw --pack .", 46 + "dev": "tsup --watch", 22 47 "prepublishOnly": "pnpm build", 23 - "test:coverage:disabled": "vitest run --coverage", 24 - "test:update:disabled": "vitest watch --update", 25 - "test:watch:disabled": "vitest watch", 26 - "test:disabled": "vitest run", 27 - "typecheck:disabled": "tsc --noEmit" 48 + "test:coverage": "vitest run --coverage", 49 + "test:update": "vitest watch --update", 50 + "test:watch": "vitest watch", 51 + "test": "vitest run", 52 + "typecheck": "vitest --typecheck --watch=false" 28 53 } 29 54 }
+53
packages/client-core/src/__tests__/auth.test.ts
··· 1 + import { describe, expect, it, vi } from 'vitest'; 2 + 3 + import { getAuthToken } from '../auth'; 4 + 5 + describe('getAuthToken', () => { 6 + it('returns bearer token', async () => { 7 + const auth = vi.fn().mockReturnValue('foo'); 8 + const token = await getAuthToken( 9 + { 10 + scheme: 'bearer', 11 + type: 'http', 12 + }, 13 + auth, 14 + ); 15 + expect(auth).toHaveBeenCalled(); 16 + expect(token).toBe('Bearer foo'); 17 + }); 18 + 19 + it('returns basic token', async () => { 20 + const auth = vi.fn().mockReturnValue('foo:bar'); 21 + const token = await getAuthToken( 22 + { 23 + scheme: 'basic', 24 + type: 'http', 25 + }, 26 + auth, 27 + ); 28 + expect(auth).toHaveBeenCalled(); 29 + expect(token).toBe(`Basic ${btoa('foo:bar')}`); 30 + }); 31 + 32 + it('returns raw token', async () => { 33 + const auth = vi.fn().mockReturnValue('foo'); 34 + const token = await getAuthToken( 35 + { 36 + type: 'http', 37 + }, 38 + auth, 39 + ); 40 + expect(auth).toHaveBeenCalled(); 41 + expect(token).toBe('foo'); 42 + }); 43 + 44 + it('returns nothing when auth function is undefined', async () => { 45 + const token = await getAuthToken( 46 + { 47 + type: 'http', 48 + }, 49 + undefined, 50 + ); 51 + expect(token).toBeUndefined(); 52 + }); 53 + });
-7
packages/client-core/src/__tests__/index.test.ts
··· 1 - import { describe, expect, it } from 'vitest'; 2 - 3 - describe('client core', () => { 4 - it('works', () => { 5 - expect(1).toBe(1); 6 - }); 7 - });
+30
packages/client-core/src/auth.ts
··· 1 + type AuthToken = string | undefined; 2 + 3 + export interface Auth { 4 + in?: 'header' | 'query'; 5 + name?: string; 6 + scheme?: 'basic' | 'bearer'; 7 + type: 'apiKey' | 'http'; 8 + } 9 + 10 + export const getAuthToken = async ( 11 + auth: Auth, 12 + callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken, 13 + ): Promise<string | undefined> => { 14 + const token = 15 + typeof callback === 'function' ? await callback(auth) : callback; 16 + 17 + if (!token) { 18 + return; 19 + } 20 + 21 + if (auth.scheme === 'bearer') { 22 + return `Bearer ${token}`; 23 + } 24 + 25 + if (auth.scheme === 'basic') { 26 + return `Basic ${btoa(token)}`; 27 + } 28 + 29 + return token; 30 + };
+81
packages/client-core/src/bodySerializer.ts
··· 1 + import type { 2 + ArrayStyle, 3 + ObjectStyle, 4 + SerializerOptions, 5 + } from './pathSerializer'; 6 + 7 + export type QuerySerializer = (query: Record<string, unknown>) => string; 8 + 9 + export type BodySerializer = (body: any) => any; 10 + 11 + export interface QuerySerializerOptions { 12 + allowReserved?: boolean; 13 + array?: SerializerOptions<ArrayStyle>; 14 + object?: SerializerOptions<ObjectStyle>; 15 + } 16 + 17 + const serializeFormDataPair = (data: FormData, key: string, value: unknown) => { 18 + if (typeof value === 'string' || value instanceof Blob) { 19 + data.append(key, value); 20 + } else { 21 + data.append(key, JSON.stringify(value)); 22 + } 23 + }; 24 + 25 + const serializeUrlSearchParamsPair = ( 26 + data: URLSearchParams, 27 + key: string, 28 + value: unknown, 29 + ) => { 30 + if (typeof value === 'string') { 31 + data.append(key, value); 32 + } else { 33 + data.append(key, JSON.stringify(value)); 34 + } 35 + }; 36 + 37 + export const formDataBodySerializer = { 38 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 39 + body: T, 40 + ) => { 41 + const data = new FormData(); 42 + 43 + Object.entries(body).forEach(([key, value]) => { 44 + if (value === undefined || value === null) { 45 + return; 46 + } 47 + if (Array.isArray(value)) { 48 + value.forEach((v) => serializeFormDataPair(data, key, v)); 49 + } else { 50 + serializeFormDataPair(data, key, value); 51 + } 52 + }); 53 + 54 + return data; 55 + }, 56 + }; 57 + 58 + export const jsonBodySerializer = { 59 + bodySerializer: <T>(body: T) => JSON.stringify(body), 60 + }; 61 + 62 + export const urlSearchParamsBodySerializer = { 63 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 64 + body: T, 65 + ) => { 66 + const data = new URLSearchParams(); 67 + 68 + Object.entries(body).forEach(([key, value]) => { 69 + if (value === undefined || value === null) { 70 + return; 71 + } 72 + if (Array.isArray(value)) { 73 + value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); 74 + } else { 75 + serializeUrlSearchParamsPair(data, key, value); 76 + } 77 + }); 78 + 79 + return data; 80 + }, 81 + };
-126
packages/client-core/src/cancelablePromise.ts
··· 1 - export class CancelError extends Error { 2 - constructor(message: string) { 3 - super(message); 4 - this.name = 'CancelError'; 5 - } 6 - 7 - public get isCancelled(): boolean { 8 - return true; 9 - } 10 - } 11 - 12 - export interface OnCancel { 13 - readonly isCancelled: boolean; 14 - readonly isRejected: boolean; 15 - readonly isResolved: boolean; 16 - 17 - (cancelHandler: () => void): void; 18 - } 19 - 20 - export class CancelablePromise<T> implements Promise<T> { 21 - private _isResolved: boolean; 22 - private _isRejected: boolean; 23 - private _isCancelled: boolean; 24 - readonly cancelHandlers: (() => void)[]; 25 - readonly promise: Promise<T>; 26 - private _resolve?: (value: T | PromiseLike<T>) => void; 27 - private _reject?: (reason?: unknown) => void; 28 - 29 - constructor( 30 - executor: ( 31 - resolve: (value: T | PromiseLike<T>) => void, 32 - reject: (reason?: unknown) => void, 33 - onCancel: OnCancel, 34 - ) => void, 35 - ) { 36 - this._isResolved = false; 37 - this._isRejected = false; 38 - this._isCancelled = false; 39 - this.cancelHandlers = []; 40 - this.promise = new Promise<T>((resolve, reject) => { 41 - this._resolve = resolve; 42 - this._reject = reject; 43 - 44 - const onResolve = (value: T | PromiseLike<T>): void => { 45 - if (this._isResolved || this._isRejected || this._isCancelled) { 46 - return; 47 - } 48 - this._isResolved = true; 49 - if (this._resolve) this._resolve(value); 50 - }; 51 - 52 - const onReject = (reason?: unknown): void => { 53 - if (this._isResolved || this._isRejected || this._isCancelled) { 54 - return; 55 - } 56 - this._isRejected = true; 57 - if (this._reject) this._reject(reason); 58 - }; 59 - 60 - const onCancel = (cancelHandler: () => void): void => { 61 - if (this._isResolved || this._isRejected || this._isCancelled) { 62 - return; 63 - } 64 - this.cancelHandlers.push(cancelHandler); 65 - }; 66 - 67 - Object.defineProperty(onCancel, 'isResolved', { 68 - get: (): boolean => this._isResolved, 69 - }); 70 - 71 - Object.defineProperty(onCancel, 'isRejected', { 72 - get: (): boolean => this._isRejected, 73 - }); 74 - 75 - Object.defineProperty(onCancel, 'isCancelled', { 76 - get: (): boolean => this._isCancelled, 77 - }); 78 - 79 - return executor(onResolve, onReject, onCancel as OnCancel); 80 - }); 81 - } 82 - 83 - get [Symbol.toStringTag]() { 84 - return 'Cancellable Promise'; 85 - } 86 - 87 - public then<TResult1 = T, TResult2 = never>( 88 - onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, 89 - onRejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null, 90 - ): Promise<TResult1 | TResult2> { 91 - return this.promise.then(onFulfilled, onRejected); 92 - } 93 - 94 - public catch<TResult = never>( 95 - onRejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null, 96 - ): Promise<T | TResult> { 97 - return this.promise.catch(onRejected); 98 - } 99 - 100 - public finally(onFinally?: (() => void) | null): Promise<T> { 101 - return this.promise.finally(onFinally); 102 - } 103 - 104 - public cancel(): void { 105 - if (this._isResolved || this._isRejected || this._isCancelled) { 106 - return; 107 - } 108 - this._isCancelled = true; 109 - if (this.cancelHandlers.length) { 110 - try { 111 - for (const cancelHandler of this.cancelHandlers) { 112 - cancelHandler(); 113 - } 114 - } catch (error) { 115 - console.warn('Cancellation threw an error', error); 116 - return; 117 - } 118 - } 119 - this.cancelHandlers.length = 0; 120 - if (this._reject) this._reject(new CancelError('Request aborted')); 121 - } 122 - 123 - public get isCancelled(): boolean { 124 - return this._isCancelled; 125 - } 126 - }
+26 -263
packages/client-core/src/index.ts
··· 1 - import type { 2 - ApiRequestOptions, 3 - ApiResult, 4 - Headers, 5 - Middleware, 6 - Resolver, 7 - } from './types'; 8 - 9 - export { CancelablePromise, CancelError, OnCancel } from './cancelablePromise'; 10 - 11 - export class ApiError extends Error { 12 - public readonly url: string; 13 - public readonly status: number; 14 - public readonly statusText: string; 15 - public readonly body: unknown; 16 - public readonly request: ApiRequestOptions; 17 - 18 - constructor( 19 - request: ApiRequestOptions, 20 - response: ApiResult, 21 - message: string, 22 - ) { 23 - super(message); 24 - 25 - this.name = 'ApiError'; 26 - this.url = response.url; 27 - this.status = response.status; 28 - this.statusText = response.statusText; 29 - this.body = response.body; 30 - this.request = request; 31 - } 32 - } 33 - 34 - export class Interceptors<T> { 35 - _fns: Middleware<T>[]; 36 - 37 - constructor() { 38 - this._fns = []; 39 - } 40 - 41 - eject(fn: Middleware<T>) { 42 - const index = this._fns.indexOf(fn); 43 - if (index !== -1) { 44 - this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)]; 45 - } 46 - } 47 - 48 - use(fn: Middleware<T>) { 49 - this._fns = [...this._fns, fn]; 50 - } 51 - } 52 - 53 - export type OpenAPIConfig<TRequest = any, TResponse = any> = { 54 - BASE: string; 55 - CREDENTIALS: 'include' | 'omit' | 'same-origin'; 56 - ENCODE_PATH?: ((path: string) => string) | undefined; 57 - HEADERS?: Headers | Resolver<Headers> | undefined; 58 - PASSWORD?: string | Resolver<string> | undefined; 59 - TOKEN?: string | Resolver<string> | undefined; 60 - USERNAME?: string | Resolver<string> | undefined; 61 - VERSION: string; 62 - WITH_CREDENTIALS: boolean; 63 - interceptors: { 64 - request: Interceptors<TRequest>; 65 - response: Interceptors<TResponse>; 66 - }; 67 - }; 68 - 69 - export const OpenAPI: OpenAPIConfig = { 70 - BASE: '{{{server}}}', 71 - CREDENTIALS: 'include', 72 - ENCODE_PATH: undefined, 73 - HEADERS: undefined, 74 - PASSWORD: undefined, 75 - TOKEN: undefined, 76 - USERNAME: undefined, 77 - VERSION: '{{{version}}}', 78 - WITH_CREDENTIALS: false, 79 - interceptors: { 80 - request: new Interceptors(), 81 - response: new Interceptors(), 82 - }, 83 - }; 84 - 85 - export const isString = (value: unknown): value is string => 86 - typeof value === 'string'; 87 - 88 - export const isStringWithValue = (value: unknown): value is string => 89 - isString(value) && value !== ''; 90 - 91 - export const isBlob = (value: any): value is Blob => value instanceof Blob; 92 - 93 - export const isFormData = (value: unknown): value is FormData => 94 - value instanceof FormData; 95 - 96 - export const isSuccess = (status: number): boolean => 97 - status >= 200 && status < 300; 98 - 99 - export const base64 = (str: string): string => { 100 - try { 101 - return btoa(str); 102 - } catch { 103 - return Buffer.from(str).toString('base64'); 104 - } 105 - }; 106 - 107 - export const getQueryString = (params: Record<string, unknown>): string => { 108 - const qs: string[] = []; 109 - 110 - const append = (key: string, value: unknown) => { 111 - qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); 112 - }; 113 - 114 - const encodePair = (key: string, value: unknown) => { 115 - if (value === undefined || value === null) { 116 - return; 117 - } 118 - 119 - if (value instanceof Date) { 120 - append(key, value.toISOString()); 121 - } else if (Array.isArray(value)) { 122 - value.forEach((v) => encodePair(key, v)); 123 - } else if (typeof value === 'object') { 124 - Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v)); 125 - } else { 126 - append(key, value); 127 - } 128 - }; 129 - 130 - Object.entries(params).forEach(([key, value]) => encodePair(key, value)); 131 - 132 - return qs.length ? `?${qs.join('&')}` : ''; 133 - }; 134 - 135 - export const getUrl = ( 136 - config: OpenAPIConfig, 137 - options: ApiRequestOptions, 138 - ): string => { 139 - const encoder = config.ENCODE_PATH || encodeURI; 140 - 141 - const path = options.url 142 - .replace('{api-version}', config.VERSION) 143 - .replace(/{(.*?)}/g, (substring: string, group: string) => { 144 - if (options.path?.hasOwnProperty(group)) { 145 - return encoder(String(options.path[group])); 146 - } 147 - return substring; 148 - }); 149 - 150 - const url = config.BASE + path; 151 - return options.query ? url + getQueryString(options.query) : url; 152 - }; 153 - 154 - export const getFormData = ( 155 - options: ApiRequestOptions, 156 - ): FormData | undefined => { 157 - if (options.formData) { 158 - const formData = new FormData(); 159 - 160 - const process = (key: string, value: unknown) => { 161 - if (isString(value) || isBlob(value)) { 162 - formData.append(key, value); 163 - } else { 164 - formData.append(key, JSON.stringify(value)); 165 - } 166 - }; 167 - 168 - Object.entries(options.formData) 169 - .filter(([, value]) => value !== undefined && value !== null) 170 - .forEach(([key, value]) => { 171 - if (Array.isArray(value)) { 172 - value.forEach((v) => process(key, v)); 173 - } else { 174 - process(key, value); 175 - } 176 - }); 177 - 178 - return formData; 179 - } 180 - return undefined; 181 - }; 182 - 183 - export const resolve = async <T>( 184 - options: ApiRequestOptions<T>, 185 - resolver?: T | Resolver<T>, 186 - ): Promise<T | undefined> => { 187 - if (typeof resolver === 'function') { 188 - return (resolver as Resolver<T>)(options); 189 - } 190 - return resolver; 191 - }; 192 - 193 - export const catchErrorCodes = ( 194 - options: ApiRequestOptions, 195 - result: ApiResult, 196 - ): void => { 197 - const errors: Record<number, string> = { 198 - 400: 'Bad Request', 199 - 401: 'Unauthorized', 200 - 402: 'Payment Required', 201 - 403: 'Forbidden', 202 - 404: 'Not Found', 203 - 405: 'Method Not Allowed', 204 - 406: 'Not Acceptable', 205 - 407: 'Proxy Authentication Required', 206 - 408: 'Request Timeout', 207 - 409: 'Conflict', 208 - 410: 'Gone', 209 - 411: 'Length Required', 210 - 412: 'Precondition Failed', 211 - 413: 'Payload Too Large', 212 - 414: 'URI Too Long', 213 - 415: 'Unsupported Media Type', 214 - 416: 'Range Not Satisfiable', 215 - 417: 'Expectation Failed', 216 - 418: 'Im a teapot', 217 - 421: 'Misdirected Request', 218 - 422: 'Unprocessable Content', 219 - 423: 'Locked', 220 - 424: 'Failed Dependency', 221 - 425: 'Too Early', 222 - 426: 'Upgrade Required', 223 - 428: 'Precondition Required', 224 - 429: 'Too Many Requests', 225 - 431: 'Request Header Fields Too Large', 226 - 451: 'Unavailable For Legal Reasons', 227 - 500: 'Internal Server Error', 228 - 501: 'Not Implemented', 229 - 502: 'Bad Gateway', 230 - 503: 'Service Unavailable', 231 - 504: 'Gateway Timeout', 232 - 505: 'HTTP Version Not Supported', 233 - 506: 'Variant Also Negotiates', 234 - 507: 'Insufficient Storage', 235 - 508: 'Loop Detected', 236 - 510: 'Not Extended', 237 - 511: 'Network Authentication Required', 238 - ...options.errors, 239 - }; 240 - 241 - const error = errors[result.status]; 242 - if (error) { 243 - throw new ApiError(options, result, error); 244 - } 245 - 246 - if (!result.ok) { 247 - const errorStatus = result.status ?? 'unknown'; 248 - const errorStatusText = result.statusText ?? 'unknown'; 249 - const errorBody = (() => { 250 - try { 251 - return JSON.stringify(result.body, null, 2); 252 - } catch { 253 - return undefined; 254 - } 255 - })(); 256 - 257 - throw new ApiError( 258 - options, 259 - result, 260 - `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`, 261 - ); 262 - } 263 - }; 1 + export type { Auth } from './auth'; 2 + export { getAuthToken } from './auth'; 3 + export type { 4 + BodySerializer, 5 + QuerySerializer, 6 + QuerySerializerOptions, 7 + } from './bodySerializer'; 8 + export { 9 + formDataBodySerializer, 10 + jsonBodySerializer, 11 + urlSearchParamsBodySerializer, 12 + } from './bodySerializer'; 13 + export type { 14 + ArraySeparatorStyle, 15 + ArrayStyle, 16 + ObjectStyle, 17 + SerializerOptions, 18 + } from './pathSerializer'; 19 + export { 20 + separatorArrayExplode, 21 + separatorArrayNoExplode, 22 + separatorObjectExplode, 23 + serializeArrayParam, 24 + serializeObjectParam, 25 + serializePrimitiveParam, 26 + } from './pathSerializer';
-21
packages/client-core/src/node/index.ts
··· 1 - export { 2 - ApiError, 3 - base64, 4 - CancelablePromise, 5 - CancelError, 6 - catchErrorCodes, 7 - getFormData, 8 - getQueryString, 9 - getUrl, 10 - Interceptors, 11 - isBlob, 12 - isFormData, 13 - isString, 14 - isStringWithValue, 15 - isSuccess, 16 - OnCancel, 17 - OpenAPI, 18 - type OpenAPIConfig, 19 - resolve, 20 - } from '../'; 21 - export type { ApiRequestOptions, ApiResult } from '../types';
-9
packages/client-core/src/node/tsconfig.json
··· 1 - { 2 - "compilerOptions": { 3 - "lib": ["ES2020", "DOM"], 4 - "stripInternal": true 5 - }, 6 - "exclude": ["../**/__tests__"], 7 - "extends": "../../tsconfig.base.json", 8 - "include": ["../"] 9 - }
+177
packages/client-core/src/pathSerializer.ts
··· 1 + interface SerializeOptions<T> 2 + extends SerializePrimitiveOptions, 3 + SerializerOptions<T> {} 4 + 5 + interface SerializePrimitiveOptions { 6 + allowReserved?: boolean; 7 + name: string; 8 + } 9 + 10 + export interface SerializerOptions<T> { 11 + /** 12 + * @default true 13 + */ 14 + explode: boolean; 15 + style: T; 16 + } 17 + 18 + export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 19 + export type ArraySeparatorStyle = ArrayStyle | MatrixStyle; 20 + type MatrixStyle = 'label' | 'matrix' | 'simple'; 21 + export type ObjectStyle = 'form' | 'deepObject'; 22 + type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; 23 + 24 + interface SerializePrimitiveParam extends SerializePrimitiveOptions { 25 + value: string; 26 + } 27 + 28 + export const separatorArrayExplode = (style: ArraySeparatorStyle) => { 29 + switch (style) { 30 + case 'label': 31 + return '.'; 32 + case 'matrix': 33 + return ';'; 34 + case 'simple': 35 + return ','; 36 + default: 37 + return '&'; 38 + } 39 + }; 40 + 41 + export const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { 42 + switch (style) { 43 + case 'form': 44 + return ','; 45 + case 'pipeDelimited': 46 + return '|'; 47 + case 'spaceDelimited': 48 + return '%20'; 49 + default: 50 + return ','; 51 + } 52 + }; 53 + 54 + export const separatorObjectExplode = (style: ObjectSeparatorStyle) => { 55 + switch (style) { 56 + case 'label': 57 + return '.'; 58 + case 'matrix': 59 + return ';'; 60 + case 'simple': 61 + return ','; 62 + default: 63 + return '&'; 64 + } 65 + }; 66 + 67 + export const serializeArrayParam = ({ 68 + allowReserved, 69 + explode, 70 + name, 71 + style, 72 + value, 73 + }: SerializeOptions<ArraySeparatorStyle> & { 74 + value: unknown[]; 75 + }) => { 76 + if (!explode) { 77 + const joinedValues = ( 78 + allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) 79 + ).join(separatorArrayNoExplode(style)); 80 + switch (style) { 81 + case 'label': 82 + return `.${joinedValues}`; 83 + case 'matrix': 84 + return `;${name}=${joinedValues}`; 85 + case 'simple': 86 + return joinedValues; 87 + default: 88 + return `${name}=${joinedValues}`; 89 + } 90 + } 91 + 92 + const separator = separatorArrayExplode(style); 93 + const joinedValues = value 94 + .map((v) => { 95 + if (style === 'label' || style === 'simple') { 96 + return allowReserved ? v : encodeURIComponent(v as string); 97 + } 98 + 99 + return serializePrimitiveParam({ 100 + allowReserved, 101 + name, 102 + value: v as string, 103 + }); 104 + }) 105 + .join(separator); 106 + return style === 'label' || style === 'matrix' 107 + ? separator + joinedValues 108 + : joinedValues; 109 + }; 110 + 111 + export const serializePrimitiveParam = ({ 112 + allowReserved, 113 + name, 114 + value, 115 + }: SerializePrimitiveParam) => { 116 + if (value === undefined || value === null) { 117 + return ''; 118 + } 119 + 120 + if (typeof value === 'object') { 121 + throw new Error( 122 + 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', 123 + ); 124 + } 125 + 126 + return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; 127 + }; 128 + 129 + export const serializeObjectParam = ({ 130 + allowReserved, 131 + explode, 132 + name, 133 + style, 134 + value, 135 + }: SerializeOptions<ObjectSeparatorStyle> & { 136 + value: Record<string, unknown> | Date; 137 + }) => { 138 + if (value instanceof Date) { 139 + return `${name}=${value.toISOString()}`; 140 + } 141 + 142 + if (style !== 'deepObject' && !explode) { 143 + let values: string[] = []; 144 + Object.entries(value).forEach(([key, v]) => { 145 + values = [ 146 + ...values, 147 + key, 148 + allowReserved ? (v as string) : encodeURIComponent(v as string), 149 + ]; 150 + }); 151 + const joinedValues = values.join(','); 152 + switch (style) { 153 + case 'form': 154 + return `${name}=${joinedValues}`; 155 + case 'label': 156 + return `.${joinedValues}`; 157 + case 'matrix': 158 + return `;${name}=${joinedValues}`; 159 + default: 160 + return joinedValues; 161 + } 162 + } 163 + 164 + const separator = separatorObjectExplode(style); 165 + const joinedValues = Object.entries(value) 166 + .map(([key, v]) => 167 + serializePrimitiveParam({ 168 + allowReserved, 169 + name: style === 'deepObject' ? `${name}[${key}]` : key, 170 + value: v as string, 171 + }), 172 + ) 173 + .join(separator); 174 + return style === 'label' || style === 'matrix' 175 + ? separator + joinedValues 176 + : joinedValues; 177 + };
-35
packages/client-core/src/types.ts
··· 1 - export type ApiResult<TData = any> = { 2 - readonly body: TData; 3 - readonly ok: boolean; 4 - readonly status: number; 5 - readonly statusText: string; 6 - readonly url: string; 7 - }; 8 - 9 - export type ApiRequestOptions<T = unknown> = { 10 - readonly body?: any; 11 - readonly cookies?: Record<string, unknown>; 12 - readonly errors?: Record<number | string, string>; 13 - readonly formData?: Record<string, unknown> | any[]; 14 - readonly headers?: Record<string, unknown>; 15 - readonly mediaType?: string; 16 - readonly method: 17 - | 'CONNECT' 18 - | 'DELETE' 19 - | 'GET' 20 - | 'HEAD' 21 - | 'OPTIONS' 22 - | 'PATCH' 23 - | 'POST' 24 - | 'PUT' 25 - | 'TRACE'; 26 - readonly path?: Record<string, unknown>; 27 - readonly query?: Record<string, unknown>; 28 - readonly responseHeader?: string; 29 - readonly responseTransformer?: (data: unknown) => Promise<T>; 30 - readonly url: string; 31 - }; 32 - 33 - export type Headers = Record<string, string>; 34 - export type Middleware<T> = (value: T) => T | Promise<T>; 35 - export type Resolver<T> = (options: ApiRequestOptions) => Promise<T>;
+1
packages/client-core/tsconfig.base.json
··· 5 5 "module": "ESNext", 6 6 "moduleResolution": "Bundler", 7 7 "noImplicitOverride": true, 8 + "noUncheckedIndexedAccess": true, 8 9 "noUnusedLocals": true, 9 10 "strict": true, 10 11 "target": "ES2022",
+1 -3
packages/client-core/tsconfig.json
··· 3 3 "compilerOptions": { 4 4 "declaration": false, 5 5 "esModuleInterop": true 6 - }, 7 - "exclude": ["node_modules", "**/__mocks__"], 8 - "include": ["./src/**/*.ts"] 6 + } 9 7 }
+12
packages/client-core/tsup.config.ts
··· 1 + import { defineConfig } from 'tsup'; 2 + 3 + export default defineConfig((options) => ({ 4 + clean: true, 5 + dts: true, 6 + entry: ['src/index.ts'], 7 + format: ['cjs', 'esm'], 8 + minify: !options.watch, 9 + shims: false, 10 + sourcemap: true, 11 + treeshake: true, 12 + }));
+4 -1
packages/client-fetch/package.json
··· 54 54 "src" 55 55 ], 56 56 "scripts": { 57 - "build": "tsup && pnpm check-exports", 57 + "build": "tsup && rollup -c && pnpm check-exports", 58 58 "check-exports": "attw --pack .", 59 59 "dev": "tsup --watch", 60 60 "prepublishOnly": "pnpm build", ··· 63 63 "test:watch": "vitest watch", 64 64 "test": "vitest run", 65 65 "typecheck": "vitest --typecheck --watch=false" 66 + }, 67 + "devDependencies": { 68 + "@hey-api/client-core": "workspace:*" 66 69 } 67 70 }
+30
packages/client-fetch/rollup.config.mjs
··· 1 + import path from 'node:path'; 2 + 3 + import { defineConfig } from 'rollup'; 4 + import dts from 'rollup-plugin-dts'; 5 + 6 + const files = ['index.d.ts', 'index.d.cts']; 7 + 8 + export default files.map((file) => 9 + defineConfig({ 10 + external: (id) => { 11 + const normalizedId = id.split(path.sep).join('/'); 12 + if (normalizedId === '@hey-api/client-core') { 13 + return false; 14 + } 15 + return ( 16 + !normalizedId.startsWith('/') && !/^[a-zA-Z]:\//.test(normalizedId) 17 + ); 18 + }, 19 + input: `./dist/${file}`, 20 + output: { 21 + file: `./dist/${file}`, 22 + format: 'es', 23 + }, 24 + plugins: [ 25 + dts({ 26 + respectExternal: true, 27 + }), 28 + ], 29 + }), 30 + );
+2 -52
packages/client-fetch/src/__tests__/utils.test.ts
··· 1 + import type { Auth } from '@hey-api/client-core'; 1 2 import { describe, expect, it, vi } from 'vitest'; 2 3 3 - import type { Auth } from '../types'; 4 - import { getAuthToken, getParseAs, setAuthParams } from '../utils'; 5 - 6 - describe('getAuthToken', () => { 7 - it('returns bearer token', async () => { 8 - const auth = vi.fn().mockReturnValue('foo'); 9 - const token = await getAuthToken( 10 - { 11 - scheme: 'bearer', 12 - type: 'http', 13 - }, 14 - auth, 15 - ); 16 - expect(auth).toHaveBeenCalled(); 17 - expect(token).toBe('Bearer foo'); 18 - }); 19 - 20 - it('returns basic token', async () => { 21 - const auth = vi.fn().mockReturnValue('foo:bar'); 22 - const token = await getAuthToken( 23 - { 24 - scheme: 'basic', 25 - type: 'http', 26 - }, 27 - auth, 28 - ); 29 - expect(auth).toHaveBeenCalled(); 30 - expect(token).toBe(`Basic ${btoa('foo:bar')}`); 31 - }); 32 - 33 - it('returns raw token', async () => { 34 - const auth = vi.fn().mockReturnValue('foo'); 35 - const token = await getAuthToken( 36 - { 37 - type: 'http', 38 - }, 39 - auth, 40 - ); 41 - expect(auth).toHaveBeenCalled(); 42 - expect(token).toBe('foo'); 43 - }); 44 - 45 - it('returns nothing when auth function is undefined', async () => { 46 - const token = await getAuthToken( 47 - { 48 - type: 'http', 49 - }, 50 - undefined, 51 - ); 52 - expect(token).toBeUndefined(); 53 - }); 54 - }); 4 + import { getParseAs, setAuthParams } from '../utils'; 55 5 56 6 describe('getParseAs', () => { 57 7 const scenarios: Array<{
+3 -4
packages/client-fetch/src/index.ts
··· 167 167 }; 168 168 169 169 export type { 170 - Auth, 171 170 Client, 172 171 Config, 173 172 Options, ··· 175 174 RequestOptions, 176 175 RequestResult, 177 176 } from './types'; 177 + export { createConfig } from './utils'; 178 + export type { Auth, QuerySerializerOptions } from '@hey-api/client-core'; 178 179 export { 179 - createConfig, 180 180 formDataBodySerializer, 181 181 jsonBodySerializer, 182 - type QuerySerializerOptions, 183 182 urlSearchParamsBodySerializer, 184 - } from './utils'; 183 + } from '@hey-api/client-core';
+4 -9
packages/client-fetch/src/types.ts
··· 1 1 import type { 2 + Auth, 2 3 BodySerializer, 3 - Middleware, 4 4 QuerySerializer, 5 5 QuerySerializerOptions, 6 - } from './utils'; 6 + } from '@hey-api/client-core'; 7 + 8 + import type { Middleware } from './utils'; 7 9 8 10 type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 9 11 ··· 99 101 * @default false 100 102 */ 101 103 throwOnError?: ThrowOnError; 102 - } 103 - 104 - export interface Auth { 105 - in?: 'header' | 'query'; 106 - name?: string; 107 - scheme?: 'basic' | 'bearer'; 108 - type: 'apiKey' | 'http'; 109 104 } 110 105 111 106 type AuthToken = string | undefined;
+13 -271
packages/client-fetch/src/utils.ts
··· 1 - import type { Auth, Client, Config, RequestOptions } from './types'; 1 + import type { 2 + QuerySerializer, 3 + QuerySerializerOptions, 4 + } from '@hey-api/client-core'; 5 + import { 6 + getAuthToken, 7 + jsonBodySerializer, 8 + serializeArrayParam, 9 + serializeObjectParam, 10 + serializePrimitiveParam, 11 + } from '@hey-api/client-core'; 12 + 13 + import type { Client, Config, RequestOptions } from './types'; 2 14 3 15 interface PathSerializer { 4 16 path: Record<string, unknown>; ··· 10 22 type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 11 23 type MatrixStyle = 'label' | 'matrix' | 'simple'; 12 24 type ArraySeparatorStyle = ArrayStyle | MatrixStyle; 13 - type ObjectStyle = 'form' | 'deepObject'; 14 - type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; 15 - 16 - export type QuerySerializer = (query: Record<string, unknown>) => string; 17 - 18 - export type BodySerializer = (body: any) => any; 19 - 20 - interface SerializerOptions<T> { 21 - /** 22 - * @default true 23 - */ 24 - explode: boolean; 25 - style: T; 26 - } 27 - 28 - interface SerializeOptions<T> 29 - extends SerializePrimitiveOptions, 30 - SerializerOptions<T> {} 31 - interface SerializePrimitiveOptions { 32 - allowReserved?: boolean; 33 - name: string; 34 - } 35 - interface SerializePrimitiveParam extends SerializePrimitiveOptions { 36 - value: string; 37 - } 38 - 39 - export interface QuerySerializerOptions { 40 - allowReserved?: boolean; 41 - array?: SerializerOptions<ArrayStyle>; 42 - object?: SerializerOptions<ObjectStyle>; 43 - } 44 - 45 - const serializePrimitiveParam = ({ 46 - allowReserved, 47 - name, 48 - value, 49 - }: SerializePrimitiveParam) => { 50 - if (value === undefined || value === null) { 51 - return ''; 52 - } 53 - 54 - if (typeof value === 'object') { 55 - throw new Error( 56 - 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', 57 - ); 58 - } 59 - 60 - return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; 61 - }; 62 - 63 - const separatorArrayExplode = (style: ArraySeparatorStyle) => { 64 - switch (style) { 65 - case 'label': 66 - return '.'; 67 - case 'matrix': 68 - return ';'; 69 - case 'simple': 70 - return ','; 71 - default: 72 - return '&'; 73 - } 74 - }; 75 - 76 - const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { 77 - switch (style) { 78 - case 'form': 79 - return ','; 80 - case 'pipeDelimited': 81 - return '|'; 82 - case 'spaceDelimited': 83 - return '%20'; 84 - default: 85 - return ','; 86 - } 87 - }; 88 - 89 - const separatorObjectExplode = (style: ObjectSeparatorStyle) => { 90 - switch (style) { 91 - case 'label': 92 - return '.'; 93 - case 'matrix': 94 - return ';'; 95 - case 'simple': 96 - return ','; 97 - default: 98 - return '&'; 99 - } 100 - }; 101 - 102 - const serializeArrayParam = ({ 103 - allowReserved, 104 - explode, 105 - name, 106 - style, 107 - value, 108 - }: SerializeOptions<ArraySeparatorStyle> & { 109 - value: unknown[]; 110 - }) => { 111 - if (!explode) { 112 - const joinedValues = ( 113 - allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) 114 - ).join(separatorArrayNoExplode(style)); 115 - switch (style) { 116 - case 'label': 117 - return `.${joinedValues}`; 118 - case 'matrix': 119 - return `;${name}=${joinedValues}`; 120 - case 'simple': 121 - return joinedValues; 122 - default: 123 - return `${name}=${joinedValues}`; 124 - } 125 - } 126 - 127 - const separator = separatorArrayExplode(style); 128 - const joinedValues = value 129 - .map((v) => { 130 - if (style === 'label' || style === 'simple') { 131 - return allowReserved ? v : encodeURIComponent(v as string); 132 - } 133 - 134 - return serializePrimitiveParam({ 135 - allowReserved, 136 - name, 137 - value: v as string, 138 - }); 139 - }) 140 - .join(separator); 141 - return style === 'label' || style === 'matrix' 142 - ? separator + joinedValues 143 - : joinedValues; 144 - }; 145 - 146 - const serializeObjectParam = ({ 147 - allowReserved, 148 - explode, 149 - name, 150 - style, 151 - value, 152 - }: SerializeOptions<ObjectSeparatorStyle> & { 153 - value: Record<string, unknown> | Date; 154 - }) => { 155 - if (value instanceof Date) { 156 - return `${name}=${value.toISOString()}`; 157 - } 158 - 159 - if (style !== 'deepObject' && !explode) { 160 - let values: string[] = []; 161 - Object.entries(value).forEach(([key, v]) => { 162 - values = [ 163 - ...values, 164 - key, 165 - allowReserved ? (v as string) : encodeURIComponent(v as string), 166 - ]; 167 - }); 168 - const joinedValues = values.join(','); 169 - switch (style) { 170 - case 'form': 171 - return `${name}=${joinedValues}`; 172 - case 'label': 173 - return `.${joinedValues}`; 174 - case 'matrix': 175 - return `;${name}=${joinedValues}`; 176 - default: 177 - return joinedValues; 178 - } 179 - } 180 - 181 - const separator = separatorObjectExplode(style); 182 - const joinedValues = Object.entries(value) 183 - .map(([key, v]) => 184 - serializePrimitiveParam({ 185 - allowReserved, 186 - name: style === 'deepObject' ? `${name}[${key}]` : key, 187 - value: v as string, 188 - }), 189 - ) 190 - .join(separator); 191 - return style === 'label' || style === 'matrix' 192 - ? separator + joinedValues 193 - : joinedValues; 194 - }; 195 25 196 26 const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { 197 27 let url = _url; ··· 364 194 } 365 195 }; 366 196 367 - export const getAuthToken = async ( 368 - auth: Auth, 369 - callback: RequestOptions['auth'], 370 - ): Promise<string | undefined> => { 371 - const token = 372 - typeof callback === 'function' ? await callback(auth) : callback; 373 - 374 - if (!token) { 375 - return; 376 - } 377 - 378 - if (auth.scheme === 'bearer') { 379 - return `Bearer ${token}`; 380 - } 381 - 382 - if (auth.scheme === 'basic') { 383 - return `Basic ${btoa(token)}`; 384 - } 385 - 386 - return token; 387 - }; 388 - 389 197 export const setAuthParams = async ({ 390 198 security, 391 199 ...options ··· 567 375 request: new Interceptors<ReqInterceptor<Req, Options>>(), 568 376 response: new Interceptors<ResInterceptor<Res, Req, Options>>(), 569 377 }); 570 - 571 - const serializeFormDataPair = (data: FormData, key: string, value: unknown) => { 572 - if (typeof value === 'string' || value instanceof Blob) { 573 - data.append(key, value); 574 - } else { 575 - data.append(key, JSON.stringify(value)); 576 - } 577 - }; 578 - 579 - export const formDataBodySerializer = { 580 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 581 - body: T, 582 - ) => { 583 - const data = new FormData(); 584 - 585 - Object.entries(body).forEach(([key, value]) => { 586 - if (value === undefined || value === null) { 587 - return; 588 - } 589 - if (Array.isArray(value)) { 590 - value.forEach((v) => serializeFormDataPair(data, key, v)); 591 - } else { 592 - serializeFormDataPair(data, key, value); 593 - } 594 - }); 595 - 596 - return data; 597 - }, 598 - }; 599 - 600 - export const jsonBodySerializer = { 601 - bodySerializer: <T>(body: T) => JSON.stringify(body), 602 - }; 603 - 604 - const serializeUrlSearchParamsPair = ( 605 - data: URLSearchParams, 606 - key: string, 607 - value: unknown, 608 - ) => { 609 - if (typeof value === 'string') { 610 - data.append(key, value); 611 - } else { 612 - data.append(key, JSON.stringify(value)); 613 - } 614 - }; 615 - 616 - export const urlSearchParamsBodySerializer = { 617 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 618 - body: T, 619 - ) => { 620 - const data = new URLSearchParams(); 621 - 622 - Object.entries(body).forEach(([key, value]) => { 623 - if (value === undefined || value === null) { 624 - return; 625 - } 626 - if (Array.isArray(value)) { 627 - value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); 628 - } else { 629 - serializeUrlSearchParamsPair(data, key, value); 630 - } 631 - }); 632 - 633 - return data; 634 - }, 635 - }; 636 378 637 379 const defaultQuerySerializer = createQuerySerializer({ 638 380 allowReserved: false,
+2 -1
packages/client-nuxt/package.json
··· 55 55 "src" 56 56 ], 57 57 "scripts": { 58 - "build": "tsup && pnpm check-exports", 58 + "build": "tsup && rollup -c && pnpm check-exports", 59 59 "check-exports": "attw --pack .", 60 60 "dev": "tsup --watch", 61 61 "prepublishOnly": "pnpm build", ··· 70 70 "vue": ">= 3.5.13 < 4" 71 71 }, 72 72 "devDependencies": { 73 + "@hey-api/client-core": "workspace:*", 73 74 "@nuxt/test-utils": "3.15.1" 74 75 } 75 76 }
+30
packages/client-nuxt/rollup.config.mjs
··· 1 + import path from 'node:path'; 2 + 3 + import { defineConfig } from 'rollup'; 4 + import dts from 'rollup-plugin-dts'; 5 + 6 + const files = ['index.d.ts', 'index.d.cts']; 7 + 8 + export default files.map((file) => 9 + defineConfig({ 10 + external: (id) => { 11 + const normalizedId = id.split(path.sep).join('/'); 12 + if (normalizedId === '@hey-api/client-core') { 13 + return false; 14 + } 15 + return ( 16 + !normalizedId.startsWith('/') && !/^[a-zA-Z]:\//.test(normalizedId) 17 + ); 18 + }, 19 + input: `./dist/${file}`, 20 + output: { 21 + file: `./dist/${file}`, 22 + format: 'es', 23 + }, 24 + plugins: [ 25 + dts({ 26 + respectExternal: true, 27 + }), 28 + ], 29 + }), 30 + );
+2 -52
packages/client-nuxt/src/__tests__/utils.test.ts
··· 1 + import type { Auth } from '@hey-api/client-core'; 1 2 import { describe, expect, it, vi } from 'vitest'; 2 3 3 - import type { Auth } from '../types'; 4 - import { getAuthToken, mergeInterceptors, setAuthParams } from '../utils'; 5 - 6 - describe('getAuthToken', () => { 7 - it('returns bearer token', async () => { 8 - const auth = vi.fn().mockReturnValue('foo'); 9 - const token = await getAuthToken( 10 - { 11 - scheme: 'bearer', 12 - type: 'http', 13 - }, 14 - auth, 15 - ); 16 - expect(auth).toHaveBeenCalled(); 17 - expect(token).toBe('Bearer foo'); 18 - }); 19 - 20 - it('returns basic token', async () => { 21 - const auth = vi.fn().mockReturnValue('foo:bar'); 22 - const token = await getAuthToken( 23 - { 24 - scheme: 'basic', 25 - type: 'http', 26 - }, 27 - auth, 28 - ); 29 - expect(auth).toHaveBeenCalled(); 30 - expect(token).toBe(`Basic ${btoa('foo:bar')}`); 31 - }); 32 - 33 - it('returns raw token', async () => { 34 - const auth = vi.fn().mockReturnValue('foo'); 35 - const token = await getAuthToken( 36 - { 37 - type: 'http', 38 - }, 39 - auth, 40 - ); 41 - expect(auth).toHaveBeenCalled(); 42 - expect(token).toBe('foo'); 43 - }); 44 - 45 - it('returns nothing when auth function is undefined', async () => { 46 - const token = await getAuthToken( 47 - { 48 - type: 'http', 49 - }, 50 - undefined, 51 - ); 52 - expect(token).toBeUndefined(); 53 - }); 54 - }); 4 + import { mergeInterceptors, setAuthParams } from '../utils'; 55 5 56 6 describe('mergeInterceptors', () => { 57 7 it('handles no arguments', () => {
+3 -4
packages/client-nuxt/src/index.ts
··· 151 151 }; 152 152 153 153 export type { 154 - Auth, 155 154 Client, 156 155 Composable, 157 156 Config, 158 157 Options, 159 158 OptionsLegacyParser, 160 - QuerySerializerOptions, 161 159 RequestOptions, 162 160 RequestResult, 163 161 } from './types'; 162 + export { createConfig } from './utils'; 163 + export type { Auth, QuerySerializerOptions } from '@hey-api/client-core'; 164 164 export { 165 - createConfig, 166 165 formDataBodySerializer, 167 166 jsonBodySerializer, 168 167 urlSearchParamsBodySerializer, 169 - } from './utils'; 168 + } from '@hey-api/client-core';
+5 -27
packages/client-nuxt/src/types.ts
··· 1 + import type { 2 + Auth, 3 + BodySerializer, 4 + QuerySerializerOptions, 5 + } from '@hey-api/client-core'; 1 6 import type { 2 7 AsyncDataOptions, 3 8 useAsyncData, ··· 14 19 export type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; 15 20 type ObjectStyle = 'form' | 'deepObject'; 16 21 17 - export type BodySerializer = (body: any) => any; 18 - 19 - export interface SerializerOptions<T> { 20 - /** 21 - * @default true 22 - */ 23 - explode: boolean; 24 - style: T; 25 - } 26 - 27 22 export type QuerySerializer = ( 28 23 query: Parameters<Client['buildUrl']>[0]['query'], 29 24 ) => string; 30 25 31 - export interface QuerySerializerOptions { 32 - allowReserved?: boolean; 33 - array?: SerializerOptions<ArrayStyle>; 34 - object?: SerializerOptions<ObjectStyle>; 35 - } 36 - 37 26 type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 38 27 39 28 type WithRefs<TData> = { ··· 49 38 >, 50 39 WithRefs<Pick<FetchOptions<unknown>, 'query'>> { 51 40 /** 52 - * **This feature works only with the [experimental parser](https://heyapi.dev/openapi-ts/configuration#parser)** 53 - * 54 41 * Auth token or a function returning auth token. The resolved value will be 55 42 * added to the request payload as defined by its `security` array. 56 43 */ ··· 113 100 */ 114 101 responseTransformer?: (data: unknown) => Promise<unknown>; 115 102 /** 116 - * **This feature works only with the [experimental parser](https://heyapi.dev/openapi-ts/configuration#parser)** 117 - * 118 103 * A function validating response data. This is useful if you want to ensure 119 104 * the response conforms to the desired shape, so it can be safely passed to 120 105 * the transformers and returned to the user. 121 106 */ 122 107 responseValidator?: (data: unknown) => Promise<unknown>; 123 - } 124 - 125 - export interface Auth { 126 - in?: 'header' | 'query'; 127 - name?: string; 128 - scheme?: 'basic' | 'bearer'; 129 - type: 'apiKey' | 'http'; 130 108 } 131 109 132 110 type AuthToken = string | undefined;
+8 -254
packages/client-nuxt/src/utils.ts
··· 1 + import type { QuerySerializerOptions } from '@hey-api/client-core'; 2 + import { 3 + getAuthToken, 4 + jsonBodySerializer, 5 + serializeArrayParam, 6 + serializeObjectParam, 7 + serializePrimitiveParam, 8 + } from '@hey-api/client-core'; 1 9 import type { ComputedRef, Ref } from 'vue'; 2 10 import { isRef, toValue, unref } from 'vue'; 3 11 4 12 import type { 5 13 ArraySeparatorStyle, 6 - Auth, 7 14 BuildUrlOptions, 8 15 Client, 9 16 Config, 10 - ObjectSeparatorStyle, 11 17 QuerySerializer, 12 - QuerySerializerOptions, 13 18 RequestOptions, 14 - SerializerOptions, 15 19 } from './types'; 16 20 17 21 type PathSerializer = Pick<Required<BuildUrlOptions>, 'path' | 'url'>; ··· 20 24 21 25 type MaybeArray<T> = T | T[]; 22 26 23 - interface SerializeOptions<T> 24 - extends SerializePrimitiveOptions, 25 - SerializerOptions<T> {} 26 - interface SerializePrimitiveOptions { 27 - allowReserved?: boolean; 28 - name: string; 29 - } 30 - interface SerializePrimitiveParam extends SerializePrimitiveOptions { 31 - value: string; 32 - } 33 - 34 - const serializePrimitiveParam = ({ 35 - allowReserved, 36 - name, 37 - value, 38 - }: SerializePrimitiveParam) => { 39 - if (value === undefined || value === null) { 40 - return ''; 41 - } 42 - 43 - if (typeof value === 'object') { 44 - throw new Error( 45 - 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', 46 - ); 47 - } 48 - 49 - return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; 50 - }; 51 - 52 - const separatorArrayExplode = (style: ArraySeparatorStyle) => { 53 - switch (style) { 54 - case 'label': 55 - return '.'; 56 - case 'matrix': 57 - return ';'; 58 - case 'simple': 59 - return ','; 60 - default: 61 - return '&'; 62 - } 63 - }; 64 - 65 - const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { 66 - switch (style) { 67 - case 'form': 68 - return ','; 69 - case 'pipeDelimited': 70 - return '|'; 71 - case 'spaceDelimited': 72 - return '%20'; 73 - default: 74 - return ','; 75 - } 76 - }; 77 - 78 - const separatorObjectExplode = (style: ObjectSeparatorStyle) => { 79 - switch (style) { 80 - case 'label': 81 - return '.'; 82 - case 'matrix': 83 - return ';'; 84 - case 'simple': 85 - return ','; 86 - default: 87 - return '&'; 88 - } 89 - }; 90 - 91 - const serializeArrayParam = ({ 92 - allowReserved, 93 - explode, 94 - name, 95 - style, 96 - value, 97 - }: SerializeOptions<ArraySeparatorStyle> & { 98 - value: unknown[]; 99 - }) => { 100 - if (!explode) { 101 - const joinedValues = ( 102 - allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) 103 - ).join(separatorArrayNoExplode(style)); 104 - switch (style) { 105 - case 'label': 106 - return `.${joinedValues}`; 107 - case 'matrix': 108 - return `;${name}=${joinedValues}`; 109 - case 'simple': 110 - return joinedValues; 111 - default: 112 - return `${name}=${joinedValues}`; 113 - } 114 - } 115 - 116 - const separator = separatorArrayExplode(style); 117 - const joinedValues = value 118 - .map((v) => { 119 - if (style === 'label' || style === 'simple') { 120 - return allowReserved ? v : encodeURIComponent(v as string); 121 - } 122 - 123 - return serializePrimitiveParam({ 124 - allowReserved, 125 - name, 126 - value: v as string, 127 - }); 128 - }) 129 - .join(separator); 130 - return style === 'label' || style === 'matrix' 131 - ? separator + joinedValues 132 - : joinedValues; 133 - }; 134 - 135 - const serializeObjectParam = ({ 136 - allowReserved, 137 - explode, 138 - name, 139 - style, 140 - value, 141 - }: SerializeOptions<ObjectSeparatorStyle> & { 142 - value: Record<string, unknown> | Date; 143 - }) => { 144 - if (value instanceof Date) { 145 - return `${name}=${value.toISOString()}`; 146 - } 147 - 148 - if (style !== 'deepObject' && !explode) { 149 - let values: string[] = []; 150 - Object.entries(value).forEach(([key, v]) => { 151 - values = [ 152 - ...values, 153 - key, 154 - allowReserved ? (v as string) : encodeURIComponent(v as string), 155 - ]; 156 - }); 157 - const joinedValues = values.join(','); 158 - switch (style) { 159 - case 'form': 160 - return `${name}=${joinedValues}`; 161 - case 'label': 162 - return `.${joinedValues}`; 163 - case 'matrix': 164 - return `;${name}=${joinedValues}`; 165 - default: 166 - return joinedValues; 167 - } 168 - } 169 - 170 - const separator = separatorObjectExplode(style); 171 - const joinedValues = Object.entries(value) 172 - .map(([key, v]) => 173 - serializePrimitiveParam({ 174 - allowReserved, 175 - name: style === 'deepObject' ? `${name}[${key}]` : key, 176 - value: v as string, 177 - }), 178 - ) 179 - .join(separator); 180 - return style === 'label' || style === 'matrix' 181 - ? separator + joinedValues 182 - : joinedValues; 183 - }; 184 - 185 27 const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { 186 28 let url = _url; 187 29 const matches = _url.match(PATH_PARAM_RE); ··· 312 154 return querySerializer; 313 155 }; 314 156 315 - export const getAuthToken = async ( 316 - auth: Auth, 317 - callback: RequestOptions['auth'], 318 - ): Promise<string | undefined> => { 319 - const token = 320 - typeof callback === 'function' ? await callback(auth) : callback; 321 - 322 - if (!token) { 323 - return; 324 - } 325 - 326 - if (auth.scheme === 'bearer') { 327 - return `Bearer ${token}`; 328 - } 329 - 330 - if (auth.scheme === 'basic') { 331 - return `Basic ${btoa(token)}`; 332 - } 333 - 334 - return token; 335 - }; 336 - 337 157 export const setAuthParams = async ({ 338 158 security, 339 159 ...options ··· 464 284 } 465 285 return acc; 466 286 }, []); 467 - 468 - const serializeFormDataPair = (data: FormData, key: string, value: unknown) => { 469 - if (typeof value === 'string' || value instanceof Blob) { 470 - data.append(key, value); 471 - } else { 472 - data.append(key, JSON.stringify(value)); 473 - } 474 - }; 475 - 476 - export const formDataBodySerializer = { 477 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 478 - body: T, 479 - ) => { 480 - const data = new FormData(); 481 - 482 - Object.entries(body).forEach(([key, value]) => { 483 - if (value === undefined || value === null) { 484 - return; 485 - } 486 - if (Array.isArray(value)) { 487 - value.forEach((v) => serializeFormDataPair(data, key, v)); 488 - } else { 489 - serializeFormDataPair(data, key, value); 490 - } 491 - }); 492 - 493 - return data; 494 - }, 495 - }; 496 - 497 - export const jsonBodySerializer = { 498 - bodySerializer: <T>(body: T) => JSON.stringify(body), 499 - }; 500 - 501 - const serializeUrlSearchParamsPair = ( 502 - data: URLSearchParams, 503 - key: string, 504 - value: unknown, 505 - ) => { 506 - if (typeof value === 'string') { 507 - data.append(key, value); 508 - } else { 509 - data.append(key, JSON.stringify(value)); 510 - } 511 - }; 512 - 513 - export const urlSearchParamsBodySerializer = { 514 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 515 - body: T, 516 - ) => { 517 - const data = new URLSearchParams(); 518 - 519 - Object.entries(body).forEach(([key, value]) => { 520 - if (value === undefined || value === null) { 521 - return; 522 - } 523 - if (Array.isArray(value)) { 524 - value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); 525 - } else { 526 - serializeUrlSearchParamsPair(data, key, value); 527 - } 528 - }); 529 - 530 - return data; 531 - }, 532 - }; 533 287 534 288 const defaultQuerySerializer = createQuerySerializer({ 535 289 allowReserved: false,
+9 -12
packages/openapi-ts/src/generate/client.ts
··· 54 54 55 55 const clientModulePath = path.normalize(require.resolve(name)); 56 56 const clientModulePathComponents = clientModulePath.split(path.sep); 57 - const clientSrcPath = [ 58 - ...clientModulePathComponents.slice( 59 - 0, 60 - clientModulePathComponents.indexOf('dist'), 61 - ), 62 - 'src', 63 - ].join(path.sep); 57 + const clientDistPath = clientModulePathComponents 58 + .slice(0, clientModulePathComponents.indexOf('dist') + 1) 59 + .join(path.sep); 64 60 65 - // copy client modules 66 - const files = ['index.ts', 'types.ts', 'utils.ts']; 67 - files.forEach((file) => { 61 + const indexJsFile = 62 + clientModulePathComponents[clientModulePathComponents.length - 1]; 63 + const distFiles = [indexJsFile!, 'index.d.cts', 'index.d.ts']; 64 + for (const file of distFiles) { 68 65 fs.copyFileSync( 69 - path.resolve(clientSrcPath, file), 66 + path.resolve(clientDistPath, file), 70 67 path.resolve(dirPath, file), 71 68 ); 72 - }); 69 + } 73 70 };
+2
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-axios/bundle/client/index.cjs
··· 1 + 'use strict';var D=require('axios');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var D__default=/*#__PURE__*/_interopDefault(D);var R=async(t,e)=>{let r=typeof e=="function"?await e(t):e;if(r)return t.scheme==="bearer"?`Bearer ${r}`:t.scheme==="basic"?`Basic ${btoa(r)}`:r},w=(t,e,r)=>{typeof r=="string"||r instanceof Blob?t.append(e,r):t.append(e,JSON.stringify(r));},C=(t,e,r)=>{typeof r=="string"?t.append(e,r):t.append(e,JSON.stringify(r));},O={bodySerializer:t=>{let e=new FormData;return Object.entries(t).forEach(([r,i])=>{i!=null&&(Array.isArray(i)?i.forEach(a=>w(e,r,a)):w(e,r,i));}),e}},q={bodySerializer:t=>JSON.stringify(t)},v={bodySerializer:t=>{let e=new URLSearchParams;return Object.entries(t).forEach(([r,i])=>{i!=null&&(Array.isArray(i)?i.forEach(a=>C(e,r,a)):C(e,r,i));}),e}},$=t=>{switch(t){case "label":return ".";case "matrix":return ";";case "simple":return ",";default:return "&"}},P=t=>{switch(t){case "form":return ",";case "pipeDelimited":return "|";case "spaceDelimited":return "%20";default:return ","}},k=t=>{switch(t){case "label":return ".";case "matrix":return ";";case "simple":return ",";default:return "&"}},h=({allowReserved:t,explode:e,name:r,style:i,value:a})=>{if(!e){let n=(t?a:a.map(o=>encodeURIComponent(o))).join(P(i));switch(i){case "label":return `.${n}`;case "matrix":return `;${r}=${n}`;case "simple":return n;default:return `${r}=${n}`}}let s=$(i),l=a.map(n=>i==="label"||i==="simple"?t?n:encodeURIComponent(n):d({allowReserved:t,name:r,value:n})).join(s);return i==="label"||i==="matrix"?s+l:l},d=({allowReserved:t,name:e,value:r})=>{if(r==null)return "";if(typeof r=="object")throw new Error("Deeply-nested arrays/objects aren\u2019t supported. Provide your own `querySerializer()` to handle these.");return `${e}=${t?r:encodeURIComponent(r)}`},g=({allowReserved:t,explode:e,name:r,style:i,value:a})=>{if(a instanceof Date)return `${r}=${a.toISOString()}`;if(i!=="deepObject"&&!e){let n=[];Object.entries(a).forEach(([u,f])=>{n=[...n,u,t?f:encodeURIComponent(f)];});let o=n.join(",");switch(i){case "form":return `${r}=${o}`;case "label":return `.${o}`;case "matrix":return `;${r}=${o}`;default:return o}}let s=k(i),l=Object.entries(a).map(([n,o])=>d({allowReserved:t,name:i==="deepObject"?`${r}[${n}]`:n,value:o})).join(s);return i==="label"||i==="matrix"?s+l:l};var E=/\{[^{}]+\}/g,U=({path:t,url:e})=>{let r=e,i=e.match(E);if(i)for(let a of i){let s=false,l=a.substring(1,a.length-1),n="simple";l.endsWith("*")&&(s=true,l=l.substring(0,l.length-1)),l.startsWith(".")?(l=l.substring(1),n="label"):l.startsWith(";")&&(l=l.substring(1),n="matrix");let o=t[l];if(o==null)continue;if(Array.isArray(o)){r=r.replace(a,h({explode:s,name:l,style:n,value:o}));continue}if(typeof o=="object"){r=r.replace(a,g({explode:s,name:l,style:n,value:o}));continue}if(n==="matrix"){r=r.replace(a,`;${d({name:l,value:o})}`);continue}let u=encodeURIComponent(n==="label"?`.${o}`:o);r=r.replace(a,u);}return r},B=({allowReserved:t,array:e,object:r}={})=>a=>{let s=[];if(a&&typeof a=="object")for(let l in a){let n=a[l];if(n!=null){if(Array.isArray(n)){s=[...s,h({allowReserved:t,explode:true,name:l,style:"form",value:n,...e})];continue}if(typeof n=="object"){s=[...s,g({allowReserved:t,explode:true,name:l,style:"deepObject",value:n,...r})];continue}s=[...s,d({allowReserved:t,name:l,value:n})];}}return s.join("&")},A=async({security:t,...e})=>{for(let r of t){let i=await R(r,e.auth);if(!i)continue;let a=r.name??"Authorization";switch(r.in){case "query":e.query||(e.query={}),e.query[a]=i;break;case "header":default:e.headers[a]=i;break}return}},b=t=>H({path:t.path,query:t.paramsSerializer?undefined:t.query,querySerializer:typeof t.querySerializer=="function"?t.querySerializer:B(t.querySerializer),url:t.url}),H=({path:t,query:e,querySerializer:r,url:i})=>{let s=i.startsWith("/")?i:`/${i}`;t&&(s=U({path:t,url:s}));let l=e?r(e):"";return l.startsWith("?")&&(l=l.substring(1)),l&&(s+=`?${l}`),s},x=(t,e)=>{let r={...t,...e};return r.headers=y(t.headers,e.headers),r},T=["common","delete","get","head","patch","post","put"],y=(...t)=>{let e={};for(let r of t){if(!r||typeof r!="object")continue;let i=Object.entries(r);for(let[a,s]of i)if(T.includes(a)&&typeof s=="object")e[a]={...e[a],...s};else if(s===null)delete e[a];else if(Array.isArray(s))for(let l of s)e[a]=[...e[a]??[],l];else s!==undefined&&(e[a]=typeof s=="object"?JSON.stringify(s):s);}return e},S=(t={})=>({baseURL:"",...t});var L=t=>{let e=x(S(),t),{auth:r,...i}=e,a=D__default.default.create(i),s=()=>({...e}),l=o=>(e=x(e,o),a.defaults={...a.defaults,...e,headers:y(a.defaults.headers,e.headers)},s()),n=async o=>{let u={...e,...o,axios:o.axios??e.axios??a,headers:y(e.headers,o.headers)};u.security&&await A({...u,security:u.security}),u.body&&u.bodySerializer&&(u.body=u.bodySerializer(u.body));let f=b(u);try{let m=u.axios,{auth:c,...j}=u,z=await m({...j,data:u.body,headers:u.headers,params:u.paramsSerializer?u.query:void 0,url:f}),{data:p}=z;return u.responseType==="json"&&(u.responseValidator&&await u.responseValidator(p),u.responseTransformer&&(p=await u.responseTransformer(p))),{...z,data:p??{}}}catch(m){let c=m;if(u.throwOnError)throw c;return c.error=c.response?.data??{},c}};return {buildUrl:b,delete:o=>n({...o,method:"delete"}),get:o=>n({...o,method:"get"}),getConfig:s,head:o=>n({...o,method:"head"}),instance:a,options:o=>n({...o,method:"options"}),patch:o=>n({...o,method:"patch"}),post:o=>n({...o,method:"post"}),put:o=>n({...o,method:"put"}),request:n,setConfig:l}};exports.createClient=L;exports.createConfig=S;exports.formDataBodySerializer=O;exports.jsonBodySerializer=q;exports.urlSearchParamsBodySerializer=v;//# sourceMappingURL=index.cjs.map 2 + //# sourceMappingURL=index.cjs.map
+169
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-axios/bundle/client/index.d.cts
··· 1 + import { CreateAxiosDefaults, AxiosStatic, AxiosResponse, AxiosError, AxiosInstance } from 'axios'; 2 + 3 + interface Auth { 4 + in?: 'header' | 'query'; 5 + name?: string; 6 + scheme?: 'basic' | 'bearer'; 7 + type: 'apiKey' | 'http'; 8 + } 9 + interface SerializerOptions<T> { 10 + /** 11 + * @default true 12 + */ 13 + explode: boolean; 14 + style: T; 15 + } 16 + type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 17 + type ObjectStyle = 'form' | 'deepObject'; 18 + 19 + type QuerySerializer = (query: Record<string, unknown>) => string; 20 + type BodySerializer = (body: any) => any; 21 + interface QuerySerializerOptions { 22 + allowReserved?: boolean; 23 + array?: SerializerOptions<ArrayStyle>; 24 + object?: SerializerOptions<ObjectStyle>; 25 + } 26 + declare const formDataBodySerializer: { 27 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => FormData; 28 + }; 29 + declare const jsonBodySerializer: { 30 + bodySerializer: <T>(body: T) => string; 31 + }; 32 + declare const urlSearchParamsBodySerializer: { 33 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => URLSearchParams; 34 + }; 35 + 36 + type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 37 + interface Config<ThrowOnError extends boolean = boolean> extends Omit<CreateAxiosDefaults, 'auth' | 'headers'> { 38 + /** 39 + * Auth token or a function returning auth token. The resolved value will be 40 + * added to the request payload as defined by its `security` array. 41 + */ 42 + auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 43 + /** 44 + * Axios implementation. You can use this option to provide a custom 45 + * Axios instance. 46 + * 47 + * @default axios 48 + */ 49 + axios?: AxiosStatic; 50 + /** 51 + * A function for serializing request body parameter. By default, 52 + * {@link JSON.stringify()} will be used. 53 + */ 54 + bodySerializer?: BodySerializer | null; 55 + /** 56 + * An object containing any HTTP headers that you want to pre-populate your 57 + * `Headers` object with. 58 + * 59 + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 60 + */ 61 + headers?: CreateAxiosDefaults['headers'] | Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined | unknown>; 62 + /** 63 + * The request method. 64 + * 65 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 66 + */ 67 + method?: 'connect' | 'delete' | 'get' | 'head' | 'options' | 'patch' | 'post' | 'put' | 'trace'; 68 + /** 69 + * A function for serializing request query parameters. By default, arrays 70 + * will be exploded in form style, objects will be exploded in deepObject 71 + * style, and reserved characters are percent-encoded. 72 + * 73 + * This method will have no effect if the native `paramsSerializer()` Axios 74 + * API function is used. 75 + * 76 + * {@link https://swagger.io/docs/specification/serialization/#query View examples} 77 + */ 78 + querySerializer?: QuerySerializer | QuerySerializerOptions; 79 + /** 80 + * A function transforming response data before it's returned. This is useful 81 + * for post-processing data, e.g. converting ISO strings into Date objects. 82 + */ 83 + responseTransformer?: (data: unknown) => Promise<unknown>; 84 + /** 85 + * A function validating response data. This is useful if you want to ensure 86 + * the response conforms to the desired shape, so it can be safely passed to 87 + * the transformers and returned to the user. 88 + */ 89 + responseValidator?: (data: unknown) => Promise<unknown>; 90 + /** 91 + * Throw an error instead of returning it in the response? 92 + * 93 + * @default false 94 + */ 95 + throwOnError?: ThrowOnError; 96 + } 97 + type AuthToken = string | undefined; 98 + interface RequestOptions<ThrowOnError extends boolean = boolean, Url extends string = string> extends Config<ThrowOnError> { 99 + /** 100 + * Any body that you want to add to your request. 101 + * 102 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 103 + */ 104 + body?: unknown; 105 + /** 106 + * You can provide a client instance returned by `createClient()` instead of 107 + * individual options. This might be also useful if you want to implement a 108 + * custom client. 109 + */ 110 + client?: Client; 111 + path?: Record<string, unknown>; 112 + query?: Record<string, unknown>; 113 + /** 114 + * Security mechanism(s) to use for the request. 115 + */ 116 + security?: ReadonlyArray<Auth>; 117 + url: Url; 118 + } 119 + type RequestResult<TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean> = ThrowOnError extends true ? Promise<AxiosResponse<TData>> : Promise<(AxiosResponse<TData> & { 120 + error: undefined; 121 + }) | (AxiosError<TError> & { 122 + data: undefined; 123 + error: TError; 124 + })>; 125 + type MethodFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions<ThrowOnError>, 'method'>) => RequestResult<TData, TError, ThrowOnError>; 126 + type RequestFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions<ThrowOnError>, 'method'> & Pick<Required<RequestOptions<ThrowOnError>>, 'method'>) => RequestResult<TData, TError, ThrowOnError>; 127 + interface Client { 128 + /** 129 + * Returns the final request URL. This method works only with experimental parser. 130 + */ 131 + buildUrl: <TData extends { 132 + body?: unknown; 133 + path?: Record<string, unknown>; 134 + query?: Record<string, unknown>; 135 + url: string; 136 + }>(options: Pick<TData, 'url'> & Omit<Options<TData>, 'axios'>) => string; 137 + delete: MethodFn; 138 + get: MethodFn; 139 + getConfig: () => Config; 140 + head: MethodFn; 141 + instance: AxiosInstance; 142 + options: MethodFn; 143 + patch: MethodFn; 144 + post: MethodFn; 145 + put: MethodFn; 146 + request: RequestFn; 147 + setConfig: (config: Config) => Config; 148 + } 149 + interface DataShape { 150 + body?: unknown; 151 + headers?: unknown; 152 + path?: unknown; 153 + query?: unknown; 154 + url: string; 155 + } 156 + type Options<TData extends DataShape = DataShape, ThrowOnError extends boolean = boolean> = OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & Omit<TData, 'url'>; 157 + type OptionsLegacyParser<TData = unknown, ThrowOnError extends boolean = boolean> = TData extends { 158 + body?: any; 159 + } ? TData extends { 160 + headers?: any; 161 + } ? OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'headers' | 'url'> & TData : OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'url'> & TData & Pick<RequestOptions<ThrowOnError>, 'headers'> : TData extends { 162 + headers?: any; 163 + } ? OmitKeys<RequestOptions<ThrowOnError>, 'headers' | 'url'> & TData & Pick<RequestOptions<ThrowOnError>, 'body'> : OmitKeys<RequestOptions<ThrowOnError>, 'url'> & TData; 164 + 165 + declare const createConfig: (override?: Config) => Config; 166 + 167 + declare const createClient: (config: Config) => Client; 168 + 169 + export { type Auth, type Client, type Config, type Options, type OptionsLegacyParser, type QuerySerializerOptions, type RequestOptions, type RequestResult, createClient, createConfig, formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer };
+169
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-axios/bundle/client/index.d.ts
··· 1 + import { CreateAxiosDefaults, AxiosStatic, AxiosResponse, AxiosError, AxiosInstance } from 'axios'; 2 + 3 + interface Auth { 4 + in?: 'header' | 'query'; 5 + name?: string; 6 + scheme?: 'basic' | 'bearer'; 7 + type: 'apiKey' | 'http'; 8 + } 9 + interface SerializerOptions<T> { 10 + /** 11 + * @default true 12 + */ 13 + explode: boolean; 14 + style: T; 15 + } 16 + type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 17 + type ObjectStyle = 'form' | 'deepObject'; 18 + 19 + type QuerySerializer = (query: Record<string, unknown>) => string; 20 + type BodySerializer = (body: any) => any; 21 + interface QuerySerializerOptions { 22 + allowReserved?: boolean; 23 + array?: SerializerOptions<ArrayStyle>; 24 + object?: SerializerOptions<ObjectStyle>; 25 + } 26 + declare const formDataBodySerializer: { 27 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => FormData; 28 + }; 29 + declare const jsonBodySerializer: { 30 + bodySerializer: <T>(body: T) => string; 31 + }; 32 + declare const urlSearchParamsBodySerializer: { 33 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => URLSearchParams; 34 + }; 35 + 36 + type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 37 + interface Config<ThrowOnError extends boolean = boolean> extends Omit<CreateAxiosDefaults, 'auth' | 'headers'> { 38 + /** 39 + * Auth token or a function returning auth token. The resolved value will be 40 + * added to the request payload as defined by its `security` array. 41 + */ 42 + auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 43 + /** 44 + * Axios implementation. You can use this option to provide a custom 45 + * Axios instance. 46 + * 47 + * @default axios 48 + */ 49 + axios?: AxiosStatic; 50 + /** 51 + * A function for serializing request body parameter. By default, 52 + * {@link JSON.stringify()} will be used. 53 + */ 54 + bodySerializer?: BodySerializer | null; 55 + /** 56 + * An object containing any HTTP headers that you want to pre-populate your 57 + * `Headers` object with. 58 + * 59 + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 60 + */ 61 + headers?: CreateAxiosDefaults['headers'] | Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined | unknown>; 62 + /** 63 + * The request method. 64 + * 65 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 66 + */ 67 + method?: 'connect' | 'delete' | 'get' | 'head' | 'options' | 'patch' | 'post' | 'put' | 'trace'; 68 + /** 69 + * A function for serializing request query parameters. By default, arrays 70 + * will be exploded in form style, objects will be exploded in deepObject 71 + * style, and reserved characters are percent-encoded. 72 + * 73 + * This method will have no effect if the native `paramsSerializer()` Axios 74 + * API function is used. 75 + * 76 + * {@link https://swagger.io/docs/specification/serialization/#query View examples} 77 + */ 78 + querySerializer?: QuerySerializer | QuerySerializerOptions; 79 + /** 80 + * A function transforming response data before it's returned. This is useful 81 + * for post-processing data, e.g. converting ISO strings into Date objects. 82 + */ 83 + responseTransformer?: (data: unknown) => Promise<unknown>; 84 + /** 85 + * A function validating response data. This is useful if you want to ensure 86 + * the response conforms to the desired shape, so it can be safely passed to 87 + * the transformers and returned to the user. 88 + */ 89 + responseValidator?: (data: unknown) => Promise<unknown>; 90 + /** 91 + * Throw an error instead of returning it in the response? 92 + * 93 + * @default false 94 + */ 95 + throwOnError?: ThrowOnError; 96 + } 97 + type AuthToken = string | undefined; 98 + interface RequestOptions<ThrowOnError extends boolean = boolean, Url extends string = string> extends Config<ThrowOnError> { 99 + /** 100 + * Any body that you want to add to your request. 101 + * 102 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 103 + */ 104 + body?: unknown; 105 + /** 106 + * You can provide a client instance returned by `createClient()` instead of 107 + * individual options. This might be also useful if you want to implement a 108 + * custom client. 109 + */ 110 + client?: Client; 111 + path?: Record<string, unknown>; 112 + query?: Record<string, unknown>; 113 + /** 114 + * Security mechanism(s) to use for the request. 115 + */ 116 + security?: ReadonlyArray<Auth>; 117 + url: Url; 118 + } 119 + type RequestResult<TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean> = ThrowOnError extends true ? Promise<AxiosResponse<TData>> : Promise<(AxiosResponse<TData> & { 120 + error: undefined; 121 + }) | (AxiosError<TError> & { 122 + data: undefined; 123 + error: TError; 124 + })>; 125 + type MethodFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions<ThrowOnError>, 'method'>) => RequestResult<TData, TError, ThrowOnError>; 126 + type RequestFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions<ThrowOnError>, 'method'> & Pick<Required<RequestOptions<ThrowOnError>>, 'method'>) => RequestResult<TData, TError, ThrowOnError>; 127 + interface Client { 128 + /** 129 + * Returns the final request URL. This method works only with experimental parser. 130 + */ 131 + buildUrl: <TData extends { 132 + body?: unknown; 133 + path?: Record<string, unknown>; 134 + query?: Record<string, unknown>; 135 + url: string; 136 + }>(options: Pick<TData, 'url'> & Omit<Options<TData>, 'axios'>) => string; 137 + delete: MethodFn; 138 + get: MethodFn; 139 + getConfig: () => Config; 140 + head: MethodFn; 141 + instance: AxiosInstance; 142 + options: MethodFn; 143 + patch: MethodFn; 144 + post: MethodFn; 145 + put: MethodFn; 146 + request: RequestFn; 147 + setConfig: (config: Config) => Config; 148 + } 149 + interface DataShape { 150 + body?: unknown; 151 + headers?: unknown; 152 + path?: unknown; 153 + query?: unknown; 154 + url: string; 155 + } 156 + type Options<TData extends DataShape = DataShape, ThrowOnError extends boolean = boolean> = OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & Omit<TData, 'url'>; 157 + type OptionsLegacyParser<TData = unknown, ThrowOnError extends boolean = boolean> = TData extends { 158 + body?: any; 159 + } ? TData extends { 160 + headers?: any; 161 + } ? OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'headers' | 'url'> & TData : OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'url'> & TData & Pick<RequestOptions<ThrowOnError>, 'headers'> : TData extends { 162 + headers?: any; 163 + } ? OmitKeys<RequestOptions<ThrowOnError>, 'headers' | 'url'> & TData & Pick<RequestOptions<ThrowOnError>, 'body'> : OmitKeys<RequestOptions<ThrowOnError>, 'url'> & TData; 164 + 165 + declare const createConfig: (override?: Config) => Config; 166 + 167 + declare const createClient: (config: Config) => Client; 168 + 169 + export { type Auth, type Client, type Config, type Options, type OptionsLegacyParser, type QuerySerializerOptions, type RequestOptions, type RequestResult, createClient, createConfig, formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer };
-126
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-axios/bundle/client/index.ts
··· 1 - import type { AxiosError, RawAxiosRequestHeaders } from 'axios'; 2 - import axios from 'axios'; 3 - 4 - import type { Client, Config } from './types'; 5 - import { 6 - buildUrl, 7 - createConfig, 8 - mergeConfigs, 9 - mergeHeaders, 10 - setAuthParams, 11 - } from './utils'; 12 - 13 - export const createClient = (config: Config): Client => { 14 - let _config = mergeConfigs(createConfig(), config); 15 - 16 - // eslint-disable-next-line @typescript-eslint/no-unused-vars 17 - const { auth, ...configWithoutAuth } = _config; 18 - const instance = axios.create(configWithoutAuth); 19 - 20 - const getConfig = (): Config => ({ ..._config }); 21 - 22 - const setConfig = (config: Config): Config => { 23 - _config = mergeConfigs(_config, config); 24 - instance.defaults = { 25 - ...instance.defaults, 26 - ..._config, 27 - // @ts-expect-error 28 - headers: mergeHeaders(instance.defaults.headers, _config.headers), 29 - }; 30 - return getConfig(); 31 - }; 32 - 33 - // @ts-expect-error 34 - const request: Client['request'] = async (options) => { 35 - const opts = { 36 - ..._config, 37 - ...options, 38 - axios: options.axios ?? _config.axios ?? instance, 39 - headers: mergeHeaders(_config.headers, options.headers), 40 - }; 41 - 42 - if (opts.security) { 43 - await setAuthParams({ 44 - ...opts, 45 - security: opts.security, 46 - }); 47 - } 48 - 49 - if (opts.body && opts.bodySerializer) { 50 - opts.body = opts.bodySerializer(opts.body); 51 - } 52 - 53 - const url = buildUrl(opts); 54 - 55 - try { 56 - // assign Axios here for consistency with fetch 57 - const _axios = opts.axios; 58 - // eslint-disable-next-line @typescript-eslint/no-unused-vars 59 - const { auth, ...optsWithoutAuth } = opts; 60 - const response = await _axios({ 61 - ...optsWithoutAuth, 62 - data: opts.body, 63 - headers: opts.headers as RawAxiosRequestHeaders, 64 - // let `paramsSerializer()` handle query params if it exists 65 - params: opts.paramsSerializer ? opts.query : undefined, 66 - url, 67 - }); 68 - 69 - let { data } = response; 70 - 71 - if (opts.responseType === 'json') { 72 - if (opts.responseValidator) { 73 - await opts.responseValidator(data); 74 - } 75 - 76 - if (opts.responseTransformer) { 77 - data = await opts.responseTransformer(data); 78 - } 79 - } 80 - 81 - return { 82 - ...response, 83 - data: data ?? {}, 84 - }; 85 - } catch (error) { 86 - const e = error as AxiosError; 87 - if (opts.throwOnError) { 88 - throw e; 89 - } 90 - // @ts-expect-error 91 - e.error = e.response?.data ?? {}; 92 - return e; 93 - } 94 - }; 95 - 96 - return { 97 - buildUrl, 98 - delete: (options) => request({ ...options, method: 'delete' }), 99 - get: (options) => request({ ...options, method: 'get' }), 100 - getConfig, 101 - head: (options) => request({ ...options, method: 'head' }), 102 - instance, 103 - options: (options) => request({ ...options, method: 'options' }), 104 - patch: (options) => request({ ...options, method: 'patch' }), 105 - post: (options) => request({ ...options, method: 'post' }), 106 - put: (options) => request({ ...options, method: 'put' }), 107 - request, 108 - setConfig, 109 - } as Client; 110 - }; 111 - 112 - export type { 113 - Auth, 114 - Client, 115 - Config, 116 - Options, 117 - OptionsLegacyParser, 118 - RequestOptions, 119 - RequestResult, 120 - } from './types'; 121 - export { 122 - createConfig, 123 - formDataBodySerializer, 124 - jsonBodySerializer, 125 - urlSearchParamsBodySerializer, 126 - } from './utils';
-215
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-axios/bundle/client/types.ts
··· 1 - import type { 2 - AxiosError, 3 - AxiosInstance, 4 - AxiosResponse, 5 - AxiosStatic, 6 - CreateAxiosDefaults, 7 - } from 'axios'; 8 - 9 - import type { 10 - BodySerializer, 11 - QuerySerializer, 12 - QuerySerializerOptions, 13 - } from './utils'; 14 - 15 - type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 16 - 17 - export interface Config<ThrowOnError extends boolean = boolean> 18 - extends Omit<CreateAxiosDefaults, 'auth' | 'headers'> { 19 - /** 20 - * Auth token or a function returning auth token. The resolved value will be 21 - * added to the request payload as defined by its `security` array. 22 - */ 23 - auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 24 - /** 25 - * Axios implementation. You can use this option to provide a custom 26 - * Axios instance. 27 - * 28 - * @default axios 29 - */ 30 - axios?: AxiosStatic; 31 - /** 32 - * A function for serializing request body parameter. By default, 33 - * {@link JSON.stringify()} will be used. 34 - */ 35 - bodySerializer?: BodySerializer | null; 36 - /** 37 - * An object containing any HTTP headers that you want to pre-populate your 38 - * `Headers` object with. 39 - * 40 - * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 41 - */ 42 - headers?: 43 - | CreateAxiosDefaults['headers'] 44 - | Record< 45 - string, 46 - | string 47 - | number 48 - | boolean 49 - | (string | number | boolean)[] 50 - | null 51 - | undefined 52 - | unknown 53 - >; 54 - /** 55 - * The request method. 56 - * 57 - * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 58 - */ 59 - method?: 60 - | 'connect' 61 - | 'delete' 62 - | 'get' 63 - | 'head' 64 - | 'options' 65 - | 'patch' 66 - | 'post' 67 - | 'put' 68 - | 'trace'; 69 - /** 70 - * A function for serializing request query parameters. By default, arrays 71 - * will be exploded in form style, objects will be exploded in deepObject 72 - * style, and reserved characters are percent-encoded. 73 - * 74 - * This method will have no effect if the native `paramsSerializer()` Axios 75 - * API function is used. 76 - * 77 - * {@link https://swagger.io/docs/specification/serialization/#query View examples} 78 - */ 79 - querySerializer?: QuerySerializer | QuerySerializerOptions; 80 - /** 81 - * A function transforming response data before it's returned. This is useful 82 - * for post-processing data, e.g. converting ISO strings into Date objects. 83 - */ 84 - responseTransformer?: (data: unknown) => Promise<unknown>; 85 - /** 86 - * A function validating response data. This is useful if you want to ensure 87 - * the response conforms to the desired shape, so it can be safely passed to 88 - * the transformers and returned to the user. 89 - */ 90 - responseValidator?: (data: unknown) => Promise<unknown>; 91 - /** 92 - * Throw an error instead of returning it in the response? 93 - * 94 - * @default false 95 - */ 96 - throwOnError?: ThrowOnError; 97 - } 98 - 99 - export interface Auth { 100 - in?: 'header' | 'query'; 101 - name?: string; 102 - scheme?: 'basic' | 'bearer'; 103 - type: 'apiKey' | 'http'; 104 - } 105 - 106 - type AuthToken = string | undefined; 107 - 108 - export interface RequestOptions< 109 - ThrowOnError extends boolean = boolean, 110 - Url extends string = string, 111 - > extends Config<ThrowOnError> { 112 - /** 113 - * Any body that you want to add to your request. 114 - * 115 - * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 116 - */ 117 - body?: unknown; 118 - /** 119 - * You can provide a client instance returned by `createClient()` instead of 120 - * individual options. This might be also useful if you want to implement a 121 - * custom client. 122 - */ 123 - client?: Client; 124 - path?: Record<string, unknown>; 125 - query?: Record<string, unknown>; 126 - /** 127 - * Security mechanism(s) to use for the request. 128 - */ 129 - security?: ReadonlyArray<Auth>; 130 - url: Url; 131 - } 132 - 133 - export type RequestResult< 134 - TData = unknown, 135 - TError = unknown, 136 - ThrowOnError extends boolean = boolean, 137 - > = ThrowOnError extends true 138 - ? Promise<AxiosResponse<TData>> 139 - : Promise< 140 - | (AxiosResponse<TData> & { error: undefined }) 141 - | (AxiosError<TError> & { data: undefined; error: TError }) 142 - >; 143 - 144 - type MethodFn = < 145 - TData = unknown, 146 - TError = unknown, 147 - ThrowOnError extends boolean = false, 148 - >( 149 - options: Omit<RequestOptions<ThrowOnError>, 'method'>, 150 - ) => RequestResult<TData, TError, ThrowOnError>; 151 - 152 - type RequestFn = < 153 - TData = unknown, 154 - TError = unknown, 155 - ThrowOnError extends boolean = false, 156 - >( 157 - options: Omit<RequestOptions<ThrowOnError>, 'method'> & 158 - Pick<Required<RequestOptions<ThrowOnError>>, 'method'>, 159 - ) => RequestResult<TData, TError, ThrowOnError>; 160 - 161 - export interface Client { 162 - /** 163 - * Returns the final request URL. This method works only with experimental parser. 164 - */ 165 - buildUrl: < 166 - TData extends { 167 - body?: unknown; 168 - path?: Record<string, unknown>; 169 - query?: Record<string, unknown>; 170 - url: string; 171 - }, 172 - >( 173 - options: Pick<TData, 'url'> & Omit<Options<TData>, 'axios'>, 174 - ) => string; 175 - delete: MethodFn; 176 - get: MethodFn; 177 - getConfig: () => Config; 178 - head: MethodFn; 179 - instance: AxiosInstance; 180 - options: MethodFn; 181 - patch: MethodFn; 182 - post: MethodFn; 183 - put: MethodFn; 184 - request: RequestFn; 185 - setConfig: (config: Config) => Config; 186 - } 187 - 188 - interface DataShape { 189 - body?: unknown; 190 - headers?: unknown; 191 - path?: unknown; 192 - query?: unknown; 193 - url: string; 194 - } 195 - 196 - export type Options< 197 - TData extends DataShape = DataShape, 198 - ThrowOnError extends boolean = boolean, 199 - > = OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & 200 - Omit<TData, 'url'>; 201 - 202 - export type OptionsLegacyParser< 203 - TData = unknown, 204 - ThrowOnError extends boolean = boolean, 205 - > = TData extends { body?: any } 206 - ? TData extends { headers?: any } 207 - ? OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'headers' | 'url'> & TData 208 - : OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'url'> & 209 - TData & 210 - Pick<RequestOptions<ThrowOnError>, 'headers'> 211 - : TData extends { headers?: any } 212 - ? OmitKeys<RequestOptions<ThrowOnError>, 'headers' | 'url'> & 213 - TData & 214 - Pick<RequestOptions<ThrowOnError>, 'body'> 215 - : OmitKeys<RequestOptions<ThrowOnError>, 'url'> & TData;
-548
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-axios/bundle/client/utils.ts
··· 1 - import type { Auth, Client, Config, RequestOptions } from './types'; 2 - 3 - interface PathSerializer { 4 - path: Record<string, unknown>; 5 - url: string; 6 - } 7 - 8 - const PATH_PARAM_RE = /\{[^{}]+\}/g; 9 - 10 - type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 11 - type MatrixStyle = 'label' | 'matrix' | 'simple'; 12 - type ArraySeparatorStyle = ArrayStyle | MatrixStyle; 13 - type ObjectStyle = 'form' | 'deepObject'; 14 - type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; 15 - 16 - export type QuerySerializer = (query: Record<string, unknown>) => string; 17 - 18 - export type BodySerializer = (body: any) => any; 19 - 20 - interface SerializerOptions<T> { 21 - /** 22 - * @default true 23 - */ 24 - explode: boolean; 25 - style: T; 26 - } 27 - 28 - interface SerializeOptions<T> 29 - extends SerializePrimitiveOptions, 30 - SerializerOptions<T> {} 31 - interface SerializePrimitiveOptions { 32 - allowReserved?: boolean; 33 - name: string; 34 - } 35 - interface SerializePrimitiveParam extends SerializePrimitiveOptions { 36 - value: string; 37 - } 38 - 39 - export interface QuerySerializerOptions { 40 - allowReserved?: boolean; 41 - array?: SerializerOptions<ArrayStyle>; 42 - object?: SerializerOptions<ObjectStyle>; 43 - } 44 - 45 - const serializePrimitiveParam = ({ 46 - allowReserved, 47 - name, 48 - value, 49 - }: SerializePrimitiveParam) => { 50 - if (value === undefined || value === null) { 51 - return ''; 52 - } 53 - 54 - if (typeof value === 'object') { 55 - throw new Error( 56 - 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', 57 - ); 58 - } 59 - 60 - return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; 61 - }; 62 - 63 - const separatorArrayExplode = (style: ArraySeparatorStyle) => { 64 - switch (style) { 65 - case 'label': 66 - return '.'; 67 - case 'matrix': 68 - return ';'; 69 - case 'simple': 70 - return ','; 71 - default: 72 - return '&'; 73 - } 74 - }; 75 - 76 - const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { 77 - switch (style) { 78 - case 'form': 79 - return ','; 80 - case 'pipeDelimited': 81 - return '|'; 82 - case 'spaceDelimited': 83 - return '%20'; 84 - default: 85 - return ','; 86 - } 87 - }; 88 - 89 - const separatorObjectExplode = (style: ObjectSeparatorStyle) => { 90 - switch (style) { 91 - case 'label': 92 - return '.'; 93 - case 'matrix': 94 - return ';'; 95 - case 'simple': 96 - return ','; 97 - default: 98 - return '&'; 99 - } 100 - }; 101 - 102 - const serializeArrayParam = ({ 103 - allowReserved, 104 - explode, 105 - name, 106 - style, 107 - value, 108 - }: SerializeOptions<ArraySeparatorStyle> & { 109 - value: unknown[]; 110 - }) => { 111 - if (!explode) { 112 - const joinedValues = ( 113 - allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) 114 - ).join(separatorArrayNoExplode(style)); 115 - switch (style) { 116 - case 'label': 117 - return `.${joinedValues}`; 118 - case 'matrix': 119 - return `;${name}=${joinedValues}`; 120 - case 'simple': 121 - return joinedValues; 122 - default: 123 - return `${name}=${joinedValues}`; 124 - } 125 - } 126 - 127 - const separator = separatorArrayExplode(style); 128 - const joinedValues = value 129 - .map((v) => { 130 - if (style === 'label' || style === 'simple') { 131 - return allowReserved ? v : encodeURIComponent(v as string); 132 - } 133 - 134 - return serializePrimitiveParam({ 135 - allowReserved, 136 - name, 137 - value: v as string, 138 - }); 139 - }) 140 - .join(separator); 141 - return style === 'label' || style === 'matrix' 142 - ? separator + joinedValues 143 - : joinedValues; 144 - }; 145 - 146 - const serializeObjectParam = ({ 147 - allowReserved, 148 - explode, 149 - name, 150 - style, 151 - value, 152 - }: SerializeOptions<ObjectSeparatorStyle> & { 153 - value: Record<string, unknown>; 154 - }) => { 155 - if (style !== 'deepObject' && !explode) { 156 - let values: string[] = []; 157 - Object.entries(value).forEach(([key, v]) => { 158 - values = [ 159 - ...values, 160 - key, 161 - allowReserved ? (v as string) : encodeURIComponent(v as string), 162 - ]; 163 - }); 164 - const joinedValues = values.join(','); 165 - switch (style) { 166 - case 'form': 167 - return `${name}=${joinedValues}`; 168 - case 'label': 169 - return `.${joinedValues}`; 170 - case 'matrix': 171 - return `;${name}=${joinedValues}`; 172 - default: 173 - return joinedValues; 174 - } 175 - } 176 - 177 - const separator = separatorObjectExplode(style); 178 - const joinedValues = Object.entries(value) 179 - .map(([key, v]) => 180 - serializePrimitiveParam({ 181 - allowReserved, 182 - name: style === 'deepObject' ? `${name}[${key}]` : key, 183 - value: v as string, 184 - }), 185 - ) 186 - .join(separator); 187 - return style === 'label' || style === 'matrix' 188 - ? separator + joinedValues 189 - : joinedValues; 190 - }; 191 - 192 - const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { 193 - let url = _url; 194 - const matches = _url.match(PATH_PARAM_RE); 195 - if (matches) { 196 - for (const match of matches) { 197 - let explode = false; 198 - let name = match.substring(1, match.length - 1); 199 - let style: ArraySeparatorStyle = 'simple'; 200 - 201 - if (name.endsWith('*')) { 202 - explode = true; 203 - name = name.substring(0, name.length - 1); 204 - } 205 - 206 - if (name.startsWith('.')) { 207 - name = name.substring(1); 208 - style = 'label'; 209 - } else if (name.startsWith(';')) { 210 - name = name.substring(1); 211 - style = 'matrix'; 212 - } 213 - 214 - const value = path[name]; 215 - 216 - if (value === undefined || value === null) { 217 - continue; 218 - } 219 - 220 - if (Array.isArray(value)) { 221 - url = url.replace( 222 - match, 223 - serializeArrayParam({ explode, name, style, value }), 224 - ); 225 - continue; 226 - } 227 - 228 - if (typeof value === 'object') { 229 - url = url.replace( 230 - match, 231 - serializeObjectParam({ 232 - explode, 233 - name, 234 - style, 235 - value: value as Record<string, unknown>, 236 - }), 237 - ); 238 - continue; 239 - } 240 - 241 - if (style === 'matrix') { 242 - url = url.replace( 243 - match, 244 - `;${serializePrimitiveParam({ 245 - name, 246 - value: value as string, 247 - })}`, 248 - ); 249 - continue; 250 - } 251 - 252 - const replaceValue = encodeURIComponent( 253 - style === 'label' ? `.${value as string}` : (value as string), 254 - ); 255 - url = url.replace(match, replaceValue); 256 - } 257 - } 258 - return url; 259 - }; 260 - 261 - export const createQuerySerializer = <T = unknown>({ 262 - allowReserved, 263 - array, 264 - object, 265 - }: QuerySerializerOptions = {}) => { 266 - const querySerializer = (queryParams: T) => { 267 - let search: string[] = []; 268 - if (queryParams && typeof queryParams === 'object') { 269 - for (const name in queryParams) { 270 - const value = queryParams[name]; 271 - 272 - if (value === undefined || value === null) { 273 - continue; 274 - } 275 - 276 - if (Array.isArray(value)) { 277 - search = [ 278 - ...search, 279 - serializeArrayParam({ 280 - allowReserved, 281 - explode: true, 282 - name, 283 - style: 'form', 284 - value, 285 - ...array, 286 - }), 287 - ]; 288 - continue; 289 - } 290 - 291 - if (typeof value === 'object') { 292 - search = [ 293 - ...search, 294 - serializeObjectParam({ 295 - allowReserved, 296 - explode: true, 297 - name, 298 - style: 'deepObject', 299 - value: value as Record<string, unknown>, 300 - ...object, 301 - }), 302 - ]; 303 - continue; 304 - } 305 - 306 - search = [ 307 - ...search, 308 - serializePrimitiveParam({ 309 - allowReserved, 310 - name, 311 - value: value as string, 312 - }), 313 - ]; 314 - } 315 - } 316 - return search.join('&'); 317 - }; 318 - return querySerializer; 319 - }; 320 - 321 - export const getAuthToken = async ( 322 - auth: Auth, 323 - callback: RequestOptions['auth'], 324 - ): Promise<string | undefined> => { 325 - const token = 326 - typeof callback === 'function' ? await callback(auth) : callback; 327 - 328 - if (!token) { 329 - return; 330 - } 331 - 332 - if (auth.scheme === 'bearer') { 333 - return `Bearer ${token}`; 334 - } 335 - 336 - if (auth.scheme === 'basic') { 337 - return `Basic ${btoa(token)}`; 338 - } 339 - 340 - return token; 341 - }; 342 - 343 - export const setAuthParams = async ({ 344 - security, 345 - ...options 346 - }: Pick<Required<RequestOptions>, 'security'> & 347 - Pick<RequestOptions, 'auth' | 'query'> & { 348 - headers: Record<any, unknown>; 349 - }) => { 350 - for (const auth of security) { 351 - const token = await getAuthToken(auth, options.auth); 352 - 353 - if (!token) { 354 - continue; 355 - } 356 - 357 - const name = auth.name ?? 'Authorization'; 358 - 359 - switch (auth.in) { 360 - case 'query': 361 - if (!options.query) { 362 - options.query = {}; 363 - } 364 - options.query[name] = token; 365 - break; 366 - case 'header': 367 - default: 368 - options.headers[name] = token; 369 - break; 370 - } 371 - 372 - return; 373 - } 374 - }; 375 - 376 - export const buildUrl: Client['buildUrl'] = (options) => { 377 - const url = getUrl({ 378 - path: options.path, 379 - // let `paramsSerializer()` handle query params if it exists 380 - query: !options.paramsSerializer ? options.query : undefined, 381 - querySerializer: 382 - typeof options.querySerializer === 'function' 383 - ? options.querySerializer 384 - : createQuerySerializer(options.querySerializer), 385 - url: options.url, 386 - }); 387 - return url; 388 - }; 389 - 390 - export const getUrl = ({ 391 - path, 392 - query, 393 - querySerializer, 394 - url: _url, 395 - }: { 396 - path?: Record<string, unknown>; 397 - query?: Record<string, unknown>; 398 - querySerializer: QuerySerializer; 399 - url: string; 400 - }) => { 401 - const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; 402 - let url = pathUrl; 403 - if (path) { 404 - url = defaultPathSerializer({ path, url }); 405 - } 406 - let search = query ? querySerializer(query) : ''; 407 - if (search.startsWith('?')) { 408 - search = search.substring(1); 409 - } 410 - if (search) { 411 - url += `?${search}`; 412 - } 413 - return url; 414 - }; 415 - 416 - const serializeFormDataPair = ( 417 - formData: FormData, 418 - key: string, 419 - value: unknown, 420 - ) => { 421 - if (typeof value === 'string' || value instanceof Blob) { 422 - formData.append(key, value); 423 - } else { 424 - formData.append(key, JSON.stringify(value)); 425 - } 426 - }; 427 - 428 - export const mergeConfigs = (a: Config, b: Config): Config => { 429 - const config = { ...a, ...b }; 430 - config.headers = mergeHeaders(a.headers, b.headers); 431 - return config; 432 - }; 433 - 434 - /** 435 - * Special Axios headers keywords allowing to set headers by request method. 436 - */ 437 - export const axiosHeadersKeywords = [ 438 - 'common', 439 - 'delete', 440 - 'get', 441 - 'head', 442 - 'patch', 443 - 'post', 444 - 'put', 445 - ] as const; 446 - 447 - export const mergeHeaders = ( 448 - ...headers: Array<Required<Config>['headers'] | undefined> 449 - ): Record<any, unknown> => { 450 - const mergedHeaders: Record<any, unknown> = {}; 451 - for (const header of headers) { 452 - if (!header || typeof header !== 'object') { 453 - continue; 454 - } 455 - 456 - const iterator = Object.entries(header); 457 - 458 - for (const [key, value] of iterator) { 459 - if ( 460 - axiosHeadersKeywords.includes( 461 - key as (typeof axiosHeadersKeywords)[number], 462 - ) && 463 - typeof value === 'object' 464 - ) { 465 - mergedHeaders[key] = { 466 - ...(mergedHeaders[key] as Record<any, unknown>), 467 - ...value, 468 - }; 469 - } else if (value === null) { 470 - delete mergedHeaders[key]; 471 - } else if (Array.isArray(value)) { 472 - for (const v of value) { 473 - // @ts-expect-error 474 - mergedHeaders[key] = [...(mergedHeaders[key] ?? []), v as string]; 475 - } 476 - } else if (value !== undefined) { 477 - // assume object headers are meant to be JSON stringified, i.e. their 478 - // content value in OpenAPI specification is 'application/json' 479 - mergedHeaders[key] = 480 - typeof value === 'object' ? JSON.stringify(value) : (value as string); 481 - } 482 - } 483 - } 484 - return mergedHeaders; 485 - }; 486 - 487 - export const formDataBodySerializer = { 488 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 489 - body: T, 490 - ) => { 491 - const formData = new FormData(); 492 - 493 - Object.entries(body).forEach(([key, value]) => { 494 - if (value === undefined || value === null) { 495 - return; 496 - } 497 - if (Array.isArray(value)) { 498 - value.forEach((v) => serializeFormDataPair(formData, key, v)); 499 - } else { 500 - serializeFormDataPair(formData, key, value); 501 - } 502 - }); 503 - 504 - return formData; 505 - }, 506 - }; 507 - 508 - export const jsonBodySerializer = { 509 - bodySerializer: <T>(body: T) => JSON.stringify(body), 510 - }; 511 - 512 - const serializeUrlSearchParamsPair = ( 513 - data: URLSearchParams, 514 - key: string, 515 - value: unknown, 516 - ) => { 517 - if (typeof value === 'string') { 518 - data.append(key, value); 519 - } else { 520 - data.append(key, JSON.stringify(value)); 521 - } 522 - }; 523 - 524 - export const urlSearchParamsBodySerializer = { 525 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 526 - body: T, 527 - ) => { 528 - const data = new URLSearchParams(); 529 - 530 - Object.entries(body).forEach(([key, value]) => { 531 - if (value === undefined || value === null) { 532 - return; 533 - } 534 - if (Array.isArray(value)) { 535 - value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); 536 - } else { 537 - serializeUrlSearchParamsPair(data, key, value); 538 - } 539 - }); 540 - 541 - return data; 542 - }, 543 - }; 544 - 545 - export const createConfig = (override: Config = {}): Config => ({ 546 - baseURL: '', 547 - ...override, 548 - });
+2
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-fetch/bundle/client/index.cjs
··· 1 + 'use strict';var A=async(t,r)=>{let e=typeof r=="function"?await r(t):r;if(e)return t.scheme==="bearer"?`Bearer ${e}`:t.scheme==="basic"?`Basic ${btoa(e)}`:e},j=(t,r,e)=>{typeof e=="string"||e instanceof Blob?t.append(r,e):t.append(r,JSON.stringify(e));},z=(t,r,e)=>{typeof e=="string"?t.append(r,e):t.append(r,JSON.stringify(e));},U={bodySerializer:t=>{let r=new FormData;return Object.entries(t).forEach(([e,i])=>{i!=null&&(Array.isArray(i)?i.forEach(a=>j(r,e,a)):j(r,e,i));}),r}},b={bodySerializer:t=>JSON.stringify(t)},k={bodySerializer:t=>{let r=new URLSearchParams;return Object.entries(t).forEach(([e,i])=>{i!=null&&(Array.isArray(i)?i.forEach(a=>z(r,e,a)):z(r,e,i));}),r}},T=t=>{switch(t){case "label":return ".";case "matrix":return ";";case "simple":return ",";default:return "&"}},_=t=>{switch(t){case "form":return ",";case "pipeDelimited":return "|";case "spaceDelimited":return "%20";default:return ","}},D=t=>{switch(t){case "label":return ".";case "matrix":return ";";case "simple":return ",";default:return "&"}},q=({allowReserved:t,explode:r,name:e,style:i,value:a})=>{if(!r){let s=(t?a:a.map(l=>encodeURIComponent(l))).join(_(i));switch(i){case "label":return `.${s}`;case "matrix":return `;${e}=${s}`;case "simple":return s;default:return `${e}=${s}`}}let o=T(i),n=a.map(s=>i==="label"||i==="simple"?t?s:encodeURIComponent(s):y({allowReserved:t,name:e,value:s})).join(o);return i==="label"||i==="matrix"?o+n:n},y=({allowReserved:t,name:r,value:e})=>{if(e==null)return "";if(typeof e=="object")throw new Error("Deeply-nested arrays/objects aren\u2019t supported. Provide your own `querySerializer()` to handle these.");return `${r}=${t?e:encodeURIComponent(e)}`},O=({allowReserved:t,explode:r,name:e,style:i,value:a})=>{if(a instanceof Date)return `${e}=${a.toISOString()}`;if(i!=="deepObject"&&!r){let s=[];Object.entries(a).forEach(([f,u])=>{s=[...s,f,t?u:encodeURIComponent(u)];});let l=s.join(",");switch(i){case "form":return `${e}=${l}`;case "label":return `.${l}`;case "matrix":return `;${e}=${l}`;default:return l}}let o=D(i),n=Object.entries(a).map(([s,l])=>y({allowReserved:t,name:i==="deepObject"?`${e}[${s}]`:s,value:l})).join(o);return i==="label"||i==="matrix"?o+n:n};var H=/\{[^{}]+\}/g,B=({path:t,url:r})=>{let e=r,i=r.match(H);if(i)for(let a of i){let o=false,n=a.substring(1,a.length-1),s="simple";n.endsWith("*")&&(o=true,n=n.substring(0,n.length-1)),n.startsWith(".")?(n=n.substring(1),s="label"):n.startsWith(";")&&(n=n.substring(1),s="matrix");let l=t[n];if(l==null)continue;if(Array.isArray(l)){e=e.replace(a,q({explode:o,name:n,style:s,value:l}));continue}if(typeof l=="object"){e=e.replace(a,O({explode:o,name:n,style:s,value:l}));continue}if(s==="matrix"){e=e.replace(a,`;${y({name:n,value:l})}`);continue}let f=encodeURIComponent(s==="label"?`.${l}`:l);e=e.replace(a,f);}return e},E=({allowReserved:t,array:r,object:e}={})=>a=>{let o=[];if(a&&typeof a=="object")for(let n in a){let s=a[n];if(s!=null){if(Array.isArray(s)){o=[...o,q({allowReserved:t,explode:true,name:n,style:"form",value:s,...r})];continue}if(typeof s=="object"){o=[...o,O({allowReserved:t,explode:true,name:n,style:"deepObject",value:s,...e})];continue}o=[...o,y({allowReserved:t,name:n,value:s})];}}return o.join("&")},P=t=>{if(!t)return "stream";let r=t.split(";")[0]?.trim();if(r){if(r.startsWith("application/json")||r.endsWith("+json"))return "json";if(r==="multipart/form-data")return "formData";if(["application/","audio/","image/","video/"].some(e=>r.startsWith(e)))return "blob";if(r.startsWith("text/"))return "text"}},I=async({security:t,...r})=>{for(let e of t){let i=await A(e,r.auth);if(!i)continue;let a=e.name??"Authorization";switch(e.in){case "query":r.query||(r.query={}),r.query[a]=i;break;case "header":default:r.headers.set(a,i);break}return}},S=t=>W({baseUrl:t.baseUrl??"",path:t.path,query:t.query,querySerializer:typeof t.querySerializer=="function"?t.querySerializer:E(t.querySerializer),url:t.url}),W=({baseUrl:t,path:r,query:e,querySerializer:i,url:a})=>{let o=a.startsWith("/")?a:`/${a}`,n=t+o;r&&(n=B({path:r,url:n}));let s=e?i(e):"";return s.startsWith("?")&&(s=s.substring(1)),s&&(n+=`?${s}`),n},x=(t,r)=>{let e={...t,...r};return e.baseUrl?.endsWith("/")&&(e.baseUrl=e.baseUrl.substring(0,e.baseUrl.length-1)),e.headers=w(t.headers,r.headers),e},w=(...t)=>{let r=new Headers;for(let e of t){if(!e||typeof e!="object")continue;let i=e instanceof Headers?e.entries():Object.entries(e);for(let[a,o]of i)if(o===null)r.delete(a);else if(Array.isArray(o))for(let n of o)r.append(a,n);else o!==undefined&&r.set(a,typeof o=="object"?JSON.stringify(o):o);}return r},h=class{_fns;constructor(){this._fns=[];}clear(){this._fns=[];}exists(r){return this._fns.indexOf(r)!==-1}eject(r){let e=this._fns.indexOf(r);e!==-1&&(this._fns=[...this._fns.slice(0,e),...this._fns.slice(e+1)]);}use(r){this._fns=[...this._fns,r];}},v=()=>({error:new h,request:new h,response:new h}),N=E({allowReserved:false,array:{explode:true,style:"form"},object:{explode:true,style:"deepObject"}}),Q={"Content-Type":"application/json"},C=(t={})=>({...b,baseUrl:"",headers:Q,parseAs:"auto",querySerializer:N,...t});var F=(t={})=>{let r=x(C(),t),e=()=>({...r}),i=n=>(r=x(r,n),e()),a=v(),o=async n=>{let s={...r,...n,fetch:n.fetch??r.fetch??globalThis.fetch,headers:w(r.headers,n.headers)};s.security&&await I({...s,security:s.security}),s.body&&s.bodySerializer&&(s.body=s.bodySerializer(s.body)),s.body||s.headers.delete("Content-Type");let l=S(s),f={redirect:"follow",...s},u=new Request(l,f);for(let p of a.request._fns)u=await p(u,s);let $=s.fetch,c=await $(u);for(let p of a.response._fns)c=await p(c,u,s);let m={request:u,response:c};if(c.ok){if(c.status===204||c.headers.get("Content-Length")==="0")return {data:{},...m};let p=(s.parseAs==="auto"?P(c.headers.get("Content-Type")):s.parseAs)??"json";if(p==="stream")return {data:c.body,...m};let R=await c[p]();return p==="json"&&(s.responseValidator&&await s.responseValidator(R),s.responseTransformer&&(R=await s.responseTransformer(R))),{data:R,...m}}let g=await c.text();try{g=JSON.parse(g);}catch{}let d=g;for(let p of a.error._fns)d=await p(g,c,u,s);if(d=d||{},s.throwOnError)throw d;return {error:d,...m}};return {buildUrl:S,connect:n=>o({...n,method:"CONNECT"}),delete:n=>o({...n,method:"DELETE"}),get:n=>o({...n,method:"GET"}),getConfig:e,head:n=>o({...n,method:"HEAD"}),interceptors:a,options:n=>o({...n,method:"OPTIONS"}),patch:n=>o({...n,method:"PATCH"}),post:n=>o({...n,method:"POST"}),put:n=>o({...n,method:"PUT"}),request:o,setConfig:i,trace:n=>o({...n,method:"TRACE"})}};exports.createClient=F;exports.createConfig=C;exports.formDataBodySerializer=U;exports.jsonBodySerializer=b;exports.urlSearchParamsBodySerializer=k;//# sourceMappingURL=index.cjs.map 2 + //# sourceMappingURL=index.cjs.map
+205
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-fetch/bundle/client/index.d.cts
··· 1 + interface Auth { 2 + in?: 'header' | 'query'; 3 + name?: string; 4 + scheme?: 'basic' | 'bearer'; 5 + type: 'apiKey' | 'http'; 6 + } 7 + interface SerializerOptions<T> { 8 + /** 9 + * @default true 10 + */ 11 + explode: boolean; 12 + style: T; 13 + } 14 + type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 15 + type ObjectStyle = 'form' | 'deepObject'; 16 + 17 + type QuerySerializer = (query: Record<string, unknown>) => string; 18 + type BodySerializer = (body: any) => any; 19 + interface QuerySerializerOptions { 20 + allowReserved?: boolean; 21 + array?: SerializerOptions<ArrayStyle>; 22 + object?: SerializerOptions<ObjectStyle>; 23 + } 24 + declare const formDataBodySerializer: { 25 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => FormData; 26 + }; 27 + declare const jsonBodySerializer: { 28 + bodySerializer: <T>(body: T) => string; 29 + }; 30 + declare const urlSearchParamsBodySerializer: { 31 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => URLSearchParams; 32 + }; 33 + 34 + type ErrInterceptor<Err, Res, Req, Options> = (error: Err, response: Res, request: Req, options: Options) => Err | Promise<Err>; 35 + type ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>; 36 + type ResInterceptor<Res, Req, Options> = (response: Res, request: Req, options: Options) => Res | Promise<Res>; 37 + declare class Interceptors<Interceptor> { 38 + _fns: Interceptor[]; 39 + constructor(); 40 + clear(): void; 41 + exists(fn: Interceptor): boolean; 42 + eject(fn: Interceptor): void; 43 + use(fn: Interceptor): void; 44 + } 45 + interface Middleware<Req, Res, Err, Options> { 46 + error: Pick<Interceptors<ErrInterceptor<Err, Res, Req, Options>>, 'eject' | 'use'>; 47 + request: Pick<Interceptors<ReqInterceptor<Req, Options>>, 'eject' | 'use'>; 48 + response: Pick<Interceptors<ResInterceptor<Res, Req, Options>>, 'eject' | 'use'>; 49 + } 50 + declare const createConfig: (override?: Config) => Config; 51 + 52 + type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 53 + interface Config<ThrowOnError extends boolean = boolean> extends Omit<RequestInit, 'body' | 'headers' | 'method'> { 54 + /** 55 + * Auth token or a function returning auth token. The resolved value will be 56 + * added to the request payload as defined by its `security` array. 57 + */ 58 + auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 59 + /** 60 + * Base URL for all requests made by this client. 61 + * 62 + * @default '' 63 + */ 64 + baseUrl?: string; 65 + /** 66 + * A function for serializing request body parameter. By default, 67 + * {@link JSON.stringify()} will be used. 68 + */ 69 + bodySerializer?: BodySerializer | null; 70 + /** 71 + * Fetch API implementation. You can use this option to provide a custom 72 + * fetch instance. 73 + * 74 + * @default globalThis.fetch 75 + */ 76 + fetch?: (request: Request) => ReturnType<typeof fetch>; 77 + /** 78 + * An object containing any HTTP headers that you want to pre-populate your 79 + * `Headers` object with. 80 + * 81 + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 82 + */ 83 + headers?: RequestInit['headers'] | Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined | unknown>; 84 + /** 85 + * The request method. 86 + * 87 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 88 + */ 89 + method?: 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE'; 90 + /** 91 + * Return the response data parsed in a specified format. By default, `auto` 92 + * will infer the appropriate method from the `Content-Type` response header. 93 + * You can override this behavior with any of the {@link Body} methods. 94 + * Select `stream` if you don't want to parse response data at all. 95 + * 96 + * @default 'auto' 97 + */ 98 + parseAs?: Exclude<keyof Body, 'body' | 'bodyUsed'> | 'auto' | 'stream'; 99 + /** 100 + * A function for serializing request query parameters. By default, arrays 101 + * will be exploded in form style, objects will be exploded in deepObject 102 + * style, and reserved characters are percent-encoded. 103 + * 104 + * {@link https://swagger.io/docs/specification/serialization/#query View examples} 105 + */ 106 + querySerializer?: QuerySerializer | QuerySerializerOptions; 107 + /** 108 + * A function transforming response data before it's returned. This is useful 109 + * for post-processing data, e.g. converting ISO strings into Date objects. 110 + */ 111 + responseTransformer?: (data: unknown) => Promise<unknown>; 112 + /** 113 + * A function validating response data. This is useful if you want to ensure 114 + * the response conforms to the desired shape, so it can be safely passed to 115 + * the transformers and returned to the user. 116 + */ 117 + responseValidator?: (data: unknown) => Promise<unknown>; 118 + /** 119 + * Throw an error instead of returning it in the response? 120 + * 121 + * @default false 122 + */ 123 + throwOnError?: ThrowOnError; 124 + } 125 + type AuthToken = string | undefined; 126 + interface RequestOptions<ThrowOnError extends boolean = boolean, Url extends string = string> extends Config<ThrowOnError> { 127 + /** 128 + * Any body that you want to add to your request. 129 + * 130 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 131 + */ 132 + body?: RequestInit['body'] | Record<string, unknown> | Array<Record<string, unknown>> | Array<unknown> | number; 133 + /** 134 + * You can provide a client instance returned by `createClient()` instead of 135 + * individual options. This might be also useful if you want to implement a 136 + * custom client. 137 + */ 138 + client?: Client; 139 + path?: Record<string, unknown>; 140 + query?: Record<string, unknown>; 141 + /** 142 + * Security mechanism(s) to use for the request. 143 + */ 144 + security?: ReadonlyArray<Auth>; 145 + url: Url; 146 + } 147 + type RequestResult<TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean> = ThrowOnError extends true ? Promise<{ 148 + data: TData; 149 + request: Request; 150 + response: Response; 151 + }> : Promise<({ 152 + data: TData; 153 + error: undefined; 154 + } | { 155 + data: undefined; 156 + error: TError; 157 + }) & { 158 + request: Request; 159 + response: Response; 160 + }>; 161 + type MethodFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions<ThrowOnError>, 'method'>) => RequestResult<TData, TError, ThrowOnError>; 162 + type RequestFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions<ThrowOnError>, 'method'> & Pick<Required<RequestOptions<ThrowOnError>>, 'method'>) => RequestResult<TData, TError, ThrowOnError>; 163 + interface Client<Req = Request, Res = Response, Err = unknown, Opts = RequestOptions> { 164 + /** 165 + * Returns the final request URL. This method works only with experimental parser. 166 + */ 167 + buildUrl: <TData extends { 168 + body?: unknown; 169 + path?: Record<string, unknown>; 170 + query?: Record<string, unknown>; 171 + url: string; 172 + }>(options: Pick<TData, 'url'> & Options<TData>) => string; 173 + connect: MethodFn; 174 + delete: MethodFn; 175 + get: MethodFn; 176 + getConfig: () => Config; 177 + head: MethodFn; 178 + interceptors: Middleware<Req, Res, Err, Opts>; 179 + options: MethodFn; 180 + patch: MethodFn; 181 + post: MethodFn; 182 + put: MethodFn; 183 + request: RequestFn; 184 + setConfig: (config: Config) => Config; 185 + trace: MethodFn; 186 + } 187 + interface DataShape { 188 + body?: unknown; 189 + headers?: unknown; 190 + path?: unknown; 191 + query?: unknown; 192 + url: string; 193 + } 194 + type Options<TData extends DataShape = DataShape, ThrowOnError extends boolean = boolean> = OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & Omit<TData, 'url'>; 195 + type OptionsLegacyParser<TData = unknown, ThrowOnError extends boolean = boolean> = TData extends { 196 + body?: any; 197 + } ? TData extends { 198 + headers?: any; 199 + } ? OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'headers' | 'url'> & TData : OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'url'> & TData & Pick<RequestOptions<ThrowOnError>, 'headers'> : TData extends { 200 + headers?: any; 201 + } ? OmitKeys<RequestOptions<ThrowOnError>, 'headers' | 'url'> & TData & Pick<RequestOptions<ThrowOnError>, 'body'> : OmitKeys<RequestOptions<ThrowOnError>, 'url'> & TData; 202 + 203 + declare const createClient: (config?: Config) => Client; 204 + 205 + export { type Auth, type Client, type Config, type Options, type OptionsLegacyParser, type QuerySerializerOptions, type RequestOptions, type RequestResult, createClient, createConfig, formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer };
+205
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-fetch/bundle/client/index.d.ts
··· 1 + interface Auth { 2 + in?: 'header' | 'query'; 3 + name?: string; 4 + scheme?: 'basic' | 'bearer'; 5 + type: 'apiKey' | 'http'; 6 + } 7 + interface SerializerOptions<T> { 8 + /** 9 + * @default true 10 + */ 11 + explode: boolean; 12 + style: T; 13 + } 14 + type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 15 + type ObjectStyle = 'form' | 'deepObject'; 16 + 17 + type QuerySerializer = (query: Record<string, unknown>) => string; 18 + type BodySerializer = (body: any) => any; 19 + interface QuerySerializerOptions { 20 + allowReserved?: boolean; 21 + array?: SerializerOptions<ArrayStyle>; 22 + object?: SerializerOptions<ObjectStyle>; 23 + } 24 + declare const formDataBodySerializer: { 25 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => FormData; 26 + }; 27 + declare const jsonBodySerializer: { 28 + bodySerializer: <T>(body: T) => string; 29 + }; 30 + declare const urlSearchParamsBodySerializer: { 31 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => URLSearchParams; 32 + }; 33 + 34 + type ErrInterceptor<Err, Res, Req, Options> = (error: Err, response: Res, request: Req, options: Options) => Err | Promise<Err>; 35 + type ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>; 36 + type ResInterceptor<Res, Req, Options> = (response: Res, request: Req, options: Options) => Res | Promise<Res>; 37 + declare class Interceptors<Interceptor> { 38 + _fns: Interceptor[]; 39 + constructor(); 40 + clear(): void; 41 + exists(fn: Interceptor): boolean; 42 + eject(fn: Interceptor): void; 43 + use(fn: Interceptor): void; 44 + } 45 + interface Middleware<Req, Res, Err, Options> { 46 + error: Pick<Interceptors<ErrInterceptor<Err, Res, Req, Options>>, 'eject' | 'use'>; 47 + request: Pick<Interceptors<ReqInterceptor<Req, Options>>, 'eject' | 'use'>; 48 + response: Pick<Interceptors<ResInterceptor<Res, Req, Options>>, 'eject' | 'use'>; 49 + } 50 + declare const createConfig: (override?: Config) => Config; 51 + 52 + type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 53 + interface Config<ThrowOnError extends boolean = boolean> extends Omit<RequestInit, 'body' | 'headers' | 'method'> { 54 + /** 55 + * Auth token or a function returning auth token. The resolved value will be 56 + * added to the request payload as defined by its `security` array. 57 + */ 58 + auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 59 + /** 60 + * Base URL for all requests made by this client. 61 + * 62 + * @default '' 63 + */ 64 + baseUrl?: string; 65 + /** 66 + * A function for serializing request body parameter. By default, 67 + * {@link JSON.stringify()} will be used. 68 + */ 69 + bodySerializer?: BodySerializer | null; 70 + /** 71 + * Fetch API implementation. You can use this option to provide a custom 72 + * fetch instance. 73 + * 74 + * @default globalThis.fetch 75 + */ 76 + fetch?: (request: Request) => ReturnType<typeof fetch>; 77 + /** 78 + * An object containing any HTTP headers that you want to pre-populate your 79 + * `Headers` object with. 80 + * 81 + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 82 + */ 83 + headers?: RequestInit['headers'] | Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined | unknown>; 84 + /** 85 + * The request method. 86 + * 87 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 88 + */ 89 + method?: 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE'; 90 + /** 91 + * Return the response data parsed in a specified format. By default, `auto` 92 + * will infer the appropriate method from the `Content-Type` response header. 93 + * You can override this behavior with any of the {@link Body} methods. 94 + * Select `stream` if you don't want to parse response data at all. 95 + * 96 + * @default 'auto' 97 + */ 98 + parseAs?: Exclude<keyof Body, 'body' | 'bodyUsed'> | 'auto' | 'stream'; 99 + /** 100 + * A function for serializing request query parameters. By default, arrays 101 + * will be exploded in form style, objects will be exploded in deepObject 102 + * style, and reserved characters are percent-encoded. 103 + * 104 + * {@link https://swagger.io/docs/specification/serialization/#query View examples} 105 + */ 106 + querySerializer?: QuerySerializer | QuerySerializerOptions; 107 + /** 108 + * A function transforming response data before it's returned. This is useful 109 + * for post-processing data, e.g. converting ISO strings into Date objects. 110 + */ 111 + responseTransformer?: (data: unknown) => Promise<unknown>; 112 + /** 113 + * A function validating response data. This is useful if you want to ensure 114 + * the response conforms to the desired shape, so it can be safely passed to 115 + * the transformers and returned to the user. 116 + */ 117 + responseValidator?: (data: unknown) => Promise<unknown>; 118 + /** 119 + * Throw an error instead of returning it in the response? 120 + * 121 + * @default false 122 + */ 123 + throwOnError?: ThrowOnError; 124 + } 125 + type AuthToken = string | undefined; 126 + interface RequestOptions<ThrowOnError extends boolean = boolean, Url extends string = string> extends Config<ThrowOnError> { 127 + /** 128 + * Any body that you want to add to your request. 129 + * 130 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 131 + */ 132 + body?: RequestInit['body'] | Record<string, unknown> | Array<Record<string, unknown>> | Array<unknown> | number; 133 + /** 134 + * You can provide a client instance returned by `createClient()` instead of 135 + * individual options. This might be also useful if you want to implement a 136 + * custom client. 137 + */ 138 + client?: Client; 139 + path?: Record<string, unknown>; 140 + query?: Record<string, unknown>; 141 + /** 142 + * Security mechanism(s) to use for the request. 143 + */ 144 + security?: ReadonlyArray<Auth>; 145 + url: Url; 146 + } 147 + type RequestResult<TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean> = ThrowOnError extends true ? Promise<{ 148 + data: TData; 149 + request: Request; 150 + response: Response; 151 + }> : Promise<({ 152 + data: TData; 153 + error: undefined; 154 + } | { 155 + data: undefined; 156 + error: TError; 157 + }) & { 158 + request: Request; 159 + response: Response; 160 + }>; 161 + type MethodFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions<ThrowOnError>, 'method'>) => RequestResult<TData, TError, ThrowOnError>; 162 + type RequestFn = <TData = unknown, TError = unknown, ThrowOnError extends boolean = false>(options: Omit<RequestOptions<ThrowOnError>, 'method'> & Pick<Required<RequestOptions<ThrowOnError>>, 'method'>) => RequestResult<TData, TError, ThrowOnError>; 163 + interface Client<Req = Request, Res = Response, Err = unknown, Opts = RequestOptions> { 164 + /** 165 + * Returns the final request URL. This method works only with experimental parser. 166 + */ 167 + buildUrl: <TData extends { 168 + body?: unknown; 169 + path?: Record<string, unknown>; 170 + query?: Record<string, unknown>; 171 + url: string; 172 + }>(options: Pick<TData, 'url'> & Options<TData>) => string; 173 + connect: MethodFn; 174 + delete: MethodFn; 175 + get: MethodFn; 176 + getConfig: () => Config; 177 + head: MethodFn; 178 + interceptors: Middleware<Req, Res, Err, Opts>; 179 + options: MethodFn; 180 + patch: MethodFn; 181 + post: MethodFn; 182 + put: MethodFn; 183 + request: RequestFn; 184 + setConfig: (config: Config) => Config; 185 + trace: MethodFn; 186 + } 187 + interface DataShape { 188 + body?: unknown; 189 + headers?: unknown; 190 + path?: unknown; 191 + query?: unknown; 192 + url: string; 193 + } 194 + type Options<TData extends DataShape = DataShape, ThrowOnError extends boolean = boolean> = OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & Omit<TData, 'url'>; 195 + type OptionsLegacyParser<TData = unknown, ThrowOnError extends boolean = boolean> = TData extends { 196 + body?: any; 197 + } ? TData extends { 198 + headers?: any; 199 + } ? OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'headers' | 'url'> & TData : OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'url'> & TData & Pick<RequestOptions<ThrowOnError>, 'headers'> : TData extends { 200 + headers?: any; 201 + } ? OmitKeys<RequestOptions<ThrowOnError>, 'headers' | 'url'> & TData & Pick<RequestOptions<ThrowOnError>, 'body'> : OmitKeys<RequestOptions<ThrowOnError>, 'url'> & TData; 202 + 203 + declare const createClient: (config?: Config) => Client; 204 + 205 + export { type Auth, type Client, type Config, type Options, type OptionsLegacyParser, type QuerySerializerOptions, type RequestOptions, type RequestResult, createClient, createConfig, formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer };
-184
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-fetch/bundle/client/index.ts
··· 1 - import type { Client, Config, RequestOptions } from './types'; 2 - import { 3 - buildUrl, 4 - createConfig, 5 - createInterceptors, 6 - getParseAs, 7 - mergeConfigs, 8 - mergeHeaders, 9 - setAuthParams, 10 - } from './utils'; 11 - 12 - type ReqInit = Omit<RequestInit, 'body' | 'headers'> & { 13 - body?: any; 14 - headers: ReturnType<typeof mergeHeaders>; 15 - }; 16 - 17 - export const createClient = (config: Config = {}): Client => { 18 - let _config = mergeConfigs(createConfig(), config); 19 - 20 - const getConfig = (): Config => ({ ..._config }); 21 - 22 - const setConfig = (config: Config): Config => { 23 - _config = mergeConfigs(_config, config); 24 - return getConfig(); 25 - }; 26 - 27 - const interceptors = createInterceptors< 28 - Request, 29 - Response, 30 - unknown, 31 - RequestOptions 32 - >(); 33 - 34 - // @ts-expect-error 35 - const request: Client['request'] = async (options) => { 36 - const opts = { 37 - ..._config, 38 - ...options, 39 - fetch: options.fetch ?? _config.fetch ?? globalThis.fetch, 40 - headers: mergeHeaders(_config.headers, options.headers), 41 - }; 42 - 43 - if (opts.security) { 44 - await setAuthParams({ 45 - ...opts, 46 - security: opts.security, 47 - }); 48 - } 49 - 50 - if (opts.body && opts.bodySerializer) { 51 - opts.body = opts.bodySerializer(opts.body); 52 - } 53 - 54 - // remove Content-Type header if body is empty to avoid sending invalid requests 55 - if (!opts.body) { 56 - opts.headers.delete('Content-Type'); 57 - } 58 - 59 - const url = buildUrl(opts); 60 - const requestInit: ReqInit = { 61 - redirect: 'follow', 62 - ...opts, 63 - }; 64 - 65 - let request = new Request(url, requestInit); 66 - 67 - for (const fn of interceptors.request._fns) { 68 - request = await fn(request, opts); 69 - } 70 - 71 - // fetch must be assigned here, otherwise it would throw the error: 72 - // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation 73 - const _fetch = opts.fetch!; 74 - let response = await _fetch(request); 75 - 76 - for (const fn of interceptors.response._fns) { 77 - response = await fn(response, request, opts); 78 - } 79 - 80 - const result = { 81 - request, 82 - response, 83 - }; 84 - 85 - if (response.ok) { 86 - if ( 87 - response.status === 204 || 88 - response.headers.get('Content-Length') === '0' 89 - ) { 90 - return { 91 - data: {}, 92 - ...result, 93 - }; 94 - } 95 - 96 - const parseAs = 97 - (opts.parseAs === 'auto' 98 - ? getParseAs(response.headers.get('Content-Type')) 99 - : opts.parseAs) ?? 'json'; 100 - 101 - if (parseAs === 'stream') { 102 - return { 103 - data: response.body, 104 - ...result, 105 - }; 106 - } 107 - 108 - let data = await response[parseAs](); 109 - if (parseAs === 'json') { 110 - if (opts.responseValidator) { 111 - await opts.responseValidator(data); 112 - } 113 - 114 - if (opts.responseTransformer) { 115 - data = await opts.responseTransformer(data); 116 - } 117 - } 118 - 119 - return { 120 - data, 121 - ...result, 122 - }; 123 - } 124 - 125 - let error = await response.text(); 126 - 127 - try { 128 - error = JSON.parse(error); 129 - } catch { 130 - // noop 131 - } 132 - 133 - let finalError = error; 134 - 135 - for (const fn of interceptors.error._fns) { 136 - finalError = (await fn(error, response, request, opts)) as string; 137 - } 138 - 139 - finalError = finalError || ({} as string); 140 - 141 - if (opts.throwOnError) { 142 - throw finalError; 143 - } 144 - 145 - return { 146 - error: finalError, 147 - ...result, 148 - }; 149 - }; 150 - 151 - return { 152 - buildUrl, 153 - connect: (options) => request({ ...options, method: 'CONNECT' }), 154 - delete: (options) => request({ ...options, method: 'DELETE' }), 155 - get: (options) => request({ ...options, method: 'GET' }), 156 - getConfig, 157 - head: (options) => request({ ...options, method: 'HEAD' }), 158 - interceptors, 159 - options: (options) => request({ ...options, method: 'OPTIONS' }), 160 - patch: (options) => request({ ...options, method: 'PATCH' }), 161 - post: (options) => request({ ...options, method: 'POST' }), 162 - put: (options) => request({ ...options, method: 'PUT' }), 163 - request, 164 - setConfig, 165 - trace: (options) => request({ ...options, method: 'TRACE' }), 166 - }; 167 - }; 168 - 169 - export type { 170 - Auth, 171 - Client, 172 - Config, 173 - Options, 174 - OptionsLegacyParser, 175 - RequestOptions, 176 - RequestResult, 177 - } from './types'; 178 - export { 179 - createConfig, 180 - formDataBodySerializer, 181 - jsonBodySerializer, 182 - type QuerySerializerOptions, 183 - urlSearchParamsBodySerializer, 184 - } from './utils';
-241
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-fetch/bundle/client/types.ts
··· 1 - import type { 2 - BodySerializer, 3 - Middleware, 4 - QuerySerializer, 5 - QuerySerializerOptions, 6 - } from './utils'; 7 - 8 - type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 9 - 10 - export interface Config<ThrowOnError extends boolean = boolean> 11 - extends Omit<RequestInit, 'body' | 'headers' | 'method'> { 12 - /** 13 - * Auth token or a function returning auth token. The resolved value will be 14 - * added to the request payload as defined by its `security` array. 15 - */ 16 - auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 17 - /** 18 - * Base URL for all requests made by this client. 19 - * 20 - * @default '' 21 - */ 22 - baseUrl?: string; 23 - /** 24 - * A function for serializing request body parameter. By default, 25 - * {@link JSON.stringify()} will be used. 26 - */ 27 - bodySerializer?: BodySerializer | null; 28 - /** 29 - * Fetch API implementation. You can use this option to provide a custom 30 - * fetch instance. 31 - * 32 - * @default globalThis.fetch 33 - */ 34 - fetch?: (request: Request) => ReturnType<typeof fetch>; 35 - /** 36 - * An object containing any HTTP headers that you want to pre-populate your 37 - * `Headers` object with. 38 - * 39 - * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 40 - */ 41 - headers?: 42 - | RequestInit['headers'] 43 - | Record< 44 - string, 45 - | string 46 - | number 47 - | boolean 48 - | (string | number | boolean)[] 49 - | null 50 - | undefined 51 - | unknown 52 - >; 53 - /** 54 - * The request method. 55 - * 56 - * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 57 - */ 58 - method?: 59 - | 'CONNECT' 60 - | 'DELETE' 61 - | 'GET' 62 - | 'HEAD' 63 - | 'OPTIONS' 64 - | 'PATCH' 65 - | 'POST' 66 - | 'PUT' 67 - | 'TRACE'; 68 - /** 69 - * Return the response data parsed in a specified format. By default, `auto` 70 - * will infer the appropriate method from the `Content-Type` response header. 71 - * You can override this behavior with any of the {@link Body} methods. 72 - * Select `stream` if you don't want to parse response data at all. 73 - * 74 - * @default 'auto' 75 - */ 76 - parseAs?: Exclude<keyof Body, 'body' | 'bodyUsed'> | 'auto' | 'stream'; 77 - /** 78 - * A function for serializing request query parameters. By default, arrays 79 - * will be exploded in form style, objects will be exploded in deepObject 80 - * style, and reserved characters are percent-encoded. 81 - * 82 - * {@link https://swagger.io/docs/specification/serialization/#query View examples} 83 - */ 84 - querySerializer?: QuerySerializer | QuerySerializerOptions; 85 - /** 86 - * A function transforming response data before it's returned. This is useful 87 - * for post-processing data, e.g. converting ISO strings into Date objects. 88 - */ 89 - responseTransformer?: (data: unknown) => Promise<unknown>; 90 - /** 91 - * A function validating response data. This is useful if you want to ensure 92 - * the response conforms to the desired shape, so it can be safely passed to 93 - * the transformers and returned to the user. 94 - */ 95 - responseValidator?: (data: unknown) => Promise<unknown>; 96 - /** 97 - * Throw an error instead of returning it in the response? 98 - * 99 - * @default false 100 - */ 101 - throwOnError?: ThrowOnError; 102 - } 103 - 104 - export interface Auth { 105 - in?: 'header' | 'query'; 106 - name?: string; 107 - scheme?: 'basic' | 'bearer'; 108 - type: 'apiKey' | 'http'; 109 - } 110 - 111 - type AuthToken = string | undefined; 112 - 113 - export interface RequestOptions< 114 - ThrowOnError extends boolean = boolean, 115 - Url extends string = string, 116 - > extends Config<ThrowOnError> { 117 - /** 118 - * Any body that you want to add to your request. 119 - * 120 - * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 121 - */ 122 - body?: 123 - | RequestInit['body'] 124 - | Record<string, unknown> 125 - | Array<Record<string, unknown>> 126 - | Array<unknown> 127 - | number; 128 - /** 129 - * You can provide a client instance returned by `createClient()` instead of 130 - * individual options. This might be also useful if you want to implement a 131 - * custom client. 132 - */ 133 - client?: Client; 134 - path?: Record<string, unknown>; 135 - query?: Record<string, unknown>; 136 - /** 137 - * Security mechanism(s) to use for the request. 138 - */ 139 - security?: ReadonlyArray<Auth>; 140 - url: Url; 141 - } 142 - 143 - export type RequestResult< 144 - TData = unknown, 145 - TError = unknown, 146 - ThrowOnError extends boolean = boolean, 147 - > = ThrowOnError extends true 148 - ? Promise<{ 149 - data: TData; 150 - request: Request; 151 - response: Response; 152 - }> 153 - : Promise< 154 - ( 155 - | { data: TData; error: undefined } 156 - | { data: undefined; error: TError } 157 - ) & { 158 - request: Request; 159 - response: Response; 160 - } 161 - >; 162 - 163 - type MethodFn = < 164 - TData = unknown, 165 - TError = unknown, 166 - ThrowOnError extends boolean = false, 167 - >( 168 - options: Omit<RequestOptions<ThrowOnError>, 'method'>, 169 - ) => RequestResult<TData, TError, ThrowOnError>; 170 - 171 - type RequestFn = < 172 - TData = unknown, 173 - TError = unknown, 174 - ThrowOnError extends boolean = false, 175 - >( 176 - options: Omit<RequestOptions<ThrowOnError>, 'method'> & 177 - Pick<Required<RequestOptions<ThrowOnError>>, 'method'>, 178 - ) => RequestResult<TData, TError, ThrowOnError>; 179 - 180 - export interface Client< 181 - Req = Request, 182 - Res = Response, 183 - Err = unknown, 184 - Opts = RequestOptions, 185 - > { 186 - /** 187 - * Returns the final request URL. This method works only with experimental parser. 188 - */ 189 - buildUrl: < 190 - TData extends { 191 - body?: unknown; 192 - path?: Record<string, unknown>; 193 - query?: Record<string, unknown>; 194 - url: string; 195 - }, 196 - >( 197 - options: Pick<TData, 'url'> & Options<TData>, 198 - ) => string; 199 - connect: MethodFn; 200 - delete: MethodFn; 201 - get: MethodFn; 202 - getConfig: () => Config; 203 - head: MethodFn; 204 - interceptors: Middleware<Req, Res, Err, Opts>; 205 - options: MethodFn; 206 - patch: MethodFn; 207 - post: MethodFn; 208 - put: MethodFn; 209 - request: RequestFn; 210 - setConfig: (config: Config) => Config; 211 - trace: MethodFn; 212 - } 213 - 214 - interface DataShape { 215 - body?: unknown; 216 - headers?: unknown; 217 - path?: unknown; 218 - query?: unknown; 219 - url: string; 220 - } 221 - 222 - export type Options< 223 - TData extends DataShape = DataShape, 224 - ThrowOnError extends boolean = boolean, 225 - > = OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & 226 - Omit<TData, 'url'>; 227 - 228 - export type OptionsLegacyParser< 229 - TData = unknown, 230 - ThrowOnError extends boolean = boolean, 231 - > = TData extends { body?: any } 232 - ? TData extends { headers?: any } 233 - ? OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'headers' | 'url'> & TData 234 - : OmitKeys<RequestOptions<ThrowOnError>, 'body' | 'url'> & 235 - TData & 236 - Pick<RequestOptions<ThrowOnError>, 'headers'> 237 - : TData extends { headers?: any } 238 - ? OmitKeys<RequestOptions<ThrowOnError>, 'headers' | 'url'> & 239 - TData & 240 - Pick<RequestOptions<ThrowOnError>, 'body'> 241 - : OmitKeys<RequestOptions<ThrowOnError>, 'url'> & TData;
-660
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-fetch/bundle/client/utils.ts
··· 1 - import type { Auth, Client, Config, RequestOptions } from './types'; 2 - 3 - interface PathSerializer { 4 - path: Record<string, unknown>; 5 - url: string; 6 - } 7 - 8 - const PATH_PARAM_RE = /\{[^{}]+\}/g; 9 - 10 - type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 11 - type MatrixStyle = 'label' | 'matrix' | 'simple'; 12 - type ArraySeparatorStyle = ArrayStyle | MatrixStyle; 13 - type ObjectStyle = 'form' | 'deepObject'; 14 - type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; 15 - 16 - export type QuerySerializer = (query: Record<string, unknown>) => string; 17 - 18 - export type BodySerializer = (body: any) => any; 19 - 20 - interface SerializerOptions<T> { 21 - /** 22 - * @default true 23 - */ 24 - explode: boolean; 25 - style: T; 26 - } 27 - 28 - interface SerializeOptions<T> 29 - extends SerializePrimitiveOptions, 30 - SerializerOptions<T> {} 31 - interface SerializePrimitiveOptions { 32 - allowReserved?: boolean; 33 - name: string; 34 - } 35 - interface SerializePrimitiveParam extends SerializePrimitiveOptions { 36 - value: string; 37 - } 38 - 39 - export interface QuerySerializerOptions { 40 - allowReserved?: boolean; 41 - array?: SerializerOptions<ArrayStyle>; 42 - object?: SerializerOptions<ObjectStyle>; 43 - } 44 - 45 - const serializePrimitiveParam = ({ 46 - allowReserved, 47 - name, 48 - value, 49 - }: SerializePrimitiveParam) => { 50 - if (value === undefined || value === null) { 51 - return ''; 52 - } 53 - 54 - if (typeof value === 'object') { 55 - throw new Error( 56 - 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', 57 - ); 58 - } 59 - 60 - return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; 61 - }; 62 - 63 - const separatorArrayExplode = (style: ArraySeparatorStyle) => { 64 - switch (style) { 65 - case 'label': 66 - return '.'; 67 - case 'matrix': 68 - return ';'; 69 - case 'simple': 70 - return ','; 71 - default: 72 - return '&'; 73 - } 74 - }; 75 - 76 - const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { 77 - switch (style) { 78 - case 'form': 79 - return ','; 80 - case 'pipeDelimited': 81 - return '|'; 82 - case 'spaceDelimited': 83 - return '%20'; 84 - default: 85 - return ','; 86 - } 87 - }; 88 - 89 - const separatorObjectExplode = (style: ObjectSeparatorStyle) => { 90 - switch (style) { 91 - case 'label': 92 - return '.'; 93 - case 'matrix': 94 - return ';'; 95 - case 'simple': 96 - return ','; 97 - default: 98 - return '&'; 99 - } 100 - }; 101 - 102 - const serializeArrayParam = ({ 103 - allowReserved, 104 - explode, 105 - name, 106 - style, 107 - value, 108 - }: SerializeOptions<ArraySeparatorStyle> & { 109 - value: unknown[]; 110 - }) => { 111 - if (!explode) { 112 - const joinedValues = ( 113 - allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) 114 - ).join(separatorArrayNoExplode(style)); 115 - switch (style) { 116 - case 'label': 117 - return `.${joinedValues}`; 118 - case 'matrix': 119 - return `;${name}=${joinedValues}`; 120 - case 'simple': 121 - return joinedValues; 122 - default: 123 - return `${name}=${joinedValues}`; 124 - } 125 - } 126 - 127 - const separator = separatorArrayExplode(style); 128 - const joinedValues = value 129 - .map((v) => { 130 - if (style === 'label' || style === 'simple') { 131 - return allowReserved ? v : encodeURIComponent(v as string); 132 - } 133 - 134 - return serializePrimitiveParam({ 135 - allowReserved, 136 - name, 137 - value: v as string, 138 - }); 139 - }) 140 - .join(separator); 141 - return style === 'label' || style === 'matrix' 142 - ? separator + joinedValues 143 - : joinedValues; 144 - }; 145 - 146 - const serializeObjectParam = ({ 147 - allowReserved, 148 - explode, 149 - name, 150 - style, 151 - value, 152 - }: SerializeOptions<ObjectSeparatorStyle> & { 153 - value: Record<string, unknown> | Date; 154 - }) => { 155 - if (value instanceof Date) { 156 - return `${name}=${value.toISOString()}`; 157 - } 158 - 159 - if (style !== 'deepObject' && !explode) { 160 - let values: string[] = []; 161 - Object.entries(value).forEach(([key, v]) => { 162 - values = [ 163 - ...values, 164 - key, 165 - allowReserved ? (v as string) : encodeURIComponent(v as string), 166 - ]; 167 - }); 168 - const joinedValues = values.join(','); 169 - switch (style) { 170 - case 'form': 171 - return `${name}=${joinedValues}`; 172 - case 'label': 173 - return `.${joinedValues}`; 174 - case 'matrix': 175 - return `;${name}=${joinedValues}`; 176 - default: 177 - return joinedValues; 178 - } 179 - } 180 - 181 - const separator = separatorObjectExplode(style); 182 - const joinedValues = Object.entries(value) 183 - .map(([key, v]) => 184 - serializePrimitiveParam({ 185 - allowReserved, 186 - name: style === 'deepObject' ? `${name}[${key}]` : key, 187 - value: v as string, 188 - }), 189 - ) 190 - .join(separator); 191 - return style === 'label' || style === 'matrix' 192 - ? separator + joinedValues 193 - : joinedValues; 194 - }; 195 - 196 - const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { 197 - let url = _url; 198 - const matches = _url.match(PATH_PARAM_RE); 199 - if (matches) { 200 - for (const match of matches) { 201 - let explode = false; 202 - let name = match.substring(1, match.length - 1); 203 - let style: ArraySeparatorStyle = 'simple'; 204 - 205 - if (name.endsWith('*')) { 206 - explode = true; 207 - name = name.substring(0, name.length - 1); 208 - } 209 - 210 - if (name.startsWith('.')) { 211 - name = name.substring(1); 212 - style = 'label'; 213 - } else if (name.startsWith(';')) { 214 - name = name.substring(1); 215 - style = 'matrix'; 216 - } 217 - 218 - const value = path[name]; 219 - 220 - if (value === undefined || value === null) { 221 - continue; 222 - } 223 - 224 - if (Array.isArray(value)) { 225 - url = url.replace( 226 - match, 227 - serializeArrayParam({ explode, name, style, value }), 228 - ); 229 - continue; 230 - } 231 - 232 - if (typeof value === 'object') { 233 - url = url.replace( 234 - match, 235 - serializeObjectParam({ 236 - explode, 237 - name, 238 - style, 239 - value: value as Record<string, unknown>, 240 - }), 241 - ); 242 - continue; 243 - } 244 - 245 - if (style === 'matrix') { 246 - url = url.replace( 247 - match, 248 - `;${serializePrimitiveParam({ 249 - name, 250 - value: value as string, 251 - })}`, 252 - ); 253 - continue; 254 - } 255 - 256 - const replaceValue = encodeURIComponent( 257 - style === 'label' ? `.${value as string}` : (value as string), 258 - ); 259 - url = url.replace(match, replaceValue); 260 - } 261 - } 262 - return url; 263 - }; 264 - 265 - export const createQuerySerializer = <T = unknown>({ 266 - allowReserved, 267 - array, 268 - object, 269 - }: QuerySerializerOptions = {}) => { 270 - const querySerializer = (queryParams: T) => { 271 - let search: string[] = []; 272 - if (queryParams && typeof queryParams === 'object') { 273 - for (const name in queryParams) { 274 - const value = queryParams[name]; 275 - 276 - if (value === undefined || value === null) { 277 - continue; 278 - } 279 - 280 - if (Array.isArray(value)) { 281 - search = [ 282 - ...search, 283 - serializeArrayParam({ 284 - allowReserved, 285 - explode: true, 286 - name, 287 - style: 'form', 288 - value, 289 - ...array, 290 - }), 291 - ]; 292 - continue; 293 - } 294 - 295 - if (typeof value === 'object') { 296 - search = [ 297 - ...search, 298 - serializeObjectParam({ 299 - allowReserved, 300 - explode: true, 301 - name, 302 - style: 'deepObject', 303 - value: value as Record<string, unknown>, 304 - ...object, 305 - }), 306 - ]; 307 - continue; 308 - } 309 - 310 - search = [ 311 - ...search, 312 - serializePrimitiveParam({ 313 - allowReserved, 314 - name, 315 - value: value as string, 316 - }), 317 - ]; 318 - } 319 - } 320 - return search.join('&'); 321 - }; 322 - return querySerializer; 323 - }; 324 - 325 - /** 326 - * Infers parseAs value from provided Content-Type header. 327 - */ 328 - export const getParseAs = ( 329 - contentType: string | null, 330 - ): Exclude<Config['parseAs'], 'auto'> => { 331 - if (!contentType) { 332 - // If no Content-Type header is provided, the best we can do is return the raw response body, 333 - // which is effectively the same as the 'stream' option. 334 - return 'stream'; 335 - } 336 - 337 - const cleanContent = contentType.split(';')[0]?.trim(); 338 - 339 - if (!cleanContent) { 340 - return; 341 - } 342 - 343 - if ( 344 - cleanContent.startsWith('application/json') || 345 - cleanContent.endsWith('+json') 346 - ) { 347 - return 'json'; 348 - } 349 - 350 - if (cleanContent === 'multipart/form-data') { 351 - return 'formData'; 352 - } 353 - 354 - if ( 355 - ['application/', 'audio/', 'image/', 'video/'].some((type) => 356 - cleanContent.startsWith(type), 357 - ) 358 - ) { 359 - return 'blob'; 360 - } 361 - 362 - if (cleanContent.startsWith('text/')) { 363 - return 'text'; 364 - } 365 - }; 366 - 367 - export const getAuthToken = async ( 368 - auth: Auth, 369 - callback: RequestOptions['auth'], 370 - ): Promise<string | undefined> => { 371 - const token = 372 - typeof callback === 'function' ? await callback(auth) : callback; 373 - 374 - if (!token) { 375 - return; 376 - } 377 - 378 - if (auth.scheme === 'bearer') { 379 - return `Bearer ${token}`; 380 - } 381 - 382 - if (auth.scheme === 'basic') { 383 - return `Basic ${btoa(token)}`; 384 - } 385 - 386 - return token; 387 - }; 388 - 389 - export const setAuthParams = async ({ 390 - security, 391 - ...options 392 - }: Pick<Required<RequestOptions>, 'security'> & 393 - Pick<RequestOptions, 'auth' | 'query'> & { 394 - headers: Headers; 395 - }) => { 396 - for (const auth of security) { 397 - const token = await getAuthToken(auth, options.auth); 398 - 399 - if (!token) { 400 - continue; 401 - } 402 - 403 - const name = auth.name ?? 'Authorization'; 404 - 405 - switch (auth.in) { 406 - case 'query': 407 - if (!options.query) { 408 - options.query = {}; 409 - } 410 - options.query[name] = token; 411 - break; 412 - case 'header': 413 - default: 414 - options.headers.set(name, token); 415 - break; 416 - } 417 - 418 - return; 419 - } 420 - }; 421 - 422 - export const buildUrl: Client['buildUrl'] = (options) => { 423 - const url = getUrl({ 424 - baseUrl: options.baseUrl ?? '', 425 - path: options.path, 426 - query: options.query, 427 - querySerializer: 428 - typeof options.querySerializer === 'function' 429 - ? options.querySerializer 430 - : createQuerySerializer(options.querySerializer), 431 - url: options.url, 432 - }); 433 - return url; 434 - }; 435 - 436 - export const getUrl = ({ 437 - baseUrl, 438 - path, 439 - query, 440 - querySerializer, 441 - url: _url, 442 - }: { 443 - baseUrl: string; 444 - path?: Record<string, unknown>; 445 - query?: Record<string, unknown>; 446 - querySerializer: QuerySerializer; 447 - url: string; 448 - }) => { 449 - const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; 450 - let url = baseUrl + pathUrl; 451 - if (path) { 452 - url = defaultPathSerializer({ path, url }); 453 - } 454 - let search = query ? querySerializer(query) : ''; 455 - if (search.startsWith('?')) { 456 - search = search.substring(1); 457 - } 458 - if (search) { 459 - url += `?${search}`; 460 - } 461 - return url; 462 - }; 463 - 464 - export const mergeConfigs = (a: Config, b: Config): Config => { 465 - const config = { ...a, ...b }; 466 - if (config.baseUrl?.endsWith('/')) { 467 - config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1); 468 - } 469 - config.headers = mergeHeaders(a.headers, b.headers); 470 - return config; 471 - }; 472 - 473 - export const mergeHeaders = ( 474 - ...headers: Array<Required<Config>['headers'] | undefined> 475 - ): Headers => { 476 - const mergedHeaders = new Headers(); 477 - for (const header of headers) { 478 - if (!header || typeof header !== 'object') { 479 - continue; 480 - } 481 - 482 - const iterator = 483 - header instanceof Headers ? header.entries() : Object.entries(header); 484 - 485 - for (const [key, value] of iterator) { 486 - if (value === null) { 487 - mergedHeaders.delete(key); 488 - } else if (Array.isArray(value)) { 489 - for (const v of value) { 490 - mergedHeaders.append(key, v as string); 491 - } 492 - } else if (value !== undefined) { 493 - // assume object headers are meant to be JSON stringified, i.e. their 494 - // content value in OpenAPI specification is 'application/json' 495 - mergedHeaders.set( 496 - key, 497 - typeof value === 'object' ? JSON.stringify(value) : (value as string), 498 - ); 499 - } 500 - } 501 - } 502 - return mergedHeaders; 503 - }; 504 - 505 - type ErrInterceptor<Err, Res, Req, Options> = ( 506 - error: Err, 507 - response: Res, 508 - request: Req, 509 - options: Options, 510 - ) => Err | Promise<Err>; 511 - 512 - type ReqInterceptor<Req, Options> = ( 513 - request: Req, 514 - options: Options, 515 - ) => Req | Promise<Req>; 516 - 517 - type ResInterceptor<Res, Req, Options> = ( 518 - response: Res, 519 - request: Req, 520 - options: Options, 521 - ) => Res | Promise<Res>; 522 - 523 - class Interceptors<Interceptor> { 524 - _fns: Interceptor[]; 525 - 526 - constructor() { 527 - this._fns = []; 528 - } 529 - 530 - clear() { 531 - this._fns = []; 532 - } 533 - 534 - exists(fn: Interceptor) { 535 - return this._fns.indexOf(fn) !== -1; 536 - } 537 - 538 - eject(fn: Interceptor) { 539 - const index = this._fns.indexOf(fn); 540 - if (index !== -1) { 541 - this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)]; 542 - } 543 - } 544 - 545 - use(fn: Interceptor) { 546 - this._fns = [...this._fns, fn]; 547 - } 548 - } 549 - 550 - // `createInterceptors()` response, meant for external use as it does not 551 - // expose internals 552 - export interface Middleware<Req, Res, Err, Options> { 553 - error: Pick< 554 - Interceptors<ErrInterceptor<Err, Res, Req, Options>>, 555 - 'eject' | 'use' 556 - >; 557 - request: Pick<Interceptors<ReqInterceptor<Req, Options>>, 'eject' | 'use'>; 558 - response: Pick< 559 - Interceptors<ResInterceptor<Res, Req, Options>>, 560 - 'eject' | 'use' 561 - >; 562 - } 563 - 564 - // do not add `Middleware` as return type so we can use _fns internally 565 - export const createInterceptors = <Req, Res, Err, Options>() => ({ 566 - error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(), 567 - request: new Interceptors<ReqInterceptor<Req, Options>>(), 568 - response: new Interceptors<ResInterceptor<Res, Req, Options>>(), 569 - }); 570 - 571 - const serializeFormDataPair = (data: FormData, key: string, value: unknown) => { 572 - if (typeof value === 'string' || value instanceof Blob) { 573 - data.append(key, value); 574 - } else { 575 - data.append(key, JSON.stringify(value)); 576 - } 577 - }; 578 - 579 - export const formDataBodySerializer = { 580 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 581 - body: T, 582 - ) => { 583 - const data = new FormData(); 584 - 585 - Object.entries(body).forEach(([key, value]) => { 586 - if (value === undefined || value === null) { 587 - return; 588 - } 589 - if (Array.isArray(value)) { 590 - value.forEach((v) => serializeFormDataPair(data, key, v)); 591 - } else { 592 - serializeFormDataPair(data, key, value); 593 - } 594 - }); 595 - 596 - return data; 597 - }, 598 - }; 599 - 600 - export const jsonBodySerializer = { 601 - bodySerializer: <T>(body: T) => JSON.stringify(body), 602 - }; 603 - 604 - const serializeUrlSearchParamsPair = ( 605 - data: URLSearchParams, 606 - key: string, 607 - value: unknown, 608 - ) => { 609 - if (typeof value === 'string') { 610 - data.append(key, value); 611 - } else { 612 - data.append(key, JSON.stringify(value)); 613 - } 614 - }; 615 - 616 - export const urlSearchParamsBodySerializer = { 617 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 618 - body: T, 619 - ) => { 620 - const data = new URLSearchParams(); 621 - 622 - Object.entries(body).forEach(([key, value]) => { 623 - if (value === undefined || value === null) { 624 - return; 625 - } 626 - if (Array.isArray(value)) { 627 - value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); 628 - } else { 629 - serializeUrlSearchParamsPair(data, key, value); 630 - } 631 - }); 632 - 633 - return data; 634 - }, 635 - }; 636 - 637 - const defaultQuerySerializer = createQuerySerializer({ 638 - allowReserved: false, 639 - array: { 640 - explode: true, 641 - style: 'form', 642 - }, 643 - object: { 644 - explode: true, 645 - style: 'deepObject', 646 - }, 647 - }); 648 - 649 - const defaultHeaders = { 650 - 'Content-Type': 'application/json', 651 - }; 652 - 653 - export const createConfig = (override: Config = {}): Config => ({ 654 - ...jsonBodySerializer, 655 - baseUrl: '', 656 - headers: defaultHeaders, 657 - parseAs: 'auto', 658 - querySerializer: defaultQuerySerializer, 659 - ...override, 660 - });
+2
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-nuxt/bundle/client/index.cjs
··· 1 + 'use strict';var app=require('nuxt/app'),vue=require('vue');var $=async(r,t)=>{let e=typeof t=="function"?await t(r):t;if(e)return r.scheme==="bearer"?`Bearer ${e}`:r.scheme==="basic"?`Basic ${btoa(e)}`:e},P=(r,t,e)=>{typeof e=="string"||e instanceof Blob?r.append(t,e):r.append(t,JSON.stringify(e));},U=(r,t,e)=>{typeof e=="string"?r.append(t,e):r.append(t,JSON.stringify(e));},L={bodySerializer:r=>{let t=new FormData;return Object.entries(r).forEach(([e,s])=>{s!=null&&(Array.isArray(s)?s.forEach(o=>P(t,e,o)):P(t,e,s));}),t}},R={bodySerializer:r=>JSON.stringify(r)},H={bodySerializer:r=>{let t=new URLSearchParams;return Object.entries(r).forEach(([e,s])=>{s!=null&&(Array.isArray(s)?s.forEach(o=>U(t,e,o)):U(t,e,s));}),t}},D=r=>{switch(r){case "label":return ".";case "matrix":return ";";case "simple":return ",";default:return "&"}},N=r=>{switch(r){case "form":return ",";case "pipeDelimited":return "|";case "spaceDelimited":return "%20";default:return ","}},I=r=>{switch(r){case "label":return ".";case "matrix":return ";";case "simple":return ",";default:return "&"}},S=({allowReserved:r,explode:t,name:e,style:s,value:o})=>{if(!t){let n=(r?o:o.map(u=>encodeURIComponent(u))).join(N(s));switch(s){case "label":return `.${n}`;case "matrix":return `;${e}=${n}`;case "simple":return n;default:return `${e}=${n}`}}let a=D(s),i=o.map(n=>s==="label"||s==="simple"?r?n:encodeURIComponent(n):y({allowReserved:r,name:e,value:n})).join(a);return s==="label"||s==="matrix"?a+i:i},y=({allowReserved:r,name:t,value:e})=>{if(e==null)return "";if(typeof e=="object")throw new Error("Deeply-nested arrays/objects aren\u2019t supported. Provide your own `querySerializer()` to handle these.");return `${t}=${r?e:encodeURIComponent(e)}`},A=({allowReserved:r,explode:t,name:e,style:s,value:o})=>{if(o instanceof Date)return `${e}=${o.toISOString()}`;if(s!=="deepObject"&&!t){let n=[];Object.entries(o).forEach(([l,p])=>{n=[...n,l,r?p:encodeURIComponent(p)];});let u=n.join(",");switch(s){case "form":return `${e}=${u}`;case "label":return `.${u}`;case "matrix":return `;${e}=${u}`;default:return u}}let a=I(s),i=Object.entries(o).map(([n,u])=>y({allowReserved:r,name:s==="deepObject"?`${e}[${n}]`:n,value:u})).join(a);return s==="label"||s==="matrix"?a+i:i};var Q=/\{[^{}]+\}/g,V=({path:r,url:t})=>{let e=t,s=t.match(Q);if(s)for(let o of s){let a=false,i=o.substring(1,o.length-1),n="simple";i.endsWith("*")&&(a=true,i=i.substring(0,i.length-1)),i.startsWith(".")?(i=i.substring(1),n="label"):i.startsWith(";")&&(i=i.substring(1),n="matrix");let u=vue.toValue(vue.toValue(r)[i]);if(u==null)continue;if(Array.isArray(u)){e=e.replace(o,S({explode:a,name:i,style:n,value:u}));continue}if(typeof u=="object"){e=e.replace(o,A({explode:a,name:i,style:n,value:u}));continue}if(n==="matrix"){e=e.replace(o,`;${y({name:i,value:u})}`);continue}let l=encodeURIComponent(n==="label"?`.${u}`:u);e=e.replace(o,l);}return e},E=({allowReserved:r,array:t,object:e}={})=>o=>{let a=[],i=vue.toValue(o);if(i&&typeof i=="object")for(let n in i){let u=vue.toValue(i[n]);if(u!=null){if(Array.isArray(u)){a=[...a,S({allowReserved:r,explode:true,name:n,style:"form",value:u,...t})];continue}if(typeof u=="object"){a=[...a,A({allowReserved:r,explode:true,name:n,style:"deepObject",value:u,...e})];continue}a=[...a,y({allowReserved:r,name:n,value:u})];}}return a.join("&")},k=async({security:r,...t})=>{for(let e of r){let s=await $(e,t.auth);if(!s)continue;let o=e.name??"Authorization";switch(e.in){case "query":t.query||(t.query={}),vue.toValue(t.query)[o]=s;break;case "header":default:t.headers.set(o,s);break}return}},d=r=>F({baseUrl:r.baseURL??"",path:r.path,query:r.query,querySerializer:typeof r.querySerializer=="function"?r.querySerializer:E(r.querySerializer),url:r.url}),F=({baseUrl:r,path:t,query:e,querySerializer:s,url:o})=>{let a=o.startsWith("/")?o:`/${o}`,i=r+a;t&&(i=V({path:t,url:i}));let n=e?s(e):"";return n.startsWith("?")&&(n=n.substring(1)),n&&(i+=`?${n}`),i},C=(r,t)=>{let e={...r,...t};return e.baseURL?.endsWith("/")&&(e.baseURL=e.baseURL.substring(0,e.baseURL.length-1)),e.headers=T(r.headers,t.headers),e},T=(...r)=>{let t=new Headers;for(let e of r){if(!e||typeof e!="object")continue;let s=e;vue.isRef(s)&&(s=vue.unref(s));let o=s instanceof Headers?s.entries():Object.entries(s);for(let[a,i]of o)if(i===null)t.delete(a);else if(Array.isArray(i))for(let n of i)t.append(a,f(n));else if(i!==undefined){let n=f(i);t.set(a,typeof n=="object"?JSON.stringify(n):n);}}return t},w=(...r)=>r.reduce((t,e)=>{if(typeof e=="function")t.push(e);else if(Array.isArray(e))return t.concat(e);return t},[]),W=E({allowReserved:false,array:{explode:true,style:"form"},object:{explode:true,style:"deepObject"}}),J={"Content-Type":"application/json"},q=(r={})=>({...R,baseURL:"",headers:J,querySerializer:W,...r}),f=r=>{if(r===null||typeof r!="object"||r instanceof Headers)return vue.isRef(r)?vue.unref(r):r;if(Array.isArray(r))return r.map(e=>f(e));if(vue.isRef(r))return f(vue.unref(r));let t={};for(let e in r)t[e]=f(r[e]);return t};var re=(r={})=>{let t=C(q(),r),e=()=>({...t}),s=a=>(t=C(t,a),e()),o=({asyncDataOptions:a,composable:i,key:n,...u})=>{let l={...t,...u,$fetch:u.$fetch??t.$fetch??$fetch,headers:T(t.headers,u.headers),onRequest:w(t.onRequest,u.onRequest),onResponse:w(t.onResponse,u.onResponse)},{responseTransformer:p,responseValidator:g,security:j}=l;j&&(l.onRequest=[async({options:c})=>{await k({auth:l.auth,headers:c.headers,query:c.query,security:j});},...l.onRequest]),(p||g)&&(l.onResponse=[...l.onResponse,async({options:c,response:b})=>{c.responseType&&c.responseType!=="json"||(g&&await g(b._data),p&&(b._data=await p(b._data)));}]),l.body&&l.bodySerializer&&(l.body=l.bodySerializer(f(l.body))),l.body||l.headers.delete("Content-Type");let O=l.$fetch;if(i==="$fetch"){let c=d(l);return O(c,f(l))}if(i==="useFetch"){let c=d(l);return app.useFetch(c,l)}if(i==="useLazyFetch"){let c=d(l);return app.useLazyFetch(c,l)}let h=()=>{let c=d(l);return O(c,f(l))};if(i==="useAsyncData")return n?app.useAsyncData(n,h,a):app.useAsyncData(h,a);if(i==="useLazyAsyncData")return n?app.useLazyAsyncData(n,h,a):app.useLazyAsyncData(h,a)};return {buildUrl:d,connect:a=>o({...a,method:"CONNECT"}),delete:a=>o({...a,method:"DELETE"}),get:a=>o({...a,method:"GET"}),getConfig:e,head:a=>o({...a,method:"HEAD"}),options:a=>o({...a,method:"OPTIONS"}),patch:a=>o({...a,method:"PATCH"}),post:a=>o({...a,method:"POST"}),put:a=>o({...a,method:"PUT"}),request:o,setConfig:s,trace:a=>o({...a,method:"TRACE"})}};exports.createClient=re;exports.createConfig=q;exports.formDataBodySerializer=L;exports.jsonBodySerializer=R;exports.urlSearchParamsBodySerializer=H;//# sourceMappingURL=index.cjs.map 2 + //# sourceMappingURL=index.cjs.map
+160
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-nuxt/bundle/client/index.d.cts
··· 1 + import { AsyncDataOptions, useAsyncData, useFetch, useLazyAsyncData, useLazyFetch, UseFetchOptions } from 'nuxt/app'; 2 + import { Ref } from 'vue'; 3 + 4 + interface Auth { 5 + in?: 'header' | 'query'; 6 + name?: string; 7 + scheme?: 'basic' | 'bearer'; 8 + type: 'apiKey' | 'http'; 9 + } 10 + interface SerializerOptions<T> { 11 + /** 12 + * @default true 13 + */ 14 + explode: boolean; 15 + style: T; 16 + } 17 + type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 18 + type ObjectStyle = 'form' | 'deepObject'; 19 + type BodySerializer = (body: any) => any; 20 + interface QuerySerializerOptions { 21 + allowReserved?: boolean; 22 + array?: SerializerOptions<ArrayStyle>; 23 + object?: SerializerOptions<ObjectStyle>; 24 + } 25 + declare const formDataBodySerializer: { 26 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => FormData; 27 + }; 28 + declare const jsonBodySerializer: { 29 + bodySerializer: <T>(body: T) => string; 30 + }; 31 + declare const urlSearchParamsBodySerializer: { 32 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => URLSearchParams; 33 + }; 34 + 35 + type QuerySerializer = (query: Parameters<Client['buildUrl']>[0]['query']) => string; 36 + type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 37 + type WithRefs<TData> = { 38 + [K in keyof TData]: NonNullable<TData[K]> extends object ? WithRefs<NonNullable<TData[K]>> | Ref<NonNullable<TData[K]>> : NonNullable<TData[K]> | Ref<NonNullable<TData[K]>>; 39 + }; 40 + interface Config extends Omit<FetchOptions<unknown>, 'baseURL' | 'body' | 'headers' | 'method' | 'query'>, WithRefs<Pick<FetchOptions<unknown>, 'query'>> { 41 + /** 42 + * Auth token or a function returning auth token. The resolved value will be 43 + * added to the request payload as defined by its `security` array. 44 + */ 45 + auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 46 + /** 47 + * Base URL for all requests made by this client. 48 + * 49 + * @default '' 50 + */ 51 + baseURL?: string; 52 + /** 53 + * A function for serializing request body parameter. By default, 54 + * {@link JSON.stringify()} will be used. 55 + */ 56 + bodySerializer?: BodySerializer | null; 57 + /** 58 + * An object containing any HTTP headers that you want to pre-populate your 59 + * `Headers` object with. 60 + * 61 + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 62 + */ 63 + headers?: RequestInit['headers'] | Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined | unknown>; 64 + /** 65 + * The request method. 66 + * 67 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 68 + */ 69 + method?: 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE'; 70 + /** 71 + * A function for serializing request query parameters. By default, arrays 72 + * will be exploded in form style, objects will be exploded in deepObject 73 + * style, and reserved characters are percent-encoded. 74 + * 75 + * {@link https://swagger.io/docs/specification/serialization/#query View examples} 76 + */ 77 + querySerializer?: QuerySerializer | QuerySerializerOptions; 78 + /** 79 + * A function transforming response data before it's returned. This is useful 80 + * for post-processing data, e.g. converting ISO strings into Date objects. 81 + */ 82 + responseTransformer?: (data: unknown) => Promise<unknown>; 83 + /** 84 + * A function validating response data. This is useful if you want to ensure 85 + * the response conforms to the desired shape, so it can be safely passed to 86 + * the transformers and returned to the user. 87 + */ 88 + responseValidator?: (data: unknown) => Promise<unknown>; 89 + } 90 + type AuthToken = string | undefined; 91 + interface RequestOptions<TComposable extends Composable = Composable, Url extends string = string> extends Config, WithRefs<{ 92 + /** 93 + * Any body that you want to add to your request. 94 + * 95 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 96 + */ 97 + body?: BodyInit | Record<string, any> | null; 98 + path?: FetchOptions<unknown>['query']; 99 + query?: FetchOptions<unknown>['query']; 100 + }> { 101 + asyncDataOptions?: AsyncDataOptions<unknown>; 102 + /** 103 + * You can provide a client instance returned by `createClient()` instead of 104 + * individual options. This might be also useful if you want to implement a 105 + * custom client. 106 + */ 107 + client?: Client; 108 + composable: TComposable; 109 + key?: string; 110 + /** 111 + * Security mechanism(s) to use for the request. 112 + */ 113 + security?: ReadonlyArray<Auth>; 114 + url: Url; 115 + } 116 + type RequestResult<TComposable extends Composable, TData, TError> = TComposable extends '$fetch' ? ReturnType<typeof $fetch<TData>> : TComposable extends 'useAsyncData' ? ReturnType<typeof useAsyncData<TData | null, TError>> : TComposable extends 'useFetch' ? ReturnType<typeof useFetch<TData | null, TError>> : TComposable extends 'useLazyAsyncData' ? ReturnType<typeof useLazyAsyncData<TData | null, TError>> : TComposable extends 'useLazyFetch' ? ReturnType<typeof useLazyFetch<TData | null, TError>> : never; 117 + type MethodFn = <TComposable extends Composable, TData = unknown, TError = unknown>(options: Omit<RequestOptions<TComposable>, 'method'>) => RequestResult<TComposable, TData, TError>; 118 + type RequestFn = <TComposable extends Composable, TData = unknown, TError = unknown>(options: Omit<RequestOptions<TComposable>, 'method'> & Pick<Required<RequestOptions<TComposable>>, 'method'>) => RequestResult<TComposable, TData, TError>; 119 + interface DataShape { 120 + body?: unknown; 121 + headers?: unknown; 122 + path?: FetchOptions<unknown>['query']; 123 + query?: FetchOptions<unknown>['query']; 124 + url: string; 125 + } 126 + type BuildUrlOptions<TData extends Omit<DataShape, 'headers'> = Omit<DataShape, 'headers'>> = Pick<WithRefs<TData>, 'path' | 'query'> & Pick<TData, 'url'> & Pick<Options<'$fetch', TData>, 'baseURL' | 'querySerializer'>; 127 + interface Client { 128 + /** 129 + * Returns the final request URL. This method works only with experimental parser. 130 + */ 131 + buildUrl: <TData extends Omit<DataShape, 'headers'>>(options: BuildUrlOptions<TData>) => string; 132 + connect: MethodFn; 133 + delete: MethodFn; 134 + get: MethodFn; 135 + getConfig: () => Config; 136 + head: MethodFn; 137 + options: MethodFn; 138 + patch: MethodFn; 139 + post: MethodFn; 140 + put: MethodFn; 141 + request: RequestFn; 142 + setConfig: (config: Config) => Config; 143 + trace: MethodFn; 144 + } 145 + type Options<TComposable extends Composable, TData extends DataShape = DataShape> = OmitKeys<RequestOptions<TComposable>, 'body' | 'path' | 'query' | 'url'> & WithRefs<Omit<TData, 'url'>>; 146 + type OptionsLegacyParser<TData = unknown> = TData extends { 147 + body?: any; 148 + } ? TData extends { 149 + headers?: any; 150 + } ? OmitKeys<RequestOptions, 'body' | 'headers' | 'url'> & TData : OmitKeys<RequestOptions, 'body' | 'url'> & TData & Pick<RequestOptions, 'headers'> : TData extends { 151 + headers?: any; 152 + } ? OmitKeys<RequestOptions, 'headers' | 'url'> & TData & Pick<RequestOptions, 'body'> : OmitKeys<RequestOptions, 'url'> & TData; 153 + type FetchOptions<TData> = Omit<UseFetchOptions<TData, TData>, keyof AsyncDataOptions<TData>>; 154 + type Composable = '$fetch' | 'useAsyncData' | 'useFetch' | 'useLazyAsyncData' | 'useLazyFetch'; 155 + 156 + declare const createConfig: (override?: Config) => Config; 157 + 158 + declare const createClient: (config?: Config) => Client; 159 + 160 + export { type Auth, type Client, type Composable, type Config, type Options, type OptionsLegacyParser, type QuerySerializerOptions, type RequestOptions, type RequestResult, createClient, createConfig, formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer };
+160
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-nuxt/bundle/client/index.d.ts
··· 1 + import { AsyncDataOptions, useAsyncData, useFetch, useLazyAsyncData, useLazyFetch, UseFetchOptions } from 'nuxt/app'; 2 + import { Ref } from 'vue'; 3 + 4 + interface Auth { 5 + in?: 'header' | 'query'; 6 + name?: string; 7 + scheme?: 'basic' | 'bearer'; 8 + type: 'apiKey' | 'http'; 9 + } 10 + interface SerializerOptions<T> { 11 + /** 12 + * @default true 13 + */ 14 + explode: boolean; 15 + style: T; 16 + } 17 + type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 18 + type ObjectStyle = 'form' | 'deepObject'; 19 + type BodySerializer = (body: any) => any; 20 + interface QuerySerializerOptions { 21 + allowReserved?: boolean; 22 + array?: SerializerOptions<ArrayStyle>; 23 + object?: SerializerOptions<ObjectStyle>; 24 + } 25 + declare const formDataBodySerializer: { 26 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => FormData; 27 + }; 28 + declare const jsonBodySerializer: { 29 + bodySerializer: <T>(body: T) => string; 30 + }; 31 + declare const urlSearchParamsBodySerializer: { 32 + bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T) => URLSearchParams; 33 + }; 34 + 35 + type QuerySerializer = (query: Parameters<Client['buildUrl']>[0]['query']) => string; 36 + type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 37 + type WithRefs<TData> = { 38 + [K in keyof TData]: NonNullable<TData[K]> extends object ? WithRefs<NonNullable<TData[K]>> | Ref<NonNullable<TData[K]>> : NonNullable<TData[K]> | Ref<NonNullable<TData[K]>>; 39 + }; 40 + interface Config extends Omit<FetchOptions<unknown>, 'baseURL' | 'body' | 'headers' | 'method' | 'query'>, WithRefs<Pick<FetchOptions<unknown>, 'query'>> { 41 + /** 42 + * Auth token or a function returning auth token. The resolved value will be 43 + * added to the request payload as defined by its `security` array. 44 + */ 45 + auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 46 + /** 47 + * Base URL for all requests made by this client. 48 + * 49 + * @default '' 50 + */ 51 + baseURL?: string; 52 + /** 53 + * A function for serializing request body parameter. By default, 54 + * {@link JSON.stringify()} will be used. 55 + */ 56 + bodySerializer?: BodySerializer | null; 57 + /** 58 + * An object containing any HTTP headers that you want to pre-populate your 59 + * `Headers` object with. 60 + * 61 + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 62 + */ 63 + headers?: RequestInit['headers'] | Record<string, string | number | boolean | (string | number | boolean)[] | null | undefined | unknown>; 64 + /** 65 + * The request method. 66 + * 67 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 68 + */ 69 + method?: 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE'; 70 + /** 71 + * A function for serializing request query parameters. By default, arrays 72 + * will be exploded in form style, objects will be exploded in deepObject 73 + * style, and reserved characters are percent-encoded. 74 + * 75 + * {@link https://swagger.io/docs/specification/serialization/#query View examples} 76 + */ 77 + querySerializer?: QuerySerializer | QuerySerializerOptions; 78 + /** 79 + * A function transforming response data before it's returned. This is useful 80 + * for post-processing data, e.g. converting ISO strings into Date objects. 81 + */ 82 + responseTransformer?: (data: unknown) => Promise<unknown>; 83 + /** 84 + * A function validating response data. This is useful if you want to ensure 85 + * the response conforms to the desired shape, so it can be safely passed to 86 + * the transformers and returned to the user. 87 + */ 88 + responseValidator?: (data: unknown) => Promise<unknown>; 89 + } 90 + type AuthToken = string | undefined; 91 + interface RequestOptions<TComposable extends Composable = Composable, Url extends string = string> extends Config, WithRefs<{ 92 + /** 93 + * Any body that you want to add to your request. 94 + * 95 + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 96 + */ 97 + body?: BodyInit | Record<string, any> | null; 98 + path?: FetchOptions<unknown>['query']; 99 + query?: FetchOptions<unknown>['query']; 100 + }> { 101 + asyncDataOptions?: AsyncDataOptions<unknown>; 102 + /** 103 + * You can provide a client instance returned by `createClient()` instead of 104 + * individual options. This might be also useful if you want to implement a 105 + * custom client. 106 + */ 107 + client?: Client; 108 + composable: TComposable; 109 + key?: string; 110 + /** 111 + * Security mechanism(s) to use for the request. 112 + */ 113 + security?: ReadonlyArray<Auth>; 114 + url: Url; 115 + } 116 + type RequestResult<TComposable extends Composable, TData, TError> = TComposable extends '$fetch' ? ReturnType<typeof $fetch<TData>> : TComposable extends 'useAsyncData' ? ReturnType<typeof useAsyncData<TData | null, TError>> : TComposable extends 'useFetch' ? ReturnType<typeof useFetch<TData | null, TError>> : TComposable extends 'useLazyAsyncData' ? ReturnType<typeof useLazyAsyncData<TData | null, TError>> : TComposable extends 'useLazyFetch' ? ReturnType<typeof useLazyFetch<TData | null, TError>> : never; 117 + type MethodFn = <TComposable extends Composable, TData = unknown, TError = unknown>(options: Omit<RequestOptions<TComposable>, 'method'>) => RequestResult<TComposable, TData, TError>; 118 + type RequestFn = <TComposable extends Composable, TData = unknown, TError = unknown>(options: Omit<RequestOptions<TComposable>, 'method'> & Pick<Required<RequestOptions<TComposable>>, 'method'>) => RequestResult<TComposable, TData, TError>; 119 + interface DataShape { 120 + body?: unknown; 121 + headers?: unknown; 122 + path?: FetchOptions<unknown>['query']; 123 + query?: FetchOptions<unknown>['query']; 124 + url: string; 125 + } 126 + type BuildUrlOptions<TData extends Omit<DataShape, 'headers'> = Omit<DataShape, 'headers'>> = Pick<WithRefs<TData>, 'path' | 'query'> & Pick<TData, 'url'> & Pick<Options<'$fetch', TData>, 'baseURL' | 'querySerializer'>; 127 + interface Client { 128 + /** 129 + * Returns the final request URL. This method works only with experimental parser. 130 + */ 131 + buildUrl: <TData extends Omit<DataShape, 'headers'>>(options: BuildUrlOptions<TData>) => string; 132 + connect: MethodFn; 133 + delete: MethodFn; 134 + get: MethodFn; 135 + getConfig: () => Config; 136 + head: MethodFn; 137 + options: MethodFn; 138 + patch: MethodFn; 139 + post: MethodFn; 140 + put: MethodFn; 141 + request: RequestFn; 142 + setConfig: (config: Config) => Config; 143 + trace: MethodFn; 144 + } 145 + type Options<TComposable extends Composable, TData extends DataShape = DataShape> = OmitKeys<RequestOptions<TComposable>, 'body' | 'path' | 'query' | 'url'> & WithRefs<Omit<TData, 'url'>>; 146 + type OptionsLegacyParser<TData = unknown> = TData extends { 147 + body?: any; 148 + } ? TData extends { 149 + headers?: any; 150 + } ? OmitKeys<RequestOptions, 'body' | 'headers' | 'url'> & TData : OmitKeys<RequestOptions, 'body' | 'url'> & TData & Pick<RequestOptions, 'headers'> : TData extends { 151 + headers?: any; 152 + } ? OmitKeys<RequestOptions, 'headers' | 'url'> & TData & Pick<RequestOptions, 'body'> : OmitKeys<RequestOptions, 'url'> & TData; 153 + type FetchOptions<TData> = Omit<UseFetchOptions<TData, TData>, keyof AsyncDataOptions<TData>>; 154 + type Composable = '$fetch' | 'useAsyncData' | 'useFetch' | 'useLazyAsyncData' | 'useLazyFetch'; 155 + 156 + declare const createConfig: (override?: Config) => Config; 157 + 158 + declare const createClient: (config?: Config) => Client; 159 + 160 + export { type Auth, type Client, type Composable, type Config, type Options, type OptionsLegacyParser, type QuerySerializerOptions, type RequestOptions, type RequestResult, createClient, createConfig, formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer };
-169
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-nuxt/bundle/client/index.ts
··· 1 - import type { NuxtApp } from 'nuxt/app'; 2 - import { 3 - useAsyncData, 4 - useFetch, 5 - useLazyAsyncData, 6 - useLazyFetch, 7 - } from 'nuxt/app'; 8 - 9 - import type { Client, Config } from './types'; 10 - import { 11 - buildUrl, 12 - createConfig, 13 - mergeConfigs, 14 - mergeHeaders, 15 - mergeInterceptors, 16 - setAuthParams, 17 - unwrapRefs, 18 - } from './utils'; 19 - 20 - export const createClient = (config: Config = {}): Client => { 21 - let _config = mergeConfigs(createConfig(), config); 22 - 23 - const getConfig = (): Config => ({ ..._config }); 24 - 25 - const setConfig = (config: Config): Config => { 26 - _config = mergeConfigs(_config, config); 27 - return getConfig(); 28 - }; 29 - 30 - const request: Client['request'] = ({ 31 - asyncDataOptions, 32 - composable, 33 - key, 34 - ...options 35 - }) => { 36 - const opts = { 37 - ..._config, 38 - ...options, 39 - $fetch: options.$fetch ?? _config.$fetch ?? $fetch, 40 - headers: mergeHeaders(_config.headers, options.headers), 41 - onRequest: mergeInterceptors(_config.onRequest, options.onRequest), 42 - onResponse: mergeInterceptors(_config.onResponse, options.onResponse), 43 - }; 44 - 45 - const { responseTransformer, responseValidator, security } = opts; 46 - if (security) { 47 - // auth must happen in interceptors otherwise we'd need to require 48 - // asyncContext enabled 49 - // https://nuxt.com/docs/guide/going-further/experimental-features#asynccontext 50 - opts.onRequest = [ 51 - async ({ options }) => { 52 - await setAuthParams({ 53 - auth: opts.auth, 54 - headers: options.headers, 55 - query: options.query, 56 - security, 57 - }); 58 - }, 59 - ...opts.onRequest, 60 - ]; 61 - } 62 - 63 - if (responseTransformer || responseValidator) { 64 - opts.onResponse = [ 65 - ...opts.onResponse, 66 - async ({ options, response }) => { 67 - if (options.responseType && options.responseType !== 'json') { 68 - return; 69 - } 70 - 71 - if (responseValidator) { 72 - await responseValidator(response._data); 73 - } 74 - 75 - if (responseTransformer) { 76 - response._data = await responseTransformer(response._data); 77 - } 78 - }, 79 - ]; 80 - } 81 - 82 - if (opts.body && opts.bodySerializer) { 83 - opts.body = opts.bodySerializer(unwrapRefs(opts.body)); 84 - } 85 - 86 - // remove Content-Type header if body is empty to avoid sending invalid requests 87 - if (!opts.body) { 88 - opts.headers.delete('Content-Type'); 89 - } 90 - 91 - const fetchFn = opts.$fetch; 92 - 93 - if (composable === '$fetch') { 94 - const url = buildUrl(opts); 95 - return fetchFn( 96 - url, 97 - // @ts-expect-error 98 - unwrapRefs(opts), 99 - ); 100 - } 101 - 102 - if (composable === 'useFetch') { 103 - const url = buildUrl(opts); 104 - return useFetch(url, opts); 105 - } 106 - 107 - if (composable === 'useLazyFetch') { 108 - const url = buildUrl(opts); 109 - return useLazyFetch(url, opts); 110 - } 111 - 112 - const handler: (ctx?: NuxtApp) => Promise<any> = () => { 113 - const url = buildUrl(opts); 114 - return fetchFn( 115 - url, 116 - // @ts-expect-error 117 - unwrapRefs(opts), 118 - ); 119 - }; 120 - 121 - if (composable === 'useAsyncData') { 122 - return key 123 - ? useAsyncData(key, handler, asyncDataOptions) 124 - : useAsyncData(handler, asyncDataOptions); 125 - } 126 - 127 - if (composable === 'useLazyAsyncData') { 128 - return key 129 - ? useLazyAsyncData(key, handler, asyncDataOptions) 130 - : useLazyAsyncData(handler, asyncDataOptions); 131 - } 132 - 133 - return undefined as any; 134 - }; 135 - 136 - return { 137 - buildUrl, 138 - connect: (options) => request({ ...options, method: 'CONNECT' }), 139 - delete: (options) => request({ ...options, method: 'DELETE' }), 140 - get: (options) => request({ ...options, method: 'GET' }), 141 - getConfig, 142 - head: (options) => request({ ...options, method: 'HEAD' }), 143 - options: (options) => request({ ...options, method: 'OPTIONS' }), 144 - patch: (options) => request({ ...options, method: 'PATCH' }), 145 - post: (options) => request({ ...options, method: 'POST' }), 146 - put: (options) => request({ ...options, method: 'PUT' }), 147 - request, 148 - setConfig, 149 - trace: (options) => request({ ...options, method: 'TRACE' }), 150 - }; 151 - }; 152 - 153 - export type { 154 - Auth, 155 - Client, 156 - Composable, 157 - Config, 158 - Options, 159 - OptionsLegacyParser, 160 - QuerySerializerOptions, 161 - RequestOptions, 162 - RequestResult, 163 - } from './types'; 164 - export { 165 - createConfig, 166 - formDataBodySerializer, 167 - jsonBodySerializer, 168 - urlSearchParamsBodySerializer, 169 - } from './utils';
-260
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-nuxt/bundle/client/types.ts
··· 1 - import type { 2 - AsyncDataOptions, 3 - useAsyncData, 4 - useFetch, 5 - UseFetchOptions, 6 - useLazyAsyncData, 7 - useLazyFetch, 8 - } from 'nuxt/app'; 9 - import type { Ref } from 'vue'; 10 - 11 - export type ArraySeparatorStyle = ArrayStyle | MatrixStyle; 12 - type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; 13 - type MatrixStyle = 'label' | 'matrix' | 'simple'; 14 - export type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; 15 - type ObjectStyle = 'form' | 'deepObject'; 16 - 17 - export type BodySerializer = (body: any) => any; 18 - 19 - export interface SerializerOptions<T> { 20 - /** 21 - * @default true 22 - */ 23 - explode: boolean; 24 - style: T; 25 - } 26 - 27 - export type QuerySerializer = ( 28 - query: Parameters<Client['buildUrl']>[0]['query'], 29 - ) => string; 30 - 31 - export interface QuerySerializerOptions { 32 - allowReserved?: boolean; 33 - array?: SerializerOptions<ArrayStyle>; 34 - object?: SerializerOptions<ObjectStyle>; 35 - } 36 - 37 - type OmitKeys<T, K> = Pick<T, Exclude<keyof T, K>>; 38 - 39 - type WithRefs<TData> = { 40 - [K in keyof TData]: NonNullable<TData[K]> extends object 41 - ? WithRefs<NonNullable<TData[K]>> | Ref<NonNullable<TData[K]>> 42 - : NonNullable<TData[K]> | Ref<NonNullable<TData[K]>>; 43 - }; 44 - 45 - export interface Config 46 - extends Omit< 47 - FetchOptions<unknown>, 48 - 'baseURL' | 'body' | 'headers' | 'method' | 'query' 49 - >, 50 - WithRefs<Pick<FetchOptions<unknown>, 'query'>> { 51 - /** 52 - * **This feature works only with the [experimental parser](https://heyapi.dev/openapi-ts/configuration#parser)** 53 - * 54 - * Auth token or a function returning auth token. The resolved value will be 55 - * added to the request payload as defined by its `security` array. 56 - */ 57 - auth?: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken; 58 - /** 59 - * Base URL for all requests made by this client. 60 - * 61 - * @default '' 62 - */ 63 - baseURL?: string; 64 - /** 65 - * A function for serializing request body parameter. By default, 66 - * {@link JSON.stringify()} will be used. 67 - */ 68 - bodySerializer?: BodySerializer | null; 69 - /** 70 - * An object containing any HTTP headers that you want to pre-populate your 71 - * `Headers` object with. 72 - * 73 - * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} 74 - */ 75 - headers?: 76 - | RequestInit['headers'] 77 - | Record< 78 - string, 79 - | string 80 - | number 81 - | boolean 82 - | (string | number | boolean)[] 83 - | null 84 - | undefined 85 - | unknown 86 - >; 87 - /** 88 - * The request method. 89 - * 90 - * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} 91 - */ 92 - method?: 93 - | 'CONNECT' 94 - | 'DELETE' 95 - | 'GET' 96 - | 'HEAD' 97 - | 'OPTIONS' 98 - | 'PATCH' 99 - | 'POST' 100 - | 'PUT' 101 - | 'TRACE'; 102 - /** 103 - * A function for serializing request query parameters. By default, arrays 104 - * will be exploded in form style, objects will be exploded in deepObject 105 - * style, and reserved characters are percent-encoded. 106 - * 107 - * {@link https://swagger.io/docs/specification/serialization/#query View examples} 108 - */ 109 - querySerializer?: QuerySerializer | QuerySerializerOptions; 110 - /** 111 - * A function transforming response data before it's returned. This is useful 112 - * for post-processing data, e.g. converting ISO strings into Date objects. 113 - */ 114 - responseTransformer?: (data: unknown) => Promise<unknown>; 115 - /** 116 - * **This feature works only with the [experimental parser](https://heyapi.dev/openapi-ts/configuration#parser)** 117 - * 118 - * A function validating response data. This is useful if you want to ensure 119 - * the response conforms to the desired shape, so it can be safely passed to 120 - * the transformers and returned to the user. 121 - */ 122 - responseValidator?: (data: unknown) => Promise<unknown>; 123 - } 124 - 125 - export interface Auth { 126 - in?: 'header' | 'query'; 127 - name?: string; 128 - scheme?: 'basic' | 'bearer'; 129 - type: 'apiKey' | 'http'; 130 - } 131 - 132 - type AuthToken = string | undefined; 133 - 134 - export interface RequestOptions< 135 - TComposable extends Composable = Composable, 136 - Url extends string = string, 137 - > extends Config, 138 - WithRefs<{ 139 - /** 140 - * Any body that you want to add to your request. 141 - * 142 - * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} 143 - */ 144 - body?: BodyInit | Record<string, any> | null; 145 - path?: FetchOptions<unknown>['query']; 146 - query?: FetchOptions<unknown>['query']; 147 - }> { 148 - asyncDataOptions?: AsyncDataOptions<unknown>; 149 - /** 150 - * You can provide a client instance returned by `createClient()` instead of 151 - * individual options. This might be also useful if you want to implement a 152 - * custom client. 153 - */ 154 - client?: Client; 155 - composable: TComposable; 156 - key?: string; 157 - /** 158 - * Security mechanism(s) to use for the request. 159 - */ 160 - security?: ReadonlyArray<Auth>; 161 - url: Url; 162 - } 163 - 164 - export type RequestResult< 165 - TComposable extends Composable, 166 - TData, 167 - TError, 168 - > = TComposable extends '$fetch' 169 - ? ReturnType<typeof $fetch<TData>> 170 - : TComposable extends 'useAsyncData' 171 - ? ReturnType<typeof useAsyncData<TData | null, TError>> 172 - : TComposable extends 'useFetch' 173 - ? ReturnType<typeof useFetch<TData | null, TError>> 174 - : TComposable extends 'useLazyAsyncData' 175 - ? ReturnType<typeof useLazyAsyncData<TData | null, TError>> 176 - : TComposable extends 'useLazyFetch' 177 - ? ReturnType<typeof useLazyFetch<TData | null, TError>> 178 - : never; 179 - 180 - type MethodFn = < 181 - TComposable extends Composable, 182 - TData = unknown, 183 - TError = unknown, 184 - >( 185 - options: Omit<RequestOptions<TComposable>, 'method'>, 186 - ) => RequestResult<TComposable, TData, TError>; 187 - 188 - type RequestFn = < 189 - TComposable extends Composable, 190 - TData = unknown, 191 - TError = unknown, 192 - >( 193 - options: Omit<RequestOptions<TComposable>, 'method'> & 194 - Pick<Required<RequestOptions<TComposable>>, 'method'>, 195 - ) => RequestResult<TComposable, TData, TError>; 196 - 197 - interface DataShape { 198 - body?: unknown; 199 - headers?: unknown; 200 - path?: FetchOptions<unknown>['query']; 201 - query?: FetchOptions<unknown>['query']; 202 - url: string; 203 - } 204 - 205 - export type BuildUrlOptions< 206 - TData extends Omit<DataShape, 'headers'> = Omit<DataShape, 'headers'>, 207 - > = Pick<WithRefs<TData>, 'path' | 'query'> & 208 - Pick<TData, 'url'> & 209 - Pick<Options<'$fetch', TData>, 'baseURL' | 'querySerializer'>; 210 - 211 - export interface Client { 212 - /** 213 - * Returns the final request URL. This method works only with experimental parser. 214 - */ 215 - buildUrl: <TData extends Omit<DataShape, 'headers'>>( 216 - options: BuildUrlOptions<TData>, 217 - ) => string; 218 - connect: MethodFn; 219 - delete: MethodFn; 220 - get: MethodFn; 221 - getConfig: () => Config; 222 - head: MethodFn; 223 - options: MethodFn; 224 - patch: MethodFn; 225 - post: MethodFn; 226 - put: MethodFn; 227 - request: RequestFn; 228 - setConfig: (config: Config) => Config; 229 - trace: MethodFn; 230 - } 231 - 232 - export type Options< 233 - TComposable extends Composable, 234 - TData extends DataShape = DataShape, 235 - > = OmitKeys<RequestOptions<TComposable>, 'body' | 'path' | 'query' | 'url'> & 236 - WithRefs<Omit<TData, 'url'>>; 237 - 238 - export type OptionsLegacyParser<TData = unknown> = TData extends { body?: any } 239 - ? TData extends { headers?: any } 240 - ? OmitKeys<RequestOptions, 'body' | 'headers' | 'url'> & TData 241 - : OmitKeys<RequestOptions, 'body' | 'url'> & 242 - TData & 243 - Pick<RequestOptions, 'headers'> 244 - : TData extends { headers?: any } 245 - ? OmitKeys<RequestOptions, 'headers' | 'url'> & 246 - TData & 247 - Pick<RequestOptions, 'body'> 248 - : OmitKeys<RequestOptions, 'url'> & TData; 249 - 250 - type FetchOptions<TData> = Omit< 251 - UseFetchOptions<TData, TData>, 252 - keyof AsyncDataOptions<TData> 253 - >; 254 - 255 - export type Composable = 256 - | '$fetch' 257 - | 'useAsyncData' 258 - | 'useFetch' 259 - | 'useLazyAsyncData' 260 - | 'useLazyFetch';
-586
packages/openapi-ts/test/__snapshots__/3.1.x/clients/@hey-api/client-nuxt/bundle/client/utils.ts
··· 1 - import type { ComputedRef, Ref } from 'vue'; 2 - import { isRef, toValue, unref } from 'vue'; 3 - 4 - import type { 5 - ArraySeparatorStyle, 6 - Auth, 7 - BuildUrlOptions, 8 - Client, 9 - Config, 10 - ObjectSeparatorStyle, 11 - QuerySerializer, 12 - QuerySerializerOptions, 13 - RequestOptions, 14 - SerializerOptions, 15 - } from './types'; 16 - 17 - type PathSerializer = Pick<Required<BuildUrlOptions>, 'path' | 'url'>; 18 - 19 - const PATH_PARAM_RE = /\{[^{}]+\}/g; 20 - 21 - type MaybeArray<T> = T | T[]; 22 - 23 - interface SerializeOptions<T> 24 - extends SerializePrimitiveOptions, 25 - SerializerOptions<T> {} 26 - interface SerializePrimitiveOptions { 27 - allowReserved?: boolean; 28 - name: string; 29 - } 30 - interface SerializePrimitiveParam extends SerializePrimitiveOptions { 31 - value: string; 32 - } 33 - 34 - const serializePrimitiveParam = ({ 35 - allowReserved, 36 - name, 37 - value, 38 - }: SerializePrimitiveParam) => { 39 - if (value === undefined || value === null) { 40 - return ''; 41 - } 42 - 43 - if (typeof value === 'object') { 44 - throw new Error( 45 - 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', 46 - ); 47 - } 48 - 49 - return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; 50 - }; 51 - 52 - const separatorArrayExplode = (style: ArraySeparatorStyle) => { 53 - switch (style) { 54 - case 'label': 55 - return '.'; 56 - case 'matrix': 57 - return ';'; 58 - case 'simple': 59 - return ','; 60 - default: 61 - return '&'; 62 - } 63 - }; 64 - 65 - const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { 66 - switch (style) { 67 - case 'form': 68 - return ','; 69 - case 'pipeDelimited': 70 - return '|'; 71 - case 'spaceDelimited': 72 - return '%20'; 73 - default: 74 - return ','; 75 - } 76 - }; 77 - 78 - const separatorObjectExplode = (style: ObjectSeparatorStyle) => { 79 - switch (style) { 80 - case 'label': 81 - return '.'; 82 - case 'matrix': 83 - return ';'; 84 - case 'simple': 85 - return ','; 86 - default: 87 - return '&'; 88 - } 89 - }; 90 - 91 - const serializeArrayParam = ({ 92 - allowReserved, 93 - explode, 94 - name, 95 - style, 96 - value, 97 - }: SerializeOptions<ArraySeparatorStyle> & { 98 - value: unknown[]; 99 - }) => { 100 - if (!explode) { 101 - const joinedValues = ( 102 - allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) 103 - ).join(separatorArrayNoExplode(style)); 104 - switch (style) { 105 - case 'label': 106 - return `.${joinedValues}`; 107 - case 'matrix': 108 - return `;${name}=${joinedValues}`; 109 - case 'simple': 110 - return joinedValues; 111 - default: 112 - return `${name}=${joinedValues}`; 113 - } 114 - } 115 - 116 - const separator = separatorArrayExplode(style); 117 - const joinedValues = value 118 - .map((v) => { 119 - if (style === 'label' || style === 'simple') { 120 - return allowReserved ? v : encodeURIComponent(v as string); 121 - } 122 - 123 - return serializePrimitiveParam({ 124 - allowReserved, 125 - name, 126 - value: v as string, 127 - }); 128 - }) 129 - .join(separator); 130 - return style === 'label' || style === 'matrix' 131 - ? separator + joinedValues 132 - : joinedValues; 133 - }; 134 - 135 - const serializeObjectParam = ({ 136 - allowReserved, 137 - explode, 138 - name, 139 - style, 140 - value, 141 - }: SerializeOptions<ObjectSeparatorStyle> & { 142 - value: Record<string, unknown> | Date; 143 - }) => { 144 - if (value instanceof Date) { 145 - return `${name}=${value.toISOString()}`; 146 - } 147 - 148 - if (style !== 'deepObject' && !explode) { 149 - let values: string[] = []; 150 - Object.entries(value).forEach(([key, v]) => { 151 - values = [ 152 - ...values, 153 - key, 154 - allowReserved ? (v as string) : encodeURIComponent(v as string), 155 - ]; 156 - }); 157 - const joinedValues = values.join(','); 158 - switch (style) { 159 - case 'form': 160 - return `${name}=${joinedValues}`; 161 - case 'label': 162 - return `.${joinedValues}`; 163 - case 'matrix': 164 - return `;${name}=${joinedValues}`; 165 - default: 166 - return joinedValues; 167 - } 168 - } 169 - 170 - const separator = separatorObjectExplode(style); 171 - const joinedValues = Object.entries(value) 172 - .map(([key, v]) => 173 - serializePrimitiveParam({ 174 - allowReserved, 175 - name: style === 'deepObject' ? `${name}[${key}]` : key, 176 - value: v as string, 177 - }), 178 - ) 179 - .join(separator); 180 - return style === 'label' || style === 'matrix' 181 - ? separator + joinedValues 182 - : joinedValues; 183 - }; 184 - 185 - const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { 186 - let url = _url; 187 - const matches = _url.match(PATH_PARAM_RE); 188 - if (matches) { 189 - for (const match of matches) { 190 - let explode = false; 191 - let name = match.substring(1, match.length - 1); 192 - let style: ArraySeparatorStyle = 'simple'; 193 - 194 - if (name.endsWith('*')) { 195 - explode = true; 196 - name = name.substring(0, name.length - 1); 197 - } 198 - 199 - if (name.startsWith('.')) { 200 - name = name.substring(1); 201 - style = 'label'; 202 - } else if (name.startsWith(';')) { 203 - name = name.substring(1); 204 - style = 'matrix'; 205 - } 206 - 207 - const value = toValue(toValue(path)[name]); 208 - 209 - if (value === undefined || value === null) { 210 - continue; 211 - } 212 - 213 - if (Array.isArray(value)) { 214 - url = url.replace( 215 - match, 216 - serializeArrayParam({ explode, name, style, value }), 217 - ); 218 - continue; 219 - } 220 - 221 - if (typeof value === 'object') { 222 - url = url.replace( 223 - match, 224 - serializeObjectParam({ 225 - explode, 226 - name, 227 - style, 228 - value: value as Record<string, unknown>, 229 - }), 230 - ); 231 - continue; 232 - } 233 - 234 - if (style === 'matrix') { 235 - url = url.replace( 236 - match, 237 - `;${serializePrimitiveParam({ 238 - name, 239 - value: value as string, 240 - })}`, 241 - ); 242 - continue; 243 - } 244 - 245 - const replaceValue = encodeURIComponent( 246 - style === 'label' ? `.${value as string}` : (value as string), 247 - ); 248 - url = url.replace(match, replaceValue); 249 - } 250 - } 251 - return url; 252 - }; 253 - 254 - export const createQuerySerializer = <T = unknown>({ 255 - allowReserved, 256 - array, 257 - object, 258 - }: QuerySerializerOptions = {}) => { 259 - const querySerializer = (queryParams: T) => { 260 - let search: string[] = []; 261 - const qParams = toValue(queryParams); 262 - if (qParams && typeof qParams === 'object') { 263 - for (const name in qParams) { 264 - const value = toValue(qParams[name]); 265 - 266 - if (value === undefined || value === null) { 267 - continue; 268 - } 269 - 270 - if (Array.isArray(value)) { 271 - search = [ 272 - ...search, 273 - serializeArrayParam({ 274 - allowReserved, 275 - explode: true, 276 - name, 277 - style: 'form', 278 - value, 279 - ...array, 280 - }), 281 - ]; 282 - continue; 283 - } 284 - 285 - if (typeof value === 'object') { 286 - search = [ 287 - ...search, 288 - serializeObjectParam({ 289 - allowReserved, 290 - explode: true, 291 - name, 292 - style: 'deepObject', 293 - value: value as Record<string, unknown>, 294 - ...object, 295 - }), 296 - ]; 297 - continue; 298 - } 299 - 300 - search = [ 301 - ...search, 302 - serializePrimitiveParam({ 303 - allowReserved, 304 - name, 305 - value: value as string, 306 - }), 307 - ]; 308 - } 309 - } 310 - return search.join('&'); 311 - }; 312 - return querySerializer; 313 - }; 314 - 315 - export const getAuthToken = async ( 316 - auth: Auth, 317 - callback: RequestOptions['auth'], 318 - ): Promise<string | undefined> => { 319 - const token = 320 - typeof callback === 'function' ? await callback(auth) : callback; 321 - 322 - if (!token) { 323 - return; 324 - } 325 - 326 - if (auth.scheme === 'bearer') { 327 - return `Bearer ${token}`; 328 - } 329 - 330 - if (auth.scheme === 'basic') { 331 - return `Basic ${btoa(token)}`; 332 - } 333 - 334 - return token; 335 - }; 336 - 337 - export const setAuthParams = async ({ 338 - security, 339 - ...options 340 - }: Pick<Required<RequestOptions>, 'security'> & 341 - Pick<RequestOptions, 'auth' | 'query'> & { 342 - headers: Headers; 343 - }) => { 344 - for (const auth of security) { 345 - const token = await getAuthToken(auth, options.auth); 346 - 347 - if (!token) { 348 - continue; 349 - } 350 - 351 - const name = auth.name ?? 'Authorization'; 352 - 353 - switch (auth.in) { 354 - case 'query': 355 - if (!options.query) { 356 - options.query = {}; 357 - } 358 - toValue(options.query)[name] = token; 359 - break; 360 - case 'header': 361 - default: 362 - options.headers.set(name, token); 363 - break; 364 - } 365 - 366 - return; 367 - } 368 - }; 369 - 370 - export const buildUrl: Client['buildUrl'] = (options) => { 371 - const url = getUrl({ 372 - baseUrl: options.baseURL ?? '', 373 - path: options.path, 374 - query: options.query, 375 - querySerializer: 376 - typeof options.querySerializer === 'function' 377 - ? options.querySerializer 378 - : createQuerySerializer(options.querySerializer), 379 - url: options.url, 380 - }); 381 - return url; 382 - }; 383 - 384 - export const getUrl = ({ 385 - baseUrl, 386 - path, 387 - query, 388 - querySerializer, 389 - url: _url, 390 - }: Pick<BuildUrlOptions, 'path' | 'query' | 'url'> & { 391 - baseUrl: string; 392 - querySerializer: QuerySerializer; 393 - }) => { 394 - const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; 395 - let url = baseUrl + pathUrl; 396 - if (path) { 397 - url = defaultPathSerializer({ path, url }); 398 - } 399 - let search = query ? querySerializer(query) : ''; 400 - if (search.startsWith('?')) { 401 - search = search.substring(1); 402 - } 403 - if (search) { 404 - url += `?${search}`; 405 - } 406 - return url; 407 - }; 408 - 409 - export const mergeConfigs = (a: Config, b: Config): Config => { 410 - const config = { ...a, ...b }; 411 - if (config.baseURL?.endsWith('/')) { 412 - config.baseURL = config.baseURL.substring(0, config.baseURL.length - 1); 413 - } 414 - config.headers = mergeHeaders(a.headers, b.headers); 415 - return config; 416 - }; 417 - 418 - export const mergeHeaders = ( 419 - ...headers: Array<Required<Config>['headers'] | undefined> 420 - ): Headers => { 421 - const mergedHeaders = new Headers(); 422 - for (const header of headers) { 423 - if (!header || typeof header !== 'object') { 424 - continue; 425 - } 426 - 427 - let h: unknown = header; 428 - if (isRef(h)) { 429 - h = unref(h); 430 - } 431 - 432 - const iterator = 433 - h instanceof Headers 434 - ? h.entries() 435 - : Object.entries(h as Record<string, unknown>); 436 - 437 - for (const [key, value] of iterator) { 438 - if (value === null) { 439 - mergedHeaders.delete(key); 440 - } else if (Array.isArray(value)) { 441 - for (const v of value) { 442 - mergedHeaders.append(key, unwrapRefs(v) as string); 443 - } 444 - } else if (value !== undefined) { 445 - const v = unwrapRefs(value); 446 - // assume object headers are meant to be JSON stringified, i.e. their 447 - // content value in OpenAPI specification is 'application/json' 448 - mergedHeaders.set( 449 - key, 450 - typeof v === 'object' ? JSON.stringify(v) : (v as string), 451 - ); 452 - } 453 - } 454 - } 455 - return mergedHeaders; 456 - }; 457 - 458 - export const mergeInterceptors = <T>(...args: Array<MaybeArray<T>>): Array<T> => 459 - args.reduce<Array<T>>((acc, item) => { 460 - if (typeof item === 'function') { 461 - acc.push(item); 462 - } else if (Array.isArray(item)) { 463 - return acc.concat(item); 464 - } 465 - return acc; 466 - }, []); 467 - 468 - const serializeFormDataPair = (data: FormData, key: string, value: unknown) => { 469 - if (typeof value === 'string' || value instanceof Blob) { 470 - data.append(key, value); 471 - } else { 472 - data.append(key, JSON.stringify(value)); 473 - } 474 - }; 475 - 476 - export const formDataBodySerializer = { 477 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 478 - body: T, 479 - ) => { 480 - const data = new FormData(); 481 - 482 - Object.entries(body).forEach(([key, value]) => { 483 - if (value === undefined || value === null) { 484 - return; 485 - } 486 - if (Array.isArray(value)) { 487 - value.forEach((v) => serializeFormDataPair(data, key, v)); 488 - } else { 489 - serializeFormDataPair(data, key, value); 490 - } 491 - }); 492 - 493 - return data; 494 - }, 495 - }; 496 - 497 - export const jsonBodySerializer = { 498 - bodySerializer: <T>(body: T) => JSON.stringify(body), 499 - }; 500 - 501 - const serializeUrlSearchParamsPair = ( 502 - data: URLSearchParams, 503 - key: string, 504 - value: unknown, 505 - ) => { 506 - if (typeof value === 'string') { 507 - data.append(key, value); 508 - } else { 509 - data.append(key, JSON.stringify(value)); 510 - } 511 - }; 512 - 513 - export const urlSearchParamsBodySerializer = { 514 - bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>( 515 - body: T, 516 - ) => { 517 - const data = new URLSearchParams(); 518 - 519 - Object.entries(body).forEach(([key, value]) => { 520 - if (value === undefined || value === null) { 521 - return; 522 - } 523 - if (Array.isArray(value)) { 524 - value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); 525 - } else { 526 - serializeUrlSearchParamsPair(data, key, value); 527 - } 528 - }); 529 - 530 - return data; 531 - }, 532 - }; 533 - 534 - const defaultQuerySerializer = createQuerySerializer({ 535 - allowReserved: false, 536 - array: { 537 - explode: true, 538 - style: 'form', 539 - }, 540 - object: { 541 - explode: true, 542 - style: 'deepObject', 543 - }, 544 - }); 545 - 546 - const defaultHeaders = { 547 - 'Content-Type': 'application/json', 548 - }; 549 - 550 - export const createConfig = (override: Config = {}): Config => ({ 551 - ...jsonBodySerializer, 552 - baseURL: '', 553 - headers: defaultHeaders, 554 - querySerializer: defaultQuerySerializer, 555 - ...override, 556 - }); 557 - 558 - type UnwrapRefs<T> = 559 - T extends Ref<infer V> 560 - ? V 561 - : T extends ComputedRef<infer V> 562 - ? V 563 - : T extends Record<string, unknown> // this doesn't handle functions well 564 - ? { [K in keyof T]: UnwrapRefs<T[K]> } 565 - : T; 566 - 567 - export const unwrapRefs = <T>(value: T): UnwrapRefs<T> => { 568 - if (value === null || typeof value !== 'object' || value instanceof Headers) { 569 - return (isRef(value) ? unref(value) : value) as UnwrapRefs<T>; 570 - } 571 - 572 - if (Array.isArray(value)) { 573 - return value.map((item) => unwrapRefs(item)) as UnwrapRefs<T>; 574 - } 575 - 576 - if (isRef(value)) { 577 - return unwrapRefs(unref(value) as T); 578 - } 579 - 580 - // unwrap into new object to avoid modifying the source 581 - const result: Record<string, unknown> = {}; 582 - for (const key in value) { 583 - result[key] = unwrapRefs(value[key] as T); 584 - } 585 - return result as UnwrapRefs<T>; 586 - };
+2 -2
packages/openapi-ts/test/openapi-ts.config.ts
··· 2 2 3 3 export default defineConfig({ 4 4 client: { 5 - // bundle: true, 5 + bundle: true, 6 6 name: '@hey-api/client-fetch', 7 7 // name: 'legacy/xhr', 8 8 }, ··· 11 11 // exclude: '^#/components/schemas/ModelWithCircularReference$', 12 12 // include: 13 13 // '^(#/components/schemas/import|#/paths/api/v{api-version}/simple/options)$', 14 - path: './packages/openapi-ts/test/spec/2.0.x/body-response-text-plain.yaml', 14 + path: './packages/openapi-ts/test/spec/3.1.x/body-nested-array.yaml', 15 15 // path: './test/spec/v3-transforms.json', 16 16 // path: 'https://mongodb-mms-prod-build-server.s3.amazonaws.com/openapi/2caffd88277a4e27c95dcefc7e3b6a63a3b03297-v2-2023-11-15.json', 17 17 // path: 'https://raw.githubusercontent.com/swagger-api/swagger-petstore/master/src/main/resources/openapi.yaml',
+25
packages/openapi-ts/test/spec/3.1.x/body-nested-array.yaml
··· 1 + openapi: 3.1.1 2 + info: 3 + title: OpenAPI 3.1.1 body nested array example 4 + version: 1 5 + paths: 6 + /foo: 7 + post: 8 + requestBody: 9 + content: 10 + 'multipart/form-data': 11 + schema: 12 + properties: 13 + foo: 14 + items: 15 + items: 16 + type: integer 17 + type: array 18 + type: array 19 + required: 20 + - foo 21 + type: object 22 + required: true 23 + responses: 24 + '200': 25 + description: OK
+315 -224
pnpm-lock.yaml
··· 59 59 prettier: 60 60 specifier: 3.4.2 61 61 version: 3.4.2 62 + rollup: 63 + specifier: 4.31.0 64 + version: 4.31.0 65 + rollup-plugin-dts: 66 + specifier: 6.1.1 67 + version: 6.1.1(rollup@4.31.0)(typescript@5.5.3) 62 68 tsup: 63 69 specifier: 8.3.5 64 70 version: 8.3.5(jiti@2.4.2)(postcss@8.4.49)(typescript@5.5.3)(yaml@2.7.0) ··· 260 266 version: link:../../packages/client-nuxt 261 267 nuxt: 262 268 specifier: 3.15.1 263 - version: 3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(yaml@2.7.0) 269 + version: 3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(yaml@2.7.0) 264 270 vue: 265 271 specifier: 3.5.13 266 272 version: 3.5.13(typescript@5.6.1-rc) ··· 392 398 devDependencies: 393 399 '@angular-devkit/build-angular': 394 400 specifier: ^19.0.6 395 - version: 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 401 + version: 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 396 402 '@angular/cli': 397 403 specifier: ^19.0.6 398 404 version: 19.0.6(@types/node@22.10.5)(chokidar@4.0.3) ··· 653 659 version: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0) 654 660 vite-plugin-vue-devtools: 655 661 specifier: 7.7.0 656 - version: 7.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 662 + version: 7.7.0(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 657 663 vitest: 658 664 specifier: 1.6.0 659 665 version: 1.6.0(@types/node@22.10.5)(jsdom@23.0.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) ··· 663 669 664 670 packages/client-axios: 665 671 devDependencies: 672 + '@hey-api/client-core': 673 + specifier: workspace:* 674 + version: link:../client-core 666 675 axios: 667 676 specifier: 1.7.9 668 677 version: 1.7.9 669 678 670 679 packages/client-core: {} 671 680 672 - packages/client-fetch: {} 681 + packages/client-fetch: 682 + devDependencies: 683 + '@hey-api/client-core': 684 + specifier: workspace:* 685 + version: link:../client-core 673 686 674 687 packages/client-nuxt: 675 688 dependencies: 676 689 nuxt: 677 690 specifier: '>= 3.0.0 < 4' 678 - version: 3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(yaml@2.7.0) 691 + version: 3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(yaml@2.7.0) 679 692 vue: 680 693 specifier: '>= 3.5.13 < 4' 681 694 version: 3.5.13(typescript@5.6.1-rc) 682 695 devDependencies: 696 + '@hey-api/client-core': 697 + specifier: workspace:* 698 + version: link:../client-core 683 699 '@nuxt/test-utils': 684 700 specifier: 3.15.1 685 - version: 3.15.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 701 + version: 3.15.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 686 702 687 703 packages/openapi-ts: 688 704 dependencies: ··· 701 717 devDependencies: 702 718 '@angular-devkit/build-angular': 703 719 specifier: 19.0.6 704 - version: 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 720 + version: 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 705 721 '@angular/animations': 706 722 specifier: 19.0.5 707 723 version: 19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)) ··· 785 801 version: 3.3.2 786 802 nuxt: 787 803 specifier: 3.15.1 788 - version: 3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(yaml@2.7.0) 804 + version: 3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(yaml@2.7.0) 789 805 prettier: 790 806 specifier: 3.4.2 791 807 version: 3.4.2 ··· 3684 3700 cpu: [arm] 3685 3701 os: [android] 3686 3702 3687 - '@rollup/rollup-android-arm-eabi@4.30.1': 3688 - resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} 3703 + '@rollup/rollup-android-arm-eabi@4.31.0': 3704 + resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==} 3689 3705 cpu: [arm] 3690 3706 os: [android] 3691 3707 ··· 3694 3710 cpu: [arm64] 3695 3711 os: [android] 3696 3712 3697 - '@rollup/rollup-android-arm64@4.30.1': 3698 - resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} 3713 + '@rollup/rollup-android-arm64@4.31.0': 3714 + resolution: {integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==} 3699 3715 cpu: [arm64] 3700 3716 os: [android] 3701 3717 ··· 3704 3720 cpu: [arm64] 3705 3721 os: [darwin] 3706 3722 3707 - '@rollup/rollup-darwin-arm64@4.30.1': 3708 - resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} 3723 + '@rollup/rollup-darwin-arm64@4.31.0': 3724 + resolution: {integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==} 3709 3725 cpu: [arm64] 3710 3726 os: [darwin] 3711 3727 ··· 3714 3730 cpu: [x64] 3715 3731 os: [darwin] 3716 3732 3717 - '@rollup/rollup-darwin-x64@4.30.1': 3718 - resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} 3733 + '@rollup/rollup-darwin-x64@4.31.0': 3734 + resolution: {integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==} 3719 3735 cpu: [x64] 3720 3736 os: [darwin] 3721 3737 ··· 3724 3740 cpu: [arm64] 3725 3741 os: [freebsd] 3726 3742 3727 - '@rollup/rollup-freebsd-arm64@4.30.1': 3728 - resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} 3743 + '@rollup/rollup-freebsd-arm64@4.31.0': 3744 + resolution: {integrity: sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==} 3729 3745 cpu: [arm64] 3730 3746 os: [freebsd] 3731 3747 ··· 3734 3750 cpu: [x64] 3735 3751 os: [freebsd] 3736 3752 3737 - '@rollup/rollup-freebsd-x64@4.30.1': 3738 - resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} 3753 + '@rollup/rollup-freebsd-x64@4.31.0': 3754 + resolution: {integrity: sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==} 3739 3755 cpu: [x64] 3740 3756 os: [freebsd] 3741 3757 ··· 3744 3760 cpu: [arm] 3745 3761 os: [linux] 3746 3762 3747 - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': 3748 - resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} 3763 + '@rollup/rollup-linux-arm-gnueabihf@4.31.0': 3764 + resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==} 3749 3765 cpu: [arm] 3750 3766 os: [linux] 3751 3767 ··· 3754 3770 cpu: [arm] 3755 3771 os: [linux] 3756 3772 3757 - '@rollup/rollup-linux-arm-musleabihf@4.30.1': 3758 - resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} 3773 + '@rollup/rollup-linux-arm-musleabihf@4.31.0': 3774 + resolution: {integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==} 3759 3775 cpu: [arm] 3760 3776 os: [linux] 3761 3777 ··· 3764 3780 cpu: [arm64] 3765 3781 os: [linux] 3766 3782 3767 - '@rollup/rollup-linux-arm64-gnu@4.30.1': 3768 - resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} 3783 + '@rollup/rollup-linux-arm64-gnu@4.31.0': 3784 + resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==} 3769 3785 cpu: [arm64] 3770 3786 os: [linux] 3771 3787 ··· 3774 3790 cpu: [arm64] 3775 3791 os: [linux] 3776 3792 3777 - '@rollup/rollup-linux-arm64-musl@4.30.1': 3778 - resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} 3793 + '@rollup/rollup-linux-arm64-musl@4.31.0': 3794 + resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==} 3779 3795 cpu: [arm64] 3780 3796 os: [linux] 3781 3797 3782 - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': 3783 - resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} 3798 + '@rollup/rollup-linux-loongarch64-gnu@4.31.0': 3799 + resolution: {integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==} 3784 3800 cpu: [loong64] 3785 3801 os: [linux] 3786 3802 ··· 3789 3805 cpu: [ppc64] 3790 3806 os: [linux] 3791 3807 3792 - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': 3793 - resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} 3808 + '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': 3809 + resolution: {integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==} 3794 3810 cpu: [ppc64] 3795 3811 os: [linux] 3796 3812 ··· 3799 3815 cpu: [riscv64] 3800 3816 os: [linux] 3801 3817 3802 - '@rollup/rollup-linux-riscv64-gnu@4.30.1': 3803 - resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} 3818 + '@rollup/rollup-linux-riscv64-gnu@4.31.0': 3819 + resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==} 3804 3820 cpu: [riscv64] 3805 3821 os: [linux] 3806 3822 ··· 3809 3825 cpu: [s390x] 3810 3826 os: [linux] 3811 3827 3812 - '@rollup/rollup-linux-s390x-gnu@4.30.1': 3813 - resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} 3828 + '@rollup/rollup-linux-s390x-gnu@4.31.0': 3829 + resolution: {integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==} 3814 3830 cpu: [s390x] 3815 3831 os: [linux] 3816 3832 ··· 3819 3835 cpu: [x64] 3820 3836 os: [linux] 3821 3837 3822 - '@rollup/rollup-linux-x64-gnu@4.30.1': 3823 - resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} 3838 + '@rollup/rollup-linux-x64-gnu@4.31.0': 3839 + resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==} 3824 3840 cpu: [x64] 3825 3841 os: [linux] 3826 3842 ··· 3829 3845 cpu: [x64] 3830 3846 os: [linux] 3831 3847 3832 - '@rollup/rollup-linux-x64-musl@4.30.1': 3833 - resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} 3848 + '@rollup/rollup-linux-x64-musl@4.31.0': 3849 + resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==} 3834 3850 cpu: [x64] 3835 3851 os: [linux] 3836 3852 ··· 3839 3855 cpu: [arm64] 3840 3856 os: [win32] 3841 3857 3842 - '@rollup/rollup-win32-arm64-msvc@4.30.1': 3843 - resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} 3858 + '@rollup/rollup-win32-arm64-msvc@4.31.0': 3859 + resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==} 3844 3860 cpu: [arm64] 3845 3861 os: [win32] 3846 3862 ··· 3849 3865 cpu: [ia32] 3850 3866 os: [win32] 3851 3867 3852 - '@rollup/rollup-win32-ia32-msvc@4.30.1': 3853 - resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} 3868 + '@rollup/rollup-win32-ia32-msvc@4.31.0': 3869 + resolution: {integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==} 3854 3870 cpu: [ia32] 3855 3871 os: [win32] 3856 3872 ··· 3859 3875 cpu: [x64] 3860 3876 os: [win32] 3861 3877 3862 - '@rollup/rollup-win32-x64-msvc@4.30.1': 3863 - resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} 3878 + '@rollup/rollup-win32-x64-msvc@4.31.0': 3879 + resolution: {integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==} 3864 3880 cpu: [x64] 3865 3881 os: [win32] 3866 3882 ··· 8698 8714 resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} 8699 8715 hasBin: true 8700 8716 8717 + rollup-plugin-dts@6.1.1: 8718 + resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} 8719 + engines: {node: '>=16'} 8720 + peerDependencies: 8721 + rollup: ^3.29.4 || ^4 8722 + typescript: ^4.5 || ^5.0 8723 + 8701 8724 rollup-plugin-visualizer@5.14.0: 8702 8725 resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} 8703 8726 engines: {node: '>=18'} ··· 8716 8739 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 8717 8740 hasBin: true 8718 8741 8719 - rollup@4.30.1: 8720 - resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} 8742 + rollup@4.31.0: 8743 + resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==} 8721 8744 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 8722 8745 hasBin: true 8723 8746 ··· 12677 12700 12678 12701 '@nuxt/devalue@2.0.2': {} 12679 12702 12680 - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))': 12703 + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))': 12704 + dependencies: 12705 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 12706 + '@nuxt/schema': 3.15.1 12707 + execa: 7.2.0 12708 + vite: 5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 12709 + transitivePeerDependencies: 12710 + - magicast 12711 + - rollup 12712 + - supports-color 12713 + 12714 + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))': 12681 12715 dependencies: 12682 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 12716 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 12683 12717 '@nuxt/schema': 3.15.1 12684 12718 execa: 7.2.0 12685 12719 vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0) ··· 12701 12735 rc9: 2.1.2 12702 12736 semver: 7.6.3 12703 12737 12704 - '@nuxt/devtools@1.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3))': 12738 + '@nuxt/devtools@1.7.0(rollup@4.31.0)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3))': 12705 12739 dependencies: 12706 12740 '@antfu/utils': 0.7.10 12707 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12741 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 12708 12742 '@nuxt/devtools-wizard': 1.7.0 12709 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 12710 - '@vue/devtools-core': 7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 12743 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 12744 + '@vue/devtools-core': 7.6.8(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3)) 12711 12745 '@vue/devtools-kit': 7.6.8 12712 12746 birpc: 0.2.19 12713 12747 consola: 3.3.3 ··· 12735 12769 simple-git: 3.27.0 12736 12770 sirv: 3.0.0 12737 12771 tinyglobby: 0.2.10 12738 - unimport: 3.14.5(rollup@4.30.1) 12739 - vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0) 12740 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12741 - vite-plugin-vue-inspector: 5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12772 + unimport: 3.14.5(rollup@4.31.0) 12773 + vite: 5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 12774 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 12775 + vite-plugin-vue-inspector: 5.3.1(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 12742 12776 which: 3.0.1 12743 12777 ws: 8.18.0 12744 12778 transitivePeerDependencies: ··· 12748 12782 - utf-8-validate 12749 12783 - vue 12750 12784 12751 - '@nuxt/devtools@1.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.1-rc))': 12785 + '@nuxt/devtools@1.7.0(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.1-rc))': 12752 12786 dependencies: 12753 12787 '@antfu/utils': 0.7.10 12754 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12788 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12755 12789 '@nuxt/devtools-wizard': 1.7.0 12756 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 12790 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 12757 12791 '@vue/devtools-core': 7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.1-rc)) 12758 12792 '@vue/devtools-kit': 7.6.8 12759 12793 birpc: 0.2.19 ··· 12782 12816 simple-git: 3.27.0 12783 12817 sirv: 3.0.0 12784 12818 tinyglobby: 0.2.10 12785 - unimport: 3.14.5(rollup@4.30.1) 12819 + unimport: 3.14.5(rollup@4.31.0) 12786 12820 vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0) 12787 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12821 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12788 12822 vite-plugin-vue-inspector: 5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12789 12823 which: 3.0.1 12790 12824 ws: 8.18.0 ··· 12795 12829 - utf-8-validate 12796 12830 - vue 12797 12831 12798 - '@nuxt/devtools@1.7.0(rollup@4.30.1)(vue@3.5.13(typescript@5.6.1-rc))': 12832 + '@nuxt/devtools@1.7.0(rollup@4.31.0)(vue@3.5.13(typescript@5.6.1-rc))': 12799 12833 dependencies: 12800 12834 '@antfu/utils': 0.7.10 12801 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12835 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 12802 12836 '@nuxt/devtools-wizard': 1.7.0 12803 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 12804 - '@vue/devtools-core': 7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.1-rc)) 12837 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 12838 + '@vue/devtools-core': 7.6.8(vue@3.5.13(typescript@5.6.1-rc)) 12805 12839 '@vue/devtools-kit': 7.6.8 12806 12840 birpc: 0.2.19 12807 12841 consola: 3.3.3 ··· 12829 12863 simple-git: 3.27.0 12830 12864 sirv: 3.0.0 12831 12865 tinyglobby: 0.2.10 12832 - unimport: 3.14.5(rollup@4.30.1) 12833 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12834 - vite-plugin-vue-inspector: 5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 12866 + unimport: 3.14.5(rollup@4.31.0) 12867 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 12868 + vite-plugin-vue-inspector: 5.3.1(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 12835 12869 which: 3.0.1 12836 12870 ws: 8.18.0 12837 12871 transitivePeerDependencies: ··· 12841 12875 - utf-8-validate 12842 12876 - vue 12843 12877 12844 - '@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1)': 12878 + '@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.31.0)': 12845 12879 dependencies: 12846 12880 '@nuxt/schema': 3.15.1 12847 12881 c12: 2.0.1(magicast@0.3.5) ··· 12861 12895 semver: 7.6.3 12862 12896 ufo: 1.5.4 12863 12897 unctx: 2.4.1 12864 - unimport: 3.14.5(rollup@4.30.1) 12898 + unimport: 3.14.5(rollup@4.31.0) 12865 12899 untyped: 1.5.2 12866 12900 transitivePeerDependencies: 12867 12901 - magicast ··· 12875 12909 pathe: 2.0.1 12876 12910 std-env: 3.8.0 12877 12911 12878 - '@nuxt/telemetry@2.6.4(magicast@0.3.5)(rollup@4.30.1)': 12912 + '@nuxt/telemetry@2.6.4(magicast@0.3.5)(rollup@4.31.0)': 12879 12913 dependencies: 12880 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 12914 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 12881 12915 citty: 0.1.6 12882 12916 consola: 3.3.3 12883 12917 destr: 2.0.3 ··· 12895 12929 - rollup 12896 12930 - supports-color 12897 12931 12898 - '@nuxt/test-utils@3.15.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))': 12932 + '@nuxt/test-utils@3.15.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))': 12899 12933 dependencies: 12900 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 12934 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 12901 12935 '@nuxt/schema': 3.15.1 12902 12936 c12: 2.0.1(magicast@0.3.5) 12903 12937 consola: 3.3.3 ··· 12921 12955 unenv: 1.10.0 12922 12956 unplugin: 2.1.2 12923 12957 vite: 5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 12924 - vitest-environment-nuxt: 1.0.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 12958 + vitest-environment-nuxt: 1.0.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 12925 12959 vue: 3.5.13(typescript@5.6.1-rc) 12926 12960 optionalDependencies: 12927 12961 '@vue/test-utils': 2.4.6 ··· 12941 12975 - terser 12942 12976 - typescript 12943 12977 12944 - '@nuxt/vite-builder@3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vue@3.5.13(typescript@5.5.3))(yaml@2.7.0)': 12978 + '@nuxt/vite-builder@3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vue@3.5.13(typescript@5.5.3))(yaml@2.7.0)': 12945 12979 dependencies: 12946 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 12947 - '@rollup/plugin-replace': 6.0.2(rollup@4.30.1) 12980 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 12981 + '@rollup/plugin-replace': 6.0.2(rollup@4.31.0) 12948 12982 '@vitejs/plugin-vue': 5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 12949 12983 '@vitejs/plugin-vue-jsx': 4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 12950 12984 autoprefixer: 10.4.20(postcss@8.4.49) ··· 12965 12999 perfect-debounce: 1.0.0 12966 13000 pkg-types: 1.3.0 12967 13001 postcss: 8.4.49 12968 - rollup-plugin-visualizer: 5.14.0(rollup@4.30.1) 13002 + rollup-plugin-visualizer: 5.14.0(rollup@4.31.0) 12969 13003 std-env: 3.8.0 12970 13004 ufo: 1.5.4 12971 13005 unenv: 1.10.0 ··· 13000 13034 - vue-tsc 13001 13035 - yaml 13002 13036 13003 - '@nuxt/vite-builder@3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vue@3.5.13(typescript@5.6.1-rc))(yaml@2.7.0)': 13037 + '@nuxt/vite-builder@3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vue@3.5.13(typescript@5.6.1-rc))(yaml@2.7.0)': 13004 13038 dependencies: 13005 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 13006 - '@rollup/plugin-replace': 6.0.2(rollup@4.30.1) 13039 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 13040 + '@rollup/plugin-replace': 6.0.2(rollup@4.31.0) 13007 13041 '@vitejs/plugin-vue': 5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.1-rc)) 13008 13042 '@vitejs/plugin-vue-jsx': 4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.1-rc)) 13009 13043 autoprefixer: 10.4.20(postcss@8.4.49) ··· 13024 13058 perfect-debounce: 1.0.0 13025 13059 pkg-types: 1.3.0 13026 13060 postcss: 8.4.49 13027 - rollup-plugin-visualizer: 5.14.0(rollup@4.30.1) 13061 + rollup-plugin-visualizer: 5.14.0(rollup@4.31.0) 13028 13062 std-env: 3.8.0 13029 13063 ufo: 1.5.4 13030 13064 unenv: 1.10.0 ··· 13819 13853 - encoding 13820 13854 - supports-color 13821 13855 13822 - '@rollup/plugin-alias@5.1.1(rollup@4.30.1)': 13856 + '@rollup/plugin-alias@5.1.1(rollup@4.31.0)': 13823 13857 optionalDependencies: 13824 - rollup: 4.30.1 13858 + rollup: 4.31.0 13825 13859 13826 - '@rollup/plugin-commonjs@28.0.2(rollup@4.30.1)': 13860 + '@rollup/plugin-commonjs@28.0.2(rollup@4.31.0)': 13827 13861 dependencies: 13828 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 13862 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 13829 13863 commondir: 1.0.1 13830 13864 estree-walker: 2.0.2 13831 13865 fdir: 6.4.2(picomatch@4.0.2) ··· 13833 13867 magic-string: 0.30.17 13834 13868 picomatch: 4.0.2 13835 13869 optionalDependencies: 13836 - rollup: 4.30.1 13870 + rollup: 4.31.0 13837 13871 13838 - '@rollup/plugin-inject@5.0.5(rollup@4.30.1)': 13872 + '@rollup/plugin-inject@5.0.5(rollup@4.31.0)': 13839 13873 dependencies: 13840 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 13874 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 13841 13875 estree-walker: 2.0.2 13842 13876 magic-string: 0.30.17 13843 13877 optionalDependencies: 13844 - rollup: 4.30.1 13878 + rollup: 4.31.0 13845 13879 13846 - '@rollup/plugin-json@6.1.0(rollup@4.30.1)': 13880 + '@rollup/plugin-json@6.1.0(rollup@4.31.0)': 13847 13881 dependencies: 13848 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 13882 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 13849 13883 optionalDependencies: 13850 - rollup: 4.30.1 13884 + rollup: 4.31.0 13851 13885 13852 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.30.1)': 13886 + '@rollup/plugin-node-resolve@15.3.1(rollup@4.31.0)': 13853 13887 dependencies: 13854 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 13888 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 13855 13889 '@types/resolve': 1.20.2 13856 13890 deepmerge: 4.3.1 13857 13891 is-module: 1.0.0 13858 13892 resolve: 1.22.10 13859 13893 optionalDependencies: 13860 - rollup: 4.30.1 13894 + rollup: 4.31.0 13861 13895 13862 - '@rollup/plugin-replace@6.0.2(rollup@4.30.1)': 13896 + '@rollup/plugin-replace@6.0.2(rollup@4.31.0)': 13863 13897 dependencies: 13864 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 13898 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 13865 13899 magic-string: 0.30.17 13866 13900 optionalDependencies: 13867 - rollup: 4.30.1 13901 + rollup: 4.31.0 13868 13902 13869 - '@rollup/plugin-terser@0.4.4(rollup@4.30.1)': 13903 + '@rollup/plugin-terser@0.4.4(rollup@4.31.0)': 13870 13904 dependencies: 13871 13905 serialize-javascript: 6.0.2 13872 13906 smob: 1.5.0 13873 13907 terser: 5.36.0 13874 13908 optionalDependencies: 13875 - rollup: 4.30.1 13909 + rollup: 4.31.0 13876 13910 13877 - '@rollup/pluginutils@5.1.4(rollup@4.30.1)': 13911 + '@rollup/pluginutils@5.1.4(rollup@4.31.0)': 13878 13912 dependencies: 13879 13913 '@types/estree': 1.0.6 13880 13914 estree-walker: 2.0.2 13881 13915 picomatch: 4.0.2 13882 13916 optionalDependencies: 13883 - rollup: 4.30.1 13917 + rollup: 4.31.0 13884 13918 13885 13919 '@rollup/rollup-android-arm-eabi@4.26.0': 13886 13920 optional: true 13887 13921 13888 - '@rollup/rollup-android-arm-eabi@4.30.1': 13922 + '@rollup/rollup-android-arm-eabi@4.31.0': 13889 13923 optional: true 13890 13924 13891 13925 '@rollup/rollup-android-arm64@4.26.0': 13892 13926 optional: true 13893 13927 13894 - '@rollup/rollup-android-arm64@4.30.1': 13928 + '@rollup/rollup-android-arm64@4.31.0': 13895 13929 optional: true 13896 13930 13897 13931 '@rollup/rollup-darwin-arm64@4.26.0': 13898 13932 optional: true 13899 13933 13900 - '@rollup/rollup-darwin-arm64@4.30.1': 13934 + '@rollup/rollup-darwin-arm64@4.31.0': 13901 13935 optional: true 13902 13936 13903 13937 '@rollup/rollup-darwin-x64@4.26.0': 13904 13938 optional: true 13905 13939 13906 - '@rollup/rollup-darwin-x64@4.30.1': 13940 + '@rollup/rollup-darwin-x64@4.31.0': 13907 13941 optional: true 13908 13942 13909 13943 '@rollup/rollup-freebsd-arm64@4.26.0': 13910 13944 optional: true 13911 13945 13912 - '@rollup/rollup-freebsd-arm64@4.30.1': 13946 + '@rollup/rollup-freebsd-arm64@4.31.0': 13913 13947 optional: true 13914 13948 13915 13949 '@rollup/rollup-freebsd-x64@4.26.0': 13916 13950 optional: true 13917 13951 13918 - '@rollup/rollup-freebsd-x64@4.30.1': 13952 + '@rollup/rollup-freebsd-x64@4.31.0': 13919 13953 optional: true 13920 13954 13921 13955 '@rollup/rollup-linux-arm-gnueabihf@4.26.0': 13922 13956 optional: true 13923 13957 13924 - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': 13958 + '@rollup/rollup-linux-arm-gnueabihf@4.31.0': 13925 13959 optional: true 13926 13960 13927 13961 '@rollup/rollup-linux-arm-musleabihf@4.26.0': 13928 13962 optional: true 13929 13963 13930 - '@rollup/rollup-linux-arm-musleabihf@4.30.1': 13964 + '@rollup/rollup-linux-arm-musleabihf@4.31.0': 13931 13965 optional: true 13932 13966 13933 13967 '@rollup/rollup-linux-arm64-gnu@4.26.0': 13934 13968 optional: true 13935 13969 13936 - '@rollup/rollup-linux-arm64-gnu@4.30.1': 13970 + '@rollup/rollup-linux-arm64-gnu@4.31.0': 13937 13971 optional: true 13938 13972 13939 13973 '@rollup/rollup-linux-arm64-musl@4.26.0': 13940 13974 optional: true 13941 13975 13942 - '@rollup/rollup-linux-arm64-musl@4.30.1': 13976 + '@rollup/rollup-linux-arm64-musl@4.31.0': 13943 13977 optional: true 13944 13978 13945 - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': 13979 + '@rollup/rollup-linux-loongarch64-gnu@4.31.0': 13946 13980 optional: true 13947 13981 13948 13982 '@rollup/rollup-linux-powerpc64le-gnu@4.26.0': 13949 13983 optional: true 13950 13984 13951 - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': 13985 + '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': 13952 13986 optional: true 13953 13987 13954 13988 '@rollup/rollup-linux-riscv64-gnu@4.26.0': 13955 13989 optional: true 13956 13990 13957 - '@rollup/rollup-linux-riscv64-gnu@4.30.1': 13991 + '@rollup/rollup-linux-riscv64-gnu@4.31.0': 13958 13992 optional: true 13959 13993 13960 13994 '@rollup/rollup-linux-s390x-gnu@4.26.0': 13961 13995 optional: true 13962 13996 13963 - '@rollup/rollup-linux-s390x-gnu@4.30.1': 13997 + '@rollup/rollup-linux-s390x-gnu@4.31.0': 13964 13998 optional: true 13965 13999 13966 14000 '@rollup/rollup-linux-x64-gnu@4.26.0': 13967 14001 optional: true 13968 14002 13969 - '@rollup/rollup-linux-x64-gnu@4.30.1': 14003 + '@rollup/rollup-linux-x64-gnu@4.31.0': 13970 14004 optional: true 13971 14005 13972 14006 '@rollup/rollup-linux-x64-musl@4.26.0': 13973 14007 optional: true 13974 14008 13975 - '@rollup/rollup-linux-x64-musl@4.30.1': 14009 + '@rollup/rollup-linux-x64-musl@4.31.0': 13976 14010 optional: true 13977 14011 13978 14012 '@rollup/rollup-win32-arm64-msvc@4.26.0': 13979 14013 optional: true 13980 14014 13981 - '@rollup/rollup-win32-arm64-msvc@4.30.1': 14015 + '@rollup/rollup-win32-arm64-msvc@4.31.0': 13982 14016 optional: true 13983 14017 13984 14018 '@rollup/rollup-win32-ia32-msvc@4.26.0': 13985 14019 optional: true 13986 14020 13987 - '@rollup/rollup-win32-ia32-msvc@4.30.1': 14021 + '@rollup/rollup-win32-ia32-msvc@4.31.0': 13988 14022 optional: true 13989 14023 13990 14024 '@rollup/rollup-win32-x64-msvc@4.26.0': 13991 14025 optional: true 13992 14026 13993 - '@rollup/rollup-win32-x64-msvc@4.30.1': 14027 + '@rollup/rollup-win32-x64-msvc@4.31.0': 13994 14028 optional: true 13995 14029 13996 14030 '@rushstack/eslint-patch@1.10.5': {} ··· 14692 14726 unhead: 1.11.15 14693 14727 vue: 3.5.13(typescript@5.6.1-rc) 14694 14728 14695 - '@vercel/nft@0.27.10(encoding@0.1.13)(rollup@4.30.1)': 14729 + '@vercel/nft@0.27.10(encoding@0.1.13)(rollup@4.31.0)': 14696 14730 dependencies: 14697 14731 '@mapbox/node-pre-gyp': 2.0.0-rc.0(encoding@0.1.13) 14698 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 14732 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 14699 14733 acorn: 8.14.0 14700 14734 acorn-import-attributes: 1.9.5(acorn@8.14.0) 14701 14735 async-sema: 3.1.1 ··· 14825 14859 path-browserify: 1.0.1 14826 14860 vscode-uri: 3.0.8 14827 14861 14828 - '@vue-macros/common@1.15.1(rollup@4.30.1)(vue@3.5.13(typescript@5.5.3))': 14862 + '@vue-macros/common@1.15.1(rollup@4.31.0)(vue@3.5.13(typescript@5.5.3))': 14829 14863 dependencies: 14830 14864 '@babel/types': 7.26.3 14831 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 14865 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 14832 14866 '@vue/compiler-sfc': 3.5.13 14833 14867 ast-kit: 1.3.2 14834 14868 local-pkg: 0.5.1 ··· 14838 14872 transitivePeerDependencies: 14839 14873 - rollup 14840 14874 14841 - '@vue-macros/common@1.15.1(rollup@4.30.1)(vue@3.5.13(typescript@5.6.1-rc))': 14875 + '@vue-macros/common@1.15.1(rollup@4.31.0)(vue@3.5.13(typescript@5.6.1-rc))': 14842 14876 dependencies: 14843 14877 '@babel/types': 7.26.3 14844 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 14878 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 14845 14879 '@vue/compiler-sfc': 3.5.13 14846 14880 ast-kit: 1.3.2 14847 14881 local-pkg: 0.5.1 ··· 14922 14956 dependencies: 14923 14957 '@vue/devtools-kit': 7.7.0 14924 14958 14925 - '@vue/devtools-core@7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3))': 14959 + '@vue/devtools-core@7.6.8(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3))': 14926 14960 dependencies: 14927 14961 '@vue/devtools-kit': 7.7.0 14928 14962 '@vue/devtools-shared': 7.7.0 14929 14963 mitt: 3.0.1 14930 14964 nanoid: 5.0.9 14931 14965 pathe: 1.1.2 14932 - vite-hot-client: 0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 14966 + vite-hot-client: 0.2.4(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 14933 14967 vue: 3.5.13(typescript@5.5.3) 14934 14968 transitivePeerDependencies: 14935 14969 - vite ··· 14942 14976 nanoid: 5.0.9 14943 14977 pathe: 1.1.2 14944 14978 vite-hot-client: 0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 14979 + vue: 3.5.13(typescript@5.6.1-rc) 14980 + transitivePeerDependencies: 14981 + - vite 14982 + 14983 + '@vue/devtools-core@7.6.8(vue@3.5.13(typescript@5.6.1-rc))': 14984 + dependencies: 14985 + '@vue/devtools-kit': 7.7.0 14986 + '@vue/devtools-shared': 7.7.0 14987 + mitt: 3.0.1 14988 + nanoid: 5.0.9 14989 + pathe: 1.1.2 14990 + vite-hot-client: 0.2.4(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 14945 14991 vue: 3.5.13(typescript@5.6.1-rc) 14946 14992 transitivePeerDependencies: 14947 14993 - vite ··· 17341 17387 17342 17388 import-meta-resolve@4.1.0: {} 17343 17389 17344 - impound@0.2.0(rollup@4.30.1): 17390 + impound@0.2.0(rollup@4.31.0): 17345 17391 dependencies: 17346 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 17392 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 17347 17393 mlly: 1.7.3 17348 17394 pathe: 1.1.2 17349 17395 unenv: 1.10.0 ··· 18306 18352 dependencies: 18307 18353 '@cloudflare/kv-asset-handler': 0.3.4 18308 18354 '@netlify/functions': 2.8.2 18309 - '@rollup/plugin-alias': 5.1.1(rollup@4.30.1) 18310 - '@rollup/plugin-commonjs': 28.0.2(rollup@4.30.1) 18311 - '@rollup/plugin-inject': 5.0.5(rollup@4.30.1) 18312 - '@rollup/plugin-json': 6.1.0(rollup@4.30.1) 18313 - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.30.1) 18314 - '@rollup/plugin-replace': 6.0.2(rollup@4.30.1) 18315 - '@rollup/plugin-terser': 0.4.4(rollup@4.30.1) 18316 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 18355 + '@rollup/plugin-alias': 5.1.1(rollup@4.31.0) 18356 + '@rollup/plugin-commonjs': 28.0.2(rollup@4.31.0) 18357 + '@rollup/plugin-inject': 5.0.5(rollup@4.31.0) 18358 + '@rollup/plugin-json': 6.1.0(rollup@4.31.0) 18359 + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.31.0) 18360 + '@rollup/plugin-replace': 6.0.2(rollup@4.31.0) 18361 + '@rollup/plugin-terser': 0.4.4(rollup@4.31.0) 18362 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 18317 18363 '@types/http-proxy': 1.17.15 18318 - '@vercel/nft': 0.27.10(encoding@0.1.13)(rollup@4.30.1) 18364 + '@vercel/nft': 0.27.10(encoding@0.1.13)(rollup@4.31.0) 18319 18365 archiver: 7.0.1 18320 18366 c12: 2.0.1(magicast@0.3.5) 18321 18367 chokidar: 3.6.0 ··· 18357 18403 pkg-types: 1.3.0 18358 18404 pretty-bytes: 6.1.1 18359 18405 radix3: 1.1.2 18360 - rollup: 4.30.1 18361 - rollup-plugin-visualizer: 5.14.0(rollup@4.30.1) 18406 + rollup: 4.31.0 18407 + rollup-plugin-visualizer: 5.14.0(rollup@4.31.0) 18362 18408 scule: 1.3.0 18363 18409 semver: 7.6.3 18364 18410 serve-placeholder: 2.0.2 ··· 18368 18414 uncrypto: 0.1.3 18369 18415 unctx: 2.4.1 18370 18416 unenv: 1.10.0 18371 - unimport: 3.14.5(rollup@4.30.1) 18417 + unimport: 3.14.5(rollup@4.31.0) 18372 18418 unstorage: 1.14.4(db0@0.2.1)(ioredis@5.4.2) 18373 18419 untyped: 1.5.2 18374 18420 unwasm: 0.3.9 ··· 18403 18449 dependencies: 18404 18450 '@cloudflare/kv-asset-handler': 0.3.4 18405 18451 '@netlify/functions': 2.8.2 18406 - '@rollup/plugin-alias': 5.1.1(rollup@4.30.1) 18407 - '@rollup/plugin-commonjs': 28.0.2(rollup@4.30.1) 18408 - '@rollup/plugin-inject': 5.0.5(rollup@4.30.1) 18409 - '@rollup/plugin-json': 6.1.0(rollup@4.30.1) 18410 - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.30.1) 18411 - '@rollup/plugin-replace': 6.0.2(rollup@4.30.1) 18412 - '@rollup/plugin-terser': 0.4.4(rollup@4.30.1) 18413 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 18452 + '@rollup/plugin-alias': 5.1.1(rollup@4.31.0) 18453 + '@rollup/plugin-commonjs': 28.0.2(rollup@4.31.0) 18454 + '@rollup/plugin-inject': 5.0.5(rollup@4.31.0) 18455 + '@rollup/plugin-json': 6.1.0(rollup@4.31.0) 18456 + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.31.0) 18457 + '@rollup/plugin-replace': 6.0.2(rollup@4.31.0) 18458 + '@rollup/plugin-terser': 0.4.4(rollup@4.31.0) 18459 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 18414 18460 '@types/http-proxy': 1.17.15 18415 - '@vercel/nft': 0.27.10(encoding@0.1.13)(rollup@4.30.1) 18461 + '@vercel/nft': 0.27.10(encoding@0.1.13)(rollup@4.31.0) 18416 18462 archiver: 7.0.1 18417 18463 c12: 2.0.1(magicast@0.3.5) 18418 18464 chokidar: 3.6.0 ··· 18454 18500 pkg-types: 1.3.0 18455 18501 pretty-bytes: 6.1.1 18456 18502 radix3: 1.1.2 18457 - rollup: 4.30.1 18458 - rollup-plugin-visualizer: 5.14.0(rollup@4.30.1) 18503 + rollup: 4.31.0 18504 + rollup-plugin-visualizer: 5.14.0(rollup@4.31.0) 18459 18505 scule: 1.3.0 18460 18506 semver: 7.6.3 18461 18507 serve-placeholder: 2.0.2 ··· 18465 18511 uncrypto: 0.1.3 18466 18512 unctx: 2.4.1 18467 18513 unenv: 1.10.0 18468 - unimport: 3.14.5(rollup@4.30.1) 18514 + unimport: 3.14.5(rollup@4.31.0) 18469 18515 unstorage: 1.14.4(db0@0.2.1)(ioredis@5.4.2) 18470 18516 untyped: 1.5.2 18471 18517 unwasm: 0.3.9 ··· 18640 18686 18641 18687 nuxi@3.19.1: {} 18642 18688 18643 - nuxt@3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(yaml@2.7.0): 18689 + nuxt@3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(yaml@2.7.0): 18644 18690 dependencies: 18645 18691 '@nuxt/devalue': 2.0.2 18646 - '@nuxt/devtools': 1.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 18647 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 18692 + '@nuxt/devtools': 1.7.0(rollup@4.31.0)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3)) 18693 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 18648 18694 '@nuxt/schema': 3.15.1 18649 - '@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.30.1) 18650 - '@nuxt/vite-builder': 3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vue@3.5.13(typescript@5.5.3))(yaml@2.7.0) 18695 + '@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.31.0) 18696 + '@nuxt/vite-builder': 3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vue@3.5.13(typescript@5.5.3))(yaml@2.7.0) 18651 18697 '@unhead/dom': 1.11.15 18652 18698 '@unhead/shared': 1.11.15 18653 18699 '@unhead/ssr': 1.11.15 ··· 18670 18716 h3: 1.13.1 18671 18717 hookable: 5.5.3 18672 18718 ignore: 7.0.0 18673 - impound: 0.2.0(rollup@4.30.1) 18719 + impound: 0.2.0(rollup@4.31.0) 18674 18720 jiti: 2.4.2 18675 18721 klona: 2.0.6 18676 18722 knitwork: 1.2.0 ··· 18697 18743 unctx: 2.4.1 18698 18744 unenv: 1.10.0 18699 18745 unhead: 1.11.15 18700 - unimport: 3.14.5(rollup@4.30.1) 18746 + unimport: 3.14.5(rollup@4.31.0) 18701 18747 unplugin: 2.1.2 18702 - unplugin-vue-router: 0.10.9(rollup@4.30.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.5.3)))(vue@3.5.13(typescript@5.5.3)) 18748 + unplugin-vue-router: 0.10.9(rollup@4.31.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.5.3)))(vue@3.5.13(typescript@5.5.3)) 18703 18749 unstorage: 1.14.4(db0@0.2.1)(ioredis@5.4.2) 18704 18750 untyped: 1.5.2 18705 18751 vue: 3.5.13(typescript@5.5.3) ··· 18761 18807 - xml2js 18762 18808 - yaml 18763 18809 18764 - nuxt@3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(yaml@2.7.0): 18810 + nuxt@3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(yaml@2.7.0): 18765 18811 dependencies: 18766 18812 '@nuxt/devalue': 2.0.2 18767 - '@nuxt/devtools': 1.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.1-rc)) 18768 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 18813 + '@nuxt/devtools': 1.7.0(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.1-rc)) 18814 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 18769 18815 '@nuxt/schema': 3.15.1 18770 - '@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.30.1) 18771 - '@nuxt/vite-builder': 3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vue@3.5.13(typescript@5.6.1-rc))(yaml@2.7.0) 18816 + '@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.31.0) 18817 + '@nuxt/vite-builder': 3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vue@3.5.13(typescript@5.6.1-rc))(yaml@2.7.0) 18772 18818 '@unhead/dom': 1.11.15 18773 18819 '@unhead/shared': 1.11.15 18774 18820 '@unhead/ssr': 1.11.15 ··· 18791 18837 h3: 1.13.1 18792 18838 hookable: 5.5.3 18793 18839 ignore: 7.0.0 18794 - impound: 0.2.0(rollup@4.30.1) 18840 + impound: 0.2.0(rollup@4.31.0) 18795 18841 jiti: 2.4.2 18796 18842 klona: 2.0.6 18797 18843 knitwork: 1.2.0 ··· 18818 18864 unctx: 2.4.1 18819 18865 unenv: 1.10.0 18820 18866 unhead: 1.11.15 18821 - unimport: 3.14.5(rollup@4.30.1) 18867 + unimport: 3.14.5(rollup@4.31.0) 18822 18868 unplugin: 2.1.2 18823 - unplugin-vue-router: 0.10.9(rollup@4.30.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.6.1-rc)))(vue@3.5.13(typescript@5.6.1-rc)) 18869 + unplugin-vue-router: 0.10.9(rollup@4.31.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.6.1-rc)))(vue@3.5.13(typescript@5.6.1-rc)) 18824 18870 unstorage: 1.14.4(db0@0.2.1)(ioredis@5.4.2) 18825 18871 untyped: 1.5.2 18826 18872 vue: 3.5.13(typescript@5.6.1-rc) ··· 18882 18928 - xml2js 18883 18929 - yaml 18884 18930 18885 - nuxt@3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(yaml@2.7.0): 18931 + nuxt@3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(yaml@2.7.0): 18886 18932 dependencies: 18887 18933 '@nuxt/devalue': 2.0.2 18888 - '@nuxt/devtools': 1.7.0(rollup@4.30.1)(vue@3.5.13(typescript@5.6.1-rc)) 18889 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 18934 + '@nuxt/devtools': 1.7.0(rollup@4.31.0)(vue@3.5.13(typescript@5.6.1-rc)) 18935 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 18890 18936 '@nuxt/schema': 3.15.1 18891 - '@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.30.1) 18892 - '@nuxt/vite-builder': 3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vue@3.5.13(typescript@5.6.1-rc))(yaml@2.7.0) 18937 + '@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.31.0) 18938 + '@nuxt/vite-builder': 3.15.1(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vue@3.5.13(typescript@5.6.1-rc))(yaml@2.7.0) 18893 18939 '@unhead/dom': 1.11.15 18894 18940 '@unhead/shared': 1.11.15 18895 18941 '@unhead/ssr': 1.11.15 ··· 18912 18958 h3: 1.13.1 18913 18959 hookable: 5.5.3 18914 18960 ignore: 7.0.0 18915 - impound: 0.2.0(rollup@4.30.1) 18961 + impound: 0.2.0(rollup@4.31.0) 18916 18962 jiti: 2.4.2 18917 18963 klona: 2.0.6 18918 18964 knitwork: 1.2.0 ··· 18939 18985 unctx: 2.4.1 18940 18986 unenv: 1.10.0 18941 18987 unhead: 1.11.15 18942 - unimport: 3.14.5(rollup@4.30.1) 18988 + unimport: 3.14.5(rollup@4.31.0) 18943 18989 unplugin: 2.1.2 18944 - unplugin-vue-router: 0.10.9(rollup@4.30.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.6.1-rc)))(vue@3.5.13(typescript@5.6.1-rc)) 18990 + unplugin-vue-router: 0.10.9(rollup@4.31.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.6.1-rc)))(vue@3.5.13(typescript@5.6.1-rc)) 18945 18991 unstorage: 1.14.4(db0@0.2.1)(ioredis@5.4.2) 18946 18992 untyped: 1.5.2 18947 18993 vue: 3.5.13(typescript@5.6.1-rc) ··· 20037 20083 dependencies: 20038 20084 glob: 10.4.3 20039 20085 20040 - rollup-plugin-visualizer@5.14.0(rollup@4.30.1): 20086 + rollup-plugin-dts@6.1.1(rollup@4.31.0)(typescript@5.5.3): 20087 + dependencies: 20088 + magic-string: 0.30.17 20089 + rollup: 4.31.0 20090 + typescript: 5.5.3 20091 + optionalDependencies: 20092 + '@babel/code-frame': 7.26.2 20093 + 20094 + rollup-plugin-visualizer@5.14.0(rollup@4.31.0): 20041 20095 dependencies: 20042 20096 open: 8.4.2 20043 20097 picomatch: 4.0.2 20044 20098 source-map: 0.7.4 20045 20099 yargs: 17.7.2 20046 20100 optionalDependencies: 20047 - rollup: 4.30.1 20101 + rollup: 4.31.0 20048 20102 20049 20103 rollup@4.26.0: 20050 20104 dependencies: ··· 20070 20124 '@rollup/rollup-win32-x64-msvc': 4.26.0 20071 20125 fsevents: 2.3.3 20072 20126 20073 - rollup@4.30.1: 20127 + rollup@4.31.0: 20074 20128 dependencies: 20075 20129 '@types/estree': 1.0.6 20076 20130 optionalDependencies: 20077 - '@rollup/rollup-android-arm-eabi': 4.30.1 20078 - '@rollup/rollup-android-arm64': 4.30.1 20079 - '@rollup/rollup-darwin-arm64': 4.30.1 20080 - '@rollup/rollup-darwin-x64': 4.30.1 20081 - '@rollup/rollup-freebsd-arm64': 4.30.1 20082 - '@rollup/rollup-freebsd-x64': 4.30.1 20083 - '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 20084 - '@rollup/rollup-linux-arm-musleabihf': 4.30.1 20085 - '@rollup/rollup-linux-arm64-gnu': 4.30.1 20086 - '@rollup/rollup-linux-arm64-musl': 4.30.1 20087 - '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 20088 - '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 20089 - '@rollup/rollup-linux-riscv64-gnu': 4.30.1 20090 - '@rollup/rollup-linux-s390x-gnu': 4.30.1 20091 - '@rollup/rollup-linux-x64-gnu': 4.30.1 20092 - '@rollup/rollup-linux-x64-musl': 4.30.1 20093 - '@rollup/rollup-win32-arm64-msvc': 4.30.1 20094 - '@rollup/rollup-win32-ia32-msvc': 4.30.1 20095 - '@rollup/rollup-win32-x64-msvc': 4.30.1 20131 + '@rollup/rollup-android-arm-eabi': 4.31.0 20132 + '@rollup/rollup-android-arm64': 4.31.0 20133 + '@rollup/rollup-darwin-arm64': 4.31.0 20134 + '@rollup/rollup-darwin-x64': 4.31.0 20135 + '@rollup/rollup-freebsd-arm64': 4.31.0 20136 + '@rollup/rollup-freebsd-x64': 4.31.0 20137 + '@rollup/rollup-linux-arm-gnueabihf': 4.31.0 20138 + '@rollup/rollup-linux-arm-musleabihf': 4.31.0 20139 + '@rollup/rollup-linux-arm64-gnu': 4.31.0 20140 + '@rollup/rollup-linux-arm64-musl': 4.31.0 20141 + '@rollup/rollup-linux-loongarch64-gnu': 4.31.0 20142 + '@rollup/rollup-linux-powerpc64le-gnu': 4.31.0 20143 + '@rollup/rollup-linux-riscv64-gnu': 4.31.0 20144 + '@rollup/rollup-linux-s390x-gnu': 4.31.0 20145 + '@rollup/rollup-linux-x64-gnu': 4.31.0 20146 + '@rollup/rollup-linux-x64-musl': 4.31.0 20147 + '@rollup/rollup-win32-arm64-msvc': 4.31.0 20148 + '@rollup/rollup-win32-ia32-msvc': 4.31.0 20149 + '@rollup/rollup-win32-x64-msvc': 4.31.0 20096 20150 fsevents: 2.3.3 20097 20151 20098 20152 rrweb-cssom@0.6.0: {} ··· 21035 21089 picocolors: 1.1.1 21036 21090 postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.7.0) 21037 21091 resolve-from: 5.0.0 21038 - rollup: 4.30.1 21092 + rollup: 4.31.0 21039 21093 source-map: 0.8.0-beta.0 21040 21094 sucrase: 3.35.0 21041 21095 tinyexec: 0.3.2 ··· 21153 21207 21154 21208 unicorn-magic@0.3.0: {} 21155 21209 21156 - unimport@3.14.5(rollup@4.30.1): 21210 + unimport@3.14.5(rollup@4.31.0): 21157 21211 dependencies: 21158 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 21212 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 21159 21213 acorn: 8.14.0 21160 21214 escape-string-regexp: 5.0.0 21161 21215 estree-walker: 3.0.3 ··· 21211 21265 21212 21266 unpipe@1.0.0: {} 21213 21267 21214 - unplugin-vue-router@0.10.9(rollup@4.30.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.5.3)))(vue@3.5.13(typescript@5.5.3)): 21268 + unplugin-vue-router@0.10.9(rollup@4.31.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.5.3)))(vue@3.5.13(typescript@5.5.3)): 21215 21269 dependencies: 21216 21270 '@babel/types': 7.26.3 21217 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 21218 - '@vue-macros/common': 1.15.1(rollup@4.30.1)(vue@3.5.13(typescript@5.5.3)) 21271 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 21272 + '@vue-macros/common': 1.15.1(rollup@4.31.0)(vue@3.5.13(typescript@5.5.3)) 21219 21273 ast-walker-scope: 0.6.2 21220 21274 chokidar: 3.6.0 21221 21275 fast-glob: 3.3.3 ··· 21233 21287 - rollup 21234 21288 - vue 21235 21289 21236 - unplugin-vue-router@0.10.9(rollup@4.30.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.6.1-rc)))(vue@3.5.13(typescript@5.6.1-rc)): 21290 + unplugin-vue-router@0.10.9(rollup@4.31.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.6.1-rc)))(vue@3.5.13(typescript@5.6.1-rc)): 21237 21291 dependencies: 21238 21292 '@babel/types': 7.26.3 21239 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 21240 - '@vue-macros/common': 1.15.1(rollup@4.30.1)(vue@3.5.13(typescript@5.6.1-rc)) 21293 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 21294 + '@vue-macros/common': 1.15.1(rollup@4.31.0)(vue@3.5.13(typescript@5.6.1-rc)) 21241 21295 ast-walker-scope: 0.6.2 21242 21296 chokidar: 3.6.0 21243 21297 fast-glob: 3.3.3 ··· 21379 21433 '@types/unist': 3.0.3 21380 21434 vfile-message: 4.0.2 21381 21435 21436 + vite-hot-client@0.2.4(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 21437 + dependencies: 21438 + vite: 5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 21439 + 21382 21440 vite-hot-client@0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)): 21383 21441 dependencies: 21384 21442 vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0) ··· 21463 21521 optionator: 0.9.4 21464 21522 typescript: 5.6.1-rc 21465 21523 21466 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)): 21524 + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 21525 + dependencies: 21526 + '@antfu/utils': 0.7.10 21527 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 21528 + debug: 4.4.0(supports-color@9.4.0) 21529 + error-stack-parser-es: 0.1.5 21530 + fs-extra: 11.2.0 21531 + open: 10.1.0 21532 + perfect-debounce: 1.0.0 21533 + picocolors: 1.1.1 21534 + sirv: 3.0.0 21535 + vite: 5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 21536 + optionalDependencies: 21537 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 21538 + transitivePeerDependencies: 21539 + - rollup 21540 + - supports-color 21541 + 21542 + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)): 21467 21543 dependencies: 21468 21544 '@antfu/utils': 0.7.10 21469 - '@rollup/pluginutils': 5.1.4(rollup@4.30.1) 21545 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) 21470 21546 debug: 4.4.0(supports-color@9.4.0) 21471 21547 error-stack-parser-es: 0.1.5 21472 21548 fs-extra: 11.2.0 ··· 21476 21552 sirv: 3.0.0 21477 21553 vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0) 21478 21554 optionalDependencies: 21479 - '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1) 21555 + '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.31.0) 21480 21556 transitivePeerDependencies: 21481 21557 - rollup 21482 21558 - supports-color 21483 21559 21484 - vite-plugin-vue-devtools@7.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)): 21560 + vite-plugin-vue-devtools@7.7.0(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)): 21485 21561 dependencies: 21486 21562 '@vue/devtools-core': 7.7.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 21487 21563 '@vue/devtools-kit': 7.7.0 ··· 21489 21565 execa: 9.5.2 21490 21566 sirv: 3.0.0 21491 21567 vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0) 21492 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 21568 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 21493 21569 vite-plugin-vue-inspector: 5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)) 21494 21570 transitivePeerDependencies: 21495 21571 - '@nuxt/kit' ··· 21497 21573 - supports-color 21498 21574 - vue 21499 21575 21576 + vite-plugin-vue-inspector@5.3.1(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 21577 + dependencies: 21578 + '@babel/core': 7.26.0 21579 + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) 21580 + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) 21581 + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) 21582 + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) 21583 + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) 21584 + '@vue/compiler-dom': 3.5.13 21585 + kolorist: 1.8.0 21586 + magic-string: 0.30.17 21587 + vite: 5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 21588 + transitivePeerDependencies: 21589 + - supports-color 21590 + 21500 21591 vite-plugin-vue-inspector@5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)(yaml@2.7.0)): 21501 21592 dependencies: 21502 21593 '@babel/core': 7.26.0 ··· 21516 21607 dependencies: 21517 21608 esbuild: 0.21.5 21518 21609 postcss: 8.4.49 21519 - rollup: 4.30.1 21610 + rollup: 4.31.0 21520 21611 optionalDependencies: 21521 21612 '@types/node': 22.10.5 21522 21613 fsevents: 2.3.3 ··· 21528 21619 dependencies: 21529 21620 esbuild: 0.21.5 21530 21621 postcss: 8.4.49 21531 - rollup: 4.30.1 21622 + rollup: 4.31.0 21532 21623 optionalDependencies: 21533 21624 '@types/node': 22.10.5 21534 21625 fsevents: 2.3.3 ··· 21540 21631 dependencies: 21541 21632 esbuild: 0.24.2 21542 21633 postcss: 8.4.49 21543 - rollup: 4.30.1 21634 + rollup: 4.31.0 21544 21635 optionalDependencies: 21545 21636 '@types/node': 22.10.5 21546 21637 fsevents: 2.3.3 ··· 21602 21693 - typescript 21603 21694 - universal-cookie 21604 21695 21605 - vitest-environment-nuxt@1.0.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 21696 + vitest-environment-nuxt@1.0.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 21606 21697 dependencies: 21607 - '@nuxt/test-utils': 3.15.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.30.1)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 21698 + '@nuxt/test-utils': 3.15.1(@types/node@22.10.5)(@vue/test-utils@2.4.6)(jsdom@24.1.0)(less@4.2.0)(magicast@0.3.5)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.6.1-rc)(vitest@1.6.0(@types/node@22.10.5)(jsdom@24.1.0)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 21608 21699 transitivePeerDependencies: 21609 21700 - '@cucumber/cucumber' 21610 21701 - '@jest/globals'