diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000000..ecbc808c88 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,23 @@ +{ + "semi": true, + "singleQuote": true, + "printWidth": 80, + "ignorePatterns": [ + "**/.changeset/*.md", + "**/node_modules", + "**/templates", + "**/dist", + "**/.next", + "**/.nuxt", + "**/.output", + "**/.svelte-kit", + "**/.vitepress/cache", + "**/.vitepress/dist", + "**/test/generated", + "**/__snapshots__", + "**/CHANGELOG.md", + "pnpm-lock.yaml", + "**/*.vue", + "**/*.svelte" + ] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..4d8bb2380c --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://oxc.rs/schemas/oxlintrc.json", + "jsPlugins": [ + "eslint-plugin-simple-import-sort", + "eslint-plugin-sort-destructure-keys", + "eslint-plugin-sort-keys-fix", + "eslint-plugin-typescript-sort-keys", + { + "name": "local-paths", + "specifier": "./eslint-rules/local-paths.js" + }, + { + "name": "object-shorthand-custom", + "specifier": "./eslint-rules/object-shorthand.js" + } + ], + "plugins": ["unicorn", "typescript", "oxc"], + "rules": { + "arrow-body-style": "error", + "no-prototype-builtins": "off", + "sort-imports": "off", + "typescript/ban-ts-comment": "off", + "typescript/consistent-type-imports": "warn", + "typescript/explicit-function-return-type": "off", + "typescript/explicit-module-boundary-types": "off", + "typescript/no-explicit-any": "off", + "typescript/no-non-null-assertion": "off", + "typescript/no-require-imports": "off", + "typescript/no-var-requires": "off", + "simple-import-sort/exports": "error", + "simple-import-sort/imports": "error", + "sort-destructure-keys/sort-destructure-keys": "warn", + "sort-keys-fix/sort-keys-fix": "warn", + "typescript-sort-keys/interface": "warn", + "typescript-sort-keys/string-enum": "warn", + "local-paths/enforce-local-paths": "error", + "object-shorthand-custom/enforce": "error" + }, + "env": { + "builtin": true + }, + "globals": { + "NodeJS": true + }, + "ignorePatterns": [ + "**/.tsdown/", + "**/dist/", + "**/node_modules/", + "temp/", + "dev/.gen/", + "examples/openapi-ts-openai/src/client/**/*.ts", + "**/test/generated/", + "**/__snapshots__/", + "**/.next/", + "**/.nuxt/", + "**/.output/", + "**/.svelte-kit/", + "**/.vitepress/cache", + "**/.vitepress/dist", + "**/.angular", + "**/*.svelte", + "**/*.vue" + ] +} diff --git a/dev/package.json b/dev/package.json index fd4f07c77f..363cf1d65d 100644 --- a/dev/package.json +++ b/dev/package.json @@ -3,9 +3,6 @@ "version": "0.0.0", "private": true, "type": "module", - "engines": { - "node": ">=20.19.0" - }, "scripts": { "dev": "ts-node ./playground.ts" }, @@ -23,5 +20,8 @@ "typescript": "5.9.3", "valibot": "1.2.0", "zod": "4.1.12" + }, + "engines": { + "node": ">=20.19.0" } } diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 5156f37e30..7d74af3fbe 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -305,8 +305,9 @@ html.dark .sponsors-list li { background-color: var(--vp-button-brand-bg); } -.sponsors-list li > :is(.vp-doc a[href*='://'], .vp-doc a[target='_blank'])::after -{ +.sponsors-list + li + > :is(.vp-doc a[href*='://'], .vp-doc a[target='_blank'])::after { display: none; } diff --git a/docs/package.json b/docs/package.json index 160bb6d6d4..7024508339 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,8 +1,8 @@ { "name": "@docs/openapi-ts", "version": "0.10.4", - "description": "Documentation for OpenAPI TypeScript.", "private": true, + "description": "Documentation for OpenAPI TypeScript.", "type": "module", "scripts": { "build": "vitepress build", diff --git a/eslint-rules/object-shorthand.js b/eslint-rules/object-shorthand.js new file mode 100644 index 0000000000..5e7a000906 --- /dev/null +++ b/eslint-rules/object-shorthand.js @@ -0,0 +1,96 @@ +/** + * Custom ESLint rule for object-shorthand + * Enforces the use of shorthand syntax for object properties and methods + * + * This rule can be contributed back to Oxlint as it's a general-purpose rule + * not specific to this repository. + */ + +const rule = { + create(context) { + const sourceCode = context.sourceCode || context.getSourceCode(); + + return { + Property(node) { + // Skip if it's a spread property or computed property + if (node.type === 'SpreadElement' || node.computed) { + return; + } + + // Check for property shorthand (e.g., { x } instead of { x: x }) + if ( + node.value.type === 'Identifier' && + node.key.type === 'Identifier' && + node.key.name === node.value.name && + !node.shorthand && + !node.method + ) { + context.report({ + messageId: 'expectedPropertyShorthand', + node, + fix(fixer) { + // Replace "key: value" with "key" + const keyText = sourceCode.getText(node.key); + return fixer.replaceTextRange( + [node.key.range[0], node.value.range[1]], + keyText, + ); + }, + }); + } + + // Check for method shorthand (e.g., { foo() {} } instead of { foo: function() {} }) + if ( + node.value.type === 'FunctionExpression' && + !node.value.generator && + !node.value.async && + !node.method && + node.key.type === 'Identifier' + ) { + context.report({ + messageId: 'expectedMethodShorthand', + node, + fix(fixer) { + const keyText = sourceCode.getText(node.key); + const params = + sourceCode + .getText(node.value) + .match(/function\s*\((.*?)\)/)?.[1] || ''; + const body = sourceCode.getText(node.value.body); + + return fixer.replaceText(node, `${keyText}(${params}) ${body}`); + }, + }); + } + }, + }; + }, + + meta: { + docs: { + description: + 'Enforce the use of shorthand syntax for object properties and methods', + category: 'ECMAScript 6', + recommended: false, + }, + type: 'suggestion', + fixable: 'code', + messages: { + expectedPropertyShorthand: 'Expected property shorthand.', + expectedMethodShorthand: 'Expected method shorthand.', + }, + schema: [], + }, +}; + +const plugin = { + meta: { + name: 'object-shorthand-custom', + version: '1.0.0', + }, + rules: { + enforce: rule, + }, +}; + +export default plugin; diff --git a/examples/openapi-ts-angular-common/package.json b/examples/openapi-ts-angular-common/package.json index b281d3db14..10b0c5f8b0 100644 --- a/examples/openapi-ts-angular-common/package.json +++ b/examples/openapi-ts-angular-common/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-angular-common", - "private": true, "version": "0.0.0", + "private": true, "scripts": { "build": "ng build", "dev": "ng serve", diff --git a/examples/openapi-ts-angular-common/src/client/client/types.gen.ts b/examples/openapi-ts-angular-common/src/client/client/types.gen.ts index c7b4e2e12d..06a8ae0223 100644 --- a/examples/openapi-ts-angular-common/src/client/client/types.gen.ts +++ b/examples/openapi-ts-angular-common/src/client/client/types.gen.ts @@ -23,7 +23,8 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, + extends + Omit, Omit { /** * Base URL for all requests made by this client. @@ -71,7 +72,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-angular-common/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-angular-common/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-angular-common/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-angular-common/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-angular/package.json b/examples/openapi-ts-angular/package.json index fd1ea7c973..d09abb18d4 100644 --- a/examples/openapi-ts-angular/package.json +++ b/examples/openapi-ts-angular/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-angular", - "private": true, "version": "0.0.0", + "private": true, "scripts": { "build": "ng build", "dev": "ng serve", diff --git a/examples/openapi-ts-angular/src/client/client/types.gen.ts b/examples/openapi-ts-angular/src/client/client/types.gen.ts index c7b4e2e12d..06a8ae0223 100644 --- a/examples/openapi-ts-angular/src/client/client/types.gen.ts +++ b/examples/openapi-ts-angular/src/client/client/types.gen.ts @@ -23,7 +23,8 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, + extends + Omit, Omit { /** * Base URL for all requests made by this client. @@ -71,7 +72,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-angular/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-angular/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-angular/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-angular/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-axios/package.json b/examples/openapi-ts-axios/package.json index 1c4f1a80e6..d40a93d779 100644 --- a/examples/openapi-ts-axios/package.json +++ b/examples/openapi-ts-axios/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-axios", - "private": true, "version": "0.0.35", + "private": true, "type": "module", "scripts": { "build": "tsc && vite build", @@ -22,8 +22,8 @@ "devDependencies": { "@config/vite-base": "workspace:*", "@hey-api/openapi-ts": "workspace:*", - "@types/react-dom": "19.0.1", "@types/react": "19.0.1", + "@types/react-dom": "19.0.1", "@typescript-eslint/eslint-plugin": "8.29.1", "@typescript-eslint/parser": "8.29.1", "@vitejs/plugin-react": "4.4.0-beta.1", diff --git a/examples/openapi-ts-axios/src/client/client/types.gen.ts b/examples/openapi-ts-axios/src/client/client/types.gen.ts index 59be50cc30..ef2d8cc8be 100644 --- a/examples/openapi-ts-axios/src/client/client/types.gen.ts +++ b/examples/openapi-ts-axios/src/client/client/types.gen.ts @@ -20,7 +20,8 @@ import type { } from '../core/types.gen'; export interface Config - extends Omit, + extends + Omit, CoreConfig { /** * Axios implementation. You can use this option to provide either an @@ -63,7 +64,9 @@ export interface RequestOptions< TData = unknown, ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ throwOnError: ThrowOnError; }>, Pick< diff --git a/examples/openapi-ts-axios/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-axios/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-axios/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-axios/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-fastify/package.json b/examples/openapi-ts-fastify/package.json index 0e5c654765..d2358cdfbf 100644 --- a/examples/openapi-ts-fastify/package.json +++ b/examples/openapi-ts-fastify/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-fastify", - "private": true, "version": "0.1.16", + "private": true, "type": "module", "scripts": { "openapi-ts": "openapi-ts", diff --git a/examples/openapi-ts-fastify/src/client/client/types.gen.ts b/examples/openapi-ts-fastify/src/client/client/types.gen.ts index b4a499cc03..d2a28bc810 100644 --- a/examples/openapi-ts-fastify/src/client/client/types.gen.ts +++ b/examples/openapi-ts-fastify/src/client/client/types.gen.ts @@ -14,8 +14,7 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -69,7 +68,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-fastify/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-fastify/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-fastify/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-fastify/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-fastify/test/pets.test.ts b/examples/openapi-ts-fastify/test/pets.test.ts index c236dc0697..6cda4e5335 100644 --- a/examples/openapi-ts-fastify/test/pets.test.ts +++ b/examples/openapi-ts-fastify/test/pets.test.ts @@ -17,7 +17,7 @@ describe('/pet/findByTags', () => { }); afterAll(async () => { - await Promise.all([server.close()]); + [await server.close()]; }); test('showPetById', async () => { diff --git a/examples/openapi-ts-fetch/package.json b/examples/openapi-ts-fetch/package.json index 8f619cd869..58acdc35dc 100644 --- a/examples/openapi-ts-fetch/package.json +++ b/examples/openapi-ts-fetch/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-fetch", - "private": true, "version": "0.0.57", + "private": true, "type": "module", "scripts": { "build": "tsc && vite build", diff --git a/examples/openapi-ts-fetch/src/client/client/types.gen.ts b/examples/openapi-ts-fetch/src/client/client/types.gen.ts index b4a499cc03..d2a28bc810 100644 --- a/examples/openapi-ts-fetch/src/client/client/types.gen.ts +++ b/examples/openapi-ts-fetch/src/client/client/types.gen.ts @@ -14,8 +14,7 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -69,7 +68,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-fetch/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-fetch/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-fetch/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-fetch/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-ky/package.json b/examples/openapi-ts-ky/package.json index 76fe42f596..7a109e74a5 100644 --- a/examples/openapi-ts-ky/package.json +++ b/examples/openapi-ts-ky/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-ky", - "private": true, "version": "0.0.1", + "private": true, "type": "module", "scripts": { "build": "tsc && vite build", diff --git a/examples/openapi-ts-ky/src/client/client/types.gen.ts b/examples/openapi-ts-ky/src/client/client/types.gen.ts index 62d18352cc..d9e0c096c3 100644 --- a/examples/openapi-ts-ky/src/client/client/types.gen.ts +++ b/examples/openapi-ts-ky/src/client/client/types.gen.ts @@ -37,7 +37,8 @@ export interface RetryOptions { } export interface Config - extends Omit< + extends + Omit< import('ky').Options, 'body' | 'headers' | 'method' | 'prefixUrl' | 'retry' | 'throwHttpErrors' >, @@ -101,7 +102,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-ky/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-ky/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-ky/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-ky/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-next/package.json b/examples/openapi-ts-next/package.json index a98e302c5a..74c9baac7d 100644 --- a/examples/openapi-ts-next/package.json +++ b/examples/openapi-ts-next/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-next", - "private": true, "version": "0.1.13", + "private": true, "scripts": { "build": "next build", "dev": "next dev", diff --git a/examples/openapi-ts-next/src/client/client/types.gen.ts b/examples/openapi-ts-next/src/client/client/types.gen.ts index 9309ceeb74..85e9ea7dcd 100644 --- a/examples/openapi-ts-next/src/client/client/types.gen.ts +++ b/examples/openapi-ts-next/src/client/client/types.gen.ts @@ -12,8 +12,7 @@ import type { import type { Middleware } from './utils.gen'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -53,7 +52,9 @@ export interface RequestOptions< TData = unknown, ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ throwOnError: ThrowOnError; }>, Pick< diff --git a/examples/openapi-ts-next/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-next/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-next/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-next/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-nuxt/package.json b/examples/openapi-ts-nuxt/package.json index d0cc9fff93..d997edc1b5 100644 --- a/examples/openapi-ts-nuxt/package.json +++ b/examples/openapi-ts-nuxt/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-nuxt", - "private": true, "version": "0.0.20", + "private": true, "type": "module", "scripts": { "build": "nuxt build", diff --git a/examples/openapi-ts-ofetch/package.json b/examples/openapi-ts-ofetch/package.json index 2d222e6b1e..c71b9e9004 100644 --- a/examples/openapi-ts-ofetch/package.json +++ b/examples/openapi-ts-ofetch/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-ofetch", - "private": true, "version": "0.0.1", + "private": true, "type": "module", "scripts": { "build": "vite build", diff --git a/examples/openapi-ts-ofetch/src/client/client/types.gen.ts b/examples/openapi-ts-ofetch/src/client/client/types.gen.ts index 76d3c1c36d..263936c0ea 100644 --- a/examples/openapi-ts-ofetch/src/client/client/types.gen.ts +++ b/examples/openapi-ts-ofetch/src/client/client/types.gen.ts @@ -20,8 +20,7 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * HTTP(S) agent configuration (Node.js only). Passed through to ofetch. */ @@ -136,7 +135,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-ofetch/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-ofetch/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-ofetch/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-ofetch/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-openai/package.json b/examples/openapi-ts-openai/package.json index f50b95e8f0..edd16d6d62 100644 --- a/examples/openapi-ts-openai/package.json +++ b/examples/openapi-ts-openai/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-openai", - "private": true, "version": "0.0.0", + "private": true, "type": "module", "scripts": { "build": "tsc && vite build", diff --git a/examples/openapi-ts-openai/src/client/client/types.gen.ts b/examples/openapi-ts-openai/src/client/client/types.gen.ts index b4a499cc03..d2a28bc810 100644 --- a/examples/openapi-ts-openai/src/client/client/types.gen.ts +++ b/examples/openapi-ts-openai/src/client/client/types.gen.ts @@ -14,8 +14,7 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -69,7 +68,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-openai/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-openai/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-openai/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-openai/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-pinia-colada/.eslintrc.cjs b/examples/openapi-ts-pinia-colada/.eslintrc.cjs index 491d6ae84f..c5209a31ad 100644 --- a/examples/openapi-ts-pinia-colada/.eslintrc.cjs +++ b/examples/openapi-ts-pinia-colada/.eslintrc.cjs @@ -1,14 +1,14 @@ /* eslint-env node */ -require('@rushstack/eslint-patch/modern-module-resolution') +require('@rushstack/eslint-patch/modern-module-resolution'); module.exports = { extends: [ 'plugin:vue/vue3-essential', 'eslint:recommended', '@vue/eslint-config-typescript', - '@vue/eslint-config-prettier/skip-formatting' + '@vue/eslint-config-prettier/skip-formatting', ], parserOptions: { - ecmaVersion: 'latest' - } -} + ecmaVersion: 'latest', + }, +}; diff --git a/examples/openapi-ts-pinia-colada/.vscode/extensions.json b/examples/openapi-ts-pinia-colada/.vscode/extensions.json index 0449b97dc9..93ea3e7838 100644 --- a/examples/openapi-ts-pinia-colada/.vscode/extensions.json +++ b/examples/openapi-ts-pinia-colada/.vscode/extensions.json @@ -1,3 +1,7 @@ { - "recommendations": ["Vue.volar", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] + "recommendations": [ + "Vue.volar", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] } diff --git a/examples/openapi-ts-pinia-colada/openapi-ts.config.ts b/examples/openapi-ts-pinia-colada/openapi-ts.config.ts index a231ae4d61..aec8117903 100644 --- a/examples/openapi-ts-pinia-colada/openapi-ts.config.ts +++ b/examples/openapi-ts-pinia-colada/openapi-ts.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from '@hey-api/openapi-ts' +import { defineConfig } from '@hey-api/openapi-ts'; export default defineConfig({ input: @@ -6,7 +6,7 @@ export default defineConfig({ output: { format: 'prettier', lint: 'eslint', - path: './src/client' + path: './src/client', }, plugins: [ '@hey-api/client-fetch', @@ -14,12 +14,12 @@ export default defineConfig({ '@hey-api/sdk', { enums: 'javascript', - name: '@hey-api/typescript' + name: '@hey-api/typescript', }, { exportFromIndex: true, name: '@pinia/colada', - queryKeys: false - } - ] -}) + queryKeys: false, + }, + ], +}); diff --git a/examples/openapi-ts-pinia-colada/package.json b/examples/openapi-ts-pinia-colada/package.json index b23a3eb0db..7db27f1718 100644 --- a/examples/openapi-ts-pinia-colada/package.json +++ b/examples/openapi-ts-pinia-colada/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-pinia-colada", - "private": true, "version": "0.0.0", + "private": true, "type": "module", "scripts": { "build-only": "vite build", diff --git a/examples/openapi-ts-pinia-colada/postcss.config.js b/examples/openapi-ts-pinia-colada/postcss.config.js index 9ed16a0e80..9eef821c48 100644 --- a/examples/openapi-ts-pinia-colada/postcss.config.js +++ b/examples/openapi-ts-pinia-colada/postcss.config.js @@ -1,6 +1,6 @@ export default { plugins: { autoprefixer: {}, - tailwindcss: {} - } -} + tailwindcss: {}, + }, +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/@pinia/colada.gen.ts b/examples/openapi-ts-pinia-colada/src/client/@pinia/colada.gen.ts index 75aae1970c..f9291cf857 100644 --- a/examples/openapi-ts-pinia-colada/src/client/@pinia/colada.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/@pinia/colada.gen.ts @@ -1,9 +1,13 @@ // This file is auto-generated by @hey-api/openapi-ts -import { type _JSONValue, defineQueryOptions, type UseMutationOptions } from '@pinia/colada' +import { + type _JSONValue, + defineQueryOptions, + type UseMutationOptions, +} from '@pinia/colada'; -import { serializeQueryKeyValue } from '../client' -import { client } from '../client.gen' +import { serializeQueryKeyValue } from '../client'; +import { client } from '../client.gen'; import { addPet, createUser, @@ -24,8 +28,8 @@ import { updatePet, updatePetWithForm, updateUser, - uploadFile -} from '../sdk.gen' + uploadFile, +} from '../sdk.gen'; import type { AddPetData, AddPetResponse, @@ -52,8 +56,8 @@ import type { UpdatePetWithFormResponse, UpdateUserData, UploadFileData, - UploadFileResponse -} from '../types.gen' + UploadFileResponse, +} from '../types.gen'; /** * Add a new pet to the store. @@ -61,17 +65,17 @@ import type { * Add a new pet to the store. */ export const addPetMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await addPet({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Update an existing pet. @@ -79,57 +83,58 @@ export const addPetMutation = ( * Update an existing pet by Id. */ export const updatePetMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await updatePet({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); export type QueryKey = [ Pick & { - _id: string - baseUrl?: _JSONValue - body?: _JSONValue - query?: _JSONValue - tags?: _JSONValue - } -] + _id: string; + baseUrl?: _JSONValue; + body?: _JSONValue; + query?: _JSONValue; + tags?: _JSONValue; + }, +]; const createQueryKey = ( id: string, options?: TOptions, - tags?: ReadonlyArray + tags?: ReadonlyArray, ): [QueryKey[0]] => { const params: QueryKey[0] = { _id: id, - baseUrl: options?.baseUrl || (options?.client ?? client).getConfig().baseUrl - } as QueryKey[0] + baseUrl: + options?.baseUrl || (options?.client ?? client).getConfig().baseUrl, + } as QueryKey[0]; if (tags) { - params.tags = tags as unknown as _JSONValue + params.tags = tags as unknown as _JSONValue; } if (options?.body !== undefined) { - const normalizedBody = serializeQueryKeyValue(options.body) + const normalizedBody = serializeQueryKeyValue(options.body); if (normalizedBody !== undefined) { - params.body = normalizedBody + params.body = normalizedBody; } } if (options?.path) { - params.path = options.path + params.path = options.path; } if (options?.query !== undefined) { - const normalizedQuery = serializeQueryKeyValue(options.query) + const normalizedQuery = serializeQueryKeyValue(options.query); if (normalizedQuery !== undefined) { - params.query = normalizedQuery + params.query = normalizedQuery; } } - return [params] -} + return [params]; +}; /** * Finds Pets by status. @@ -143,29 +148,31 @@ export const findPetsByStatusQuery = defineQueryOptions( const { data } = await findPetsByStatus({ ...options, ...context, - throwOnError: true - }) - return data - } - }) -) + throwOnError: true, + }); + return data; + }, + }), +); /** * Finds Pets by tags. * * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. */ -export const findPetsByTagsQuery = defineQueryOptions((options: Options) => ({ - key: createQueryKey('findPetsByTags', options), - query: async (context) => { - const { data } = await findPetsByTags({ - ...options, - ...context, - throwOnError: true - }) - return data - } -})) +export const findPetsByTagsQuery = defineQueryOptions( + (options: Options) => ({ + key: createQueryKey('findPetsByTags', options), + query: async (context) => { + const { data } = await findPetsByTags({ + ...options, + ...context, + throwOnError: true, + }); + return data; + }, + }), +); /** * Deletes a pet. @@ -173,34 +180,36 @@ export const findPetsByTagsQuery = defineQueryOptions((options: Options> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await deletePet({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Find pet by ID. * * Returns a single pet. */ -export const getPetByIdQuery = defineQueryOptions((options: Options) => ({ - key: createQueryKey('getPetById', options), - query: async (context) => { - const { data } = await getPetById({ - ...options, - ...context, - throwOnError: true - }) - return data - } -})) +export const getPetByIdQuery = defineQueryOptions( + (options: Options) => ({ + key: createQueryKey('getPetById', options), + query: async (context) => { + const { data } = await getPetById({ + ...options, + ...context, + throwOnError: true, + }); + return data; + }, + }), +); /** * Updates a pet in the store with form data. @@ -208,17 +217,21 @@ export const getPetByIdQuery = defineQueryOptions((options: Options> -): UseMutationOptions, Error> => ({ + options?: Partial>, +): UseMutationOptions< + UpdatePetWithFormResponse, + Options, + Error +> => ({ mutation: async (vars) => { const { data } = await updatePetWithForm({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Uploads an image. @@ -226,34 +239,36 @@ export const updatePetWithFormMutation = ( * Upload image of the pet. */ export const uploadFileMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await uploadFile({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Returns pet inventories by status. * * Returns a map of status codes to quantities. */ -export const getInventoryQuery = defineQueryOptions((options?: Options) => ({ - key: createQueryKey('getInventory', options), - query: async (context) => { - const { data } = await getInventory({ - ...options, - ...context, - throwOnError: true - }) - return data - } -})) +export const getInventoryQuery = defineQueryOptions( + (options?: Options) => ({ + key: createQueryKey('getInventory', options), + query: async (context) => { + const { data } = await getInventory({ + ...options, + ...context, + throwOnError: true, + }); + return data; + }, + }), +); /** * Place an order for a pet. @@ -261,17 +276,17 @@ export const getInventoryQuery = defineQueryOptions((options?: Options> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await placeOrder({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Delete purchase order by identifier. @@ -279,34 +294,36 @@ export const placeOrderMutation = ( * For valid response try integer IDs with value < 1000. Anything above 1000 or non-integers will generate API errors. */ export const deleteOrderMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await deleteOrder({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Find purchase order by ID. * * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. */ -export const getOrderByIdQuery = defineQueryOptions((options: Options) => ({ - key: createQueryKey('getOrderById', options), - query: async (context) => { - const { data } = await getOrderById({ - ...options, - ...context, - throwOnError: true - }) - return data - } -})) +export const getOrderByIdQuery = defineQueryOptions( + (options: Options) => ({ + key: createQueryKey('getOrderById', options), + query: async (context) => { + const { data } = await getOrderById({ + ...options, + ...context, + throwOnError: true, + }); + return data; + }, + }), +); /** * Create user. @@ -314,17 +331,17 @@ export const getOrderByIdQuery = defineQueryOptions((options: Options> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await createUser({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Creates list of users with given input array. @@ -332,7 +349,7 @@ export const createUserMutation = ( * Creates list of users with given input array. */ export const createUsersWithListInputMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions< CreateUsersWithListInputResponse, Options, @@ -342,45 +359,49 @@ export const createUsersWithListInputMutation = ( const { data } = await createUsersWithListInput({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Logs user into the system. * * Log into the system. */ -export const loginUserQuery = defineQueryOptions((options?: Options) => ({ - key: createQueryKey('loginUser', options), - query: async (context) => { - const { data } = await loginUser({ - ...options, - ...context, - throwOnError: true - }) - return data - } -})) +export const loginUserQuery = defineQueryOptions( + (options?: Options) => ({ + key: createQueryKey('loginUser', options), + query: async (context) => { + const { data } = await loginUser({ + ...options, + ...context, + throwOnError: true, + }); + return data; + }, + }), +); /** * Logs out current logged in user session. * * Log user out of the system. */ -export const logoutUserQuery = defineQueryOptions((options?: Options) => ({ - key: createQueryKey('logoutUser', options), - query: async (context) => { - const { data } = await logoutUser({ - ...options, - ...context, - throwOnError: true - }) - return data - } -})) +export const logoutUserQuery = defineQueryOptions( + (options?: Options) => ({ + key: createQueryKey('logoutUser', options), + query: async (context) => { + const { data } = await logoutUser({ + ...options, + ...context, + throwOnError: true, + }); + return data; + }, + }), +); /** * Delete user resource. @@ -388,34 +409,36 @@ export const logoutUserQuery = defineQueryOptions((options?: Options> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await deleteUser({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); /** * Get user by user name. * * Get user detail based on username. */ -export const getUserByNameQuery = defineQueryOptions((options: Options) => ({ - key: createQueryKey('getUserByName', options), - query: async (context) => { - const { data } = await getUserByName({ - ...options, - ...context, - throwOnError: true - }) - return data - } -})) +export const getUserByNameQuery = defineQueryOptions( + (options: Options) => ({ + key: createQueryKey('getUserByName', options), + query: async (context) => { + const { data } = await getUserByName({ + ...options, + ...context, + throwOnError: true, + }); + return data; + }, + }), +); /** * Update user resource. @@ -423,14 +446,14 @@ export const getUserByNameQuery = defineQueryOptions((options: Options> + options?: Partial>, ): UseMutationOptions, Error> => ({ mutation: async (vars) => { const { data } = await updateUser({ ...options, ...vars, - throwOnError: true - }) - return data - } -}) + throwOnError: true, + }); + return data; + }, +}); diff --git a/examples/openapi-ts-pinia-colada/src/client/client.gen.ts b/examples/openapi-ts-pinia-colada/src/client/client.gen.ts index 1d374e90be..069f4dabab 100644 --- a/examples/openapi-ts-pinia-colada/src/client/client.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/client.gen.ts @@ -1,7 +1,12 @@ // This file is auto-generated by @hey-api/openapi-ts -import { type ClientOptions, type Config, createClient, createConfig } from './client' -import type { ClientOptions as ClientOptions2 } from './types.gen' +import { + type ClientOptions, + type Config, + createClient, + createConfig, +} from './client'; +import type { ClientOptions as ClientOptions2 } from './types.gen'; /** * The `createClientConfig()` function will be called on client initialization @@ -12,9 +17,11 @@ import type { ClientOptions as ClientOptions2 } from './types.gen' * to ensure your client always has the correct values. */ export type CreateClientConfig = ( - override?: Config -) => Config & T> + override?: Config, +) => Config & T>; export const client = createClient( - createConfig({ baseUrl: 'https://petstore3.swagger.io/api/v3' }) -) + createConfig({ + baseUrl: 'https://petstore3.swagger.io/api/v3', + }), +); diff --git a/examples/openapi-ts-pinia-colada/src/client/client/client.gen.ts b/examples/openapi-ts-pinia-colada/src/client/client/client.gen.ts index 00dbae3997..c2a5190c22 100644 --- a/examples/openapi-ts-pinia-colada/src/client/client/client.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/client/client.gen.ts @@ -1,9 +1,14 @@ // This file is auto-generated by @hey-api/openapi-ts -import { createSseClient } from '../core/serverSentEvents.gen' -import type { HttpMethod } from '../core/types.gen' -import { getValidRequestBody } from '../core/utils.gen' -import type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen' +import { createSseClient } from '../core/serverSentEvents.gen'; +import type { HttpMethod } from '../core/types.gen'; +import { getValidRequestBody } from '../core/utils.gen'; +import type { + Client, + Config, + RequestOptions, + ResolvedRequestOptions, +} from './types.gen'; import { buildUrl, createConfig, @@ -11,25 +16,30 @@ import { getParseAs, mergeConfigs, mergeHeaders, - setAuthParams -} from './utils.gen' + setAuthParams, +} from './utils.gen'; type ReqInit = Omit & { - body?: any - headers: ReturnType -} + body?: any; + headers: ReturnType; +}; export const createClient = (config: Config = {}): Client => { - let _config = mergeConfigs(createConfig(), config) + let _config = mergeConfigs(createConfig(), config); - const getConfig = (): Config => ({ ..._config }) + const getConfig = (): Config => ({ ..._config }); const setConfig = (config: Config): Config => { - _config = mergeConfigs(_config, config) - return getConfig() - } + _config = mergeConfigs(_config, config); + return getConfig(); + }; - const interceptors = createInterceptors() + const interceptors = createInterceptors< + Request, + Response, + unknown, + ResolvedRequestOptions + >(); const beforeRequest = async (options: RequestOptions) => { const opts = { @@ -37,72 +47,77 @@ export const createClient = (config: Config = {}): Client => { ...options, fetch: options.fetch ?? _config.fetch ?? globalThis.fetch, headers: mergeHeaders(_config.headers, options.headers), - serializedBody: undefined - } + serializedBody: undefined, + }; if (opts.security) { await setAuthParams({ ...opts, - security: opts.security - }) + security: opts.security, + }); } if (opts.requestValidator) { - await opts.requestValidator(opts) + await opts.requestValidator(opts); } if (opts.body !== undefined && opts.bodySerializer) { - opts.serializedBody = opts.bodySerializer(opts.body) + opts.serializedBody = opts.bodySerializer(opts.body); } // remove Content-Type header if body is empty to avoid sending invalid requests if (opts.body === undefined || opts.serializedBody === '') { - opts.headers.delete('Content-Type') + opts.headers.delete('Content-Type'); } - const url = buildUrl(opts) + const url = buildUrl(opts); - return { opts, url } - } + return { opts, url }; + }; const request: Client['request'] = async (options) => { // @ts-expect-error - const { opts, url } = await beforeRequest(options) + const { opts, url } = await beforeRequest(options); const requestInit: ReqInit = { redirect: 'follow', ...opts, - body: getValidRequestBody(opts) - } + body: getValidRequestBody(opts), + }; - let request = new Request(url, requestInit) + let request = new Request(url, requestInit); for (const fn of interceptors.request.fns) { if (fn) { - request = await fn(request, opts) + request = await fn(request, opts); } } // fetch must be assigned here, otherwise it would throw the error: // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation - const _fetch = opts.fetch! - let response: Response + const _fetch = opts.fetch!; + let response: Response; try { - response = await _fetch(request) + response = await _fetch(request); } catch (error) { // Handle fetch exceptions (AbortError, network errors, etc.) - let finalError = error + let finalError = error; for (const fn of interceptors.error.fns) { if (fn) { - finalError = (await fn(error, undefined as any, request, opts)) as unknown + finalError = (await fn( + error, + undefined as any, + request, + opts, + )) as unknown; } } - finalError = finalError || ({} as unknown) + finalError = finalError || ({} as unknown); if (opts.throwOnError) { - throw finalError + throw finalError; } // Return error response @@ -111,79 +126,82 @@ export const createClient = (config: Config = {}): Client => { : { error: finalError, request, - response: undefined as any - } + response: undefined as any, + }; } for (const fn of interceptors.response.fns) { if (fn) { - response = await fn(response, request, opts) + response = await fn(response, request, opts); } } const result = { request, - response - } + response, + }; if (response.ok) { const parseAs = (opts.parseAs === 'auto' ? getParseAs(response.headers.get('Content-Type')) - : opts.parseAs) ?? 'json' + : opts.parseAs) ?? 'json'; - if (response.status === 204 || response.headers.get('Content-Length') === '0') { - let emptyData: any + if ( + response.status === 204 || + response.headers.get('Content-Length') === '0' + ) { + let emptyData: any; switch (parseAs) { case 'arrayBuffer': case 'blob': case 'text': - emptyData = await response[parseAs]() - break + emptyData = await response[parseAs](); + break; case 'formData': - emptyData = new FormData() - break + emptyData = new FormData(); + break; case 'stream': - emptyData = response.body - break + emptyData = response.body; + break; case 'json': default: - emptyData = {} - break + emptyData = {}; + break; } return opts.responseStyle === 'data' ? emptyData : { data: emptyData, - ...result - } + ...result, + }; } - let data: any + let data: any; switch (parseAs) { case 'arrayBuffer': case 'blob': case 'formData': case 'json': case 'text': - data = await response[parseAs]() - break + data = await response[parseAs](); + break; case 'stream': return opts.responseStyle === 'data' ? response.body : { data: response.body, - ...result - } + ...result, + }; } if (parseAs === 'json') { if (opts.responseValidator) { - await opts.responseValidator(data) + await opts.responseValidator(data); } if (opts.responseTransformer) { - data = await opts.responseTransformer(data) + data = await opts.responseTransformer(data); } } @@ -191,32 +209,32 @@ export const createClient = (config: Config = {}): Client => { ? data : { data, - ...result - } + ...result, + }; } - const textError = await response.text() - let jsonError: unknown + const textError = await response.text(); + let jsonError: unknown; try { - jsonError = JSON.parse(textError) + jsonError = JSON.parse(textError); } catch { // noop } - const error = jsonError ?? textError - let finalError = error + const error = jsonError ?? textError; + let finalError = error; for (const fn of interceptors.error.fns) { if (fn) { - finalError = (await fn(error, response, request, opts)) as string + finalError = (await fn(error, response, request, opts)) as string; } } - finalError = finalError || ({} as string) + finalError = finalError || ({} as string); if (opts.throwOnError) { - throw finalError + throw finalError; } // TODO: we probably want to return error and improve types @@ -224,32 +242,34 @@ export const createClient = (config: Config = {}): Client => { ? undefined : { error: finalError, - ...result - } - } - - const makeMethodFn = (method: Uppercase) => (options: RequestOptions) => - request({ ...options, method }) - - const makeSseFn = (method: Uppercase) => async (options: RequestOptions) => { - const { opts, url } = await beforeRequest(options) - return createSseClient({ - ...opts, - body: opts.body as BodyInit | null | undefined, - headers: opts.headers as unknown as Record, - method, - onRequest: async (url, init) => { - let request = new Request(url, init) - for (const fn of interceptors.request.fns) { - if (fn) { - request = await fn(request, opts) + ...result, + }; + }; + + const makeMethodFn = + (method: Uppercase) => (options: RequestOptions) => + request({ ...options, method }); + + const makeSseFn = + (method: Uppercase) => async (options: RequestOptions) => { + const { opts, url } = await beforeRequest(options); + return createSseClient({ + ...opts, + body: opts.body as BodyInit | null | undefined, + headers: opts.headers as unknown as Record, + method, + onRequest: async (url, init) => { + let request = new Request(url, init); + for (const fn of interceptors.request.fns) { + if (fn) { + request = await fn(request, opts); + } } - } - return request - }, - url - }) - } + return request; + }, + url, + }); + }; return { buildUrl, @@ -274,8 +294,8 @@ export const createClient = (config: Config = {}): Client => { patch: makeSseFn('PATCH'), post: makeSseFn('POST'), put: makeSseFn('PUT'), - trace: makeSseFn('TRACE') + trace: makeSseFn('TRACE'), }, - trace: makeMethodFn('TRACE') - } as Client -} + trace: makeMethodFn('TRACE'), + } as Client; +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/client/index.ts b/examples/openapi-ts-pinia-colada/src/client/client/index.ts index 13cdecb802..b295edeca0 100644 --- a/examples/openapi-ts-pinia-colada/src/client/client/index.ts +++ b/examples/openapi-ts-pinia-colada/src/client/client/index.ts @@ -1,15 +1,15 @@ // This file is auto-generated by @hey-api/openapi-ts -export type { Auth } from '../core/auth.gen' -export type { QuerySerializerOptions } from '../core/bodySerializer.gen' +export type { Auth } from '../core/auth.gen'; +export type { QuerySerializerOptions } from '../core/bodySerializer.gen'; export { formDataBodySerializer, jsonBodySerializer, - urlSearchParamsBodySerializer -} from '../core/bodySerializer.gen' -export { buildClientParams } from '../core/params.gen' -export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen' -export { createClient } from './client.gen' + urlSearchParamsBodySerializer, +} from '../core/bodySerializer.gen'; +export { buildClientParams } from '../core/params.gen'; +export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen'; +export { createClient } from './client.gen'; export type { Client, ClientOptions, @@ -20,6 +20,6 @@ export type { RequestResult, ResolvedRequestOptions, ResponseStyle, - TDataShape -} from './types.gen' -export { createConfig, mergeHeaders } from './utils.gen' + TDataShape, +} from './types.gen'; +export { createConfig, mergeHeaders } from './utils.gen'; diff --git a/examples/openapi-ts-pinia-colada/src/client/client/types.gen.ts b/examples/openapi-ts-pinia-colada/src/client/client/types.gen.ts index 7ebb04c8c4..d2a28bc810 100644 --- a/examples/openapi-ts-pinia-colada/src/client/client/types.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/client/types.gen.ts @@ -1,33 +1,38 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { Auth } from '../core/auth.gen' -import type { ServerSentEventsOptions, ServerSentEventsResult } from '../core/serverSentEvents.gen' -import type { Client as CoreClient, Config as CoreConfig } from '../core/types.gen' -import type { Middleware } from './utils.gen' - -export type ResponseStyle = 'data' | 'fields' +import type { Auth } from '../core/auth.gen'; +import type { + ServerSentEventsOptions, + ServerSentEventsResult, +} from '../core/serverSentEvents.gen'; +import type { + Client as CoreClient, + Config as CoreConfig, +} from '../core/types.gen'; +import type { Middleware } from './utils.gen'; + +export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ - baseUrl?: T['baseUrl'] + baseUrl?: T['baseUrl']; /** * Fetch API implementation. You can use this option to provide a custom * fetch instance. * * @default globalThis.fetch */ - fetch?: typeof fetch + fetch?: typeof fetch; /** * Please don't use the Fetch client for Next.js applications. The `next` * options won't have any effect. * * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead. */ - next?: never + next?: never; /** * Return the response data parsed in a specified format. By default, `auto` * will infer the appropriate method from the `Content-Type` response header. @@ -36,29 +41,38 @@ export interface Config * * @default 'auto' */ - parseAs?: 'arrayBuffer' | 'auto' | 'blob' | 'formData' | 'json' | 'stream' | 'text' + parseAs?: + | 'arrayBuffer' + | 'auto' + | 'blob' + | 'formData' + | 'json' + | 'stream' + | 'text'; /** * Should we return only data or multiple fields (data, error, response, etc.)? * * @default 'fields' */ - responseStyle?: ResponseStyle + responseStyle?: ResponseStyle; /** * Throw an error instead of returning it in the response? * * @default false */ - throwOnError?: T['throwOnError'] + throwOnError?: T['throwOnError']; } export interface RequestOptions< TData = unknown, TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, - Url extends string = string -> extends Config<{ - responseStyle: TResponseStyle - throwOnError: ThrowOnError + Url extends string = string, +> + extends + Config<{ + responseStyle: TResponseStyle; + throwOnError: ThrowOnError; }>, Pick< ServerSentEventsOptions, @@ -73,29 +87,29 @@ export interface RequestOptions< * * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} */ - body?: unknown - path?: Record - query?: Record + body?: unknown; + path?: Record; + query?: Record; /** * Security mechanism(s) to use for the request. */ - security?: ReadonlyArray - url: Url + security?: ReadonlyArray; + url: Url; } export interface ResolvedRequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, - Url extends string = string + Url extends string = string, > extends RequestOptions { - serializedBody?: string + serializedBody?: string; } export type RequestResult< TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', > = ThrowOnError extends true ? Promise< TResponseStyle extends 'data' @@ -103,77 +117,96 @@ export type RequestResult< ? TData[keyof TData] : TData : { - data: TData extends Record ? TData[keyof TData] : TData - request: Request - response: Response + data: TData extends Record + ? TData[keyof TData] + : TData; + request: Request; + response: Response; } > : Promise< TResponseStyle extends 'data' - ? (TData extends Record ? TData[keyof TData] : TData) | undefined + ? + | (TData extends Record + ? TData[keyof TData] + : TData) + | undefined : ( | { - data: TData extends Record ? TData[keyof TData] : TData - error: undefined + data: TData extends Record + ? TData[keyof TData] + : TData; + error: undefined; } | { - data: undefined - error: TError extends Record ? TError[keyof TError] : TError + data: undefined; + error: TError extends Record + ? TError[keyof TError] + : TError; } ) & { - request: Request - response: Response + request: Request; + response: Response; } - > + >; export interface ClientOptions { - baseUrl?: string - responseStyle?: ResponseStyle - throwOnError?: boolean + baseUrl?: string; + responseStyle?: ResponseStyle; + throwOnError?: boolean; } type MethodFn = < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', >( - options: Omit, 'method'> -) => RequestResult + options: Omit, 'method'>, +) => RequestResult; type SseFn = < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', >( - options: Omit, 'method'> -) => Promise> + options: Omit, 'method'>, +) => Promise>; type RequestFn = < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', >( options: Omit, 'method'> & - Pick>, 'method'> -) => RequestResult + Pick< + Required>, + 'method' + >, +) => RequestResult; type BuildUrlFn = < TData extends { - body?: unknown - path?: Record - query?: Record - url: string - } + body?: unknown; + path?: Record; + query?: Record; + url: string; + }, >( - options: TData & Options -) => string - -export type Client = CoreClient & { - interceptors: Middleware -} + options: TData & Options, +) => string; + +export type Client = CoreClient< + RequestFn, + Config, + MethodFn, + BuildUrlFn, + SseFn +> & { + interceptors: Middleware; +}; /** * The `createClientConfig()` function will be called on client initialization @@ -184,26 +217,26 @@ export type Client = CoreClient * to ensure your client always has the correct values. */ export type CreateClientConfig = ( - override?: Config -) => Config & T> + override?: Config, +) => Config & T>; export interface TDataShape { - body?: unknown - headers?: unknown - path?: unknown - query?: unknown - url: string + body?: unknown; + headers?: unknown; + path?: unknown; + query?: unknown; + url: string; } -type OmitKeys = Pick> +type OmitKeys = Pick>; export type Options< TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', > = OmitKeys< RequestOptions, 'body' | 'path' | 'query' | 'url' > & - ([TData] extends [never] ? unknown : Omit) + ([TData] extends [never] ? unknown : Omit); diff --git a/examples/openapi-ts-pinia-colada/src/client/client/utils.gen.ts b/examples/openapi-ts-pinia-colada/src/client/client/utils.gen.ts index ca2b3164a1..89416454b6 100644 --- a/examples/openapi-ts-pinia-colada/src/client/client/utils.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/client/utils.gen.ts @@ -1,31 +1,36 @@ // This file is auto-generated by @hey-api/openapi-ts -import { getAuthToken } from '../core/auth.gen' -import type { QuerySerializerOptions } from '../core/bodySerializer.gen' -import { jsonBodySerializer } from '../core/bodySerializer.gen' +import { getAuthToken } from '../core/auth.gen'; +import type { QuerySerializerOptions } from '../core/bodySerializer.gen'; +import { jsonBodySerializer } from '../core/bodySerializer.gen'; import { serializeArrayParam, serializeObjectParam, - serializePrimitiveParam -} from '../core/pathSerializer.gen' -import { getUrl } from '../core/utils.gen' -import type { Client, ClientOptions, Config, RequestOptions } from './types.gen' + serializePrimitiveParam, +} from '../core/pathSerializer.gen'; +import { getUrl } from '../core/utils.gen'; +import type { + Client, + ClientOptions, + Config, + RequestOptions, +} from './types.gen'; export const createQuerySerializer = ({ parameters = {}, ...args }: QuerySerializerOptions = {}) => { const querySerializer = (queryParams: T) => { - const search: string[] = [] + const search: string[] = []; if (queryParams && typeof queryParams === 'object') { for (const name in queryParams) { - const value = queryParams[name] + const value = queryParams[name]; if (value === undefined || value === null) { - continue + continue; } - const options = parameters[name] || args + const options = parameters[name] || args; if (Array.isArray(value)) { const serializedArray = serializeArrayParam({ @@ -34,9 +39,9 @@ export const createQuerySerializer = ({ name, style: 'form', value, - ...options.array - }) - if (serializedArray) search.push(serializedArray) + ...options.array, + }); + if (serializedArray) search.push(serializedArray); } else if (typeof value === 'object') { const serializedObject = serializeObjectParam({ allowReserved: options.allowReserved, @@ -44,117 +49,124 @@ export const createQuerySerializer = ({ name, style: 'deepObject', value: value as Record, - ...options.object - }) - if (serializedObject) search.push(serializedObject) + ...options.object, + }); + if (serializedObject) search.push(serializedObject); } else { const serializedPrimitive = serializePrimitiveParam({ allowReserved: options.allowReserved, name, - value: value as string - }) - if (serializedPrimitive) search.push(serializedPrimitive) + value: value as string, + }); + if (serializedPrimitive) search.push(serializedPrimitive); } } } - return search.join('&') - } - return querySerializer -} + return search.join('&'); + }; + return querySerializer; +}; /** * Infers parseAs value from provided Content-Type header. */ -export const getParseAs = (contentType: string | null): Exclude => { +export const getParseAs = ( + contentType: string | null, +): Exclude => { if (!contentType) { // If no Content-Type header is provided, the best we can do is return the raw response body, // which is effectively the same as the 'stream' option. - return 'stream' + return 'stream'; } - const cleanContent = contentType.split(';')[0]?.trim() + const cleanContent = contentType.split(';')[0]?.trim(); if (!cleanContent) { - return + return; } - if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) { - return 'json' + if ( + cleanContent.startsWith('application/json') || + cleanContent.endsWith('+json') + ) { + return 'json'; } if (cleanContent === 'multipart/form-data') { - return 'formData' + return 'formData'; } if ( - ['application/', 'audio/', 'image/', 'video/'].some((type) => cleanContent.startsWith(type)) + ['application/', 'audio/', 'image/', 'video/'].some((type) => + cleanContent.startsWith(type), + ) ) { - return 'blob' + return 'blob'; } if (cleanContent.startsWith('text/')) { - return 'text' + return 'text'; } - return -} + return; +}; const checkForExistence = ( options: Pick & { - headers: Headers + headers: Headers; }, - name?: string + name?: string, ): boolean => { if (!name) { - return false + return false; } if ( options.headers.has(name) || options.query?.[name] || options.headers.get('Cookie')?.includes(`${name}=`) ) { - return true + return true; } - return false -} + return false; +}; export const setAuthParams = async ({ security, ...options }: Pick, 'security'> & Pick & { - headers: Headers + headers: Headers; }) => { for (const auth of security) { if (checkForExistence(options, auth.name)) { - continue + continue; } - const token = await getAuthToken(auth, options.auth) + const token = await getAuthToken(auth, options.auth); if (!token) { - continue + continue; } - const name = auth.name ?? 'Authorization' + const name = auth.name ?? 'Authorization'; switch (auth.in) { case 'query': if (!options.query) { - options.query = {} + options.query = {}; } - options.query[name] = token - break + options.query[name] = token; + break; case 'cookie': - options.headers.append('Cookie', `${name}=${token}`) - break + options.headers.append('Cookie', `${name}=${token}`); + break; case 'header': default: - options.headers.set(name, token) - break + options.headers.set(name, token); + break; } } -} +}; export const buildUrl: Client['buildUrl'] = (options) => getUrl({ @@ -165,117 +177,126 @@ export const buildUrl: Client['buildUrl'] = (options) => typeof options.querySerializer === 'function' ? options.querySerializer : createQuerySerializer(options.querySerializer), - url: options.url - }) + url: options.url, + }); export const mergeConfigs = (a: Config, b: Config): Config => { - const config = { ...a, ...b } + const config = { ...a, ...b }; if (config.baseUrl?.endsWith('/')) { - config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1) + config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1); } - config.headers = mergeHeaders(a.headers, b.headers) - return config -} + config.headers = mergeHeaders(a.headers, b.headers); + return config; +}; const headersEntries = (headers: Headers): Array<[string, string]> => { - const entries: Array<[string, string]> = [] + const entries: Array<[string, string]> = []; headers.forEach((value, key) => { - entries.push([key, value]) - }) - return entries -} + entries.push([key, value]); + }); + return entries; +}; export const mergeHeaders = ( ...headers: Array['headers'] | undefined> ): Headers => { - const mergedHeaders = new Headers() + const mergedHeaders = new Headers(); for (const header of headers) { if (!header) { - continue + continue; } - const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header) + const iterator = + header instanceof Headers + ? headersEntries(header) + : Object.entries(header); for (const [key, value] of iterator) { if (value === null) { - mergedHeaders.delete(key) + mergedHeaders.delete(key); } else if (Array.isArray(value)) { for (const v of value) { - mergedHeaders.append(key, v as string) + mergedHeaders.append(key, v as string); } } else if (value !== undefined) { // assume object headers are meant to be JSON stringified, i.e. their // content value in OpenAPI specification is 'application/json' mergedHeaders.set( key, - typeof value === 'object' ? JSON.stringify(value) : (value as string) - ) + typeof value === 'object' ? JSON.stringify(value) : (value as string), + ); } } } - return mergedHeaders -} + return mergedHeaders; +}; type ErrInterceptor = ( error: Err, response: Res, request: Req, - options: Options -) => Err | Promise + options: Options, +) => Err | Promise; -type ReqInterceptor = (request: Req, options: Options) => Req | Promise +type ReqInterceptor = ( + request: Req, + options: Options, +) => Req | Promise; type ResInterceptor = ( response: Res, request: Req, - options: Options -) => Res | Promise + options: Options, +) => Res | Promise; class Interceptors { - fns: Array = [] + fns: Array = []; clear(): void { - this.fns = [] + this.fns = []; } eject(id: number | Interceptor): void { - const index = this.getInterceptorIndex(id) + const index = this.getInterceptorIndex(id); if (this.fns[index]) { - this.fns[index] = null + this.fns[index] = null; } } exists(id: number | Interceptor): boolean { - const index = this.getInterceptorIndex(id) - return Boolean(this.fns[index]) + const index = this.getInterceptorIndex(id); + return Boolean(this.fns[index]); } getInterceptorIndex(id: number | Interceptor): number { if (typeof id === 'number') { - return this.fns[id] ? id : -1 + return this.fns[id] ? id : -1; } - return this.fns.indexOf(id) + return this.fns.indexOf(id); } - update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false { - const index = this.getInterceptorIndex(id) + update( + id: number | Interceptor, + fn: Interceptor, + ): number | Interceptor | false { + const index = this.getInterceptorIndex(id); if (this.fns[index]) { - this.fns[index] = fn - return id + this.fns[index] = fn; + return id; } - return false + return false; } use(fn: Interceptor): number { - this.fns.push(fn) - return this.fns.length - 1 + this.fns.push(fn); + return this.fns.length - 1; } } export interface Middleware { - error: Interceptors> - request: Interceptors> - response: Interceptors> + error: Interceptors>; + request: Interceptors>; + response: Interceptors>; } export const createInterceptors = (): Middleware< @@ -286,31 +307,31 @@ export const createInterceptors = (): Middleware< > => ({ error: new Interceptors>(), request: new Interceptors>(), - response: new Interceptors>() -}) + response: new Interceptors>(), +}); const defaultQuerySerializer = createQuerySerializer({ allowReserved: false, array: { explode: true, - style: 'form' + style: 'form', }, object: { explode: true, - style: 'deepObject' - } -}) + style: 'deepObject', + }, +}); const defaultHeaders = { - 'Content-Type': 'application/json' -} + 'Content-Type': 'application/json', +}; export const createConfig = ( - override: Config & T> = {} + override: Config & T> = {}, ): Config & T> => ({ ...jsonBodySerializer, headers: defaultHeaders, parseAs: 'auto', querySerializer: defaultQuerySerializer, - ...override -}) + ...override, +}); diff --git a/examples/openapi-ts-pinia-colada/src/client/core/auth.gen.ts b/examples/openapi-ts-pinia-colada/src/client/core/auth.gen.ts index dc8ff61977..f8a73266f9 100644 --- a/examples/openapi-ts-pinia-colada/src/client/core/auth.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/core/auth.gen.ts @@ -1,6 +1,6 @@ // This file is auto-generated by @hey-api/openapi-ts -export type AuthToken = string | undefined +export type AuthToken = string | undefined; export interface Auth { /** @@ -8,34 +8,35 @@ export interface Auth { * * @default 'header' */ - in?: 'header' | 'query' | 'cookie' + in?: 'header' | 'query' | 'cookie'; /** * Header or query parameter name. * * @default 'Authorization' */ - name?: string - scheme?: 'basic' | 'bearer' - type: 'apiKey' | 'http' + name?: string; + scheme?: 'basic' | 'bearer'; + type: 'apiKey' | 'http'; } export const getAuthToken = async ( auth: Auth, - callback: ((auth: Auth) => Promise | AuthToken) | AuthToken + callback: ((auth: Auth) => Promise | AuthToken) | AuthToken, ): Promise => { - const token = typeof callback === 'function' ? await callback(auth) : callback + const token = + typeof callback === 'function' ? await callback(auth) : callback; if (!token) { - return + return; } if (auth.scheme === 'bearer') { - return `Bearer ${token}` + return `Bearer ${token}`; } if (auth.scheme === 'basic') { - return `Basic ${btoa(token)}` + return `Basic ${btoa(token)}`; } - return token -} + return token; +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/core/bodySerializer.gen.ts b/examples/openapi-ts-pinia-colada/src/client/core/bodySerializer.gen.ts index 09ffeb02af..552b50f7c8 100644 --- a/examples/openapi-ts-pinia-colada/src/client/core/bodySerializer.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/core/bodySerializer.gen.ts @@ -1,84 +1,100 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen' +import type { + ArrayStyle, + ObjectStyle, + SerializerOptions, +} from './pathSerializer.gen'; -export type QuerySerializer = (query: Record) => string +export type QuerySerializer = (query: Record) => string; -export type BodySerializer = (body: any) => any +export type BodySerializer = (body: any) => any; type QuerySerializerOptionsObject = { - allowReserved?: boolean - array?: Partial> - object?: Partial> -} + allowReserved?: boolean; + array?: Partial>; + object?: Partial>; +}; export type QuerySerializerOptions = QuerySerializerOptionsObject & { /** * Per-parameter serialization overrides. When provided, these settings * override the global array/object settings for specific parameter names. */ - parameters?: Record -} + parameters?: Record; +}; -const serializeFormDataPair = (data: FormData, key: string, value: unknown): void => { +const serializeFormDataPair = ( + data: FormData, + key: string, + value: unknown, +): void => { if (typeof value === 'string' || value instanceof Blob) { - data.append(key, value) + data.append(key, value); } else if (value instanceof Date) { - data.append(key, value.toISOString()) + data.append(key, value.toISOString()); } else { - data.append(key, JSON.stringify(value)) + data.append(key, JSON.stringify(value)); } -} +}; -const serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => { +const serializeUrlSearchParamsPair = ( + data: URLSearchParams, + key: string, + value: unknown, +): void => { if (typeof value === 'string') { - data.append(key, value) + data.append(key, value); } else { - data.append(key, JSON.stringify(value)) + data.append(key, JSON.stringify(value)); } -} +}; export const formDataBodySerializer = { bodySerializer: | Array>>( - body: T + body: T, ): FormData => { - const data = new FormData() + const data = new FormData(); Object.entries(body).forEach(([key, value]) => { if (value === undefined || value === null) { - return + return; } if (Array.isArray(value)) { - value.forEach((v) => serializeFormDataPair(data, key, v)) + value.forEach((v) => serializeFormDataPair(data, key, v)); } else { - serializeFormDataPair(data, key, value) + serializeFormDataPair(data, key, value); } - }) + }); - return data - } -} + return data; + }, +}; export const jsonBodySerializer = { bodySerializer: (body: T): string => - JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)) -} + JSON.stringify(body, (_key, value) => + typeof value === 'bigint' ? value.toString() : value, + ), +}; export const urlSearchParamsBodySerializer = { - bodySerializer: | Array>>(body: T): string => { - const data = new URLSearchParams() + bodySerializer: | Array>>( + body: T, + ): string => { + const data = new URLSearchParams(); Object.entries(body).forEach(([key, value]) => { if (value === undefined || value === null) { - return + return; } if (Array.isArray(value)) { - value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)) + value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); } else { - serializeUrlSearchParamsPair(data, key, value) + serializeUrlSearchParamsPair(data, key, value); } - }) + }); - return data.toString() - } -} + return data.toString(); + }, +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/core/params.gen.ts b/examples/openapi-ts-pinia-colada/src/client/core/params.gen.ts index 356b25dfc8..602715c46c 100644 --- a/examples/openapi-ts-pinia-colada/src/client/core/params.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/core/params.gen.ts @@ -1,70 +1,70 @@ // This file is auto-generated by @hey-api/openapi-ts -type Slot = 'body' | 'headers' | 'path' | 'query' +type Slot = 'body' | 'headers' | 'path' | 'query'; export type Field = | { - in: Exclude + in: Exclude; /** * Field name. This is the name we want the user to see and use. */ - key: string + key: string; /** * Field mapped name. This is the name we want to use in the request. * If omitted, we use the same value as `key`. */ - map?: string + map?: string; } | { - in: Extract + in: Extract; /** * Key isn't required for bodies. */ - key?: string - map?: string + key?: string; + map?: string; } | { /** * Field name. This is the name we want the user to see and use. */ - key: string + key: string; /** * Field mapped name. This is the name we want to use in the request. * If `in` is omitted, `map` aliases `key` to the transport layer. */ - map: Slot - } + map: Slot; + }; export interface Fields { - allowExtra?: Partial> - args?: ReadonlyArray + allowExtra?: Partial>; + args?: ReadonlyArray; } -export type FieldsConfig = ReadonlyArray +export type FieldsConfig = ReadonlyArray; const extraPrefixesMap: Record = { $body_: 'body', $headers_: 'headers', $path_: 'path', - $query_: 'query' -} -const extraPrefixes = Object.entries(extraPrefixesMap) + $query_: 'query', +}; +const extraPrefixes = Object.entries(extraPrefixesMap); type KeyMap = Map< string, | { - in: Slot - map?: string + in: Slot; + map?: string; } | { - in?: never - map: Slot + in?: never; + map: Slot; } -> +>; const buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => { if (!map) { - map = new Map() + map = new Map(); } for (const config of fields) { @@ -72,89 +72,96 @@ const buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => { if (config.key) { map.set(config.key, { in: config.in, - map: config.map - }) + map: config.map, + }); } } else if ('key' in config) { map.set(config.key, { - map: config.map - }) + map: config.map, + }); } else if (config.args) { - buildKeyMap(config.args, map) + buildKeyMap(config.args, map); } } - return map -} + return map; +}; interface Params { - body: unknown - headers: Record - path: Record - query: Record + body: unknown; + headers: Record; + path: Record; + query: Record; } const stripEmptySlots = (params: Params) => { for (const [slot, value] of Object.entries(params)) { if (value && typeof value === 'object' && !Object.keys(value).length) { - delete params[slot as Slot] + delete params[slot as Slot]; } } -} +}; -export const buildClientParams = (args: ReadonlyArray, fields: FieldsConfig) => { +export const buildClientParams = ( + args: ReadonlyArray, + fields: FieldsConfig, +) => { const params: Params = { body: {}, headers: {}, path: {}, - query: {} - } + query: {}, + }; - const map = buildKeyMap(fields) + const map = buildKeyMap(fields); - let config: FieldsConfig[number] | undefined + let config: FieldsConfig[number] | undefined; for (const [index, arg] of args.entries()) { if (fields[index]) { - config = fields[index] + config = fields[index]; } if (!config) { - continue + continue; } if ('in' in config) { if (config.key) { - const field = map.get(config.key)! - const name = field.map || config.key + const field = map.get(config.key)!; + const name = field.map || config.key; if (field.in) { - ;(params[field.in] as Record)[name] = arg + (params[field.in] as Record)[name] = arg; } } else { - params.body = arg + params.body = arg; } } else { for (const [key, value] of Object.entries(arg ?? {})) { - const field = map.get(key) + const field = map.get(key); if (field) { if (field.in) { - const name = field.map || key - ;(params[field.in] as Record)[name] = value + const name = field.map || key; + (params[field.in] as Record)[name] = value; } else { - params[field.map] = value + params[field.map] = value; } } else { - const extra = extraPrefixes.find(([prefix]) => key.startsWith(prefix)) + const extra = extraPrefixes.find(([prefix]) => + key.startsWith(prefix), + ); if (extra) { - const [prefix, slot] = extra - ;(params[slot] as Record)[key.slice(prefix.length)] = value + const [prefix, slot] = extra; + (params[slot] as Record)[ + key.slice(prefix.length) + ] = value; } else if ('allowExtra' in config && config.allowExtra) { for (const [slot, allowed] of Object.entries(config.allowExtra)) { if (allowed) { - ;(params[slot as Slot] as Record)[key] = value - break + (params[slot as Slot] as Record)[key] = value; + break; } } } @@ -163,7 +170,7 @@ export const buildClientParams = (args: ReadonlyArray, fields: FieldsCo } } - stripEmptySlots(params) + stripEmptySlots(params); - return params -} + return params; +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-pinia-colada/src/client/core/pathSerializer.gen.ts index acc13672ee..4241e0a078 100644 --- a/examples/openapi-ts-pinia-colada/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/core/pathSerializer.gen.ts @@ -1,128 +1,131 @@ // This file is auto-generated by @hey-api/openapi-ts -interface SerializeOptions extends SerializePrimitiveOptions, SerializerOptions {} +interface SerializeOptions + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { - allowReserved?: boolean - name: string + allowReserved?: boolean; + name: string; } export interface SerializerOptions { /** * @default true */ - explode: boolean - style: T + explode: boolean; + style: T; } -export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited' -export type ArraySeparatorStyle = ArrayStyle | MatrixStyle -type MatrixStyle = 'label' | 'matrix' | 'simple' -export type ObjectStyle = 'form' | 'deepObject' -type ObjectSeparatorStyle = ObjectStyle | MatrixStyle +export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; +export type ArraySeparatorStyle = ArrayStyle | MatrixStyle; +type MatrixStyle = 'label' | 'matrix' | 'simple'; +export type ObjectStyle = 'form' | 'deepObject'; +type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; interface SerializePrimitiveParam extends SerializePrimitiveOptions { - value: string + value: string; } export const separatorArrayExplode = (style: ArraySeparatorStyle) => { switch (style) { case 'label': - return '.' + return '.'; case 'matrix': - return ';' + return ';'; case 'simple': - return ',' + return ','; default: - return '&' + return '&'; } -} +}; export const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { switch (style) { case 'form': - return ',' + return ','; case 'pipeDelimited': - return '|' + return '|'; case 'spaceDelimited': - return '%20' + return '%20'; default: - return ',' + return ','; } -} +}; export const separatorObjectExplode = (style: ObjectSeparatorStyle) => { switch (style) { case 'label': - return '.' + return '.'; case 'matrix': - return ';' + return ';'; case 'simple': - return ',' + return ','; default: - return '&' + return '&'; } -} +}; export const serializeArrayParam = ({ allowReserved, explode, name, style, - value + value, }: SerializeOptions & { - value: unknown[] + value: unknown[]; }) => { if (!explode) { const joinedValues = ( allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) - ).join(separatorArrayNoExplode(style)) + ).join(separatorArrayNoExplode(style)); switch (style) { case 'label': - return `.${joinedValues}` + return `.${joinedValues}`; case 'matrix': - return `;${name}=${joinedValues}` + return `;${name}=${joinedValues}`; case 'simple': - return joinedValues + return joinedValues; default: - return `${name}=${joinedValues}` + return `${name}=${joinedValues}`; } } - const separator = separatorArrayExplode(style) + const separator = separatorArrayExplode(style); const joinedValues = value .map((v) => { if (style === 'label' || style === 'simple') { - return allowReserved ? v : encodeURIComponent(v as string) + return allowReserved ? v : encodeURIComponent(v as string); } return serializePrimitiveParam({ allowReserved, name, - value: v as string - }) + value: v as string, + }); }) - .join(separator) - return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues -} + .join(separator); + return style === 'label' || style === 'matrix' + ? separator + joinedValues + : joinedValues; +}; export const serializePrimitiveParam = ({ allowReserved, name, - value + value, }: SerializePrimitiveParam) => { if (value === undefined || value === null) { - return '' + return ''; } if (typeof value === 'object') { throw new Error( - 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.' - ) + 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', + ); } - return `${name}=${allowReserved ? value : encodeURIComponent(value)}` -} + return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; +}; export const serializeObjectParam = ({ allowReserved, @@ -130,42 +133,48 @@ export const serializeObjectParam = ({ name, style, value, - valueOnly + valueOnly, }: SerializeOptions & { - value: Record | Date - valueOnly?: boolean + value: Record | Date; + valueOnly?: boolean; }) => { if (value instanceof Date) { - return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}` + return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`; } if (style !== 'deepObject' && !explode) { - let values: string[] = [] + let values: string[] = []; Object.entries(value).forEach(([key, v]) => { - values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)] - }) - const joinedValues = values.join(',') + values = [ + ...values, + key, + allowReserved ? (v as string) : encodeURIComponent(v as string), + ]; + }); + const joinedValues = values.join(','); switch (style) { case 'form': - return `${name}=${joinedValues}` + return `${name}=${joinedValues}`; case 'label': - return `.${joinedValues}` + return `.${joinedValues}`; case 'matrix': - return `;${name}=${joinedValues}` + return `;${name}=${joinedValues}`; default: - return joinedValues + return joinedValues; } } - const separator = separatorObjectExplode(style) + const separator = separatorObjectExplode(style); const joinedValues = Object.entries(value) .map(([key, v]) => serializePrimitiveParam({ allowReserved, name: style === 'deepObject' ? `${name}[${key}]` : key, - value: v as string - }) + value: v as string, + }), ) - .join(separator) - return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues -} + .join(separator); + return style === 'label' || style === 'matrix' + ? separator + joinedValues + : joinedValues; +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/core/queryKeySerializer.gen.ts b/examples/openapi-ts-pinia-colada/src/client/core/queryKeySerializer.gen.ts index 7e9d0d1ec8..d3bb68396e 100644 --- a/examples/openapi-ts-pinia-colada/src/client/core/queryKeySerializer.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/core/queryKeySerializer.gen.ts @@ -9,109 +9,128 @@ export type JsonValue = | number | boolean | JsonValue[] - | { [key: string]: JsonValue } + | { [key: string]: JsonValue }; /** * Replacer that converts non-JSON values (bigint, Date, etc.) to safe substitutes. */ export const queryKeyJsonReplacer = (_key: string, value: unknown) => { - if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { - return undefined + if ( + value === undefined || + typeof value === 'function' || + typeof value === 'symbol' + ) { + return undefined; } if (typeof value === 'bigint') { - return value.toString() + return value.toString(); } if (value instanceof Date) { - return value.toISOString() + return value.toISOString(); } - return value -} + return value; +}; /** * Safely stringifies a value and parses it back into a JsonValue. */ export const stringifyToJsonValue = (input: unknown): JsonValue | undefined => { try { - const json = JSON.stringify(input, queryKeyJsonReplacer) + const json = JSON.stringify(input, queryKeyJsonReplacer); if (json === undefined) { - return undefined + return undefined; } - return JSON.parse(json) as JsonValue + return JSON.parse(json) as JsonValue; } catch { - return undefined + return undefined; } -} +}; /** * Detects plain objects (including objects with a null prototype). */ const isPlainObject = (value: unknown): value is Record => { if (value === null || typeof value !== 'object') { - return false + return false; } - const prototype = Object.getPrototypeOf(value as object) - return prototype === Object.prototype || prototype === null -} + const prototype = Object.getPrototypeOf(value as object); + return prototype === Object.prototype || prototype === null; +}; /** * Turns URLSearchParams into a sorted JSON object for deterministic keys. */ const serializeSearchParams = (params: URLSearchParams): JsonValue => { - const entries = Array.from(params.entries()).sort(([a], [b]) => a.localeCompare(b)) - const result: Record = {} + const entries = Array.from(params.entries()).sort(([a], [b]) => + a.localeCompare(b), + ); + const result: Record = {}; for (const [key, value] of entries) { - const existing = result[key] + const existing = result[key]; if (existing === undefined) { - result[key] = value - continue + result[key] = value; + continue; } if (Array.isArray(existing)) { - ;(existing as string[]).push(value) + (existing as string[]).push(value); } else { - result[key] = [existing, value] + result[key] = [existing, value]; } } - return result -} + return result; +}; /** * Normalizes any accepted value into a JSON-friendly shape for query keys. */ -export const serializeQueryKeyValue = (value: unknown): JsonValue | undefined => { +export const serializeQueryKeyValue = ( + value: unknown, +): JsonValue | undefined => { if (value === null) { - return null + return null; } - if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { - return value + if ( + typeof value === 'string' || + typeof value === 'number' || + typeof value === 'boolean' + ) { + return value; } - if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { - return undefined + if ( + value === undefined || + typeof value === 'function' || + typeof value === 'symbol' + ) { + return undefined; } if (typeof value === 'bigint') { - return value.toString() + return value.toString(); } if (value instanceof Date) { - return value.toISOString() + return value.toISOString(); } if (Array.isArray(value)) { - return stringifyToJsonValue(value) + return stringifyToJsonValue(value); } - if (typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams) { - return serializeSearchParams(value) + if ( + typeof URLSearchParams !== 'undefined' && + value instanceof URLSearchParams + ) { + return serializeSearchParams(value); } if (isPlainObject(value)) { - return stringifyToJsonValue(value) + return stringifyToJsonValue(value); } - return undefined -} + return undefined; +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/core/serverSentEvents.gen.ts b/examples/openapi-ts-pinia-colada/src/client/core/serverSentEvents.gen.ts index fa6a2fb66b..343d25af80 100644 --- a/examples/openapi-ts-pinia-colada/src/client/core/serverSentEvents.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/core/serverSentEvents.gen.ts @@ -1,8 +1,11 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { Config } from './types.gen' +import type { Config } from './types.gen'; -export type ServerSentEventsOptions = Omit & +export type ServerSentEventsOptions = Omit< + RequestInit, + 'method' +> & Pick & { /** * Fetch API implementation. You can use this option to provide a custom @@ -10,11 +13,11 @@ export type ServerSentEventsOptions = Omit Promise + onRequest?: (url: string, init: RequestInit) => Promise; /** * Callback invoked when a network or parsing error occurs during streaming. * @@ -22,7 +25,7 @@ export type ServerSentEventsOptions = Omit void + onSseError?: (error: unknown) => void; /** * Callback invoked when an event is streamed from the server. * @@ -31,8 +34,8 @@ export type ServerSentEventsOptions = Omit) => void - serializedBody?: RequestInit['body'] + onSseEvent?: (event: StreamEvent) => void; + serializedBody?: RequestInit['body']; /** * Default retry delay in milliseconds. * @@ -40,11 +43,11 @@ export type ServerSentEventsOptions = Omit = Omit Promise - url: string - } + sseSleepFn?: (ms: number) => Promise; + url: string; + }; export interface StreamEvent { - data: TData - event?: string - id?: string - retry?: number + data: TData; + event?: string; + id?: string; + retry?: number; } -export type ServerSentEventsResult = { +export type ServerSentEventsResult< + TData = unknown, + TReturn = void, + TNext = unknown, +> = { stream: AsyncGenerator< TData extends Record ? TData[keyof TData] : TData, TReturn, TNext - > -} + >; +}; export const createSseClient = ({ onRequest, @@ -92,27 +99,29 @@ export const createSseClient = ({ url, ...options }: ServerSentEventsOptions): ServerSentEventsResult => { - let lastEventId: string | undefined + let lastEventId: string | undefined; - const sleep = sseSleepFn ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms))) + const sleep = + sseSleepFn ?? + ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms))); const createStream = async function* () { - let retryDelay: number = sseDefaultRetryDelay ?? 3000 - let attempt = 0 - const signal = options.signal ?? new AbortController().signal + let retryDelay: number = sseDefaultRetryDelay ?? 3000; + let attempt = 0; + const signal = options.signal ?? new AbortController().signal; while (true) { - if (signal.aborted) break + if (signal.aborted) break; - attempt++ + attempt++; const headers = options.headers instanceof Headers ? options.headers - : new Headers(options.headers as Record | undefined) + : new Headers(options.headers as Record | undefined); if (lastEventId !== undefined) { - headers.set('Last-Event-ID', lastEventId) + headers.set('Last-Event-ID', lastEventId); } try { @@ -121,86 +130,94 @@ export const createSseClient = ({ ...options, body: options.serializedBody, headers, - signal - } - let request = new Request(url, requestInit) + signal, + }; + let request = new Request(url, requestInit); if (onRequest) { - request = await onRequest(url, requestInit) + request = await onRequest(url, requestInit); } // fetch must be assigned here, otherwise it would throw the error: // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation - const _fetch = options.fetch ?? globalThis.fetch - const response = await _fetch(request) + const _fetch = options.fetch ?? globalThis.fetch; + const response = await _fetch(request); - if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`) + if (!response.ok) + throw new Error( + `SSE failed: ${response.status} ${response.statusText}`, + ); - if (!response.body) throw new Error('No body in SSE response') + if (!response.body) throw new Error('No body in SSE response'); - const reader = response.body.pipeThrough(new TextDecoderStream()).getReader() + const reader = response.body + .pipeThrough(new TextDecoderStream()) + .getReader(); - let buffer = '' + let buffer = ''; const abortHandler = () => { try { - reader.cancel() + reader.cancel(); } catch { // noop } - } + }; - signal.addEventListener('abort', abortHandler) + signal.addEventListener('abort', abortHandler); try { while (true) { - const { done, value } = await reader.read() - if (done) break - buffer += value + const { done, value } = await reader.read(); + if (done) break; + buffer += value; // Normalize line endings: CRLF -> LF, then CR -> LF - buffer = buffer.replace(/\r\n/g, '\n').replace(/\r/g, '\n') + buffer = buffer.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); - const chunks = buffer.split('\n\n') - buffer = chunks.pop() ?? '' + const chunks = buffer.split('\n\n'); + buffer = chunks.pop() ?? ''; for (const chunk of chunks) { - const lines = chunk.split('\n') - const dataLines: Array = [] - let eventName: string | undefined + const lines = chunk.split('\n'); + const dataLines: Array = []; + let eventName: string | undefined; for (const line of lines) { if (line.startsWith('data:')) { - dataLines.push(line.replace(/^data:\s*/, '')) + dataLines.push(line.replace(/^data:\s*/, '')); } else if (line.startsWith('event:')) { - eventName = line.replace(/^event:\s*/, '') + eventName = line.replace(/^event:\s*/, ''); } else if (line.startsWith('id:')) { - lastEventId = line.replace(/^id:\s*/, '') + lastEventId = line.replace(/^id:\s*/, ''); } else if (line.startsWith('retry:')) { - const parsed = Number.parseInt(line.replace(/^retry:\s*/, ''), 10) + const parsed = Number.parseInt( + line.replace(/^retry:\s*/, ''), + 10, + ); if (!Number.isNaN(parsed)) { - retryDelay = parsed + retryDelay = parsed; } } } - let data: unknown - let parsedJson = false + let data: unknown; + let parsedJson = false; if (dataLines.length) { - const rawData = dataLines.join('\n') + const rawData = dataLines.join('\n'); try { - data = JSON.parse(rawData) - parsedJson = true + data = JSON.parse(rawData); + parsedJson = true; } catch { - data = rawData + data = rawData; } } if (parsedJson) { if (responseValidator) { - await responseValidator(data) + await responseValidator(data); } if (responseTransformer) { - data = await responseTransformer(data) + data = await responseTransformer(data); } } @@ -208,36 +225,42 @@ export const createSseClient = ({ data, event: eventName, id: lastEventId, - retry: retryDelay - }) + retry: retryDelay, + }); if (dataLines.length) { - yield data as any + yield data as any; } } } } finally { - signal.removeEventListener('abort', abortHandler) - reader.releaseLock() + signal.removeEventListener('abort', abortHandler); + reader.releaseLock(); } - break // exit loop on normal completion + break; // exit loop on normal completion } catch (error) { // connection failed or aborted; retry after delay - onSseError?.(error) + onSseError?.(error); - if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) { - break // stop after firing error + if ( + sseMaxRetryAttempts !== undefined && + attempt >= sseMaxRetryAttempts + ) { + break; // stop after firing error } // exponential backoff: double retry each attempt, cap at 30s - const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000) - await sleep(backoff) + const backoff = Math.min( + retryDelay * 2 ** (attempt - 1), + sseMaxRetryDelay ?? 30000, + ); + await sleep(backoff); } } - } + }; - const stream = createStream() + const stream = createStream(); - return { stream } -} + return { stream }; +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/core/types.gen.ts b/examples/openapi-ts-pinia-colada/src/client/core/types.gen.ts index 647ffcc493..643c070c9d 100644 --- a/examples/openapi-ts-pinia-colada/src/client/core/types.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/core/types.gen.ts @@ -1,7 +1,11 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { Auth, AuthToken } from './auth.gen' -import type { BodySerializer, QuerySerializer, QuerySerializerOptions } from './bodySerializer.gen' +import type { Auth, AuthToken } from './auth.gen'; +import type { + BodySerializer, + QuerySerializer, + QuerySerializerOptions, +} from './bodySerializer.gen'; export type HttpMethod = | 'connect' @@ -12,37 +16,39 @@ export type HttpMethod = | 'patch' | 'post' | 'put' - | 'trace' + | 'trace'; export type Client< RequestFn = never, Config = unknown, MethodFn = never, BuildUrlFn = never, - SseFn = never + SseFn = never, > = { /** * Returns the final request URL. */ - buildUrl: BuildUrlFn - getConfig: () => Config - request: RequestFn - setConfig: (config: Config) => Config + buildUrl: BuildUrlFn; + getConfig: () => Config; + request: RequestFn; + setConfig: (config: Config) => Config; } & { - [K in HttpMethod]: MethodFn -} & ([SseFn] extends [never] ? { sse?: never } : { sse: { [K in HttpMethod]: SseFn } }) + [K in HttpMethod]: MethodFn; +} & ([SseFn] extends [never] + ? { sse?: never } + : { sse: { [K in HttpMethod]: SseFn } }); export interface Config { /** * Auth token or a function returning auth token. The resolved value will be * added to the request payload as defined by its `security` array. */ - auth?: ((auth: Auth) => Promise | AuthToken) | AuthToken + auth?: ((auth: Auth) => Promise | AuthToken) | AuthToken; /** * A function for serializing request body parameter. By default, * {@link JSON.stringify()} will be used. */ - bodySerializer?: BodySerializer | null + bodySerializer?: BodySerializer | null; /** * An object containing any HTTP headers that you want to pre-populate your * `Headers` object with. @@ -53,14 +59,20 @@ export interface Config { | RequestInit['headers'] | Record< string, - string | number | boolean | (string | number | boolean)[] | null | undefined | unknown - > + | string + | number + | boolean + | (string | number | boolean)[] + | null + | undefined + | unknown + >; /** * The request method. * * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} */ - method?: Uppercase + method?: Uppercase; /** * A function for serializing request query parameters. By default, arrays * will be exploded in form style, objects will be exploded in deepObject @@ -71,24 +83,24 @@ export interface Config { * * {@link https://swagger.io/docs/specification/serialization/#query View examples} */ - querySerializer?: QuerySerializer | QuerySerializerOptions + querySerializer?: QuerySerializer | QuerySerializerOptions; /** * A function validating request data. This is useful if you want to ensure * the request conforms to the desired shape, so it can be safely sent to * the server. */ - requestValidator?: (data: unknown) => Promise + requestValidator?: (data: unknown) => Promise; /** * A function transforming response data before it's returned. This is useful * for post-processing data, e.g. converting ISO strings into Date objects. */ - responseTransformer?: (data: unknown) => Promise + responseTransformer?: (data: unknown) => Promise; /** * A function validating response data. This is useful if you want to ensure * the response conforms to the desired shape, so it can be safely passed to * the transformers and returned to the user. */ - responseValidator?: (data: unknown) => Promise + responseValidator?: (data: unknown) => Promise; } type IsExactlyNeverOrNeverUndefined = [T] extends [never] @@ -97,8 +109,10 @@ type IsExactlyNeverOrNeverUndefined = [T] extends [never] ? [undefined] extends [T] ? false : true - : false + : false; export type OmitNever> = { - [K in keyof T as IsExactlyNeverOrNeverUndefined extends true ? never : K]: T[K] -} + [K in keyof T as IsExactlyNeverOrNeverUndefined extends true + ? never + : K]: T[K]; +}; diff --git a/examples/openapi-ts-pinia-colada/src/client/core/utils.gen.ts b/examples/openapi-ts-pinia-colada/src/client/core/utils.gen.ts index bd078be240..0b5389d089 100644 --- a/examples/openapi-ts-pinia-colada/src/client/core/utils.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/core/utils.gen.ts @@ -1,51 +1,54 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { BodySerializer, QuerySerializer } from './bodySerializer.gen' +import type { BodySerializer, QuerySerializer } from './bodySerializer.gen'; import { type ArraySeparatorStyle, serializeArrayParam, serializeObjectParam, - serializePrimitiveParam -} from './pathSerializer.gen' + serializePrimitiveParam, +} from './pathSerializer.gen'; export interface PathSerializer { - path: Record - url: string + path: Record; + url: string; } -export const PATH_PARAM_RE = /\{[^{}]+\}/g +export const PATH_PARAM_RE = /\{[^{}]+\}/g; export const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { - let url = _url - const matches = _url.match(PATH_PARAM_RE) + let url = _url; + const matches = _url.match(PATH_PARAM_RE); if (matches) { for (const match of matches) { - let explode = false - let name = match.substring(1, match.length - 1) - let style: ArraySeparatorStyle = 'simple' + let explode = false; + let name = match.substring(1, match.length - 1); + let style: ArraySeparatorStyle = 'simple'; if (name.endsWith('*')) { - explode = true - name = name.substring(0, name.length - 1) + explode = true; + name = name.substring(0, name.length - 1); } if (name.startsWith('.')) { - name = name.substring(1) - style = 'label' + name = name.substring(1); + style = 'label'; } else if (name.startsWith(';')) { - name = name.substring(1) - style = 'matrix' + name = name.substring(1); + style = 'matrix'; } - const value = path[name] + const value = path[name]; if (value === undefined || value === null) { - continue + continue; } if (Array.isArray(value)) { - url = url.replace(match, serializeArrayParam({ explode, name, style, value })) - continue + url = url.replace( + match, + serializeArrayParam({ explode, name, style, value }), + ); + continue; } if (typeof value === 'object') { @@ -56,10 +59,10 @@ export const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { name, style, value: value as Record, - valueOnly: true - }) - ) - continue + valueOnly: true, + }), + ); + continue; } if (style === 'matrix') { @@ -67,74 +70,74 @@ export const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { match, `;${serializePrimitiveParam({ name, - value: value as string - })}` - ) - continue + value: value as string, + })}`, + ); + continue; } const replaceValue = encodeURIComponent( - style === 'label' ? `.${value as string}` : (value as string) - ) - url = url.replace(match, replaceValue) + style === 'label' ? `.${value as string}` : (value as string), + ); + url = url.replace(match, replaceValue); } } - return url -} + return url; +}; export const getUrl = ({ baseUrl, path, query, querySerializer, - url: _url + url: _url, }: { - baseUrl?: string - path?: Record - query?: Record - querySerializer: QuerySerializer - url: string + baseUrl?: string; + path?: Record; + query?: Record; + querySerializer: QuerySerializer; + url: string; }) => { - const pathUrl = _url.startsWith('/') ? _url : `/${_url}` - let url = (baseUrl ?? '') + pathUrl + const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; + let url = (baseUrl ?? '') + pathUrl; if (path) { - url = defaultPathSerializer({ path, url }) + url = defaultPathSerializer({ path, url }); } - let search = query ? querySerializer(query) : '' + let search = query ? querySerializer(query) : ''; if (search.startsWith('?')) { - search = search.substring(1) + search = search.substring(1); } if (search) { - url += `?${search}` + url += `?${search}`; } - return url -} + return url; +}; export function getValidRequestBody(options: { - body?: unknown - bodySerializer?: BodySerializer | null - serializedBody?: unknown + body?: unknown; + bodySerializer?: BodySerializer | null; + serializedBody?: unknown; }) { - const hasBody = options.body !== undefined - const isSerializedBody = hasBody && options.bodySerializer + const hasBody = options.body !== undefined; + const isSerializedBody = hasBody && options.bodySerializer; if (isSerializedBody) { if ('serializedBody' in options) { const hasSerializedBody = - options.serializedBody !== undefined && options.serializedBody !== '' + options.serializedBody !== undefined && options.serializedBody !== ''; - return hasSerializedBody ? options.serializedBody : null + return hasSerializedBody ? options.serializedBody : null; } // not all clients implement a serializedBody property (i.e. client-axios) - return options.body !== '' ? options.body : null + return options.body !== '' ? options.body : null; } // plain/text body if (hasBody) { - return options.body + return options.body; } // no body was provided - return undefined + return undefined; } diff --git a/examples/openapi-ts-pinia-colada/src/client/index.ts b/examples/openapi-ts-pinia-colada/src/client/index.ts index 3da5084b1e..89bd58a328 100644 --- a/examples/openapi-ts-pinia-colada/src/client/index.ts +++ b/examples/openapi-ts-pinia-colada/src/client/index.ts @@ -20,8 +20,8 @@ export { updatePetMutation, updatePetWithFormMutation, updateUserMutation, - uploadFileMutation -} from './@pinia/colada.gen' + uploadFileMutation, +} from './@pinia/colada.gen'; export { addPet, createUser, @@ -42,8 +42,8 @@ export { updatePet, updatePetWithForm, updateUser, - uploadFile -} from './sdk.gen' + uploadFile, +} from './sdk.gen'; export type { AddPetData, AddPetErrors, @@ -124,5 +124,5 @@ export type { UploadFileResponse, UploadFileResponses, User, - UserArray -} from './types.gen' + UserArray, +} from './types.gen'; diff --git a/examples/openapi-ts-pinia-colada/src/client/schemas.gen.ts b/examples/openapi-ts-pinia-colada/src/client/schemas.gen.ts index 872554d20a..646632e830 100644 --- a/examples/openapi-ts-pinia-colada/src/client/schemas.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/schemas.gen.ts @@ -3,186 +3,186 @@ export const OrderSchema = { properties: { complete: { - type: 'boolean' + type: 'boolean', }, id: { example: 10, format: 'int64', - type: 'integer' + type: 'integer', }, petId: { example: 198772, format: 'int64', - type: 'integer' + type: 'integer', }, quantity: { example: 7, format: 'int32', - type: 'integer' + type: 'integer', }, shipDate: { format: 'date-time', - type: 'string' + type: 'string', }, status: { description: 'Order Status', enum: ['placed', 'approved', 'delivered'], example: 'approved', - type: 'string' - } + type: 'string', + }, }, type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.Order', xml: { - name: 'order' - } -} as const + name: 'order', + }, +} as const; export const CategorySchema = { properties: { id: { example: 1, format: 'int64', - type: 'integer' + type: 'integer', }, name: { example: 'Dogs', - type: 'string' - } + type: 'string', + }, }, type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.Category', xml: { - name: 'category' - } -} as const + name: 'category', + }, +} as const; export const UserSchema = { properties: { email: { example: 'john@email.com', - type: 'string' + type: 'string', }, firstName: { example: 'John', - type: 'string' + type: 'string', }, id: { example: 10, format: 'int64', - type: 'integer' + type: 'integer', }, lastName: { example: 'James', - type: 'string' + type: 'string', }, password: { example: '12345', - type: 'string' + type: 'string', }, phone: { example: '12345', - type: 'string' + type: 'string', }, userStatus: { description: 'User Status', example: 1, format: 'int32', - type: 'integer' + type: 'integer', }, username: { example: 'theUser', - type: 'string' - } + type: 'string', + }, }, type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.User', xml: { - name: 'user' - } -} as const + name: 'user', + }, +} as const; export const TagSchema = { properties: { id: { format: 'int64', - type: 'integer' + type: 'integer', }, name: { - type: 'string' - } + type: 'string', + }, }, type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.Tag', xml: { - name: 'tag' - } -} as const + name: 'tag', + }, +} as const; export const PetSchema = { properties: { category: { - $ref: '#/components/schemas/Category' + $ref: '#/components/schemas/Category', }, id: { example: 10, format: 'int64', - type: 'integer' + type: 'integer', }, name: { example: 'doggie', - type: 'string' + type: 'string', }, photoUrls: { items: { type: 'string', xml: { - name: 'photoUrl' - } + name: 'photoUrl', + }, }, type: 'array', xml: { - wrapped: true - } + wrapped: true, + }, }, status: { description: 'pet status in the store', enum: ['available', 'pending', 'sold'], - type: 'string' + type: 'string', }, tags: { items: { - $ref: '#/components/schemas/Tag' + $ref: '#/components/schemas/Tag', }, type: 'array', xml: { - wrapped: true - } - } + wrapped: true, + }, + }, }, required: ['name', 'photoUrls'], type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.Pet', xml: { - name: 'pet' - } -} as const + name: 'pet', + }, +} as const; export const ApiResponseSchema = { properties: { code: { format: 'int32', - type: 'integer' + type: 'integer', }, message: { - type: 'string' + type: 'string', }, type: { - type: 'string' - } + type: 'string', + }, }, type: 'object', xml: { - name: '##default' - } -} as const + name: '##default', + }, +} as const; diff --git a/examples/openapi-ts-pinia-colada/src/client/sdk.gen.ts b/examples/openapi-ts-pinia-colada/src/client/sdk.gen.ts index da443221ab..522d457571 100644 --- a/examples/openapi-ts-pinia-colada/src/client/sdk.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/sdk.gen.ts @@ -1,7 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { Client, Options as Options2, TDataShape } from './client' -import { client } from './client.gen' +import type { Client, Options as Options2, TDataShape } from './client'; +import { client } from './client.gen'; import type { AddPetData, AddPetErrors, @@ -59,25 +59,25 @@ import type { UpdateUserResponses, UploadFileData, UploadFileErrors, - UploadFileResponses -} from './types.gen' + UploadFileResponses, +} from './types.gen'; export type Options< TData extends TDataShape = TDataShape, - ThrowOnError extends boolean = boolean + ThrowOnError extends boolean = boolean, > = Options2 & { /** * You can provide a client instance returned by `createClient()` instead of * individual options. This might be also useful if you want to implement a * custom client. */ - client?: Client + client?: Client; /** * You can pass arbitrary values through the `meta` object. This can be * used to access values that aren't defined as part of the SDK function. */ - meta?: Record -} + meta?: Record; +}; /** * Add a new pet to the store. @@ -85,7 +85,7 @@ export type Options< * Add a new pet to the store. */ export const addPet = ( - options: Options + options: Options, ) => (options.client ?? client).post({ security: [{ scheme: 'bearer', type: 'http' }], @@ -93,9 +93,9 @@ export const addPet = ( ...options, headers: { 'Content-Type': 'application/json', - ...options.headers - } - }) + ...options.headers, + }, + }); /** * Update an existing pet. @@ -103,17 +103,21 @@ export const addPet = ( * Update an existing pet by Id. */ export const updatePet = ( - options: Options + options: Options, ) => - (options.client ?? client).put({ + (options.client ?? client).put< + UpdatePetResponses, + UpdatePetErrors, + ThrowOnError + >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet', ...options, headers: { 'Content-Type': 'application/json', - ...options.headers - } - }) + ...options.headers, + }, + }); /** * Finds Pets by status. @@ -121,13 +125,17 @@ export const updatePet = ( * Multiple status values can be provided with comma separated strings. */ export const findPetsByStatus = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + FindPetsByStatusResponses, + FindPetsByStatusErrors, + ThrowOnError + >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/findByStatus', - ...options - }) + ...options, + }); /** * Finds Pets by tags. @@ -135,13 +143,17 @@ export const findPetsByStatus = ( * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. */ export const findPetsByTags = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + FindPetsByTagsResponses, + FindPetsByTagsErrors, + ThrowOnError + >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/findByTags', - ...options - }) + ...options, + }); /** * Deletes a pet. @@ -149,13 +161,17 @@ export const findPetsByTags = ( * Delete a pet. */ export const deletePet = ( - options: Options + options: Options, ) => - (options.client ?? client).delete({ + (options.client ?? client).delete< + DeletePetResponses, + DeletePetErrors, + ThrowOnError + >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/{petId}', - ...options - }) + ...options, + }); /** * Find pet by ID. @@ -163,16 +179,20 @@ export const deletePet = ( * Returns a single pet. */ export const getPetById = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + GetPetByIdResponses, + GetPetByIdErrors, + ThrowOnError + >({ security: [ { name: 'api_key', type: 'apiKey' }, - { scheme: 'bearer', type: 'http' } + { scheme: 'bearer', type: 'http' }, ], url: '/pet/{petId}', - ...options - }) + ...options, + }); /** * Updates a pet in the store with form data. @@ -180,7 +200,7 @@ export const getPetById = ( * Updates a pet resource based on the form data. */ export const updatePetWithForm = ( - options: Options + options: Options, ) => (options.client ?? client).post< UpdatePetWithFormResponses, @@ -189,8 +209,8 @@ export const updatePetWithForm = ( >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/{petId}', - ...options - }) + ...options, + }); /** * Uploads an image. @@ -198,18 +218,22 @@ export const updatePetWithForm = ( * Upload image of the pet. */ export const uploadFile = ( - options: Options + options: Options, ) => - (options.client ?? client).post({ + (options.client ?? client).post< + UploadFileResponses, + UploadFileErrors, + ThrowOnError + >({ bodySerializer: null, security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/{petId}/uploadImage', ...options, headers: { 'Content-Type': 'application/octet-stream', - ...options.headers - } - }) + ...options.headers, + }, + }); /** * Returns pet inventories by status. @@ -217,13 +241,17 @@ export const uploadFile = ( * Returns a map of status codes to quantities. */ export const getInventory = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).get({ + (options?.client ?? client).get< + GetInventoryResponses, + GetInventoryErrors, + ThrowOnError + >({ security: [{ name: 'api_key', type: 'apiKey' }], url: '/store/inventory', - ...options - }) + ...options, + }); /** * Place an order for a pet. @@ -231,16 +259,20 @@ export const getInventory = ( * Place a new order in the store. */ export const placeOrder = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).post({ + (options?.client ?? client).post< + PlaceOrderResponses, + PlaceOrderErrors, + ThrowOnError + >({ url: '/store/order', ...options, headers: { 'Content-Type': 'application/json', - ...options?.headers - } - }) + ...options?.headers, + }, + }); /** * Delete purchase order by identifier. @@ -248,12 +280,16 @@ export const placeOrder = ( * For valid response try integer IDs with value < 1000. Anything above 1000 or non-integers will generate API errors. */ export const deleteOrder = ( - options: Options + options: Options, ) => - (options.client ?? client).delete({ + (options.client ?? client).delete< + DeleteOrderResponses, + DeleteOrderErrors, + ThrowOnError + >({ url: '/store/order/{orderId}', - ...options - }) + ...options, + }); /** * Find purchase order by ID. @@ -261,12 +297,16 @@ export const deleteOrder = ( * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. */ export const getOrderById = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + GetOrderByIdResponses, + GetOrderByIdErrors, + ThrowOnError + >({ url: '/store/order/{orderId}', - ...options - }) + ...options, + }); /** * Create user. @@ -274,16 +314,20 @@ export const getOrderById = ( * This can only be done by the logged in user. */ export const createUser = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).post({ + (options?.client ?? client).post< + CreateUserResponses, + CreateUserErrors, + ThrowOnError + >({ url: '/user', ...options, headers: { 'Content-Type': 'application/json', - ...options?.headers - } - }) + ...options?.headers, + }, + }); /** * Creates list of users with given input array. @@ -291,7 +335,7 @@ export const createUser = ( * Creates list of users with given input array. */ export const createUsersWithListInput = ( - options?: Options + options?: Options, ) => (options?.client ?? client).post< CreateUsersWithListInputResponses, @@ -302,9 +346,9 @@ export const createUsersWithListInput = ( ...options, headers: { 'Content-Type': 'application/json', - ...options?.headers - } - }) + ...options?.headers, + }, + }); /** * Logs user into the system. @@ -312,12 +356,16 @@ export const createUsersWithListInput = ( * Log into the system. */ export const loginUser = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).get({ + (options?.client ?? client).get< + LoginUserResponses, + LoginUserErrors, + ThrowOnError + >({ url: '/user/login', - ...options - }) + ...options, + }); /** * Logs out current logged in user session. @@ -325,12 +373,16 @@ export const loginUser = ( * Log user out of the system. */ export const logoutUser = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).get({ + (options?.client ?? client).get< + LogoutUserResponses, + LogoutUserErrors, + ThrowOnError + >({ url: '/user/logout', - ...options - }) + ...options, + }); /** * Delete user resource. @@ -338,12 +390,16 @@ export const logoutUser = ( * This can only be done by the logged in user. */ export const deleteUser = ( - options: Options + options: Options, ) => - (options.client ?? client).delete({ + (options.client ?? client).delete< + DeleteUserResponses, + DeleteUserErrors, + ThrowOnError + >({ url: '/user/{username}', - ...options - }) + ...options, + }); /** * Get user by user name. @@ -351,12 +407,16 @@ export const deleteUser = ( * Get user detail based on username. */ export const getUserByName = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + GetUserByNameResponses, + GetUserByNameErrors, + ThrowOnError + >({ url: '/user/{username}', - ...options - }) + ...options, + }); /** * Update user resource. @@ -364,13 +424,17 @@ export const getUserByName = ( * This can only be done by the logged in user. */ export const updateUser = ( - options: Options + options: Options, ) => - (options.client ?? client).put({ + (options.client ?? client).put< + UpdateUserResponses, + UpdateUserErrors, + ThrowOnError + >({ url: '/user/{username}', ...options, headers: { 'Content-Type': 'application/json', - ...options.headers - } - }) + ...options.headers, + }, + }); diff --git a/examples/openapi-ts-pinia-colada/src/client/types.gen.ts b/examples/openapi-ts-pinia-colada/src/client/types.gen.ts index 99ce8e7d8e..a2e6be0fa4 100644 --- a/examples/openapi-ts-pinia-colada/src/client/types.gen.ts +++ b/examples/openapi-ts-pinia-colada/src/client/types.gen.ts @@ -1,693 +1,699 @@ // This file is auto-generated by @hey-api/openapi-ts export type ClientOptions = { - baseUrl: 'https://petstore3.swagger.io/api/v3' | (string & {}) -} + baseUrl: 'https://petstore3.swagger.io/api/v3' | (string & {}); +}; export type Order = { - complete?: boolean - id?: number - petId?: number - quantity?: number - shipDate?: string + complete?: boolean; + id?: number; + petId?: number; + quantity?: number; + shipDate?: string; /** * Order Status */ - status?: 'placed' | 'approved' | 'delivered' -} + status?: 'placed' | 'approved' | 'delivered'; +}; export type Category = { - id?: number - name?: string -} + id?: number; + name?: string; +}; export type User = { - email?: string - firstName?: string - id?: number - lastName?: string - password?: string - phone?: string + email?: string; + firstName?: string; + id?: number; + lastName?: string; + password?: string; + phone?: string; /** * User Status */ - userStatus?: number - username?: string -} + userStatus?: number; + username?: string; +}; export type Tag = { - id?: number - name?: string -} + id?: number; + name?: string; +}; export type Pet = { - category?: Category - id?: number - name: string - photoUrls: Array + category?: Category; + id?: number; + name: string; + photoUrls: Array; /** * pet status in the store */ - status?: 'available' | 'pending' | 'sold' - tags?: Array -} + status?: 'available' | 'pending' | 'sold'; + tags?: Array; +}; export type ApiResponse = { - code?: number - message?: string - type?: string -} + code?: number; + message?: string; + type?: string; +}; -export type Pet2 = Pet +export type Pet2 = Pet; /** * List of user object */ -export type UserArray = Array +export type UserArray = Array; export type AddPetData = { /** * Create a new pet in the store */ - body: Pet - path?: never - query?: never - url: '/pet' -} + body: Pet; + path?: never; + query?: never; + url: '/pet'; +}; export type AddPetErrors = { /** * Invalid input */ - 400: unknown + 400: unknown; /** * Validation exception */ - 422: unknown + 422: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type AddPetResponses = { /** * Successful operation */ - 200: Pet -} + 200: Pet; +}; -export type AddPetResponse = AddPetResponses[keyof AddPetResponses] +export type AddPetResponse = AddPetResponses[keyof AddPetResponses]; export type UpdatePetData = { /** * Update an existent pet in the store */ - body: Pet - path?: never - query?: never - url: '/pet' -} + body: Pet; + path?: never; + query?: never; + url: '/pet'; +}; export type UpdatePetErrors = { /** * Invalid ID supplied */ - 400: unknown + 400: unknown; /** * Pet not found */ - 404: unknown + 404: unknown; /** * Validation exception */ - 422: unknown + 422: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type UpdatePetResponses = { /** * Successful operation */ - 200: Pet -} + 200: Pet; +}; -export type UpdatePetResponse = UpdatePetResponses[keyof UpdatePetResponses] +export type UpdatePetResponse = UpdatePetResponses[keyof UpdatePetResponses]; export type FindPetsByStatusData = { - body?: never - path?: never + body?: never; + path?: never; query: { /** * Status values that need to be considered for filter */ - status: 'available' | 'pending' | 'sold' - } - url: '/pet/findByStatus' -} + status: 'available' | 'pending' | 'sold'; + }; + url: '/pet/findByStatus'; +}; export type FindPetsByStatusErrors = { /** * Invalid status value */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type FindPetsByStatusResponses = { /** * successful operation */ - 200: Array -} + 200: Array; +}; -export type FindPetsByStatusResponse = FindPetsByStatusResponses[keyof FindPetsByStatusResponses] +export type FindPetsByStatusResponse = + FindPetsByStatusResponses[keyof FindPetsByStatusResponses]; export type FindPetsByTagsData = { - body?: never - path?: never + body?: never; + path?: never; query: { /** * Tags to filter by */ - tags: Array - } - url: '/pet/findByTags' -} + tags: Array; + }; + url: '/pet/findByTags'; +}; export type FindPetsByTagsErrors = { /** * Invalid tag value */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type FindPetsByTagsResponses = { /** * successful operation */ - 200: Array -} + 200: Array; +}; -export type FindPetsByTagsResponse = FindPetsByTagsResponses[keyof FindPetsByTagsResponses] +export type FindPetsByTagsResponse = + FindPetsByTagsResponses[keyof FindPetsByTagsResponses]; export type DeletePetData = { - body?: never + body?: never; headers?: { - api_key?: string - } + api_key?: string; + }; path: { /** * Pet id to delete */ - petId: number - } - query?: never - url: '/pet/{petId}' -} + petId: number; + }; + query?: never; + url: '/pet/{petId}'; +}; export type DeletePetErrors = { /** * Invalid pet value */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type DeletePetResponses = { /** * Pet deleted */ - 200: unknown -} + 200: unknown; +}; export type GetPetByIdData = { - body?: never + body?: never; path: { /** * ID of pet to return */ - petId: number - } - query?: never - url: '/pet/{petId}' -} + petId: number; + }; + query?: never; + url: '/pet/{petId}'; +}; export type GetPetByIdErrors = { /** * Invalid ID supplied */ - 400: unknown + 400: unknown; /** * Pet not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type GetPetByIdResponses = { /** * successful operation */ - 200: Pet -} + 200: Pet; +}; -export type GetPetByIdResponse = GetPetByIdResponses[keyof GetPetByIdResponses] +export type GetPetByIdResponse = GetPetByIdResponses[keyof GetPetByIdResponses]; export type UpdatePetWithFormData = { - body?: never + body?: never; path: { /** * ID of pet that needs to be updated */ - petId: number - } + petId: number; + }; query?: { /** * Name of pet that needs to be updated */ - name?: string + name?: string; /** * Status of pet that needs to be updated */ - status?: string - } - url: '/pet/{petId}' -} + status?: string; + }; + url: '/pet/{petId}'; +}; export type UpdatePetWithFormErrors = { /** * Invalid input */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type UpdatePetWithFormResponses = { /** * successful operation */ - 200: Pet -} + 200: Pet; +}; -export type UpdatePetWithFormResponse = UpdatePetWithFormResponses[keyof UpdatePetWithFormResponses] +export type UpdatePetWithFormResponse = + UpdatePetWithFormResponses[keyof UpdatePetWithFormResponses]; export type UploadFileData = { - body?: Blob | File + body?: Blob | File; path: { /** * ID of pet to update */ - petId: number - } + petId: number; + }; query?: { /** * Additional Metadata */ - additionalMetadata?: string - } - url: '/pet/{petId}/uploadImage' -} + additionalMetadata?: string; + }; + url: '/pet/{petId}/uploadImage'; +}; export type UploadFileErrors = { /** * No file uploaded */ - 400: unknown + 400: unknown; /** * Pet not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type UploadFileResponses = { /** * successful operation */ - 200: ApiResponse -} + 200: ApiResponse; +}; -export type UploadFileResponse = UploadFileResponses[keyof UploadFileResponses] +export type UploadFileResponse = UploadFileResponses[keyof UploadFileResponses]; export type GetInventoryData = { - body?: never - path?: never - query?: never - url: '/store/inventory' -} + body?: never; + path?: never; + query?: never; + url: '/store/inventory'; +}; export type GetInventoryErrors = { /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type GetInventoryResponses = { /** * successful operation */ 200: { - [key: string]: number - } -} + [key: string]: number; + }; +}; -export type GetInventoryResponse = GetInventoryResponses[keyof GetInventoryResponses] +export type GetInventoryResponse = + GetInventoryResponses[keyof GetInventoryResponses]; export type PlaceOrderData = { - body?: Order - path?: never - query?: never - url: '/store/order' -} + body?: Order; + path?: never; + query?: never; + url: '/store/order'; +}; export type PlaceOrderErrors = { /** * Invalid input */ - 400: unknown + 400: unknown; /** * Validation exception */ - 422: unknown + 422: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type PlaceOrderResponses = { /** * successful operation */ - 200: Order -} + 200: Order; +}; -export type PlaceOrderResponse = PlaceOrderResponses[keyof PlaceOrderResponses] +export type PlaceOrderResponse = PlaceOrderResponses[keyof PlaceOrderResponses]; export type DeleteOrderData = { - body?: never + body?: never; path: { /** * ID of the order that needs to be deleted */ - orderId: number - } - query?: never - url: '/store/order/{orderId}' -} + orderId: number; + }; + query?: never; + url: '/store/order/{orderId}'; +}; export type DeleteOrderErrors = { /** * Invalid ID supplied */ - 400: unknown + 400: unknown; /** * Order not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type DeleteOrderResponses = { /** * order deleted */ - 200: unknown -} + 200: unknown; +}; export type GetOrderByIdData = { - body?: never + body?: never; path: { /** * ID of order that needs to be fetched */ - orderId: number - } - query?: never - url: '/store/order/{orderId}' -} + orderId: number; + }; + query?: never; + url: '/store/order/{orderId}'; +}; export type GetOrderByIdErrors = { /** * Invalid ID supplied */ - 400: unknown + 400: unknown; /** * Order not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type GetOrderByIdResponses = { /** * successful operation */ - 200: Order -} + 200: Order; +}; -export type GetOrderByIdResponse = GetOrderByIdResponses[keyof GetOrderByIdResponses] +export type GetOrderByIdResponse = + GetOrderByIdResponses[keyof GetOrderByIdResponses]; export type CreateUserData = { /** * Created user object */ - body?: User - path?: never - query?: never - url: '/user' -} + body?: User; + path?: never; + query?: never; + url: '/user'; +}; export type CreateUserErrors = { /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type CreateUserResponses = { /** * successful operation */ - 200: User -} + 200: User; +}; -export type CreateUserResponse = CreateUserResponses[keyof CreateUserResponses] +export type CreateUserResponse = CreateUserResponses[keyof CreateUserResponses]; export type CreateUsersWithListInputData = { - body?: Array - path?: never - query?: never - url: '/user/createWithList' -} + body?: Array; + path?: never; + query?: never; + url: '/user/createWithList'; +}; export type CreateUsersWithListInputErrors = { /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type CreateUsersWithListInputResponses = { /** * Successful operation */ - 200: User -} + 200: User; +}; export type CreateUsersWithListInputResponse = - CreateUsersWithListInputResponses[keyof CreateUsersWithListInputResponses] + CreateUsersWithListInputResponses[keyof CreateUsersWithListInputResponses]; export type LoginUserData = { - body?: never - path?: never + body?: never; + path?: never; query?: { /** * The password for login in clear text */ - password?: string + password?: string; /** * The user name for login */ - username?: string - } - url: '/user/login' -} + username?: string; + }; + url: '/user/login'; +}; export type LoginUserErrors = { /** * Invalid username/password supplied */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type LoginUserResponses = { /** * successful operation */ - 200: string -} + 200: string; +}; -export type LoginUserResponse = LoginUserResponses[keyof LoginUserResponses] +export type LoginUserResponse = LoginUserResponses[keyof LoginUserResponses]; export type LogoutUserData = { - body?: never - path?: never - query?: never - url: '/user/logout' -} + body?: never; + path?: never; + query?: never; + url: '/user/logout'; +}; export type LogoutUserErrors = { /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type LogoutUserResponses = { /** * successful operation */ - 200: unknown -} + 200: unknown; +}; export type DeleteUserData = { - body?: never + body?: never; path: { /** * The name that needs to be deleted */ - username: string - } - query?: never - url: '/user/{username}' -} + username: string; + }; + query?: never; + url: '/user/{username}'; +}; export type DeleteUserErrors = { /** * Invalid username supplied */ - 400: unknown + 400: unknown; /** * User not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type DeleteUserResponses = { /** * User deleted */ - 200: unknown -} + 200: unknown; +}; export type GetUserByNameData = { - body?: never + body?: never; path: { /** * The name that needs to be fetched. Use user1 for testing */ - username: string - } - query?: never - url: '/user/{username}' -} + username: string; + }; + query?: never; + url: '/user/{username}'; +}; export type GetUserByNameErrors = { /** * Invalid username supplied */ - 400: unknown + 400: unknown; /** * User not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type GetUserByNameResponses = { /** * successful operation */ - 200: User -} + 200: User; +}; -export type GetUserByNameResponse = GetUserByNameResponses[keyof GetUserByNameResponses] +export type GetUserByNameResponse = + GetUserByNameResponses[keyof GetUserByNameResponses]; export type UpdateUserData = { /** * Update an existent user in the store */ - body?: User + body?: User; path: { /** * name that need to be deleted */ - username: string - } - query?: never - url: '/user/{username}' -} + username: string; + }; + query?: never; + url: '/user/{username}'; +}; export type UpdateUserErrors = { /** * bad request */ - 400: unknown + 400: unknown; /** * user not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type UpdateUserResponses = { /** * successful operation */ - 200: unknown -} + 200: unknown; +}; diff --git a/examples/openapi-ts-pinia-colada/src/main.ts b/examples/openapi-ts-pinia-colada/src/main.ts index e6089600fc..31ddbcb11b 100644 --- a/examples/openapi-ts-pinia-colada/src/main.ts +++ b/examples/openapi-ts-pinia-colada/src/main.ts @@ -1,12 +1,12 @@ -import './assets/main.css' +import './assets/main.css'; -import { PiniaColada } from '@pinia/colada' -import { createPinia } from 'pinia' -import { createApp } from 'vue' +import { PiniaColada } from '@pinia/colada'; +import { createPinia } from 'pinia'; +import { createApp } from 'vue'; -import App from './App.vue' -import { client } from './client/client.gen' -import router from './router' +import App from './App.vue'; +import { client } from './client/client.gen'; +import router from './router'; // configure internal service client client.setConfig({ @@ -14,15 +14,15 @@ client.setConfig({ baseUrl: 'https://petstore3.swagger.io/api/v3', // set default headers for requests headers: { - Authorization: 'Bearer ' - } -}) + Authorization: 'Bearer ', + }, +}); -const app = createApp(App) +const app = createApp(App); -const pinia = createPinia() -app.use(pinia) -app.use(PiniaColada) -app.use(router) +const pinia = createPinia(); +app.use(pinia); +app.use(PiniaColada); +app.use(router); -app.mount('#app') +app.mount('#app'); diff --git a/examples/openapi-ts-pinia-colada/src/router/index.ts b/examples/openapi-ts-pinia-colada/src/router/index.ts index 42ddd585ab..04bff99232 100644 --- a/examples/openapi-ts-pinia-colada/src/router/index.ts +++ b/examples/openapi-ts-pinia-colada/src/router/index.ts @@ -1,6 +1,6 @@ -import { createRouter, createWebHistory } from 'vue-router' +import { createRouter, createWebHistory } from 'vue-router'; -import PiniaColadaExample from '@/views/PiniaColadaExample.vue' +import PiniaColadaExample from '@/views/PiniaColadaExample.vue'; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -8,9 +8,9 @@ const router = createRouter({ { component: PiniaColadaExample, name: 'home', - path: '/' - } - ] -}) + path: '/', + }, + ], +}); -export default router +export default router; diff --git a/examples/openapi-ts-pinia-colada/tailwind.config.ts b/examples/openapi-ts-pinia-colada/tailwind.config.ts index 8cb3cc6c03..4cbe78a030 100644 --- a/examples/openapi-ts-pinia-colada/tailwind.config.ts +++ b/examples/openapi-ts-pinia-colada/tailwind.config.ts @@ -1,9 +1,9 @@ -import type { Config } from 'tailwindcss' +import type { Config } from 'tailwindcss'; export default { content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], plugins: [], theme: { - extend: {} - } -} satisfies Config + extend: {}, + }, +} satisfies Config; diff --git a/examples/openapi-ts-pinia-colada/vite.config.ts b/examples/openapi-ts-pinia-colada/vite.config.ts index 2ad0b17366..8c0aadd9a4 100644 --- a/examples/openapi-ts-pinia-colada/vite.config.ts +++ b/examples/openapi-ts-pinia-colada/vite.config.ts @@ -1,16 +1,16 @@ -import { fileURLToPath, URL } from 'node:url' +import { fileURLToPath, URL } from 'node:url'; -import { createViteConfig } from '@config/vite-base' -import vue from '@vitejs/plugin-vue' -import vueJsx from '@vitejs/plugin-vue-jsx' -import vueDevTools from 'vite-plugin-vue-devtools' +import { createViteConfig } from '@config/vite-base'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import vueDevTools from 'vite-plugin-vue-devtools'; // https://vitejs.dev/config/ export default createViteConfig({ plugins: [vue(), vueJsx(), vueDevTools()], resolve: { alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)) - } - } -}) + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, +}); diff --git a/examples/openapi-ts-pinia-colada/vitest.config.ts b/examples/openapi-ts-pinia-colada/vitest.config.ts index b1c1888c6f..a1ba062bd4 100644 --- a/examples/openapi-ts-pinia-colada/vitest.config.ts +++ b/examples/openapi-ts-pinia-colada/vitest.config.ts @@ -1,16 +1,16 @@ -import { fileURLToPath } from 'node:url' +import { fileURLToPath } from 'node:url'; -import { createVitestConfig } from '@config/vite-base' -import { configDefaults, mergeConfig } from 'vitest/config' +import { createVitestConfig } from '@config/vite-base'; +import { configDefaults, mergeConfig } from 'vitest/config'; -import viteConfig from './vite.config' +import viteConfig from './vite.config'; export default mergeConfig( viteConfig, createVitestConfig(fileURLToPath(new URL('./', import.meta.url)), { test: { environment: 'jsdom', - exclude: [...configDefaults.exclude, 'e2e/**'] - } - }) -) + exclude: [...configDefaults.exclude, 'e2e/**'], + }, + }), +); diff --git a/examples/openapi-ts-tanstack-angular-query-experimental/package.json b/examples/openapi-ts-tanstack-angular-query-experimental/package.json index 44488f1082..a9497e7442 100644 --- a/examples/openapi-ts-tanstack-angular-query-experimental/package.json +++ b/examples/openapi-ts-tanstack-angular-query-experimental/package.json @@ -1,6 +1,7 @@ { "name": "@example/openapi-ts-tanstack-angular-query-experimental", "version": "0.0.28", + "private": true, "scripts": { "ng": "ng", "start": "ng serve", @@ -9,7 +10,6 @@ "openapi-ts": "openapi-ts", "typecheck": "tsc --project tsconfig.app.json --noEmit" }, - "private": true, "dependencies": { "@angular/animations": "^19.2.14", "@angular/cdk": "^19.2.19", diff --git a/examples/openapi-ts-tanstack-angular-query-experimental/src/client/client/types.gen.ts b/examples/openapi-ts-tanstack-angular-query-experimental/src/client/client/types.gen.ts index c7b4e2e12d..06a8ae0223 100644 --- a/examples/openapi-ts-tanstack-angular-query-experimental/src/client/client/types.gen.ts +++ b/examples/openapi-ts-tanstack-angular-query-experimental/src/client/client/types.gen.ts @@ -23,7 +23,8 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, + extends + Omit, Omit { /** * Base URL for all requests made by this client. @@ -71,7 +72,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-tanstack-angular-query-experimental/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-tanstack-angular-query-experimental/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-tanstack-angular-query-experimental/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-tanstack-angular-query-experimental/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-tanstack-react-query/package.json b/examples/openapi-ts-tanstack-react-query/package.json index d227bada8c..ab7258f7f1 100644 --- a/examples/openapi-ts-tanstack-react-query/package.json +++ b/examples/openapi-ts-tanstack-react-query/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-tanstack-react-query", - "private": true, "version": "0.0.39", + "private": true, "type": "module", "scripts": { "build": "tsc && vite build", diff --git a/examples/openapi-ts-tanstack-react-query/src/client/client/types.gen.ts b/examples/openapi-ts-tanstack-react-query/src/client/client/types.gen.ts index b4a499cc03..d2a28bc810 100644 --- a/examples/openapi-ts-tanstack-react-query/src/client/client/types.gen.ts +++ b/examples/openapi-ts-tanstack-react-query/src/client/client/types.gen.ts @@ -14,8 +14,7 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -69,7 +68,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-tanstack-react-query/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-tanstack-react-query/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-tanstack-react-query/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-tanstack-react-query/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-tanstack-svelte-query/package.json b/examples/openapi-ts-tanstack-svelte-query/package.json index bc6fc0ecc0..ec8f6f4234 100644 --- a/examples/openapi-ts-tanstack-svelte-query/package.json +++ b/examples/openapi-ts-tanstack-svelte-query/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-tanstack-svelte-query", - "private": true, "version": "0.0.39", + "private": true, "type": "module", "scripts": { "build": "vite build", diff --git a/examples/openapi-ts-tanstack-svelte-query/src/app.css b/examples/openapi-ts-tanstack-svelte-query/src/app.css index f080f2926d..70b16bed64 100644 --- a/examples/openapi-ts-tanstack-svelte-query/src/app.css +++ b/examples/openapi-ts-tanstack-svelte-query/src/app.css @@ -1,8 +1,9 @@ @import '@fontsource/fira-mono'; :root { - --font-body: Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, - Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + --font-body: + Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, + Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; --font-mono: 'Fira Mono', monospace; --color-bg-0: rgb(202, 216, 228); --color-bg-1: hsl(209, 36%, 86%); @@ -22,7 +23,8 @@ body { background-attachment: fixed; background-color: var(--color-bg-1); background-size: 100vw 100vh; - background-image: radial-gradient( + background-image: + radial-gradient( 50% 50% at 50% 50%, rgba(255, 255, 255, 0.75) 0%, rgba(255, 255, 255, 0) 100% diff --git a/examples/openapi-ts-tanstack-svelte-query/src/client/client/types.gen.ts b/examples/openapi-ts-tanstack-svelte-query/src/client/client/types.gen.ts index b4a499cc03..d2a28bc810 100644 --- a/examples/openapi-ts-tanstack-svelte-query/src/client/client/types.gen.ts +++ b/examples/openapi-ts-tanstack-svelte-query/src/client/client/types.gen.ts @@ -14,8 +14,7 @@ import type { Middleware } from './utils.gen'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -69,7 +68,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/examples/openapi-ts-tanstack-svelte-query/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-tanstack-svelte-query/src/client/core/pathSerializer.gen.ts index 8d99931047..4241e0a078 100644 --- a/examples/openapi-ts-tanstack-svelte-query/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-tanstack-svelte-query/src/client/core/pathSerializer.gen.ts @@ -1,8 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/examples/openapi-ts-tanstack-vue-query/.eslintrc.cjs b/examples/openapi-ts-tanstack-vue-query/.eslintrc.cjs index 491d6ae84f..c5209a31ad 100644 --- a/examples/openapi-ts-tanstack-vue-query/.eslintrc.cjs +++ b/examples/openapi-ts-tanstack-vue-query/.eslintrc.cjs @@ -1,14 +1,14 @@ /* eslint-env node */ -require('@rushstack/eslint-patch/modern-module-resolution') +require('@rushstack/eslint-patch/modern-module-resolution'); module.exports = { extends: [ 'plugin:vue/vue3-essential', 'eslint:recommended', '@vue/eslint-config-typescript', - '@vue/eslint-config-prettier/skip-formatting' + '@vue/eslint-config-prettier/skip-formatting', ], parserOptions: { - ecmaVersion: 'latest' - } -} + ecmaVersion: 'latest', + }, +}; diff --git a/examples/openapi-ts-tanstack-vue-query/.vscode/extensions.json b/examples/openapi-ts-tanstack-vue-query/.vscode/extensions.json index 0449b97dc9..93ea3e7838 100644 --- a/examples/openapi-ts-tanstack-vue-query/.vscode/extensions.json +++ b/examples/openapi-ts-tanstack-vue-query/.vscode/extensions.json @@ -1,3 +1,7 @@ { - "recommendations": ["Vue.volar", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] + "recommendations": [ + "Vue.volar", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] } diff --git a/examples/openapi-ts-tanstack-vue-query/openapi-ts.config.ts b/examples/openapi-ts-tanstack-vue-query/openapi-ts.config.ts index e2fde7eff1..af49f9872b 100644 --- a/examples/openapi-ts-tanstack-vue-query/openapi-ts.config.ts +++ b/examples/openapi-ts-tanstack-vue-query/openapi-ts.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from '@hey-api/openapi-ts' +import { defineConfig } from '@hey-api/openapi-ts'; export default defineConfig({ input: @@ -6,7 +6,7 @@ export default defineConfig({ output: { format: 'prettier', lint: 'eslint', - path: './src/client' + path: './src/client', }, plugins: [ '@hey-api/client-fetch', @@ -14,8 +14,8 @@ export default defineConfig({ '@hey-api/sdk', { enums: 'javascript', - name: '@hey-api/typescript' + name: '@hey-api/typescript', }, - '@tanstack/vue-query' - ] -}) + '@tanstack/vue-query', + ], +}); diff --git a/examples/openapi-ts-tanstack-vue-query/package.json b/examples/openapi-ts-tanstack-vue-query/package.json index c5f1ba5492..a420d65cc1 100644 --- a/examples/openapi-ts-tanstack-vue-query/package.json +++ b/examples/openapi-ts-tanstack-vue-query/package.json @@ -1,7 +1,7 @@ { "name": "@example/openapi-ts-tanstack-vue-query", - "private": true, "version": "0.0.39", + "private": true, "type": "module", "scripts": { "build-only": "vite build", diff --git a/examples/openapi-ts-tanstack-vue-query/postcss.config.js b/examples/openapi-ts-tanstack-vue-query/postcss.config.js index 9ed16a0e80..9eef821c48 100644 --- a/examples/openapi-ts-tanstack-vue-query/postcss.config.js +++ b/examples/openapi-ts-tanstack-vue-query/postcss.config.js @@ -1,6 +1,6 @@ export default { plugins: { autoprefixer: {}, - tailwindcss: {} - } -} + tailwindcss: {}, + }, +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/@tanstack/vue-query.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/@tanstack/vue-query.gen.ts index d3fcf6469b..8c8e69a7e8 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/@tanstack/vue-query.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/@tanstack/vue-query.gen.ts @@ -1,8 +1,12 @@ // This file is auto-generated by @hey-api/openapi-ts -import { type DefaultError, queryOptions, type UseMutationOptions } from '@tanstack/vue-query' +import { + type DefaultError, + queryOptions, + type UseMutationOptions, +} from '@tanstack/vue-query'; -import { client } from '../client.gen' +import { client } from '../client.gen'; import { addPet, createUser, @@ -23,8 +27,8 @@ import { updatePet, updatePetWithForm, updateUser, - uploadFile -} from '../sdk.gen' + uploadFile, +} from '../sdk.gen'; import type { AddPetData, AddPetResponse, @@ -58,8 +62,8 @@ import type { UpdatePetWithFormResponse, UpdateUserData, UploadFileData, - UploadFileResponse -} from '../types.gen' + UploadFileResponse, +} from '../types.gen'; /** * Add a new pet to the store. @@ -67,20 +71,24 @@ import type { * Add a new pet to the store. */ export const addPetMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions> => { - const mutationOptions: UseMutationOptions> = { + const mutationOptions: UseMutationOptions< + AddPetResponse, + DefaultError, + Options + > = { mutationFn: async (fnOptions) => { const { data } = await addPet({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; /** * Update an existing pet. @@ -88,8 +96,12 @@ export const addPetMutation = ( * Update an existing pet by Id. */ export const updatePetMutation = ( - options?: Partial> -): UseMutationOptions> => { + options?: Partial>, +): UseMutationOptions< + UpdatePetResponse, + DefaultError, + Options +> => { const mutationOptions: UseMutationOptions< UpdatePetResponse, DefaultError, @@ -99,62 +111,66 @@ export const updatePetMutation = ( const { data } = await updatePet({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; export type QueryKey = [ Pick & { - _id: string - _infinite?: boolean - tags?: ReadonlyArray - } -] + _id: string; + _infinite?: boolean; + tags?: ReadonlyArray; + }, +]; const createQueryKey = ( id: string, options?: TOptions, infinite?: boolean, - tags?: ReadonlyArray + tags?: ReadonlyArray, ): [QueryKey[0]] => { const params: QueryKey[0] = { _id: id, - baseUrl: options?.baseUrl || (options?.client ?? client).getConfig().baseUrl - } as QueryKey[0] + baseUrl: + options?.baseUrl || (options?.client ?? client).getConfig().baseUrl, + } as QueryKey[0]; if (infinite) { - params._infinite = infinite + params._infinite = infinite; } if (tags) { - params.tags = tags + params.tags = tags; } if (options?.body) { - params.body = options.body + params.body = options.body; } if (options?.headers) { - params.headers = options.headers + params.headers = options.headers; } if (options?.path) { - params.path = options.path + params.path = options.path; } if (options?.query) { - params.query = options.query + params.query = options.query; } - return [params] -} + return [params]; +}; -export const findPetsByStatusQueryKey = (options: Options) => - createQueryKey('findPetsByStatus', options) +export const findPetsByStatusQueryKey = ( + options: Options, +) => createQueryKey('findPetsByStatus', options); /** * Finds Pets by status. * * Multiple status values can be provided with comma separated strings. */ -export const findPetsByStatusOptions = (options: Options) => +export const findPetsByStatusOptions = ( + options: Options, +) => queryOptions< FindPetsByStatusResponse, DefaultError, @@ -166,15 +182,15 @@ export const findPetsByStatusOptions = (options: Options) ...options, ...queryKey[0], signal, - throwOnError: true - }) - return data + throwOnError: true, + }); + return data; }, - queryKey: findPetsByStatusQueryKey(options) - }) + queryKey: findPetsByStatusQueryKey(options), + }); export const findPetsByTagsQueryKey = (options: Options) => - createQueryKey('findPetsByTags', options) + createQueryKey('findPetsByTags', options); /** * Finds Pets by tags. @@ -193,12 +209,12 @@ export const findPetsByTagsOptions = (options: Options) => ...options, ...queryKey[0], signal, - throwOnError: true - }) - return data + throwOnError: true, + }); + return data; }, - queryKey: findPetsByTagsQueryKey(options) - }) + queryKey: findPetsByTagsQueryKey(options), + }); /** * Deletes a pet. @@ -206,23 +222,27 @@ export const findPetsByTagsOptions = (options: Options) => * Delete a pet. */ export const deletePetMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions> => { - const mutationOptions: UseMutationOptions> = { + const mutationOptions: UseMutationOptions< + unknown, + DefaultError, + Options + > = { mutationFn: async (fnOptions) => { const { data } = await deletePet({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; export const getPetByIdQueryKey = (options: Options) => - createQueryKey('getPetById', options) + createQueryKey('getPetById', options); /** * Find pet by ID. @@ -241,12 +261,12 @@ export const getPetByIdOptions = (options: Options) => ...options, ...queryKey[0], signal, - throwOnError: true - }) - return data + throwOnError: true, + }); + return data; }, - queryKey: getPetByIdQueryKey(options) - }) + queryKey: getPetByIdQueryKey(options), + }); /** * Updates a pet in the store with form data. @@ -254,8 +274,12 @@ export const getPetByIdOptions = (options: Options) => * Updates a pet resource based on the form data. */ export const updatePetWithFormMutation = ( - options?: Partial> -): UseMutationOptions> => { + options?: Partial>, +): UseMutationOptions< + UpdatePetWithFormResponse, + DefaultError, + Options +> => { const mutationOptions: UseMutationOptions< UpdatePetWithFormResponse, DefaultError, @@ -265,13 +289,13 @@ export const updatePetWithFormMutation = ( const { data } = await updatePetWithForm({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; /** * Uploads an image. @@ -279,8 +303,12 @@ export const updatePetWithFormMutation = ( * Upload image of the pet. */ export const uploadFileMutation = ( - options?: Partial> -): UseMutationOptions> => { + options?: Partial>, +): UseMutationOptions< + UploadFileResponse, + DefaultError, + Options +> => { const mutationOptions: UseMutationOptions< UploadFileResponse, DefaultError, @@ -290,16 +318,16 @@ export const uploadFileMutation = ( const { data } = await uploadFile({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; export const getInventoryQueryKey = (options?: Options) => - createQueryKey('getInventory', options) + createQueryKey('getInventory', options); /** * Returns pet inventories by status. @@ -318,12 +346,12 @@ export const getInventoryOptions = (options?: Options) => ...options, ...queryKey[0], signal, - throwOnError: true - }) - return data + throwOnError: true, + }); + return data; }, - queryKey: getInventoryQueryKey(options) - }) + queryKey: getInventoryQueryKey(options), + }); /** * Place an order for a pet. @@ -331,8 +359,12 @@ export const getInventoryOptions = (options?: Options) => * Place a new order in the store. */ export const placeOrderMutation = ( - options?: Partial> -): UseMutationOptions> => { + options?: Partial>, +): UseMutationOptions< + PlaceOrderResponse, + DefaultError, + Options +> => { const mutationOptions: UseMutationOptions< PlaceOrderResponse, DefaultError, @@ -342,13 +374,13 @@ export const placeOrderMutation = ( const { data } = await placeOrder({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; /** * Delete purchase order by identifier. @@ -356,23 +388,27 @@ export const placeOrderMutation = ( * For valid response try integer IDs with value < 1000. Anything above 1000 or non-integers will generate API errors. */ export const deleteOrderMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions> => { - const mutationOptions: UseMutationOptions> = { + const mutationOptions: UseMutationOptions< + unknown, + DefaultError, + Options + > = { mutationFn: async (fnOptions) => { const { data } = await deleteOrder({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; export const getOrderByIdQueryKey = (options: Options) => - createQueryKey('getOrderById', options) + createQueryKey('getOrderById', options); /** * Find purchase order by ID. @@ -391,12 +427,12 @@ export const getOrderByIdOptions = (options: Options) => ...options, ...queryKey[0], signal, - throwOnError: true - }) - return data + throwOnError: true, + }); + return data; }, - queryKey: getOrderByIdQueryKey(options) - }) + queryKey: getOrderByIdQueryKey(options), + }); /** * Create user. @@ -404,8 +440,12 @@ export const getOrderByIdOptions = (options: Options) => * This can only be done by the logged in user. */ export const createUserMutation = ( - options?: Partial> -): UseMutationOptions> => { + options?: Partial>, +): UseMutationOptions< + CreateUserResponse, + DefaultError, + Options +> => { const mutationOptions: UseMutationOptions< CreateUserResponse, DefaultError, @@ -415,13 +455,13 @@ export const createUserMutation = ( const { data } = await createUser({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; /** * Creates list of users with given input array. @@ -429,7 +469,7 @@ export const createUserMutation = ( * Creates list of users with given input array. */ export const createUsersWithListInputMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions< CreateUsersWithListInputResponse, DefaultError, @@ -444,16 +484,16 @@ export const createUsersWithListInputMutation = ( const { data } = await createUsersWithListInput({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; export const loginUserQueryKey = (options?: Options) => - createQueryKey('loginUser', options) + createQueryKey('loginUser', options); /** * Logs user into the system. @@ -472,15 +512,15 @@ export const loginUserOptions = (options?: Options) => ...options, ...queryKey[0], signal, - throwOnError: true - }) - return data + throwOnError: true, + }); + return data; }, - queryKey: loginUserQueryKey(options) - }) + queryKey: loginUserQueryKey(options), + }); export const logoutUserQueryKey = (options?: Options) => - createQueryKey('logoutUser', options) + createQueryKey('logoutUser', options); /** * Logs out current logged in user session. @@ -488,18 +528,23 @@ export const logoutUserQueryKey = (options?: Options) => * Log user out of the system. */ export const logoutUserOptions = (options?: Options) => - queryOptions>({ + queryOptions< + unknown, + DefaultError, + unknown, + ReturnType + >({ queryFn: async ({ queryKey, signal }) => { const { data } = await logoutUser({ ...options, ...queryKey[0], signal, - throwOnError: true - }) - return data + throwOnError: true, + }); + return data; }, - queryKey: logoutUserQueryKey(options) - }) + queryKey: logoutUserQueryKey(options), + }); /** * Delete user resource. @@ -507,23 +552,27 @@ export const logoutUserOptions = (options?: Options) => * This can only be done by the logged in user. */ export const deleteUserMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions> => { - const mutationOptions: UseMutationOptions> = { + const mutationOptions: UseMutationOptions< + unknown, + DefaultError, + Options + > = { mutationFn: async (fnOptions) => { const { data } = await deleteUser({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; export const getUserByNameQueryKey = (options: Options) => - createQueryKey('getUserByName', options) + createQueryKey('getUserByName', options); /** * Get user by user name. @@ -542,12 +591,12 @@ export const getUserByNameOptions = (options: Options) => ...options, ...queryKey[0], signal, - throwOnError: true - }) - return data + throwOnError: true, + }); + return data; }, - queryKey: getUserByNameQueryKey(options) - }) + queryKey: getUserByNameQueryKey(options), + }); /** * Update user resource. @@ -555,17 +604,21 @@ export const getUserByNameOptions = (options: Options) => * This can only be done by the logged in user. */ export const updateUserMutation = ( - options?: Partial> + options?: Partial>, ): UseMutationOptions> => { - const mutationOptions: UseMutationOptions> = { + const mutationOptions: UseMutationOptions< + unknown, + DefaultError, + Options + > = { mutationFn: async (fnOptions) => { const { data } = await updateUser({ ...options, ...fnOptions, - throwOnError: true - }) - return data - } - } - return mutationOptions -} + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/client.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/client.gen.ts index 1d374e90be..069f4dabab 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/client.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/client.gen.ts @@ -1,7 +1,12 @@ // This file is auto-generated by @hey-api/openapi-ts -import { type ClientOptions, type Config, createClient, createConfig } from './client' -import type { ClientOptions as ClientOptions2 } from './types.gen' +import { + type ClientOptions, + type Config, + createClient, + createConfig, +} from './client'; +import type { ClientOptions as ClientOptions2 } from './types.gen'; /** * The `createClientConfig()` function will be called on client initialization @@ -12,9 +17,11 @@ import type { ClientOptions as ClientOptions2 } from './types.gen' * to ensure your client always has the correct values. */ export type CreateClientConfig = ( - override?: Config -) => Config & T> + override?: Config, +) => Config & T>; export const client = createClient( - createConfig({ baseUrl: 'https://petstore3.swagger.io/api/v3' }) -) + createConfig({ + baseUrl: 'https://petstore3.swagger.io/api/v3', + }), +); diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/client/client.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/client/client.gen.ts index 00dbae3997..c2a5190c22 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/client/client.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/client/client.gen.ts @@ -1,9 +1,14 @@ // This file is auto-generated by @hey-api/openapi-ts -import { createSseClient } from '../core/serverSentEvents.gen' -import type { HttpMethod } from '../core/types.gen' -import { getValidRequestBody } from '../core/utils.gen' -import type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen' +import { createSseClient } from '../core/serverSentEvents.gen'; +import type { HttpMethod } from '../core/types.gen'; +import { getValidRequestBody } from '../core/utils.gen'; +import type { + Client, + Config, + RequestOptions, + ResolvedRequestOptions, +} from './types.gen'; import { buildUrl, createConfig, @@ -11,25 +16,30 @@ import { getParseAs, mergeConfigs, mergeHeaders, - setAuthParams -} from './utils.gen' + setAuthParams, +} from './utils.gen'; type ReqInit = Omit & { - body?: any - headers: ReturnType -} + body?: any; + headers: ReturnType; +}; export const createClient = (config: Config = {}): Client => { - let _config = mergeConfigs(createConfig(), config) + let _config = mergeConfigs(createConfig(), config); - const getConfig = (): Config => ({ ..._config }) + const getConfig = (): Config => ({ ..._config }); const setConfig = (config: Config): Config => { - _config = mergeConfigs(_config, config) - return getConfig() - } + _config = mergeConfigs(_config, config); + return getConfig(); + }; - const interceptors = createInterceptors() + const interceptors = createInterceptors< + Request, + Response, + unknown, + ResolvedRequestOptions + >(); const beforeRequest = async (options: RequestOptions) => { const opts = { @@ -37,72 +47,77 @@ export const createClient = (config: Config = {}): Client => { ...options, fetch: options.fetch ?? _config.fetch ?? globalThis.fetch, headers: mergeHeaders(_config.headers, options.headers), - serializedBody: undefined - } + serializedBody: undefined, + }; if (opts.security) { await setAuthParams({ ...opts, - security: opts.security - }) + security: opts.security, + }); } if (opts.requestValidator) { - await opts.requestValidator(opts) + await opts.requestValidator(opts); } if (opts.body !== undefined && opts.bodySerializer) { - opts.serializedBody = opts.bodySerializer(opts.body) + opts.serializedBody = opts.bodySerializer(opts.body); } // remove Content-Type header if body is empty to avoid sending invalid requests if (opts.body === undefined || opts.serializedBody === '') { - opts.headers.delete('Content-Type') + opts.headers.delete('Content-Type'); } - const url = buildUrl(opts) + const url = buildUrl(opts); - return { opts, url } - } + return { opts, url }; + }; const request: Client['request'] = async (options) => { // @ts-expect-error - const { opts, url } = await beforeRequest(options) + const { opts, url } = await beforeRequest(options); const requestInit: ReqInit = { redirect: 'follow', ...opts, - body: getValidRequestBody(opts) - } + body: getValidRequestBody(opts), + }; - let request = new Request(url, requestInit) + let request = new Request(url, requestInit); for (const fn of interceptors.request.fns) { if (fn) { - request = await fn(request, opts) + request = await fn(request, opts); } } // fetch must be assigned here, otherwise it would throw the error: // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation - const _fetch = opts.fetch! - let response: Response + const _fetch = opts.fetch!; + let response: Response; try { - response = await _fetch(request) + response = await _fetch(request); } catch (error) { // Handle fetch exceptions (AbortError, network errors, etc.) - let finalError = error + let finalError = error; for (const fn of interceptors.error.fns) { if (fn) { - finalError = (await fn(error, undefined as any, request, opts)) as unknown + finalError = (await fn( + error, + undefined as any, + request, + opts, + )) as unknown; } } - finalError = finalError || ({} as unknown) + finalError = finalError || ({} as unknown); if (opts.throwOnError) { - throw finalError + throw finalError; } // Return error response @@ -111,79 +126,82 @@ export const createClient = (config: Config = {}): Client => { : { error: finalError, request, - response: undefined as any - } + response: undefined as any, + }; } for (const fn of interceptors.response.fns) { if (fn) { - response = await fn(response, request, opts) + response = await fn(response, request, opts); } } const result = { request, - response - } + response, + }; if (response.ok) { const parseAs = (opts.parseAs === 'auto' ? getParseAs(response.headers.get('Content-Type')) - : opts.parseAs) ?? 'json' + : opts.parseAs) ?? 'json'; - if (response.status === 204 || response.headers.get('Content-Length') === '0') { - let emptyData: any + if ( + response.status === 204 || + response.headers.get('Content-Length') === '0' + ) { + let emptyData: any; switch (parseAs) { case 'arrayBuffer': case 'blob': case 'text': - emptyData = await response[parseAs]() - break + emptyData = await response[parseAs](); + break; case 'formData': - emptyData = new FormData() - break + emptyData = new FormData(); + break; case 'stream': - emptyData = response.body - break + emptyData = response.body; + break; case 'json': default: - emptyData = {} - break + emptyData = {}; + break; } return opts.responseStyle === 'data' ? emptyData : { data: emptyData, - ...result - } + ...result, + }; } - let data: any + let data: any; switch (parseAs) { case 'arrayBuffer': case 'blob': case 'formData': case 'json': case 'text': - data = await response[parseAs]() - break + data = await response[parseAs](); + break; case 'stream': return opts.responseStyle === 'data' ? response.body : { data: response.body, - ...result - } + ...result, + }; } if (parseAs === 'json') { if (opts.responseValidator) { - await opts.responseValidator(data) + await opts.responseValidator(data); } if (opts.responseTransformer) { - data = await opts.responseTransformer(data) + data = await opts.responseTransformer(data); } } @@ -191,32 +209,32 @@ export const createClient = (config: Config = {}): Client => { ? data : { data, - ...result - } + ...result, + }; } - const textError = await response.text() - let jsonError: unknown + const textError = await response.text(); + let jsonError: unknown; try { - jsonError = JSON.parse(textError) + jsonError = JSON.parse(textError); } catch { // noop } - const error = jsonError ?? textError - let finalError = error + const error = jsonError ?? textError; + let finalError = error; for (const fn of interceptors.error.fns) { if (fn) { - finalError = (await fn(error, response, request, opts)) as string + finalError = (await fn(error, response, request, opts)) as string; } } - finalError = finalError || ({} as string) + finalError = finalError || ({} as string); if (opts.throwOnError) { - throw finalError + throw finalError; } // TODO: we probably want to return error and improve types @@ -224,32 +242,34 @@ export const createClient = (config: Config = {}): Client => { ? undefined : { error: finalError, - ...result - } - } - - const makeMethodFn = (method: Uppercase) => (options: RequestOptions) => - request({ ...options, method }) - - const makeSseFn = (method: Uppercase) => async (options: RequestOptions) => { - const { opts, url } = await beforeRequest(options) - return createSseClient({ - ...opts, - body: opts.body as BodyInit | null | undefined, - headers: opts.headers as unknown as Record, - method, - onRequest: async (url, init) => { - let request = new Request(url, init) - for (const fn of interceptors.request.fns) { - if (fn) { - request = await fn(request, opts) + ...result, + }; + }; + + const makeMethodFn = + (method: Uppercase) => (options: RequestOptions) => + request({ ...options, method }); + + const makeSseFn = + (method: Uppercase) => async (options: RequestOptions) => { + const { opts, url } = await beforeRequest(options); + return createSseClient({ + ...opts, + body: opts.body as BodyInit | null | undefined, + headers: opts.headers as unknown as Record, + method, + onRequest: async (url, init) => { + let request = new Request(url, init); + for (const fn of interceptors.request.fns) { + if (fn) { + request = await fn(request, opts); + } } - } - return request - }, - url - }) - } + return request; + }, + url, + }); + }; return { buildUrl, @@ -274,8 +294,8 @@ export const createClient = (config: Config = {}): Client => { patch: makeSseFn('PATCH'), post: makeSseFn('POST'), put: makeSseFn('PUT'), - trace: makeSseFn('TRACE') + trace: makeSseFn('TRACE'), }, - trace: makeMethodFn('TRACE') - } as Client -} + trace: makeMethodFn('TRACE'), + } as Client; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/client/index.ts b/examples/openapi-ts-tanstack-vue-query/src/client/client/index.ts index 13cdecb802..b295edeca0 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/client/index.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/client/index.ts @@ -1,15 +1,15 @@ // This file is auto-generated by @hey-api/openapi-ts -export type { Auth } from '../core/auth.gen' -export type { QuerySerializerOptions } from '../core/bodySerializer.gen' +export type { Auth } from '../core/auth.gen'; +export type { QuerySerializerOptions } from '../core/bodySerializer.gen'; export { formDataBodySerializer, jsonBodySerializer, - urlSearchParamsBodySerializer -} from '../core/bodySerializer.gen' -export { buildClientParams } from '../core/params.gen' -export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen' -export { createClient } from './client.gen' + urlSearchParamsBodySerializer, +} from '../core/bodySerializer.gen'; +export { buildClientParams } from '../core/params.gen'; +export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen'; +export { createClient } from './client.gen'; export type { Client, ClientOptions, @@ -20,6 +20,6 @@ export type { RequestResult, ResolvedRequestOptions, ResponseStyle, - TDataShape -} from './types.gen' -export { createConfig, mergeHeaders } from './utils.gen' + TDataShape, +} from './types.gen'; +export { createConfig, mergeHeaders } from './utils.gen'; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/client/types.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/client/types.gen.ts index 7ebb04c8c4..d2a28bc810 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/client/types.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/client/types.gen.ts @@ -1,33 +1,38 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { Auth } from '../core/auth.gen' -import type { ServerSentEventsOptions, ServerSentEventsResult } from '../core/serverSentEvents.gen' -import type { Client as CoreClient, Config as CoreConfig } from '../core/types.gen' -import type { Middleware } from './utils.gen' - -export type ResponseStyle = 'data' | 'fields' +import type { Auth } from '../core/auth.gen'; +import type { + ServerSentEventsOptions, + ServerSentEventsResult, +} from '../core/serverSentEvents.gen'; +import type { + Client as CoreClient, + Config as CoreConfig, +} from '../core/types.gen'; +import type { Middleware } from './utils.gen'; + +export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ - baseUrl?: T['baseUrl'] + baseUrl?: T['baseUrl']; /** * Fetch API implementation. You can use this option to provide a custom * fetch instance. * * @default globalThis.fetch */ - fetch?: typeof fetch + fetch?: typeof fetch; /** * Please don't use the Fetch client for Next.js applications. The `next` * options won't have any effect. * * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead. */ - next?: never + next?: never; /** * Return the response data parsed in a specified format. By default, `auto` * will infer the appropriate method from the `Content-Type` response header. @@ -36,29 +41,38 @@ export interface Config * * @default 'auto' */ - parseAs?: 'arrayBuffer' | 'auto' | 'blob' | 'formData' | 'json' | 'stream' | 'text' + parseAs?: + | 'arrayBuffer' + | 'auto' + | 'blob' + | 'formData' + | 'json' + | 'stream' + | 'text'; /** * Should we return only data or multiple fields (data, error, response, etc.)? * * @default 'fields' */ - responseStyle?: ResponseStyle + responseStyle?: ResponseStyle; /** * Throw an error instead of returning it in the response? * * @default false */ - throwOnError?: T['throwOnError'] + throwOnError?: T['throwOnError']; } export interface RequestOptions< TData = unknown, TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, - Url extends string = string -> extends Config<{ - responseStyle: TResponseStyle - throwOnError: ThrowOnError + Url extends string = string, +> + extends + Config<{ + responseStyle: TResponseStyle; + throwOnError: ThrowOnError; }>, Pick< ServerSentEventsOptions, @@ -73,29 +87,29 @@ export interface RequestOptions< * * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} */ - body?: unknown - path?: Record - query?: Record + body?: unknown; + path?: Record; + query?: Record; /** * Security mechanism(s) to use for the request. */ - security?: ReadonlyArray - url: Url + security?: ReadonlyArray; + url: Url; } export interface ResolvedRequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, - Url extends string = string + Url extends string = string, > extends RequestOptions { - serializedBody?: string + serializedBody?: string; } export type RequestResult< TData = unknown, TError = unknown, ThrowOnError extends boolean = boolean, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', > = ThrowOnError extends true ? Promise< TResponseStyle extends 'data' @@ -103,77 +117,96 @@ export type RequestResult< ? TData[keyof TData] : TData : { - data: TData extends Record ? TData[keyof TData] : TData - request: Request - response: Response + data: TData extends Record + ? TData[keyof TData] + : TData; + request: Request; + response: Response; } > : Promise< TResponseStyle extends 'data' - ? (TData extends Record ? TData[keyof TData] : TData) | undefined + ? + | (TData extends Record + ? TData[keyof TData] + : TData) + | undefined : ( | { - data: TData extends Record ? TData[keyof TData] : TData - error: undefined + data: TData extends Record + ? TData[keyof TData] + : TData; + error: undefined; } | { - data: undefined - error: TError extends Record ? TError[keyof TError] : TError + data: undefined; + error: TError extends Record + ? TError[keyof TError] + : TError; } ) & { - request: Request - response: Response + request: Request; + response: Response; } - > + >; export interface ClientOptions { - baseUrl?: string - responseStyle?: ResponseStyle - throwOnError?: boolean + baseUrl?: string; + responseStyle?: ResponseStyle; + throwOnError?: boolean; } type MethodFn = < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', >( - options: Omit, 'method'> -) => RequestResult + options: Omit, 'method'>, +) => RequestResult; type SseFn = < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', >( - options: Omit, 'method'> -) => Promise> + options: Omit, 'method'>, +) => Promise>; type RequestFn = < TData = unknown, TError = unknown, ThrowOnError extends boolean = false, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', >( options: Omit, 'method'> & - Pick>, 'method'> -) => RequestResult + Pick< + Required>, + 'method' + >, +) => RequestResult; type BuildUrlFn = < TData extends { - body?: unknown - path?: Record - query?: Record - url: string - } + body?: unknown; + path?: Record; + query?: Record; + url: string; + }, >( - options: TData & Options -) => string - -export type Client = CoreClient & { - interceptors: Middleware -} + options: TData & Options, +) => string; + +export type Client = CoreClient< + RequestFn, + Config, + MethodFn, + BuildUrlFn, + SseFn +> & { + interceptors: Middleware; +}; /** * The `createClientConfig()` function will be called on client initialization @@ -184,26 +217,26 @@ export type Client = CoreClient * to ensure your client always has the correct values. */ export type CreateClientConfig = ( - override?: Config -) => Config & T> + override?: Config, +) => Config & T>; export interface TDataShape { - body?: unknown - headers?: unknown - path?: unknown - query?: unknown - url: string + body?: unknown; + headers?: unknown; + path?: unknown; + query?: unknown; + url: string; } -type OmitKeys = Pick> +type OmitKeys = Pick>; export type Options< TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown, - TResponseStyle extends ResponseStyle = 'fields' + TResponseStyle extends ResponseStyle = 'fields', > = OmitKeys< RequestOptions, 'body' | 'path' | 'query' | 'url' > & - ([TData] extends [never] ? unknown : Omit) + ([TData] extends [never] ? unknown : Omit); diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/client/utils.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/client/utils.gen.ts index ca2b3164a1..89416454b6 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/client/utils.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/client/utils.gen.ts @@ -1,31 +1,36 @@ // This file is auto-generated by @hey-api/openapi-ts -import { getAuthToken } from '../core/auth.gen' -import type { QuerySerializerOptions } from '../core/bodySerializer.gen' -import { jsonBodySerializer } from '../core/bodySerializer.gen' +import { getAuthToken } from '../core/auth.gen'; +import type { QuerySerializerOptions } from '../core/bodySerializer.gen'; +import { jsonBodySerializer } from '../core/bodySerializer.gen'; import { serializeArrayParam, serializeObjectParam, - serializePrimitiveParam -} from '../core/pathSerializer.gen' -import { getUrl } from '../core/utils.gen' -import type { Client, ClientOptions, Config, RequestOptions } from './types.gen' + serializePrimitiveParam, +} from '../core/pathSerializer.gen'; +import { getUrl } from '../core/utils.gen'; +import type { + Client, + ClientOptions, + Config, + RequestOptions, +} from './types.gen'; export const createQuerySerializer = ({ parameters = {}, ...args }: QuerySerializerOptions = {}) => { const querySerializer = (queryParams: T) => { - const search: string[] = [] + const search: string[] = []; if (queryParams && typeof queryParams === 'object') { for (const name in queryParams) { - const value = queryParams[name] + const value = queryParams[name]; if (value === undefined || value === null) { - continue + continue; } - const options = parameters[name] || args + const options = parameters[name] || args; if (Array.isArray(value)) { const serializedArray = serializeArrayParam({ @@ -34,9 +39,9 @@ export const createQuerySerializer = ({ name, style: 'form', value, - ...options.array - }) - if (serializedArray) search.push(serializedArray) + ...options.array, + }); + if (serializedArray) search.push(serializedArray); } else if (typeof value === 'object') { const serializedObject = serializeObjectParam({ allowReserved: options.allowReserved, @@ -44,117 +49,124 @@ export const createQuerySerializer = ({ name, style: 'deepObject', value: value as Record, - ...options.object - }) - if (serializedObject) search.push(serializedObject) + ...options.object, + }); + if (serializedObject) search.push(serializedObject); } else { const serializedPrimitive = serializePrimitiveParam({ allowReserved: options.allowReserved, name, - value: value as string - }) - if (serializedPrimitive) search.push(serializedPrimitive) + value: value as string, + }); + if (serializedPrimitive) search.push(serializedPrimitive); } } } - return search.join('&') - } - return querySerializer -} + return search.join('&'); + }; + return querySerializer; +}; /** * Infers parseAs value from provided Content-Type header. */ -export const getParseAs = (contentType: string | null): Exclude => { +export const getParseAs = ( + contentType: string | null, +): Exclude => { if (!contentType) { // If no Content-Type header is provided, the best we can do is return the raw response body, // which is effectively the same as the 'stream' option. - return 'stream' + return 'stream'; } - const cleanContent = contentType.split(';')[0]?.trim() + const cleanContent = contentType.split(';')[0]?.trim(); if (!cleanContent) { - return + return; } - if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) { - return 'json' + if ( + cleanContent.startsWith('application/json') || + cleanContent.endsWith('+json') + ) { + return 'json'; } if (cleanContent === 'multipart/form-data') { - return 'formData' + return 'formData'; } if ( - ['application/', 'audio/', 'image/', 'video/'].some((type) => cleanContent.startsWith(type)) + ['application/', 'audio/', 'image/', 'video/'].some((type) => + cleanContent.startsWith(type), + ) ) { - return 'blob' + return 'blob'; } if (cleanContent.startsWith('text/')) { - return 'text' + return 'text'; } - return -} + return; +}; const checkForExistence = ( options: Pick & { - headers: Headers + headers: Headers; }, - name?: string + name?: string, ): boolean => { if (!name) { - return false + return false; } if ( options.headers.has(name) || options.query?.[name] || options.headers.get('Cookie')?.includes(`${name}=`) ) { - return true + return true; } - return false -} + return false; +}; export const setAuthParams = async ({ security, ...options }: Pick, 'security'> & Pick & { - headers: Headers + headers: Headers; }) => { for (const auth of security) { if (checkForExistence(options, auth.name)) { - continue + continue; } - const token = await getAuthToken(auth, options.auth) + const token = await getAuthToken(auth, options.auth); if (!token) { - continue + continue; } - const name = auth.name ?? 'Authorization' + const name = auth.name ?? 'Authorization'; switch (auth.in) { case 'query': if (!options.query) { - options.query = {} + options.query = {}; } - options.query[name] = token - break + options.query[name] = token; + break; case 'cookie': - options.headers.append('Cookie', `${name}=${token}`) - break + options.headers.append('Cookie', `${name}=${token}`); + break; case 'header': default: - options.headers.set(name, token) - break + options.headers.set(name, token); + break; } } -} +}; export const buildUrl: Client['buildUrl'] = (options) => getUrl({ @@ -165,117 +177,126 @@ export const buildUrl: Client['buildUrl'] = (options) => typeof options.querySerializer === 'function' ? options.querySerializer : createQuerySerializer(options.querySerializer), - url: options.url - }) + url: options.url, + }); export const mergeConfigs = (a: Config, b: Config): Config => { - const config = { ...a, ...b } + const config = { ...a, ...b }; if (config.baseUrl?.endsWith('/')) { - config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1) + config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1); } - config.headers = mergeHeaders(a.headers, b.headers) - return config -} + config.headers = mergeHeaders(a.headers, b.headers); + return config; +}; const headersEntries = (headers: Headers): Array<[string, string]> => { - const entries: Array<[string, string]> = [] + const entries: Array<[string, string]> = []; headers.forEach((value, key) => { - entries.push([key, value]) - }) - return entries -} + entries.push([key, value]); + }); + return entries; +}; export const mergeHeaders = ( ...headers: Array['headers'] | undefined> ): Headers => { - const mergedHeaders = new Headers() + const mergedHeaders = new Headers(); for (const header of headers) { if (!header) { - continue + continue; } - const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header) + const iterator = + header instanceof Headers + ? headersEntries(header) + : Object.entries(header); for (const [key, value] of iterator) { if (value === null) { - mergedHeaders.delete(key) + mergedHeaders.delete(key); } else if (Array.isArray(value)) { for (const v of value) { - mergedHeaders.append(key, v as string) + mergedHeaders.append(key, v as string); } } else if (value !== undefined) { // assume object headers are meant to be JSON stringified, i.e. their // content value in OpenAPI specification is 'application/json' mergedHeaders.set( key, - typeof value === 'object' ? JSON.stringify(value) : (value as string) - ) + typeof value === 'object' ? JSON.stringify(value) : (value as string), + ); } } } - return mergedHeaders -} + return mergedHeaders; +}; type ErrInterceptor = ( error: Err, response: Res, request: Req, - options: Options -) => Err | Promise + options: Options, +) => Err | Promise; -type ReqInterceptor = (request: Req, options: Options) => Req | Promise +type ReqInterceptor = ( + request: Req, + options: Options, +) => Req | Promise; type ResInterceptor = ( response: Res, request: Req, - options: Options -) => Res | Promise + options: Options, +) => Res | Promise; class Interceptors { - fns: Array = [] + fns: Array = []; clear(): void { - this.fns = [] + this.fns = []; } eject(id: number | Interceptor): void { - const index = this.getInterceptorIndex(id) + const index = this.getInterceptorIndex(id); if (this.fns[index]) { - this.fns[index] = null + this.fns[index] = null; } } exists(id: number | Interceptor): boolean { - const index = this.getInterceptorIndex(id) - return Boolean(this.fns[index]) + const index = this.getInterceptorIndex(id); + return Boolean(this.fns[index]); } getInterceptorIndex(id: number | Interceptor): number { if (typeof id === 'number') { - return this.fns[id] ? id : -1 + return this.fns[id] ? id : -1; } - return this.fns.indexOf(id) + return this.fns.indexOf(id); } - update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false { - const index = this.getInterceptorIndex(id) + update( + id: number | Interceptor, + fn: Interceptor, + ): number | Interceptor | false { + const index = this.getInterceptorIndex(id); if (this.fns[index]) { - this.fns[index] = fn - return id + this.fns[index] = fn; + return id; } - return false + return false; } use(fn: Interceptor): number { - this.fns.push(fn) - return this.fns.length - 1 + this.fns.push(fn); + return this.fns.length - 1; } } export interface Middleware { - error: Interceptors> - request: Interceptors> - response: Interceptors> + error: Interceptors>; + request: Interceptors>; + response: Interceptors>; } export const createInterceptors = (): Middleware< @@ -286,31 +307,31 @@ export const createInterceptors = (): Middleware< > => ({ error: new Interceptors>(), request: new Interceptors>(), - response: new Interceptors>() -}) + response: new Interceptors>(), +}); const defaultQuerySerializer = createQuerySerializer({ allowReserved: false, array: { explode: true, - style: 'form' + style: 'form', }, object: { explode: true, - style: 'deepObject' - } -}) + style: 'deepObject', + }, +}); const defaultHeaders = { - 'Content-Type': 'application/json' -} + 'Content-Type': 'application/json', +}; export const createConfig = ( - override: Config & T> = {} + override: Config & T> = {}, ): Config & T> => ({ ...jsonBodySerializer, headers: defaultHeaders, parseAs: 'auto', querySerializer: defaultQuerySerializer, - ...override -}) + ...override, +}); diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/core/auth.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/core/auth.gen.ts index dc8ff61977..f8a73266f9 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/core/auth.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/core/auth.gen.ts @@ -1,6 +1,6 @@ // This file is auto-generated by @hey-api/openapi-ts -export type AuthToken = string | undefined +export type AuthToken = string | undefined; export interface Auth { /** @@ -8,34 +8,35 @@ export interface Auth { * * @default 'header' */ - in?: 'header' | 'query' | 'cookie' + in?: 'header' | 'query' | 'cookie'; /** * Header or query parameter name. * * @default 'Authorization' */ - name?: string - scheme?: 'basic' | 'bearer' - type: 'apiKey' | 'http' + name?: string; + scheme?: 'basic' | 'bearer'; + type: 'apiKey' | 'http'; } export const getAuthToken = async ( auth: Auth, - callback: ((auth: Auth) => Promise | AuthToken) | AuthToken + callback: ((auth: Auth) => Promise | AuthToken) | AuthToken, ): Promise => { - const token = typeof callback === 'function' ? await callback(auth) : callback + const token = + typeof callback === 'function' ? await callback(auth) : callback; if (!token) { - return + return; } if (auth.scheme === 'bearer') { - return `Bearer ${token}` + return `Bearer ${token}`; } if (auth.scheme === 'basic') { - return `Basic ${btoa(token)}` + return `Basic ${btoa(token)}`; } - return token -} + return token; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/core/bodySerializer.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/core/bodySerializer.gen.ts index 09ffeb02af..552b50f7c8 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/core/bodySerializer.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/core/bodySerializer.gen.ts @@ -1,84 +1,100 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen' +import type { + ArrayStyle, + ObjectStyle, + SerializerOptions, +} from './pathSerializer.gen'; -export type QuerySerializer = (query: Record) => string +export type QuerySerializer = (query: Record) => string; -export type BodySerializer = (body: any) => any +export type BodySerializer = (body: any) => any; type QuerySerializerOptionsObject = { - allowReserved?: boolean - array?: Partial> - object?: Partial> -} + allowReserved?: boolean; + array?: Partial>; + object?: Partial>; +}; export type QuerySerializerOptions = QuerySerializerOptionsObject & { /** * Per-parameter serialization overrides. When provided, these settings * override the global array/object settings for specific parameter names. */ - parameters?: Record -} + parameters?: Record; +}; -const serializeFormDataPair = (data: FormData, key: string, value: unknown): void => { +const serializeFormDataPair = ( + data: FormData, + key: string, + value: unknown, +): void => { if (typeof value === 'string' || value instanceof Blob) { - data.append(key, value) + data.append(key, value); } else if (value instanceof Date) { - data.append(key, value.toISOString()) + data.append(key, value.toISOString()); } else { - data.append(key, JSON.stringify(value)) + data.append(key, JSON.stringify(value)); } -} +}; -const serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => { +const serializeUrlSearchParamsPair = ( + data: URLSearchParams, + key: string, + value: unknown, +): void => { if (typeof value === 'string') { - data.append(key, value) + data.append(key, value); } else { - data.append(key, JSON.stringify(value)) + data.append(key, JSON.stringify(value)); } -} +}; export const formDataBodySerializer = { bodySerializer: | Array>>( - body: T + body: T, ): FormData => { - const data = new FormData() + const data = new FormData(); Object.entries(body).forEach(([key, value]) => { if (value === undefined || value === null) { - return + return; } if (Array.isArray(value)) { - value.forEach((v) => serializeFormDataPair(data, key, v)) + value.forEach((v) => serializeFormDataPair(data, key, v)); } else { - serializeFormDataPair(data, key, value) + serializeFormDataPair(data, key, value); } - }) + }); - return data - } -} + return data; + }, +}; export const jsonBodySerializer = { bodySerializer: (body: T): string => - JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)) -} + JSON.stringify(body, (_key, value) => + typeof value === 'bigint' ? value.toString() : value, + ), +}; export const urlSearchParamsBodySerializer = { - bodySerializer: | Array>>(body: T): string => { - const data = new URLSearchParams() + bodySerializer: | Array>>( + body: T, + ): string => { + const data = new URLSearchParams(); Object.entries(body).forEach(([key, value]) => { if (value === undefined || value === null) { - return + return; } if (Array.isArray(value)) { - value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)) + value.forEach((v) => serializeUrlSearchParamsPair(data, key, v)); } else { - serializeUrlSearchParamsPair(data, key, value) + serializeUrlSearchParamsPair(data, key, value); } - }) + }); - return data.toString() - } -} + return data.toString(); + }, +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/core/params.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/core/params.gen.ts index 356b25dfc8..602715c46c 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/core/params.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/core/params.gen.ts @@ -1,70 +1,70 @@ // This file is auto-generated by @hey-api/openapi-ts -type Slot = 'body' | 'headers' | 'path' | 'query' +type Slot = 'body' | 'headers' | 'path' | 'query'; export type Field = | { - in: Exclude + in: Exclude; /** * Field name. This is the name we want the user to see and use. */ - key: string + key: string; /** * Field mapped name. This is the name we want to use in the request. * If omitted, we use the same value as `key`. */ - map?: string + map?: string; } | { - in: Extract + in: Extract; /** * Key isn't required for bodies. */ - key?: string - map?: string + key?: string; + map?: string; } | { /** * Field name. This is the name we want the user to see and use. */ - key: string + key: string; /** * Field mapped name. This is the name we want to use in the request. * If `in` is omitted, `map` aliases `key` to the transport layer. */ - map: Slot - } + map: Slot; + }; export interface Fields { - allowExtra?: Partial> - args?: ReadonlyArray + allowExtra?: Partial>; + args?: ReadonlyArray; } -export type FieldsConfig = ReadonlyArray +export type FieldsConfig = ReadonlyArray; const extraPrefixesMap: Record = { $body_: 'body', $headers_: 'headers', $path_: 'path', - $query_: 'query' -} -const extraPrefixes = Object.entries(extraPrefixesMap) + $query_: 'query', +}; +const extraPrefixes = Object.entries(extraPrefixesMap); type KeyMap = Map< string, | { - in: Slot - map?: string + in: Slot; + map?: string; } | { - in?: never - map: Slot + in?: never; + map: Slot; } -> +>; const buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => { if (!map) { - map = new Map() + map = new Map(); } for (const config of fields) { @@ -72,89 +72,96 @@ const buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => { if (config.key) { map.set(config.key, { in: config.in, - map: config.map - }) + map: config.map, + }); } } else if ('key' in config) { map.set(config.key, { - map: config.map - }) + map: config.map, + }); } else if (config.args) { - buildKeyMap(config.args, map) + buildKeyMap(config.args, map); } } - return map -} + return map; +}; interface Params { - body: unknown - headers: Record - path: Record - query: Record + body: unknown; + headers: Record; + path: Record; + query: Record; } const stripEmptySlots = (params: Params) => { for (const [slot, value] of Object.entries(params)) { if (value && typeof value === 'object' && !Object.keys(value).length) { - delete params[slot as Slot] + delete params[slot as Slot]; } } -} +}; -export const buildClientParams = (args: ReadonlyArray, fields: FieldsConfig) => { +export const buildClientParams = ( + args: ReadonlyArray, + fields: FieldsConfig, +) => { const params: Params = { body: {}, headers: {}, path: {}, - query: {} - } + query: {}, + }; - const map = buildKeyMap(fields) + const map = buildKeyMap(fields); - let config: FieldsConfig[number] | undefined + let config: FieldsConfig[number] | undefined; for (const [index, arg] of args.entries()) { if (fields[index]) { - config = fields[index] + config = fields[index]; } if (!config) { - continue + continue; } if ('in' in config) { if (config.key) { - const field = map.get(config.key)! - const name = field.map || config.key + const field = map.get(config.key)!; + const name = field.map || config.key; if (field.in) { - ;(params[field.in] as Record)[name] = arg + (params[field.in] as Record)[name] = arg; } } else { - params.body = arg + params.body = arg; } } else { for (const [key, value] of Object.entries(arg ?? {})) { - const field = map.get(key) + const field = map.get(key); if (field) { if (field.in) { - const name = field.map || key - ;(params[field.in] as Record)[name] = value + const name = field.map || key; + (params[field.in] as Record)[name] = value; } else { - params[field.map] = value + params[field.map] = value; } } else { - const extra = extraPrefixes.find(([prefix]) => key.startsWith(prefix)) + const extra = extraPrefixes.find(([prefix]) => + key.startsWith(prefix), + ); if (extra) { - const [prefix, slot] = extra - ;(params[slot] as Record)[key.slice(prefix.length)] = value + const [prefix, slot] = extra; + (params[slot] as Record)[ + key.slice(prefix.length) + ] = value; } else if ('allowExtra' in config && config.allowExtra) { for (const [slot, allowed] of Object.entries(config.allowExtra)) { if (allowed) { - ;(params[slot as Slot] as Record)[key] = value - break + (params[slot as Slot] as Record)[key] = value; + break; } } } @@ -163,7 +170,7 @@ export const buildClientParams = (args: ReadonlyArray, fields: FieldsCo } } - stripEmptySlots(params) + stripEmptySlots(params); - return params -} + return params; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/core/pathSerializer.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/core/pathSerializer.gen.ts index acc13672ee..4241e0a078 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/core/pathSerializer.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/core/pathSerializer.gen.ts @@ -1,128 +1,131 @@ // This file is auto-generated by @hey-api/openapi-ts -interface SerializeOptions extends SerializePrimitiveOptions, SerializerOptions {} +interface SerializeOptions + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { - allowReserved?: boolean - name: string + allowReserved?: boolean; + name: string; } export interface SerializerOptions { /** * @default true */ - explode: boolean - style: T + explode: boolean; + style: T; } -export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited' -export type ArraySeparatorStyle = ArrayStyle | MatrixStyle -type MatrixStyle = 'label' | 'matrix' | 'simple' -export type ObjectStyle = 'form' | 'deepObject' -type ObjectSeparatorStyle = ObjectStyle | MatrixStyle +export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; +export type ArraySeparatorStyle = ArrayStyle | MatrixStyle; +type MatrixStyle = 'label' | 'matrix' | 'simple'; +export type ObjectStyle = 'form' | 'deepObject'; +type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; interface SerializePrimitiveParam extends SerializePrimitiveOptions { - value: string + value: string; } export const separatorArrayExplode = (style: ArraySeparatorStyle) => { switch (style) { case 'label': - return '.' + return '.'; case 'matrix': - return ';' + return ';'; case 'simple': - return ',' + return ','; default: - return '&' + return '&'; } -} +}; export const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { switch (style) { case 'form': - return ',' + return ','; case 'pipeDelimited': - return '|' + return '|'; case 'spaceDelimited': - return '%20' + return '%20'; default: - return ',' + return ','; } -} +}; export const separatorObjectExplode = (style: ObjectSeparatorStyle) => { switch (style) { case 'label': - return '.' + return '.'; case 'matrix': - return ';' + return ';'; case 'simple': - return ',' + return ','; default: - return '&' + return '&'; } -} +}; export const serializeArrayParam = ({ allowReserved, explode, name, style, - value + value, }: SerializeOptions & { - value: unknown[] + value: unknown[]; }) => { if (!explode) { const joinedValues = ( allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) - ).join(separatorArrayNoExplode(style)) + ).join(separatorArrayNoExplode(style)); switch (style) { case 'label': - return `.${joinedValues}` + return `.${joinedValues}`; case 'matrix': - return `;${name}=${joinedValues}` + return `;${name}=${joinedValues}`; case 'simple': - return joinedValues + return joinedValues; default: - return `${name}=${joinedValues}` + return `${name}=${joinedValues}`; } } - const separator = separatorArrayExplode(style) + const separator = separatorArrayExplode(style); const joinedValues = value .map((v) => { if (style === 'label' || style === 'simple') { - return allowReserved ? v : encodeURIComponent(v as string) + return allowReserved ? v : encodeURIComponent(v as string); } return serializePrimitiveParam({ allowReserved, name, - value: v as string - }) + value: v as string, + }); }) - .join(separator) - return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues -} + .join(separator); + return style === 'label' || style === 'matrix' + ? separator + joinedValues + : joinedValues; +}; export const serializePrimitiveParam = ({ allowReserved, name, - value + value, }: SerializePrimitiveParam) => { if (value === undefined || value === null) { - return '' + return ''; } if (typeof value === 'object') { throw new Error( - 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.' - ) + 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.', + ); } - return `${name}=${allowReserved ? value : encodeURIComponent(value)}` -} + return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; +}; export const serializeObjectParam = ({ allowReserved, @@ -130,42 +133,48 @@ export const serializeObjectParam = ({ name, style, value, - valueOnly + valueOnly, }: SerializeOptions & { - value: Record | Date - valueOnly?: boolean + value: Record | Date; + valueOnly?: boolean; }) => { if (value instanceof Date) { - return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}` + return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`; } if (style !== 'deepObject' && !explode) { - let values: string[] = [] + let values: string[] = []; Object.entries(value).forEach(([key, v]) => { - values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)] - }) - const joinedValues = values.join(',') + values = [ + ...values, + key, + allowReserved ? (v as string) : encodeURIComponent(v as string), + ]; + }); + const joinedValues = values.join(','); switch (style) { case 'form': - return `${name}=${joinedValues}` + return `${name}=${joinedValues}`; case 'label': - return `.${joinedValues}` + return `.${joinedValues}`; case 'matrix': - return `;${name}=${joinedValues}` + return `;${name}=${joinedValues}`; default: - return joinedValues + return joinedValues; } } - const separator = separatorObjectExplode(style) + const separator = separatorObjectExplode(style); const joinedValues = Object.entries(value) .map(([key, v]) => serializePrimitiveParam({ allowReserved, name: style === 'deepObject' ? `${name}[${key}]` : key, - value: v as string - }) + value: v as string, + }), ) - .join(separator) - return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues -} + .join(separator); + return style === 'label' || style === 'matrix' + ? separator + joinedValues + : joinedValues; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/core/queryKeySerializer.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/core/queryKeySerializer.gen.ts index 7e9d0d1ec8..d3bb68396e 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/core/queryKeySerializer.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/core/queryKeySerializer.gen.ts @@ -9,109 +9,128 @@ export type JsonValue = | number | boolean | JsonValue[] - | { [key: string]: JsonValue } + | { [key: string]: JsonValue }; /** * Replacer that converts non-JSON values (bigint, Date, etc.) to safe substitutes. */ export const queryKeyJsonReplacer = (_key: string, value: unknown) => { - if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { - return undefined + if ( + value === undefined || + typeof value === 'function' || + typeof value === 'symbol' + ) { + return undefined; } if (typeof value === 'bigint') { - return value.toString() + return value.toString(); } if (value instanceof Date) { - return value.toISOString() + return value.toISOString(); } - return value -} + return value; +}; /** * Safely stringifies a value and parses it back into a JsonValue. */ export const stringifyToJsonValue = (input: unknown): JsonValue | undefined => { try { - const json = JSON.stringify(input, queryKeyJsonReplacer) + const json = JSON.stringify(input, queryKeyJsonReplacer); if (json === undefined) { - return undefined + return undefined; } - return JSON.parse(json) as JsonValue + return JSON.parse(json) as JsonValue; } catch { - return undefined + return undefined; } -} +}; /** * Detects plain objects (including objects with a null prototype). */ const isPlainObject = (value: unknown): value is Record => { if (value === null || typeof value !== 'object') { - return false + return false; } - const prototype = Object.getPrototypeOf(value as object) - return prototype === Object.prototype || prototype === null -} + const prototype = Object.getPrototypeOf(value as object); + return prototype === Object.prototype || prototype === null; +}; /** * Turns URLSearchParams into a sorted JSON object for deterministic keys. */ const serializeSearchParams = (params: URLSearchParams): JsonValue => { - const entries = Array.from(params.entries()).sort(([a], [b]) => a.localeCompare(b)) - const result: Record = {} + const entries = Array.from(params.entries()).sort(([a], [b]) => + a.localeCompare(b), + ); + const result: Record = {}; for (const [key, value] of entries) { - const existing = result[key] + const existing = result[key]; if (existing === undefined) { - result[key] = value - continue + result[key] = value; + continue; } if (Array.isArray(existing)) { - ;(existing as string[]).push(value) + (existing as string[]).push(value); } else { - result[key] = [existing, value] + result[key] = [existing, value]; } } - return result -} + return result; +}; /** * Normalizes any accepted value into a JSON-friendly shape for query keys. */ -export const serializeQueryKeyValue = (value: unknown): JsonValue | undefined => { +export const serializeQueryKeyValue = ( + value: unknown, +): JsonValue | undefined => { if (value === null) { - return null + return null; } - if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { - return value + if ( + typeof value === 'string' || + typeof value === 'number' || + typeof value === 'boolean' + ) { + return value; } - if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { - return undefined + if ( + value === undefined || + typeof value === 'function' || + typeof value === 'symbol' + ) { + return undefined; } if (typeof value === 'bigint') { - return value.toString() + return value.toString(); } if (value instanceof Date) { - return value.toISOString() + return value.toISOString(); } if (Array.isArray(value)) { - return stringifyToJsonValue(value) + return stringifyToJsonValue(value); } - if (typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams) { - return serializeSearchParams(value) + if ( + typeof URLSearchParams !== 'undefined' && + value instanceof URLSearchParams + ) { + return serializeSearchParams(value); } if (isPlainObject(value)) { - return stringifyToJsonValue(value) + return stringifyToJsonValue(value); } - return undefined -} + return undefined; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/core/serverSentEvents.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/core/serverSentEvents.gen.ts index fa6a2fb66b..343d25af80 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/core/serverSentEvents.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/core/serverSentEvents.gen.ts @@ -1,8 +1,11 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { Config } from './types.gen' +import type { Config } from './types.gen'; -export type ServerSentEventsOptions = Omit & +export type ServerSentEventsOptions = Omit< + RequestInit, + 'method' +> & Pick & { /** * Fetch API implementation. You can use this option to provide a custom @@ -10,11 +13,11 @@ export type ServerSentEventsOptions = Omit Promise + onRequest?: (url: string, init: RequestInit) => Promise; /** * Callback invoked when a network or parsing error occurs during streaming. * @@ -22,7 +25,7 @@ export type ServerSentEventsOptions = Omit void + onSseError?: (error: unknown) => void; /** * Callback invoked when an event is streamed from the server. * @@ -31,8 +34,8 @@ export type ServerSentEventsOptions = Omit) => void - serializedBody?: RequestInit['body'] + onSseEvent?: (event: StreamEvent) => void; + serializedBody?: RequestInit['body']; /** * Default retry delay in milliseconds. * @@ -40,11 +43,11 @@ export type ServerSentEventsOptions = Omit = Omit Promise - url: string - } + sseSleepFn?: (ms: number) => Promise; + url: string; + }; export interface StreamEvent { - data: TData - event?: string - id?: string - retry?: number + data: TData; + event?: string; + id?: string; + retry?: number; } -export type ServerSentEventsResult = { +export type ServerSentEventsResult< + TData = unknown, + TReturn = void, + TNext = unknown, +> = { stream: AsyncGenerator< TData extends Record ? TData[keyof TData] : TData, TReturn, TNext - > -} + >; +}; export const createSseClient = ({ onRequest, @@ -92,27 +99,29 @@ export const createSseClient = ({ url, ...options }: ServerSentEventsOptions): ServerSentEventsResult => { - let lastEventId: string | undefined + let lastEventId: string | undefined; - const sleep = sseSleepFn ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms))) + const sleep = + sseSleepFn ?? + ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms))); const createStream = async function* () { - let retryDelay: number = sseDefaultRetryDelay ?? 3000 - let attempt = 0 - const signal = options.signal ?? new AbortController().signal + let retryDelay: number = sseDefaultRetryDelay ?? 3000; + let attempt = 0; + const signal = options.signal ?? new AbortController().signal; while (true) { - if (signal.aborted) break + if (signal.aborted) break; - attempt++ + attempt++; const headers = options.headers instanceof Headers ? options.headers - : new Headers(options.headers as Record | undefined) + : new Headers(options.headers as Record | undefined); if (lastEventId !== undefined) { - headers.set('Last-Event-ID', lastEventId) + headers.set('Last-Event-ID', lastEventId); } try { @@ -121,86 +130,94 @@ export const createSseClient = ({ ...options, body: options.serializedBody, headers, - signal - } - let request = new Request(url, requestInit) + signal, + }; + let request = new Request(url, requestInit); if (onRequest) { - request = await onRequest(url, requestInit) + request = await onRequest(url, requestInit); } // fetch must be assigned here, otherwise it would throw the error: // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation - const _fetch = options.fetch ?? globalThis.fetch - const response = await _fetch(request) + const _fetch = options.fetch ?? globalThis.fetch; + const response = await _fetch(request); - if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`) + if (!response.ok) + throw new Error( + `SSE failed: ${response.status} ${response.statusText}`, + ); - if (!response.body) throw new Error('No body in SSE response') + if (!response.body) throw new Error('No body in SSE response'); - const reader = response.body.pipeThrough(new TextDecoderStream()).getReader() + const reader = response.body + .pipeThrough(new TextDecoderStream()) + .getReader(); - let buffer = '' + let buffer = ''; const abortHandler = () => { try { - reader.cancel() + reader.cancel(); } catch { // noop } - } + }; - signal.addEventListener('abort', abortHandler) + signal.addEventListener('abort', abortHandler); try { while (true) { - const { done, value } = await reader.read() - if (done) break - buffer += value + const { done, value } = await reader.read(); + if (done) break; + buffer += value; // Normalize line endings: CRLF -> LF, then CR -> LF - buffer = buffer.replace(/\r\n/g, '\n').replace(/\r/g, '\n') + buffer = buffer.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); - const chunks = buffer.split('\n\n') - buffer = chunks.pop() ?? '' + const chunks = buffer.split('\n\n'); + buffer = chunks.pop() ?? ''; for (const chunk of chunks) { - const lines = chunk.split('\n') - const dataLines: Array = [] - let eventName: string | undefined + const lines = chunk.split('\n'); + const dataLines: Array = []; + let eventName: string | undefined; for (const line of lines) { if (line.startsWith('data:')) { - dataLines.push(line.replace(/^data:\s*/, '')) + dataLines.push(line.replace(/^data:\s*/, '')); } else if (line.startsWith('event:')) { - eventName = line.replace(/^event:\s*/, '') + eventName = line.replace(/^event:\s*/, ''); } else if (line.startsWith('id:')) { - lastEventId = line.replace(/^id:\s*/, '') + lastEventId = line.replace(/^id:\s*/, ''); } else if (line.startsWith('retry:')) { - const parsed = Number.parseInt(line.replace(/^retry:\s*/, ''), 10) + const parsed = Number.parseInt( + line.replace(/^retry:\s*/, ''), + 10, + ); if (!Number.isNaN(parsed)) { - retryDelay = parsed + retryDelay = parsed; } } } - let data: unknown - let parsedJson = false + let data: unknown; + let parsedJson = false; if (dataLines.length) { - const rawData = dataLines.join('\n') + const rawData = dataLines.join('\n'); try { - data = JSON.parse(rawData) - parsedJson = true + data = JSON.parse(rawData); + parsedJson = true; } catch { - data = rawData + data = rawData; } } if (parsedJson) { if (responseValidator) { - await responseValidator(data) + await responseValidator(data); } if (responseTransformer) { - data = await responseTransformer(data) + data = await responseTransformer(data); } } @@ -208,36 +225,42 @@ export const createSseClient = ({ data, event: eventName, id: lastEventId, - retry: retryDelay - }) + retry: retryDelay, + }); if (dataLines.length) { - yield data as any + yield data as any; } } } } finally { - signal.removeEventListener('abort', abortHandler) - reader.releaseLock() + signal.removeEventListener('abort', abortHandler); + reader.releaseLock(); } - break // exit loop on normal completion + break; // exit loop on normal completion } catch (error) { // connection failed or aborted; retry after delay - onSseError?.(error) + onSseError?.(error); - if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) { - break // stop after firing error + if ( + sseMaxRetryAttempts !== undefined && + attempt >= sseMaxRetryAttempts + ) { + break; // stop after firing error } // exponential backoff: double retry each attempt, cap at 30s - const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000) - await sleep(backoff) + const backoff = Math.min( + retryDelay * 2 ** (attempt - 1), + sseMaxRetryDelay ?? 30000, + ); + await sleep(backoff); } } - } + }; - const stream = createStream() + const stream = createStream(); - return { stream } -} + return { stream }; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/core/types.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/core/types.gen.ts index 647ffcc493..643c070c9d 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/core/types.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/core/types.gen.ts @@ -1,7 +1,11 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { Auth, AuthToken } from './auth.gen' -import type { BodySerializer, QuerySerializer, QuerySerializerOptions } from './bodySerializer.gen' +import type { Auth, AuthToken } from './auth.gen'; +import type { + BodySerializer, + QuerySerializer, + QuerySerializerOptions, +} from './bodySerializer.gen'; export type HttpMethod = | 'connect' @@ -12,37 +16,39 @@ export type HttpMethod = | 'patch' | 'post' | 'put' - | 'trace' + | 'trace'; export type Client< RequestFn = never, Config = unknown, MethodFn = never, BuildUrlFn = never, - SseFn = never + SseFn = never, > = { /** * Returns the final request URL. */ - buildUrl: BuildUrlFn - getConfig: () => Config - request: RequestFn - setConfig: (config: Config) => Config + buildUrl: BuildUrlFn; + getConfig: () => Config; + request: RequestFn; + setConfig: (config: Config) => Config; } & { - [K in HttpMethod]: MethodFn -} & ([SseFn] extends [never] ? { sse?: never } : { sse: { [K in HttpMethod]: SseFn } }) + [K in HttpMethod]: MethodFn; +} & ([SseFn] extends [never] + ? { sse?: never } + : { sse: { [K in HttpMethod]: SseFn } }); export interface Config { /** * Auth token or a function returning auth token. The resolved value will be * added to the request payload as defined by its `security` array. */ - auth?: ((auth: Auth) => Promise | AuthToken) | AuthToken + auth?: ((auth: Auth) => Promise | AuthToken) | AuthToken; /** * A function for serializing request body parameter. By default, * {@link JSON.stringify()} will be used. */ - bodySerializer?: BodySerializer | null + bodySerializer?: BodySerializer | null; /** * An object containing any HTTP headers that you want to pre-populate your * `Headers` object with. @@ -53,14 +59,20 @@ export interface Config { | RequestInit['headers'] | Record< string, - string | number | boolean | (string | number | boolean)[] | null | undefined | unknown - > + | string + | number + | boolean + | (string | number | boolean)[] + | null + | undefined + | unknown + >; /** * The request method. * * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} */ - method?: Uppercase + method?: Uppercase; /** * A function for serializing request query parameters. By default, arrays * will be exploded in form style, objects will be exploded in deepObject @@ -71,24 +83,24 @@ export interface Config { * * {@link https://swagger.io/docs/specification/serialization/#query View examples} */ - querySerializer?: QuerySerializer | QuerySerializerOptions + querySerializer?: QuerySerializer | QuerySerializerOptions; /** * A function validating request data. This is useful if you want to ensure * the request conforms to the desired shape, so it can be safely sent to * the server. */ - requestValidator?: (data: unknown) => Promise + requestValidator?: (data: unknown) => Promise; /** * A function transforming response data before it's returned. This is useful * for post-processing data, e.g. converting ISO strings into Date objects. */ - responseTransformer?: (data: unknown) => Promise + responseTransformer?: (data: unknown) => Promise; /** * A function validating response data. This is useful if you want to ensure * the response conforms to the desired shape, so it can be safely passed to * the transformers and returned to the user. */ - responseValidator?: (data: unknown) => Promise + responseValidator?: (data: unknown) => Promise; } type IsExactlyNeverOrNeverUndefined = [T] extends [never] @@ -97,8 +109,10 @@ type IsExactlyNeverOrNeverUndefined = [T] extends [never] ? [undefined] extends [T] ? false : true - : false + : false; export type OmitNever> = { - [K in keyof T as IsExactlyNeverOrNeverUndefined extends true ? never : K]: T[K] -} + [K in keyof T as IsExactlyNeverOrNeverUndefined extends true + ? never + : K]: T[K]; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/core/utils.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/core/utils.gen.ts index bd078be240..0b5389d089 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/core/utils.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/core/utils.gen.ts @@ -1,51 +1,54 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { BodySerializer, QuerySerializer } from './bodySerializer.gen' +import type { BodySerializer, QuerySerializer } from './bodySerializer.gen'; import { type ArraySeparatorStyle, serializeArrayParam, serializeObjectParam, - serializePrimitiveParam -} from './pathSerializer.gen' + serializePrimitiveParam, +} from './pathSerializer.gen'; export interface PathSerializer { - path: Record - url: string + path: Record; + url: string; } -export const PATH_PARAM_RE = /\{[^{}]+\}/g +export const PATH_PARAM_RE = /\{[^{}]+\}/g; export const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { - let url = _url - const matches = _url.match(PATH_PARAM_RE) + let url = _url; + const matches = _url.match(PATH_PARAM_RE); if (matches) { for (const match of matches) { - let explode = false - let name = match.substring(1, match.length - 1) - let style: ArraySeparatorStyle = 'simple' + let explode = false; + let name = match.substring(1, match.length - 1); + let style: ArraySeparatorStyle = 'simple'; if (name.endsWith('*')) { - explode = true - name = name.substring(0, name.length - 1) + explode = true; + name = name.substring(0, name.length - 1); } if (name.startsWith('.')) { - name = name.substring(1) - style = 'label' + name = name.substring(1); + style = 'label'; } else if (name.startsWith(';')) { - name = name.substring(1) - style = 'matrix' + name = name.substring(1); + style = 'matrix'; } - const value = path[name] + const value = path[name]; if (value === undefined || value === null) { - continue + continue; } if (Array.isArray(value)) { - url = url.replace(match, serializeArrayParam({ explode, name, style, value })) - continue + url = url.replace( + match, + serializeArrayParam({ explode, name, style, value }), + ); + continue; } if (typeof value === 'object') { @@ -56,10 +59,10 @@ export const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { name, style, value: value as Record, - valueOnly: true - }) - ) - continue + valueOnly: true, + }), + ); + continue; } if (style === 'matrix') { @@ -67,74 +70,74 @@ export const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => { match, `;${serializePrimitiveParam({ name, - value: value as string - })}` - ) - continue + value: value as string, + })}`, + ); + continue; } const replaceValue = encodeURIComponent( - style === 'label' ? `.${value as string}` : (value as string) - ) - url = url.replace(match, replaceValue) + style === 'label' ? `.${value as string}` : (value as string), + ); + url = url.replace(match, replaceValue); } } - return url -} + return url; +}; export const getUrl = ({ baseUrl, path, query, querySerializer, - url: _url + url: _url, }: { - baseUrl?: string - path?: Record - query?: Record - querySerializer: QuerySerializer - url: string + baseUrl?: string; + path?: Record; + query?: Record; + querySerializer: QuerySerializer; + url: string; }) => { - const pathUrl = _url.startsWith('/') ? _url : `/${_url}` - let url = (baseUrl ?? '') + pathUrl + const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; + let url = (baseUrl ?? '') + pathUrl; if (path) { - url = defaultPathSerializer({ path, url }) + url = defaultPathSerializer({ path, url }); } - let search = query ? querySerializer(query) : '' + let search = query ? querySerializer(query) : ''; if (search.startsWith('?')) { - search = search.substring(1) + search = search.substring(1); } if (search) { - url += `?${search}` + url += `?${search}`; } - return url -} + return url; +}; export function getValidRequestBody(options: { - body?: unknown - bodySerializer?: BodySerializer | null - serializedBody?: unknown + body?: unknown; + bodySerializer?: BodySerializer | null; + serializedBody?: unknown; }) { - const hasBody = options.body !== undefined - const isSerializedBody = hasBody && options.bodySerializer + const hasBody = options.body !== undefined; + const isSerializedBody = hasBody && options.bodySerializer; if (isSerializedBody) { if ('serializedBody' in options) { const hasSerializedBody = - options.serializedBody !== undefined && options.serializedBody !== '' + options.serializedBody !== undefined && options.serializedBody !== ''; - return hasSerializedBody ? options.serializedBody : null + return hasSerializedBody ? options.serializedBody : null; } // not all clients implement a serializedBody property (i.e. client-axios) - return options.body !== '' ? options.body : null + return options.body !== '' ? options.body : null; } // plain/text body if (hasBody) { - return options.body + return options.body; } // no body was provided - return undefined + return undefined; } diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/index.ts b/examples/openapi-ts-tanstack-vue-query/src/client/index.ts index 8e620149f8..75b9a8d127 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/index.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/index.ts @@ -20,8 +20,8 @@ export { updatePet, updatePetWithForm, updateUser, - uploadFile -} from './sdk.gen' + uploadFile, +} from './sdk.gen'; export type { AddPetData, AddPetErrors, @@ -102,5 +102,5 @@ export type { UploadFileResponse, UploadFileResponses, User, - UserArray -} from './types.gen' + UserArray, +} from './types.gen'; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/schemas.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/schemas.gen.ts index 872554d20a..646632e830 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/schemas.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/schemas.gen.ts @@ -3,186 +3,186 @@ export const OrderSchema = { properties: { complete: { - type: 'boolean' + type: 'boolean', }, id: { example: 10, format: 'int64', - type: 'integer' + type: 'integer', }, petId: { example: 198772, format: 'int64', - type: 'integer' + type: 'integer', }, quantity: { example: 7, format: 'int32', - type: 'integer' + type: 'integer', }, shipDate: { format: 'date-time', - type: 'string' + type: 'string', }, status: { description: 'Order Status', enum: ['placed', 'approved', 'delivered'], example: 'approved', - type: 'string' - } + type: 'string', + }, }, type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.Order', xml: { - name: 'order' - } -} as const + name: 'order', + }, +} as const; export const CategorySchema = { properties: { id: { example: 1, format: 'int64', - type: 'integer' + type: 'integer', }, name: { example: 'Dogs', - type: 'string' - } + type: 'string', + }, }, type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.Category', xml: { - name: 'category' - } -} as const + name: 'category', + }, +} as const; export const UserSchema = { properties: { email: { example: 'john@email.com', - type: 'string' + type: 'string', }, firstName: { example: 'John', - type: 'string' + type: 'string', }, id: { example: 10, format: 'int64', - type: 'integer' + type: 'integer', }, lastName: { example: 'James', - type: 'string' + type: 'string', }, password: { example: '12345', - type: 'string' + type: 'string', }, phone: { example: '12345', - type: 'string' + type: 'string', }, userStatus: { description: 'User Status', example: 1, format: 'int32', - type: 'integer' + type: 'integer', }, username: { example: 'theUser', - type: 'string' - } + type: 'string', + }, }, type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.User', xml: { - name: 'user' - } -} as const + name: 'user', + }, +} as const; export const TagSchema = { properties: { id: { format: 'int64', - type: 'integer' + type: 'integer', }, name: { - type: 'string' - } + type: 'string', + }, }, type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.Tag', xml: { - name: 'tag' - } -} as const + name: 'tag', + }, +} as const; export const PetSchema = { properties: { category: { - $ref: '#/components/schemas/Category' + $ref: '#/components/schemas/Category', }, id: { example: 10, format: 'int64', - type: 'integer' + type: 'integer', }, name: { example: 'doggie', - type: 'string' + type: 'string', }, photoUrls: { items: { type: 'string', xml: { - name: 'photoUrl' - } + name: 'photoUrl', + }, }, type: 'array', xml: { - wrapped: true - } + wrapped: true, + }, }, status: { description: 'pet status in the store', enum: ['available', 'pending', 'sold'], - type: 'string' + type: 'string', }, tags: { items: { - $ref: '#/components/schemas/Tag' + $ref: '#/components/schemas/Tag', }, type: 'array', xml: { - wrapped: true - } - } + wrapped: true, + }, + }, }, required: ['name', 'photoUrls'], type: 'object', 'x-swagger-router-model': 'io.swagger.petstore.model.Pet', xml: { - name: 'pet' - } -} as const + name: 'pet', + }, +} as const; export const ApiResponseSchema = { properties: { code: { format: 'int32', - type: 'integer' + type: 'integer', }, message: { - type: 'string' + type: 'string', }, type: { - type: 'string' - } + type: 'string', + }, }, type: 'object', xml: { - name: '##default' - } -} as const + name: '##default', + }, +} as const; diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/sdk.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/sdk.gen.ts index da443221ab..522d457571 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/sdk.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/sdk.gen.ts @@ -1,7 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts -import type { Client, Options as Options2, TDataShape } from './client' -import { client } from './client.gen' +import type { Client, Options as Options2, TDataShape } from './client'; +import { client } from './client.gen'; import type { AddPetData, AddPetErrors, @@ -59,25 +59,25 @@ import type { UpdateUserResponses, UploadFileData, UploadFileErrors, - UploadFileResponses -} from './types.gen' + UploadFileResponses, +} from './types.gen'; export type Options< TData extends TDataShape = TDataShape, - ThrowOnError extends boolean = boolean + ThrowOnError extends boolean = boolean, > = Options2 & { /** * You can provide a client instance returned by `createClient()` instead of * individual options. This might be also useful if you want to implement a * custom client. */ - client?: Client + client?: Client; /** * You can pass arbitrary values through the `meta` object. This can be * used to access values that aren't defined as part of the SDK function. */ - meta?: Record -} + meta?: Record; +}; /** * Add a new pet to the store. @@ -85,7 +85,7 @@ export type Options< * Add a new pet to the store. */ export const addPet = ( - options: Options + options: Options, ) => (options.client ?? client).post({ security: [{ scheme: 'bearer', type: 'http' }], @@ -93,9 +93,9 @@ export const addPet = ( ...options, headers: { 'Content-Type': 'application/json', - ...options.headers - } - }) + ...options.headers, + }, + }); /** * Update an existing pet. @@ -103,17 +103,21 @@ export const addPet = ( * Update an existing pet by Id. */ export const updatePet = ( - options: Options + options: Options, ) => - (options.client ?? client).put({ + (options.client ?? client).put< + UpdatePetResponses, + UpdatePetErrors, + ThrowOnError + >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet', ...options, headers: { 'Content-Type': 'application/json', - ...options.headers - } - }) + ...options.headers, + }, + }); /** * Finds Pets by status. @@ -121,13 +125,17 @@ export const updatePet = ( * Multiple status values can be provided with comma separated strings. */ export const findPetsByStatus = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + FindPetsByStatusResponses, + FindPetsByStatusErrors, + ThrowOnError + >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/findByStatus', - ...options - }) + ...options, + }); /** * Finds Pets by tags. @@ -135,13 +143,17 @@ export const findPetsByStatus = ( * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. */ export const findPetsByTags = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + FindPetsByTagsResponses, + FindPetsByTagsErrors, + ThrowOnError + >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/findByTags', - ...options - }) + ...options, + }); /** * Deletes a pet. @@ -149,13 +161,17 @@ export const findPetsByTags = ( * Delete a pet. */ export const deletePet = ( - options: Options + options: Options, ) => - (options.client ?? client).delete({ + (options.client ?? client).delete< + DeletePetResponses, + DeletePetErrors, + ThrowOnError + >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/{petId}', - ...options - }) + ...options, + }); /** * Find pet by ID. @@ -163,16 +179,20 @@ export const deletePet = ( * Returns a single pet. */ export const getPetById = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + GetPetByIdResponses, + GetPetByIdErrors, + ThrowOnError + >({ security: [ { name: 'api_key', type: 'apiKey' }, - { scheme: 'bearer', type: 'http' } + { scheme: 'bearer', type: 'http' }, ], url: '/pet/{petId}', - ...options - }) + ...options, + }); /** * Updates a pet in the store with form data. @@ -180,7 +200,7 @@ export const getPetById = ( * Updates a pet resource based on the form data. */ export const updatePetWithForm = ( - options: Options + options: Options, ) => (options.client ?? client).post< UpdatePetWithFormResponses, @@ -189,8 +209,8 @@ export const updatePetWithForm = ( >({ security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/{petId}', - ...options - }) + ...options, + }); /** * Uploads an image. @@ -198,18 +218,22 @@ export const updatePetWithForm = ( * Upload image of the pet. */ export const uploadFile = ( - options: Options + options: Options, ) => - (options.client ?? client).post({ + (options.client ?? client).post< + UploadFileResponses, + UploadFileErrors, + ThrowOnError + >({ bodySerializer: null, security: [{ scheme: 'bearer', type: 'http' }], url: '/pet/{petId}/uploadImage', ...options, headers: { 'Content-Type': 'application/octet-stream', - ...options.headers - } - }) + ...options.headers, + }, + }); /** * Returns pet inventories by status. @@ -217,13 +241,17 @@ export const uploadFile = ( * Returns a map of status codes to quantities. */ export const getInventory = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).get({ + (options?.client ?? client).get< + GetInventoryResponses, + GetInventoryErrors, + ThrowOnError + >({ security: [{ name: 'api_key', type: 'apiKey' }], url: '/store/inventory', - ...options - }) + ...options, + }); /** * Place an order for a pet. @@ -231,16 +259,20 @@ export const getInventory = ( * Place a new order in the store. */ export const placeOrder = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).post({ + (options?.client ?? client).post< + PlaceOrderResponses, + PlaceOrderErrors, + ThrowOnError + >({ url: '/store/order', ...options, headers: { 'Content-Type': 'application/json', - ...options?.headers - } - }) + ...options?.headers, + }, + }); /** * Delete purchase order by identifier. @@ -248,12 +280,16 @@ export const placeOrder = ( * For valid response try integer IDs with value < 1000. Anything above 1000 or non-integers will generate API errors. */ export const deleteOrder = ( - options: Options + options: Options, ) => - (options.client ?? client).delete({ + (options.client ?? client).delete< + DeleteOrderResponses, + DeleteOrderErrors, + ThrowOnError + >({ url: '/store/order/{orderId}', - ...options - }) + ...options, + }); /** * Find purchase order by ID. @@ -261,12 +297,16 @@ export const deleteOrder = ( * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. */ export const getOrderById = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + GetOrderByIdResponses, + GetOrderByIdErrors, + ThrowOnError + >({ url: '/store/order/{orderId}', - ...options - }) + ...options, + }); /** * Create user. @@ -274,16 +314,20 @@ export const getOrderById = ( * This can only be done by the logged in user. */ export const createUser = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).post({ + (options?.client ?? client).post< + CreateUserResponses, + CreateUserErrors, + ThrowOnError + >({ url: '/user', ...options, headers: { 'Content-Type': 'application/json', - ...options?.headers - } - }) + ...options?.headers, + }, + }); /** * Creates list of users with given input array. @@ -291,7 +335,7 @@ export const createUser = ( * Creates list of users with given input array. */ export const createUsersWithListInput = ( - options?: Options + options?: Options, ) => (options?.client ?? client).post< CreateUsersWithListInputResponses, @@ -302,9 +346,9 @@ export const createUsersWithListInput = ( ...options, headers: { 'Content-Type': 'application/json', - ...options?.headers - } - }) + ...options?.headers, + }, + }); /** * Logs user into the system. @@ -312,12 +356,16 @@ export const createUsersWithListInput = ( * Log into the system. */ export const loginUser = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).get({ + (options?.client ?? client).get< + LoginUserResponses, + LoginUserErrors, + ThrowOnError + >({ url: '/user/login', - ...options - }) + ...options, + }); /** * Logs out current logged in user session. @@ -325,12 +373,16 @@ export const loginUser = ( * Log user out of the system. */ export const logoutUser = ( - options?: Options + options?: Options, ) => - (options?.client ?? client).get({ + (options?.client ?? client).get< + LogoutUserResponses, + LogoutUserErrors, + ThrowOnError + >({ url: '/user/logout', - ...options - }) + ...options, + }); /** * Delete user resource. @@ -338,12 +390,16 @@ export const logoutUser = ( * This can only be done by the logged in user. */ export const deleteUser = ( - options: Options + options: Options, ) => - (options.client ?? client).delete({ + (options.client ?? client).delete< + DeleteUserResponses, + DeleteUserErrors, + ThrowOnError + >({ url: '/user/{username}', - ...options - }) + ...options, + }); /** * Get user by user name. @@ -351,12 +407,16 @@ export const deleteUser = ( * Get user detail based on username. */ export const getUserByName = ( - options: Options + options: Options, ) => - (options.client ?? client).get({ + (options.client ?? client).get< + GetUserByNameResponses, + GetUserByNameErrors, + ThrowOnError + >({ url: '/user/{username}', - ...options - }) + ...options, + }); /** * Update user resource. @@ -364,13 +424,17 @@ export const getUserByName = ( * This can only be done by the logged in user. */ export const updateUser = ( - options: Options + options: Options, ) => - (options.client ?? client).put({ + (options.client ?? client).put< + UpdateUserResponses, + UpdateUserErrors, + ThrowOnError + >({ url: '/user/{username}', ...options, headers: { 'Content-Type': 'application/json', - ...options.headers - } - }) + ...options.headers, + }, + }); diff --git a/examples/openapi-ts-tanstack-vue-query/src/client/types.gen.ts b/examples/openapi-ts-tanstack-vue-query/src/client/types.gen.ts index 99ce8e7d8e..a2e6be0fa4 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/client/types.gen.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/client/types.gen.ts @@ -1,693 +1,699 @@ // This file is auto-generated by @hey-api/openapi-ts export type ClientOptions = { - baseUrl: 'https://petstore3.swagger.io/api/v3' | (string & {}) -} + baseUrl: 'https://petstore3.swagger.io/api/v3' | (string & {}); +}; export type Order = { - complete?: boolean - id?: number - petId?: number - quantity?: number - shipDate?: string + complete?: boolean; + id?: number; + petId?: number; + quantity?: number; + shipDate?: string; /** * Order Status */ - status?: 'placed' | 'approved' | 'delivered' -} + status?: 'placed' | 'approved' | 'delivered'; +}; export type Category = { - id?: number - name?: string -} + id?: number; + name?: string; +}; export type User = { - email?: string - firstName?: string - id?: number - lastName?: string - password?: string - phone?: string + email?: string; + firstName?: string; + id?: number; + lastName?: string; + password?: string; + phone?: string; /** * User Status */ - userStatus?: number - username?: string -} + userStatus?: number; + username?: string; +}; export type Tag = { - id?: number - name?: string -} + id?: number; + name?: string; +}; export type Pet = { - category?: Category - id?: number - name: string - photoUrls: Array + category?: Category; + id?: number; + name: string; + photoUrls: Array; /** * pet status in the store */ - status?: 'available' | 'pending' | 'sold' - tags?: Array -} + status?: 'available' | 'pending' | 'sold'; + tags?: Array; +}; export type ApiResponse = { - code?: number - message?: string - type?: string -} + code?: number; + message?: string; + type?: string; +}; -export type Pet2 = Pet +export type Pet2 = Pet; /** * List of user object */ -export type UserArray = Array +export type UserArray = Array; export type AddPetData = { /** * Create a new pet in the store */ - body: Pet - path?: never - query?: never - url: '/pet' -} + body: Pet; + path?: never; + query?: never; + url: '/pet'; +}; export type AddPetErrors = { /** * Invalid input */ - 400: unknown + 400: unknown; /** * Validation exception */ - 422: unknown + 422: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type AddPetResponses = { /** * Successful operation */ - 200: Pet -} + 200: Pet; +}; -export type AddPetResponse = AddPetResponses[keyof AddPetResponses] +export type AddPetResponse = AddPetResponses[keyof AddPetResponses]; export type UpdatePetData = { /** * Update an existent pet in the store */ - body: Pet - path?: never - query?: never - url: '/pet' -} + body: Pet; + path?: never; + query?: never; + url: '/pet'; +}; export type UpdatePetErrors = { /** * Invalid ID supplied */ - 400: unknown + 400: unknown; /** * Pet not found */ - 404: unknown + 404: unknown; /** * Validation exception */ - 422: unknown + 422: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type UpdatePetResponses = { /** * Successful operation */ - 200: Pet -} + 200: Pet; +}; -export type UpdatePetResponse = UpdatePetResponses[keyof UpdatePetResponses] +export type UpdatePetResponse = UpdatePetResponses[keyof UpdatePetResponses]; export type FindPetsByStatusData = { - body?: never - path?: never + body?: never; + path?: never; query: { /** * Status values that need to be considered for filter */ - status: 'available' | 'pending' | 'sold' - } - url: '/pet/findByStatus' -} + status: 'available' | 'pending' | 'sold'; + }; + url: '/pet/findByStatus'; +}; export type FindPetsByStatusErrors = { /** * Invalid status value */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type FindPetsByStatusResponses = { /** * successful operation */ - 200: Array -} + 200: Array; +}; -export type FindPetsByStatusResponse = FindPetsByStatusResponses[keyof FindPetsByStatusResponses] +export type FindPetsByStatusResponse = + FindPetsByStatusResponses[keyof FindPetsByStatusResponses]; export type FindPetsByTagsData = { - body?: never - path?: never + body?: never; + path?: never; query: { /** * Tags to filter by */ - tags: Array - } - url: '/pet/findByTags' -} + tags: Array; + }; + url: '/pet/findByTags'; +}; export type FindPetsByTagsErrors = { /** * Invalid tag value */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type FindPetsByTagsResponses = { /** * successful operation */ - 200: Array -} + 200: Array; +}; -export type FindPetsByTagsResponse = FindPetsByTagsResponses[keyof FindPetsByTagsResponses] +export type FindPetsByTagsResponse = + FindPetsByTagsResponses[keyof FindPetsByTagsResponses]; export type DeletePetData = { - body?: never + body?: never; headers?: { - api_key?: string - } + api_key?: string; + }; path: { /** * Pet id to delete */ - petId: number - } - query?: never - url: '/pet/{petId}' -} + petId: number; + }; + query?: never; + url: '/pet/{petId}'; +}; export type DeletePetErrors = { /** * Invalid pet value */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type DeletePetResponses = { /** * Pet deleted */ - 200: unknown -} + 200: unknown; +}; export type GetPetByIdData = { - body?: never + body?: never; path: { /** * ID of pet to return */ - petId: number - } - query?: never - url: '/pet/{petId}' -} + petId: number; + }; + query?: never; + url: '/pet/{petId}'; +}; export type GetPetByIdErrors = { /** * Invalid ID supplied */ - 400: unknown + 400: unknown; /** * Pet not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type GetPetByIdResponses = { /** * successful operation */ - 200: Pet -} + 200: Pet; +}; -export type GetPetByIdResponse = GetPetByIdResponses[keyof GetPetByIdResponses] +export type GetPetByIdResponse = GetPetByIdResponses[keyof GetPetByIdResponses]; export type UpdatePetWithFormData = { - body?: never + body?: never; path: { /** * ID of pet that needs to be updated */ - petId: number - } + petId: number; + }; query?: { /** * Name of pet that needs to be updated */ - name?: string + name?: string; /** * Status of pet that needs to be updated */ - status?: string - } - url: '/pet/{petId}' -} + status?: string; + }; + url: '/pet/{petId}'; +}; export type UpdatePetWithFormErrors = { /** * Invalid input */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type UpdatePetWithFormResponses = { /** * successful operation */ - 200: Pet -} + 200: Pet; +}; -export type UpdatePetWithFormResponse = UpdatePetWithFormResponses[keyof UpdatePetWithFormResponses] +export type UpdatePetWithFormResponse = + UpdatePetWithFormResponses[keyof UpdatePetWithFormResponses]; export type UploadFileData = { - body?: Blob | File + body?: Blob | File; path: { /** * ID of pet to update */ - petId: number - } + petId: number; + }; query?: { /** * Additional Metadata */ - additionalMetadata?: string - } - url: '/pet/{petId}/uploadImage' -} + additionalMetadata?: string; + }; + url: '/pet/{petId}/uploadImage'; +}; export type UploadFileErrors = { /** * No file uploaded */ - 400: unknown + 400: unknown; /** * Pet not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type UploadFileResponses = { /** * successful operation */ - 200: ApiResponse -} + 200: ApiResponse; +}; -export type UploadFileResponse = UploadFileResponses[keyof UploadFileResponses] +export type UploadFileResponse = UploadFileResponses[keyof UploadFileResponses]; export type GetInventoryData = { - body?: never - path?: never - query?: never - url: '/store/inventory' -} + body?: never; + path?: never; + query?: never; + url: '/store/inventory'; +}; export type GetInventoryErrors = { /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type GetInventoryResponses = { /** * successful operation */ 200: { - [key: string]: number - } -} + [key: string]: number; + }; +}; -export type GetInventoryResponse = GetInventoryResponses[keyof GetInventoryResponses] +export type GetInventoryResponse = + GetInventoryResponses[keyof GetInventoryResponses]; export type PlaceOrderData = { - body?: Order - path?: never - query?: never - url: '/store/order' -} + body?: Order; + path?: never; + query?: never; + url: '/store/order'; +}; export type PlaceOrderErrors = { /** * Invalid input */ - 400: unknown + 400: unknown; /** * Validation exception */ - 422: unknown + 422: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type PlaceOrderResponses = { /** * successful operation */ - 200: Order -} + 200: Order; +}; -export type PlaceOrderResponse = PlaceOrderResponses[keyof PlaceOrderResponses] +export type PlaceOrderResponse = PlaceOrderResponses[keyof PlaceOrderResponses]; export type DeleteOrderData = { - body?: never + body?: never; path: { /** * ID of the order that needs to be deleted */ - orderId: number - } - query?: never - url: '/store/order/{orderId}' -} + orderId: number; + }; + query?: never; + url: '/store/order/{orderId}'; +}; export type DeleteOrderErrors = { /** * Invalid ID supplied */ - 400: unknown + 400: unknown; /** * Order not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type DeleteOrderResponses = { /** * order deleted */ - 200: unknown -} + 200: unknown; +}; export type GetOrderByIdData = { - body?: never + body?: never; path: { /** * ID of order that needs to be fetched */ - orderId: number - } - query?: never - url: '/store/order/{orderId}' -} + orderId: number; + }; + query?: never; + url: '/store/order/{orderId}'; +}; export type GetOrderByIdErrors = { /** * Invalid ID supplied */ - 400: unknown + 400: unknown; /** * Order not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type GetOrderByIdResponses = { /** * successful operation */ - 200: Order -} + 200: Order; +}; -export type GetOrderByIdResponse = GetOrderByIdResponses[keyof GetOrderByIdResponses] +export type GetOrderByIdResponse = + GetOrderByIdResponses[keyof GetOrderByIdResponses]; export type CreateUserData = { /** * Created user object */ - body?: User - path?: never - query?: never - url: '/user' -} + body?: User; + path?: never; + query?: never; + url: '/user'; +}; export type CreateUserErrors = { /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type CreateUserResponses = { /** * successful operation */ - 200: User -} + 200: User; +}; -export type CreateUserResponse = CreateUserResponses[keyof CreateUserResponses] +export type CreateUserResponse = CreateUserResponses[keyof CreateUserResponses]; export type CreateUsersWithListInputData = { - body?: Array - path?: never - query?: never - url: '/user/createWithList' -} + body?: Array; + path?: never; + query?: never; + url: '/user/createWithList'; +}; export type CreateUsersWithListInputErrors = { /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type CreateUsersWithListInputResponses = { /** * Successful operation */ - 200: User -} + 200: User; +}; export type CreateUsersWithListInputResponse = - CreateUsersWithListInputResponses[keyof CreateUsersWithListInputResponses] + CreateUsersWithListInputResponses[keyof CreateUsersWithListInputResponses]; export type LoginUserData = { - body?: never - path?: never + body?: never; + path?: never; query?: { /** * The password for login in clear text */ - password?: string + password?: string; /** * The user name for login */ - username?: string - } - url: '/user/login' -} + username?: string; + }; + url: '/user/login'; +}; export type LoginUserErrors = { /** * Invalid username/password supplied */ - 400: unknown + 400: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type LoginUserResponses = { /** * successful operation */ - 200: string -} + 200: string; +}; -export type LoginUserResponse = LoginUserResponses[keyof LoginUserResponses] +export type LoginUserResponse = LoginUserResponses[keyof LoginUserResponses]; export type LogoutUserData = { - body?: never - path?: never - query?: never - url: '/user/logout' -} + body?: never; + path?: never; + query?: never; + url: '/user/logout'; +}; export type LogoutUserErrors = { /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type LogoutUserResponses = { /** * successful operation */ - 200: unknown -} + 200: unknown; +}; export type DeleteUserData = { - body?: never + body?: never; path: { /** * The name that needs to be deleted */ - username: string - } - query?: never - url: '/user/{username}' -} + username: string; + }; + query?: never; + url: '/user/{username}'; +}; export type DeleteUserErrors = { /** * Invalid username supplied */ - 400: unknown + 400: unknown; /** * User not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type DeleteUserResponses = { /** * User deleted */ - 200: unknown -} + 200: unknown; +}; export type GetUserByNameData = { - body?: never + body?: never; path: { /** * The name that needs to be fetched. Use user1 for testing */ - username: string - } - query?: never - url: '/user/{username}' -} + username: string; + }; + query?: never; + url: '/user/{username}'; +}; export type GetUserByNameErrors = { /** * Invalid username supplied */ - 400: unknown + 400: unknown; /** * User not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type GetUserByNameResponses = { /** * successful operation */ - 200: User -} + 200: User; +}; -export type GetUserByNameResponse = GetUserByNameResponses[keyof GetUserByNameResponses] +export type GetUserByNameResponse = + GetUserByNameResponses[keyof GetUserByNameResponses]; export type UpdateUserData = { /** * Update an existent user in the store */ - body?: User + body?: User; path: { /** * name that need to be deleted */ - username: string - } - query?: never - url: '/user/{username}' -} + username: string; + }; + query?: never; + url: '/user/{username}'; +}; export type UpdateUserErrors = { /** * bad request */ - 400: unknown + 400: unknown; /** * user not found */ - 404: unknown + 404: unknown; /** * Unexpected error */ - default: unknown -} + default: unknown; +}; export type UpdateUserResponses = { /** * successful operation */ - 200: unknown -} + 200: unknown; +}; diff --git a/examples/openapi-ts-tanstack-vue-query/src/main.ts b/examples/openapi-ts-tanstack-vue-query/src/main.ts index 31bdff7737..b143aec3f0 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/main.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/main.ts @@ -1,12 +1,12 @@ -import './assets/main.css' +import './assets/main.css'; -import { VueQueryPlugin } from '@tanstack/vue-query' -import { createPinia } from 'pinia' -import { createApp } from 'vue' +import { VueQueryPlugin } from '@tanstack/vue-query'; +import { createPinia } from 'pinia'; +import { createApp } from 'vue'; -import App from './App.vue' -import { client } from './client/client.gen' -import router from './router' +import App from './App.vue'; +import { client } from './client/client.gen'; +import router from './router'; // configure internal service client client.setConfig({ @@ -14,14 +14,14 @@ client.setConfig({ baseUrl: 'https://petstore3.swagger.io/api/v3', // set default headers for requests headers: { - Authorization: 'Bearer ' - } -}) + Authorization: 'Bearer ', + }, +}); -const app = createApp(App) +const app = createApp(App); -app.use(createPinia()) -app.use(router) -app.use(VueQueryPlugin) +app.use(createPinia()); +app.use(router); +app.use(VueQueryPlugin); -app.mount('#app') +app.mount('#app'); diff --git a/examples/openapi-ts-tanstack-vue-query/src/router/index.ts b/examples/openapi-ts-tanstack-vue-query/src/router/index.ts index 4631b7e71d..fe0c408936 100644 --- a/examples/openapi-ts-tanstack-vue-query/src/router/index.ts +++ b/examples/openapi-ts-tanstack-vue-query/src/router/index.ts @@ -1,6 +1,6 @@ -import { createRouter, createWebHistory } from 'vue-router' +import { createRouter, createWebHistory } from 'vue-router'; -import TanstackExample from '@/views/TanstackExample.vue' +import TanstackExample from '@/views/TanstackExample.vue'; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -8,9 +8,9 @@ const router = createRouter({ { component: TanstackExample, name: 'home', - path: '/' - } - ] -}) + path: '/', + }, + ], +}); -export default router +export default router; diff --git a/examples/openapi-ts-tanstack-vue-query/tailwind.config.ts b/examples/openapi-ts-tanstack-vue-query/tailwind.config.ts index 8cb3cc6c03..4cbe78a030 100644 --- a/examples/openapi-ts-tanstack-vue-query/tailwind.config.ts +++ b/examples/openapi-ts-tanstack-vue-query/tailwind.config.ts @@ -1,9 +1,9 @@ -import type { Config } from 'tailwindcss' +import type { Config } from 'tailwindcss'; export default { content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], plugins: [], theme: { - extend: {} - } -} satisfies Config + extend: {}, + }, +} satisfies Config; diff --git a/examples/openapi-ts-tanstack-vue-query/vite.config.ts b/examples/openapi-ts-tanstack-vue-query/vite.config.ts index 2ad0b17366..8c0aadd9a4 100644 --- a/examples/openapi-ts-tanstack-vue-query/vite.config.ts +++ b/examples/openapi-ts-tanstack-vue-query/vite.config.ts @@ -1,16 +1,16 @@ -import { fileURLToPath, URL } from 'node:url' +import { fileURLToPath, URL } from 'node:url'; -import { createViteConfig } from '@config/vite-base' -import vue from '@vitejs/plugin-vue' -import vueJsx from '@vitejs/plugin-vue-jsx' -import vueDevTools from 'vite-plugin-vue-devtools' +import { createViteConfig } from '@config/vite-base'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import vueDevTools from 'vite-plugin-vue-devtools'; // https://vitejs.dev/config/ export default createViteConfig({ plugins: [vue(), vueJsx(), vueDevTools()], resolve: { alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)) - } - } -}) + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, +}); diff --git a/examples/openapi-ts-tanstack-vue-query/vitest.config.ts b/examples/openapi-ts-tanstack-vue-query/vitest.config.ts index b1c1888c6f..a1ba062bd4 100644 --- a/examples/openapi-ts-tanstack-vue-query/vitest.config.ts +++ b/examples/openapi-ts-tanstack-vue-query/vitest.config.ts @@ -1,16 +1,16 @@ -import { fileURLToPath } from 'node:url' +import { fileURLToPath } from 'node:url'; -import { createVitestConfig } from '@config/vite-base' -import { configDefaults, mergeConfig } from 'vitest/config' +import { createVitestConfig } from '@config/vite-base'; +import { configDefaults, mergeConfig } from 'vitest/config'; -import viteConfig from './vite.config' +import viteConfig from './vite.config'; export default mergeConfig( viteConfig, createVitestConfig(fileURLToPath(new URL('./', import.meta.url)), { test: { environment: 'jsdom', - exclude: [...configDefaults.exclude, 'e2e/**'] - } - }) -) + exclude: [...configDefaults.exclude, 'e2e/**'], + }, + }), +); diff --git a/package.json b/package.json index b12cc8d103..edd3e2ce8e 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,22 @@ { "name": "openapi-ts-monorepo", "version": "0.1.0", - "description": "Public @hey-api monorepo", "private": true, + "description": "Public @hey-api monorepo", "homepage": "https://heyapi.dev", - "repository": { - "type": "git", - "url": "git+https://github.com/hey-api/openapi-ts.git" - }, "bugs": { "url": "https://github.com/hey-api/openapi-ts/issues" }, "license": "MIT", "author": { - "email": "lubos@heyapi.dev", "name": "Hey API", + "email": "lubos@heyapi.dev", "url": "https://heyapi.dev" }, + "repository": { + "type": "git", + "url": "git+https://github.com/hey-api/openapi-ts.git" + }, "funding": "https://github.com/sponsors/hey-api", "type": "module", "scripts": { @@ -24,9 +24,9 @@ "changeset": "changeset", "examples:check": "sh ./scripts/examples-check.sh", "examples:generate": "sh ./scripts/examples-generate.sh", - "format": "prettier --write .", - "lint:fix": "prettier --check --write . && eslint . --fix", - "lint": "prettier --check . && eslint .", + "format": "oxfmt --write .", + "lint:fix": "oxfmt --write . && oxlint . --fix", + "lint": "oxfmt --check . && oxlint .", "prepare": "husky", "test:changelog": "vitest run __tests__/*.test.ts", "test:changelog:watch": "vitest watch __tests__/*.test.ts", @@ -36,9 +36,6 @@ "test": "turbo run test", "typecheck": "turbo run typecheck" }, - "engines": { - "node": ">=20.19.0" - }, "devDependencies": { "@arethetypeswrong/cli": "0.18.2", "@changesets/cli": "2.29.8", @@ -50,20 +47,16 @@ "@hey-api/custom-client": "workspace:*", "@hey-api/openapi-ts": "workspace:*", "@types/node": "22.10.5", - "@typescript-eslint/eslint-plugin": "8.29.1", "@vitest/coverage-v8": "3.2.4", "dotenv": "17.2.3", - "eslint": "9.39.1", - "eslint-config-prettier": "9.1.2", "eslint-plugin-simple-import-sort": "12.1.1", "eslint-plugin-sort-destructure-keys": "2.0.0", "eslint-plugin-sort-keys-fix": "1.1.2", "eslint-plugin-typescript-sort-keys": "3.3.0", - "eslint-plugin-vue": "9.33.0", - "globals": "16.5.0", "husky": "9.1.7", "lint-staged": "16.2.7", - "prettier": "3.4.2", + "oxfmt": "0.24.0", + "oxlint": "1.39.0", "rollup": "4.53.3", "rollup-plugin-dts": "6.1.1", "ts-node": "10.9.2", @@ -73,5 +66,8 @@ "typescript-eslint": "8.29.1", "vitest": "3.2.4" }, + "engines": { + "node": ">=20.19.0" + }, "packageManager": "pnpm@10.25.0" } diff --git a/packages/codegen-core/package.json b/packages/codegen-core/package.json index d32be46fd7..b1a94413e0 100644 --- a/packages/codegen-core/package.json +++ b/packages/codegen-core/package.json @@ -2,27 +2,32 @@ "name": "@hey-api/codegen-core", "version": "0.4.0", "description": "🧱 TypeScript framework for generating files.", + "keywords": [ + "codegen", + "generator", + "javascript", + "node", + "typescript" + ], "homepage": "https://heyapi.dev/", - "repository": { - "type": "git", - "url": "git+https://github.com/hey-api/openapi-ts.git" - }, "bugs": { "url": "https://github.com/hey-api/openapi-ts/issues" }, "license": "MIT", "author": { - "email": "lubos@heyapi.dev", "name": "Hey API", + "email": "lubos@heyapi.dev", "url": "https://heyapi.dev" }, + "repository": { + "type": "git", + "url": "git+https://github.com/hey-api/openapi-ts.git" + }, "funding": "https://github.com/sponsors/hey-api", - "keywords": [ - "codegen", - "generator", - "javascript", - "node", - "typescript" + "files": [ + "dist", + "LICENSE.md", + "README.md" ], "type": "module", "main": "./dist/index.cjs", @@ -41,11 +46,6 @@ }, "./package.json": "./package.json" }, - "files": [ - "dist", - "LICENSE.md", - "README.md" - ], "scripts": { "build": "tsdown && pnpm check-exports", "check-exports": "attw --pack . --profile node16", @@ -57,20 +57,20 @@ "test": "vitest run", "typecheck": "tsc --noEmit" }, - "engines": { - "node": ">=20.19.0" - }, "dependencies": { "ansi-colors": "4.1.3", "color-support": "1.1.3" }, - "peerDependencies": { - "typescript": ">=5.5.3" - }, "devDependencies": { "@config/vite-base": "workspace:*", "eslint": "9.39.1", "prettier": "3.4.2", "typescript": "5.9.3" + }, + "peerDependencies": { + "typescript": ">=5.5.3" + }, + "engines": { + "node": ">=20.19.0" } } diff --git a/packages/config-vite-base/package.json b/packages/config-vite-base/package.json index ba70b20ed8..6e562ba837 100644 --- a/packages/config-vite-base/package.json +++ b/packages/config-vite-base/package.json @@ -1,12 +1,13 @@ { "name": "@config/vite-base", "version": "0.0.1", + "private": true, "description": "Base configuration for Vite and Vitest", + "license": "MIT", + "type": "module", "main": "dist/index.mjs", "module": "dist/index.mjs", "types": "dist/index.d.mts", - "license": "MIT", - "type": "module", "scripts": { "build": "tsdown" }, @@ -16,6 +17,5 @@ }, "devDependencies": { "typescript": "^5.9.2" - }, - "private": true + } } diff --git a/packages/custom-client/package.json b/packages/custom-client/package.json index 0fe1e544e1..e29ebc8dbc 100644 --- a/packages/custom-client/package.json +++ b/packages/custom-client/package.json @@ -1,24 +1,30 @@ { "name": "@hey-api/custom-client", "version": "0.1.1", - "description": "Custom client for `@hey-api/openapi-ts` codegen. Used for testing.", "private": true, + "description": "Custom client for `@hey-api/openapi-ts` codegen. Used for testing.", "homepage": "https://heyapi.dev/", - "repository": { - "type": "git", - "url": "git+https://github.com/hey-api/openapi-ts.git" - }, "bugs": { "url": "https://github.com/hey-api/openapi-ts/issues" }, "license": "MIT", "author": { - "email": "lubos@heyapi.dev", "name": "Hey API", + "email": "lubos@heyapi.dev", "url": "https://heyapi.dev" }, + "repository": { + "type": "git", + "url": "git+https://github.com/hey-api/openapi-ts.git" + }, "funding": "https://github.com/sponsors/hey-api", + "files": [ + "dist", + "LICENSE.md", + "src" + ], "type": "module", + "sideEffects": false, "main": "./dist/index.cjs", "module": "./dist/index.mjs", "types": "./dist/index.d.mts", @@ -45,12 +51,6 @@ }, "./package.json": "./package.json" }, - "sideEffects": false, - "files": [ - "dist", - "LICENSE.md", - "src" - ], "scripts": { "build": "tsdown && rollup -c && pnpm check-exports", "check-exports": "attw --profile node16 --pack .", @@ -62,13 +62,13 @@ "test": "vitest run", "typecheck": "vitest --typecheck --watch=false" }, - "peerDependencies": { - "@hey-api/codegen-core": "<2", - "@hey-api/openapi-ts": "<2" - }, "devDependencies": { "@config/vite-base": "workspace:*", "@hey-api/codegen-core": "workspace:*", "@hey-api/openapi-ts": "workspace:*" + }, + "peerDependencies": { + "@hey-api/codegen-core": "<2", + "@hey-api/openapi-ts": "<2" } } diff --git a/packages/custom-client/src/core/pathSerializer.ts b/packages/custom-client/src/core/pathSerializer.ts index d692cf0a39..2e8cff192a 100644 --- a/packages/custom-client/src/core/pathSerializer.ts +++ b/packages/custom-client/src/core/pathSerializer.ts @@ -1,6 +1,5 @@ interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/packages/custom-client/src/types.ts b/packages/custom-client/src/types.ts index bfb98b68d2..b68fd0038e 100644 --- a/packages/custom-client/src/types.ts +++ b/packages/custom-client/src/types.ts @@ -3,8 +3,7 @@ import type { Client as CoreClient, Config as CoreConfig } from './core/types'; import type { Middleware } from './utils'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -44,8 +43,8 @@ export interface RequestOptions< ThrowOnError extends boolean = boolean, Url extends string = string, > extends Config<{ - throwOnError: ThrowOnError; - }> { + throwOnError: ThrowOnError; +}> { /** * Any body that you want to add to your request. * diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 1512c7816f..0bd5c6d1ab 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -2,21 +2,6 @@ "name": "@hey-api/nuxt", "version": "0.2.1", "description": "🚀 Nuxt module for `@hey-api/openapi-ts` codegen.", - "homepage": "https://heyapi.dev/", - "repository": { - "type": "git", - "url": "git+https://github.com/hey-api/openapi-ts.git" - }, - "bugs": { - "url": "https://github.com/hey-api/openapi-ts/issues" - }, - "license": "MIT", - "author": { - "email": "lubos@heyapi.dev", - "name": "Hey API", - "url": "https://heyapi.dev" - }, - "funding": "https://github.com/sponsors/hey-api", "keywords": [ "client", "codegen", @@ -30,7 +15,30 @@ "typescript", "vue" ], + "homepage": "https://heyapi.dev/", + "bugs": { + "url": "https://github.com/hey-api/openapi-ts/issues" + }, + "license": "MIT", + "author": { + "name": "Hey API", + "email": "lubos@heyapi.dev", + "url": "https://heyapi.dev" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hey-api/openapi-ts.git" + }, + "funding": "https://github.com/sponsors/hey-api", + "files": [ + "dist", + "LICENSE.md", + "README.md" + ], "type": "module", + "sideEffects": false, + "main": "./dist/module.cjs", + "types": "./dist/types.d.ts", "exports": { ".": { "types": "./dist/types.d.ts", @@ -38,14 +46,6 @@ "require": "./dist/module.cjs" } }, - "main": "./dist/module.cjs", - "types": "./dist/types.d.ts", - "sideEffects": false, - "files": [ - "dist", - "LICENSE.md", - "README.md" - ], "scripts": { "build": "nuxt-module-build build", "dev": "tsdown --watch", @@ -57,11 +57,6 @@ "defu": "6.1.4", "mlly": "1.8.0" }, - "peerDependencies": { - "@hey-api/openapi-ts": "<2", - "nuxt": ">=3.0.0", - "vue": ">=3.5.13" - }, "devDependencies": { "@config/vite-base": "workspace:*", "@hey-api/openapi-ts": "workspace:*", @@ -69,5 +64,10 @@ "@nuxt/schema": "3.16.2", "@nuxt/test-utils": "3.21.0", "vite": "7.1.2" + }, + "peerDependencies": { + "@hey-api/openapi-ts": "<2", + "nuxt": ">=3.0.0", + "vue": ">=3.5.13" } } diff --git a/packages/openapi-ts-tests/main/package.json b/packages/openapi-ts-tests/main/package.json index 89935a70eb..b652a83394 100644 --- a/packages/openapi-ts-tests/main/package.json +++ b/packages/openapi-ts-tests/main/package.json @@ -11,9 +11,6 @@ "test": "vitest run", "typecheck": "tsc --noEmit" }, - "engines": { - "node": ">=20.19.0" - }, "devDependencies": { "@angular-devkit/build-angular": "19.2.19", "@angular/animations": "19.2.17", @@ -55,5 +52,8 @@ "valibot": "1.2.0", "vue": "3.5.25", "zod": "4.1.12" + }, + "engines": { + "node": ">=20.19.0" } } diff --git a/packages/openapi-ts-tests/main/test/custom/client/core/pathSerializer.ts b/packages/openapi-ts-tests/main/test/custom/client/core/pathSerializer.ts index d692cf0a39..2e8cff192a 100644 --- a/packages/openapi-ts-tests/main/test/custom/client/core/pathSerializer.ts +++ b/packages/openapi-ts-tests/main/test/custom/client/core/pathSerializer.ts @@ -1,6 +1,5 @@ interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/packages/openapi-ts-tests/main/test/custom/client/types.ts b/packages/openapi-ts-tests/main/test/custom/client/types.ts index 2be89c57fa..372680d208 100644 --- a/packages/openapi-ts-tests/main/test/custom/client/types.ts +++ b/packages/openapi-ts-tests/main/test/custom/client/types.ts @@ -3,8 +3,7 @@ import type { Client as CoreClient, Config as CoreConfig } from './core/types'; import type { Middleware } from './utils'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -44,8 +43,8 @@ export interface RequestOptions< ThrowOnError extends boolean = boolean, Url extends string = string, > extends Config<{ - throwOnError: ThrowOnError; - }> { + throwOnError: ThrowOnError; +}> { /** * Any body that you want to add to your request. * diff --git a/packages/openapi-ts-tests/sdks/package.json b/packages/openapi-ts-tests/sdks/package.json index 99315ba685..2804eef977 100644 --- a/packages/openapi-ts-tests/sdks/package.json +++ b/packages/openapi-ts-tests/sdks/package.json @@ -10,12 +10,12 @@ "test": "vitest run", "typecheck": "tsc --noEmit" }, - "engines": { - "node": ">=20.19.0" - }, "devDependencies": { "@config/vite-base": "workspace:*", "@hey-api/openapi-ts": "workspace:*", "typescript": "5.9.3" + }, + "engines": { + "node": ">=20.19.0" } } diff --git a/packages/openapi-ts-tests/zod/v3/package.json b/packages/openapi-ts-tests/zod/v3/package.json index 105f3ef4b6..6761dcfda0 100644 --- a/packages/openapi-ts-tests/zod/v3/package.json +++ b/packages/openapi-ts-tests/zod/v3/package.json @@ -10,13 +10,13 @@ "test": "vitest run", "typecheck": "tsc --noEmit" }, - "engines": { - "node": ">=20.19.0" - }, "devDependencies": { "@config/vite-base": "workspace:*", "@hey-api/openapi-ts": "workspace:*", "typescript": "5.9.3", "zod": "^3.25.0" + }, + "engines": { + "node": ">=20.19.0" } } diff --git a/packages/openapi-ts-tests/zod/v4/package.json b/packages/openapi-ts-tests/zod/v4/package.json index 0225c95ea7..639092cc19 100644 --- a/packages/openapi-ts-tests/zod/v4/package.json +++ b/packages/openapi-ts-tests/zod/v4/package.json @@ -10,13 +10,13 @@ "test": "vitest run", "typecheck": "tsc --noEmit" }, - "engines": { - "node": ">=20.19.0" - }, "devDependencies": { "@config/vite-base": "workspace:*", "@hey-api/openapi-ts": "workspace:*", "typescript": "5.9.3", "zod": "4.1.12" + }, + "engines": { + "node": ">=20.19.0" } } diff --git a/packages/openapi-ts/package.json b/packages/openapi-ts/package.json index 5eaac394e2..4373747819 100644 --- a/packages/openapi-ts/package.json +++ b/packages/openapi-ts/package.json @@ -2,21 +2,6 @@ "name": "@hey-api/openapi-ts", "version": "0.89.1", "description": "🌀 OpenAPI to TypeScript code generator. Generate API clients, SDKs, validators, and more.", - "homepage": "https://heyapi.dev/", - "repository": { - "type": "git", - "url": "git+https://github.com/hey-api/openapi-ts.git" - }, - "bugs": { - "url": "https://github.com/hey-api/openapi-ts/issues" - }, - "license": "MIT", - "author": { - "email": "lubos@heyapi.dev", - "name": "Hey API", - "url": "https://heyapi.dev" - }, - "funding": "https://github.com/sponsors/hey-api", "keywords": [ "angular", "axios", @@ -38,6 +23,30 @@ "xhr", "yaml" ], + "homepage": "https://heyapi.dev/", + "bugs": { + "url": "https://github.com/hey-api/openapi-ts/issues" + }, + "license": "MIT", + "author": { + "name": "Hey API", + "email": "lubos@heyapi.dev", + "url": "https://heyapi.dev" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hey-api/openapi-ts.git" + }, + "funding": "https://github.com/sponsors/hey-api", + "bin": { + "openapi-ts": "./bin/run.js" + }, + "files": [ + "bin", + "dist", + "LICENSE.md", + "README.md" + ], "type": "module", "main": "./dist/index.cjs", "module": "./dist/index.mjs", @@ -65,15 +74,6 @@ }, "./package.json": "./package.json" }, - "bin": { - "openapi-ts": "./bin/run.js" - }, - "files": [ - "bin", - "dist", - "LICENSE.md", - "README.md" - ], "scripts": { "build": "tsdown && pnpm check-exports", "check-exports": "attw --pack . --profile node16", @@ -85,9 +85,6 @@ "test": "vitest run", "typecheck": "tsc --noEmit" }, - "engines": { - "node": ">=20.19.0" - }, "dependencies": { "@hey-api/codegen-core": "workspace:^0.4.0", "@hey-api/json-schema-ref-parser": "1.2.2", @@ -98,9 +95,6 @@ "open": "11.0.0", "semver": "7.7.3" }, - "peerDependencies": { - "typescript": ">=5.5.3" - }, "devDependencies": { "@angular/common": "19.2.17", "@angular/compiler": "19.2.17", @@ -125,5 +119,11 @@ "vue": "3.5.25", "yaml": "2.8.2", "zone.js": "0.16.0" + }, + "peerDependencies": { + "typescript": ">=5.5.3" + }, + "engines": { + "node": ">=20.19.0" } } diff --git a/packages/openapi-ts/src/config/init.ts b/packages/openapi-ts/src/config/init.ts index 0fd2df3c9c..835708d79d 100644 --- a/packages/openapi-ts/src/config/init.ts +++ b/packages/openapi-ts/src/config/init.ts @@ -34,10 +34,10 @@ export type Configs = { export const detectInteractiveSession = (): boolean => Boolean( process.stdin.isTTY && - process.stdout.isTTY && - !process.env.CI && - !process.env.NO_INTERACTIVE && - !process.env.NO_INTERACTION, + process.stdout.isTTY && + !process.env.CI && + !process.env.NO_INTERACTIVE && + !process.env.NO_INTERACTION, ); /** diff --git a/packages/openapi-ts/src/graph/__tests__/walk.test.ts b/packages/openapi-ts/src/graph/__tests__/walk.test.ts index 6858420a11..058884101c 100644 --- a/packages/openapi-ts/src/graph/__tests__/walk.test.ts +++ b/packages/openapi-ts/src/graph/__tests__/walk.test.ts @@ -149,9 +149,8 @@ describe('walkTopological', () => { }); it('matches ordering for validators-circular-ref spec', async () => { - const specModule = await import( - '../../../../../specs/3.1.x/validators-circular-ref.json' - ); + const specModule = + await import('../../../../../specs/3.1.x/validators-circular-ref.json'); const spec = specModule.default ?? specModule; const { graph } = buildGraph(spec, loggerStub); diff --git a/packages/openapi-ts/src/ir/types.d.ts b/packages/openapi-ts/src/ir/types.d.ts index 9540ae0079..bfe7fceac6 100644 --- a/packages/openapi-ts/src/ir/types.d.ts +++ b/packages/openapi-ts/src/ir/types.d.ts @@ -59,7 +59,8 @@ interface IRParametersObject { } interface IRParameterObject - extends Pick, + extends + Pick, SpecificationExtensions { /** * Determines whether the parameter value SHOULD allow reserved characters, as defined by RFC3986 `:/?#[]@!$&'()*+,;=` to be included without percent-encoding. The default value is `false`. This property SHALL be ignored if the request body media type is not `application/x-www-form-urlencoded` or `multipart/form-data`. If a value is explicitly defined, then the value of `contentType` (implicit or explicit) SHALL be ignored. @@ -109,8 +110,10 @@ interface IRPathItemObject { trace?: IROperationObject; } -interface IRRequestBodyObject - extends Pick { +interface IRRequestBodyObject extends Pick< + JsonSchemaDraft2020_12, + 'description' +> { required?: boolean; schema: IRSchemaObject; } @@ -133,7 +136,8 @@ interface IRResponseObject { } interface IRSchemaObject - extends Pick< + extends + Pick< JsonSchemaDraft2020_12, | '$ref' | 'const' diff --git a/packages/openapi-ts/src/openApi/2.0.x/parser/operation.ts b/packages/openapi-ts/src/openApi/2.0.x/parser/operation.ts index 1764e5da8c..f57e60bfd1 100644 --- a/packages/openapi-ts/src/openApi/2.0.x/parser/operation.ts +++ b/packages/openapi-ts/src/openApi/2.0.x/parser/operation.ts @@ -16,7 +16,8 @@ import { paginationField } from './pagination'; import { parseExtensions, schemaToIrSchema } from './schema'; interface Operation - extends Omit, + extends + Omit, Pick { requestBody?: OperationObject['parameters']; } diff --git a/packages/openapi-ts/src/openApi/2.0.x/types/spec.d.ts b/packages/openapi-ts/src/openApi/2.0.x/types/spec.d.ts index 9f2d530e0a..71a49566fa 100644 --- a/packages/openapi-ts/src/openApi/2.0.x/types/spec.d.ts +++ b/packages/openapi-ts/src/openApi/2.0.x/types/spec.d.ts @@ -194,8 +194,7 @@ export interface ExternalDocumentationObject { * ``` */ export interface HeaderObject - extends EnumExtensions, - OpenApiV2_0_X_Nullable_Extensions { + extends EnumExtensions, OpenApiV2_0_X_Nullable_Extensions { /** * Allows extensions to the Swagger Schema. The field name MUST begin with `x-`, for example, `x-internal-id`. The value can be `null`, a primitive, an array or an object. See {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#specification-extensions Vendor Extensions} for further details. */ @@ -382,8 +381,7 @@ export interface InfoObject { * ``` */ export interface ItemsObject - extends EnumExtensions, - OpenApiV2_0_X_Nullable_Extensions { + extends EnumExtensions, OpenApiV2_0_X_Nullable_Extensions { /** * Allows extensions to the Swagger Schema. The field name MUST begin with `x-`, for example, `x-internal-id`. The value can be `null`, a primitive, an array or an object. See {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#specification-extensions Vendor Extensions} for further details. */ @@ -1308,8 +1306,7 @@ export interface ResponsesObject { * ``` */ export interface SchemaObject - extends JsonSchemaDraft4, - OpenApiV2_0_X_Nullable_Extensions { + extends JsonSchemaDraft4, OpenApiV2_0_X_Nullable_Extensions { /** * Allows extensions to the Swagger Schema. The field name MUST begin with `x-`, for example, `x-internal-id`. The value can be `null`, a primitive, an array or an object. See {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#specification-extensions Vendor Extensions} for further details. */ diff --git a/packages/openapi-ts/src/openApi/3.0.x/parser/operation.ts b/packages/openapi-ts/src/openApi/3.0.x/parser/operation.ts index 20fec76e1d..1d3f8326cf 100644 --- a/packages/openapi-ts/src/openApi/3.0.x/parser/operation.ts +++ b/packages/openapi-ts/src/openApi/3.0.x/parser/operation.ts @@ -16,7 +16,8 @@ import { paginationField } from './pagination'; import { parseExtensions, schemaToIrSchema } from './schema'; interface Operation - extends Omit, + extends + Omit, Pick {} const parseOperationJsDoc = ({ diff --git a/packages/openapi-ts/src/openApi/3.1.x/parser/operation.ts b/packages/openapi-ts/src/openApi/3.1.x/parser/operation.ts index ed478b9848..277d910f5a 100644 --- a/packages/openapi-ts/src/openApi/3.1.x/parser/operation.ts +++ b/packages/openapi-ts/src/openApi/3.1.x/parser/operation.ts @@ -16,7 +16,8 @@ import { paginationField } from './pagination'; import { parseExtensions, schemaToIrSchema } from './schema'; interface Operation - extends Omit, + extends + Omit, Pick {} const parseOperationJsDoc = ({ diff --git a/packages/openapi-ts/src/openApi/3.1.x/types/json-schema-draft-2020-12.d.ts b/packages/openapi-ts/src/openApi/3.1.x/types/json-schema-draft-2020-12.d.ts index 8dc7faf42c..efef79c1e7 100644 --- a/packages/openapi-ts/src/openApi/3.1.x/types/json-schema-draft-2020-12.d.ts +++ b/packages/openapi-ts/src/openApi/3.1.x/types/json-schema-draft-2020-12.d.ts @@ -6,7 +6,8 @@ import type { OpenApiSchemaExtensions } from './spec-extensions'; // TODO: left out some keywords related to structuring a complex schema and declaring a dialect export interface JsonSchemaDraft2020_12 - extends ArrayKeywords, + extends + ArrayKeywords, NumberKeywords, ObjectKeywords, StringKeywords, diff --git a/packages/openapi-ts/src/openApi/shared/utils/__tests__/graph.test.ts b/packages/openapi-ts/src/openApi/shared/utils/__tests__/graph.test.ts index e9d1d9d304..97ad0e5997 100644 --- a/packages/openapi-ts/src/openApi/shared/utils/__tests__/graph.test.ts +++ b/packages/openapi-ts/src/openApi/shared/utils/__tests__/graph.test.ts @@ -9,9 +9,8 @@ const loggerStub = { describe('buildGraph', () => { it('computes referenced and transitive dependencies for validators-circular-ref.json', async () => { - const mod = await import( - '../../../../../../../specs/3.1.x/validators-circular-ref.json' - ); + const mod = + await import('../../../../../../../specs/3.1.x/validators-circular-ref.json'); const spec = (mod as any).default ?? mod; const { graph } = buildGraph(spec, loggerStub); diff --git a/packages/openapi-ts/src/openApi/shared/utils/filter.ts b/packages/openapi-ts/src/openApi/shared/utils/filter.ts index 8c8f66d518..15351527c7 100644 --- a/packages/openapi-ts/src/openApi/shared/utils/filter.ts +++ b/packages/openapi-ts/src/openApi/shared/utils/filter.ts @@ -375,17 +375,17 @@ export const hasFilters = (config: Config['parser']['filters']): boolean => { return Boolean( config.operations?.exclude?.length || - config.operations?.include?.length || - config.parameters?.exclude?.length || - config.parameters?.include?.length || - config.requestBodies?.exclude?.length || - config.requestBodies?.include?.length || - config.responses?.exclude?.length || - config.responses?.include?.length || - config.schemas?.exclude?.length || - config.schemas?.include?.length || - config.tags?.exclude?.length || - config.tags?.include?.length, + config.operations?.include?.length || + config.parameters?.exclude?.length || + config.parameters?.include?.length || + config.requestBodies?.exclude?.length || + config.requestBodies?.include?.length || + config.responses?.exclude?.length || + config.responses?.include?.length || + config.schemas?.exclude?.length || + config.schemas?.include?.length || + config.tags?.exclude?.length || + config.tags?.include?.length, ); }; diff --git a/packages/openapi-ts/src/plugins/@hey-api/client-angular/bundle/types.ts b/packages/openapi-ts/src/plugins/@hey-api/client-angular/bundle/types.ts index 781c8832d0..92c0c8af42 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/client-angular/bundle/types.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/client-angular/bundle/types.ts @@ -21,7 +21,8 @@ import type { Middleware } from './utils'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, + extends + Omit, Omit { /** * Base URL for all requests made by this client. @@ -69,7 +70,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/packages/openapi-ts/src/plugins/@hey-api/client-axios/bundle/types.ts b/packages/openapi-ts/src/plugins/@hey-api/client-axios/bundle/types.ts index 87f4b00958..4b1af2264a 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/client-axios/bundle/types.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/client-axios/bundle/types.ts @@ -18,7 +18,8 @@ import type { } from '../../client-core/bundle/types'; export interface Config - extends Omit, + extends + Omit, CoreConfig { /** * Axios implementation. You can use this option to provide either an @@ -61,7 +62,9 @@ export interface RequestOptions< TData = unknown, ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ throwOnError: ThrowOnError; }>, Pick< diff --git a/packages/openapi-ts/src/plugins/@hey-api/client-core/bundle/pathSerializer.ts b/packages/openapi-ts/src/plugins/@hey-api/client-core/bundle/pathSerializer.ts index d692cf0a39..2e8cff192a 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/client-core/bundle/pathSerializer.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/client-core/bundle/pathSerializer.ts @@ -1,6 +1,5 @@ interface SerializeOptions - extends SerializePrimitiveOptions, - SerializerOptions {} + extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean; diff --git a/packages/openapi-ts/src/plugins/@hey-api/client-fetch/bundle/types.ts b/packages/openapi-ts/src/plugins/@hey-api/client-fetch/bundle/types.ts index 0a8d15009b..07b364d468 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/client-fetch/bundle/types.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/client-fetch/bundle/types.ts @@ -12,8 +12,7 @@ import type { Middleware } from './utils'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -67,7 +66,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/packages/openapi-ts/src/plugins/@hey-api/client-ky/bundle/types.ts b/packages/openapi-ts/src/plugins/@hey-api/client-ky/bundle/types.ts index baba033c99..7ea90d13a5 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/client-ky/bundle/types.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/client-ky/bundle/types.ts @@ -35,7 +35,8 @@ export interface RetryOptions { } export interface Config - extends Omit< + extends + Omit< import('ky').Options, 'body' | 'headers' | 'method' | 'prefixUrl' | 'retry' | 'throwHttpErrors' >, @@ -99,7 +100,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/packages/openapi-ts/src/plugins/@hey-api/client-next/bundle/types.ts b/packages/openapi-ts/src/plugins/@hey-api/client-next/bundle/types.ts index 214175ecd8..de11256ded 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/client-next/bundle/types.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/client-next/bundle/types.ts @@ -10,8 +10,7 @@ import type { import type { Middleware } from './utils'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * Base URL for all requests made by this client. */ @@ -51,7 +50,9 @@ export interface RequestOptions< TData = unknown, ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ throwOnError: ThrowOnError; }>, Pick< diff --git a/packages/openapi-ts/src/plugins/@hey-api/client-nuxt/bundle/types.ts b/packages/openapi-ts/src/plugins/@hey-api/client-nuxt/bundle/types.ts index 49be0fe3df..8018eca5ca 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/client-nuxt/bundle/types.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/client-nuxt/bundle/types.ts @@ -41,7 +41,8 @@ export type KeysOf = Array< >; export interface Config - extends Omit< + extends + Omit< FetchOptions, 'baseURL' | 'body' | 'headers' | 'method' | 'query' >, @@ -66,7 +67,9 @@ export interface RequestOptions< ResT = unknown, DefaultT = undefined, Url extends string = string, -> extends Config, +> + extends + Config, WithRefs<{ /** * Any body that you want to add to your request. diff --git a/packages/openapi-ts/src/plugins/@hey-api/client-ofetch/bundle/types.ts b/packages/openapi-ts/src/plugins/@hey-api/client-ofetch/bundle/types.ts index 0c45a80a3b..acd1ef1c36 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/client-ofetch/bundle/types.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/client-ofetch/bundle/types.ts @@ -18,8 +18,7 @@ import type { Middleware } from './utils'; export type ResponseStyle = 'data' | 'fields'; export interface Config - extends Omit, - CoreConfig { + extends Omit, CoreConfig { /** * HTTP(S) agent configuration (Node.js only). Passed through to ofetch. */ @@ -134,7 +133,9 @@ export interface RequestOptions< TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string, -> extends Config<{ +> + extends + Config<{ responseStyle: TResponseStyle; throwOnError: ThrowOnError; }>, diff --git a/packages/openapi-ts/src/plugins/shared/types/schema.d.ts b/packages/openapi-ts/src/plugins/shared/types/schema.d.ts index 9583b29329..d97a0ea3df 100644 --- a/packages/openapi-ts/src/plugins/shared/types/schema.d.ts +++ b/packages/openapi-ts/src/plugins/shared/types/schema.d.ts @@ -1,8 +1,8 @@ import type { IR } from '~/ir/types'; export type SchemaWithType< - T extends - Required['type'] = Required['type'], + T extends Required['type'] = + Required['type'], > = Omit & { type: Extract['type'], T>; }; diff --git a/packages/openapi-ts/src/ts-dsl/decl/pattern.ts b/packages/openapi-ts/src/ts-dsl/decl/pattern.ts index 3d3390fd52..aecf404066 100644 --- a/packages/openapi-ts/src/ts-dsl/decl/pattern.ts +++ b/packages/openapi-ts/src/ts-dsl/decl/pattern.ts @@ -59,16 +59,15 @@ export class PatternTsDsl extends Mixed { } if (this.pattern.kind === 'object') { - const elements = Object.entries(this.pattern.values).map( - ([key, alias]) => - key === alias - ? ts.factory.createBindingElement( - undefined, - undefined, - key, - undefined, - ) - : ts.factory.createBindingElement(undefined, key, alias, undefined), + const elements = Object.entries(this.pattern.values).map(([key, alias]) => + key === alias + ? ts.factory.createBindingElement( + undefined, + undefined, + key, + undefined, + ) + : ts.factory.createBindingElement(undefined, key, alias, undefined), ); const spread = this.createSpread(ctx); if (spread) elements.push(spread); diff --git a/packages/vite-plugin/package.json b/packages/vite-plugin/package.json index ede79f5eb2..c432d92aa0 100644 --- a/packages/vite-plugin/package.json +++ b/packages/vite-plugin/package.json @@ -2,28 +2,33 @@ "name": "@hey-api/vite-plugin", "version": "0.2.0", "description": "🚀 Vite plugin for `@hey-api/openapi-ts` codegen.", + "keywords": [ + "codegen", + "openapi", + "plugin", + "swagger", + "vite", + "vite-plugin" + ], "homepage": "https://heyapi.dev/", - "repository": { - "type": "git", - "url": "git+https://github.com/hey-api/openapi-ts.git" - }, "bugs": { "url": "https://github.com/hey-api/openapi-ts/issues" }, "license": "MIT", "author": { - "email": "lubos@heyapi.dev", "name": "Hey API", + "email": "lubos@heyapi.dev", "url": "https://heyapi.dev" }, + "repository": { + "type": "git", + "url": "git+https://github.com/hey-api/openapi-ts.git" + }, "funding": "https://github.com/sponsors/hey-api", - "keywords": [ - "codegen", - "openapi", - "plugin", - "vite", - "vite-plugin", - "swagger" + "files": [ + "dist", + "LICENSE.md", + "README.md" ], "type": "module", "main": "./dist/index.cjs", @@ -42,23 +47,18 @@ }, "./package.json": "./package.json" }, - "files": [ - "dist", - "LICENSE.md", - "README.md" - ], "scripts": { "build": "tsdown && pnpm check-exports", "check-exports": "attw --pack .", "dev": "tsdown --watch", "prepublishOnly": "pnpm build" }, - "peerDependencies": { - "@hey-api/openapi-ts": "<2" - }, "devDependencies": { "@hey-api/openapi-ts": "workspace:*", "typescript": "5.9.3", "vite": "7.1.2" + }, + "peerDependencies": { + "@hey-api/openapi-ts": "<2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c1647d95f..dfc2e60331 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,21 +43,12 @@ importers: '@types/node': specifier: 22.10.5 version: 22.10.5 - '@typescript-eslint/eslint-plugin': - specifier: 8.29.1 - version: 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: 3.2.4 version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.10.5)(jiti@2.6.1)(jsdom@23.0.0)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) dotenv: specifier: 17.2.3 version: 17.2.3 - eslint: - specifier: 9.39.1 - version: 9.39.1(jiti@2.6.1) - eslint-config-prettier: - specifier: 9.1.2 - version: 9.1.2(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-simple-import-sort: specifier: 12.1.1 version: 12.1.1(eslint@9.39.1(jiti@2.6.1)) @@ -70,21 +61,18 @@ importers: eslint-plugin-typescript-sort-keys: specifier: 3.3.0 version: 3.3.0(@typescript-eslint/parser@8.29.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-vue: - specifier: 9.33.0 - version: 9.33.0(eslint@9.39.1(jiti@2.6.1)) - globals: - specifier: 16.5.0 - version: 16.5.0 husky: specifier: 9.1.7 version: 9.1.7 lint-staged: specifier: 16.2.7 version: 16.2.7 - prettier: - specifier: 3.4.2 - version: 3.4.2 + oxfmt: + specifier: 0.24.0 + version: 0.24.0 + oxlint: + specifier: 1.39.0 + version: 1.39.0 rollup: specifier: 4.53.3 version: 4.53.3 @@ -1385,7 +1373,7 @@ importers: version: 1.14.1 nuxt: specifier: 3.14.1592 - version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.53.3)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.53.3)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) ofetch: specifier: 1.5.1 version: 1.5.1 @@ -5043,6 +5031,86 @@ packages: '@oxc-project/types@0.101.0': resolution: {integrity: sha512-nuFhqlUzJX+gVIPPfuE6xurd4lST3mdcWOhyK/rZO0B9XWMKm79SuszIQEnSMmmDhq1DC8WWVYGVd+6F93o1gQ==} + '@oxfmt/darwin-arm64@0.24.0': + resolution: {integrity: sha512-aYXuGf/yq8nsyEcHindGhiz9I+GEqLkVq8CfPbd+6VE259CpPEH+CaGHEO1j6vIOmNr8KHRq+IAjeRO2uJpb8A==} + cpu: [arm64] + os: [darwin] + + '@oxfmt/darwin-x64@0.24.0': + resolution: {integrity: sha512-vs3b8Bs53hbiNvcNeBilzE/+IhDTWKjSBB3v/ztr664nZk65j0xr+5IHMBNz3CFppmX7o/aBta2PxY+t+4KoPg==} + cpu: [x64] + os: [darwin] + + '@oxfmt/linux-arm64-gnu@0.24.0': + resolution: {integrity: sha512-ItPDOPoQ0wLj/s8osc5ch57uUcA1Wk8r0YdO8vLRpXA3UNg7KPOm1vdbkIZRRiSUphZcuX5ioOEetEK8H7RlTw==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-arm64-musl@0.24.0': + resolution: {integrity: sha512-JkQO3WnQjQTJONx8nxdgVBfl6BBFfpp9bKhChYhWeakwJdr7QPOAWJ/v3FGZfr0TbqINwnNR74aVZayDDRyXEA==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-x64-gnu@0.24.0': + resolution: {integrity: sha512-N/SXlFO+2kak5gMt0oxApi0WXQDhwA0PShR0UbkY0PwtHjfSiDqJSOumyNqgQVoroKr1GNnoRmUqjZIz6DKIcw==} + cpu: [x64] + os: [linux] + + '@oxfmt/linux-x64-musl@0.24.0': + resolution: {integrity: sha512-WM0pek5YDCQf50XQ7GLCE9sMBCMPW/NPAEPH/Hx6Qyir37lEsP4rUmSECo/QFNTU6KBc9NnsviAyJruWPpCMXw==} + cpu: [x64] + os: [linux] + + '@oxfmt/win32-arm64@0.24.0': + resolution: {integrity: sha512-vFCseli1KWtwdHrVlT/jWfZ8jP8oYpnPPEjI23mPLW8K/6GEJmmvy0PZP5NpWUFNTzX0lqie58XnrATJYAe9Xw==} + cpu: [arm64] + os: [win32] + + '@oxfmt/win32-x64@0.24.0': + resolution: {integrity: sha512-0tmlNzcyewAnauNeBCq0xmAkmiKzl+H09p0IdHy+QKrTQdtixtf+AOjDAADbRfihkS+heF15Pjc4IyJMdAAJjw==} + cpu: [x64] + os: [win32] + + '@oxlint/darwin-arm64@1.39.0': + resolution: {integrity: sha512-lT3hNhIa02xCujI6YGgjmYGg3Ht/X9ag5ipUVETaMpx5Rd4BbTNWUPif1WN1YZHxt3KLCIqaAe7zVhatv83HOQ==} + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.39.0': + resolution: {integrity: sha512-UT+rfTWd+Yr7iJeSLd/7nF8X4gTYssKh+n77hxl6Oilp3NnG1CKRHxZDy3o3lIBnwgzJkdyUAiYWO1bTMXQ1lA==} + cpu: [x64] + os: [darwin] + + '@oxlint/linux-arm64-gnu@1.39.0': + resolution: {integrity: sha512-qocBkvS2V6rH0t9AT3DfQunMnj3xkM7srs5/Ycj2j5ZqMoaWd/FxHNVJDFP++35roKSvsRJoS0mtA8/77jqm6Q==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-arm64-musl@1.39.0': + resolution: {integrity: sha512-arZzAc1PPcz9epvGBBCMHICeyQloKtHX3eoOe62B3Dskn7gf6Q14wnDHr1r9Vp4vtcBATNq6HlKV14smdlC/qA==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-x64-gnu@1.39.0': + resolution: {integrity: sha512-ZVt5qsECpuNprdWxAPpDBwoixr1VTcZ4qAEQA2l/wmFyVPDYFD3oBY/SWACNnWBddMrswjTg9O8ALxYWoEpmXw==} + cpu: [x64] + os: [linux] + + '@oxlint/linux-x64-musl@1.39.0': + resolution: {integrity: sha512-pB0hlGyKPbxr9NMIV783lD6cWL3MpaqnZRM9MWni4yBdHPTKyFNYdg5hGD0Bwg+UP4S2rOevq/+OO9x9Bi7E6g==} + cpu: [x64] + os: [linux] + + '@oxlint/win32-arm64@1.39.0': + resolution: {integrity: sha512-Gg2SFaJohI9+tIQVKXlPw3FsPQFi/eCSWiCgwPtPn5uzQxHRTeQEZKuluz1fuzR5U70TXubb2liZi4Dgl8LJQA==} + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.39.0': + resolution: {integrity: sha512-sbi25lfj74hH+6qQtb7s1wEvd1j8OQbTaH8v3xTcDjrwm579Cyh0HBv1YSZ2+gsnVwfVDiCTL1D0JsNqYXszVA==} + cpu: [x64] + os: [win32] + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -8848,12 +8916,6 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-config-prettier@9.1.2: - resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -8977,12 +9039,6 @@ packages: peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-vue@9.33.0: - resolution: {integrity: sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -9505,10 +9561,6 @@ packages: resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} - globals@16.5.0: - resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} - engines: {node: '>=18'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -11333,6 +11385,21 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxfmt@0.24.0: + resolution: {integrity: sha512-UjeM3Peez8Tl7IJ9s5UwAoZSiDRMww7BEc21gDYxLq3S3/KqJnM3mjNxsoSHgmBvSeX6RBhoVc2MfC/+96RdSw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint@1.39.0: + resolution: {integrity: sha512-wSiLr0wjG+KTU6c1LpVoQk7JZ7l8HCKlAkVDVTJKWmCGazsNxexxnOXl7dsar92mQcRnzko5g077ggP3RINSjA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.10.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-event@6.0.1: resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} engines: {node: '>=16.17'} @@ -13081,6 +13148,10 @@ packages: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.0.0: + resolution: {integrity: sha512-/RX9RzeH2xU5ADE7n2Ykvmi9ED3FBGPAjw9u3zucrNNaEBIO0HPSYgL0NT7+3p147ojeSdaVu08F6hjpv31HJg==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -14560,7 +14631,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) - '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0)) + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0)) '@angular-devkit/core': 19.2.0(chokidar@4.0.3) '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/platform-server@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))))(@angular/ssr@19.2.15(5c03da8199d2fcdf9ff93b70f9349edd))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)))(terser@5.39.0)(typescript@5.8.3)(yaml@2.8.2) '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) @@ -14578,7 +14649,7 @@ snapshots: '@vitejs/plugin-basic-ssl': 1.2.0(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) ansi-colors: 4.1.3 autoprefixer: 10.4.20(postcss@8.5.2) - babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)) + babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0) browserslist: 4.25.4 copy-webpack-plugin: 12.0.2(webpack@5.98.0) css-loader: 7.1.2(webpack@5.98.0) @@ -14598,7 +14669,7 @@ snapshots: picomatch: 4.0.2 piscina: 4.8.0 postcss: 8.5.2 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.85.0 @@ -14611,8 +14682,8 @@ snapshots: tslib: 2.8.1 typescript: 5.8.3 webpack: 5.98.0(esbuild@0.25.0) - webpack-dev-middleware: 7.4.2(webpack@5.98.0) - webpack-dev-server: 5.2.0(webpack@5.98.0) + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) optionalDependencies: @@ -14648,7 +14719,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) - '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0)) + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0)) '@angular-devkit/core': 19.2.0(chokidar@4.0.3) '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/platform-server@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))))(@angular/ssr@19.2.15(5c03da8199d2fcdf9ff93b70f9349edd))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)))(terser@5.39.0)(typescript@5.8.3)(yaml@2.8.2) '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) @@ -14666,7 +14737,7 @@ snapshots: '@vitejs/plugin-basic-ssl': 1.2.0(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) ansi-colors: 4.1.3 autoprefixer: 10.4.20(postcss@8.5.2) - babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)) + babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0) browserslist: 4.25.4 copy-webpack-plugin: 12.0.2(webpack@5.98.0) css-loader: 7.1.2(webpack@5.98.0) @@ -14686,7 +14757,7 @@ snapshots: picomatch: 4.0.2 piscina: 4.8.0 postcss: 8.5.2 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.85.0 @@ -14699,8 +14770,8 @@ snapshots: tslib: 2.8.1 typescript: 5.8.3 webpack: 5.98.0(esbuild@0.25.0) - webpack-dev-middleware: 7.4.2(webpack@5.98.0) - webpack-dev-server: 5.2.0(webpack@5.98.0) + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) optionalDependencies: @@ -14774,7 +14845,7 @@ snapshots: picomatch: 4.0.2 piscina: 4.8.0 postcss: 8.5.2 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.85.0 @@ -14787,7 +14858,7 @@ snapshots: tslib: 2.8.1 typescript: 5.8.3 webpack: 5.98.0(esbuild@0.25.4) - webpack-dev-middleware: 7.4.2(webpack@5.98.0) + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) webpack-dev-server: 5.2.2(webpack@5.98.0) webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) @@ -14875,7 +14946,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 webpack: 5.98.0(esbuild@0.25.4) - webpack-dev-middleware: 7.4.2(webpack@5.98.0) + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) webpack-dev-server: 5.2.2(webpack@5.98.0) webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) @@ -14907,12 +14978,12 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0))': + '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0))': dependencies: '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) rxjs: 7.8.1 webpack: 5.98.0(esbuild@0.25.0) - webpack-dev-server: 5.2.0(webpack@5.98.0) + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) transitivePeerDependencies: - chokidar @@ -18586,32 +18657,32 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1))': + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))': dependencies: '@nuxt/kit': 3.15.4(magicast@0.3.5) '@nuxt/schema': 3.16.2 execa: 7.2.0 - vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) + vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) transitivePeerDependencies: - magicast - supports-color - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))': + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))': dependencies: '@nuxt/kit': 3.15.4(magicast@0.3.5) '@nuxt/schema': 3.16.2 execa: 7.2.0 - vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) transitivePeerDependencies: - magicast - supports-color - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))': + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))': dependencies: '@nuxt/kit': 3.15.4(magicast@0.3.5) '@nuxt/schema': 3.16.2 execa: 7.2.0 - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) transitivePeerDependencies: - magicast - supports-color @@ -18676,13 +18747,13 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@1.7.0(rollup@4.53.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1))(vue@3.5.25(typescript@5.9.3))': + '@nuxt/devtools@1.7.0(rollup@4.53.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) '@nuxt/devtools-wizard': 1.7.0 '@nuxt/kit': 3.15.4(magicast@0.3.5) - '@vue/devtools-core': 7.6.8(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1))(vue@3.5.25(typescript@5.9.3)) + '@vue/devtools-core': 7.6.8(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vue/devtools-kit': 7.6.8 birpc: 0.2.19 consola: 3.4.2 @@ -18711,9 +18782,9 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 unimport: 3.14.6(rollup@4.53.3) - vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) - vite-plugin-vue-inspector: 5.3.2(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) + vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) + vite-plugin-vue-inspector: 5.3.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) which: 3.0.1 ws: 8.18.3 transitivePeerDependencies: @@ -18723,13 +18794,13 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@1.7.0(rollup@4.53.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@nuxt/devtools@1.7.0(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) '@nuxt/devtools-wizard': 1.7.0 '@nuxt/kit': 3.15.4(magicast@0.3.5) - '@vue/devtools-core': 7.6.8(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vue/devtools-core': 7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vue/devtools-kit': 7.6.8 birpc: 0.2.19 consola: 3.4.2 @@ -18758,9 +18829,9 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 unimport: 3.14.6(rollup@4.53.3) - vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) - vite-plugin-vue-inspector: 5.3.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) + vite-plugin-vue-inspector: 5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) which: 3.0.1 ws: 8.18.3 transitivePeerDependencies: @@ -18770,13 +18841,13 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@1.7.0(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@nuxt/devtools@1.7.0(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) '@nuxt/devtools-wizard': 1.7.0 '@nuxt/kit': 3.15.4(magicast@0.3.5) - '@vue/devtools-core': 7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vue/devtools-core': 7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vue/devtools-kit': 7.6.8 birpc: 0.2.19 consola: 3.4.2 @@ -18805,9 +18876,9 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 unimport: 3.14.6(rollup@4.53.3) - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) - vite-plugin-vue-inspector: 5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) + vite-plugin-vue-inspector: 5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) which: 3.0.1 ws: 8.18.3 transitivePeerDependencies: @@ -19226,6 +19297,54 @@ snapshots: '@oxc-project/types@0.101.0': {} + '@oxfmt/darwin-arm64@0.24.0': + optional: true + + '@oxfmt/darwin-x64@0.24.0': + optional: true + + '@oxfmt/linux-arm64-gnu@0.24.0': + optional: true + + '@oxfmt/linux-arm64-musl@0.24.0': + optional: true + + '@oxfmt/linux-x64-gnu@0.24.0': + optional: true + + '@oxfmt/linux-x64-musl@0.24.0': + optional: true + + '@oxfmt/win32-arm64@0.24.0': + optional: true + + '@oxfmt/win32-x64@0.24.0': + optional: true + + '@oxlint/darwin-arm64@1.39.0': + optional: true + + '@oxlint/darwin-x64@1.39.0': + optional: true + + '@oxlint/linux-arm64-gnu@1.39.0': + optional: true + + '@oxlint/linux-arm64-musl@1.39.0': + optional: true + + '@oxlint/linux-x64-gnu@1.39.0': + optional: true + + '@oxlint/linux-x64-musl@1.39.0': + optional: true + + '@oxlint/win32-arm64@1.39.0': + optional: true + + '@oxlint/win32-x64@1.39.0': + optional: true + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -21519,38 +21638,38 @@ snapshots: dependencies: '@vue/devtools-kit': 8.0.5 - '@vue/devtools-core@7.6.8(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1))(vue@3.5.25(typescript@5.9.3))': + '@vue/devtools-core@7.6.8(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@vue/devtools-kit': 7.7.7 '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 nanoid: 5.1.5 pathe: 1.1.2 - vite-hot-client: 0.2.4(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) + vite-hot-client: 0.2.4(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) vue: 3.5.25(typescript@5.9.3) transitivePeerDependencies: - vite - '@vue/devtools-core@7.6.8(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@vue/devtools-core@7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@vue/devtools-kit': 7.7.7 '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 nanoid: 5.1.5 pathe: 1.1.2 - vite-hot-client: 0.2.4(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) + vite-hot-client: 0.2.4(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) vue: 3.5.25(typescript@5.9.3) transitivePeerDependencies: - vite - '@vue/devtools-core@7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@vue/devtools-core@7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@vue/devtools-kit': 7.7.7 '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 nanoid: 5.1.5 pathe: 1.1.2 - vite-hot-client: 0.2.4(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) + vite-hot-client: 0.2.4(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) vue: 3.5.25(typescript@5.9.3) transitivePeerDependencies: - vite @@ -22214,7 +22333,7 @@ snapshots: schema-utils: 4.3.2 webpack: 5.98.0(esbuild@0.25.0) - babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)): + babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.98.0): dependencies: '@babel/core': 7.26.9 find-cache-dir: 4.0.0 @@ -23633,8 +23752,8 @@ snapshots: '@typescript-eslint/parser': 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) eslint: 9.17.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.17.0(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.17.0(jiti@2.6.1)) @@ -23649,10 +23768,6 @@ snapshots: dependencies: eslint: 9.17.0(jiti@2.6.1) - eslint-config-prettier@9.1.2(eslint@9.39.1(jiti@2.6.1)): - dependencies: - eslint: 9.39.1(jiti@2.6.1) - eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -23661,7 +23776,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -23672,22 +23787,22 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) eslint: 9.17.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -23698,7 +23813,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.17.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -23837,20 +23952,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-vue@9.33.0(eslint@9.39.1(jiti@2.6.1)): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) - eslint: 9.39.1(jiti@2.6.1) - globals: 13.24.0 - natural-compare: 1.4.0 - nth-check: 2.1.1 - postcss-selector-parser: 6.1.2 - semver: 7.7.2 - vue-eslint-parser: 9.4.3(eslint@9.39.1(jiti@2.6.1)) - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - supports-color - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -24583,8 +24684,6 @@ snapshots: globals@15.14.0: {} - globals@16.5.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -26775,10 +26874,10 @@ snapshots: - vue-tsc - xml2js - nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.53.3)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)): + nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.53.3)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.7.0(rollup@4.53.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/devtools': 1.7.0(rollup@4.53.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.53.3) '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.53.3) '@nuxt/telemetry': 2.6.6(magicast@0.3.5) @@ -26834,7 +26933,7 @@ snapshots: unhead: 1.11.20 unimport: 3.14.6(rollup@4.53.3) unplugin: 1.16.1 - unplugin-vue-router: 0.10.9(rollup@4.53.3)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) + unplugin-vue-router: 0.10.9(rollup@4.53.3)(vue-router@4.5.0(vue@3.5.13(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) untyped: 1.5.2 vue: 3.5.25(typescript@5.9.3) @@ -26896,10 +26995,10 @@ snapshots: - vue-tsc - xml2js - nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.53.3)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): + nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.53.3)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.7.0(rollup@4.53.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@nuxt/devtools': 1.7.0(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.53.3) '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.53.3) '@nuxt/telemetry': 2.6.6(magicast@0.3.5) @@ -26955,7 +27054,7 @@ snapshots: unhead: 1.11.20 unimport: 3.14.6(rollup@4.53.3) unplugin: 1.16.1 - unplugin-vue-router: 0.10.9(rollup@4.53.3)(vue-router@4.5.0(vue@3.5.13(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) + unplugin-vue-router: 0.10.9(rollup@4.53.3)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) untyped: 1.5.2 vue: 3.5.25(typescript@5.9.3) @@ -27224,6 +27323,30 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxfmt@0.24.0: + dependencies: + tinypool: 2.0.0 + optionalDependencies: + '@oxfmt/darwin-arm64': 0.24.0 + '@oxfmt/darwin-x64': 0.24.0 + '@oxfmt/linux-arm64-gnu': 0.24.0 + '@oxfmt/linux-arm64-musl': 0.24.0 + '@oxfmt/linux-x64-gnu': 0.24.0 + '@oxfmt/linux-x64-musl': 0.24.0 + '@oxfmt/win32-arm64': 0.24.0 + '@oxfmt/win32-x64': 0.24.0 + + oxlint@1.39.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.39.0 + '@oxlint/darwin-x64': 1.39.0 + '@oxlint/linux-arm64-gnu': 1.39.0 + '@oxlint/linux-arm64-musl': 1.39.0 + '@oxlint/linux-x64-gnu': 1.39.0 + '@oxlint/linux-x64-musl': 1.39.0 + '@oxlint/win32-arm64': 1.39.0 + '@oxlint/win32-x64': 1.39.0 + p-event@6.0.1: dependencies: p-timeout: 6.1.4 @@ -27563,7 +27686,7 @@ snapshots: ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.9.3) optional: true - postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)): + postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 @@ -29339,6 +29462,8 @@ snapshots: tinypool@1.1.1: {} + tinypool@2.0.0: {} + tinyrainbow@2.0.0: {} tinyspy@3.0.2: {} @@ -30096,10 +30221,6 @@ snapshots: vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) vite-hot-client: 2.1.0(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) - vite-hot-client@0.2.4(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)): - dependencies: - vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) - vite-hot-client@0.2.4(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) @@ -30108,6 +30229,10 @@ snapshots: dependencies: vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) + vite-hot-client@0.2.4(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): + dependencies: + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) + vite-hot-client@2.1.0(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) @@ -30252,7 +30377,7 @@ snapshots: - rollup - supports-color - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)): + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.2.0(rollup@4.53.3) @@ -30263,14 +30388,14 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.2 - vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) + vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) optionalDependencies: '@nuxt/kit': 3.15.4(magicast@0.3.5) transitivePeerDependencies: - rollup - supports-color - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.2.0(rollup@4.53.3) @@ -30281,14 +30406,14 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.2 - vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) optionalDependencies: '@nuxt/kit': 3.15.4(magicast@0.3.5) transitivePeerDependencies: - rollup - supports-color - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)): + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.53.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.2.0(rollup@4.53.3) @@ -30299,7 +30424,7 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.2 - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) optionalDependencies: '@nuxt/kit': 3.15.4(magicast@0.3.5) transitivePeerDependencies: @@ -30336,7 +30461,7 @@ snapshots: - supports-color - vue - vite-plugin-vue-inspector@5.3.2(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)): + vite-plugin-vue-inspector@5.3.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: '@babel/core': 7.28.3 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) @@ -30347,11 +30472,11 @@ snapshots: '@vue/compiler-dom': 3.5.25 kolorist: 1.8.0 magic-string: 0.30.18 - vite: 5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1) + vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color - vite-plugin-vue-inspector@5.3.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): + vite-plugin-vue-inspector@5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)): dependencies: '@babel/core': 7.28.3 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) @@ -30362,11 +30487,11 @@ snapshots: '@vue/compiler-dom': 3.5.25 kolorist: 1.8.0 magic-string: 0.30.18 - vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - vite-plugin-vue-inspector@5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)): + vite-plugin-vue-inspector@5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: '@babel/core': 7.28.3 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) @@ -30377,7 +30502,7 @@ snapshots: '@vue/compiler-dom': 3.5.25 kolorist: 1.8.0 magic-string: 0.30.18 - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) + vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -30742,19 +30867,6 @@ snapshots: transitivePeerDependencies: - supports-color - vue-eslint-parser@9.4.3(eslint@9.39.1(jiti@2.6.1)): - dependencies: - debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - lodash: 4.17.21 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - vue-router@4.5.0(vue@3.5.13(typescript@5.8.3)): dependencies: '@vue/devtools-api': 6.6.4 @@ -30846,7 +30958,7 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-dev-middleware@7.4.2(webpack@5.98.0): + webpack-dev-middleware@7.4.2(webpack@5.98.0(esbuild@0.25.0)): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -30857,7 +30969,7 @@ snapshots: optionalDependencies: webpack: 5.98.0(esbuild@0.25.0) - webpack-dev-server@5.2.0(webpack@5.98.0): + webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -30884,7 +30996,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) ws: 8.18.3 optionalDependencies: webpack: 5.98.0(esbuild@0.25.0) @@ -30922,7 +31034,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) ws: 8.18.3 optionalDependencies: webpack: 5.98.0(esbuild@0.25.0)