{"owner":"orval-labs","repo":"orval","hasSkills":true,"totalSkillsCount":26,"totalTokensCount":21746,"categories":["marketplace","root-instruction","plugin-manifest","anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":[".claude-plugin/marketplace.json","AGENTS.md","packages/angular/README.md","packages/axios/README.md","packages/core/README.md","packages/effect/README.md","packages/fetch/README.md","packages/hono/README.md","packages/mcp/README.md","packages/mock/README.md","packages/orval/README.md","packages/query/README.md","packages/solid-start/README.md","packages/swr/README.md","packages/zod/README.md","skills/README.md","skills/orval/SKILL.md","skills/orval/advanced-config.md","skills/orval/angular.md","skills/orval/custom-http-clients.md","skills/orval/hono.md","skills/orval/mocking-msw.md","skills/orval/solid-start.md","skills/orval/tanstack-query.md","skills/orval/tooling-workflow.md","skills/orval/zod-validation.md"],"skills":{".claude-plugin/marketplace.json":"{\n  \"name\": \"orval\",\n  \"description\": \"Orval's official plugin for Claude Code\",\n  \"plugins\": {\n    \"orval\": {\n      \"name\": \"orval\",\n      \"source\": \"./skills/orval\",\n      \"description\": \"Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, and MCP servers from OpenAPI specs\"\n    }\n  }\n}\n","AGENTS.md":"<!--VITE PLUS START-->\n\n# Using Vite+, the Unified Toolchain for the Web\n\nThis project is using Vite+, a unified toolchain built on top of Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, and Vite Task. Vite+ wraps runtime management, package management, and frontend tooling in a single global CLI called `vp`. Vite+ is distinct from Vite, and it invokes Vite through `vp dev` and `vp build`. Run `vp help` to print a list of commands and `vp <command> --help` for information about a specific command.\n\nDocs are local at `node_modules/vite-plus/docs` or online at https://viteplus.dev/guide/.\n\n## Built-in Commands vs Scripts\n\n`vp <name>` runs a built-in command. `vp run <name>` runs a `package.json` script or a `vite.config.ts` task. Scripts cannot overwrite built-ins, so `vp dev` and `vp run dev` may do different things. Check `package.json` and `vite.config.ts` first, and run `vp run <name>` when the project defines a script or task with that name.\n\n## Tool Versions\n\nRun `vp toolchain` to show versions and relationships in the active Vite+\nrelease. Add a tool name to select part of the graph. For example, run\n`vp toolchain vite`. Use `--global` to ignore the local `vite-plus` package. Use\n`vp why <package>` to show the package-manager dependency graph.\n\n## Review Checklist\n\n- [ ] Run `vp install` after pulling remote changes and before getting started.\n- [ ] Run `vp check` and `vp test` to format, lint, type check and test changes.\n- [ ] Check if there are `vite.config.ts` tasks or `package.json` scripts necessary for validation, run via `vp run <script>`.\n- [ ] If setup, runtime, or package-manager behavior looks wrong, run `vp env doctor` and include its output when asking for help.\n\n<!--VITE PLUS END-->\n","packages/angular/README.md":"# `@orval/angular`\n\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n![orval - Restful Client Generator](../../logo/orval-logo-horizontal.svg?raw=true)\n\nAngular generator support for [Orval](https://orval.dev).\n\nThis package powers Orval's Angular output and is responsible for generating:\n\n- injectable Angular `HttpClient` service classes\n- signal-first Angular `httpResource` helpers\n- mixed `both` mode output with service classes plus sibling `*.resource.ts`\n  files\n- Angular-specific response typing, request options, runtime validation, and\n  helper utilities\n\nIn most application projects you configure Angular output through the main\n`orval` package. This package exists so the Angular generator can be versioned,\ntested, and consumed as a standalone builder inside the Orval monorepo.\n\nVisit [orval.dev](https://orval.dev) for guides, API docs, and examples.\n\n## What it generates\n\n`@orval/angular` supports three Angular retrieval modes through\n`override.angular.retrievalClient` (or the legacy `override.angular.client`\nalias):\n\n| Mode           | Generated output                                               | Best for                                                    |\n| -------------- | -------------------------------------------------------------- | ----------------------------------------------------------- |\n| `httpClient`   | Retrievals stay on injectable Angular service classes          | Conventional service-based Angular APIs                     |\n| `httpResource` | Signal-first resource helpers for retrieval-style operations   | Angular apps using signals for read flows                   |\n| `both`         | Service classes plus sibling `*.resource.ts` retrieval helpers | Projects that want signal-first reads and imperative writes |\n\nMutation-style operations continue to use generated `HttpClient` service\nmethods by default unless a per-operation override changes classification.\n\nIf `override.angular.retrievalClient` is omitted, Angular generation defaults to\n`httpClient` mode.\n\n## Example configuration\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: {\n      target: './petstore.yaml',\n    },\n    output: {\n      client: 'angular',\n      target: 'src/api/petstore.ts',\n      schemas: 'src/api/model',\n      mode: 'tags-split',\n      override: {\n        angular: {\n          retrievalClient: 'httpResource',\n          runtimeValidation: true,\n        },\n      },\n    },\n  },\n});\n```\n\nFor end-user docs and richer examples, see:\n\n- [Angular guide](https://orval.dev/guides/angular)\n- [Angular sample app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n\n## Angular-specific features\n\nThis package includes support for:\n\n- `HttpClient` observe overload generation\n- signal-based parameter generation for `httpResource`\n- multi-content-type response branching via generated `Accept` helpers\n- Zod-backed runtime validation for Angular output\n- resource option helpers such as `defaultValue`, `debugName`, `injector`, and\n  `equal`\n- generated `ClientResult` / `ResourceResult` aliases\n- `ResourceState<T>` and `toResourceState()` helpers for resource integration\n\n## Development\n\nUseful package-local scripts:\n\n- `pnpm --filter @orval/angular build`\n- `pnpm --filter @orval/angular test`\n- `pnpm --filter @orval/angular lint`\n- `pnpm --filter @orval/angular typecheck`\n\n## More samples\n\nYou can explore additional Orval samples here:\n\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/axios/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/core/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/effect/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# @orval/effect\n\nGenerates [Effect Schema](https://effect.website/docs/schema/introduction/) validators from OpenAPI specifications.\n\n## Install\n\n```sh\nnpm install -D @orval/effect\nnpm install effect\n```\n\n`effect` is a peer dependency (`>=3.10`, Effect 4 included). `@orval/effect` does not bundle it, and generates Effect 3 or Effect 4 syntax to match the installed version.\n\n## Usage\n\nSet `client: 'effect'` in your `orval.config`:\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'effect',\n      target: './src/api/schemas',\n      mode: 'single',\n    },\n  },\n});\n```\n\n## Generated output\n\n```ts\nimport { Schema as S } from 'effect';\n\nexport const ListPetsQueryParams = S.Struct({\n  limit: S.optional(S.String).annotations({\n    description: 'How many items to return at one time (max 100)',\n  }),\n});\n```\n\nSee the [Effect guide](https://orval.dev/guides/effect) and the [`swr-with-effect` sample](https://github.com/orval-labs/orval/tree/master/samples/swr-with-effect) for more.\n\n## Why Effect alongside Zod?\n\n`@orval/effect` mirrors `@orval/zod`'s output shape, but Effect Schemas bring capabilities Zod can't:\n\n- **Encoded vs decoded type duality** — `Schema.Type<S>` (runtime) and `Schema.Encoded<S>` (wire) are distinct; `Schema.encode` round-trips back to the wire shape.\n- **Branded types as a generator option** — `override.effect.useBrandedTypes: true` turns named schemas into Effect brands for nominal-typed IDs without hand-writing `.brand<...>()`.\n- **First-class annotations** — OpenAPI `description`, `title`, `examples` flow into `S.annotations(...)` and stay queryable at the AST level.\n- **AST, not method chains** — schemas are introspectable artifacts, composable structurally by downstream tooling.\n- **Effect runtime integration** — decoded results pipe straight into Effect's typed-error / retry / concurrency primitives.\n\n## Configuration\n\nOptions are read from `override.effect.*`:\n\n- `strict` — fail on extra fields in object schemas\n- `generate` — fine-grained control over which schemas (params/body/response) are emitted\n- `useBrandedTypes` — map named schemas to branded types\n- `generateEachHttpStatus` — emit a schema per response status code\n","packages/fetch/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [nx fastify react](https://github.com/orval-labs/orval/tree/master/samples/nx-fastify-react)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/hono/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/mcp/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### How to use the generated mcp server\n\nAdd a setting to the mcp client to launch the generated `server.ts`.\nFor example, like this:\n\n```\n\"pet-store-server\": {\n  \"command\": \"docker\",\n  \"args\": [\n    \"run\",\n    \"-i\",\n    \"--rm\",\n    \"pet-store-mcp\",\n    \"bash\",\n    \"-c\",\n    \"ts-node\",\n    \"src/gen/server.ts\"\n  ],\n  \"disabled\": false,\n  \"alwaysAllow\": []\n}\n```\n\nHere, `src/gen/server.ts` is started using `Docker`.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/mock/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restful Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/orval/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/orval-labs/orval/master/logo/orval-logo-horizontal.svg\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [pinia colada](https://github.com/orval-labs/orval/tree/master/samples/pinia-colada)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/query/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/solid-start/README.md":"# @orval/solid-start\n\nSolidStart client for Orval - generates type-safe API client code using SolidStart primitives.\n\n## Features\n\n- ✅ Generates SolidStart `query()` for GET requests\n- ✅ Generates SolidStart `action()` for mutations (POST, PUT, PATCH, DELETE)\n- ✅ Type-safe API calls\n- ✅ Full TypeScript support\n- ✅ Works with SolidStart's server-side execution model\n- ✅ Uses native Fetch API by default\n- ✅ Supports custom mutators with Fetch API signature\n\n## Installation\n\n```bash\nnpm install @orval/solid-start\n# or\nbun add @orval/solid-start\n# or\npnpm add @orval/solid-start\n```\n\n## Usage\n\nIn your Orval configuration file:\n\n```typescript\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    output: {\n      target: './src/api/endpoints.ts',\n      schemas: './src/api/model',\n      client: 'solid-start',\n    },\n    input: {\n      target: './petstore.yaml',\n    },\n  },\n});\n```\n\n## Generated Code\n\nFor GET requests, Orval generates SolidStart queries:\n\n```typescript\nexport const PetstoreApi = {\n  getPets: query(async (limit?: number) => {\n    const response = await fetch(`/api/pets?limit=${limit}`, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json() as Promise<Pet[]>;\n  }, 'getPets'),\n};\n```\n\nFor mutations (POST, PUT, PATCH, DELETE), Orval generates SolidStart actions:\n\n```typescript\nexport const PetstoreApi = {\n  createPet: action(async (pet: Pet) => {\n    const response = await fetch(`/api/pets`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(pet),\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json() as Promise<Pet>;\n  }, 'createPet'),\n};\n```\n\n## Using in Your SolidStart App\n\n```typescript\nimport { PetstoreApi } from './api/endpoints';\n\n// In a component\nfunction Pets() {\n  const pets = createAsync(() => PetstoreApi.getPets(10));\n\n  return (\n    <div>\n      <For each={pets()}>\n        {(pet) => <div>{pet.name}</div>}\n      </For>\n    </div>\n  );\n}\n\n// For mutations\nfunction CreatePet() {\n  const createPet = useAction(PetstoreApi.createPet);\n\n  const handleSubmit = async (formData: FormData) => {\n    await createPet({ name: formData.get('name') as string });\n  };\n\n  return <form action={handleSubmit}>...</form>;\n}\n```\n\n## Comparison with solid-query\n\n- **@orval/solid-start**: Uses native SolidStart primitives (`query`, `action`) for server-side data fetching\n- **@orval/solid-query**: Uses TanStack Solid Query (`createQuery`, `createMutation`) for client-side data management\n\nChoose `solid-start` when you want to leverage SolidStart's built-in server functions and caching.\nChoose `solid-query` when you need advanced client-side query management features like automatic refetching, optimistic updates, etc.\n","packages/swr/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/zod/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","skills/README.md":"# Orval AI Agent Skills\n\nOfficial AI agent skill for generating type-safe API clients, hooks, schemas, mocks, and server handlers from OpenAPI specs using [Orval](https://orval.dev).\n\nSkills are automatically discovered and used by the agent based on context — they don't appear in slash-command menus.\n\n## Installation\n\n### Claude Code\n\n```bash\n/plugin marketplace add orval-labs/orval\n```\n\n### Cursor\n\nAdd a remote GitHub rule pointing to this repository.\n\n### Any agent (skills.sh)\n\n```bash\nnpx skills add orval-labs/orval\n```\n\n## What's Included\n\nThe `orval` skill covers:\n\n- All clients: React/Vue/Svelte/Solid/Angular Query, SWR, Fetch, Axios, Hono, MCP\n- Zod schema generation and runtime validation\n- MSW mock generation with test setup patterns\n- Custom HTTP mutators and authentication patterns\n- Hono server handlers with response validation\n- NDJSON streaming, programmatic API, and advanced configuration\n\n## Structure\n\n```\nskills/orval/\n├── SKILL.md               # Core skill (always loaded)\n├── tanstack-query.md      # React/Vue/Svelte/Solid Query, SWR\n├── angular.md             # Angular Query and HttpClient\n├── solid-start.md         # SolidStart query/action primitives\n├── hono.md                # Hono server handlers\n├── custom-http-clients.md # Custom mutators, auth patterns\n├── zod-validation.md      # Zod schema generation\n├── mocking-msw.md         # MSW mocks and test setup\n├── advanced-config.md     # Type generation, overrides, enums\n└── tooling-workflow.md    # MCP, NDJSON, hooks, programmatic API\n```\n\nReference files are loaded on demand when the user's question matches the topic.\n","skills/orval/SKILL.md":"---\nname: orval\ndescription: Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, MCP servers, and SolidStart actions from OpenAPI specs using Orval. Covers all clients (React/Vue/Svelte/Solid/Angular Query, Fetch, Axios), custom HTTP mutators, authentication patterns, NDJSON streaming, programmatic API, and advanced configuration.\n---\n\n# Orval - OpenAPI to TypeScript Code Generator\n\nOrval generates type-safe TypeScript clients, hooks, schemas, mocks, and server handlers from OpenAPI v3/Swagger v2 specifications.\n\n## Quick Start\n\n### Installation\n\n```bash\nnpm install orval -D\n# or yarn add orval -D\n# or pnpm add orval -D\n# or bun add orval -D\n```\n\n### Minimal Configuration\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: {\n      target: './petstore.yaml',\n    },\n    output: {\n      target: './src/api/petstore.ts',\n      schemas: './src/api/model',\n      client: 'react-query',\n    },\n  },\n});\n```\n\n### Run\n\n```bash\nnpx orval\nnpx orval --config ./orval.config.ts\nnpx orval --project petstore\nnpx orval --watch\n```\n\n## Choosing Your Setup\n\n### Client Selection Guide\n\n| Use Case                 | Client            | httpClient         | Notes                                   |\n| ------------------------ | ----------------- | ------------------ | --------------------------------------- |\n| React with server state  | `react-query`     | `fetch` or `axios` | TanStack Query hooks                    |\n| Vue 3 with server state  | `vue-query`       | `fetch` or `axios` | TanStack Query for Vue                  |\n| Svelte with server state | `svelte-query`    | `fetch` or `axios` | TanStack Query for Svelte               |\n| SolidJS standalone app   | `solid-query`     | `fetch` or `axios` | TanStack Query for Solid                |\n| SolidStart full-stack    | `solid-start`     | native fetch       | Uses `query()`/`action()` primitives    |\n| Angular with signals     | `angular-query`   | `angular`          | Injectable functions, signal reactivity |\n| Angular traditional      | `angular`         | —                  | HttpClient services                     |\n| React with SWR           | `swr`             | `fetch` or `axios` | Vercel SWR hooks                        |\n| Lightweight / Edge       | `fetch`           | —                  | Zero dependencies, works everywhere     |\n| Node.js / existing Axios | `axios-functions` | —                  | Factory functions (default)             |\n| Axios with DI            | `axios`           | —                  | Injectable Axios instance               |\n| Validation only          | `zod`             | —                  | Zod schemas, no HTTP client             |\n| Backend API server       | `hono`            | —                  | Hono handlers with Zod validation       |\n| AI agent tools           | `mcp`             | —                  | Model Context Protocol servers          |\n\n### Mode Selection Guide\n\n- **`single`** — Everything in one file. Best for small APIs.\n- **`split`** — Separate files: `petstore.ts`, `petstore.schemas.ts`, `petstore.msw.ts`. Good for medium APIs.\n- **`tags`** — One file per OpenAPI tag + shared schemas. Organizes by domain.\n- **`tags-split`** — Folder per tag with split files. Best for large APIs. Recommended.\n\n### httpClient Option\n\nFor `react-query`, `vue-query`, `svelte-query`, and `swr` clients:\n\n```ts\noutput: {\n  client: 'react-query',\n  httpClient: 'fetch',  // 'fetch' (default) | 'axios'\n}\n```\n\nFor `angular-query`:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',  // Uses Angular HttpClient\n}\n```\n\n## Configuration Reference\n\n### Config Structure\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  [projectName]: {\n    input: InputOptions,\n    output: OutputOptions,\n    hooks: HooksOptions,\n  },\n});\n```\n\nMultiple projects can share the same config file with different input/output settings.\n\n### Input Options\n\n```ts\ninput: {\n  target: './spec.yaml',              // Path or URL to OpenAPI spec (required)\n  override: {\n    transformer: './transform.js',    // Transform spec before generation\n  },\n  filters: {\n    mode: 'include',                  // 'include' | 'exclude'\n    tags: ['pets', /health/],         // Filter by OpenAPI tags\n    schemas: ['Pet', /Error/],        // Filter by schema names\n  },\n  parserOptions: {\n    headers: [                        // Auth headers for remote spec URLs\n      {\n        domains: ['api.example.com'],\n        headers: {\n          Authorization: 'Bearer YOUR_TOKEN',\n          'X-API-Key': 'your-api-key',\n        },\n      },\n    ],\n  },\n}\n```\n\n### Output Options\n\n```ts\noutput: {\n  target: './src/api/endpoints.ts',     // Output path (required)\n  client: 'react-query',               // Client type (see table above)\n  httpClient: 'fetch',                  // 'fetch' (default) | 'axios' | 'angular'\n  mode: 'tags-split',                   // 'single' | 'split' | 'tags' | 'tags-split'\n  schemas: './src/api/model',           // Output path for model types\n  operationSchemas: './src/api/params', // Separate path for operation-derived types\n  workspace: 'src/',                    // Base folder for all files\n  fileExtension: '.ts',                 // Custom file extension\n  namingConvention: 'camelCase',        // File naming: camelCase | PascalCase | snake_case | kebab-case\n  indexFiles: true,                     // Generate index.ts barrel files\n  clean: true,                          // Clean output before generating\n  prettier: true,                       // Format with Prettier\n  biome: true,                          // Format with Biome\n  headers: true,                        // Generate header parameters\n  baseUrl: '/api/v2',                   // API base URL\n  // or from spec:\n  // baseUrl: { getBaseUrlFromSpecification: true, index: 0, variables: { environment: 'api.dev' } },\n  mocks: true,                          // Generate MSW + Faker mocks (boolean, object, or function)\n  docs: true,                           // Generate TypeDoc documentation\n  // docs: { configPath: './typedoc.config.mjs' },\n  allParamsOptional: true,              // Make all params optional (except path params)\n  urlEncodeParameters: true,            // URL-encode path/query parameters\n  optionsParamRequired: false,          // Make options parameter required\n  propertySortOrder: 'Specification',   // 'Alphabetical' | 'Specification'\n  tsconfig: './tsconfig.json',          // Custom tsconfig path\n  override: { ... },                    // Advanced overrides (see below)\n}\n```\n\n### Multiple API Specs\n\n```ts\nexport default defineConfig({\n  petstoreV1: {\n    input: { target: './specs/v1.yaml' },\n    output: { target: 'src/api/v1', client: 'react-query' },\n  },\n  petstoreV2: {\n    input: { target: './specs/v2.yaml' },\n    output: { target: 'src/api/v2', client: 'react-query' },\n  },\n});\n```\n\n### Filter Endpoints\n\n```ts\ninput: {\n  target: './spec.yaml',\n  filters: {\n    mode: 'include',\n    tags: ['pets'],\n  },\n}\n```\n\n## Detailed Guides\n\nWhen the user's question involves a specific topic below, read the corresponding file from this skill's directory.\n\n| Topic                | File                                             | Load when user asks about...                                                                                            |\n| -------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |\n| TanStack Query / SWR | [tanstack-query.md](tanstack-query.md)           | React Query, Vue Query, Svelte Query, Solid Query, SWR, query hooks, invalidation, infinite queries, suspense, prefetch |\n| Angular              | [angular.md](angular.md)                         | Angular Query, Angular HttpClient, signals, inject functions, Angular services, providedIn                              |\n| SolidStart           | [solid-start.md](solid-start.md)                 | SolidStart, @solidjs/router, query(), action(), createAsync, revalidate                                                 |\n| Custom HTTP / Auth   | [custom-http-clients.md](custom-http-clients.md) | Custom mutator, authentication, tokens, interceptors, custom fetch/axios, baseURL, hook-based mutator                   |\n| Zod Validation       | [zod-validation.md](zod-validation.md)           | Zod schemas, validation, runtime validation, coerce, strict, preprocess                                                 |\n| Mocking / MSW        | [mocking-msw.md](mocking-msw.md)                 | MSW mocks, testing, test setup, faker, Vitest, mock handlers, useExamples                                               |\n| Hono Server          | [hono.md](hono.md)                               | Hono handlers, zValidator, composite routes, context types, server-side generation                                      |\n| Advanced Config      | [advanced-config.md](advanced-config.md)         | Type generation, enums, per-operation overrides, FormData, JSDoc, params serializer, full example                       |\n| Tooling / Workflow   | [tooling-workflow.md](tooling-workflow.md)       | Programmatic API, transformers, hooks, NDJSON streaming, MCP, afterAllFilesWrite                                        |\n\n## OpenAPI Specification Best Practices\n\n1. **Use unique `operationId`** for every operation — Orval uses these for function and hook names\n2. **Define reusable schemas** in `components/schemas` — reduces duplication in generated types\n3. **Use tags** to group operations — works with `tags` and `tags-split` modes\n4. **Define response types** for all operations — enables full type safety\n5. **Mark required fields** — affects optional/required in generated TypeScript interfaces\n6. **Use `x-enumNames`** for numeric enums — generates readable const names\n7. **Provide `example` values** — used by mock generation when `useExamples: true`\n8. **Use `application/x-ndjson`** content type for streaming endpoints — enables typed NDJSON generation\n\n## CLI Reference\n\n```bash\norval                                    # Generate using auto-discovered config\norval --config ./api/orval.config.ts     # Specify config file\norval --project petstore                 # Run specific project(s)\norval --watch                            # Watch mode\norval --watch ./src                      # Watch specific directory\norval --clean                            # Clean generated files\norval --prettier                         # Format with Prettier\norval --biome                            # Format with Biome\norval --tsconfig ./src/tsconfig.json     # Custom tsconfig path\norval --mode split                       # Override output mode\norval --client react-query               # Override client\norval --mock                             # Override mock generation\norval --input ./spec.yaml --output ./api.ts  # Direct generation\n```\n\n## Resources\n\n- [Documentation](https://orval.dev)\n- [GitHub](https://github.com/orval-labs/orval)\n- [Sample Projects](https://github.com/orval-labs/orval/tree/master/samples)\n","skills/orval/advanced-config.md":"# Advanced Configuration\n\n## Type Generation Options\n\n```ts\noverride: {\n  // Enum generation\n  enumGenerationType: 'const',    // 'const' (default) | 'enum' | 'union'\n\n  // Type preferences\n  useTypeOverInterfaces: false,   // Use type instead of interface\n  useNamedParameters: false,      // Named params object vs positional args\n  useDates: false,                // Convert date/datetime to Date objects\n  useBigInt: false,               // Convert int64/uint64 to BigInt\n  useDeprecatedOperations: true,  // Include deprecated operations\n  useNullForOptional: false,      // Type optional as T | null\n  aliasCombinedTypes: false,      // Create intermediate type aliases for anyOf/oneOf/allOf\n  suppressReadonlyModifier: false, // Suppress readonly modifier\n\n  // Naming\n  components: {\n    schemas: { suffix: 'DTO' },\n    responses: { suffix: 'Response' },\n    parameters: { suffix: 'Params' },\n    requestBodies: { suffix: 'Bodies' },\n  },\n\n  // Custom operation names\n  operationName: (operation, route, verb) => `custom_${operation.operationId}`,\n\n  // Property key naming convention\n  namingConvention: {\n    enum: 'PascalCase',  // camelCase | PascalCase | snake_case | kebab-case\n  },\n\n  // File header\n  header: (info) => [\n    'Generated by Orval',\n    'Do not edit manually.',\n    ...(info.title ? [info.title] : []),\n  ],\n  // header: false,  // Disable header\n\n  // Service title (axios and angular clients only)\n  title: (title) => `${title}Api`,\n}\n```\n\n## Enum Extensions\n\nUse OpenAPI extensions for meaningful enum names and descriptions:\n\n```yaml\nmyEnum:\n  type: number\n  enum: [1, 2, 3]\n  x-enumNames: [Active, Inactive, Pending]\n  x-enumDescriptions:\n    - User is active\n    - User is inactive\n    - User is pending approval\n```\n\nGenerated output:\n\n```ts\nexport const MyEnum = {\n  /** User is active */\n  Active: 1,\n  /** User is inactive */\n  Inactive: 2,\n  /** User is pending approval */\n  Pending: 3,\n} as const;\n\nexport type MyEnum = (typeof MyEnum)[keyof typeof MyEnum];\n```\n\nSupported extension variants: `x-enumNames`, `x-enumnames`, `x-enum-varnames` for names; `x-enumDescriptions`, `x-enumdescriptions`, `x-enum-descriptions` for descriptions.\n\nNote: Enum descriptions only work with `enumGenerationType: 'const'` (default).\n\n## Per-Operation Overrides\n\n```ts\noverride: {\n  operations: {\n    listPets: {\n      mutator: 'src/response-type.js',\n      query: {\n        useInfinite: true,\n        useInfiniteQueryParam: 'cursor',\n        useSuspenseQuery: true,\n        options: { staleTime: 60000 },\n      },\n      mock: {\n        data: () => ({ id: 1, name: 'Buddy' }),\n      },\n    },\n  },\n}\n```\n\n## Per-Tag Overrides\n\nSame options as per-operation but scoped by OpenAPI tag:\n\n```ts\noverride: {\n  tags: {\n    pets: {\n      mutator: {\n        path: '../mutators/use-custom-instance.ts',\n        name: 'useCustomInstance',\n      },\n      query: {\n        useInfinite: true,\n      },\n    },\n  },\n}\n```\n\n## FormData Handling\n\nDefault FormData generation:\n\n```ts\noverride: {\n  formData: true,  // Auto-generate FormData serialization\n}\n```\n\nCustom FormData mutator:\n\n```ts\noverride: {\n  formData: {\n    path: './custom-form-data.ts',\n    name: 'customFormData',\n  },\n}\n```\n\n```ts\n// custom-form-data.ts\nexport const customFormData = <Body>(body: Body): FormData => {\n  const formData = new FormData();\n  Object.entries(body).forEach(([key, value]) => {\n    formData.append(key, value);\n  });\n  return formData;\n};\n```\n\nArray handling options for FormData:\n\n```ts\noverride: {\n  formData: {\n    arrayHandling: 'serialize',  // 'serialize' | 'serialize-with-brackets' | 'explode'\n  },\n}\n```\n\n- `serialize`: `formData.append('items', JSON.stringify(value))`\n- `serialize-with-brackets`: `formData.append('items[]', JSON.stringify(value))`\n- `explode`: Expands nested objects with indexed keys\n\nURL-encoded form data:\n\n```ts\noverride: {\n  formUrlEncoded: {\n    path: './custom-form-url-encoded.ts',\n    name: 'customFormUrlEncoded',\n  },\n}\n```\n\n## Content Type Filtering\n\n```ts\noverride: {\n  contentType: {\n    include: ['application/json'],\n    exclude: ['application/xml'],\n  },\n}\n```\n\n## JSDoc Customization\n\n```ts\noverride: {\n  jsDoc: {\n    filter: (schema) => {\n      const allowlist = [\n        'type', 'format', 'maxLength', 'minLength',\n        'description', 'minimum', 'maximum', 'pattern',\n        'nullable', 'enum',\n      ];\n      return Object.entries(schema || {})\n        .filter(([key]) => allowlist.includes(key))\n        .map(([key, value]) => ({ key, value }))\n        .sort((a, b) => a.key.length - b.key.length);\n    },\n  },\n}\n```\n\n## Request Options\n\nConfigure or remove the request options parameter:\n\n```ts\noverride: {\n  requestOptions: false,  // Remove request options entirely\n  // or configure headers:\n  requestOptions: {\n    headers: {\n      'X-Custom-Header': '${dynamicValue}',\n    },\n  },\n}\n```\n\n## Params Serializer\n\nCustom parameter serialization (Axios/Angular only):\n\n```ts\noverride: {\n  paramsSerializer: {\n    path: './custom-params-serializer.ts',\n    name: 'customParamsSerializerFn',\n  },\n  // or use qs library:\n  paramsSerializerOptions: {\n    qs: { arrayFormat: 'repeat' },\n  },\n}\n```\n\n## Custom Mutation Options\n\n```ts\noverride: {\n  query: {\n    mutationOptions: {\n      path: './custom-mutation.ts',\n      name: 'useCustomMutation',\n    },\n  },\n}\n```\n\n## Full Working Example\n\n```ts\nimport { faker } from '@faker-js/faker';\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    output: {\n      mode: 'split',\n      target: 'src/petstore.ts',\n      schemas: 'src/model',\n      client: 'react-query',\n      mocks: true,\n      override: {\n        operations: {\n          listPets: {\n            mutator: 'src/response-type.js',\n            mock: {\n              properties: () => ({\n                id: () => faker.number.int({ min: 1, max: 99999 }),\n              }),\n            },\n          },\n          showPetById: {\n            mock: {\n              data: () => ({\n                id: faker.number.int({ min: 1, max: 99 }),\n                name: faker.person.firstName(),\n                tag: faker.helpers.arrayElement([\n                  faker.word.sample(),\n                  undefined,\n                ]),\n              }),\n            },\n          },\n        },\n        mock: {\n          properties: {\n            '/tag|name/': () => faker.person.lastName(),\n          },\n          delay: 500,\n        },\n      },\n      allParamsOptional: true,\n      urlEncodeParameters: true,\n    },\n    input: {\n      target: './petstore.yaml',\n      override: {\n        transformer: 'src/add-version.js',\n      },\n    },\n    hooks: {\n      afterAllFilesWrite: 'prettier --write',\n    },\n  },\n});\n```\n","skills/orval/angular.md":"# Angular Clients\n\n## Angular Query\n\nSignal-based reactivity with Angular's dependency injection:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',\n  mode: 'tags-split',\n  override: {\n    query: {\n      useInvalidate: true,\n      signal: true,\n      runtimeValidation: true,    // Pipe responses through Zod validation\n      mutationInvalidates: [\n        {\n          onMutations: ['createPets'],\n          invalidates: ['listPets'],\n        },\n        {\n          onMutations: ['deletePet', 'updatePet'],\n          invalidates: [\n            'listPets',\n            { query: 'showPetById', params: ['petId'] },\n          ],\n        },\n      ],\n    },\n  },\n}\n```\n\nGenerated injectable functions with signal reactivity:\n\n```ts\n// Inject query — re-executes when signal changes\nexport function injectShowPetById<TData = Pet, TError = unknown>(\n  petId: string | (() => string),   // Accepts signal getters\n  options?: { query?: Partial<CreateQueryOptions<Pet, TError, TData>> },\n): CreateQueryResult<TData, TError> {\n  const http = inject(HttpClient);\n  const query = injectQuery(() => {\n    const _petId = typeof petId === 'function' ? petId() : petId;\n    return getShowPetByIdQueryOptions(http, _petId, options);\n  });\n  return query;\n}\n\n// Inject mutation\nexport const injectCreatePets = <TError = Error, TContext = unknown>(\n  options?: { mutation?: CreateMutationOptions<...>; fetch?: RequestInit },\n): CreateMutationResult<...> => {\n  const http = inject(HttpClient);\n  const queryClient = inject(QueryClient);\n  return injectMutation(() => getCreatePetsMutationOptions(http, queryClient, options));\n};\n```\n\nUsage in Angular components:\n\n```ts\n@Component({...})\nexport class PetDetailComponent {\n  petId = signal('1');\n\n  // Query re-executes when petId() changes\n  pet = injectShowPetById(() => this.petId());\n\n  // Dynamic enabled/disabled\n  conditionalPet = injectShowPetById(\n    () => this.petId(),\n    () => ({ query: { enabled: this.isEnabled() } }),\n  );\n\n  // Mutation with auto-invalidation\n  deletePet = injectDeletePet({\n    mutation: {\n      onSuccess: () => this.snackbar.open('Pet deleted!'),\n    },\n  });\n\n  // Skip auto-invalidation for custom control\n  customDelete = injectDeletePet({\n    mutation: {\n      onSuccess: () => {\n        setTimeout(() => {\n          this.queryClient.invalidateQueries({ queryKey: getListPetsQueryKey() });\n        }, 700);\n      },\n    },\n    skipInvalidation: true,\n  });\n}\n```\n\n### Zod Runtime Validation\n\nWhen `runtimeValidation: true` and `schemas.type: 'zod'`:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',\n  schemas: { path: 'src/model', type: 'zod' },\n  override: {\n    query: { runtimeValidation: true },\n  },\n}\n```\n\nGenerated code pipes through Zod:\n\n```ts\nconst request$ = http\n  .get<Pets>(url, { params: httpParams })\n  .pipe(map((data) => Pets.parse(data)));\n```\n\n## Angular (HttpClient)\n\nTraditional Angular service generation:\n\n```ts\noutput: {\n  client: 'angular',\n  mode: 'tags-split',\n  mocks: true,\n  override: {\n    angular: {\n      provideIn: 'root',  // 'root' | 'any' | '' | false\n    },\n  },\n}\n```\n\nSetting backend URL with interceptor:\n\n```ts\n@Injectable()\nexport class ApiInterceptor implements HttpInterceptor {\n  intercept(req: HttpRequest<any>, next: HttpHandler) {\n    const apiReq = req.clone({\n      url: `https://api.example.com${req.url}`,\n    });\n    return next.handle(apiReq);\n  }\n}\n```\n\n## Angular Custom Mutator with HttpClient\n\n```ts\n// custom-client-with-error.ts\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nexport interface ExtendedServerErrorResponse<Error> extends HttpErrorResponse {\n  error: Error | any | null;\n}\nexport type ErrorType<Error> = ExtendedServerErrorResponse<Error>;\n\nexport const responseType = <Result>(\n  {\n    url,\n    method,\n    params,\n    data,\n    signal,\n    responseType,\n  }: {\n    url: string;\n    method: string;\n    params?: any;\n    data?: any;\n    headers?: any;\n    signal?: AbortSignal;\n    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n  },\n  http?: HttpClient,\n): Promise<Result> => {\n  if (!http) throw new Error('HttpClient is required.');\n  return lastValueFrom(\n    http.request<Result>(method, url, {\n      params,\n      body: data,\n      responseType: (responseType ?? 'json') as 'json',\n    }),\n  );\n};\n\nexport default responseType;\n```\n","skills/orval/custom-http-clients.md":"# Custom HTTP Client (Mutator)\n\nReplace the default HTTP implementation with a custom mutator.\n\n## Basic Axios Mutator\n\n```ts\n// orval.config.ts\noutput: {\n  override: {\n    mutator: {\n      path: './api/mutator/custom-instance.ts',\n      name: 'customInstance',\n    },\n  },\n}\n```\n\n```ts\n// custom-instance.ts\nimport Axios, { AxiosRequestConfig, AxiosError } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({ baseURL: '' });\n\nexport const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {\n  return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n};\n\nexport type ErrorType<Error> = AxiosError<Error>;\nexport type BodyType<BodyData> = BodyData;\n```\n\n## Axios with Interceptors (Auth, Error Handling)\n\n```ts\n// custom-instance.ts\nimport Axios, { AxiosRequestConfig, AxiosError } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({\n  baseURL: process.env.API_URL,\n});\n\n// Request interceptor — token injection\nAXIOS_INSTANCE.interceptors.request.use(\n  (config) => {\n    const token = localStorage.getItem('token');\n    if (token) config.headers.Authorization = `Bearer ${token}`;\n    return config;\n  },\n  (error) => Promise.reject(error),\n);\n\n// Response interceptor — error handling\nAXIOS_INSTANCE.interceptors.response.use(\n  (response) => response,\n  (error) => {\n    if (error.response?.status === 401) {\n      // Handle unauthorized\n    }\n    return Promise.reject(error);\n  },\n);\n\nexport const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {\n  return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n};\n\nexport type ErrorType<Error> = AxiosError<Error>;\nexport type BodyType<BodyData> = BodyData;\n```\n\n## React Context Auth with Interceptors\n\n```tsx\n// auth.context.tsx\nimport { useEffect, useState, createContext, useContext } from 'react';\nimport { AXIOS_INSTANCE } from './api/mutator/custom-instance';\n\nconst AuthProvider = ({ children, initialState = null }) => {\n  const [token, setToken] = useState(initialState);\n\n  useEffect(() => {\n    const interceptorId = AXIOS_INSTANCE.interceptors.request.use((config) => {\n      if (config.headers && token) {\n        config.headers.set('Authorization', `Bearer ${token}`);\n      }\n      return config;\n    });\n\n    return () => {\n      AXIOS_INSTANCE.interceptors.request.eject(interceptorId);\n    };\n  }, [token]);\n\n  return (\n    <AuthContext.Provider value={token}>\n      <AuthDispatchContext.Provider value={setToken}>\n        {children}\n      </AuthDispatchContext.Provider>\n    </AuthContext.Provider>\n  );\n};\n```\n\n## Hook-Based Mutator (Axios)\n\nAllows using React hooks inside the mutator (e.g., for auth state, callbacks):\n\n```ts\n// orval.config.ts\noutput: {\n  override: {\n    mutator: {\n      path: './use-custom-instance.ts',\n      name: 'useCustomInstance',\n    },\n  },\n}\n```\n\n```ts\n// use-custom-instance.ts\nimport Axios, { type AxiosRequestConfig } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({ baseURL: '' });\n\nexport const useCustomInstance = <T>(): ((\n  config: AxiosRequestConfig,\n) => Promise<T>) => {\n  // Can use React hooks here (useAuth, useCallback, etc.)\n  return (config: AxiosRequestConfig) => {\n    return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n  };\n};\n\nexport default useCustomInstance;\n```\n\n## Hook-Based Mutator (Fetch with useCallback)\n\n```ts\n// use-custom-fetch.ts\nimport { useCallback, useState } from 'react';\n\nexport function useGetBaseUrl() {\n  const [baseUrl] = useState('');\n  return baseUrl;\n}\n\nexport function useCustomFetch() {\n  const baseUrl = useGetBaseUrl();\n  return useCallback(\n    async <T>(url: string, options?: RequestInit): Promise<T> => {\n      const headers = new Headers(options?.headers);\n      const response = await fetch(`${baseUrl}${url}`, {\n        ...options,\n        headers,\n      });\n      if (!response.ok) throw new Error('Network response was not ok');\n      return response.json();\n    },\n    [],\n  );\n}\n```\n\n## Fetch with Content-Type Detection\n\nHandle PDF, blob, text, XML responses (not just JSON):\n\n```ts\n// custom-fetch.ts\nconst getBody = <T>(c: Response | Request): Promise<T> => {\n  const contentType = c.headers.get('content-type');\n  if (contentType && contentType.includes('application/json')) {\n    return c.json();\n  }\n  if (contentType && contentType.includes('application/pdf')) {\n    return c.blob() as Promise<T>;\n  }\n  return c.text() as Promise<T>;\n};\n\nconst getUrl = (contextUrl: string): string => {\n  const url = new URL(contextUrl);\n  const baseUrl =\n    process.env.NODE_ENV === 'production'\n      ? 'https://api.production.com'\n      : 'http://localhost:3000';\n  return new URL(`${baseUrl}${url.pathname}${url.search}`).toString();\n};\n\nexport const customFetch = async <T>(\n  url: string,\n  options: RequestInit,\n): Promise<T> => {\n  const requestUrl = getUrl(url);\n  const requestHeaders = {\n    ...options.headers,\n    Authorization: 'Bearer my-token',\n  };\n  const response = await fetch(requestUrl, {\n    ...options,\n    headers: requestHeaders,\n  });\n  const data = await getBody<T>(response);\n  return { status: response.status, data, headers: response.headers } as T;\n};\n\nexport default customFetch;\n```\n\n## Fetch Client Config\n\nNative Fetch API — no dependencies, works in browsers, Node.js, Cloudflare Workers, Vercel Edge, Deno.\n\n```ts\noutput: {\n  client: 'fetch',\n  baseUrl: 'http://localhost:3000',\n  override: {\n    fetch: {\n      includeHttpResponseReturnType: false,  // Return data directly instead of { data, status }\n      forceSuccessResponse: true,            // Throw on error responses\n      runtimeValidation: true,               // Validate responses with Zod\n      jsonReviver: {                         // Custom JSON reviver (e.g. for dates)\n        path: './reviver.ts',\n        name: 'dateReviver',\n      },\n    },\n  },\n}\n```\n\n## Environment-Based URL Switching\n\nUsing base URL from spec with variables:\n\n```ts\noutput: {\n  baseUrl: {\n    getBaseUrlFromSpecification: true,\n    variables: {\n      environment: process.env.NODE_ENV === 'production' ? 'api.prod' : 'api.dev',\n    },\n  },\n}\n```\n\nOr use a `getUrl` function in a custom fetch mutator (see the `getUrl` pattern in \"Fetch with Content-Type Detection\" above).\n","skills/orval/hono.md":"# Hono Server Client\n\nGenerate type-safe Hono server handlers with built-in Zod validation from OpenAPI specs.\n\n## Quick Start\n\n```bash\nnpm install hono @hono/zod-validator zod\n```\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'src/handlers',\n        },\n      },\n    },\n  },\n});\n```\n\n## Configuration Options\n\n```ts\noutput: {\n  client: 'hono',\n  override: {\n    hono: {\n      handlers: 'src/handlers',             // Directory for per-operation handler files\n      compositeRoute: 'src/routes.ts',      // Combined routes file (used with tags-split)\n      validator: true,                       // true (default) | 'hono' | false\n      validatorOutputPath: 'src/validator.ts', // Custom validator output path\n    },\n  },\n}\n```\n\n| Option                | Type                | Default         | Description                                                                                                                                              |\n| --------------------- | ------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `handlers`            | `string`            | —               | Directory for per-operation handler files. One file per operation.                                                                                       |\n| `compositeRoute`      | `string`            | `''` (disabled) | Path for combined routes file. Used with `tags-split` mode.                                                                                              |\n| `validator`           | `boolean \\| 'hono'` | `true`          | `true` = orval's custom zValidator with response validation; `'hono'` = `@hono/zod-validator` directly (no response validation); `false` = no validators |\n| `validatorOutputPath` | `string`            | `''` (auto)     | Custom output path for the generated validator file                                                                                                      |\n\n## Generated File Structure\n\n### `split` mode with `handlers`\n\n```\nsrc/\n├── handlers/\n│   ├── listPets.ts           # Per-operation handler (NOT overwritten if exists)\n│   ├── createPets.ts\n│   ├── showPetById.ts\n│   └── updatePets.ts\n├── petstore.ts               # Hono app with routes (regenerated)\n├── petstore.context.ts       # Type-safe context types (regenerated)\n├── petstore.schemas.ts       # TypeScript types\n├── petstore.validator.ts     # Custom zValidator wrapper (regenerated)\n└── petstore.zod.ts           # Zod schemas (regenerated)\n```\n\n### `tags-split` with `compositeRoute`\n\n```\nsrc/\n├── endpoints/\n│   └── pets/\n│       ├── pets.context.ts\n│       ├── pets.handlers.ts  # All handlers for tag in one file\n│       └── pets.zod.ts\n├── schemas/\n│   ├── pet.ts\n│   ├── pets.ts\n│   └── index.ts\n├── routes.ts                 # Combined routes file\n└── endpoints/validator.ts    # Shared validator\n```\n\n### `tags` mode\n\n```\nsrc/\n├── handlers/\n│   ├── listPets.ts\n│   └── createPets.ts\n├── pets.ts                   # Route file per tag\n├── pets.context.ts\n├── pets.zod.ts\n└── pets.validator.ts\n```\n\n## Generated Route File\n\n```ts\nimport { Hono } from 'hono';\nimport { listPetsHandlers } from './handlers/listPets';\nimport { createPetsHandlers } from './handlers/createPets';\nimport { showPetByIdHandlers } from './handlers/showPetById';\n\nconst app = new Hono();\n\napp.get('/pets', ...listPetsHandlers);\napp.post('/pets', ...createPetsHandlers);\napp.get('/pets/:petId', ...showPetByIdHandlers);\n\nexport default app;\n```\n\nOpenAPI path params `{petId}` are converted to Hono format `:petId`.\n\n## Handler Templates\n\n### Query parameters\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { ListPetsContext } from '../petstore.context';\nimport { listPetsQueryParams, listPetsResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const listPetsHandlers = factory.createHandlers(\n  zValidator('query', listPetsQueryParams),\n  zValidator('response', listPetsResponse),\n  async (c: ListPetsContext) => {\n    return c.json([{ id: 1, name: 'Buddy' }]);\n  },\n);\n```\n\n### Path parameters\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { ShowPetByIdContext } from '../petstore.context';\nimport { showPetByIdParams, showPetByIdResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const showPetByIdHandlers = factory.createHandlers(\n  zValidator('param', showPetByIdParams),\n  zValidator('response', showPetByIdResponse),\n  async (c: ShowPetByIdContext) => {\n    const { petId } = c.req.valid('param');\n    return c.json({ id: Number(petId), name: 'Buddy' });\n  },\n);\n```\n\n### JSON body\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { CreatePetsContext } from '../petstore.context';\nimport { createPetsBody, createPetsResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const createPetsHandlers = factory.createHandlers(\n  zValidator('json', createPetsBody),\n  zValidator('response', createPetsResponse),\n  async (c: CreatePetsContext) => {\n    const body = c.req.valid('json');\n    return c.json({ id: 1, ...body });\n  },\n);\n```\n\n### Validator order in generated handlers\n\n1. `zValidator('header', ...)` — if request headers exist\n2. `zValidator('param', ...)` — if path parameters exist\n3. `zValidator('query', ...)` — if query parameters exist\n4. `zValidator('json', ...)` — if request body exists\n5. `zValidator('response', ...)` — if 200 JSON response exists AND `validator !== 'hono'`\n\n## Context Types\n\nGenerated context types encode the validated input shape for type-safe access:\n\n```ts\nimport type { Context, Env } from 'hono';\n\nexport type ListPetsContext<E extends Env = any> = Context<\n  E,\n  '/pets',\n  { in: { query: ListPetsParams }; out: { query: ListPetsParams } }\n>;\n\nexport type ShowPetByIdContext<E extends Env = any> = Context<\n  E,\n  '/pets/:petId',\n  {\n    in: { param: { petId: string } };\n    out: { param: { petId: string } };\n  }\n>;\n\nexport type CreatePetsContext<E extends Env = any> = Context<\n  E,\n  '/pets',\n  { in: { json: CreatePetsBodyItem[] }; out: { json: CreatePetsBodyItem[] } }\n>;\n```\n\nWhen an operation has no params/query/body, the third generic is omitted.\n\nA `NonReadonly<T>` utility type is emitted only when schema types contain readonly properties.\n\n## zValidator (Response Validation)\n\nOrval's custom `zValidator` extends `@hono/zod-validator` with a `response` target:\n\n```ts\nzValidator('response', responseSchema);\n```\n\nResponse validation behavior (when `validator: true`):\n\n- Runs as post-middleware (calls `await next()` first)\n- Only validates HTTP 200 responses with `Content-Type: application/json`\n- Uses `safeParseAsync` — supports Zod v3 and v4\n- On parse failure: returns HTTP 400 with `{ success, data, error }`\n- On malformed JSON: returns HTTP 400 with `'Malformed JSON in response'`\n- Supports optional `hook` callback for custom validation handling\n\nSee the `validator` option in Configuration Options above for the three modes (`true`, `'hono'`, `false`).\n\n## Composite Routes\n\nFor `tags-split` mode with multiple tag groups:\n\n```ts\noutput: {\n  mode: 'tags-split',\n  client: 'hono',\n  target: 'src/endpoints',\n  schemas: 'src/schemas',\n  override: {\n    hono: {\n      compositeRoute: 'src/routes.ts',\n      validatorOutputPath: 'src/endpoints/validator.ts',\n    },\n  },\n}\n```\n\nGenerated `routes.ts`:\n\n```ts\nimport { Hono } from 'hono';\nimport {\n  listPetsHandlers,\n  createPetsHandlers,\n  showPetByIdHandlers,\n} from './endpoints/pets/pets.handlers';\n\nconst app = new Hono();\n\napp.get('/pets', ...listPetsHandlers);\napp.post('/pets', ...createPetsHandlers);\napp.get('/pets/:petId', ...showPetByIdHandlers);\n\nexport default app;\n```\n\nWire it up in your app entry point:\n\n```ts\nimport { Hono } from 'hono';\nimport routes from './routes';\n\nconst app = new Hono();\napp.route('/', routes);\n\nexport default app;\n```\n\nWithout `compositeRoute` in `tags-split` mode, you must wire routes manually.\n\n## Zod Schema Options for Hono\n\nControl how Zod schemas are generated alongside Hono handlers:\n\n```ts\noverride: {\n  hono: {\n    handlers: 'src/handlers',\n  },\n  zod: {\n    strict: {\n      response: true,         // Add .strict() to response schemas\n    },\n    preprocess: {\n      response: {\n        name: 'stripNill',\n        path: './src/mutators.ts',\n      },\n    },\n  },\n}\n```\n\n```ts\n// src/mutators.ts\nexport const stripNill = (object: unknown) =>\n  !!object && typeof object === 'object' && !Array.isArray(object)\n    ? Object.fromEntries(\n        Object.entries(object).filter(\n          ([_, value]) => value !== null && value !== undefined,\n        ),\n      )\n    : object;\n```\n\n## Zod Schema Naming Conventions\n\n| Type             | Pattern                   | Example               |\n| ---------------- | ------------------------- | --------------------- |\n| Query params     | `{PascalName}QueryParams` | `ListPetsQueryParams` |\n| Path params      | `{PascalName}Params`      | `ShowPetByIdParams`   |\n| Request headers  | `{PascalName}Header`      | `ListPetsHeader`      |\n| Request body     | `{PascalName}Body`        | `CreatePetsBody`      |\n| Array body items | `{PascalName}BodyItem`    | `CreatePetsBodyItem`  |\n| Response         | `{PascalName}Response`    | `ListPetsResponse`    |\n\n## Full Examples\n\n### Split mode with handlers\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'src/handlers',\n        },\n        zod: {\n          strict: { response: true },\n          preprocess: {\n            response: {\n              name: 'stripNill',\n              path: './src/mutators.ts',\n            },\n          },\n        },\n      },\n    },\n  },\n});\n```\n\n### Tags-split with composite routes\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  api: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'tags-split',\n      client: 'hono',\n      target: 'src/endpoints',\n      schemas: 'src/schemas',\n      clean: true,\n      override: {\n        hono: {\n          compositeRoute: 'src/routes.ts',\n          validatorOutputPath: 'src/endpoints/validator.ts',\n        },\n      },\n    },\n  },\n});\n```\n\n### Hono server + Fetch client (full-stack)\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstoreClient: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'tags-split',\n      client: 'fetch',\n      target: 'next-app/app/gen/',\n      schemas: 'next-app/app/gen/models',\n      clean: true,\n      baseUrl: 'http://localhost:8787',\n      mocks: true,\n    },\n  },\n  petstoreApi: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'hono-app/src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'hono-app/src/handlers',\n        },\n      },\n    },\n  },\n});\n```\n\n## Key Behavioral Notes\n\n- **Handler files are never overwritten** — existing handlers are preserved, new operations are appended\n- **All other generated files are regenerated** on every run (routes, context, zod, validator)\n- **Response validation only runs for HTTP 200 with `application/json`** — other status codes pass through\n- **Cloudflare Workers** is the primary deployment target (use `wrangler dev`)\n- **Required dependencies**: `hono`, `@hono/zod-validator`, `zod`\n\n## Running\n\n```bash\n# Cloudflare Workers\nwrangler dev src/index.ts\n\n# Test\ncurl http://localhost:8787/pets\n```\n","skills/orval/mocking-msw.md":"# MSW Mock Generation\n\n```ts\noutput: {\n  mocks: true,\n  // or with options:\n  mocks: {\n    generators: [\n      {\n        type: 'msw',\n        delay: 1000,\n        delayFunctionLazyExecute: false,\n        useExamples: true,\n        generateEachHttpStatus: false,\n        baseUrl: 'https://api.example.com',\n        locale: 'en',\n        preferredContentType: 'application/json',\n      },\n    ],\n  },\n}\n```\n\n`mocks: true` is shorthand for `{ generators: [{ type: 'msw' }, { type: 'faker' }] }` and emits both `<file>.msw.ts` and `<file>.faker.ts`. Use `{ type: 'faker' }` alone for response-mock factories with no MSW dependency.\n\nGenerated mock handler:\n\n```ts\nexport const getShowPetByIdMockHandler = (\n  overrideResponse?: Pet | ((info: RequestHandlerOptions) => Promise<Pet>),\n  options?: RequestHandlerOptions,\n) => {\n  return http.get(\n    '*/pets/:petId',\n    async (info) => {\n      await delay(1000);\n      return HttpResponse.json(\n        overrideResponse !== undefined\n          ? typeof overrideResponse === 'function'\n            ? await overrideResponse(info)\n            : overrideResponse\n          : getShowPetByIdResponseMock(),\n        { status: 200 },\n      );\n    },\n    options,\n  );\n};\n\nexport const getShowPetByIdResponseMock = (\n  overrideResponse: Partial<Pet> = {},\n): Pet => ({\n  id: faker.number.int(),\n  name: faker.string.alpha(20),\n  tag: faker.string.alpha(20),\n  ...overrideResponse,\n});\n```\n\nContent-type aware responses — MSW handlers automatically use the correct helper:\n\n| Content type                          | Response helper                      |\n| ------------------------------------- | ------------------------------------ |\n| `application/json`                    | `HttpResponse.json()`                |\n| `application/xml`, `*+xml`            | `HttpResponse.xml()`                 |\n| `text/html`                           | `HttpResponse.html()`                |\n| `text/plain`, other `text/*`          | `HttpResponse.text()`                |\n| `application/octet-stream`, `image/*` | `HttpResponse.arrayBuffer()`         |\n| No body (204, etc.)                   | `new HttpResponse(null, { status })` |\n\n## Test Setup with Vitest\n\n```ts\nimport {\n  getListPetsMockHandler,\n  getShowPetByIdMockHandler,\n} from './api/petstore.msw';\nimport { setupServer } from 'msw/node';\n\nconst server = setupServer(...getListPetsMockHandler());\n\nbeforeAll(() => server.listen());\nafterEach(() => server.resetHandlers());\nafterAll(() => server.close());\n\n// Override for specific test\nit('handles empty list', () => {\n  server.use(getListPetsMockHandler([]));\n  // ...\n});\n\n// Dynamic response based on request\nit('returns pet by id', () => {\n  server.use(\n    getShowPetByIdMockHandler(async ({ params }) => ({\n      id: Number(params.petId),\n      name: 'Test Pet',\n    })),\n  );\n  // ...\n});\n```\n\n## Mock Customization\n\n```ts\noverride: {\n  mock: {\n    properties: {\n      '/tag|name/': 'jon',              // Regex match\n      email: () => faker.internet.email(),\n    },\n    format: {\n      email: () => faker.internet.email(),\n      iban: () => faker.finance.iban(),\n    },\n    required: true,\n    delay: 500,\n    arrayMin: 1,\n    arrayMax: 10,\n    stringMin: 10,\n    stringMax: 20,\n    numberMin: 0,\n    numberMax: 100,\n    fractionDigits: 2,\n  },\n}\n```\n\nPer-operation mock data:\n\n```ts\noverride: {\n  operations: {\n    listPets: {\n      mock: {\n        properties: () => ({\n          '[].id': () => faker.number.int({ min: 1, max: 99999 }),\n        }),\n      },\n    },\n    showPetById: {\n      mock: {\n        data: () => ({\n          id: faker.number.int({ min: 1, max: 99 }),\n          name: faker.person.firstName(),\n          tag: faker.helpers.arrayElement([faker.word.sample(), undefined]),\n        }),\n      },\n    },\n  },\n}\n```\n\n## Dynamic Mock Imports (indexMockFiles)\n\nIn `tags-split` mode, emit one `index.<ext>.ts` per generator entry (e.g. `index.msw.ts`, `index.faker.ts`):\n\n```ts\noutput: {\n  mode: 'tags-split',\n  mocks: {\n    indexMockFiles: true,\n    generators: [{ type: 'msw' }],\n  },\n}\n```\n","skills/orval/solid-start.md":"# SolidStart Client\n\nUses native SolidStart primitives (`query()` and `action()` from `@solidjs/router`) instead of TanStack Query.\n\n```ts\noutput: {\n  client: 'solid-start',\n  mode: 'tags-split',\n  target: 'src/api/petstore.ts',\n  schemas: 'src/api/model',\n  mocks: true,\n}\n```\n\nGenerated output:\n\n```ts\nimport { query, action } from '@solidjs/router';\n\nexport const SwaggerPetstore = {\n  // GET requests -> query() with automatic caching\n  listPets: query(async (params: ListPetsParams) => {\n    const queryString = new URLSearchParams(params as any).toString();\n    const url = queryString ? `/pets?${queryString}` : `/pets`;\n    const response = await fetch(url, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\n    return response.json() as Promise<Pets>;\n  }, 'listPets'),\n\n  // POST/PUT/PATCH/DELETE -> action() (mutations, not cached)\n  createPets: action(async (createPetsBody: CreatePetsBody) => {\n    const response = await fetch('/pets', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(createPetsBody),\n    });\n    return response.json() as Promise<Pet>;\n  }, 'createPets'),\n};\n```\n\n## Cache Invalidation\n\n```ts\nimport { revalidate } from '@solidjs/router';\n\n// Invalidate all instances of a query\nrevalidate(SwaggerPetstore.listPets.key);\n\n// Invalidate specific call by arguments\nrevalidate(SwaggerPetstore.showPetById.keyFor('pet-123'));\n```\n\n## Usage with Components\n\n```tsx\nimport { createAsync } from '@solidjs/router';\nimport { Suspense } from 'solid-js';\n\nfunction PetDetails(props: { petId: string }) {\n  const pet = createAsync(() => SwaggerPetstore.showPetById(props.petId));\n  return (\n    <Suspense fallback={<div>Loading...</div>}>\n      <h1>{pet()?.name}</h1>\n    </Suspense>\n  );\n}\n\n// Actions work with HTML forms\n<form action={SwaggerPetstore.createPets} method=\"post\">\n  <input name=\"name\" required />\n  <button type=\"submit\">Create Pet</button>\n</form>;\n\n// Or programmatically\nfunction DeletePetButton(props: { petId: string }) {\n  const deletePet = useAction(SwaggerPetstore.deletePetById);\n  return <button onClick={() => deletePet(props.petId)}>Delete</button>;\n}\n```\n","skills/orval/tanstack-query.md":"# TanStack Query / SWR Clients\n\n## React Query / TanStack Query\n\n```ts\noutput: {\n  client: 'react-query',\n  override: {\n    query: {\n      useQuery: true,\n      useMutation: true,\n      useInfinite: true,\n      useInfiniteQueryParam: 'cursor',\n      useSuspenseQuery: true,\n      useSuspenseInfiniteQuery: true,\n      usePrefetch: true,\n      useInvalidate: true,\n      signal: true,\n      shouldExportKeys: true,\n      shouldSplitQueryKey: false,       // Array vs string query keys\n      useOperationIdAsQueryKey: false,  // Use operationId instead of route path\n      options: { staleTime: 10000 },\n      mutationInvalidates: [\n        {\n          onMutations: ['createPets'],\n          invalidates: ['listPets'],\n        },\n        {\n          onMutations: ['deletePet', 'updatePet'],\n          invalidates: [\n            'listPets',\n            { query: 'showPetById', params: ['petId'] },\n          ],\n        },\n      ],\n    },\n  },\n}\n```\n\nGenerated hooks:\n\n```ts\n// Query hook with automatic query key\nexport const useShowPetById = <TData = Pet, TError = Error>(\n  petId: string,\n  options?: { query?: UseQueryOptions<Pet, TError, TData> },\n) => {\n  const queryKey = getShowPetByIdQueryKey(petId);\n  const queryFn = () => showPetById(petId);\n  return useQuery({ queryKey, queryFn, enabled: !!petId, ...options?.query });\n};\n\n// Exported query key for manual invalidation\nexport const getShowPetByIdQueryKey = (petId: string) => [`/pets/${petId}`];\n```\n\n## Vue Query\n\n```ts\noutput: {\n  client: 'vue-query',\n  // Same override.query options as React Query\n}\n```\n\n## Svelte Query\n\n```ts\noutput: {\n  client: 'svelte-query',\n  // Same override.query options as React Query\n}\n```\n\n## Solid Query\n\nFor standalone SolidJS apps (not SolidStart):\n\n```ts\noutput: {\n  client: 'solid-query',\n  // Same override.query options as React Query\n}\n```\n\n## SWR\n\n```ts\noutput: {\n  client: 'swr',\n  override: {\n    swr: {\n      useInfinite: true,\n      useSuspense: true,\n      useSWRMutationForGet: false,\n      generateErrorTypes: false,\n      swrOptions: { dedupingInterval: 10000 },\n      swrMutationOptions: { revalidate: true },\n      swrInfiniteOptions: { initialSize: 10 },\n    },\n  },\n}\n```\n\n## Query Invalidation Patterns\n\nBasic invalidation:\n\n```ts\noverride: {\n  query: {\n    useInvalidate: true,\n    mutationInvalidates: [\n      {\n        onMutations: ['createPets'],\n        invalidates: ['listPets'],\n      },\n    ],\n  },\n}\n```\n\nAdvanced invalidation with params and cross-file references:\n\n```ts\nmutationInvalidates: [\n  {\n    onMutations: ['deletePet', 'updatePet', 'patchPet'],\n    invalidates: [\n      'listPets',\n      { query: 'showPetById', params: ['petId'] },\n      { query: 'adminPets', file: './admin' },\n    ],\n  },\n  {\n    onMutations: ['uploadFile'],\n    invalidates: ['listPets'],\n  },\n],\n```\n\nReset mode (reset query state instead of refetch):\n\n```ts\ninvalidates: [\n  { query: 'showPetById', params: ['petId'], invalidationMode: 'reset' },\n],\n```\n\nSkip invalidation at runtime:\n\n```ts\nconst deletePet = useDeletePet({\n  mutation: {\n    onSuccess: () => {\n      // Custom invalidation logic\n      queryClient.invalidateQueries({ queryKey: getListPetsQueryKey() });\n    },\n  },\n  skipInvalidation: true,\n});\n```\n","skills/orval/tooling-workflow.md":"# Tooling & Workflow\n\n## MCP (AI Agent Tools)\n\nGenerate Model Context Protocol servers from OpenAPI specs for AI agent integration (Claude, Cline, etc.):\n\n```ts\noutput: {\n  mode: 'single',       // ONLY works in single mode\n  client: 'mcp',\n  baseUrl: 'https://petstore3.swagger.io/api/v3',\n  target: 'src/handlers.ts',\n  schemas: 'src/http-schemas',\n}\n```\n\nGenerated files:\n\n- `src/http-schemas/` — TypeScript types\n- `src/handlers.ts` — Handler functions returning MCP format\n- `src/http-client.ts` — Generated fetch client\n- `src/server.ts` — MCP tools and server configuration\n- `src/tool-schemas.zod.ts` — Zod schemas for tool inputs\n\nDeploy with Docker and configure in your MCP client (e.g. Cline's `mcpServers` config).\n\n## NDJSON Streaming\n\nType-safe newline-delimited JSON streaming. Only supported with Fetch client.\n\nOpenAPI schema:\n\n```yaml\npaths:\n  /stream:\n    get:\n      responses:\n        '200':\n          content:\n            application/x-ndjson:\n              schema:\n                $ref: '#/components/schemas/StreamEntry'\n```\n\nGenerated types and function:\n\n```ts\nexport type streamResponse200 = {\n  stream: TypedResponse<StreamEntry>;\n  status: 200;\n};\n\nexport const stream = async (\n  options?: RequestInit,\n): Promise<streamResponse> => {\n  const stream = await fetch(getStreamUrl(), {\n    ...options,\n    method: 'GET',\n    headers: { Accept: 'application/x-ndjson', ...options?.headers },\n  });\n  return {\n    status: stream.status,\n    stream,\n    headers: stream.headers,\n  } as streamResponse;\n};\n```\n\nReading the stream:\n\n```ts\nexport const readStream = <T extends object>(\n  response: Response & { json(): Promise<T> },\n  processLine: (value: T) => void,\n): Promise<void> => {\n  if (!response.body) return Promise.resolve();\n  const stream = response.body.getReader();\n  const decoder = new TextDecoder();\n  let buffer = '';\n\n  const loop = (): Promise<void> =>\n    stream.read().then(({ done, value }) => {\n      if (done) {\n        if (buffer.length > 0) processLine(JSON.parse(buffer));\n        return;\n      }\n      buffer += decoder.decode(value, { stream: true });\n      const parts = buffer.split(/\\r?\\n/);\n      buffer = parts.pop() ?? '';\n      for (const part of parts.filter(Boolean)) {\n        processLine(JSON.parse(part) as T);\n      }\n      return loop();\n    });\n  return loop();\n};\n\n// Usage\nconst results: StreamEntry[] = [];\nconst response = await stream();\nif (response.status === 200) {\n  await readStream(response.stream, (obj) => results.push(obj));\n}\n```\n\n## Input Transformers\n\nTransform the OpenAPI spec before generation:\n\n```ts\ninput: {\n  target: './spec.yaml',\n  override: {\n    transformer: './transformers/add-auth-header.js',\n  },\n}\n```\n\n```js\n// add-auth-header.js\nmodule.exports = (openAPIDocument) => {\n  // Modify and return the spec\n  return openAPIDocument;\n};\n```\n\n## Hooks (afterAllFilesWrite)\n\nRun scripts after Orval generates files:\n\n```ts\nexport default defineConfig({\n  petstore: {\n    input: './petstore.yaml',\n    output: './petstore.ts',\n    hooks: {\n      afterAllFilesWrite: 'prettier --write',\n    },\n  },\n});\n```\n\nMultiple commands:\n\n```ts\nhooks: {\n  afterAllFilesWrite: ['prettier --write', 'eslint --fix'],\n}\n```\n\nDisable file path injection:\n\n```ts\nhooks: {\n  afterAllFilesWrite: {\n    command: 'prettier --write .',\n    injectGeneratedDirsAndFiles: false,\n  },\n}\n```\n\n## Programmatic API\n\nUse Orval programmatically in build scripts:\n\n```ts\nimport { generate } from 'orval';\n\n// From config file\nawait generate('./orval.config.ts');\n\n// With direct configuration\nimport type { Options } from 'orval';\n\nconst config: Options = {\n  input: { target: './api-spec.yaml' },\n  output: { target: './src/api.ts', client: 'axios' },\n};\nawait generate(config);\n```\n\nWith global options override:\n\n```ts\nimport { generate, type GlobalOptions } from 'orval';\n\nconst globalOptions: GlobalOptions = {\n  watch: true,\n  // watch: ['./specs/*.yaml'],   // Watch specific patterns\n  clean: true,\n  prettier: true,\n  client: 'fetch',\n  mode: 'split',\n  mocks: true,\n  tsconfig: './tsconfig.json',\n};\n\nawait generate('./orval.config.ts', process.cwd(), globalOptions);\n```\n\nFunction signature:\n\n```ts\nfunction generate(\n  optionsExport?: string | OptionsExport,\n  workspace?: string,\n  options?: GlobalOptions,\n): Promise<void>;\n```\n\nBuild script integration:\n\n```json\n{\n  \"scripts\": {\n    \"generate\": \"node scripts/generate-api.js\",\n    \"dev\": \"npm run generate && next dev\",\n    \"build\": \"npm run generate && next build\"\n  }\n}\n```\n\n```js\n// scripts/generate-api.js\nconst { generate } = require('orval');\n\nasync function main() {\n  try {\n    await generate();\n    console.log('API client generated successfully');\n  } catch (error) {\n    console.error('Failed to generate API client:', error);\n    process.exit(1);\n  }\n}\n\nmain();\n```\n","skills/orval/zod-validation.md":"# Zod Schema Generation\n\n## Standalone Zod Schemas\n\n```ts\noutput: {\n  client: 'zod',\n  target: './src/api/schemas',\n}\n```\n\nGenerated:\n\n```ts\nexport const createPetsBody = zod.object({\n  id: zod.number(),\n  name: zod.string(),\n  tag: zod.string().optional(),\n});\n```\n\n## Combined with HTTP Client\n\n```ts\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'react-query',\n      target: 'src/api/endpoints',\n      schemas: 'src/api/models',\n    },\n  },\n  petstoreZod: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'zod',\n      target: 'src/api/endpoints',\n      fileExtension: '.zod.ts', // Avoid filename conflicts\n    },\n  },\n});\n```\n\n## Zod Options\n\n```ts\noverride: {\n  zod: {\n    strict: {\n      response: true,\n      query: true,\n      param: true,\n      header: true,\n      body: true,\n    },\n    coerce: {\n      query: ['string', 'number', 'boolean'],\n    },\n    generate: {\n      param: true,\n      body: true,\n      response: true,\n      query: true,\n      header: true,\n    },\n    preprocess: {\n      response: {\n        name: 'stripNill',\n        path: './src/mutators.ts',\n      },\n    },\n    generateEachHttpStatus: true,\n    dateTimeOptions: { ... },\n    timeOptions: { ... },\n  },\n}\n```\n\nPreprocess example for stripping null/undefined before validation:\n\n```ts\nexport const stripNill = (object: unknown) =>\n  !!object && typeof object === 'object' && !Array.isArray(object)\n    ? Object.fromEntries(\n        Object.entries(object).filter(\n          ([_, value]) => value !== null && value !== undefined,\n        ),\n      )\n    : object;\n```\n\n## Runtime Validation with Fetch Client\n\n```ts\noutput: {\n  client: 'fetch',\n  override: {\n    fetch: {\n      runtimeValidation: true,  // Validate responses with Zod schemas\n    },\n  },\n}\n```\n"},"files":{".claude-plugin/marketplace.json":"{\n  \"name\": \"orval\",\n  \"description\": \"Orval's official plugin for Claude Code\",\n  \"plugins\": {\n    \"orval\": {\n      \"name\": \"orval\",\n      \"source\": \"./skills/orval\",\n      \"description\": \"Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, and MCP servers from OpenAPI specs\"\n    }\n  }\n}\n","AGENTS.md":"<!--VITE PLUS START-->\n\n# Using Vite+, the Unified Toolchain for the Web\n\nThis project is using Vite+, a unified toolchain built on top of Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, and Vite Task. Vite+ wraps runtime management, package management, and frontend tooling in a single global CLI called `vp`. Vite+ is distinct from Vite, and it invokes Vite through `vp dev` and `vp build`. Run `vp help` to print a list of commands and `vp <command> --help` for information about a specific command.\n\nDocs are local at `node_modules/vite-plus/docs` or online at https://viteplus.dev/guide/.\n\n## Built-in Commands vs Scripts\n\n`vp <name>` runs a built-in command. `vp run <name>` runs a `package.json` script or a `vite.config.ts` task. Scripts cannot overwrite built-ins, so `vp dev` and `vp run dev` may do different things. Check `package.json` and `vite.config.ts` first, and run `vp run <name>` when the project defines a script or task with that name.\n\n## Tool Versions\n\nRun `vp toolchain` to show versions and relationships in the active Vite+\nrelease. Add a tool name to select part of the graph. For example, run\n`vp toolchain vite`. Use `--global` to ignore the local `vite-plus` package. Use\n`vp why <package>` to show the package-manager dependency graph.\n\n## Review Checklist\n\n- [ ] Run `vp install` after pulling remote changes and before getting started.\n- [ ] Run `vp check` and `vp test` to format, lint, type check and test changes.\n- [ ] Check if there are `vite.config.ts` tasks or `package.json` scripts necessary for validation, run via `vp run <script>`.\n- [ ] If setup, runtime, or package-manager behavior looks wrong, run `vp env doctor` and include its output when asking for help.\n\n<!--VITE PLUS END-->\n","packages/angular/README.md":"# `@orval/angular`\n\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n![orval - Restful Client Generator](../../logo/orval-logo-horizontal.svg?raw=true)\n\nAngular generator support for [Orval](https://orval.dev).\n\nThis package powers Orval's Angular output and is responsible for generating:\n\n- injectable Angular `HttpClient` service classes\n- signal-first Angular `httpResource` helpers\n- mixed `both` mode output with service classes plus sibling `*.resource.ts`\n  files\n- Angular-specific response typing, request options, runtime validation, and\n  helper utilities\n\nIn most application projects you configure Angular output through the main\n`orval` package. This package exists so the Angular generator can be versioned,\ntested, and consumed as a standalone builder inside the Orval monorepo.\n\nVisit [orval.dev](https://orval.dev) for guides, API docs, and examples.\n\n## What it generates\n\n`@orval/angular` supports three Angular retrieval modes through\n`override.angular.retrievalClient` (or the legacy `override.angular.client`\nalias):\n\n| Mode           | Generated output                                               | Best for                                                    |\n| -------------- | -------------------------------------------------------------- | ----------------------------------------------------------- |\n| `httpClient`   | Retrievals stay on injectable Angular service classes          | Conventional service-based Angular APIs                     |\n| `httpResource` | Signal-first resource helpers for retrieval-style operations   | Angular apps using signals for read flows                   |\n| `both`         | Service classes plus sibling `*.resource.ts` retrieval helpers | Projects that want signal-first reads and imperative writes |\n\nMutation-style operations continue to use generated `HttpClient` service\nmethods by default unless a per-operation override changes classification.\n\nIf `override.angular.retrievalClient` is omitted, Angular generation defaults to\n`httpClient` mode.\n\n## Example configuration\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: {\n      target: './petstore.yaml',\n    },\n    output: {\n      client: 'angular',\n      target: 'src/api/petstore.ts',\n      schemas: 'src/api/model',\n      mode: 'tags-split',\n      override: {\n        angular: {\n          retrievalClient: 'httpResource',\n          runtimeValidation: true,\n        },\n      },\n    },\n  },\n});\n```\n\nFor end-user docs and richer examples, see:\n\n- [Angular guide](https://orval.dev/guides/angular)\n- [Angular sample app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n\n## Angular-specific features\n\nThis package includes support for:\n\n- `HttpClient` observe overload generation\n- signal-based parameter generation for `httpResource`\n- multi-content-type response branching via generated `Accept` helpers\n- Zod-backed runtime validation for Angular output\n- resource option helpers such as `defaultValue`, `debugName`, `injector`, and\n  `equal`\n- generated `ClientResult` / `ResourceResult` aliases\n- `ResourceState<T>` and `toResourceState()` helpers for resource integration\n\n## Development\n\nUseful package-local scripts:\n\n- `pnpm --filter @orval/angular build`\n- `pnpm --filter @orval/angular test`\n- `pnpm --filter @orval/angular lint`\n- `pnpm --filter @orval/angular typecheck`\n\n## More samples\n\nYou can explore additional Orval samples here:\n\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/axios/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/core/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/effect/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# @orval/effect\n\nGenerates [Effect Schema](https://effect.website/docs/schema/introduction/) validators from OpenAPI specifications.\n\n## Install\n\n```sh\nnpm install -D @orval/effect\nnpm install effect\n```\n\n`effect` is a peer dependency (`>=3.10`, Effect 4 included). `@orval/effect` does not bundle it, and generates Effect 3 or Effect 4 syntax to match the installed version.\n\n## Usage\n\nSet `client: 'effect'` in your `orval.config`:\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'effect',\n      target: './src/api/schemas',\n      mode: 'single',\n    },\n  },\n});\n```\n\n## Generated output\n\n```ts\nimport { Schema as S } from 'effect';\n\nexport const ListPetsQueryParams = S.Struct({\n  limit: S.optional(S.String).annotations({\n    description: 'How many items to return at one time (max 100)',\n  }),\n});\n```\n\nSee the [Effect guide](https://orval.dev/guides/effect) and the [`swr-with-effect` sample](https://github.com/orval-labs/orval/tree/master/samples/swr-with-effect) for more.\n\n## Why Effect alongside Zod?\n\n`@orval/effect` mirrors `@orval/zod`'s output shape, but Effect Schemas bring capabilities Zod can't:\n\n- **Encoded vs decoded type duality** — `Schema.Type<S>` (runtime) and `Schema.Encoded<S>` (wire) are distinct; `Schema.encode` round-trips back to the wire shape.\n- **Branded types as a generator option** — `override.effect.useBrandedTypes: true` turns named schemas into Effect brands for nominal-typed IDs without hand-writing `.brand<...>()`.\n- **First-class annotations** — OpenAPI `description`, `title`, `examples` flow into `S.annotations(...)` and stay queryable at the AST level.\n- **AST, not method chains** — schemas are introspectable artifacts, composable structurally by downstream tooling.\n- **Effect runtime integration** — decoded results pipe straight into Effect's typed-error / retry / concurrency primitives.\n\n## Configuration\n\nOptions are read from `override.effect.*`:\n\n- `strict` — fail on extra fields in object schemas\n- `generate` — fine-grained control over which schemas (params/body/response) are emitted\n- `useBrandedTypes` — map named schemas to branded types\n- `generateEachHttpStatus` — emit a schema per response status code\n","packages/fetch/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [nx fastify react](https://github.com/orval-labs/orval/tree/master/samples/nx-fastify-react)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/hono/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/mcp/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### How to use the generated mcp server\n\nAdd a setting to the mcp client to launch the generated `server.ts`.\nFor example, like this:\n\n```\n\"pet-store-server\": {\n  \"command\": \"docker\",\n  \"args\": [\n    \"run\",\n    \"-i\",\n    \"--rm\",\n    \"pet-store-mcp\",\n    \"bash\",\n    \"-c\",\n    \"ts-node\",\n    \"src/gen/server.ts\"\n  ],\n  \"disabled\": false,\n  \"alwaysAllow\": []\n}\n```\n\nHere, `src/gen/server.ts` is started using `Docker`.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/mock/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restful Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/orval/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/orval-labs/orval/master/logo/orval-logo-horizontal.svg\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [pinia colada](https://github.com/orval-labs/orval/tree/master/samples/pinia-colada)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/query/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/solid-start/README.md":"# @orval/solid-start\n\nSolidStart client for Orval - generates type-safe API client code using SolidStart primitives.\n\n## Features\n\n- ✅ Generates SolidStart `query()` for GET requests\n- ✅ Generates SolidStart `action()` for mutations (POST, PUT, PATCH, DELETE)\n- ✅ Type-safe API calls\n- ✅ Full TypeScript support\n- ✅ Works with SolidStart's server-side execution model\n- ✅ Uses native Fetch API by default\n- ✅ Supports custom mutators with Fetch API signature\n\n## Installation\n\n```bash\nnpm install @orval/solid-start\n# or\nbun add @orval/solid-start\n# or\npnpm add @orval/solid-start\n```\n\n## Usage\n\nIn your Orval configuration file:\n\n```typescript\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    output: {\n      target: './src/api/endpoints.ts',\n      schemas: './src/api/model',\n      client: 'solid-start',\n    },\n    input: {\n      target: './petstore.yaml',\n    },\n  },\n});\n```\n\n## Generated Code\n\nFor GET requests, Orval generates SolidStart queries:\n\n```typescript\nexport const PetstoreApi = {\n  getPets: query(async (limit?: number) => {\n    const response = await fetch(`/api/pets?limit=${limit}`, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json() as Promise<Pet[]>;\n  }, 'getPets'),\n};\n```\n\nFor mutations (POST, PUT, PATCH, DELETE), Orval generates SolidStart actions:\n\n```typescript\nexport const PetstoreApi = {\n  createPet: action(async (pet: Pet) => {\n    const response = await fetch(`/api/pets`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(pet),\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json() as Promise<Pet>;\n  }, 'createPet'),\n};\n```\n\n## Using in Your SolidStart App\n\n```typescript\nimport { PetstoreApi } from './api/endpoints';\n\n// In a component\nfunction Pets() {\n  const pets = createAsync(() => PetstoreApi.getPets(10));\n\n  return (\n    <div>\n      <For each={pets()}>\n        {(pet) => <div>{pet.name}</div>}\n      </For>\n    </div>\n  );\n}\n\n// For mutations\nfunction CreatePet() {\n  const createPet = useAction(PetstoreApi.createPet);\n\n  const handleSubmit = async (formData: FormData) => {\n    await createPet({ name: formData.get('name') as string });\n  };\n\n  return <form action={handleSubmit}>...</form>;\n}\n```\n\n## Comparison with solid-query\n\n- **@orval/solid-start**: Uses native SolidStart primitives (`query`, `action`) for server-side data fetching\n- **@orval/solid-query**: Uses TanStack Solid Query (`createQuery`, `createMutation`) for client-side data management\n\nChoose `solid-start` when you want to leverage SolidStart's built-in server functions and caching.\nChoose `solid-query` when you need advanced client-side query management features like automatic refetching, optimistic updates, etc.\n","packages/swr/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","packages/zod/README.md":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","skills/README.md":"# Orval AI Agent Skills\n\nOfficial AI agent skill for generating type-safe API clients, hooks, schemas, mocks, and server handlers from OpenAPI specs using [Orval](https://orval.dev).\n\nSkills are automatically discovered and used by the agent based on context — they don't appear in slash-command menus.\n\n## Installation\n\n### Claude Code\n\n```bash\n/plugin marketplace add orval-labs/orval\n```\n\n### Cursor\n\nAdd a remote GitHub rule pointing to this repository.\n\n### Any agent (skills.sh)\n\n```bash\nnpx skills add orval-labs/orval\n```\n\n## What's Included\n\nThe `orval` skill covers:\n\n- All clients: React/Vue/Svelte/Solid/Angular Query, SWR, Fetch, Axios, Hono, MCP\n- Zod schema generation and runtime validation\n- MSW mock generation with test setup patterns\n- Custom HTTP mutators and authentication patterns\n- Hono server handlers with response validation\n- NDJSON streaming, programmatic API, and advanced configuration\n\n## Structure\n\n```\nskills/orval/\n├── SKILL.md               # Core skill (always loaded)\n├── tanstack-query.md      # React/Vue/Svelte/Solid Query, SWR\n├── angular.md             # Angular Query and HttpClient\n├── solid-start.md         # SolidStart query/action primitives\n├── hono.md                # Hono server handlers\n├── custom-http-clients.md # Custom mutators, auth patterns\n├── zod-validation.md      # Zod schema generation\n├── mocking-msw.md         # MSW mocks and test setup\n├── advanced-config.md     # Type generation, overrides, enums\n└── tooling-workflow.md    # MCP, NDJSON, hooks, programmatic API\n```\n\nReference files are loaded on demand when the user's question matches the topic.\n","skills/orval/SKILL.md":"---\nname: orval\ndescription: Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, MCP servers, and SolidStart actions from OpenAPI specs using Orval. Covers all clients (React/Vue/Svelte/Solid/Angular Query, Fetch, Axios), custom HTTP mutators, authentication patterns, NDJSON streaming, programmatic API, and advanced configuration.\n---\n\n# Orval - OpenAPI to TypeScript Code Generator\n\nOrval generates type-safe TypeScript clients, hooks, schemas, mocks, and server handlers from OpenAPI v3/Swagger v2 specifications.\n\n## Quick Start\n\n### Installation\n\n```bash\nnpm install orval -D\n# or yarn add orval -D\n# or pnpm add orval -D\n# or bun add orval -D\n```\n\n### Minimal Configuration\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: {\n      target: './petstore.yaml',\n    },\n    output: {\n      target: './src/api/petstore.ts',\n      schemas: './src/api/model',\n      client: 'react-query',\n    },\n  },\n});\n```\n\n### Run\n\n```bash\nnpx orval\nnpx orval --config ./orval.config.ts\nnpx orval --project petstore\nnpx orval --watch\n```\n\n## Choosing Your Setup\n\n### Client Selection Guide\n\n| Use Case                 | Client            | httpClient         | Notes                                   |\n| ------------------------ | ----------------- | ------------------ | --------------------------------------- |\n| React with server state  | `react-query`     | `fetch` or `axios` | TanStack Query hooks                    |\n| Vue 3 with server state  | `vue-query`       | `fetch` or `axios` | TanStack Query for Vue                  |\n| Svelte with server state | `svelte-query`    | `fetch` or `axios` | TanStack Query for Svelte               |\n| SolidJS standalone app   | `solid-query`     | `fetch` or `axios` | TanStack Query for Solid                |\n| SolidStart full-stack    | `solid-start`     | native fetch       | Uses `query()`/`action()` primitives    |\n| Angular with signals     | `angular-query`   | `angular`          | Injectable functions, signal reactivity |\n| Angular traditional      | `angular`         | —                  | HttpClient services                     |\n| React with SWR           | `swr`             | `fetch` or `axios` | Vercel SWR hooks                        |\n| Lightweight / Edge       | `fetch`           | —                  | Zero dependencies, works everywhere     |\n| Node.js / existing Axios | `axios-functions` | —                  | Factory functions (default)             |\n| Axios with DI            | `axios`           | —                  | Injectable Axios instance               |\n| Validation only          | `zod`             | —                  | Zod schemas, no HTTP client             |\n| Backend API server       | `hono`            | —                  | Hono handlers with Zod validation       |\n| AI agent tools           | `mcp`             | —                  | Model Context Protocol servers          |\n\n### Mode Selection Guide\n\n- **`single`** — Everything in one file. Best for small APIs.\n- **`split`** — Separate files: `petstore.ts`, `petstore.schemas.ts`, `petstore.msw.ts`. Good for medium APIs.\n- **`tags`** — One file per OpenAPI tag + shared schemas. Organizes by domain.\n- **`tags-split`** — Folder per tag with split files. Best for large APIs. Recommended.\n\n### httpClient Option\n\nFor `react-query`, `vue-query`, `svelte-query`, and `swr` clients:\n\n```ts\noutput: {\n  client: 'react-query',\n  httpClient: 'fetch',  // 'fetch' (default) | 'axios'\n}\n```\n\nFor `angular-query`:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',  // Uses Angular HttpClient\n}\n```\n\n## Configuration Reference\n\n### Config Structure\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  [projectName]: {\n    input: InputOptions,\n    output: OutputOptions,\n    hooks: HooksOptions,\n  },\n});\n```\n\nMultiple projects can share the same config file with different input/output settings.\n\n### Input Options\n\n```ts\ninput: {\n  target: './spec.yaml',              // Path or URL to OpenAPI spec (required)\n  override: {\n    transformer: './transform.js',    // Transform spec before generation\n  },\n  filters: {\n    mode: 'include',                  // 'include' | 'exclude'\n    tags: ['pets', /health/],         // Filter by OpenAPI tags\n    schemas: ['Pet', /Error/],        // Filter by schema names\n  },\n  parserOptions: {\n    headers: [                        // Auth headers for remote spec URLs\n      {\n        domains: ['api.example.com'],\n        headers: {\n          Authorization: 'Bearer YOUR_TOKEN',\n          'X-API-Key': 'your-api-key',\n        },\n      },\n    ],\n  },\n}\n```\n\n### Output Options\n\n```ts\noutput: {\n  target: './src/api/endpoints.ts',     // Output path (required)\n  client: 'react-query',               // Client type (see table above)\n  httpClient: 'fetch',                  // 'fetch' (default) | 'axios' | 'angular'\n  mode: 'tags-split',                   // 'single' | 'split' | 'tags' | 'tags-split'\n  schemas: './src/api/model',           // Output path for model types\n  operationSchemas: './src/api/params', // Separate path for operation-derived types\n  workspace: 'src/',                    // Base folder for all files\n  fileExtension: '.ts',                 // Custom file extension\n  namingConvention: 'camelCase',        // File naming: camelCase | PascalCase | snake_case | kebab-case\n  indexFiles: true,                     // Generate index.ts barrel files\n  clean: true,                          // Clean output before generating\n  prettier: true,                       // Format with Prettier\n  biome: true,                          // Format with Biome\n  headers: true,                        // Generate header parameters\n  baseUrl: '/api/v2',                   // API base URL\n  // or from spec:\n  // baseUrl: { getBaseUrlFromSpecification: true, index: 0, variables: { environment: 'api.dev' } },\n  mocks: true,                          // Generate MSW + Faker mocks (boolean, object, or function)\n  docs: true,                           // Generate TypeDoc documentation\n  // docs: { configPath: './typedoc.config.mjs' },\n  allParamsOptional: true,              // Make all params optional (except path params)\n  urlEncodeParameters: true,            // URL-encode path/query parameters\n  optionsParamRequired: false,          // Make options parameter required\n  propertySortOrder: 'Specification',   // 'Alphabetical' | 'Specification'\n  tsconfig: './tsconfig.json',          // Custom tsconfig path\n  override: { ... },                    // Advanced overrides (see below)\n}\n```\n\n### Multiple API Specs\n\n```ts\nexport default defineConfig({\n  petstoreV1: {\n    input: { target: './specs/v1.yaml' },\n    output: { target: 'src/api/v1', client: 'react-query' },\n  },\n  petstoreV2: {\n    input: { target: './specs/v2.yaml' },\n    output: { target: 'src/api/v2', client: 'react-query' },\n  },\n});\n```\n\n### Filter Endpoints\n\n```ts\ninput: {\n  target: './spec.yaml',\n  filters: {\n    mode: 'include',\n    tags: ['pets'],\n  },\n}\n```\n\n## Detailed Guides\n\nWhen the user's question involves a specific topic below, read the corresponding file from this skill's directory.\n\n| Topic                | File                                             | Load when user asks about...                                                                                            |\n| -------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |\n| TanStack Query / SWR | [tanstack-query.md](tanstack-query.md)           | React Query, Vue Query, Svelte Query, Solid Query, SWR, query hooks, invalidation, infinite queries, suspense, prefetch |\n| Angular              | [angular.md](angular.md)                         | Angular Query, Angular HttpClient, signals, inject functions, Angular services, providedIn                              |\n| SolidStart           | [solid-start.md](solid-start.md)                 | SolidStart, @solidjs/router, query(), action(), createAsync, revalidate                                                 |\n| Custom HTTP / Auth   | [custom-http-clients.md](custom-http-clients.md) | Custom mutator, authentication, tokens, interceptors, custom fetch/axios, baseURL, hook-based mutator                   |\n| Zod Validation       | [zod-validation.md](zod-validation.md)           | Zod schemas, validation, runtime validation, coerce, strict, preprocess                                                 |\n| Mocking / MSW        | [mocking-msw.md](mocking-msw.md)                 | MSW mocks, testing, test setup, faker, Vitest, mock handlers, useExamples                                               |\n| Hono Server          | [hono.md](hono.md)                               | Hono handlers, zValidator, composite routes, context types, server-side generation                                      |\n| Advanced Config      | [advanced-config.md](advanced-config.md)         | Type generation, enums, per-operation overrides, FormData, JSDoc, params serializer, full example                       |\n| Tooling / Workflow   | [tooling-workflow.md](tooling-workflow.md)       | Programmatic API, transformers, hooks, NDJSON streaming, MCP, afterAllFilesWrite                                        |\n\n## OpenAPI Specification Best Practices\n\n1. **Use unique `operationId`** for every operation — Orval uses these for function and hook names\n2. **Define reusable schemas** in `components/schemas` — reduces duplication in generated types\n3. **Use tags** to group operations — works with `tags` and `tags-split` modes\n4. **Define response types** for all operations — enables full type safety\n5. **Mark required fields** — affects optional/required in generated TypeScript interfaces\n6. **Use `x-enumNames`** for numeric enums — generates readable const names\n7. **Provide `example` values** — used by mock generation when `useExamples: true`\n8. **Use `application/x-ndjson`** content type for streaming endpoints — enables typed NDJSON generation\n\n## CLI Reference\n\n```bash\norval                                    # Generate using auto-discovered config\norval --config ./api/orval.config.ts     # Specify config file\norval --project petstore                 # Run specific project(s)\norval --watch                            # Watch mode\norval --watch ./src                      # Watch specific directory\norval --clean                            # Clean generated files\norval --prettier                         # Format with Prettier\norval --biome                            # Format with Biome\norval --tsconfig ./src/tsconfig.json     # Custom tsconfig path\norval --mode split                       # Override output mode\norval --client react-query               # Override client\norval --mock                             # Override mock generation\norval --input ./spec.yaml --output ./api.ts  # Direct generation\n```\n\n## Resources\n\n- [Documentation](https://orval.dev)\n- [GitHub](https://github.com/orval-labs/orval)\n- [Sample Projects](https://github.com/orval-labs/orval/tree/master/samples)\n","skills/orval/advanced-config.md":"# Advanced Configuration\n\n## Type Generation Options\n\n```ts\noverride: {\n  // Enum generation\n  enumGenerationType: 'const',    // 'const' (default) | 'enum' | 'union'\n\n  // Type preferences\n  useTypeOverInterfaces: false,   // Use type instead of interface\n  useNamedParameters: false,      // Named params object vs positional args\n  useDates: false,                // Convert date/datetime to Date objects\n  useBigInt: false,               // Convert int64/uint64 to BigInt\n  useDeprecatedOperations: true,  // Include deprecated operations\n  useNullForOptional: false,      // Type optional as T | null\n  aliasCombinedTypes: false,      // Create intermediate type aliases for anyOf/oneOf/allOf\n  suppressReadonlyModifier: false, // Suppress readonly modifier\n\n  // Naming\n  components: {\n    schemas: { suffix: 'DTO' },\n    responses: { suffix: 'Response' },\n    parameters: { suffix: 'Params' },\n    requestBodies: { suffix: 'Bodies' },\n  },\n\n  // Custom operation names\n  operationName: (operation, route, verb) => `custom_${operation.operationId}`,\n\n  // Property key naming convention\n  namingConvention: {\n    enum: 'PascalCase',  // camelCase | PascalCase | snake_case | kebab-case\n  },\n\n  // File header\n  header: (info) => [\n    'Generated by Orval',\n    'Do not edit manually.',\n    ...(info.title ? [info.title] : []),\n  ],\n  // header: false,  // Disable header\n\n  // Service title (axios and angular clients only)\n  title: (title) => `${title}Api`,\n}\n```\n\n## Enum Extensions\n\nUse OpenAPI extensions for meaningful enum names and descriptions:\n\n```yaml\nmyEnum:\n  type: number\n  enum: [1, 2, 3]\n  x-enumNames: [Active, Inactive, Pending]\n  x-enumDescriptions:\n    - User is active\n    - User is inactive\n    - User is pending approval\n```\n\nGenerated output:\n\n```ts\nexport const MyEnum = {\n  /** User is active */\n  Active: 1,\n  /** User is inactive */\n  Inactive: 2,\n  /** User is pending approval */\n  Pending: 3,\n} as const;\n\nexport type MyEnum = (typeof MyEnum)[keyof typeof MyEnum];\n```\n\nSupported extension variants: `x-enumNames`, `x-enumnames`, `x-enum-varnames` for names; `x-enumDescriptions`, `x-enumdescriptions`, `x-enum-descriptions` for descriptions.\n\nNote: Enum descriptions only work with `enumGenerationType: 'const'` (default).\n\n## Per-Operation Overrides\n\n```ts\noverride: {\n  operations: {\n    listPets: {\n      mutator: 'src/response-type.js',\n      query: {\n        useInfinite: true,\n        useInfiniteQueryParam: 'cursor',\n        useSuspenseQuery: true,\n        options: { staleTime: 60000 },\n      },\n      mock: {\n        data: () => ({ id: 1, name: 'Buddy' }),\n      },\n    },\n  },\n}\n```\n\n## Per-Tag Overrides\n\nSame options as per-operation but scoped by OpenAPI tag:\n\n```ts\noverride: {\n  tags: {\n    pets: {\n      mutator: {\n        path: '../mutators/use-custom-instance.ts',\n        name: 'useCustomInstance',\n      },\n      query: {\n        useInfinite: true,\n      },\n    },\n  },\n}\n```\n\n## FormData Handling\n\nDefault FormData generation:\n\n```ts\noverride: {\n  formData: true,  // Auto-generate FormData serialization\n}\n```\n\nCustom FormData mutator:\n\n```ts\noverride: {\n  formData: {\n    path: './custom-form-data.ts',\n    name: 'customFormData',\n  },\n}\n```\n\n```ts\n// custom-form-data.ts\nexport const customFormData = <Body>(body: Body): FormData => {\n  const formData = new FormData();\n  Object.entries(body).forEach(([key, value]) => {\n    formData.append(key, value);\n  });\n  return formData;\n};\n```\n\nArray handling options for FormData:\n\n```ts\noverride: {\n  formData: {\n    arrayHandling: 'serialize',  // 'serialize' | 'serialize-with-brackets' | 'explode'\n  },\n}\n```\n\n- `serialize`: `formData.append('items', JSON.stringify(value))`\n- `serialize-with-brackets`: `formData.append('items[]', JSON.stringify(value))`\n- `explode`: Expands nested objects with indexed keys\n\nURL-encoded form data:\n\n```ts\noverride: {\n  formUrlEncoded: {\n    path: './custom-form-url-encoded.ts',\n    name: 'customFormUrlEncoded',\n  },\n}\n```\n\n## Content Type Filtering\n\n```ts\noverride: {\n  contentType: {\n    include: ['application/json'],\n    exclude: ['application/xml'],\n  },\n}\n```\n\n## JSDoc Customization\n\n```ts\noverride: {\n  jsDoc: {\n    filter: (schema) => {\n      const allowlist = [\n        'type', 'format', 'maxLength', 'minLength',\n        'description', 'minimum', 'maximum', 'pattern',\n        'nullable', 'enum',\n      ];\n      return Object.entries(schema || {})\n        .filter(([key]) => allowlist.includes(key))\n        .map(([key, value]) => ({ key, value }))\n        .sort((a, b) => a.key.length - b.key.length);\n    },\n  },\n}\n```\n\n## Request Options\n\nConfigure or remove the request options parameter:\n\n```ts\noverride: {\n  requestOptions: false,  // Remove request options entirely\n  // or configure headers:\n  requestOptions: {\n    headers: {\n      'X-Custom-Header': '${dynamicValue}',\n    },\n  },\n}\n```\n\n## Params Serializer\n\nCustom parameter serialization (Axios/Angular only):\n\n```ts\noverride: {\n  paramsSerializer: {\n    path: './custom-params-serializer.ts',\n    name: 'customParamsSerializerFn',\n  },\n  // or use qs library:\n  paramsSerializerOptions: {\n    qs: { arrayFormat: 'repeat' },\n  },\n}\n```\n\n## Custom Mutation Options\n\n```ts\noverride: {\n  query: {\n    mutationOptions: {\n      path: './custom-mutation.ts',\n      name: 'useCustomMutation',\n    },\n  },\n}\n```\n\n## Full Working Example\n\n```ts\nimport { faker } from '@faker-js/faker';\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    output: {\n      mode: 'split',\n      target: 'src/petstore.ts',\n      schemas: 'src/model',\n      client: 'react-query',\n      mocks: true,\n      override: {\n        operations: {\n          listPets: {\n            mutator: 'src/response-type.js',\n            mock: {\n              properties: () => ({\n                id: () => faker.number.int({ min: 1, max: 99999 }),\n              }),\n            },\n          },\n          showPetById: {\n            mock: {\n              data: () => ({\n                id: faker.number.int({ min: 1, max: 99 }),\n                name: faker.person.firstName(),\n                tag: faker.helpers.arrayElement([\n                  faker.word.sample(),\n                  undefined,\n                ]),\n              }),\n            },\n          },\n        },\n        mock: {\n          properties: {\n            '/tag|name/': () => faker.person.lastName(),\n          },\n          delay: 500,\n        },\n      },\n      allParamsOptional: true,\n      urlEncodeParameters: true,\n    },\n    input: {\n      target: './petstore.yaml',\n      override: {\n        transformer: 'src/add-version.js',\n      },\n    },\n    hooks: {\n      afterAllFilesWrite: 'prettier --write',\n    },\n  },\n});\n```\n","skills/orval/angular.md":"# Angular Clients\n\n## Angular Query\n\nSignal-based reactivity with Angular's dependency injection:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',\n  mode: 'tags-split',\n  override: {\n    query: {\n      useInvalidate: true,\n      signal: true,\n      runtimeValidation: true,    // Pipe responses through Zod validation\n      mutationInvalidates: [\n        {\n          onMutations: ['createPets'],\n          invalidates: ['listPets'],\n        },\n        {\n          onMutations: ['deletePet', 'updatePet'],\n          invalidates: [\n            'listPets',\n            { query: 'showPetById', params: ['petId'] },\n          ],\n        },\n      ],\n    },\n  },\n}\n```\n\nGenerated injectable functions with signal reactivity:\n\n```ts\n// Inject query — re-executes when signal changes\nexport function injectShowPetById<TData = Pet, TError = unknown>(\n  petId: string | (() => string),   // Accepts signal getters\n  options?: { query?: Partial<CreateQueryOptions<Pet, TError, TData>> },\n): CreateQueryResult<TData, TError> {\n  const http = inject(HttpClient);\n  const query = injectQuery(() => {\n    const _petId = typeof petId === 'function' ? petId() : petId;\n    return getShowPetByIdQueryOptions(http, _petId, options);\n  });\n  return query;\n}\n\n// Inject mutation\nexport const injectCreatePets = <TError = Error, TContext = unknown>(\n  options?: { mutation?: CreateMutationOptions<...>; fetch?: RequestInit },\n): CreateMutationResult<...> => {\n  const http = inject(HttpClient);\n  const queryClient = inject(QueryClient);\n  return injectMutation(() => getCreatePetsMutationOptions(http, queryClient, options));\n};\n```\n\nUsage in Angular components:\n\n```ts\n@Component({...})\nexport class PetDetailComponent {\n  petId = signal('1');\n\n  // Query re-executes when petId() changes\n  pet = injectShowPetById(() => this.petId());\n\n  // Dynamic enabled/disabled\n  conditionalPet = injectShowPetById(\n    () => this.petId(),\n    () => ({ query: { enabled: this.isEnabled() } }),\n  );\n\n  // Mutation with auto-invalidation\n  deletePet = injectDeletePet({\n    mutation: {\n      onSuccess: () => this.snackbar.open('Pet deleted!'),\n    },\n  });\n\n  // Skip auto-invalidation for custom control\n  customDelete = injectDeletePet({\n    mutation: {\n      onSuccess: () => {\n        setTimeout(() => {\n          this.queryClient.invalidateQueries({ queryKey: getListPetsQueryKey() });\n        }, 700);\n      },\n    },\n    skipInvalidation: true,\n  });\n}\n```\n\n### Zod Runtime Validation\n\nWhen `runtimeValidation: true` and `schemas.type: 'zod'`:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',\n  schemas: { path: 'src/model', type: 'zod' },\n  override: {\n    query: { runtimeValidation: true },\n  },\n}\n```\n\nGenerated code pipes through Zod:\n\n```ts\nconst request$ = http\n  .get<Pets>(url, { params: httpParams })\n  .pipe(map((data) => Pets.parse(data)));\n```\n\n## Angular (HttpClient)\n\nTraditional Angular service generation:\n\n```ts\noutput: {\n  client: 'angular',\n  mode: 'tags-split',\n  mocks: true,\n  override: {\n    angular: {\n      provideIn: 'root',  // 'root' | 'any' | '' | false\n    },\n  },\n}\n```\n\nSetting backend URL with interceptor:\n\n```ts\n@Injectable()\nexport class ApiInterceptor implements HttpInterceptor {\n  intercept(req: HttpRequest<any>, next: HttpHandler) {\n    const apiReq = req.clone({\n      url: `https://api.example.com${req.url}`,\n    });\n    return next.handle(apiReq);\n  }\n}\n```\n\n## Angular Custom Mutator with HttpClient\n\n```ts\n// custom-client-with-error.ts\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nexport interface ExtendedServerErrorResponse<Error> extends HttpErrorResponse {\n  error: Error | any | null;\n}\nexport type ErrorType<Error> = ExtendedServerErrorResponse<Error>;\n\nexport const responseType = <Result>(\n  {\n    url,\n    method,\n    params,\n    data,\n    signal,\n    responseType,\n  }: {\n    url: string;\n    method: string;\n    params?: any;\n    data?: any;\n    headers?: any;\n    signal?: AbortSignal;\n    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n  },\n  http?: HttpClient,\n): Promise<Result> => {\n  if (!http) throw new Error('HttpClient is required.');\n  return lastValueFrom(\n    http.request<Result>(method, url, {\n      params,\n      body: data,\n      responseType: (responseType ?? 'json') as 'json',\n    }),\n  );\n};\n\nexport default responseType;\n```\n","skills/orval/custom-http-clients.md":"# Custom HTTP Client (Mutator)\n\nReplace the default HTTP implementation with a custom mutator.\n\n## Basic Axios Mutator\n\n```ts\n// orval.config.ts\noutput: {\n  override: {\n    mutator: {\n      path: './api/mutator/custom-instance.ts',\n      name: 'customInstance',\n    },\n  },\n}\n```\n\n```ts\n// custom-instance.ts\nimport Axios, { AxiosRequestConfig, AxiosError } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({ baseURL: '' });\n\nexport const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {\n  return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n};\n\nexport type ErrorType<Error> = AxiosError<Error>;\nexport type BodyType<BodyData> = BodyData;\n```\n\n## Axios with Interceptors (Auth, Error Handling)\n\n```ts\n// custom-instance.ts\nimport Axios, { AxiosRequestConfig, AxiosError } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({\n  baseURL: process.env.API_URL,\n});\n\n// Request interceptor — token injection\nAXIOS_INSTANCE.interceptors.request.use(\n  (config) => {\n    const token = localStorage.getItem('token');\n    if (token) config.headers.Authorization = `Bearer ${token}`;\n    return config;\n  },\n  (error) => Promise.reject(error),\n);\n\n// Response interceptor — error handling\nAXIOS_INSTANCE.interceptors.response.use(\n  (response) => response,\n  (error) => {\n    if (error.response?.status === 401) {\n      // Handle unauthorized\n    }\n    return Promise.reject(error);\n  },\n);\n\nexport const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {\n  return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n};\n\nexport type ErrorType<Error> = AxiosError<Error>;\nexport type BodyType<BodyData> = BodyData;\n```\n\n## React Context Auth with Interceptors\n\n```tsx\n// auth.context.tsx\nimport { useEffect, useState, createContext, useContext } from 'react';\nimport { AXIOS_INSTANCE } from './api/mutator/custom-instance';\n\nconst AuthProvider = ({ children, initialState = null }) => {\n  const [token, setToken] = useState(initialState);\n\n  useEffect(() => {\n    const interceptorId = AXIOS_INSTANCE.interceptors.request.use((config) => {\n      if (config.headers && token) {\n        config.headers.set('Authorization', `Bearer ${token}`);\n      }\n      return config;\n    });\n\n    return () => {\n      AXIOS_INSTANCE.interceptors.request.eject(interceptorId);\n    };\n  }, [token]);\n\n  return (\n    <AuthContext.Provider value={token}>\n      <AuthDispatchContext.Provider value={setToken}>\n        {children}\n      </AuthDispatchContext.Provider>\n    </AuthContext.Provider>\n  );\n};\n```\n\n## Hook-Based Mutator (Axios)\n\nAllows using React hooks inside the mutator (e.g., for auth state, callbacks):\n\n```ts\n// orval.config.ts\noutput: {\n  override: {\n    mutator: {\n      path: './use-custom-instance.ts',\n      name: 'useCustomInstance',\n    },\n  },\n}\n```\n\n```ts\n// use-custom-instance.ts\nimport Axios, { type AxiosRequestConfig } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({ baseURL: '' });\n\nexport const useCustomInstance = <T>(): ((\n  config: AxiosRequestConfig,\n) => Promise<T>) => {\n  // Can use React hooks here (useAuth, useCallback, etc.)\n  return (config: AxiosRequestConfig) => {\n    return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n  };\n};\n\nexport default useCustomInstance;\n```\n\n## Hook-Based Mutator (Fetch with useCallback)\n\n```ts\n// use-custom-fetch.ts\nimport { useCallback, useState } from 'react';\n\nexport function useGetBaseUrl() {\n  const [baseUrl] = useState('');\n  return baseUrl;\n}\n\nexport function useCustomFetch() {\n  const baseUrl = useGetBaseUrl();\n  return useCallback(\n    async <T>(url: string, options?: RequestInit): Promise<T> => {\n      const headers = new Headers(options?.headers);\n      const response = await fetch(`${baseUrl}${url}`, {\n        ...options,\n        headers,\n      });\n      if (!response.ok) throw new Error('Network response was not ok');\n      return response.json();\n    },\n    [],\n  );\n}\n```\n\n## Fetch with Content-Type Detection\n\nHandle PDF, blob, text, XML responses (not just JSON):\n\n```ts\n// custom-fetch.ts\nconst getBody = <T>(c: Response | Request): Promise<T> => {\n  const contentType = c.headers.get('content-type');\n  if (contentType && contentType.includes('application/json')) {\n    return c.json();\n  }\n  if (contentType && contentType.includes('application/pdf')) {\n    return c.blob() as Promise<T>;\n  }\n  return c.text() as Promise<T>;\n};\n\nconst getUrl = (contextUrl: string): string => {\n  const url = new URL(contextUrl);\n  const baseUrl =\n    process.env.NODE_ENV === 'production'\n      ? 'https://api.production.com'\n      : 'http://localhost:3000';\n  return new URL(`${baseUrl}${url.pathname}${url.search}`).toString();\n};\n\nexport const customFetch = async <T>(\n  url: string,\n  options: RequestInit,\n): Promise<T> => {\n  const requestUrl = getUrl(url);\n  const requestHeaders = {\n    ...options.headers,\n    Authorization: 'Bearer my-token',\n  };\n  const response = await fetch(requestUrl, {\n    ...options,\n    headers: requestHeaders,\n  });\n  const data = await getBody<T>(response);\n  return { status: response.status, data, headers: response.headers } as T;\n};\n\nexport default customFetch;\n```\n\n## Fetch Client Config\n\nNative Fetch API — no dependencies, works in browsers, Node.js, Cloudflare Workers, Vercel Edge, Deno.\n\n```ts\noutput: {\n  client: 'fetch',\n  baseUrl: 'http://localhost:3000',\n  override: {\n    fetch: {\n      includeHttpResponseReturnType: false,  // Return data directly instead of { data, status }\n      forceSuccessResponse: true,            // Throw on error responses\n      runtimeValidation: true,               // Validate responses with Zod\n      jsonReviver: {                         // Custom JSON reviver (e.g. for dates)\n        path: './reviver.ts',\n        name: 'dateReviver',\n      },\n    },\n  },\n}\n```\n\n## Environment-Based URL Switching\n\nUsing base URL from spec with variables:\n\n```ts\noutput: {\n  baseUrl: {\n    getBaseUrlFromSpecification: true,\n    variables: {\n      environment: process.env.NODE_ENV === 'production' ? 'api.prod' : 'api.dev',\n    },\n  },\n}\n```\n\nOr use a `getUrl` function in a custom fetch mutator (see the `getUrl` pattern in \"Fetch with Content-Type Detection\" above).\n","skills/orval/hono.md":"# Hono Server Client\n\nGenerate type-safe Hono server handlers with built-in Zod validation from OpenAPI specs.\n\n## Quick Start\n\n```bash\nnpm install hono @hono/zod-validator zod\n```\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'src/handlers',\n        },\n      },\n    },\n  },\n});\n```\n\n## Configuration Options\n\n```ts\noutput: {\n  client: 'hono',\n  override: {\n    hono: {\n      handlers: 'src/handlers',             // Directory for per-operation handler files\n      compositeRoute: 'src/routes.ts',      // Combined routes file (used with tags-split)\n      validator: true,                       // true (default) | 'hono' | false\n      validatorOutputPath: 'src/validator.ts', // Custom validator output path\n    },\n  },\n}\n```\n\n| Option                | Type                | Default         | Description                                                                                                                                              |\n| --------------------- | ------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `handlers`            | `string`            | —               | Directory for per-operation handler files. One file per operation.                                                                                       |\n| `compositeRoute`      | `string`            | `''` (disabled) | Path for combined routes file. Used with `tags-split` mode.                                                                                              |\n| `validator`           | `boolean \\| 'hono'` | `true`          | `true` = orval's custom zValidator with response validation; `'hono'` = `@hono/zod-validator` directly (no response validation); `false` = no validators |\n| `validatorOutputPath` | `string`            | `''` (auto)     | Custom output path for the generated validator file                                                                                                      |\n\n## Generated File Structure\n\n### `split` mode with `handlers`\n\n```\nsrc/\n├── handlers/\n│   ├── listPets.ts           # Per-operation handler (NOT overwritten if exists)\n│   ├── createPets.ts\n│   ├── showPetById.ts\n│   └── updatePets.ts\n├── petstore.ts               # Hono app with routes (regenerated)\n├── petstore.context.ts       # Type-safe context types (regenerated)\n├── petstore.schemas.ts       # TypeScript types\n├── petstore.validator.ts     # Custom zValidator wrapper (regenerated)\n└── petstore.zod.ts           # Zod schemas (regenerated)\n```\n\n### `tags-split` with `compositeRoute`\n\n```\nsrc/\n├── endpoints/\n│   └── pets/\n│       ├── pets.context.ts\n│       ├── pets.handlers.ts  # All handlers for tag in one file\n│       └── pets.zod.ts\n├── schemas/\n│   ├── pet.ts\n│   ├── pets.ts\n│   └── index.ts\n├── routes.ts                 # Combined routes file\n└── endpoints/validator.ts    # Shared validator\n```\n\n### `tags` mode\n\n```\nsrc/\n├── handlers/\n│   ├── listPets.ts\n│   └── createPets.ts\n├── pets.ts                   # Route file per tag\n├── pets.context.ts\n├── pets.zod.ts\n└── pets.validator.ts\n```\n\n## Generated Route File\n\n```ts\nimport { Hono } from 'hono';\nimport { listPetsHandlers } from './handlers/listPets';\nimport { createPetsHandlers } from './handlers/createPets';\nimport { showPetByIdHandlers } from './handlers/showPetById';\n\nconst app = new Hono();\n\napp.get('/pets', ...listPetsHandlers);\napp.post('/pets', ...createPetsHandlers);\napp.get('/pets/:petId', ...showPetByIdHandlers);\n\nexport default app;\n```\n\nOpenAPI path params `{petId}` are converted to Hono format `:petId`.\n\n## Handler Templates\n\n### Query parameters\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { ListPetsContext } from '../petstore.context';\nimport { listPetsQueryParams, listPetsResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const listPetsHandlers = factory.createHandlers(\n  zValidator('query', listPetsQueryParams),\n  zValidator('response', listPetsResponse),\n  async (c: ListPetsContext) => {\n    return c.json([{ id: 1, name: 'Buddy' }]);\n  },\n);\n```\n\n### Path parameters\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { ShowPetByIdContext } from '../petstore.context';\nimport { showPetByIdParams, showPetByIdResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const showPetByIdHandlers = factory.createHandlers(\n  zValidator('param', showPetByIdParams),\n  zValidator('response', showPetByIdResponse),\n  async (c: ShowPetByIdContext) => {\n    const { petId } = c.req.valid('param');\n    return c.json({ id: Number(petId), name: 'Buddy' });\n  },\n);\n```\n\n### JSON body\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { CreatePetsContext } from '../petstore.context';\nimport { createPetsBody, createPetsResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const createPetsHandlers = factory.createHandlers(\n  zValidator('json', createPetsBody),\n  zValidator('response', createPetsResponse),\n  async (c: CreatePetsContext) => {\n    const body = c.req.valid('json');\n    return c.json({ id: 1, ...body });\n  },\n);\n```\n\n### Validator order in generated handlers\n\n1. `zValidator('header', ...)` — if request headers exist\n2. `zValidator('param', ...)` — if path parameters exist\n3. `zValidator('query', ...)` — if query parameters exist\n4. `zValidator('json', ...)` — if request body exists\n5. `zValidator('response', ...)` — if 200 JSON response exists AND `validator !== 'hono'`\n\n## Context Types\n\nGenerated context types encode the validated input shape for type-safe access:\n\n```ts\nimport type { Context, Env } from 'hono';\n\nexport type ListPetsContext<E extends Env = any> = Context<\n  E,\n  '/pets',\n  { in: { query: ListPetsParams }; out: { query: ListPetsParams } }\n>;\n\nexport type ShowPetByIdContext<E extends Env = any> = Context<\n  E,\n  '/pets/:petId',\n  {\n    in: { param: { petId: string } };\n    out: { param: { petId: string } };\n  }\n>;\n\nexport type CreatePetsContext<E extends Env = any> = Context<\n  E,\n  '/pets',\n  { in: { json: CreatePetsBodyItem[] }; out: { json: CreatePetsBodyItem[] } }\n>;\n```\n\nWhen an operation has no params/query/body, the third generic is omitted.\n\nA `NonReadonly<T>` utility type is emitted only when schema types contain readonly properties.\n\n## zValidator (Response Validation)\n\nOrval's custom `zValidator` extends `@hono/zod-validator` with a `response` target:\n\n```ts\nzValidator('response', responseSchema);\n```\n\nResponse validation behavior (when `validator: true`):\n\n- Runs as post-middleware (calls `await next()` first)\n- Only validates HTTP 200 responses with `Content-Type: application/json`\n- Uses `safeParseAsync` — supports Zod v3 and v4\n- On parse failure: returns HTTP 400 with `{ success, data, error }`\n- On malformed JSON: returns HTTP 400 with `'Malformed JSON in response'`\n- Supports optional `hook` callback for custom validation handling\n\nSee the `validator` option in Configuration Options above for the three modes (`true`, `'hono'`, `false`).\n\n## Composite Routes\n\nFor `tags-split` mode with multiple tag groups:\n\n```ts\noutput: {\n  mode: 'tags-split',\n  client: 'hono',\n  target: 'src/endpoints',\n  schemas: 'src/schemas',\n  override: {\n    hono: {\n      compositeRoute: 'src/routes.ts',\n      validatorOutputPath: 'src/endpoints/validator.ts',\n    },\n  },\n}\n```\n\nGenerated `routes.ts`:\n\n```ts\nimport { Hono } from 'hono';\nimport {\n  listPetsHandlers,\n  createPetsHandlers,\n  showPetByIdHandlers,\n} from './endpoints/pets/pets.handlers';\n\nconst app = new Hono();\n\napp.get('/pets', ...listPetsHandlers);\napp.post('/pets', ...createPetsHandlers);\napp.get('/pets/:petId', ...showPetByIdHandlers);\n\nexport default app;\n```\n\nWire it up in your app entry point:\n\n```ts\nimport { Hono } from 'hono';\nimport routes from './routes';\n\nconst app = new Hono();\napp.route('/', routes);\n\nexport default app;\n```\n\nWithout `compositeRoute` in `tags-split` mode, you must wire routes manually.\n\n## Zod Schema Options for Hono\n\nControl how Zod schemas are generated alongside Hono handlers:\n\n```ts\noverride: {\n  hono: {\n    handlers: 'src/handlers',\n  },\n  zod: {\n    strict: {\n      response: true,         // Add .strict() to response schemas\n    },\n    preprocess: {\n      response: {\n        name: 'stripNill',\n        path: './src/mutators.ts',\n      },\n    },\n  },\n}\n```\n\n```ts\n// src/mutators.ts\nexport const stripNill = (object: unknown) =>\n  !!object && typeof object === 'object' && !Array.isArray(object)\n    ? Object.fromEntries(\n        Object.entries(object).filter(\n          ([_, value]) => value !== null && value !== undefined,\n        ),\n      )\n    : object;\n```\n\n## Zod Schema Naming Conventions\n\n| Type             | Pattern                   | Example               |\n| ---------------- | ------------------------- | --------------------- |\n| Query params     | `{PascalName}QueryParams` | `ListPetsQueryParams` |\n| Path params      | `{PascalName}Params`      | `ShowPetByIdParams`   |\n| Request headers  | `{PascalName}Header`      | `ListPetsHeader`      |\n| Request body     | `{PascalName}Body`        | `CreatePetsBody`      |\n| Array body items | `{PascalName}BodyItem`    | `CreatePetsBodyItem`  |\n| Response         | `{PascalName}Response`    | `ListPetsResponse`    |\n\n## Full Examples\n\n### Split mode with handlers\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'src/handlers',\n        },\n        zod: {\n          strict: { response: true },\n          preprocess: {\n            response: {\n              name: 'stripNill',\n              path: './src/mutators.ts',\n            },\n          },\n        },\n      },\n    },\n  },\n});\n```\n\n### Tags-split with composite routes\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  api: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'tags-split',\n      client: 'hono',\n      target: 'src/endpoints',\n      schemas: 'src/schemas',\n      clean: true,\n      override: {\n        hono: {\n          compositeRoute: 'src/routes.ts',\n          validatorOutputPath: 'src/endpoints/validator.ts',\n        },\n      },\n    },\n  },\n});\n```\n\n### Hono server + Fetch client (full-stack)\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstoreClient: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'tags-split',\n      client: 'fetch',\n      target: 'next-app/app/gen/',\n      schemas: 'next-app/app/gen/models',\n      clean: true,\n      baseUrl: 'http://localhost:8787',\n      mocks: true,\n    },\n  },\n  petstoreApi: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'hono-app/src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'hono-app/src/handlers',\n        },\n      },\n    },\n  },\n});\n```\n\n## Key Behavioral Notes\n\n- **Handler files are never overwritten** — existing handlers are preserved, new operations are appended\n- **All other generated files are regenerated** on every run (routes, context, zod, validator)\n- **Response validation only runs for HTTP 200 with `application/json`** — other status codes pass through\n- **Cloudflare Workers** is the primary deployment target (use `wrangler dev`)\n- **Required dependencies**: `hono`, `@hono/zod-validator`, `zod`\n\n## Running\n\n```bash\n# Cloudflare Workers\nwrangler dev src/index.ts\n\n# Test\ncurl http://localhost:8787/pets\n```\n","skills/orval/mocking-msw.md":"# MSW Mock Generation\n\n```ts\noutput: {\n  mocks: true,\n  // or with options:\n  mocks: {\n    generators: [\n      {\n        type: 'msw',\n        delay: 1000,\n        delayFunctionLazyExecute: false,\n        useExamples: true,\n        generateEachHttpStatus: false,\n        baseUrl: 'https://api.example.com',\n        locale: 'en',\n        preferredContentType: 'application/json',\n      },\n    ],\n  },\n}\n```\n\n`mocks: true` is shorthand for `{ generators: [{ type: 'msw' }, { type: 'faker' }] }` and emits both `<file>.msw.ts` and `<file>.faker.ts`. Use `{ type: 'faker' }` alone for response-mock factories with no MSW dependency.\n\nGenerated mock handler:\n\n```ts\nexport const getShowPetByIdMockHandler = (\n  overrideResponse?: Pet | ((info: RequestHandlerOptions) => Promise<Pet>),\n  options?: RequestHandlerOptions,\n) => {\n  return http.get(\n    '*/pets/:petId',\n    async (info) => {\n      await delay(1000);\n      return HttpResponse.json(\n        overrideResponse !== undefined\n          ? typeof overrideResponse === 'function'\n            ? await overrideResponse(info)\n            : overrideResponse\n          : getShowPetByIdResponseMock(),\n        { status: 200 },\n      );\n    },\n    options,\n  );\n};\n\nexport const getShowPetByIdResponseMock = (\n  overrideResponse: Partial<Pet> = {},\n): Pet => ({\n  id: faker.number.int(),\n  name: faker.string.alpha(20),\n  tag: faker.string.alpha(20),\n  ...overrideResponse,\n});\n```\n\nContent-type aware responses — MSW handlers automatically use the correct helper:\n\n| Content type                          | Response helper                      |\n| ------------------------------------- | ------------------------------------ |\n| `application/json`                    | `HttpResponse.json()`                |\n| `application/xml`, `*+xml`            | `HttpResponse.xml()`                 |\n| `text/html`                           | `HttpResponse.html()`                |\n| `text/plain`, other `text/*`          | `HttpResponse.text()`                |\n| `application/octet-stream`, `image/*` | `HttpResponse.arrayBuffer()`         |\n| No body (204, etc.)                   | `new HttpResponse(null, { status })` |\n\n## Test Setup with Vitest\n\n```ts\nimport {\n  getListPetsMockHandler,\n  getShowPetByIdMockHandler,\n} from './api/petstore.msw';\nimport { setupServer } from 'msw/node';\n\nconst server = setupServer(...getListPetsMockHandler());\n\nbeforeAll(() => server.listen());\nafterEach(() => server.resetHandlers());\nafterAll(() => server.close());\n\n// Override for specific test\nit('handles empty list', () => {\n  server.use(getListPetsMockHandler([]));\n  // ...\n});\n\n// Dynamic response based on request\nit('returns pet by id', () => {\n  server.use(\n    getShowPetByIdMockHandler(async ({ params }) => ({\n      id: Number(params.petId),\n      name: 'Test Pet',\n    })),\n  );\n  // ...\n});\n```\n\n## Mock Customization\n\n```ts\noverride: {\n  mock: {\n    properties: {\n      '/tag|name/': 'jon',              // Regex match\n      email: () => faker.internet.email(),\n    },\n    format: {\n      email: () => faker.internet.email(),\n      iban: () => faker.finance.iban(),\n    },\n    required: true,\n    delay: 500,\n    arrayMin: 1,\n    arrayMax: 10,\n    stringMin: 10,\n    stringMax: 20,\n    numberMin: 0,\n    numberMax: 100,\n    fractionDigits: 2,\n  },\n}\n```\n\nPer-operation mock data:\n\n```ts\noverride: {\n  operations: {\n    listPets: {\n      mock: {\n        properties: () => ({\n          '[].id': () => faker.number.int({ min: 1, max: 99999 }),\n        }),\n      },\n    },\n    showPetById: {\n      mock: {\n        data: () => ({\n          id: faker.number.int({ min: 1, max: 99 }),\n          name: faker.person.firstName(),\n          tag: faker.helpers.arrayElement([faker.word.sample(), undefined]),\n        }),\n      },\n    },\n  },\n}\n```\n\n## Dynamic Mock Imports (indexMockFiles)\n\nIn `tags-split` mode, emit one `index.<ext>.ts` per generator entry (e.g. `index.msw.ts`, `index.faker.ts`):\n\n```ts\noutput: {\n  mode: 'tags-split',\n  mocks: {\n    indexMockFiles: true,\n    generators: [{ type: 'msw' }],\n  },\n}\n```\n","skills/orval/solid-start.md":"# SolidStart Client\n\nUses native SolidStart primitives (`query()` and `action()` from `@solidjs/router`) instead of TanStack Query.\n\n```ts\noutput: {\n  client: 'solid-start',\n  mode: 'tags-split',\n  target: 'src/api/petstore.ts',\n  schemas: 'src/api/model',\n  mocks: true,\n}\n```\n\nGenerated output:\n\n```ts\nimport { query, action } from '@solidjs/router';\n\nexport const SwaggerPetstore = {\n  // GET requests -> query() with automatic caching\n  listPets: query(async (params: ListPetsParams) => {\n    const queryString = new URLSearchParams(params as any).toString();\n    const url = queryString ? `/pets?${queryString}` : `/pets`;\n    const response = await fetch(url, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\n    return response.json() as Promise<Pets>;\n  }, 'listPets'),\n\n  // POST/PUT/PATCH/DELETE -> action() (mutations, not cached)\n  createPets: action(async (createPetsBody: CreatePetsBody) => {\n    const response = await fetch('/pets', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(createPetsBody),\n    });\n    return response.json() as Promise<Pet>;\n  }, 'createPets'),\n};\n```\n\n## Cache Invalidation\n\n```ts\nimport { revalidate } from '@solidjs/router';\n\n// Invalidate all instances of a query\nrevalidate(SwaggerPetstore.listPets.key);\n\n// Invalidate specific call by arguments\nrevalidate(SwaggerPetstore.showPetById.keyFor('pet-123'));\n```\n\n## Usage with Components\n\n```tsx\nimport { createAsync } from '@solidjs/router';\nimport { Suspense } from 'solid-js';\n\nfunction PetDetails(props: { petId: string }) {\n  const pet = createAsync(() => SwaggerPetstore.showPetById(props.petId));\n  return (\n    <Suspense fallback={<div>Loading...</div>}>\n      <h1>{pet()?.name}</h1>\n    </Suspense>\n  );\n}\n\n// Actions work with HTML forms\n<form action={SwaggerPetstore.createPets} method=\"post\">\n  <input name=\"name\" required />\n  <button type=\"submit\">Create Pet</button>\n</form>;\n\n// Or programmatically\nfunction DeletePetButton(props: { petId: string }) {\n  const deletePet = useAction(SwaggerPetstore.deletePetById);\n  return <button onClick={() => deletePet(props.petId)}>Delete</button>;\n}\n```\n","skills/orval/tanstack-query.md":"# TanStack Query / SWR Clients\n\n## React Query / TanStack Query\n\n```ts\noutput: {\n  client: 'react-query',\n  override: {\n    query: {\n      useQuery: true,\n      useMutation: true,\n      useInfinite: true,\n      useInfiniteQueryParam: 'cursor',\n      useSuspenseQuery: true,\n      useSuspenseInfiniteQuery: true,\n      usePrefetch: true,\n      useInvalidate: true,\n      signal: true,\n      shouldExportKeys: true,\n      shouldSplitQueryKey: false,       // Array vs string query keys\n      useOperationIdAsQueryKey: false,  // Use operationId instead of route path\n      options: { staleTime: 10000 },\n      mutationInvalidates: [\n        {\n          onMutations: ['createPets'],\n          invalidates: ['listPets'],\n        },\n        {\n          onMutations: ['deletePet', 'updatePet'],\n          invalidates: [\n            'listPets',\n            { query: 'showPetById', params: ['petId'] },\n          ],\n        },\n      ],\n    },\n  },\n}\n```\n\nGenerated hooks:\n\n```ts\n// Query hook with automatic query key\nexport const useShowPetById = <TData = Pet, TError = Error>(\n  petId: string,\n  options?: { query?: UseQueryOptions<Pet, TError, TData> },\n) => {\n  const queryKey = getShowPetByIdQueryKey(petId);\n  const queryFn = () => showPetById(petId);\n  return useQuery({ queryKey, queryFn, enabled: !!petId, ...options?.query });\n};\n\n// Exported query key for manual invalidation\nexport const getShowPetByIdQueryKey = (petId: string) => [`/pets/${petId}`];\n```\n\n## Vue Query\n\n```ts\noutput: {\n  client: 'vue-query',\n  // Same override.query options as React Query\n}\n```\n\n## Svelte Query\n\n```ts\noutput: {\n  client: 'svelte-query',\n  // Same override.query options as React Query\n}\n```\n\n## Solid Query\n\nFor standalone SolidJS apps (not SolidStart):\n\n```ts\noutput: {\n  client: 'solid-query',\n  // Same override.query options as React Query\n}\n```\n\n## SWR\n\n```ts\noutput: {\n  client: 'swr',\n  override: {\n    swr: {\n      useInfinite: true,\n      useSuspense: true,\n      useSWRMutationForGet: false,\n      generateErrorTypes: false,\n      swrOptions: { dedupingInterval: 10000 },\n      swrMutationOptions: { revalidate: true },\n      swrInfiniteOptions: { initialSize: 10 },\n    },\n  },\n}\n```\n\n## Query Invalidation Patterns\n\nBasic invalidation:\n\n```ts\noverride: {\n  query: {\n    useInvalidate: true,\n    mutationInvalidates: [\n      {\n        onMutations: ['createPets'],\n        invalidates: ['listPets'],\n      },\n    ],\n  },\n}\n```\n\nAdvanced invalidation with params and cross-file references:\n\n```ts\nmutationInvalidates: [\n  {\n    onMutations: ['deletePet', 'updatePet', 'patchPet'],\n    invalidates: [\n      'listPets',\n      { query: 'showPetById', params: ['petId'] },\n      { query: 'adminPets', file: './admin' },\n    ],\n  },\n  {\n    onMutations: ['uploadFile'],\n    invalidates: ['listPets'],\n  },\n],\n```\n\nReset mode (reset query state instead of refetch):\n\n```ts\ninvalidates: [\n  { query: 'showPetById', params: ['petId'], invalidationMode: 'reset' },\n],\n```\n\nSkip invalidation at runtime:\n\n```ts\nconst deletePet = useDeletePet({\n  mutation: {\n    onSuccess: () => {\n      // Custom invalidation logic\n      queryClient.invalidateQueries({ queryKey: getListPetsQueryKey() });\n    },\n  },\n  skipInvalidation: true,\n});\n```\n","skills/orval/tooling-workflow.md":"# Tooling & Workflow\n\n## MCP (AI Agent Tools)\n\nGenerate Model Context Protocol servers from OpenAPI specs for AI agent integration (Claude, Cline, etc.):\n\n```ts\noutput: {\n  mode: 'single',       // ONLY works in single mode\n  client: 'mcp',\n  baseUrl: 'https://petstore3.swagger.io/api/v3',\n  target: 'src/handlers.ts',\n  schemas: 'src/http-schemas',\n}\n```\n\nGenerated files:\n\n- `src/http-schemas/` — TypeScript types\n- `src/handlers.ts` — Handler functions returning MCP format\n- `src/http-client.ts` — Generated fetch client\n- `src/server.ts` — MCP tools and server configuration\n- `src/tool-schemas.zod.ts` — Zod schemas for tool inputs\n\nDeploy with Docker and configure in your MCP client (e.g. Cline's `mcpServers` config).\n\n## NDJSON Streaming\n\nType-safe newline-delimited JSON streaming. Only supported with Fetch client.\n\nOpenAPI schema:\n\n```yaml\npaths:\n  /stream:\n    get:\n      responses:\n        '200':\n          content:\n            application/x-ndjson:\n              schema:\n                $ref: '#/components/schemas/StreamEntry'\n```\n\nGenerated types and function:\n\n```ts\nexport type streamResponse200 = {\n  stream: TypedResponse<StreamEntry>;\n  status: 200;\n};\n\nexport const stream = async (\n  options?: RequestInit,\n): Promise<streamResponse> => {\n  const stream = await fetch(getStreamUrl(), {\n    ...options,\n    method: 'GET',\n    headers: { Accept: 'application/x-ndjson', ...options?.headers },\n  });\n  return {\n    status: stream.status,\n    stream,\n    headers: stream.headers,\n  } as streamResponse;\n};\n```\n\nReading the stream:\n\n```ts\nexport const readStream = <T extends object>(\n  response: Response & { json(): Promise<T> },\n  processLine: (value: T) => void,\n): Promise<void> => {\n  if (!response.body) return Promise.resolve();\n  const stream = response.body.getReader();\n  const decoder = new TextDecoder();\n  let buffer = '';\n\n  const loop = (): Promise<void> =>\n    stream.read().then(({ done, value }) => {\n      if (done) {\n        if (buffer.length > 0) processLine(JSON.parse(buffer));\n        return;\n      }\n      buffer += decoder.decode(value, { stream: true });\n      const parts = buffer.split(/\\r?\\n/);\n      buffer = parts.pop() ?? '';\n      for (const part of parts.filter(Boolean)) {\n        processLine(JSON.parse(part) as T);\n      }\n      return loop();\n    });\n  return loop();\n};\n\n// Usage\nconst results: StreamEntry[] = [];\nconst response = await stream();\nif (response.status === 200) {\n  await readStream(response.stream, (obj) => results.push(obj));\n}\n```\n\n## Input Transformers\n\nTransform the OpenAPI spec before generation:\n\n```ts\ninput: {\n  target: './spec.yaml',\n  override: {\n    transformer: './transformers/add-auth-header.js',\n  },\n}\n```\n\n```js\n// add-auth-header.js\nmodule.exports = (openAPIDocument) => {\n  // Modify and return the spec\n  return openAPIDocument;\n};\n```\n\n## Hooks (afterAllFilesWrite)\n\nRun scripts after Orval generates files:\n\n```ts\nexport default defineConfig({\n  petstore: {\n    input: './petstore.yaml',\n    output: './petstore.ts',\n    hooks: {\n      afterAllFilesWrite: 'prettier --write',\n    },\n  },\n});\n```\n\nMultiple commands:\n\n```ts\nhooks: {\n  afterAllFilesWrite: ['prettier --write', 'eslint --fix'],\n}\n```\n\nDisable file path injection:\n\n```ts\nhooks: {\n  afterAllFilesWrite: {\n    command: 'prettier --write .',\n    injectGeneratedDirsAndFiles: false,\n  },\n}\n```\n\n## Programmatic API\n\nUse Orval programmatically in build scripts:\n\n```ts\nimport { generate } from 'orval';\n\n// From config file\nawait generate('./orval.config.ts');\n\n// With direct configuration\nimport type { Options } from 'orval';\n\nconst config: Options = {\n  input: { target: './api-spec.yaml' },\n  output: { target: './src/api.ts', client: 'axios' },\n};\nawait generate(config);\n```\n\nWith global options override:\n\n```ts\nimport { generate, type GlobalOptions } from 'orval';\n\nconst globalOptions: GlobalOptions = {\n  watch: true,\n  // watch: ['./specs/*.yaml'],   // Watch specific patterns\n  clean: true,\n  prettier: true,\n  client: 'fetch',\n  mode: 'split',\n  mocks: true,\n  tsconfig: './tsconfig.json',\n};\n\nawait generate('./orval.config.ts', process.cwd(), globalOptions);\n```\n\nFunction signature:\n\n```ts\nfunction generate(\n  optionsExport?: string | OptionsExport,\n  workspace?: string,\n  options?: GlobalOptions,\n): Promise<void>;\n```\n\nBuild script integration:\n\n```json\n{\n  \"scripts\": {\n    \"generate\": \"node scripts/generate-api.js\",\n    \"dev\": \"npm run generate && next dev\",\n    \"build\": \"npm run generate && next build\"\n  }\n}\n```\n\n```js\n// scripts/generate-api.js\nconst { generate } = require('orval');\n\nasync function main() {\n  try {\n    await generate();\n    console.log('API client generated successfully');\n  } catch (error) {\n    console.error('Failed to generate API client:', error);\n    process.exit(1);\n  }\n}\n\nmain();\n```\n","skills/orval/zod-validation.md":"# Zod Schema Generation\n\n## Standalone Zod Schemas\n\n```ts\noutput: {\n  client: 'zod',\n  target: './src/api/schemas',\n}\n```\n\nGenerated:\n\n```ts\nexport const createPetsBody = zod.object({\n  id: zod.number(),\n  name: zod.string(),\n  tag: zod.string().optional(),\n});\n```\n\n## Combined with HTTP Client\n\n```ts\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'react-query',\n      target: 'src/api/endpoints',\n      schemas: 'src/api/models',\n    },\n  },\n  petstoreZod: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'zod',\n      target: 'src/api/endpoints',\n      fileExtension: '.zod.ts', // Avoid filename conflicts\n    },\n  },\n});\n```\n\n## Zod Options\n\n```ts\noverride: {\n  zod: {\n    strict: {\n      response: true,\n      query: true,\n      param: true,\n      header: true,\n      body: true,\n    },\n    coerce: {\n      query: ['string', 'number', 'boolean'],\n    },\n    generate: {\n      param: true,\n      body: true,\n      response: true,\n      query: true,\n      header: true,\n    },\n    preprocess: {\n      response: {\n        name: 'stripNill',\n        path: './src/mutators.ts',\n      },\n    },\n    generateEachHttpStatus: true,\n    dateTimeOptions: { ... },\n    timeOptions: { ... },\n  },\n}\n```\n\nPreprocess example for stripping null/undefined before validation:\n\n```ts\nexport const stripNill = (object: unknown) =>\n  !!object && typeof object === 'object' && !Array.isArray(object)\n    ? Object.fromEntries(\n        Object.entries(object).filter(\n          ([_, value]) => value !== null && value !== undefined,\n        ),\n      )\n    : object;\n```\n\n## Runtime Validation with Fetch Client\n\n```ts\noutput: {\n  client: 'fetch',\n  override: {\n    fetch: {\n      runtimeValidation: true,  // Validate responses with Zod schemas\n    },\n  },\n}\n```\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"<!--VITE PLUS START-->\n\n# Using Vite+, the Unified Toolchain for the Web\n\nThis project is using Vite+, a unified toolchain built on top of Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, and Vite Task. Vite+ wraps runtime management, package management, and frontend tooling in a single global CLI called `vp`. Vite+ is distinct from Vite, and it invokes Vite through `vp dev` and `vp build`. Run `vp help` to print a list of commands and `vp <command> --help` for information about a specific command.\n\nDocs are local at `node_modules/vite-plus/docs` or online at https://viteplus.dev/guide/.\n\n## Built-in Commands vs Scripts\n\n`vp <name>` runs a built-in command. `vp run <name>` runs a `package.json` script or a `vite.config.ts` task. Scripts cannot overwrite built-ins, so `vp dev` and `vp run dev` may do different things. Check `package.json` and `vite.config.ts` first, and run `vp run <name>` when the project defines a script or task with that name.\n\n## Tool Versions\n\nRun `vp toolchain` to show versions and relationships in the active Vite+\nrelease. Add a tool name to select part of the graph. For example, run\n`vp toolchain vite`. Use `--global` to ignore the local `vite-plus` package. Use\n`vp why <package>` to show the package-manager dependency graph.\n\n## Review Checklist\n\n- [ ] Run `vp install` after pulling remote changes and before getting started.\n- [ ] Run `vp check` and `vp test` to format, lint, type check and test changes.\n- [ ] Check if there are `vite.config.ts` tasks or `package.json` scripts necessary for validation, run via `vp run <script>`.\n- [ ] If setup, runtime, or package-manager behavior looks wrong, run `vp env doctor` and include its output when asking for help.\n\n<!--VITE PLUS END-->\n","isInternal":false,"tokens":445,"sizeBytes":1731},{"name":"advanced-config.md","path":"skills/orval/advanced-config.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/advanced-config.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# Advanced Configuration\n\n## Type Generation Options\n\n```ts\noverride: {\n  // Enum generation\n  enumGenerationType: 'const',    // 'const' (default) | 'enum' | 'union'\n\n  // Type preferences\n  useTypeOverInterfaces: false,   // Use type instead of interface\n  useNamedParameters: false,      // Named params object vs positional args\n  useDates: false,                // Convert date/datetime to Date objects\n  useBigInt: false,               // Convert int64/uint64 to BigInt\n  useDeprecatedOperations: true,  // Include deprecated operations\n  useNullForOptional: false,      // Type optional as T | null\n  aliasCombinedTypes: false,      // Create intermediate type aliases for anyOf/oneOf/allOf\n  suppressReadonlyModifier: false, // Suppress readonly modifier\n\n  // Naming\n  components: {\n    schemas: { suffix: 'DTO' },\n    responses: { suffix: 'Response' },\n    parameters: { suffix: 'Params' },\n    requestBodies: { suffix: 'Bodies' },\n  },\n\n  // Custom operation names\n  operationName: (operation, route, verb) => `custom_${operation.operationId}`,\n\n  // Property key naming convention\n  namingConvention: {\n    enum: 'PascalCase',  // camelCase | PascalCase | snake_case | kebab-case\n  },\n\n  // File header\n  header: (info) => [\n    'Generated by Orval',\n    'Do not edit manually.',\n    ...(info.title ? [info.title] : []),\n  ],\n  // header: false,  // Disable header\n\n  // Service title (axios and angular clients only)\n  title: (title) => `${title}Api`,\n}\n```\n\n## Enum Extensions\n\nUse OpenAPI extensions for meaningful enum names and descriptions:\n\n```yaml\nmyEnum:\n  type: number\n  enum: [1, 2, 3]\n  x-enumNames: [Active, Inactive, Pending]\n  x-enumDescriptions:\n    - User is active\n    - User is inactive\n    - User is pending approval\n```\n\nGenerated output:\n\n```ts\nexport const MyEnum = {\n  /** User is active */\n  Active: 1,\n  /** User is inactive */\n  Inactive: 2,\n  /** User is pending approval */\n  Pending: 3,\n} as const;\n\nexport type MyEnum = (typeof MyEnum)[keyof typeof MyEnum];\n```\n\nSupported extension variants: `x-enumNames`, `x-enumnames`, `x-enum-varnames` for names; `x-enumDescriptions`, `x-enumdescriptions`, `x-enum-descriptions` for descriptions.\n\nNote: Enum descriptions only work with `enumGenerationType: 'const'` (default).\n\n## Per-Operation Overrides\n\n```ts\noverride: {\n  operations: {\n    listPets: {\n      mutator: 'src/response-type.js',\n      query: {\n        useInfinite: true,\n        useInfiniteQueryParam: 'cursor',\n        useSuspenseQuery: true,\n        options: { staleTime: 60000 },\n      },\n      mock: {\n        data: () => ({ id: 1, name: 'Buddy' }),\n      },\n    },\n  },\n}\n```\n\n## Per-Tag Overrides\n\nSame options as per-operation but scoped by OpenAPI tag:\n\n```ts\noverride: {\n  tags: {\n    pets: {\n      mutator: {\n        path: '../mutators/use-custom-instance.ts',\n        name: 'useCustomInstance',\n      },\n      query: {\n        useInfinite: true,\n      },\n    },\n  },\n}\n```\n\n## FormData Handling\n\nDefault FormData generation:\n\n```ts\noverride: {\n  formData: true,  // Auto-generate FormData serialization\n}\n```\n\nCustom FormData mutator:\n\n```ts\noverride: {\n  formData: {\n    path: './custom-form-data.ts',\n    name: 'customFormData',\n  },\n}\n```\n\n```ts\n// custom-form-data.ts\nexport const customFormData = <Body>(body: Body): FormData => {\n  const formData = new FormData();\n  Object.entries(body).forEach(([key, value]) => {\n    formData.append(key, value);\n  });\n  return formData;\n};\n```\n\nArray handling options for FormData:\n\n```ts\noverride: {\n  formData: {\n    arrayHandling: 'serialize',  // 'serialize' | 'serialize-with-brackets' | 'explode'\n  },\n}\n```\n\n- `serialize`: `formData.append('items', JSON.stringify(value))`\n- `serialize-with-brackets`: `formData.append('items[]', JSON.stringify(value))`\n- `explode`: Expands nested objects with indexed keys\n\nURL-encoded form data:\n\n```ts\noverride: {\n  formUrlEncoded: {\n    path: './custom-form-url-encoded.ts',\n    name: 'customFormUrlEncoded',\n  },\n}\n```\n\n## Content Type Filtering\n\n```ts\noverride: {\n  contentType: {\n    include: ['application/json'],\n    exclude: ['application/xml'],\n  },\n}\n```\n\n## JSDoc Customization\n\n```ts\noverride: {\n  jsDoc: {\n    filter: (schema) => {\n      const allowlist = [\n        'type', 'format', 'maxLength', 'minLength',\n        'description', 'minimum', 'maximum', 'pattern',\n        'nullable', 'enum',\n      ];\n      return Object.entries(schema || {})\n        .filter(([key]) => allowlist.includes(key))\n        .map(([key, value]) => ({ key, value }))\n        .sort((a, b) => a.key.length - b.key.length);\n    },\n  },\n}\n```\n\n## Request Options\n\nConfigure or remove the request options parameter:\n\n```ts\noverride: {\n  requestOptions: false,  // Remove request options entirely\n  // or configure headers:\n  requestOptions: {\n    headers: {\n      'X-Custom-Header': '${dynamicValue}',\n    },\n  },\n}\n```\n\n## Params Serializer\n\nCustom parameter serialization (Axios/Angular only):\n\n```ts\noverride: {\n  paramsSerializer: {\n    path: './custom-params-serializer.ts',\n    name: 'customParamsSerializerFn',\n  },\n  // or use qs library:\n  paramsSerializerOptions: {\n    qs: { arrayFormat: 'repeat' },\n  },\n}\n```\n\n## Custom Mutation Options\n\n```ts\noverride: {\n  query: {\n    mutationOptions: {\n      path: './custom-mutation.ts',\n      name: 'useCustomMutation',\n    },\n  },\n}\n```\n\n## Full Working Example\n\n```ts\nimport { faker } from '@faker-js/faker';\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    output: {\n      mode: 'split',\n      target: 'src/petstore.ts',\n      schemas: 'src/model',\n      client: 'react-query',\n      mocks: true,\n      override: {\n        operations: {\n          listPets: {\n            mutator: 'src/response-type.js',\n            mock: {\n              properties: () => ({\n                id: () => faker.number.int({ min: 1, max: 99999 }),\n              }),\n            },\n          },\n          showPetById: {\n            mock: {\n              data: () => ({\n                id: faker.number.int({ min: 1, max: 99 }),\n                name: faker.person.firstName(),\n                tag: faker.helpers.arrayElement([\n                  faker.word.sample(),\n                  undefined,\n                ]),\n              }),\n            },\n          },\n        },\n        mock: {\n          properties: {\n            '/tag|name/': () => faker.person.lastName(),\n          },\n          delay: 500,\n        },\n      },\n      allParamsOptional: true,\n      urlEncodeParameters: true,\n    },\n    input: {\n      target: './petstore.yaml',\n      override: {\n        transformer: 'src/add-version.js',\n      },\n    },\n    hooks: {\n      afterAllFilesWrite: 'prettier --write',\n    },\n  },\n});\n```\n","isInternal":false,"tokens":1677,"sizeBytes":6700},{"name":"angular.md","path":"skills/orval/angular.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/angular.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# Angular Clients\n\n## Angular Query\n\nSignal-based reactivity with Angular's dependency injection:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',\n  mode: 'tags-split',\n  override: {\n    query: {\n      useInvalidate: true,\n      signal: true,\n      runtimeValidation: true,    // Pipe responses through Zod validation\n      mutationInvalidates: [\n        {\n          onMutations: ['createPets'],\n          invalidates: ['listPets'],\n        },\n        {\n          onMutations: ['deletePet', 'updatePet'],\n          invalidates: [\n            'listPets',\n            { query: 'showPetById', params: ['petId'] },\n          ],\n        },\n      ],\n    },\n  },\n}\n```\n\nGenerated injectable functions with signal reactivity:\n\n```ts\n// Inject query — re-executes when signal changes\nexport function injectShowPetById<TData = Pet, TError = unknown>(\n  petId: string | (() => string),   // Accepts signal getters\n  options?: { query?: Partial<CreateQueryOptions<Pet, TError, TData>> },\n): CreateQueryResult<TData, TError> {\n  const http = inject(HttpClient);\n  const query = injectQuery(() => {\n    const _petId = typeof petId === 'function' ? petId() : petId;\n    return getShowPetByIdQueryOptions(http, _petId, options);\n  });\n  return query;\n}\n\n// Inject mutation\nexport const injectCreatePets = <TError = Error, TContext = unknown>(\n  options?: { mutation?: CreateMutationOptions<...>; fetch?: RequestInit },\n): CreateMutationResult<...> => {\n  const http = inject(HttpClient);\n  const queryClient = inject(QueryClient);\n  return injectMutation(() => getCreatePetsMutationOptions(http, queryClient, options));\n};\n```\n\nUsage in Angular components:\n\n```ts\n@Component({...})\nexport class PetDetailComponent {\n  petId = signal('1');\n\n  // Query re-executes when petId() changes\n  pet = injectShowPetById(() => this.petId());\n\n  // Dynamic enabled/disabled\n  conditionalPet = injectShowPetById(\n    () => this.petId(),\n    () => ({ query: { enabled: this.isEnabled() } }),\n  );\n\n  // Mutation with auto-invalidation\n  deletePet = injectDeletePet({\n    mutation: {\n      onSuccess: () => this.snackbar.open('Pet deleted!'),\n    },\n  });\n\n  // Skip auto-invalidation for custom control\n  customDelete = injectDeletePet({\n    mutation: {\n      onSuccess: () => {\n        setTimeout(() => {\n          this.queryClient.invalidateQueries({ queryKey: getListPetsQueryKey() });\n        }, 700);\n      },\n    },\n    skipInvalidation: true,\n  });\n}\n```\n\n### Zod Runtime Validation\n\nWhen `runtimeValidation: true` and `schemas.type: 'zod'`:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',\n  schemas: { path: 'src/model', type: 'zod' },\n  override: {\n    query: { runtimeValidation: true },\n  },\n}\n```\n\nGenerated code pipes through Zod:\n\n```ts\nconst request$ = http\n  .get<Pets>(url, { params: httpParams })\n  .pipe(map((data) => Pets.parse(data)));\n```\n\n## Angular (HttpClient)\n\nTraditional Angular service generation:\n\n```ts\noutput: {\n  client: 'angular',\n  mode: 'tags-split',\n  mocks: true,\n  override: {\n    angular: {\n      provideIn: 'root',  // 'root' | 'any' | '' | false\n    },\n  },\n}\n```\n\nSetting backend URL with interceptor:\n\n```ts\n@Injectable()\nexport class ApiInterceptor implements HttpInterceptor {\n  intercept(req: HttpRequest<any>, next: HttpHandler) {\n    const apiReq = req.clone({\n      url: `https://api.example.com${req.url}`,\n    });\n    return next.handle(apiReq);\n  }\n}\n```\n\n## Angular Custom Mutator with HttpClient\n\n```ts\n// custom-client-with-error.ts\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nexport interface ExtendedServerErrorResponse<Error> extends HttpErrorResponse {\n  error: Error | any | null;\n}\nexport type ErrorType<Error> = ExtendedServerErrorResponse<Error>;\n\nexport const responseType = <Result>(\n  {\n    url,\n    method,\n    params,\n    data,\n    signal,\n    responseType,\n  }: {\n    url: string;\n    method: string;\n    params?: any;\n    data?: any;\n    headers?: any;\n    signal?: AbortSignal;\n    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n  },\n  http?: HttpClient,\n): Promise<Result> => {\n  if (!http) throw new Error('HttpClient is required.');\n  return lastValueFrom(\n    http.request<Result>(method, url, {\n      params,\n      body: data,\n      responseType: (responseType ?? 'json') as 'json',\n    }),\n  );\n};\n\nexport default responseType;\n```\n","isInternal":false,"tokens":1082,"sizeBytes":4398},{"name":"custom-http-clients.md","path":"skills/orval/custom-http-clients.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/custom-http-clients.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# Custom HTTP Client (Mutator)\n\nReplace the default HTTP implementation with a custom mutator.\n\n## Basic Axios Mutator\n\n```ts\n// orval.config.ts\noutput: {\n  override: {\n    mutator: {\n      path: './api/mutator/custom-instance.ts',\n      name: 'customInstance',\n    },\n  },\n}\n```\n\n```ts\n// custom-instance.ts\nimport Axios, { AxiosRequestConfig, AxiosError } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({ baseURL: '' });\n\nexport const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {\n  return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n};\n\nexport type ErrorType<Error> = AxiosError<Error>;\nexport type BodyType<BodyData> = BodyData;\n```\n\n## Axios with Interceptors (Auth, Error Handling)\n\n```ts\n// custom-instance.ts\nimport Axios, { AxiosRequestConfig, AxiosError } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({\n  baseURL: process.env.API_URL,\n});\n\n// Request interceptor — token injection\nAXIOS_INSTANCE.interceptors.request.use(\n  (config) => {\n    const token = localStorage.getItem('token');\n    if (token) config.headers.Authorization = `Bearer ${token}`;\n    return config;\n  },\n  (error) => Promise.reject(error),\n);\n\n// Response interceptor — error handling\nAXIOS_INSTANCE.interceptors.response.use(\n  (response) => response,\n  (error) => {\n    if (error.response?.status === 401) {\n      // Handle unauthorized\n    }\n    return Promise.reject(error);\n  },\n);\n\nexport const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {\n  return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n};\n\nexport type ErrorType<Error> = AxiosError<Error>;\nexport type BodyType<BodyData> = BodyData;\n```\n\n## React Context Auth with Interceptors\n\n```tsx\n// auth.context.tsx\nimport { useEffect, useState, createContext, useContext } from 'react';\nimport { AXIOS_INSTANCE } from './api/mutator/custom-instance';\n\nconst AuthProvider = ({ children, initialState = null }) => {\n  const [token, setToken] = useState(initialState);\n\n  useEffect(() => {\n    const interceptorId = AXIOS_INSTANCE.interceptors.request.use((config) => {\n      if (config.headers && token) {\n        config.headers.set('Authorization', `Bearer ${token}`);\n      }\n      return config;\n    });\n\n    return () => {\n      AXIOS_INSTANCE.interceptors.request.eject(interceptorId);\n    };\n  }, [token]);\n\n  return (\n    <AuthContext.Provider value={token}>\n      <AuthDispatchContext.Provider value={setToken}>\n        {children}\n      </AuthDispatchContext.Provider>\n    </AuthContext.Provider>\n  );\n};\n```\n\n## Hook-Based Mutator (Axios)\n\nAllows using React hooks inside the mutator (e.g., for auth state, callbacks):\n\n```ts\n// orval.config.ts\noutput: {\n  override: {\n    mutator: {\n      path: './use-custom-instance.ts',\n      name: 'useCustomInstance',\n    },\n  },\n}\n```\n\n```ts\n// use-custom-instance.ts\nimport Axios, { type AxiosRequestConfig } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({ baseURL: '' });\n\nexport const useCustomInstance = <T>(): ((\n  config: AxiosRequestConfig,\n) => Promise<T>) => {\n  // Can use React hooks here (useAuth, useCallback, etc.)\n  return (config: AxiosRequestConfig) => {\n    return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n  };\n};\n\nexport default useCustomInstance;\n```\n\n## Hook-Based Mutator (Fetch with useCallback)\n\n```ts\n// use-custom-fetch.ts\nimport { useCallback, useState } from 'react';\n\nexport function useGetBaseUrl() {\n  const [baseUrl] = useState('');\n  return baseUrl;\n}\n\nexport function useCustomFetch() {\n  const baseUrl = useGetBaseUrl();\n  return useCallback(\n    async <T>(url: string, options?: RequestInit): Promise<T> => {\n      const headers = new Headers(options?.headers);\n      const response = await fetch(`${baseUrl}${url}`, {\n        ...options,\n        headers,\n      });\n      if (!response.ok) throw new Error('Network response was not ok');\n      return response.json();\n    },\n    [],\n  );\n}\n```\n\n## Fetch with Content-Type Detection\n\nHandle PDF, blob, text, XML responses (not just JSON):\n\n```ts\n// custom-fetch.ts\nconst getBody = <T>(c: Response | Request): Promise<T> => {\n  const contentType = c.headers.get('content-type');\n  if (contentType && contentType.includes('application/json')) {\n    return c.json();\n  }\n  if (contentType && contentType.includes('application/pdf')) {\n    return c.blob() as Promise<T>;\n  }\n  return c.text() as Promise<T>;\n};\n\nconst getUrl = (contextUrl: string): string => {\n  const url = new URL(contextUrl);\n  const baseUrl =\n    process.env.NODE_ENV === 'production'\n      ? 'https://api.production.com'\n      : 'http://localhost:3000';\n  return new URL(`${baseUrl}${url.pathname}${url.search}`).toString();\n};\n\nexport const customFetch = async <T>(\n  url: string,\n  options: RequestInit,\n): Promise<T> => {\n  const requestUrl = getUrl(url);\n  const requestHeaders = {\n    ...options.headers,\n    Authorization: 'Bearer my-token',\n  };\n  const response = await fetch(requestUrl, {\n    ...options,\n    headers: requestHeaders,\n  });\n  const data = await getBody<T>(response);\n  return { status: response.status, data, headers: response.headers } as T;\n};\n\nexport default customFetch;\n```\n\n## Fetch Client Config\n\nNative Fetch API — no dependencies, works in browsers, Node.js, Cloudflare Workers, Vercel Edge, Deno.\n\n```ts\noutput: {\n  client: 'fetch',\n  baseUrl: 'http://localhost:3000',\n  override: {\n    fetch: {\n      includeHttpResponseReturnType: false,  // Return data directly instead of { data, status }\n      forceSuccessResponse: true,            // Throw on error responses\n      runtimeValidation: true,               // Validate responses with Zod\n      jsonReviver: {                         // Custom JSON reviver (e.g. for dates)\n        path: './reviver.ts',\n        name: 'dateReviver',\n      },\n    },\n  },\n}\n```\n\n## Environment-Based URL Switching\n\nUsing base URL from spec with variables:\n\n```ts\noutput: {\n  baseUrl: {\n    getBaseUrlFromSpecification: true,\n    variables: {\n      environment: process.env.NODE_ENV === 'production' ? 'api.prod' : 'api.dev',\n    },\n  },\n}\n```\n\nOr use a `getUrl` function in a custom fetch mutator (see the `getUrl` pattern in \"Fetch with Content-Type Detection\" above).\n","isInternal":false,"tokens":1470,"sizeBytes":6198},{"name":"hono.md","path":"skills/orval/hono.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/hono.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# Hono Server Client\n\nGenerate type-safe Hono server handlers with built-in Zod validation from OpenAPI specs.\n\n## Quick Start\n\n```bash\nnpm install hono @hono/zod-validator zod\n```\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'src/handlers',\n        },\n      },\n    },\n  },\n});\n```\n\n## Configuration Options\n\n```ts\noutput: {\n  client: 'hono',\n  override: {\n    hono: {\n      handlers: 'src/handlers',             // Directory for per-operation handler files\n      compositeRoute: 'src/routes.ts',      // Combined routes file (used with tags-split)\n      validator: true,                       // true (default) | 'hono' | false\n      validatorOutputPath: 'src/validator.ts', // Custom validator output path\n    },\n  },\n}\n```\n\n| Option                | Type                | Default         | Description                                                                                                                                              |\n| --------------------- | ------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `handlers`            | `string`            | —               | Directory for per-operation handler files. One file per operation.                                                                                       |\n| `compositeRoute`      | `string`            | `''` (disabled) | Path for combined routes file. Used with `tags-split` mode.                                                                                              |\n| `validator`           | `boolean \\| 'hono'` | `true`          | `true` = orval's custom zValidator with response validation; `'hono'` = `@hono/zod-validator` directly (no response validation); `false` = no validators |\n| `validatorOutputPath` | `string`            | `''` (auto)     | Custom output path for the generated validator file                                                                                                      |\n\n## Generated File Structure\n\n### `split` mode with `handlers`\n\n```\nsrc/\n├── handlers/\n│   ├── listPets.ts           # Per-operation handler (NOT overwritten if exists)\n│   ├── createPets.ts\n│   ├── showPetById.ts\n│   └── updatePets.ts\n├── petstore.ts               # Hono app with routes (regenerated)\n├── petstore.context.ts       # Type-safe context types (regenerated)\n├── petstore.schemas.ts       # TypeScript types\n├── petstore.validator.ts     # Custom zValidator wrapper (regenerated)\n└── petstore.zod.ts           # Zod schemas (regenerated)\n```\n\n### `tags-split` with `compositeRoute`\n\n```\nsrc/\n├── endpoints/\n│   └── pets/\n│       ├── pets.context.ts\n│       ├── pets.handlers.ts  # All handlers for tag in one file\n│       └── pets.zod.ts\n├── schemas/\n│   ├── pet.ts\n│   ├── pets.ts\n│   └── index.ts\n├── routes.ts                 # Combined routes file\n└── endpoints/validator.ts    # Shared validator\n```\n\n### `tags` mode\n\n```\nsrc/\n├── handlers/\n│   ├── listPets.ts\n│   └── createPets.ts\n├── pets.ts                   # Route file per tag\n├── pets.context.ts\n├── pets.zod.ts\n└── pets.validator.ts\n```\n\n## Generated Route File\n\n```ts\nimport { Hono } from 'hono';\nimport { listPetsHandlers } from './handlers/listPets';\nimport { createPetsHandlers } from './handlers/createPets';\nimport { showPetByIdHandlers } from './handlers/showPetById';\n\nconst app = new Hono();\n\napp.get('/pets', ...listPetsHandlers);\napp.post('/pets', ...createPetsHandlers);\napp.get('/pets/:petId', ...showPetByIdHandlers);\n\nexport default app;\n```\n\nOpenAPI path params `{petId}` are converted to Hono format `:petId`.\n\n## Handler Templates\n\n### Query parameters\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { ListPetsContext } from '../petstore.context';\nimport { listPetsQueryParams, listPetsResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const listPetsHandlers = factory.createHandlers(\n  zValidator('query', listPetsQueryParams),\n  zValidator('response', listPetsResponse),\n  async (c: ListPetsContext) => {\n    return c.json([{ id: 1, name: 'Buddy' }]);\n  },\n);\n```\n\n### Path parameters\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { ShowPetByIdContext } from '../petstore.context';\nimport { showPetByIdParams, showPetByIdResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const showPetByIdHandlers = factory.createHandlers(\n  zValidator('param', showPetByIdParams),\n  zValidator('response', showPetByIdResponse),\n  async (c: ShowPetByIdContext) => {\n    const { petId } = c.req.valid('param');\n    return c.json({ id: Number(petId), name: 'Buddy' });\n  },\n);\n```\n\n### JSON body\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { CreatePetsContext } from '../petstore.context';\nimport { createPetsBody, createPetsResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const createPetsHandlers = factory.createHandlers(\n  zValidator('json', createPetsBody),\n  zValidator('response', createPetsResponse),\n  async (c: CreatePetsContext) => {\n    const body = c.req.valid('json');\n    return c.json({ id: 1, ...body });\n  },\n);\n```\n\n### Validator order in generated handlers\n\n1. `zValidator('header', ...)` — if request headers exist\n2. `zValidator('param', ...)` — if path parameters exist\n3. `zValidator('query', ...)` — if query parameters exist\n4. `zValidator('json', ...)` — if request body exists\n5. `zValidator('response', ...)` — if 200 JSON response exists AND `validator !== 'hono'`\n\n## Context Types\n\nGenerated context types encode the validated input shape for type-safe access:\n\n```ts\nimport type { Context, Env } from 'hono';\n\nexport type ListPetsContext<E extends Env = any> = Context<\n  E,\n  '/pets',\n  { in: { query: ListPetsParams }; out: { query: ListPetsParams } }\n>;\n\nexport type ShowPetByIdContext<E extends Env = any> = Context<\n  E,\n  '/pets/:petId',\n  {\n    in: { param: { petId: string } };\n    out: { param: { petId: string } };\n  }\n>;\n\nexport type CreatePetsContext<E extends Env = any> = Context<\n  E,\n  '/pets',\n  { in: { json: CreatePetsBodyItem[] }; out: { json: CreatePetsBodyItem[] } }\n>;\n```\n\nWhen an operation has no params/query/body, the third generic is omitted.\n\nA `NonReadonly<T>` utility type is emitted only when schema types contain readonly properties.\n\n## zValidator (Response Validation)\n\nOrval's custom `zValidator` extends `@hono/zod-validator` with a `response` target:\n\n```ts\nzValidator('response', responseSchema);\n```\n\nResponse validation behavior (when `validator: true`):\n\n- Runs as post-middleware (calls `await next()` first)\n- Only validates HTTP 200 responses with `Content-Type: application/json`\n- Uses `safeParseAsync` — supports Zod v3 and v4\n- On parse failure: returns HTTP 400 with `{ success, data, error }`\n- On malformed JSON: returns HTTP 400 with `'Malformed JSON in response'`\n- Supports optional `hook` callback for custom validation handling\n\nSee the `validator` option in Configuration Options above for the three modes (`true`, `'hono'`, `false`).\n\n## Composite Routes\n\nFor `tags-split` mode with multiple tag groups:\n\n```ts\noutput: {\n  mode: 'tags-split',\n  client: 'hono',\n  target: 'src/endpoints',\n  schemas: 'src/schemas',\n  override: {\n    hono: {\n      compositeRoute: 'src/routes.ts',\n      validatorOutputPath: 'src/endpoints/validator.ts',\n    },\n  },\n}\n```\n\nGenerated `routes.ts`:\n\n```ts\nimport { Hono } from 'hono';\nimport {\n  listPetsHandlers,\n  createPetsHandlers,\n  showPetByIdHandlers,\n} from './endpoints/pets/pets.handlers';\n\nconst app = new Hono();\n\napp.get('/pets', ...listPetsHandlers);\napp.post('/pets', ...createPetsHandlers);\napp.get('/pets/:petId', ...showPetByIdHandlers);\n\nexport default app;\n```\n\nWire it up in your app entry point:\n\n```ts\nimport { Hono } from 'hono';\nimport routes from './routes';\n\nconst app = new Hono();\napp.route('/', routes);\n\nexport default app;\n```\n\nWithout `compositeRoute` in `tags-split` mode, you must wire routes manually.\n\n## Zod Schema Options for Hono\n\nControl how Zod schemas are generated alongside Hono handlers:\n\n```ts\noverride: {\n  hono: {\n    handlers: 'src/handlers',\n  },\n  zod: {\n    strict: {\n      response: true,         // Add .strict() to response schemas\n    },\n    preprocess: {\n      response: {\n        name: 'stripNill',\n        path: './src/mutators.ts',\n      },\n    },\n  },\n}\n```\n\n```ts\n// src/mutators.ts\nexport const stripNill = (object: unknown) =>\n  !!object && typeof object === 'object' && !Array.isArray(object)\n    ? Object.fromEntries(\n        Object.entries(object).filter(\n          ([_, value]) => value !== null && value !== undefined,\n        ),\n      )\n    : object;\n```\n\n## Zod Schema Naming Conventions\n\n| Type             | Pattern                   | Example               |\n| ---------------- | ------------------------- | --------------------- |\n| Query params     | `{PascalName}QueryParams` | `ListPetsQueryParams` |\n| Path params      | `{PascalName}Params`      | `ShowPetByIdParams`   |\n| Request headers  | `{PascalName}Header`      | `ListPetsHeader`      |\n| Request body     | `{PascalName}Body`        | `CreatePetsBody`      |\n| Array body items | `{PascalName}BodyItem`    | `CreatePetsBodyItem`  |\n| Response         | `{PascalName}Response`    | `ListPetsResponse`    |\n\n## Full Examples\n\n### Split mode with handlers\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'src/handlers',\n        },\n        zod: {\n          strict: { response: true },\n          preprocess: {\n            response: {\n              name: 'stripNill',\n              path: './src/mutators.ts',\n            },\n          },\n        },\n      },\n    },\n  },\n});\n```\n\n### Tags-split with composite routes\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  api: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'tags-split',\n      client: 'hono',\n      target: 'src/endpoints',\n      schemas: 'src/schemas',\n      clean: true,\n      override: {\n        hono: {\n          compositeRoute: 'src/routes.ts',\n          validatorOutputPath: 'src/endpoints/validator.ts',\n        },\n      },\n    },\n  },\n});\n```\n\n### Hono server + Fetch client (full-stack)\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstoreClient: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'tags-split',\n      client: 'fetch',\n      target: 'next-app/app/gen/',\n      schemas: 'next-app/app/gen/models',\n      clean: true,\n      baseUrl: 'http://localhost:8787',\n      mocks: true,\n    },\n  },\n  petstoreApi: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'hono-app/src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'hono-app/src/handlers',\n        },\n      },\n    },\n  },\n});\n```\n\n## Key Behavioral Notes\n\n- **Handler files are never overwritten** — existing handlers are preserved, new operations are appended\n- **All other generated files are regenerated** on every run (routes, context, zod, validator)\n- **Response validation only runs for HTTP 200 with `application/json`** — other status codes pass through\n- **Cloudflare Workers** is the primary deployment target (use `wrangler dev`)\n- **Required dependencies**: `hono`, `@hono/zod-validator`, `zod`\n\n## Running\n\n```bash\n# Cloudflare Workers\nwrangler dev src/index.ts\n\n# Test\ncurl http://localhost:8787/pets\n```\n","isInternal":false,"tokens":2957,"sizeBytes":12281},{"name":"mocking-msw.md","path":"skills/orval/mocking-msw.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/mocking-msw.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# MSW Mock Generation\n\n```ts\noutput: {\n  mocks: true,\n  // or with options:\n  mocks: {\n    generators: [\n      {\n        type: 'msw',\n        delay: 1000,\n        delayFunctionLazyExecute: false,\n        useExamples: true,\n        generateEachHttpStatus: false,\n        baseUrl: 'https://api.example.com',\n        locale: 'en',\n        preferredContentType: 'application/json',\n      },\n    ],\n  },\n}\n```\n\n`mocks: true` is shorthand for `{ generators: [{ type: 'msw' }, { type: 'faker' }] }` and emits both `<file>.msw.ts` and `<file>.faker.ts`. Use `{ type: 'faker' }` alone for response-mock factories with no MSW dependency.\n\nGenerated mock handler:\n\n```ts\nexport const getShowPetByIdMockHandler = (\n  overrideResponse?: Pet | ((info: RequestHandlerOptions) => Promise<Pet>),\n  options?: RequestHandlerOptions,\n) => {\n  return http.get(\n    '*/pets/:petId',\n    async (info) => {\n      await delay(1000);\n      return HttpResponse.json(\n        overrideResponse !== undefined\n          ? typeof overrideResponse === 'function'\n            ? await overrideResponse(info)\n            : overrideResponse\n          : getShowPetByIdResponseMock(),\n        { status: 200 },\n      );\n    },\n    options,\n  );\n};\n\nexport const getShowPetByIdResponseMock = (\n  overrideResponse: Partial<Pet> = {},\n): Pet => ({\n  id: faker.number.int(),\n  name: faker.string.alpha(20),\n  tag: faker.string.alpha(20),\n  ...overrideResponse,\n});\n```\n\nContent-type aware responses — MSW handlers automatically use the correct helper:\n\n| Content type                          | Response helper                      |\n| ------------------------------------- | ------------------------------------ |\n| `application/json`                    | `HttpResponse.json()`                |\n| `application/xml`, `*+xml`            | `HttpResponse.xml()`                 |\n| `text/html`                           | `HttpResponse.html()`                |\n| `text/plain`, other `text/*`          | `HttpResponse.text()`                |\n| `application/octet-stream`, `image/*` | `HttpResponse.arrayBuffer()`         |\n| No body (204, etc.)                   | `new HttpResponse(null, { status })` |\n\n## Test Setup with Vitest\n\n```ts\nimport {\n  getListPetsMockHandler,\n  getShowPetByIdMockHandler,\n} from './api/petstore.msw';\nimport { setupServer } from 'msw/node';\n\nconst server = setupServer(...getListPetsMockHandler());\n\nbeforeAll(() => server.listen());\nafterEach(() => server.resetHandlers());\nafterAll(() => server.close());\n\n// Override for specific test\nit('handles empty list', () => {\n  server.use(getListPetsMockHandler([]));\n  // ...\n});\n\n// Dynamic response based on request\nit('returns pet by id', () => {\n  server.use(\n    getShowPetByIdMockHandler(async ({ params }) => ({\n      id: Number(params.petId),\n      name: 'Test Pet',\n    })),\n  );\n  // ...\n});\n```\n\n## Mock Customization\n\n```ts\noverride: {\n  mock: {\n    properties: {\n      '/tag|name/': 'jon',              // Regex match\n      email: () => faker.internet.email(),\n    },\n    format: {\n      email: () => faker.internet.email(),\n      iban: () => faker.finance.iban(),\n    },\n    required: true,\n    delay: 500,\n    arrayMin: 1,\n    arrayMax: 10,\n    stringMin: 10,\n    stringMax: 20,\n    numberMin: 0,\n    numberMax: 100,\n    fractionDigits: 2,\n  },\n}\n```\n\nPer-operation mock data:\n\n```ts\noverride: {\n  operations: {\n    listPets: {\n      mock: {\n        properties: () => ({\n          '[].id': () => faker.number.int({ min: 1, max: 99999 }),\n        }),\n      },\n    },\n    showPetById: {\n      mock: {\n        data: () => ({\n          id: faker.number.int({ min: 1, max: 99 }),\n          name: faker.person.firstName(),\n          tag: faker.helpers.arrayElement([faker.word.sample(), undefined]),\n        }),\n      },\n    },\n  },\n}\n```\n\n## Dynamic Mock Imports (indexMockFiles)\n\nIn `tags-split` mode, emit one `index.<ext>.ts` per generator entry (e.g. `index.msw.ts`, `index.faker.ts`):\n\n```ts\noutput: {\n  mode: 'tags-split',\n  mocks: {\n    indexMockFiles: true,\n    generators: [{ type: 'msw' }],\n  },\n}\n```\n","isInternal":false,"tokens":999,"sizeBytes":4053},{"name":"SKILL.md","path":"skills/orval/SKILL.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/SKILL.md","title":"orval","category":"anthropic-skill","format":"markdown","content":"---\nname: orval\ndescription: Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, MCP servers, and SolidStart actions from OpenAPI specs using Orval. Covers all clients (React/Vue/Svelte/Solid/Angular Query, Fetch, Axios), custom HTTP mutators, authentication patterns, NDJSON streaming, programmatic API, and advanced configuration.\n---\n\n# Orval - OpenAPI to TypeScript Code Generator\n\nOrval generates type-safe TypeScript clients, hooks, schemas, mocks, and server handlers from OpenAPI v3/Swagger v2 specifications.\n\n## Quick Start\n\n### Installation\n\n```bash\nnpm install orval -D\n# or yarn add orval -D\n# or pnpm add orval -D\n# or bun add orval -D\n```\n\n### Minimal Configuration\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: {\n      target: './petstore.yaml',\n    },\n    output: {\n      target: './src/api/petstore.ts',\n      schemas: './src/api/model',\n      client: 'react-query',\n    },\n  },\n});\n```\n\n### Run\n\n```bash\nnpx orval\nnpx orval --config ./orval.config.ts\nnpx orval --project petstore\nnpx orval --watch\n```\n\n## Choosing Your Setup\n\n### Client Selection Guide\n\n| Use Case                 | Client            | httpClient         | Notes                                   |\n| ------------------------ | ----------------- | ------------------ | --------------------------------------- |\n| React with server state  | `react-query`     | `fetch` or `axios` | TanStack Query hooks                    |\n| Vue 3 with server state  | `vue-query`       | `fetch` or `axios` | TanStack Query for Vue                  |\n| Svelte with server state | `svelte-query`    | `fetch` or `axios` | TanStack Query for Svelte               |\n| SolidJS standalone app   | `solid-query`     | `fetch` or `axios` | TanStack Query for Solid                |\n| SolidStart full-stack    | `solid-start`     | native fetch       | Uses `query()`/`action()` primitives    |\n| Angular with signals     | `angular-query`   | `angular`          | Injectable functions, signal reactivity |\n| Angular traditional      | `angular`         | —                  | HttpClient services                     |\n| React with SWR           | `swr`             | `fetch` or `axios` | Vercel SWR hooks                        |\n| Lightweight / Edge       | `fetch`           | —                  | Zero dependencies, works everywhere     |\n| Node.js / existing Axios | `axios-functions` | —                  | Factory functions (default)             |\n| Axios with DI            | `axios`           | —                  | Injectable Axios instance               |\n| Validation only          | `zod`             | —                  | Zod schemas, no HTTP client             |\n| Backend API server       | `hono`            | —                  | Hono handlers with Zod validation       |\n| AI agent tools           | `mcp`             | —                  | Model Context Protocol servers          |\n\n### Mode Selection Guide\n\n- **`single`** — Everything in one file. Best for small APIs.\n- **`split`** — Separate files: `petstore.ts`, `petstore.schemas.ts`, `petstore.msw.ts`. Good for medium APIs.\n- **`tags`** — One file per OpenAPI tag + shared schemas. Organizes by domain.\n- **`tags-split`** — Folder per tag with split files. Best for large APIs. Recommended.\n\n### httpClient Option\n\nFor `react-query`, `vue-query`, `svelte-query`, and `swr` clients:\n\n```ts\noutput: {\n  client: 'react-query',\n  httpClient: 'fetch',  // 'fetch' (default) | 'axios'\n}\n```\n\nFor `angular-query`:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',  // Uses Angular HttpClient\n}\n```\n\n## Configuration Reference\n\n### Config Structure\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  [projectName]: {\n    input: InputOptions,\n    output: OutputOptions,\n    hooks: HooksOptions,\n  },\n});\n```\n\nMultiple projects can share the same config file with different input/output settings.\n\n### Input Options\n\n```ts\ninput: {\n  target: './spec.yaml',              // Path or URL to OpenAPI spec (required)\n  override: {\n    transformer: './transform.js',    // Transform spec before generation\n  },\n  filters: {\n    mode: 'include',                  // 'include' | 'exclude'\n    tags: ['pets', /health/],         // Filter by OpenAPI tags\n    schemas: ['Pet', /Error/],        // Filter by schema names\n  },\n  parserOptions: {\n    headers: [                        // Auth headers for remote spec URLs\n      {\n        domains: ['api.example.com'],\n        headers: {\n          Authorization: 'Bearer YOUR_TOKEN',\n          'X-API-Key': 'your-api-key',\n        },\n      },\n    ],\n  },\n}\n```\n\n### Output Options\n\n```ts\noutput: {\n  target: './src/api/endpoints.ts',     // Output path (required)\n  client: 'react-query',               // Client type (see table above)\n  httpClient: 'fetch',                  // 'fetch' (default) | 'axios' | 'angular'\n  mode: 'tags-split',                   // 'single' | 'split' | 'tags' | 'tags-split'\n  schemas: './src/api/model',           // Output path for model types\n  operationSchemas: './src/api/params', // Separate path for operation-derived types\n  workspace: 'src/',                    // Base folder for all files\n  fileExtension: '.ts',                 // Custom file extension\n  namingConvention: 'camelCase',        // File naming: camelCase | PascalCase | snake_case | kebab-case\n  indexFiles: true,                     // Generate index.ts barrel files\n  clean: true,                          // Clean output before generating\n  prettier: true,                       // Format with Prettier\n  biome: true,                          // Format with Biome\n  headers: true,                        // Generate header parameters\n  baseUrl: '/api/v2',                   // API base URL\n  // or from spec:\n  // baseUrl: { getBaseUrlFromSpecification: true, index: 0, variables: { environment: 'api.dev' } },\n  mocks: true,                          // Generate MSW + Faker mocks (boolean, object, or function)\n  docs: true,                           // Generate TypeDoc documentation\n  // docs: { configPath: './typedoc.config.mjs' },\n  allParamsOptional: true,              // Make all params optional (except path params)\n  urlEncodeParameters: true,            // URL-encode path/query parameters\n  optionsParamRequired: false,          // Make options parameter required\n  propertySortOrder: 'Specification',   // 'Alphabetical' | 'Specification'\n  tsconfig: './tsconfig.json',          // Custom tsconfig path\n  override: { ... },                    // Advanced overrides (see below)\n}\n```\n\n### Multiple API Specs\n\n```ts\nexport default defineConfig({\n  petstoreV1: {\n    input: { target: './specs/v1.yaml' },\n    output: { target: 'src/api/v1', client: 'react-query' },\n  },\n  petstoreV2: {\n    input: { target: './specs/v2.yaml' },\n    output: { target: 'src/api/v2', client: 'react-query' },\n  },\n});\n```\n\n### Filter Endpoints\n\n```ts\ninput: {\n  target: './spec.yaml',\n  filters: {\n    mode: 'include',\n    tags: ['pets'],\n  },\n}\n```\n\n## Detailed Guides\n\nWhen the user's question involves a specific topic below, read the corresponding file from this skill's directory.\n\n| Topic                | File                                             | Load when user asks about...                                                                                            |\n| -------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |\n| TanStack Query / SWR | [tanstack-query.md](tanstack-query.md)           | React Query, Vue Query, Svelte Query, Solid Query, SWR, query hooks, invalidation, infinite queries, suspense, prefetch |\n| Angular              | [angular.md](angular.md)                         | Angular Query, Angular HttpClient, signals, inject functions, Angular services, providedIn                              |\n| SolidStart           | [solid-start.md](solid-start.md)                 | SolidStart, @solidjs/router, query(), action(), createAsync, revalidate                                                 |\n| Custom HTTP / Auth   | [custom-http-clients.md](custom-http-clients.md) | Custom mutator, authentication, tokens, interceptors, custom fetch/axios, baseURL, hook-based mutator                   |\n| Zod Validation       | [zod-validation.md](zod-validation.md)           | Zod schemas, validation, runtime validation, coerce, strict, preprocess                                                 |\n| Mocking / MSW        | [mocking-msw.md](mocking-msw.md)                 | MSW mocks, testing, test setup, faker, Vitest, mock handlers, useExamples                                               |\n| Hono Server          | [hono.md](hono.md)                               | Hono handlers, zValidator, composite routes, context types, server-side generation                                      |\n| Advanced Config      | [advanced-config.md](advanced-config.md)         | Type generation, enums, per-operation overrides, FormData, JSDoc, params serializer, full example                       |\n| Tooling / Workflow   | [tooling-workflow.md](tooling-workflow.md)       | Programmatic API, transformers, hooks, NDJSON streaming, MCP, afterAllFilesWrite                                        |\n\n## OpenAPI Specification Best Practices\n\n1. **Use unique `operationId`** for every operation — Orval uses these for function and hook names\n2. **Define reusable schemas** in `components/schemas` — reduces duplication in generated types\n3. **Use tags** to group operations — works with `tags` and `tags-split` modes\n4. **Define response types** for all operations — enables full type safety\n5. **Mark required fields** — affects optional/required in generated TypeScript interfaces\n6. **Use `x-enumNames`** for numeric enums — generates readable const names\n7. **Provide `example` values** — used by mock generation when `useExamples: true`\n8. **Use `application/x-ndjson`** content type for streaming endpoints — enables typed NDJSON generation\n\n## CLI Reference\n\n```bash\norval                                    # Generate using auto-discovered config\norval --config ./api/orval.config.ts     # Specify config file\norval --project petstore                 # Run specific project(s)\norval --watch                            # Watch mode\norval --watch ./src                      # Watch specific directory\norval --clean                            # Clean generated files\norval --prettier                         # Format with Prettier\norval --biome                            # Format with Biome\norval --tsconfig ./src/tsconfig.json     # Custom tsconfig path\norval --mode split                       # Override output mode\norval --client react-query               # Override client\norval --mock                             # Override mock generation\norval --input ./spec.yaml --output ./api.ts  # Direct generation\n```\n\n## Resources\n\n- [Documentation](https://orval.dev)\n- [GitHub](https://github.com/orval-labs/orval)\n- [Sample Projects](https://github.com/orval-labs/orval/tree/master/samples)\n","frontmatter":{"name":"orval","description":"Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, MCP servers, and SolidStart actions from OpenAPI specs using Orval. Covers all clients (React/Vue/Svelte/Solid/Angular Query, Fetch, Axios), custom HTTP mutators, authentication patterns, NDJSON streaming, programmatic API, and advanced configuration."},"isInternal":false,"tokens":2473,"sizeBytes":11221},{"name":"solid-start.md","path":"skills/orval/solid-start.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/solid-start.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# SolidStart Client\n\nUses native SolidStart primitives (`query()` and `action()` from `@solidjs/router`) instead of TanStack Query.\n\n```ts\noutput: {\n  client: 'solid-start',\n  mode: 'tags-split',\n  target: 'src/api/petstore.ts',\n  schemas: 'src/api/model',\n  mocks: true,\n}\n```\n\nGenerated output:\n\n```ts\nimport { query, action } from '@solidjs/router';\n\nexport const SwaggerPetstore = {\n  // GET requests -> query() with automatic caching\n  listPets: query(async (params: ListPetsParams) => {\n    const queryString = new URLSearchParams(params as any).toString();\n    const url = queryString ? `/pets?${queryString}` : `/pets`;\n    const response = await fetch(url, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\n    return response.json() as Promise<Pets>;\n  }, 'listPets'),\n\n  // POST/PUT/PATCH/DELETE -> action() (mutations, not cached)\n  createPets: action(async (createPetsBody: CreatePetsBody) => {\n    const response = await fetch('/pets', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(createPetsBody),\n    });\n    return response.json() as Promise<Pet>;\n  }, 'createPets'),\n};\n```\n\n## Cache Invalidation\n\n```ts\nimport { revalidate } from '@solidjs/router';\n\n// Invalidate all instances of a query\nrevalidate(SwaggerPetstore.listPets.key);\n\n// Invalidate specific call by arguments\nrevalidate(SwaggerPetstore.showPetById.keyFor('pet-123'));\n```\n\n## Usage with Components\n\n```tsx\nimport { createAsync } from '@solidjs/router';\nimport { Suspense } from 'solid-js';\n\nfunction PetDetails(props: { petId: string }) {\n  const pet = createAsync(() => SwaggerPetstore.showPetById(props.petId));\n  return (\n    <Suspense fallback={<div>Loading...</div>}>\n      <h1>{pet()?.name}</h1>\n    </Suspense>\n  );\n}\n\n// Actions work with HTML forms\n<form action={SwaggerPetstore.createPets} method=\"post\">\n  <input name=\"name\" required />\n  <button type=\"submit\">Create Pet</button>\n</form>;\n\n// Or programmatically\nfunction DeletePetButton(props: { petId: string }) {\n  const deletePet = useAction(SwaggerPetstore.deletePetById);\n  return <button onClick={() => deletePet(props.petId)}>Delete</button>;\n}\n```\n","isInternal":false,"tokens":572,"sizeBytes":2279},{"name":"tanstack-query.md","path":"skills/orval/tanstack-query.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/tanstack-query.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# TanStack Query / SWR Clients\n\n## React Query / TanStack Query\n\n```ts\noutput: {\n  client: 'react-query',\n  override: {\n    query: {\n      useQuery: true,\n      useMutation: true,\n      useInfinite: true,\n      useInfiniteQueryParam: 'cursor',\n      useSuspenseQuery: true,\n      useSuspenseInfiniteQuery: true,\n      usePrefetch: true,\n      useInvalidate: true,\n      signal: true,\n      shouldExportKeys: true,\n      shouldSplitQueryKey: false,       // Array vs string query keys\n      useOperationIdAsQueryKey: false,  // Use operationId instead of route path\n      options: { staleTime: 10000 },\n      mutationInvalidates: [\n        {\n          onMutations: ['createPets'],\n          invalidates: ['listPets'],\n        },\n        {\n          onMutations: ['deletePet', 'updatePet'],\n          invalidates: [\n            'listPets',\n            { query: 'showPetById', params: ['petId'] },\n          ],\n        },\n      ],\n    },\n  },\n}\n```\n\nGenerated hooks:\n\n```ts\n// Query hook with automatic query key\nexport const useShowPetById = <TData = Pet, TError = Error>(\n  petId: string,\n  options?: { query?: UseQueryOptions<Pet, TError, TData> },\n) => {\n  const queryKey = getShowPetByIdQueryKey(petId);\n  const queryFn = () => showPetById(petId);\n  return useQuery({ queryKey, queryFn, enabled: !!petId, ...options?.query });\n};\n\n// Exported query key for manual invalidation\nexport const getShowPetByIdQueryKey = (petId: string) => [`/pets/${petId}`];\n```\n\n## Vue Query\n\n```ts\noutput: {\n  client: 'vue-query',\n  // Same override.query options as React Query\n}\n```\n\n## Svelte Query\n\n```ts\noutput: {\n  client: 'svelte-query',\n  // Same override.query options as React Query\n}\n```\n\n## Solid Query\n\nFor standalone SolidJS apps (not SolidStart):\n\n```ts\noutput: {\n  client: 'solid-query',\n  // Same override.query options as React Query\n}\n```\n\n## SWR\n\n```ts\noutput: {\n  client: 'swr',\n  override: {\n    swr: {\n      useInfinite: true,\n      useSuspense: true,\n      useSWRMutationForGet: false,\n      generateErrorTypes: false,\n      swrOptions: { dedupingInterval: 10000 },\n      swrMutationOptions: { revalidate: true },\n      swrInfiniteOptions: { initialSize: 10 },\n    },\n  },\n}\n```\n\n## Query Invalidation Patterns\n\nBasic invalidation:\n\n```ts\noverride: {\n  query: {\n    useInvalidate: true,\n    mutationInvalidates: [\n      {\n        onMutations: ['createPets'],\n        invalidates: ['listPets'],\n      },\n    ],\n  },\n}\n```\n\nAdvanced invalidation with params and cross-file references:\n\n```ts\nmutationInvalidates: [\n  {\n    onMutations: ['deletePet', 'updatePet', 'patchPet'],\n    invalidates: [\n      'listPets',\n      { query: 'showPetById', params: ['petId'] },\n      { query: 'adminPets', file: './admin' },\n    ],\n  },\n  {\n    onMutations: ['uploadFile'],\n    invalidates: ['listPets'],\n  },\n],\n```\n\nReset mode (reset query state instead of refetch):\n\n```ts\ninvalidates: [\n  { query: 'showPetById', params: ['petId'], invalidationMode: 'reset' },\n],\n```\n\nSkip invalidation at runtime:\n\n```ts\nconst deletePet = useDeletePet({\n  mutation: {\n    onSuccess: () => {\n      // Custom invalidation logic\n      queryClient.invalidateQueries({ queryKey: getListPetsQueryKey() });\n    },\n  },\n  skipInvalidation: true,\n});\n```\n","isInternal":false,"tokens":866,"sizeBytes":3226},{"name":"tooling-workflow.md","path":"skills/orval/tooling-workflow.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/tooling-workflow.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# Tooling & Workflow\n\n## MCP (AI Agent Tools)\n\nGenerate Model Context Protocol servers from OpenAPI specs for AI agent integration (Claude, Cline, etc.):\n\n```ts\noutput: {\n  mode: 'single',       // ONLY works in single mode\n  client: 'mcp',\n  baseUrl: 'https://petstore3.swagger.io/api/v3',\n  target: 'src/handlers.ts',\n  schemas: 'src/http-schemas',\n}\n```\n\nGenerated files:\n\n- `src/http-schemas/` — TypeScript types\n- `src/handlers.ts` — Handler functions returning MCP format\n- `src/http-client.ts` — Generated fetch client\n- `src/server.ts` — MCP tools and server configuration\n- `src/tool-schemas.zod.ts` — Zod schemas for tool inputs\n\nDeploy with Docker and configure in your MCP client (e.g. Cline's `mcpServers` config).\n\n## NDJSON Streaming\n\nType-safe newline-delimited JSON streaming. Only supported with Fetch client.\n\nOpenAPI schema:\n\n```yaml\npaths:\n  /stream:\n    get:\n      responses:\n        '200':\n          content:\n            application/x-ndjson:\n              schema:\n                $ref: '#/components/schemas/StreamEntry'\n```\n\nGenerated types and function:\n\n```ts\nexport type streamResponse200 = {\n  stream: TypedResponse<StreamEntry>;\n  status: 200;\n};\n\nexport const stream = async (\n  options?: RequestInit,\n): Promise<streamResponse> => {\n  const stream = await fetch(getStreamUrl(), {\n    ...options,\n    method: 'GET',\n    headers: { Accept: 'application/x-ndjson', ...options?.headers },\n  });\n  return {\n    status: stream.status,\n    stream,\n    headers: stream.headers,\n  } as streamResponse;\n};\n```\n\nReading the stream:\n\n```ts\nexport const readStream = <T extends object>(\n  response: Response & { json(): Promise<T> },\n  processLine: (value: T) => void,\n): Promise<void> => {\n  if (!response.body) return Promise.resolve();\n  const stream = response.body.getReader();\n  const decoder = new TextDecoder();\n  let buffer = '';\n\n  const loop = (): Promise<void> =>\n    stream.read().then(({ done, value }) => {\n      if (done) {\n        if (buffer.length > 0) processLine(JSON.parse(buffer));\n        return;\n      }\n      buffer += decoder.decode(value, { stream: true });\n      const parts = buffer.split(/\\r?\\n/);\n      buffer = parts.pop() ?? '';\n      for (const part of parts.filter(Boolean)) {\n        processLine(JSON.parse(part) as T);\n      }\n      return loop();\n    });\n  return loop();\n};\n\n// Usage\nconst results: StreamEntry[] = [];\nconst response = await stream();\nif (response.status === 200) {\n  await readStream(response.stream, (obj) => results.push(obj));\n}\n```\n\n## Input Transformers\n\nTransform the OpenAPI spec before generation:\n\n```ts\ninput: {\n  target: './spec.yaml',\n  override: {\n    transformer: './transformers/add-auth-header.js',\n  },\n}\n```\n\n```js\n// add-auth-header.js\nmodule.exports = (openAPIDocument) => {\n  // Modify and return the spec\n  return openAPIDocument;\n};\n```\n\n## Hooks (afterAllFilesWrite)\n\nRun scripts after Orval generates files:\n\n```ts\nexport default defineConfig({\n  petstore: {\n    input: './petstore.yaml',\n    output: './petstore.ts',\n    hooks: {\n      afterAllFilesWrite: 'prettier --write',\n    },\n  },\n});\n```\n\nMultiple commands:\n\n```ts\nhooks: {\n  afterAllFilesWrite: ['prettier --write', 'eslint --fix'],\n}\n```\n\nDisable file path injection:\n\n```ts\nhooks: {\n  afterAllFilesWrite: {\n    command: 'prettier --write .',\n    injectGeneratedDirsAndFiles: false,\n  },\n}\n```\n\n## Programmatic API\n\nUse Orval programmatically in build scripts:\n\n```ts\nimport { generate } from 'orval';\n\n// From config file\nawait generate('./orval.config.ts');\n\n// With direct configuration\nimport type { Options } from 'orval';\n\nconst config: Options = {\n  input: { target: './api-spec.yaml' },\n  output: { target: './src/api.ts', client: 'axios' },\n};\nawait generate(config);\n```\n\nWith global options override:\n\n```ts\nimport { generate, type GlobalOptions } from 'orval';\n\nconst globalOptions: GlobalOptions = {\n  watch: true,\n  // watch: ['./specs/*.yaml'],   // Watch specific patterns\n  clean: true,\n  prettier: true,\n  client: 'fetch',\n  mode: 'split',\n  mocks: true,\n  tsconfig: './tsconfig.json',\n};\n\nawait generate('./orval.config.ts', process.cwd(), globalOptions);\n```\n\nFunction signature:\n\n```ts\nfunction generate(\n  optionsExport?: string | OptionsExport,\n  workspace?: string,\n  options?: GlobalOptions,\n): Promise<void>;\n```\n\nBuild script integration:\n\n```json\n{\n  \"scripts\": {\n    \"generate\": \"node scripts/generate-api.js\",\n    \"dev\": \"npm run generate && next dev\",\n    \"build\": \"npm run generate && next build\"\n  }\n}\n```\n\n```js\n// scripts/generate-api.js\nconst { generate } = require('orval');\n\nasync function main() {\n  try {\n    await generate();\n    console.log('API client generated successfully');\n  } catch (error) {\n    console.error('Failed to generate API client:', error);\n    process.exit(1);\n  }\n}\n\nmain();\n```\n","isInternal":false,"tokens":1207,"sizeBytes":4813},{"name":"zod-validation.md","path":"skills/orval/zod-validation.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/orval/zod-validation.md","title":"Orval Skill","category":"anthropic-skill","format":"markdown","content":"# Zod Schema Generation\n\n## Standalone Zod Schemas\n\n```ts\noutput: {\n  client: 'zod',\n  target: './src/api/schemas',\n}\n```\n\nGenerated:\n\n```ts\nexport const createPetsBody = zod.object({\n  id: zod.number(),\n  name: zod.string(),\n  tag: zod.string().optional(),\n});\n```\n\n## Combined with HTTP Client\n\n```ts\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'react-query',\n      target: 'src/api/endpoints',\n      schemas: 'src/api/models',\n    },\n  },\n  petstoreZod: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'zod',\n      target: 'src/api/endpoints',\n      fileExtension: '.zod.ts', // Avoid filename conflicts\n    },\n  },\n});\n```\n\n## Zod Options\n\n```ts\noverride: {\n  zod: {\n    strict: {\n      response: true,\n      query: true,\n      param: true,\n      header: true,\n      body: true,\n    },\n    coerce: {\n      query: ['string', 'number', 'boolean'],\n    },\n    generate: {\n      param: true,\n      body: true,\n      response: true,\n      query: true,\n      header: true,\n    },\n    preprocess: {\n      response: {\n        name: 'stripNill',\n        path: './src/mutators.ts',\n      },\n    },\n    generateEachHttpStatus: true,\n    dateTimeOptions: { ... },\n    timeOptions: { ... },\n  },\n}\n```\n\nPreprocess example for stripping null/undefined before validation:\n\n```ts\nexport const stripNill = (object: unknown) =>\n  !!object && typeof object === 'object' && !Array.isArray(object)\n    ? Object.fromEntries(\n        Object.entries(object).filter(\n          ([_, value]) => value !== null && value !== undefined,\n        ),\n      )\n    : object;\n```\n\n## Runtime Validation with Fetch Client\n\n```ts\noutput: {\n  client: 'fetch',\n  override: {\n    fetch: {\n      runtimeValidation: true,  // Validate responses with Zod schemas\n    },\n  },\n}\n```\n","isInternal":false,"tokens":483,"sizeBytes":1835},{"name":"README.md","path":"skills/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/skills/README.md","title":"Skills Skill","category":"anthropic-skill","format":"markdown","content":"# Orval AI Agent Skills\n\nOfficial AI agent skill for generating type-safe API clients, hooks, schemas, mocks, and server handlers from OpenAPI specs using [Orval](https://orval.dev).\n\nSkills are automatically discovered and used by the agent based on context — they don't appear in slash-command menus.\n\n## Installation\n\n### Claude Code\n\n```bash\n/plugin marketplace add orval-labs/orval\n```\n\n### Cursor\n\nAdd a remote GitHub rule pointing to this repository.\n\n### Any agent (skills.sh)\n\n```bash\nnpx skills add orval-labs/orval\n```\n\n## What's Included\n\nThe `orval` skill covers:\n\n- All clients: React/Vue/Svelte/Solid/Angular Query, SWR, Fetch, Axios, Hono, MCP\n- Zod schema generation and runtime validation\n- MSW mock generation with test setup patterns\n- Custom HTTP mutators and authentication patterns\n- Hono server handlers with response validation\n- NDJSON streaming, programmatic API, and advanced configuration\n\n## Structure\n\n```\nskills/orval/\n├── SKILL.md               # Core skill (always loaded)\n├── tanstack-query.md      # React/Vue/Svelte/Solid Query, SWR\n├── angular.md             # Angular Query and HttpClient\n├── solid-start.md         # SolidStart query/action primitives\n├── hono.md                # Hono server handlers\n├── custom-http-clients.md # Custom mutators, auth patterns\n├── zod-validation.md      # Zod schema generation\n├── mocking-msw.md         # MSW mocks and test setup\n├── advanced-config.md     # Type generation, overrides, enums\n└── tooling-workflow.md    # MCP, NDJSON, hooks, programmatic API\n```\n\nReference files are loaded on demand when the user's question matches the topic.\n","isInternal":false,"tokens":395,"sizeBytes":1684},{"name":"marketplace.json","path":".claude-plugin/marketplace.json","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/.claude-plugin/marketplace.json","title":"orval","category":"marketplace","format":"json","content":"{\n  \"name\": \"orval\",\n  \"description\": \"Orval's official plugin for Claude Code\",\n  \"plugins\": {\n    \"orval\": {\n      \"name\": \"orval\",\n      \"source\": \"./skills/orval\",\n      \"description\": \"Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, and MCP servers from OpenAPI specs\"\n    }\n  }\n}\n","frontmatter":{"name":"orval","description":"Orval's official plugin for Claude Code","plugins":{"orval":{"name":"orval","source":"./skills/orval","description":"Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, and MCP servers from OpenAPI specs"}}},"isInternal":false,"tokens":95,"sizeBytes":342},{"name":"README.md","path":"packages/angular/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/angular/README.md","title":"angular Documentation","category":"plugin-manifest","format":"markdown","content":"# `@orval/angular`\n\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n![orval - Restful Client Generator](../../logo/orval-logo-horizontal.svg?raw=true)\n\nAngular generator support for [Orval](https://orval.dev).\n\nThis package powers Orval's Angular output and is responsible for generating:\n\n- injectable Angular `HttpClient` service classes\n- signal-first Angular `httpResource` helpers\n- mixed `both` mode output with service classes plus sibling `*.resource.ts`\n  files\n- Angular-specific response typing, request options, runtime validation, and\n  helper utilities\n\nIn most application projects you configure Angular output through the main\n`orval` package. This package exists so the Angular generator can be versioned,\ntested, and consumed as a standalone builder inside the Orval monorepo.\n\nVisit [orval.dev](https://orval.dev) for guides, API docs, and examples.\n\n## What it generates\n\n`@orval/angular` supports three Angular retrieval modes through\n`override.angular.retrievalClient` (or the legacy `override.angular.client`\nalias):\n\n| Mode           | Generated output                                               | Best for                                                    |\n| -------------- | -------------------------------------------------------------- | ----------------------------------------------------------- |\n| `httpClient`   | Retrievals stay on injectable Angular service classes          | Conventional service-based Angular APIs                     |\n| `httpResource` | Signal-first resource helpers for retrieval-style operations   | Angular apps using signals for read flows                   |\n| `both`         | Service classes plus sibling `*.resource.ts` retrieval helpers | Projects that want signal-first reads and imperative writes |\n\nMutation-style operations continue to use generated `HttpClient` service\nmethods by default unless a per-operation override changes classification.\n\nIf `override.angular.retrievalClient` is omitted, Angular generation defaults to\n`httpClient` mode.\n\n## Example configuration\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: {\n      target: './petstore.yaml',\n    },\n    output: {\n      client: 'angular',\n      target: 'src/api/petstore.ts',\n      schemas: 'src/api/model',\n      mode: 'tags-split',\n      override: {\n        angular: {\n          retrievalClient: 'httpResource',\n          runtimeValidation: true,\n        },\n      },\n    },\n  },\n});\n```\n\nFor end-user docs and richer examples, see:\n\n- [Angular guide](https://orval.dev/guides/angular)\n- [Angular sample app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n\n## Angular-specific features\n\nThis package includes support for:\n\n- `HttpClient` observe overload generation\n- signal-based parameter generation for `httpResource`\n- multi-content-type response branching via generated `Accept` helpers\n- Zod-backed runtime validation for Angular output\n- resource option helpers such as `defaultValue`, `debugName`, `injector`, and\n  `equal`\n- generated `ClientResult` / `ResourceResult` aliases\n- `ResourceState<T>` and `toResourceState()` helpers for resource integration\n\n## Development\n\nUseful package-local scripts:\n\n- `pnpm --filter @orval/angular build`\n- `pnpm --filter @orval/angular test`\n- `pnpm --filter @orval/angular lint`\n- `pnpm --filter @orval/angular typecheck`\n\n## More samples\n\nYou can explore additional Orval samples here:\n\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":981,"sizeBytes":4438},{"name":"README.md","path":"packages/axios/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/axios/README.md","title":"axios Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":450,"sizeBytes":1654},{"name":"README.md","path":"packages/core/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/core/README.md","title":"core Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":447,"sizeBytes":1641},{"name":"README.md","path":"packages/effect/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/effect/README.md","title":"effect Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# @orval/effect\n\nGenerates [Effect Schema](https://effect.website/docs/schema/introduction/) validators from OpenAPI specifications.\n\n## Install\n\n```sh\nnpm install -D @orval/effect\nnpm install effect\n```\n\n`effect` is a peer dependency (`>=3.10`, Effect 4 included). `@orval/effect` does not bundle it, and generates Effect 3 or Effect 4 syntax to match the installed version.\n\n## Usage\n\nSet `client: 'effect'` in your `orval.config`:\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'effect',\n      target: './src/api/schemas',\n      mode: 'single',\n    },\n  },\n});\n```\n\n## Generated output\n\n```ts\nimport { Schema as S } from 'effect';\n\nexport const ListPetsQueryParams = S.Struct({\n  limit: S.optional(S.String).annotations({\n    description: 'How many items to return at one time (max 100)',\n  }),\n});\n```\n\nSee the [Effect guide](https://orval.dev/guides/effect) and the [`swr-with-effect` sample](https://github.com/orval-labs/orval/tree/master/samples/swr-with-effect) for more.\n\n## Why Effect alongside Zod?\n\n`@orval/effect` mirrors `@orval/zod`'s output shape, but Effect Schemas bring capabilities Zod can't:\n\n- **Encoded vs decoded type duality** — `Schema.Type<S>` (runtime) and `Schema.Encoded<S>` (wire) are distinct; `Schema.encode` round-trips back to the wire shape.\n- **Branded types as a generator option** — `override.effect.useBrandedTypes: true` turns named schemas into Effect brands for nominal-typed IDs without hand-writing `.brand<...>()`.\n- **First-class annotations** — OpenAPI `description`, `title`, `examples` flow into `S.annotations(...)` and stay queryable at the AST level.\n- **AST, not method chains** — schemas are introspectable artifacts, composable structurally by downstream tooling.\n- **Effect runtime integration** — decoded results pipe straight into Effect's typed-error / retry / concurrency primitives.\n\n## Configuration\n\nOptions are read from `override.effect.*`:\n\n- `strict` — fail on extra fields in object schemas\n- `generate` — fine-grained control over which schemas (params/body/response) are emitted\n- `useBrandedTypes` — map named schemas to branded types\n- `generateEachHttpStatus` — emit a schema per response status code\n","isInternal":false,"tokens":626,"sizeBytes":2501},{"name":"README.md","path":"packages/fetch/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/fetch/README.md","title":"fetch Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [nx fastify react](https://github.com/orval-labs/orval/tree/master/samples/nx-fastify-react)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":477,"sizeBytes":1749},{"name":"README.md","path":"packages/hono/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/hono/README.md","title":"hono Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":450,"sizeBytes":1654},{"name":"README.md","path":"packages/mcp/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/mcp/README.md","title":"mcp Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### How to use the generated mcp server\n\nAdd a setting to the mcp client to launch the generated `server.ts`.\nFor example, like this:\n\n```\n\"pet-store-server\": {\n  \"command\": \"docker\",\n  \"args\": [\n    \"run\",\n    \"-i\",\n    \"--rm\",\n    \"pet-store-mcp\",\n    \"bash\",\n    \"-c\",\n    \"ts-node\",\n    \"src/gen/server.ts\"\n  ],\n  \"disabled\": false,\n  \"alwaysAllow\": []\n}\n```\n\nHere, `src/gen/server.ts` is started using `Docker`.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":573,"sizeBytes":2072},{"name":"README.md","path":"packages/mock/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/mock/README.md","title":"mock Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restful Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":450,"sizeBytes":1653},{"name":"README.md","path":"packages/orval/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/orval/README.md","title":"orval Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/orval-labs/orval/master/logo/orval-logo-horizontal.svg\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [pinia colada](https://github.com/orval-labs/orval/tree/master/samples/pinia-colada)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":485,"sizeBytes":1784},{"name":"README.md","path":"packages/query/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/query/README.md","title":"query Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":450,"sizeBytes":1654},{"name":"README.md","path":"packages/solid-start/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/solid-start/README.md","title":"solid-start Documentation","category":"plugin-manifest","format":"markdown","content":"# @orval/solid-start\n\nSolidStart client for Orval - generates type-safe API client code using SolidStart primitives.\n\n## Features\n\n- ✅ Generates SolidStart `query()` for GET requests\n- ✅ Generates SolidStart `action()` for mutations (POST, PUT, PATCH, DELETE)\n- ✅ Type-safe API calls\n- ✅ Full TypeScript support\n- ✅ Works with SolidStart's server-side execution model\n- ✅ Uses native Fetch API by default\n- ✅ Supports custom mutators with Fetch API signature\n\n## Installation\n\n```bash\nnpm install @orval/solid-start\n# or\nbun add @orval/solid-start\n# or\npnpm add @orval/solid-start\n```\n\n## Usage\n\nIn your Orval configuration file:\n\n```typescript\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    output: {\n      target: './src/api/endpoints.ts',\n      schemas: './src/api/model',\n      client: 'solid-start',\n    },\n    input: {\n      target: './petstore.yaml',\n    },\n  },\n});\n```\n\n## Generated Code\n\nFor GET requests, Orval generates SolidStart queries:\n\n```typescript\nexport const PetstoreApi = {\n  getPets: query(async (limit?: number) => {\n    const response = await fetch(`/api/pets?limit=${limit}`, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json() as Promise<Pet[]>;\n  }, 'getPets'),\n};\n```\n\nFor mutations (POST, PUT, PATCH, DELETE), Orval generates SolidStart actions:\n\n```typescript\nexport const PetstoreApi = {\n  createPet: action(async (pet: Pet) => {\n    const response = await fetch(`/api/pets`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(pet),\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json() as Promise<Pet>;\n  }, 'createPet'),\n};\n```\n\n## Using in Your SolidStart App\n\n```typescript\nimport { PetstoreApi } from './api/endpoints';\n\n// In a component\nfunction Pets() {\n  const pets = createAsync(() => PetstoreApi.getPets(10));\n\n  return (\n    <div>\n      <For each={pets()}>\n        {(pet) => <div>{pet.name}</div>}\n      </For>\n    </div>\n  );\n}\n\n// For mutations\nfunction CreatePet() {\n  const createPet = useAction(PetstoreApi.createPet);\n\n  const handleSubmit = async (formData: FormData) => {\n    await createPet({ name: formData.get('name') as string });\n  };\n\n  return <form action={handleSubmit}>...</form>;\n}\n```\n\n## Comparison with solid-query\n\n- **@orval/solid-start**: Uses native SolidStart primitives (`query`, `action`) for server-side data fetching\n- **@orval/solid-query**: Uses TanStack Solid Query (`createQuery`, `createMutation`) for client-side data management\n\nChoose `solid-start` when you want to leverage SolidStart's built-in server functions and caching.\nChoose `solid-query` when you need advanced client-side query management features like automatic refetching, optimistic updates, etc.\n","isInternal":false,"tokens":736,"sizeBytes":2984},{"name":"README.md","path":"packages/swr/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/swr/README.md","title":"swr Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":450,"sizeBytes":1654},{"name":"README.md","path":"packages/zod/README.md","rawUrl":"https://raw.githubusercontent.com/orval-labs/orval/HEAD/packages/zod/README.md","title":"zod Documentation","category":"plugin-manifest","format":"markdown","content":"[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n","isInternal":false,"tokens":450,"sizeBytes":1654}],"systemPromptSnippet":"<yakaai_skills repo=\"orval-labs/orval\">\n<!-- File: AGENTS.md (Tokens: ~445 | Category: root-instruction) -->\n<!--VITE PLUS START-->\n\n# Using Vite+, the Unified Toolchain for the Web\n\nThis project is using Vite+, a unified toolchain built on top of Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, and Vite Task. Vite+ wraps runtime management, package management, and frontend tooling in a single global CLI called `vp`. Vite+ is distinct from Vite, and it invokes Vite through `vp dev` and `vp build`. Run `vp help` to print a list of commands and `vp <command> --help` for information about a specific command.\n\nDocs are local at `node_modules/vite-plus/docs` or online at https://viteplus.dev/guide/.\n\n## Built-in Commands vs Scripts\n\n`vp <name>` runs a built-in command. `vp run <name>` runs a `package.json` script or a `vite.config.ts` task. Scripts cannot overwrite built-ins, so `vp dev` and `vp run dev` may do different things. Check `package.json` and `vite.config.ts` first, and run `vp run <name>` when the project defines a script or task with that name.\n\n## Tool Versions\n\nRun `vp toolchain` to show versions and relationships in the active Vite+\nrelease. Add a tool name to select part of the graph. For example, run\n`vp toolchain vite`. Use `--global` to ignore the local `vite-plus` package. Use\n`vp why <package>` to show the package-manager dependency graph.\n\n## Review Checklist\n\n- [ ] Run `vp install` after pulling remote changes and before getting started.\n- [ ] Run `vp check` and `vp test` to format, lint, type check and test changes.\n- [ ] Check if there are `vite.config.ts` tasks or `package.json` scripts necessary for validation, run via `vp run <script>`.\n- [ ] If setup, runtime, or package-manager behavior looks wrong, run `vp env doctor` and include its output when asking for help.\n\n<!--VITE PLUS END-->\n\n<!-- File: skills/orval/advanced-config.md (Tokens: ~1677 | Category: anthropic-skill) -->\n# Advanced Configuration\n\n## Type Generation Options\n\n```ts\noverride: {\n  // Enum generation\n  enumGenerationType: 'const',    // 'const' (default) | 'enum' | 'union'\n\n  // Type preferences\n  useTypeOverInterfaces: false,   // Use type instead of interface\n  useNamedParameters: false,      // Named params object vs positional args\n  useDates: false,                // Convert date/datetime to Date objects\n  useBigInt: false,               // Convert int64/uint64 to BigInt\n  useDeprecatedOperations: true,  // Include deprecated operations\n  useNullForOptional: false,      // Type optional as T | null\n  aliasCombinedTypes: false,      // Create intermediate type aliases for anyOf/oneOf/allOf\n  suppressReadonlyModifier: false, // Suppress readonly modifier\n\n  // Naming\n  components: {\n    schemas: { suffix: 'DTO' },\n    responses: { suffix: 'Response' },\n    parameters: { suffix: 'Params' },\n    requestBodies: { suffix: 'Bodies' },\n  },\n\n  // Custom operation names\n  operationName: (operation, route, verb) => `custom_${operation.operationId}`,\n\n  // Property key naming convention\n  namingConvention: {\n    enum: 'PascalCase',  // camelCase | PascalCase | snake_case | kebab-case\n  },\n\n  // File header\n  header: (info) => [\n    'Generated by Orval',\n    'Do not edit manually.',\n    ...(info.title ? [info.title] : []),\n  ],\n  // header: false,  // Disable header\n\n  // Service title (axios and angular clients only)\n  title: (title) => `${title}Api`,\n}\n```\n\n## Enum Extensions\n\nUse OpenAPI extensions for meaningful enum names and descriptions:\n\n```yaml\nmyEnum:\n  type: number\n  enum: [1, 2, 3]\n  x-enumNames: [Active, Inactive, Pending]\n  x-enumDescriptions:\n    - User is active\n    - User is inactive\n    - User is pending approval\n```\n\nGenerated output:\n\n```ts\nexport const MyEnum = {\n  /** User is active */\n  Active: 1,\n  /** User is inactive */\n  Inactive: 2,\n  /** User is pending approval */\n  Pending: 3,\n} as const;\n\nexport type MyEnum = (typeof MyEnum)[keyof typeof MyEnum];\n```\n\nSupported extension variants: `x-enumNames`, `x-enumnames`, `x-enum-varnames` for names; `x-enumDescriptions`, `x-enumdescriptions`, `x-enum-descriptions` for descriptions.\n\nNote: Enum descriptions only work with `enumGenerationType: 'const'` (default).\n\n## Per-Operation Overrides\n\n```ts\noverride: {\n  operations: {\n    listPets: {\n      mutator: 'src/response-type.js',\n      query: {\n        useInfinite: true,\n        useInfiniteQueryParam: 'cursor',\n        useSuspenseQuery: true,\n        options: { staleTime: 60000 },\n      },\n      mock: {\n        data: () => ({ id: 1, name: 'Buddy' }),\n      },\n    },\n  },\n}\n```\n\n## Per-Tag Overrides\n\nSame options as per-operation but scoped by OpenAPI tag:\n\n```ts\noverride: {\n  tags: {\n    pets: {\n      mutator: {\n        path: '../mutators/use-custom-instance.ts',\n        name: 'useCustomInstance',\n      },\n      query: {\n        useInfinite: true,\n      },\n    },\n  },\n}\n```\n\n## FormData Handling\n\nDefault FormData generation:\n\n```ts\noverride: {\n  formData: true,  // Auto-generate FormData serialization\n}\n```\n\nCustom FormData mutator:\n\n```ts\noverride: {\n  formData: {\n    path: './custom-form-data.ts',\n    name: 'customFormData',\n  },\n}\n```\n\n```ts\n// custom-form-data.ts\nexport const customFormData = <Body>(body: Body): FormData => {\n  const formData = new FormData();\n  Object.entries(body).forEach(([key, value]) => {\n    formData.append(key, value);\n  });\n  return formData;\n};\n```\n\nArray handling options for FormData:\n\n```ts\noverride: {\n  formData: {\n    arrayHandling: 'serialize',  // 'serialize' | 'serialize-with-brackets' | 'explode'\n  },\n}\n```\n\n- `serialize`: `formData.append('items', JSON.stringify(value))`\n- `serialize-with-brackets`: `formData.append('items[]', JSON.stringify(value))`\n- `explode`: Expands nested objects with indexed keys\n\nURL-encoded form data:\n\n```ts\noverride: {\n  formUrlEncoded: {\n    path: './custom-form-url-encoded.ts',\n    name: 'customFormUrlEncoded',\n  },\n}\n```\n\n## Content Type Filtering\n\n```ts\noverride: {\n  contentType: {\n    include: ['application/json'],\n    exclude: ['application/xml'],\n  },\n}\n```\n\n## JSDoc Customization\n\n```ts\noverride: {\n  jsDoc: {\n    filter: (schema) => {\n      const allowlist = [\n        'type', 'format', 'maxLength', 'minLength',\n        'description', 'minimum', 'maximum', 'pattern',\n        'nullable', 'enum',\n      ];\n      return Object.entries(schema || {})\n        .filter(([key]) => allowlist.includes(key))\n        .map(([key, value]) => ({ key, value }))\n        .sort((a, b) => a.key.length - b.key.length);\n    },\n  },\n}\n```\n\n## Request Options\n\nConfigure or remove the request options parameter:\n\n```ts\noverride: {\n  requestOptions: false,  // Remove request options entirely\n  // or configure headers:\n  requestOptions: {\n    headers: {\n      'X-Custom-Header': '${dynamicValue}',\n    },\n  },\n}\n```\n\n## Params Serializer\n\nCustom parameter serialization (Axios/Angular only):\n\n```ts\noverride: {\n  paramsSerializer: {\n    path: './custom-params-serializer.ts',\n    name: 'customParamsSerializerFn',\n  },\n  // or use qs library:\n  paramsSerializerOptions: {\n    qs: { arrayFormat: 'repeat' },\n  },\n}\n```\n\n## Custom Mutation Options\n\n```ts\noverride: {\n  query: {\n    mutationOptions: {\n      path: './custom-mutation.ts',\n      name: 'useCustomMutation',\n    },\n  },\n}\n```\n\n## Full Working Example\n\n```ts\nimport { faker } from '@faker-js/faker';\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    output: {\n      mode: 'split',\n      target: 'src/petstore.ts',\n      schemas: 'src/model',\n      client: 'react-query',\n      mocks: true,\n      override: {\n        operations: {\n          listPets: {\n            mutator: 'src/response-type.js',\n            mock: {\n              properties: () => ({\n                id: () => faker.number.int({ min: 1, max: 99999 }),\n              }),\n            },\n          },\n          showPetById: {\n            mock: {\n              data: () => ({\n                id: faker.number.int({ min: 1, max: 99 }),\n                name: faker.person.firstName(),\n                tag: faker.helpers.arrayElement([\n                  faker.word.sample(),\n                  undefined,\n                ]),\n              }),\n            },\n          },\n        },\n        mock: {\n          properties: {\n            '/tag|name/': () => faker.person.lastName(),\n          },\n          delay: 500,\n        },\n      },\n      allParamsOptional: true,\n      urlEncodeParameters: true,\n    },\n    input: {\n      target: './petstore.yaml',\n      override: {\n        transformer: 'src/add-version.js',\n      },\n    },\n    hooks: {\n      afterAllFilesWrite: 'prettier --write',\n    },\n  },\n});\n```\n\n<!-- File: skills/orval/angular.md (Tokens: ~1082 | Category: anthropic-skill) -->\n# Angular Clients\n\n## Angular Query\n\nSignal-based reactivity with Angular's dependency injection:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',\n  mode: 'tags-split',\n  override: {\n    query: {\n      useInvalidate: true,\n      signal: true,\n      runtimeValidation: true,    // Pipe responses through Zod validation\n      mutationInvalidates: [\n        {\n          onMutations: ['createPets'],\n          invalidates: ['listPets'],\n        },\n        {\n          onMutations: ['deletePet', 'updatePet'],\n          invalidates: [\n            'listPets',\n            { query: 'showPetById', params: ['petId'] },\n          ],\n        },\n      ],\n    },\n  },\n}\n```\n\nGenerated injectable functions with signal reactivity:\n\n```ts\n// Inject query — re-executes when signal changes\nexport function injectShowPetById<TData = Pet, TError = unknown>(\n  petId: string | (() => string),   // Accepts signal getters\n  options?: { query?: Partial<CreateQueryOptions<Pet, TError, TData>> },\n): CreateQueryResult<TData, TError> {\n  const http = inject(HttpClient);\n  const query = injectQuery(() => {\n    const _petId = typeof petId === 'function' ? petId() : petId;\n    return getShowPetByIdQueryOptions(http, _petId, options);\n  });\n  return query;\n}\n\n// Inject mutation\nexport const injectCreatePets = <TError = Error, TContext = unknown>(\n  options?: { mutation?: CreateMutationOptions<...>; fetch?: RequestInit },\n): CreateMutationResult<...> => {\n  const http = inject(HttpClient);\n  const queryClient = inject(QueryClient);\n  return injectMutation(() => getCreatePetsMutationOptions(http, queryClient, options));\n};\n```\n\nUsage in Angular components:\n\n```ts\n@Component({...})\nexport class PetDetailComponent {\n  petId = signal('1');\n\n  // Query re-executes when petId() changes\n  pet = injectShowPetById(() => this.petId());\n\n  // Dynamic enabled/disabled\n  conditionalPet = injectShowPetById(\n    () => this.petId(),\n    () => ({ query: { enabled: this.isEnabled() } }),\n  );\n\n  // Mutation with auto-invalidation\n  deletePet = injectDeletePet({\n    mutation: {\n      onSuccess: () => this.snackbar.open('Pet deleted!'),\n    },\n  });\n\n  // Skip auto-invalidation for custom control\n  customDelete = injectDeletePet({\n    mutation: {\n      onSuccess: () => {\n        setTimeout(() => {\n          this.queryClient.invalidateQueries({ queryKey: getListPetsQueryKey() });\n        }, 700);\n      },\n    },\n    skipInvalidation: true,\n  });\n}\n```\n\n### Zod Runtime Validation\n\nWhen `runtimeValidation: true` and `schemas.type: 'zod'`:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',\n  schemas: { path: 'src/model', type: 'zod' },\n  override: {\n    query: { runtimeValidation: true },\n  },\n}\n```\n\nGenerated code pipes through Zod:\n\n```ts\nconst request$ = http\n  .get<Pets>(url, { params: httpParams })\n  .pipe(map((data) => Pets.parse(data)));\n```\n\n## Angular (HttpClient)\n\nTraditional Angular service generation:\n\n```ts\noutput: {\n  client: 'angular',\n  mode: 'tags-split',\n  mocks: true,\n  override: {\n    angular: {\n      provideIn: 'root',  // 'root' | 'any' | '' | false\n    },\n  },\n}\n```\n\nSetting backend URL with interceptor:\n\n```ts\n@Injectable()\nexport class ApiInterceptor implements HttpInterceptor {\n  intercept(req: HttpRequest<any>, next: HttpHandler) {\n    const apiReq = req.clone({\n      url: `https://api.example.com${req.url}`,\n    });\n    return next.handle(apiReq);\n  }\n}\n```\n\n## Angular Custom Mutator with HttpClient\n\n```ts\n// custom-client-with-error.ts\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nexport interface ExtendedServerErrorResponse<Error> extends HttpErrorResponse {\n  error: Error | any | null;\n}\nexport type ErrorType<Error> = ExtendedServerErrorResponse<Error>;\n\nexport const responseType = <Result>(\n  {\n    url,\n    method,\n    params,\n    data,\n    signal,\n    responseType,\n  }: {\n    url: string;\n    method: string;\n    params?: any;\n    data?: any;\n    headers?: any;\n    signal?: AbortSignal;\n    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n  },\n  http?: HttpClient,\n): Promise<Result> => {\n  if (!http) throw new Error('HttpClient is required.');\n  return lastValueFrom(\n    http.request<Result>(method, url, {\n      params,\n      body: data,\n      responseType: (responseType ?? 'json') as 'json',\n    }),\n  );\n};\n\nexport default responseType;\n```\n\n<!-- File: skills/orval/custom-http-clients.md (Tokens: ~1470 | Category: anthropic-skill) -->\n# Custom HTTP Client (Mutator)\n\nReplace the default HTTP implementation with a custom mutator.\n\n## Basic Axios Mutator\n\n```ts\n// orval.config.ts\noutput: {\n  override: {\n    mutator: {\n      path: './api/mutator/custom-instance.ts',\n      name: 'customInstance',\n    },\n  },\n}\n```\n\n```ts\n// custom-instance.ts\nimport Axios, { AxiosRequestConfig, AxiosError } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({ baseURL: '' });\n\nexport const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {\n  return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n};\n\nexport type ErrorType<Error> = AxiosError<Error>;\nexport type BodyType<BodyData> = BodyData;\n```\n\n## Axios with Interceptors (Auth, Error Handling)\n\n```ts\n// custom-instance.ts\nimport Axios, { AxiosRequestConfig, AxiosError } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({\n  baseURL: process.env.API_URL,\n});\n\n// Request interceptor — token injection\nAXIOS_INSTANCE.interceptors.request.use(\n  (config) => {\n    const token = localStorage.getItem('token');\n    if (token) config.headers.Authorization = `Bearer ${token}`;\n    return config;\n  },\n  (error) => Promise.reject(error),\n);\n\n// Response interceptor — error handling\nAXIOS_INSTANCE.interceptors.response.use(\n  (response) => response,\n  (error) => {\n    if (error.response?.status === 401) {\n      // Handle unauthorized\n    }\n    return Promise.reject(error);\n  },\n);\n\nexport const customInstance = <T>(config: AxiosRequestConfig): Promise<T> => {\n  return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n};\n\nexport type ErrorType<Error> = AxiosError<Error>;\nexport type BodyType<BodyData> = BodyData;\n```\n\n## React Context Auth with Interceptors\n\n```tsx\n// auth.context.tsx\nimport { useEffect, useState, createContext, useContext } from 'react';\nimport { AXIOS_INSTANCE } from './api/mutator/custom-instance';\n\nconst AuthProvider = ({ children, initialState = null }) => {\n  const [token, setToken] = useState(initialState);\n\n  useEffect(() => {\n    const interceptorId = AXIOS_INSTANCE.interceptors.request.use((config) => {\n      if (config.headers && token) {\n        config.headers.set('Authorization', `Bearer ${token}`);\n      }\n      return config;\n    });\n\n    return () => {\n      AXIOS_INSTANCE.interceptors.request.eject(interceptorId);\n    };\n  }, [token]);\n\n  return (\n    <AuthContext.Provider value={token}>\n      <AuthDispatchContext.Provider value={setToken}>\n        {children}\n      </AuthDispatchContext.Provider>\n    </AuthContext.Provider>\n  );\n};\n```\n\n## Hook-Based Mutator (Axios)\n\nAllows using React hooks inside the mutator (e.g., for auth state, callbacks):\n\n```ts\n// orval.config.ts\noutput: {\n  override: {\n    mutator: {\n      path: './use-custom-instance.ts',\n      name: 'useCustomInstance',\n    },\n  },\n}\n```\n\n```ts\n// use-custom-instance.ts\nimport Axios, { type AxiosRequestConfig } from 'axios';\n\nexport const AXIOS_INSTANCE = Axios.create({ baseURL: '' });\n\nexport const useCustomInstance = <T>(): ((\n  config: AxiosRequestConfig,\n) => Promise<T>) => {\n  // Can use React hooks here (useAuth, useCallback, etc.)\n  return (config: AxiosRequestConfig) => {\n    return AXIOS_INSTANCE({ ...config }).then(({ data }) => data);\n  };\n};\n\nexport default useCustomInstance;\n```\n\n## Hook-Based Mutator (Fetch with useCallback)\n\n```ts\n// use-custom-fetch.ts\nimport { useCallback, useState } from 'react';\n\nexport function useGetBaseUrl() {\n  const [baseUrl] = useState('');\n  return baseUrl;\n}\n\nexport function useCustomFetch() {\n  const baseUrl = useGetBaseUrl();\n  return useCallback(\n    async <T>(url: string, options?: RequestInit): Promise<T> => {\n      const headers = new Headers(options?.headers);\n      const response = await fetch(`${baseUrl}${url}`, {\n        ...options,\n        headers,\n      });\n      if (!response.ok) throw new Error('Network response was not ok');\n      return response.json();\n    },\n    [],\n  );\n}\n```\n\n## Fetch with Content-Type Detection\n\nHandle PDF, blob, text, XML responses (not just JSON):\n\n```ts\n// custom-fetch.ts\nconst getBody = <T>(c: Response | Request): Promise<T> => {\n  const contentType = c.headers.get('content-type');\n  if (contentType && contentType.includes('application/json')) {\n    return c.json();\n  }\n  if (contentType && contentType.includes('application/pdf')) {\n    return c.blob() as Promise<T>;\n  }\n  return c.text() as Promise<T>;\n};\n\nconst getUrl = (contextUrl: string): string => {\n  const url = new URL(contextUrl);\n  const baseUrl =\n    process.env.NODE_ENV === 'production'\n      ? 'https://api.production.com'\n      : 'http://localhost:3000';\n  return new URL(`${baseUrl}${url.pathname}${url.search}`).toString();\n};\n\nexport const customFetch = async <T>(\n  url: string,\n  options: RequestInit,\n): Promise<T> => {\n  const requestUrl = getUrl(url);\n  const requestHeaders = {\n    ...options.headers,\n    Authorization: 'Bearer my-token',\n  };\n  const response = await fetch(requestUrl, {\n    ...options,\n    headers: requestHeaders,\n  });\n  const data = await getBody<T>(response);\n  return { status: response.status, data, headers: response.headers } as T;\n};\n\nexport default customFetch;\n```\n\n## Fetch Client Config\n\nNative Fetch API — no dependencies, works in browsers, Node.js, Cloudflare Workers, Vercel Edge, Deno.\n\n```ts\noutput: {\n  client: 'fetch',\n  baseUrl: 'http://localhost:3000',\n  override: {\n    fetch: {\n      includeHttpResponseReturnType: false,  // Return data directly instead of { data, status }\n      forceSuccessResponse: true,            // Throw on error responses\n      runtimeValidation: true,               // Validate responses with Zod\n      jsonReviver: {                         // Custom JSON reviver (e.g. for dates)\n        path: './reviver.ts',\n        name: 'dateReviver',\n      },\n    },\n  },\n}\n```\n\n## Environment-Based URL Switching\n\nUsing base URL from spec with variables:\n\n```ts\noutput: {\n  baseUrl: {\n    getBaseUrlFromSpecification: true,\n    variables: {\n      environment: process.env.NODE_ENV === 'production' ? 'api.prod' : 'api.dev',\n    },\n  },\n}\n```\n\nOr use a `getUrl` function in a custom fetch mutator (see the `getUrl` pattern in \"Fetch with Content-Type Detection\" above).\n\n<!-- File: skills/orval/hono.md (Tokens: ~2957 | Category: anthropic-skill) -->\n# Hono Server Client\n\nGenerate type-safe Hono server handlers with built-in Zod validation from OpenAPI specs.\n\n## Quick Start\n\n```bash\nnpm install hono @hono/zod-validator zod\n```\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'src/handlers',\n        },\n      },\n    },\n  },\n});\n```\n\n## Configuration Options\n\n```ts\noutput: {\n  client: 'hono',\n  override: {\n    hono: {\n      handlers: 'src/handlers',             // Directory for per-operation handler files\n      compositeRoute: 'src/routes.ts',      // Combined routes file (used with tags-split)\n      validator: true,                       // true (default) | 'hono' | false\n      validatorOutputPath: 'src/validator.ts', // Custom validator output path\n    },\n  },\n}\n```\n\n| Option                | Type                | Default         | Description                                                                                                                                              |\n| --------------------- | ------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `handlers`            | `string`            | —               | Directory for per-operation handler files. One file per operation.                                                                                       |\n| `compositeRoute`      | `string`            | `''` (disabled) | Path for combined routes file. Used with `tags-split` mode.                                                                                              |\n| `validator`           | `boolean \\| 'hono'` | `true`          | `true` = orval's custom zValidator with response validation; `'hono'` = `@hono/zod-validator` directly (no response validation); `false` = no validators |\n| `validatorOutputPath` | `string`            | `''` (auto)     | Custom output path for the generated validator file                                                                                                      |\n\n## Generated File Structure\n\n### `split` mode with `handlers`\n\n```\nsrc/\n├── handlers/\n│   ├── listPets.ts           # Per-operation handler (NOT overwritten if exists)\n│   ├── createPets.ts\n│   ├── showPetById.ts\n│   └── updatePets.ts\n├── petstore.ts               # Hono app with routes (regenerated)\n├── petstore.context.ts       # Type-safe context types (regenerated)\n├── petstore.schemas.ts       # TypeScript types\n├── petstore.validator.ts     # Custom zValidator wrapper (regenerated)\n└── petstore.zod.ts           # Zod schemas (regenerated)\n```\n\n### `tags-split` with `compositeRoute`\n\n```\nsrc/\n├── endpoints/\n│   └── pets/\n│       ├── pets.context.ts\n│       ├── pets.handlers.ts  # All handlers for tag in one file\n│       └── pets.zod.ts\n├── schemas/\n│   ├── pet.ts\n│   ├── pets.ts\n│   └── index.ts\n├── routes.ts                 # Combined routes file\n└── endpoints/validator.ts    # Shared validator\n```\n\n### `tags` mode\n\n```\nsrc/\n├── handlers/\n│   ├── listPets.ts\n│   └── createPets.ts\n├── pets.ts                   # Route file per tag\n├── pets.context.ts\n├── pets.zod.ts\n└── pets.validator.ts\n```\n\n## Generated Route File\n\n```ts\nimport { Hono } from 'hono';\nimport { listPetsHandlers } from './handlers/listPets';\nimport { createPetsHandlers } from './handlers/createPets';\nimport { showPetByIdHandlers } from './handlers/showPetById';\n\nconst app = new Hono();\n\napp.get('/pets', ...listPetsHandlers);\napp.post('/pets', ...createPetsHandlers);\napp.get('/pets/:petId', ...showPetByIdHandlers);\n\nexport default app;\n```\n\nOpenAPI path params `{petId}` are converted to Hono format `:petId`.\n\n## Handler Templates\n\n### Query parameters\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { ListPetsContext } from '../petstore.context';\nimport { listPetsQueryParams, listPetsResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const listPetsHandlers = factory.createHandlers(\n  zValidator('query', listPetsQueryParams),\n  zValidator('response', listPetsResponse),\n  async (c: ListPetsContext) => {\n    return c.json([{ id: 1, name: 'Buddy' }]);\n  },\n);\n```\n\n### Path parameters\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { ShowPetByIdContext } from '../petstore.context';\nimport { showPetByIdParams, showPetByIdResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const showPetByIdHandlers = factory.createHandlers(\n  zValidator('param', showPetByIdParams),\n  zValidator('response', showPetByIdResponse),\n  async (c: ShowPetByIdContext) => {\n    const { petId } = c.req.valid('param');\n    return c.json({ id: Number(petId), name: 'Buddy' });\n  },\n);\n```\n\n### JSON body\n\n```ts\nimport { createFactory } from 'hono/factory';\nimport { zValidator } from '../petstore.validator';\nimport { CreatePetsContext } from '../petstore.context';\nimport { createPetsBody, createPetsResponse } from '../petstore.zod';\n\nconst factory = createFactory();\n\nexport const createPetsHandlers = factory.createHandlers(\n  zValidator('json', createPetsBody),\n  zValidator('response', createPetsResponse),\n  async (c: CreatePetsContext) => {\n    const body = c.req.valid('json');\n    return c.json({ id: 1, ...body });\n  },\n);\n```\n\n### Validator order in generated handlers\n\n1. `zValidator('header', ...)` — if request headers exist\n2. `zValidator('param', ...)` — if path parameters exist\n3. `zValidator('query', ...)` — if query parameters exist\n4. `zValidator('json', ...)` — if request body exists\n5. `zValidator('response', ...)` — if 200 JSON response exists AND `validator !== 'hono'`\n\n## Context Types\n\nGenerated context types encode the validated input shape for type-safe access:\n\n```ts\nimport type { Context, Env } from 'hono';\n\nexport type ListPetsContext<E extends Env = any> = Context<\n  E,\n  '/pets',\n  { in: { query: ListPetsParams }; out: { query: ListPetsParams } }\n>;\n\nexport type ShowPetByIdContext<E extends Env = any> = Context<\n  E,\n  '/pets/:petId',\n  {\n    in: { param: { petId: string } };\n    out: { param: { petId: string } };\n  }\n>;\n\nexport type CreatePetsContext<E extends Env = any> = Context<\n  E,\n  '/pets',\n  { in: { json: CreatePetsBodyItem[] }; out: { json: CreatePetsBodyItem[] } }\n>;\n```\n\nWhen an operation has no params/query/body, the third generic is omitted.\n\nA `NonReadonly<T>` utility type is emitted only when schema types contain readonly properties.\n\n## zValidator (Response Validation)\n\nOrval's custom `zValidator` extends `@hono/zod-validator` with a `response` target:\n\n```ts\nzValidator('response', responseSchema);\n```\n\nResponse validation behavior (when `validator: true`):\n\n- Runs as post-middleware (calls `await next()` first)\n- Only validates HTTP 200 responses with `Content-Type: application/json`\n- Uses `safeParseAsync` — supports Zod v3 and v4\n- On parse failure: returns HTTP 400 with `{ success, data, error }`\n- On malformed JSON: returns HTTP 400 with `'Malformed JSON in response'`\n- Supports optional `hook` callback for custom validation handling\n\nSee the `validator` option in Configuration Options above for the three modes (`true`, `'hono'`, `false`).\n\n## Composite Routes\n\nFor `tags-split` mode with multiple tag groups:\n\n```ts\noutput: {\n  mode: 'tags-split',\n  client: 'hono',\n  target: 'src/endpoints',\n  schemas: 'src/schemas',\n  override: {\n    hono: {\n      compositeRoute: 'src/routes.ts',\n      validatorOutputPath: 'src/endpoints/validator.ts',\n    },\n  },\n}\n```\n\nGenerated `routes.ts`:\n\n```ts\nimport { Hono } from 'hono';\nimport {\n  listPetsHandlers,\n  createPetsHandlers,\n  showPetByIdHandlers,\n} from './endpoints/pets/pets.handlers';\n\nconst app = new Hono();\n\napp.get('/pets', ...listPetsHandlers);\napp.post('/pets', ...createPetsHandlers);\napp.get('/pets/:petId', ...showPetByIdHandlers);\n\nexport default app;\n```\n\nWire it up in your app entry point:\n\n```ts\nimport { Hono } from 'hono';\nimport routes from './routes';\n\nconst app = new Hono();\napp.route('/', routes);\n\nexport default app;\n```\n\nWithout `compositeRoute` in `tags-split` mode, you must wire routes manually.\n\n## Zod Schema Options for Hono\n\nControl how Zod schemas are generated alongside Hono handlers:\n\n```ts\noverride: {\n  hono: {\n    handlers: 'src/handlers',\n  },\n  zod: {\n    strict: {\n      response: true,         // Add .strict() to response schemas\n    },\n    preprocess: {\n      response: {\n        name: 'stripNill',\n        path: './src/mutators.ts',\n      },\n    },\n  },\n}\n```\n\n```ts\n// src/mutators.ts\nexport const stripNill = (object: unknown) =>\n  !!object && typeof object === 'object' && !Array.isArray(object)\n    ? Object.fromEntries(\n        Object.entries(object).filter(\n          ([_, value]) => value !== null && value !== undefined,\n        ),\n      )\n    : object;\n```\n\n## Zod Schema Naming Conventions\n\n| Type             | Pattern                   | Example               |\n| ---------------- | ------------------------- | --------------------- |\n| Query params     | `{PascalName}QueryParams` | `ListPetsQueryParams` |\n| Path params      | `{PascalName}Params`      | `ShowPetByIdParams`   |\n| Request headers  | `{PascalName}Header`      | `ListPetsHeader`      |\n| Request body     | `{PascalName}Body`        | `CreatePetsBody`      |\n| Array body items | `{PascalName}BodyItem`    | `CreatePetsBodyItem`  |\n| Response         | `{PascalName}Response`    | `ListPetsResponse`    |\n\n## Full Examples\n\n### Split mode with handlers\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'src/handlers',\n        },\n        zod: {\n          strict: { response: true },\n          preprocess: {\n            response: {\n              name: 'stripNill',\n              path: './src/mutators.ts',\n            },\n          },\n        },\n      },\n    },\n  },\n});\n```\n\n### Tags-split with composite routes\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  api: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'tags-split',\n      client: 'hono',\n      target: 'src/endpoints',\n      schemas: 'src/schemas',\n      clean: true,\n      override: {\n        hono: {\n          compositeRoute: 'src/routes.ts',\n          validatorOutputPath: 'src/endpoints/validator.ts',\n        },\n      },\n    },\n  },\n});\n```\n\n### Hono server + Fetch client (full-stack)\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstoreClient: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'tags-split',\n      client: 'fetch',\n      target: 'next-app/app/gen/',\n      schemas: 'next-app/app/gen/models',\n      clean: true,\n      baseUrl: 'http://localhost:8787',\n      mocks: true,\n    },\n  },\n  petstoreApi: {\n    input: { target: './petstore.yaml' },\n    output: {\n      mode: 'split',\n      client: 'hono',\n      target: 'hono-app/src/petstore.ts',\n      override: {\n        hono: {\n          handlers: 'hono-app/src/handlers',\n        },\n      },\n    },\n  },\n});\n```\n\n## Key Behavioral Notes\n\n- **Handler files are never overwritten** — existing handlers are preserved, new operations are appended\n- **All other generated files are regenerated** on every run (routes, context, zod, validator)\n- **Response validation only runs for HTTP 200 with `application/json`** — other status codes pass through\n- **Cloudflare Workers** is the primary deployment target (use `wrangler dev`)\n- **Required dependencies**: `hono`, `@hono/zod-validator`, `zod`\n\n## Running\n\n```bash\n# Cloudflare Workers\nwrangler dev src/index.ts\n\n# Test\ncurl http://localhost:8787/pets\n```\n\n<!-- File: skills/orval/mocking-msw.md (Tokens: ~999 | Category: anthropic-skill) -->\n# MSW Mock Generation\n\n```ts\noutput: {\n  mocks: true,\n  // or with options:\n  mocks: {\n    generators: [\n      {\n        type: 'msw',\n        delay: 1000,\n        delayFunctionLazyExecute: false,\n        useExamples: true,\n        generateEachHttpStatus: false,\n        baseUrl: 'https://api.example.com',\n        locale: 'en',\n        preferredContentType: 'application/json',\n      },\n    ],\n  },\n}\n```\n\n`mocks: true` is shorthand for `{ generators: [{ type: 'msw' }, { type: 'faker' }] }` and emits both `<file>.msw.ts` and `<file>.faker.ts`. Use `{ type: 'faker' }` alone for response-mock factories with no MSW dependency.\n\nGenerated mock handler:\n\n```ts\nexport const getShowPetByIdMockHandler = (\n  overrideResponse?: Pet | ((info: RequestHandlerOptions) => Promise<Pet>),\n  options?: RequestHandlerOptions,\n) => {\n  return http.get(\n    '*/pets/:petId',\n    async (info) => {\n      await delay(1000);\n      return HttpResponse.json(\n        overrideResponse !== undefined\n          ? typeof overrideResponse === 'function'\n            ? await overrideResponse(info)\n            : overrideResponse\n          : getShowPetByIdResponseMock(),\n        { status: 200 },\n      );\n    },\n    options,\n  );\n};\n\nexport const getShowPetByIdResponseMock = (\n  overrideResponse: Partial<Pet> = {},\n): Pet => ({\n  id: faker.number.int(),\n  name: faker.string.alpha(20),\n  tag: faker.string.alpha(20),\n  ...overrideResponse,\n});\n```\n\nContent-type aware responses — MSW handlers automatically use the correct helper:\n\n| Content type                          | Response helper                      |\n| ------------------------------------- | ------------------------------------ |\n| `application/json`                    | `HttpResponse.json()`                |\n| `application/xml`, `*+xml`            | `HttpResponse.xml()`                 |\n| `text/html`                           | `HttpResponse.html()`                |\n| `text/plain`, other `text/*`          | `HttpResponse.text()`                |\n| `application/octet-stream`, `image/*` | `HttpResponse.arrayBuffer()`         |\n| No body (204, etc.)                   | `new HttpResponse(null, { status })` |\n\n## Test Setup with Vitest\n\n```ts\nimport {\n  getListPetsMockHandler,\n  getShowPetByIdMockHandler,\n} from './api/petstore.msw';\nimport { setupServer } from 'msw/node';\n\nconst server = setupServer(...getListPetsMockHandler());\n\nbeforeAll(() => server.listen());\nafterEach(() => server.resetHandlers());\nafterAll(() => server.close());\n\n// Override for specific test\nit('handles empty list', () => {\n  server.use(getListPetsMockHandler([]));\n  // ...\n});\n\n// Dynamic response based on request\nit('returns pet by id', () => {\n  server.use(\n    getShowPetByIdMockHandler(async ({ params }) => ({\n      id: Number(params.petId),\n      name: 'Test Pet',\n    })),\n  );\n  // ...\n});\n```\n\n## Mock Customization\n\n```ts\noverride: {\n  mock: {\n    properties: {\n      '/tag|name/': 'jon',              // Regex match\n      email: () => faker.internet.email(),\n    },\n    format: {\n      email: () => faker.internet.email(),\n      iban: () => faker.finance.iban(),\n    },\n    required: true,\n    delay: 500,\n    arrayMin: 1,\n    arrayMax: 10,\n    stringMin: 10,\n    stringMax: 20,\n    numberMin: 0,\n    numberMax: 100,\n    fractionDigits: 2,\n  },\n}\n```\n\nPer-operation mock data:\n\n```ts\noverride: {\n  operations: {\n    listPets: {\n      mock: {\n        properties: () => ({\n          '[].id': () => faker.number.int({ min: 1, max: 99999 }),\n        }),\n      },\n    },\n    showPetById: {\n      mock: {\n        data: () => ({\n          id: faker.number.int({ min: 1, max: 99 }),\n          name: faker.person.firstName(),\n          tag: faker.helpers.arrayElement([faker.word.sample(), undefined]),\n        }),\n      },\n    },\n  },\n}\n```\n\n## Dynamic Mock Imports (indexMockFiles)\n\nIn `tags-split` mode, emit one `index.<ext>.ts` per generator entry (e.g. `index.msw.ts`, `index.faker.ts`):\n\n```ts\noutput: {\n  mode: 'tags-split',\n  mocks: {\n    indexMockFiles: true,\n    generators: [{ type: 'msw' }],\n  },\n}\n```\n\n<!-- File: skills/orval/SKILL.md (Tokens: ~2473 | Category: anthropic-skill) -->\n---\nname: orval\ndescription: Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, MCP servers, and SolidStart actions from OpenAPI specs using Orval. Covers all clients (React/Vue/Svelte/Solid/Angular Query, Fetch, Axios), custom HTTP mutators, authentication patterns, NDJSON streaming, programmatic API, and advanced configuration.\n---\n\n# Orval - OpenAPI to TypeScript Code Generator\n\nOrval generates type-safe TypeScript clients, hooks, schemas, mocks, and server handlers from OpenAPI v3/Swagger v2 specifications.\n\n## Quick Start\n\n### Installation\n\n```bash\nnpm install orval -D\n# or yarn add orval -D\n# or pnpm add orval -D\n# or bun add orval -D\n```\n\n### Minimal Configuration\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: {\n      target: './petstore.yaml',\n    },\n    output: {\n      target: './src/api/petstore.ts',\n      schemas: './src/api/model',\n      client: 'react-query',\n    },\n  },\n});\n```\n\n### Run\n\n```bash\nnpx orval\nnpx orval --config ./orval.config.ts\nnpx orval --project petstore\nnpx orval --watch\n```\n\n## Choosing Your Setup\n\n### Client Selection Guide\n\n| Use Case                 | Client            | httpClient         | Notes                                   |\n| ------------------------ | ----------------- | ------------------ | --------------------------------------- |\n| React with server state  | `react-query`     | `fetch` or `axios` | TanStack Query hooks                    |\n| Vue 3 with server state  | `vue-query`       | `fetch` or `axios` | TanStack Query for Vue                  |\n| Svelte with server state | `svelte-query`    | `fetch` or `axios` | TanStack Query for Svelte               |\n| SolidJS standalone app   | `solid-query`     | `fetch` or `axios` | TanStack Query for Solid                |\n| SolidStart full-stack    | `solid-start`     | native fetch       | Uses `query()`/`action()` primitives    |\n| Angular with signals     | `angular-query`   | `angular`          | Injectable functions, signal reactivity |\n| Angular traditional      | `angular`         | —                  | HttpClient services                     |\n| React with SWR           | `swr`             | `fetch` or `axios` | Vercel SWR hooks                        |\n| Lightweight / Edge       | `fetch`           | —                  | Zero dependencies, works everywhere     |\n| Node.js / existing Axios | `axios-functions` | —                  | Factory functions (default)             |\n| Axios with DI            | `axios`           | —                  | Injectable Axios instance               |\n| Validation only          | `zod`             | —                  | Zod schemas, no HTTP client             |\n| Backend API server       | `hono`            | —                  | Hono handlers with Zod validation       |\n| AI agent tools           | `mcp`             | —                  | Model Context Protocol servers          |\n\n### Mode Selection Guide\n\n- **`single`** — Everything in one file. Best for small APIs.\n- **`split`** — Separate files: `petstore.ts`, `petstore.schemas.ts`, `petstore.msw.ts`. Good for medium APIs.\n- **`tags`** — One file per OpenAPI tag + shared schemas. Organizes by domain.\n- **`tags-split`** — Folder per tag with split files. Best for large APIs. Recommended.\n\n### httpClient Option\n\nFor `react-query`, `vue-query`, `svelte-query`, and `swr` clients:\n\n```ts\noutput: {\n  client: 'react-query',\n  httpClient: 'fetch',  // 'fetch' (default) | 'axios'\n}\n```\n\nFor `angular-query`:\n\n```ts\noutput: {\n  client: 'angular-query',\n  httpClient: 'angular',  // Uses Angular HttpClient\n}\n```\n\n## Configuration Reference\n\n### Config Structure\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  [projectName]: {\n    input: InputOptions,\n    output: OutputOptions,\n    hooks: HooksOptions,\n  },\n});\n```\n\nMultiple projects can share the same config file with different input/output settings.\n\n### Input Options\n\n```ts\ninput: {\n  target: './spec.yaml',              // Path or URL to OpenAPI spec (required)\n  override: {\n    transformer: './transform.js',    // Transform spec before generation\n  },\n  filters: {\n    mode: 'include',                  // 'include' | 'exclude'\n    tags: ['pets', /health/],         // Filter by OpenAPI tags\n    schemas: ['Pet', /Error/],        // Filter by schema names\n  },\n  parserOptions: {\n    headers: [                        // Auth headers for remote spec URLs\n      {\n        domains: ['api.example.com'],\n        headers: {\n          Authorization: 'Bearer YOUR_TOKEN',\n          'X-API-Key': 'your-api-key',\n        },\n      },\n    ],\n  },\n}\n```\n\n### Output Options\n\n```ts\noutput: {\n  target: './src/api/endpoints.ts',     // Output path (required)\n  client: 'react-query',               // Client type (see table above)\n  httpClient: 'fetch',                  // 'fetch' (default) | 'axios' | 'angular'\n  mode: 'tags-split',                   // 'single' | 'split' | 'tags' | 'tags-split'\n  schemas: './src/api/model',           // Output path for model types\n  operationSchemas: './src/api/params', // Separate path for operation-derived types\n  workspace: 'src/',                    // Base folder for all files\n  fileExtension: '.ts',                 // Custom file extension\n  namingConvention: 'camelCase',        // File naming: camelCase | PascalCase | snake_case | kebab-case\n  indexFiles: true,                     // Generate index.ts barrel files\n  clean: true,                          // Clean output before generating\n  prettier: true,                       // Format with Prettier\n  biome: true,                          // Format with Biome\n  headers: true,                        // Generate header parameters\n  baseUrl: '/api/v2',                   // API base URL\n  // or from spec:\n  // baseUrl: { getBaseUrlFromSpecification: true, index: 0, variables: { environment: 'api.dev' } },\n  mocks: true,                          // Generate MSW + Faker mocks (boolean, object, or function)\n  docs: true,                           // Generate TypeDoc documentation\n  // docs: { configPath: './typedoc.config.mjs' },\n  allParamsOptional: true,              // Make all params optional (except path params)\n  urlEncodeParameters: true,            // URL-encode path/query parameters\n  optionsParamRequired: false,          // Make options parameter required\n  propertySortOrder: 'Specification',   // 'Alphabetical' | 'Specification'\n  tsconfig: './tsconfig.json',          // Custom tsconfig path\n  override: { ... },                    // Advanced overrides (see below)\n}\n```\n\n### Multiple API Specs\n\n```ts\nexport default defineConfig({\n  petstoreV1: {\n    input: { target: './specs/v1.yaml' },\n    output: { target: 'src/api/v1', client: 'react-query' },\n  },\n  petstoreV2: {\n    input: { target: './specs/v2.yaml' },\n    output: { target: 'src/api/v2', client: 'react-query' },\n  },\n});\n```\n\n### Filter Endpoints\n\n```ts\ninput: {\n  target: './spec.yaml',\n  filters: {\n    mode: 'include',\n    tags: ['pets'],\n  },\n}\n```\n\n## Detailed Guides\n\nWhen the user's question involves a specific topic below, read the corresponding file from this skill's directory.\n\n| Topic                | File                                             | Load when user asks about...                                                                                            |\n| -------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |\n| TanStack Query / SWR | [tanstack-query.md](tanstack-query.md)           | React Query, Vue Query, Svelte Query, Solid Query, SWR, query hooks, invalidation, infinite queries, suspense, prefetch |\n| Angular              | [angular.md](angular.md)                         | Angular Query, Angular HttpClient, signals, inject functions, Angular services, providedIn                              |\n| SolidStart           | [solid-start.md](solid-start.md)                 | SolidStart, @solidjs/router, query(), action(), createAsync, revalidate                                                 |\n| Custom HTTP / Auth   | [custom-http-clients.md](custom-http-clients.md) | Custom mutator, authentication, tokens, interceptors, custom fetch/axios, baseURL, hook-based mutator                   |\n| Zod Validation       | [zod-validation.md](zod-validation.md)           | Zod schemas, validation, runtime validation, coerce, strict, preprocess                                                 |\n| Mocking / MSW        | [mocking-msw.md](mocking-msw.md)                 | MSW mocks, testing, test setup, faker, Vitest, mock handlers, useExamples                                               |\n| Hono Server          | [hono.md](hono.md)                               | Hono handlers, zValidator, composite routes, context types, server-side generation                                      |\n| Advanced Config      | [advanced-config.md](advanced-config.md)         | Type generation, enums, per-operation overrides, FormData, JSDoc, params serializer, full example                       |\n| Tooling / Workflow   | [tooling-workflow.md](tooling-workflow.md)       | Programmatic API, transformers, hooks, NDJSON streaming, MCP, afterAllFilesWrite                                        |\n\n## OpenAPI Specification Best Practices\n\n1. **Use unique `operationId`** for every operation — Orval uses these for function and hook names\n2. **Define reusable schemas** in `components/schemas` — reduces duplication in generated types\n3. **Use tags** to group operations — works with `tags` and `tags-split` modes\n4. **Define response types** for all operations — enables full type safety\n5. **Mark required fields** — affects optional/required in generated TypeScript interfaces\n6. **Use `x-enumNames`** for numeric enums — generates readable const names\n7. **Provide `example` values** — used by mock generation when `useExamples: true`\n8. **Use `application/x-ndjson`** content type for streaming endpoints — enables typed NDJSON generation\n\n## CLI Reference\n\n```bash\norval                                    # Generate using auto-discovered config\norval --config ./api/orval.config.ts     # Specify config file\norval --project petstore                 # Run specific project(s)\norval --watch                            # Watch mode\norval --watch ./src                      # Watch specific directory\norval --clean                            # Clean generated files\norval --prettier                         # Format with Prettier\norval --biome                            # Format with Biome\norval --tsconfig ./src/tsconfig.json     # Custom tsconfig path\norval --mode split                       # Override output mode\norval --client react-query               # Override client\norval --mock                             # Override mock generation\norval --input ./spec.yaml --output ./api.ts  # Direct generation\n```\n\n## Resources\n\n- [Documentation](https://orval.dev)\n- [GitHub](https://github.com/orval-labs/orval)\n- [Sample Projects](https://github.com/orval-labs/orval/tree/master/samples)\n\n<!-- File: skills/orval/solid-start.md (Tokens: ~572 | Category: anthropic-skill) -->\n# SolidStart Client\n\nUses native SolidStart primitives (`query()` and `action()` from `@solidjs/router`) instead of TanStack Query.\n\n```ts\noutput: {\n  client: 'solid-start',\n  mode: 'tags-split',\n  target: 'src/api/petstore.ts',\n  schemas: 'src/api/model',\n  mocks: true,\n}\n```\n\nGenerated output:\n\n```ts\nimport { query, action } from '@solidjs/router';\n\nexport const SwaggerPetstore = {\n  // GET requests -> query() with automatic caching\n  listPets: query(async (params: ListPetsParams) => {\n    const queryString = new URLSearchParams(params as any).toString();\n    const url = queryString ? `/pets?${queryString}` : `/pets`;\n    const response = await fetch(url, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\n    return response.json() as Promise<Pets>;\n  }, 'listPets'),\n\n  // POST/PUT/PATCH/DELETE -> action() (mutations, not cached)\n  createPets: action(async (createPetsBody: CreatePetsBody) => {\n    const response = await fetch('/pets', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(createPetsBody),\n    });\n    return response.json() as Promise<Pet>;\n  }, 'createPets'),\n};\n```\n\n## Cache Invalidation\n\n```ts\nimport { revalidate } from '@solidjs/router';\n\n// Invalidate all instances of a query\nrevalidate(SwaggerPetstore.listPets.key);\n\n// Invalidate specific call by arguments\nrevalidate(SwaggerPetstore.showPetById.keyFor('pet-123'));\n```\n\n## Usage with Components\n\n```tsx\nimport { createAsync } from '@solidjs/router';\nimport { Suspense } from 'solid-js';\n\nfunction PetDetails(props: { petId: string }) {\n  const pet = createAsync(() => SwaggerPetstore.showPetById(props.petId));\n  return (\n    <Suspense fallback={<div>Loading...</div>}>\n      <h1>{pet()?.name}</h1>\n    </Suspense>\n  );\n}\n\n// Actions work with HTML forms\n<form action={SwaggerPetstore.createPets} method=\"post\">\n  <input name=\"name\" required />\n  <button type=\"submit\">Create Pet</button>\n</form>;\n\n// Or programmatically\nfunction DeletePetButton(props: { petId: string }) {\n  const deletePet = useAction(SwaggerPetstore.deletePetById);\n  return <button onClick={() => deletePet(props.petId)}>Delete</button>;\n}\n```\n\n<!-- File: skills/orval/tanstack-query.md (Tokens: ~866 | Category: anthropic-skill) -->\n# TanStack Query / SWR Clients\n\n## React Query / TanStack Query\n\n```ts\noutput: {\n  client: 'react-query',\n  override: {\n    query: {\n      useQuery: true,\n      useMutation: true,\n      useInfinite: true,\n      useInfiniteQueryParam: 'cursor',\n      useSuspenseQuery: true,\n      useSuspenseInfiniteQuery: true,\n      usePrefetch: true,\n      useInvalidate: true,\n      signal: true,\n      shouldExportKeys: true,\n      shouldSplitQueryKey: false,       // Array vs string query keys\n      useOperationIdAsQueryKey: false,  // Use operationId instead of route path\n      options: { staleTime: 10000 },\n      mutationInvalidates: [\n        {\n          onMutations: ['createPets'],\n          invalidates: ['listPets'],\n        },\n        {\n          onMutations: ['deletePet', 'updatePet'],\n          invalidates: [\n            'listPets',\n            { query: 'showPetById', params: ['petId'] },\n          ],\n        },\n      ],\n    },\n  },\n}\n```\n\nGenerated hooks:\n\n```ts\n// Query hook with automatic query key\nexport const useShowPetById = <TData = Pet, TError = Error>(\n  petId: string,\n  options?: { query?: UseQueryOptions<Pet, TError, TData> },\n) => {\n  const queryKey = getShowPetByIdQueryKey(petId);\n  const queryFn = () => showPetById(petId);\n  return useQuery({ queryKey, queryFn, enabled: !!petId, ...options?.query });\n};\n\n// Exported query key for manual invalidation\nexport const getShowPetByIdQueryKey = (petId: string) => [`/pets/${petId}`];\n```\n\n## Vue Query\n\n```ts\noutput: {\n  client: 'vue-query',\n  // Same override.query options as React Query\n}\n```\n\n## Svelte Query\n\n```ts\noutput: {\n  client: 'svelte-query',\n  // Same override.query options as React Query\n}\n```\n\n## Solid Query\n\nFor standalone SolidJS apps (not SolidStart):\n\n```ts\noutput: {\n  client: 'solid-query',\n  // Same override.query options as React Query\n}\n```\n\n## SWR\n\n```ts\noutput: {\n  client: 'swr',\n  override: {\n    swr: {\n      useInfinite: true,\n      useSuspense: true,\n      useSWRMutationForGet: false,\n      generateErrorTypes: false,\n      swrOptions: { dedupingInterval: 10000 },\n      swrMutationOptions: { revalidate: true },\n      swrInfiniteOptions: { initialSize: 10 },\n    },\n  },\n}\n```\n\n## Query Invalidation Patterns\n\nBasic invalidation:\n\n```ts\noverride: {\n  query: {\n    useInvalidate: true,\n    mutationInvalidates: [\n      {\n        onMutations: ['createPets'],\n        invalidates: ['listPets'],\n      },\n    ],\n  },\n}\n```\n\nAdvanced invalidation with params and cross-file references:\n\n```ts\nmutationInvalidates: [\n  {\n    onMutations: ['deletePet', 'updatePet', 'patchPet'],\n    invalidates: [\n      'listPets',\n      { query: 'showPetById', params: ['petId'] },\n      { query: 'adminPets', file: './admin' },\n    ],\n  },\n  {\n    onMutations: ['uploadFile'],\n    invalidates: ['listPets'],\n  },\n],\n```\n\nReset mode (reset query state instead of refetch):\n\n```ts\ninvalidates: [\n  { query: 'showPetById', params: ['petId'], invalidationMode: 'reset' },\n],\n```\n\nSkip invalidation at runtime:\n\n```ts\nconst deletePet = useDeletePet({\n  mutation: {\n    onSuccess: () => {\n      // Custom invalidation logic\n      queryClient.invalidateQueries({ queryKey: getListPetsQueryKey() });\n    },\n  },\n  skipInvalidation: true,\n});\n```\n\n<!-- File: skills/orval/tooling-workflow.md (Tokens: ~1207 | Category: anthropic-skill) -->\n# Tooling & Workflow\n\n## MCP (AI Agent Tools)\n\nGenerate Model Context Protocol servers from OpenAPI specs for AI agent integration (Claude, Cline, etc.):\n\n```ts\noutput: {\n  mode: 'single',       // ONLY works in single mode\n  client: 'mcp',\n  baseUrl: 'https://petstore3.swagger.io/api/v3',\n  target: 'src/handlers.ts',\n  schemas: 'src/http-schemas',\n}\n```\n\nGenerated files:\n\n- `src/http-schemas/` — TypeScript types\n- `src/handlers.ts` — Handler functions returning MCP format\n- `src/http-client.ts` — Generated fetch client\n- `src/server.ts` — MCP tools and server configuration\n- `src/tool-schemas.zod.ts` — Zod schemas for tool inputs\n\nDeploy with Docker and configure in your MCP client (e.g. Cline's `mcpServers` config).\n\n## NDJSON Streaming\n\nType-safe newline-delimited JSON streaming. Only supported with Fetch client.\n\nOpenAPI schema:\n\n```yaml\npaths:\n  /stream:\n    get:\n      responses:\n        '200':\n          content:\n            application/x-ndjson:\n              schema:\n                $ref: '#/components/schemas/StreamEntry'\n```\n\nGenerated types and function:\n\n```ts\nexport type streamResponse200 = {\n  stream: TypedResponse<StreamEntry>;\n  status: 200;\n};\n\nexport const stream = async (\n  options?: RequestInit,\n): Promise<streamResponse> => {\n  const stream = await fetch(getStreamUrl(), {\n    ...options,\n    method: 'GET',\n    headers: { Accept: 'application/x-ndjson', ...options?.headers },\n  });\n  return {\n    status: stream.status,\n    stream,\n    headers: stream.headers,\n  } as streamResponse;\n};\n```\n\nReading the stream:\n\n```ts\nexport const readStream = <T extends object>(\n  response: Response & { json(): Promise<T> },\n  processLine: (value: T) => void,\n): Promise<void> => {\n  if (!response.body) return Promise.resolve();\n  const stream = response.body.getReader();\n  const decoder = new TextDecoder();\n  let buffer = '';\n\n  const loop = (): Promise<void> =>\n    stream.read().then(({ done, value }) => {\n      if (done) {\n        if (buffer.length > 0) processLine(JSON.parse(buffer));\n        return;\n      }\n      buffer += decoder.decode(value, { stream: true });\n      const parts = buffer.split(/\\r?\\n/);\n      buffer = parts.pop() ?? '';\n      for (const part of parts.filter(Boolean)) {\n        processLine(JSON.parse(part) as T);\n      }\n      return loop();\n    });\n  return loop();\n};\n\n// Usage\nconst results: StreamEntry[] = [];\nconst response = await stream();\nif (response.status === 200) {\n  await readStream(response.stream, (obj) => results.push(obj));\n}\n```\n\n## Input Transformers\n\nTransform the OpenAPI spec before generation:\n\n```ts\ninput: {\n  target: './spec.yaml',\n  override: {\n    transformer: './transformers/add-auth-header.js',\n  },\n}\n```\n\n```js\n// add-auth-header.js\nmodule.exports = (openAPIDocument) => {\n  // Modify and return the spec\n  return openAPIDocument;\n};\n```\n\n## Hooks (afterAllFilesWrite)\n\nRun scripts after Orval generates files:\n\n```ts\nexport default defineConfig({\n  petstore: {\n    input: './petstore.yaml',\n    output: './petstore.ts',\n    hooks: {\n      afterAllFilesWrite: 'prettier --write',\n    },\n  },\n});\n```\n\nMultiple commands:\n\n```ts\nhooks: {\n  afterAllFilesWrite: ['prettier --write', 'eslint --fix'],\n}\n```\n\nDisable file path injection:\n\n```ts\nhooks: {\n  afterAllFilesWrite: {\n    command: 'prettier --write .',\n    injectGeneratedDirsAndFiles: false,\n  },\n}\n```\n\n## Programmatic API\n\nUse Orval programmatically in build scripts:\n\n```ts\nimport { generate } from 'orval';\n\n// From config file\nawait generate('./orval.config.ts');\n\n// With direct configuration\nimport type { Options } from 'orval';\n\nconst config: Options = {\n  input: { target: './api-spec.yaml' },\n  output: { target: './src/api.ts', client: 'axios' },\n};\nawait generate(config);\n```\n\nWith global options override:\n\n```ts\nimport { generate, type GlobalOptions } from 'orval';\n\nconst globalOptions: GlobalOptions = {\n  watch: true,\n  // watch: ['./specs/*.yaml'],   // Watch specific patterns\n  clean: true,\n  prettier: true,\n  client: 'fetch',\n  mode: 'split',\n  mocks: true,\n  tsconfig: './tsconfig.json',\n};\n\nawait generate('./orval.config.ts', process.cwd(), globalOptions);\n```\n\nFunction signature:\n\n```ts\nfunction generate(\n  optionsExport?: string | OptionsExport,\n  workspace?: string,\n  options?: GlobalOptions,\n): Promise<void>;\n```\n\nBuild script integration:\n\n```json\n{\n  \"scripts\": {\n    \"generate\": \"node scripts/generate-api.js\",\n    \"dev\": \"npm run generate && next dev\",\n    \"build\": \"npm run generate && next build\"\n  }\n}\n```\n\n```js\n// scripts/generate-api.js\nconst { generate } = require('orval');\n\nasync function main() {\n  try {\n    await generate();\n    console.log('API client generated successfully');\n  } catch (error) {\n    console.error('Failed to generate API client:', error);\n    process.exit(1);\n  }\n}\n\nmain();\n```\n\n<!-- File: skills/orval/zod-validation.md (Tokens: ~483 | Category: anthropic-skill) -->\n# Zod Schema Generation\n\n## Standalone Zod Schemas\n\n```ts\noutput: {\n  client: 'zod',\n  target: './src/api/schemas',\n}\n```\n\nGenerated:\n\n```ts\nexport const createPetsBody = zod.object({\n  id: zod.number(),\n  name: zod.string(),\n  tag: zod.string().optional(),\n});\n```\n\n## Combined with HTTP Client\n\n```ts\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'react-query',\n      target: 'src/api/endpoints',\n      schemas: 'src/api/models',\n    },\n  },\n  petstoreZod: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'zod',\n      target: 'src/api/endpoints',\n      fileExtension: '.zod.ts', // Avoid filename conflicts\n    },\n  },\n});\n```\n\n## Zod Options\n\n```ts\noverride: {\n  zod: {\n    strict: {\n      response: true,\n      query: true,\n      param: true,\n      header: true,\n      body: true,\n    },\n    coerce: {\n      query: ['string', 'number', 'boolean'],\n    },\n    generate: {\n      param: true,\n      body: true,\n      response: true,\n      query: true,\n      header: true,\n    },\n    preprocess: {\n      response: {\n        name: 'stripNill',\n        path: './src/mutators.ts',\n      },\n    },\n    generateEachHttpStatus: true,\n    dateTimeOptions: { ... },\n    timeOptions: { ... },\n  },\n}\n```\n\nPreprocess example for stripping null/undefined before validation:\n\n```ts\nexport const stripNill = (object: unknown) =>\n  !!object && typeof object === 'object' && !Array.isArray(object)\n    ? Object.fromEntries(\n        Object.entries(object).filter(\n          ([_, value]) => value !== null && value !== undefined,\n        ),\n      )\n    : object;\n```\n\n## Runtime Validation with Fetch Client\n\n```ts\noutput: {\n  client: 'fetch',\n  override: {\n    fetch: {\n      runtimeValidation: true,  // Validate responses with Zod schemas\n    },\n  },\n}\n```\n\n<!-- File: skills/README.md (Tokens: ~395 | Category: anthropic-skill) -->\n# Orval AI Agent Skills\n\nOfficial AI agent skill for generating type-safe API clients, hooks, schemas, mocks, and server handlers from OpenAPI specs using [Orval](https://orval.dev).\n\nSkills are automatically discovered and used by the agent based on context — they don't appear in slash-command menus.\n\n## Installation\n\n### Claude Code\n\n```bash\n/plugin marketplace add orval-labs/orval\n```\n\n### Cursor\n\nAdd a remote GitHub rule pointing to this repository.\n\n### Any agent (skills.sh)\n\n```bash\nnpx skills add orval-labs/orval\n```\n\n## What's Included\n\nThe `orval` skill covers:\n\n- All clients: React/Vue/Svelte/Solid/Angular Query, SWR, Fetch, Axios, Hono, MCP\n- Zod schema generation and runtime validation\n- MSW mock generation with test setup patterns\n- Custom HTTP mutators and authentication patterns\n- Hono server handlers with response validation\n- NDJSON streaming, programmatic API, and advanced configuration\n\n## Structure\n\n```\nskills/orval/\n├── SKILL.md               # Core skill (always loaded)\n├── tanstack-query.md      # React/Vue/Svelte/Solid Query, SWR\n├── angular.md             # Angular Query and HttpClient\n├── solid-start.md         # SolidStart query/action primitives\n├── hono.md                # Hono server handlers\n├── custom-http-clients.md # Custom mutators, auth patterns\n├── zod-validation.md      # Zod schema generation\n├── mocking-msw.md         # MSW mocks and test setup\n├── advanced-config.md     # Type generation, overrides, enums\n└── tooling-workflow.md    # MCP, NDJSON, hooks, programmatic API\n```\n\nReference files are loaded on demand when the user's question matches the topic.\n\n<!-- File: .claude-plugin/marketplace.json (Tokens: ~95 | Category: marketplace) -->\n{\n  \"name\": \"orval\",\n  \"description\": \"Orval's official plugin for Claude Code\",\n  \"plugins\": {\n    \"orval\": {\n      \"name\": \"orval\",\n      \"source\": \"./skills/orval\",\n      \"description\": \"Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, and MCP servers from OpenAPI specs\"\n    }\n  }\n}\n\n<!-- File: packages/angular/README.md (Tokens: ~981 | Category: plugin-manifest) -->\n# `@orval/angular`\n\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n![orval - Restful Client Generator](../../logo/orval-logo-horizontal.svg?raw=true)\n\nAngular generator support for [Orval](https://orval.dev).\n\nThis package powers Orval's Angular output and is responsible for generating:\n\n- injectable Angular `HttpClient` service classes\n- signal-first Angular `httpResource` helpers\n- mixed `both` mode output with service classes plus sibling `*.resource.ts`\n  files\n- Angular-specific response typing, request options, runtime validation, and\n  helper utilities\n\nIn most application projects you configure Angular output through the main\n`orval` package. This package exists so the Angular generator can be versioned,\ntested, and consumed as a standalone builder inside the Orval monorepo.\n\nVisit [orval.dev](https://orval.dev) for guides, API docs, and examples.\n\n## What it generates\n\n`@orval/angular` supports three Angular retrieval modes through\n`override.angular.retrievalClient` (or the legacy `override.angular.client`\nalias):\n\n| Mode           | Generated output                                               | Best for                                                    |\n| -------------- | -------------------------------------------------------------- | ----------------------------------------------------------- |\n| `httpClient`   | Retrievals stay on injectable Angular service classes          | Conventional service-based Angular APIs                     |\n| `httpResource` | Signal-first resource helpers for retrieval-style operations   | Angular apps using signals for read flows                   |\n| `both`         | Service classes plus sibling `*.resource.ts` retrieval helpers | Projects that want signal-first reads and imperative writes |\n\nMutation-style operations continue to use generated `HttpClient` service\nmethods by default unless a per-operation override changes classification.\n\nIf `override.angular.retrievalClient` is omitted, Angular generation defaults to\n`httpClient` mode.\n\n## Example configuration\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: {\n      target: './petstore.yaml',\n    },\n    output: {\n      client: 'angular',\n      target: 'src/api/petstore.ts',\n      schemas: 'src/api/model',\n      mode: 'tags-split',\n      override: {\n        angular: {\n          retrievalClient: 'httpResource',\n          runtimeValidation: true,\n        },\n      },\n    },\n  },\n});\n```\n\nFor end-user docs and richer examples, see:\n\n- [Angular guide](https://orval.dev/guides/angular)\n- [Angular sample app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n\n## Angular-specific features\n\nThis package includes support for:\n\n- `HttpClient` observe overload generation\n- signal-based parameter generation for `httpResource`\n- multi-content-type response branching via generated `Accept` helpers\n- Zod-backed runtime validation for Angular output\n- resource option helpers such as `defaultValue`, `debugName`, `injector`, and\n  `equal`\n- generated `ClientResult` / `ResourceResult` aliases\n- `ResourceState<T>` and `toResourceState()` helpers for resource integration\n\n## Development\n\nUseful package-local scripts:\n\n- `pnpm --filter @orval/angular build`\n- `pnpm --filter @orval/angular test`\n- `pnpm --filter @orval/angular lint`\n- `pnpm --filter @orval/angular typecheck`\n\n## More samples\n\nYou can explore additional Orval samples here:\n\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/axios/README.md (Tokens: ~450 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/core/README.md (Tokens: ~447 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/effect/README.md (Tokens: ~626 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# @orval/effect\n\nGenerates [Effect Schema](https://effect.website/docs/schema/introduction/) validators from OpenAPI specifications.\n\n## Install\n\n```sh\nnpm install -D @orval/effect\nnpm install effect\n```\n\n`effect` is a peer dependency (`>=3.10`, Effect 4 included). `@orval/effect` does not bundle it, and generates Effect 3 or Effect 4 syntax to match the installed version.\n\n## Usage\n\nSet `client: 'effect'` in your `orval.config`:\n\n```ts\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    input: { target: './petstore.yaml' },\n    output: {\n      client: 'effect',\n      target: './src/api/schemas',\n      mode: 'single',\n    },\n  },\n});\n```\n\n## Generated output\n\n```ts\nimport { Schema as S } from 'effect';\n\nexport const ListPetsQueryParams = S.Struct({\n  limit: S.optional(S.String).annotations({\n    description: 'How many items to return at one time (max 100)',\n  }),\n});\n```\n\nSee the [Effect guide](https://orval.dev/guides/effect) and the [`swr-with-effect` sample](https://github.com/orval-labs/orval/tree/master/samples/swr-with-effect) for more.\n\n## Why Effect alongside Zod?\n\n`@orval/effect` mirrors `@orval/zod`'s output shape, but Effect Schemas bring capabilities Zod can't:\n\n- **Encoded vs decoded type duality** — `Schema.Type<S>` (runtime) and `Schema.Encoded<S>` (wire) are distinct; `Schema.encode` round-trips back to the wire shape.\n- **Branded types as a generator option** — `override.effect.useBrandedTypes: true` turns named schemas into Effect brands for nominal-typed IDs without hand-writing `.brand<...>()`.\n- **First-class annotations** — OpenAPI `description`, `title`, `examples` flow into `S.annotations(...)` and stay queryable at the AST level.\n- **AST, not method chains** — schemas are introspectable artifacts, composable structurally by downstream tooling.\n- **Effect runtime integration** — decoded results pipe straight into Effect's typed-error / retry / concurrency primitives.\n\n## Configuration\n\nOptions are read from `override.effect.*`:\n\n- `strict` — fail on extra fields in object schemas\n- `generate` — fine-grained control over which schemas (params/body/response) are emitted\n- `useBrandedTypes` — map named schemas to branded types\n- `generateEachHttpStatus` — emit a schema per response status code\n\n<!-- File: packages/fetch/README.md (Tokens: ~477 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [nx fastify react](https://github.com/orval-labs/orval/tree/master/samples/nx-fastify-react)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/hono/README.md (Tokens: ~450 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/mcp/README.md (Tokens: ~573 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### How to use the generated mcp server\n\nAdd a setting to the mcp client to launch the generated `server.ts`.\nFor example, like this:\n\n```\n\"pet-store-server\": {\n  \"command\": \"docker\",\n  \"args\": [\n    \"run\",\n    \"-i\",\n    \"--rm\",\n    \"pet-store-mcp\",\n    \"bash\",\n    \"-c\",\n    \"ts-node\",\n    \"src/gen/server.ts\"\n  ],\n  \"disabled\": false,\n  \"alwaysAllow\": []\n}\n```\n\nHere, `src/gen/server.ts` is started using `Docker`.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/mock/README.md (Tokens: ~450 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restful Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/orval/README.md (Tokens: ~485 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/orval-labs/orval/master/logo/orval-logo-horizontal.svg\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [pinia colada](https://github.com/orval-labs/orval/tree/master/samples/pinia-colada)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/query/README.md (Tokens: ~450 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/solid-start/README.md (Tokens: ~736 | Category: plugin-manifest) -->\n# @orval/solid-start\n\nSolidStart client for Orval - generates type-safe API client code using SolidStart primitives.\n\n## Features\n\n- ✅ Generates SolidStart `query()` for GET requests\n- ✅ Generates SolidStart `action()` for mutations (POST, PUT, PATCH, DELETE)\n- ✅ Type-safe API calls\n- ✅ Full TypeScript support\n- ✅ Works with SolidStart's server-side execution model\n- ✅ Uses native Fetch API by default\n- ✅ Supports custom mutators with Fetch API signature\n\n## Installation\n\n```bash\nnpm install @orval/solid-start\n# or\nbun add @orval/solid-start\n# or\npnpm add @orval/solid-start\n```\n\n## Usage\n\nIn your Orval configuration file:\n\n```typescript\nimport { defineConfig } from 'orval';\n\nexport default defineConfig({\n  petstore: {\n    output: {\n      target: './src/api/endpoints.ts',\n      schemas: './src/api/model',\n      client: 'solid-start',\n    },\n    input: {\n      target: './petstore.yaml',\n    },\n  },\n});\n```\n\n## Generated Code\n\nFor GET requests, Orval generates SolidStart queries:\n\n```typescript\nexport const PetstoreApi = {\n  getPets: query(async (limit?: number) => {\n    const response = await fetch(`/api/pets?limit=${limit}`, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json() as Promise<Pet[]>;\n  }, 'getPets'),\n};\n```\n\nFor mutations (POST, PUT, PATCH, DELETE), Orval generates SolidStart actions:\n\n```typescript\nexport const PetstoreApi = {\n  createPet: action(async (pet: Pet) => {\n    const response = await fetch(`/api/pets`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(pet),\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json() as Promise<Pet>;\n  }, 'createPet'),\n};\n```\n\n## Using in Your SolidStart App\n\n```typescript\nimport { PetstoreApi } from './api/endpoints';\n\n// In a component\nfunction Pets() {\n  const pets = createAsync(() => PetstoreApi.getPets(10));\n\n  return (\n    <div>\n      <For each={pets()}>\n        {(pet) => <div>{pet.name}</div>}\n      </For>\n    </div>\n  );\n}\n\n// For mutations\nfunction CreatePet() {\n  const createPet = useAction(PetstoreApi.createPet);\n\n  const handleSubmit = async (formData: FormData) => {\n    await createPet({ name: formData.get('name') as string });\n  };\n\n  return <form action={handleSubmit}>...</form>;\n}\n```\n\n## Comparison with solid-query\n\n- **@orval/solid-start**: Uses native SolidStart primitives (`query`, `action`) for server-side data fetching\n- **@orval/solid-query**: Uses TanStack Solid Query (`createQuery`, `createMutation`) for client-side data management\n\nChoose `solid-start` when you want to leverage SolidStart's built-in server functions and caching.\nChoose `solid-query` when you need advanced client-side query management features like automatic refetching, optimistic updates, etc.\n\n<!-- File: packages/swr/README.md (Tokens: ~450 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n\n<!-- File: packages/zod/README.md (Tokens: ~450 | Category: plugin-manifest) -->\n[![npm version](https://badge.fury.io/js/orval.svg)](https://badge.fury.io/js/orval)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://github.com/orval-labs/orval/actions/workflows/tests.yaml/badge.svg)](https://github.com/orval-labs/orval/actions/workflows/tests.yaml)\n\n<p align=\"center\">\n  <img src=\"../../logo/orval-logo-horizontal.svg?raw=true\" width=\"500\" height=\"160\" alt=\"orval - Restfull Client Generator\" />\n</p>\n<h1 align=\"center\">\n  Visit <a href=\"https://orval.dev\" target=\"_blank\">orval.dev</a> for docs, guides, API and beer!\n</h1>\n\n### Code Generation\n\n`orval` generates type-safe JS clients (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in `yaml` or `json` formats.\n\n`Generate`, `valid`, `cache` and `mock` in your React, Vue, Svelte and Angular applications all with your OpenAPI specification.\n\n### Samples\n\nYou can find below some samples\n\n- [react app](https://github.com/orval-labs/orval/tree/master/samples/react-app)\n- [react query](https://github.com/orval-labs/orval/tree/master/samples/react-query)\n- [svelte query](https://github.com/orval-labs/orval/tree/master/samples/svelte-query)\n- [vue query](https://github.com/orval-labs/orval/tree/master/samples/vue-query)\n- [react app with swr](https://github.com/orval-labs/orval/tree/master/samples/react-app-with-swr)\n- [angular app](https://github.com/orval-labs/orval/tree/master/samples/angular-app)\n- [hono](https://github.com/orval-labs/orval/tree/master/samples/hono)\n- [next app with fetch](https://github.com/orval-labs/orval/tree/master/samples/next-app-with-fetch)\n</yakaai_skills>"}