@nexusts/openapi 0.8.4 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,5 @@
3
3
  * body. Auto-derivation from `@Validate({ body })` runs first; explicit
4
4
  * `@ApiBody` decorators take precedence.
5
5
  */
6
- import "reflect-metadata";
7
6
  import { type ApiBodyOptions } from "../types.js";
8
7
  export declare function ApiBody(options: ApiBodyOptions): MethodDecorator;
@@ -3,6 +3,5 @@
3
3
  *
4
4
  * Decorate a controller method to describe the operation in the spec.
5
5
  */
6
- import "reflect-metadata";
7
6
  import { type ApiOperationOptions } from "../types.js";
8
7
  export declare function ApiOperation(options: ApiOperationOptions): MethodDecorator;
@@ -4,7 +4,6 @@
4
4
  * auto-derives path params from the route pattern (`/users/:id` → `id`).
5
5
  * Use this when you want to override the schema or add a description.
6
6
  */
7
- import "reflect-metadata";
8
7
  import { type ApiParamOptions } from "../types.js";
9
8
  export declare function ApiParam(options: ApiParamOptions): MethodDecorator;
10
9
  /**
@@ -16,7 +16,6 @@
16
16
  * `JSONSchema`. Without a `schema`, the type is inferred from the
17
17
  * TypeScript reflection of the property's design:type metadata.
18
18
  */
19
- import "reflect-metadata";
20
19
  import { type ApiPropertyOptions } from "../types.js";
21
20
  export declare function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator;
22
21
  /** Class-level: mark a DTO class so its properties can be lifted into a schema. */
@@ -4,6 +4,5 @@
4
4
  * Decorate a controller method to describe one of its responses.
5
5
  * Multiple `@ApiResponse` calls accumulate.
6
6
  */
7
- import "reflect-metadata";
8
7
  import { type ApiResponseOptions } from "../types.js";
9
8
  export declare function ApiResponse(status: number | string, options: ApiResponseOptions): MethodDecorator;
@@ -1,8 +1,3 @@
1
- /**
2
- * `@ApiSecurity('bearerAuth', [])` — declare the security requirements
3
- * for an operation or controller.
4
- */
5
- import "reflect-metadata";
6
1
  export declare function ApiSecurity(name: string, scopes?: string[]): ClassDecorator & MethodDecorator;
7
2
  /** `@ApiExclude()` — exclude a route from the spec. */
8
3
  export declare function ApiExclude(): MethodDecorator;
package/dist/index.js CHANGED
@@ -81,7 +81,6 @@ function escapeJsonForAttr(s) {
81
81
  }
82
82
 
83
83
  // packages/openapi/src/types.ts
84
- import"reflect-metadata";
85
84
  var OPENAPI_META = {
86
85
  TAGS: "nexus:openapi:tags",
87
86
  OPERATION: "nexus:openapi:operation",
@@ -96,7 +95,6 @@ var OPENAPI_META = {
96
95
  CONSUMES: "nexus:openapi:consumes"
97
96
  };
98
97
  // packages/openapi/src/openapi.service.ts
99
- import"reflect-metadata";
100
98
  import { Inject, Injectable } from "@nexusts/core";
101
99
 
102
100
  // packages/openapi/src/zod-to-json-schema.ts
@@ -417,6 +415,7 @@ function safeCall(fn) {
417
415
  }
418
416
 
419
417
  // packages/openapi/src/openapi.service.ts
418
+ import { safeGetMeta } from "@nexusts/core/di/safe-reflect";
420
419
  class OpenAPIService {
421
420
  static TOKEN = Symbol.for("nexus:OpenAPIService");
422
421
  #config;
@@ -434,7 +433,7 @@ class OpenAPIService {
434
433
  getSpec() {
435
434
  const paths = {};
436
435
  for (const route of this.#routes) {
437
- if (Reflect.getMetadata(OPENAPI_META.EXCLUDE, route.target.constructor, route.propertyKey))
436
+ if (safeGetMeta(OPENAPI_META.EXCLUDE, route.target.constructor, route.propertyKey))
438
437
  continue;
439
438
  const op = this.buildOperation(route);
440
439
  const normalized = this.normalizePath(route.path);
@@ -464,14 +463,14 @@ class OpenAPIService {
464
463
  buildOperation(route) {
465
464
  const ctor = route.target.constructor ?? route.target;
466
465
  const propKey = route.propertyKey;
467
- const classTags = Reflect.getMetadata(OPENAPI_META.TAGS, ctor) ?? [];
468
- const opMeta = Reflect.getMetadata(OPENAPI_META.OPERATION, ctor, propKey);
466
+ const classTags = safeGetMeta(OPENAPI_META.TAGS, ctor) ?? [];
467
+ const opMeta = safeGetMeta(OPENAPI_META.OPERATION, ctor, propKey);
469
468
  const opTags = opMeta?.tags ?? [];
470
469
  const tags = [...new Set([...classTags, ...opTags])];
471
470
  const params = [];
472
471
  const pathParams = this.extractPathParams(route.path);
473
472
  for (const name of pathParams) {
474
- const override = (Reflect.getMetadata(OPENAPI_META.PARAMS, ctor, propKey) ?? []).find((p) => p.name === name);
473
+ const override = (safeGetMeta(OPENAPI_META.PARAMS, ctor, propKey) ?? []).find((p) => p.name === name);
475
474
  params.push({
476
475
  name,
477
476
  in: "path",
@@ -486,7 +485,7 @@ class OpenAPIService {
486
485
  if (route.validation?.headers) {
487
486
  this.appendZodParams(ctor, propKey, "header", route.validation.headers, params, false);
488
487
  }
489
- const explicitQueries = Reflect.getMetadata(OPENAPI_META.QUERIES, ctor, propKey) ?? [];
488
+ const explicitQueries = safeGetMeta(OPENAPI_META.QUERIES, ctor, propKey) ?? [];
490
489
  for (const q of explicitQueries) {
491
490
  const idx = params.findIndex((p) => p.in === "query" && p.name === q.name);
492
491
  const param = {
@@ -501,7 +500,7 @@ class OpenAPIService {
501
500
  else
502
501
  params.push(param);
503
502
  }
504
- const explicitParams = Reflect.getMetadata(OPENAPI_META.PARAMS, ctor, propKey) ?? [];
503
+ const explicitParams = safeGetMeta(OPENAPI_META.PARAMS, ctor, propKey) ?? [];
505
504
  for (const p of explicitParams) {
506
505
  const idx = params.findIndex((x) => x.in === "path" && x.name === p.name);
507
506
  const param = {
@@ -517,7 +516,7 @@ class OpenAPIService {
517
516
  params.push(param);
518
517
  }
519
518
  let requestBody;
520
- const bodyMeta = Reflect.getMetadata(OPENAPI_META.BODY, ctor, propKey);
519
+ const bodyMeta = safeGetMeta(OPENAPI_META.BODY, ctor, propKey);
521
520
  if (bodyMeta?.schema || route.validation?.body) {
522
521
  const schema = bodyMeta?.schema ?? route.validation?.body;
523
522
  const mediaType = { schema: this.toSchema(schema) };
@@ -530,7 +529,7 @@ class OpenAPIService {
530
529
  };
531
530
  }
532
531
  const responses = {};
533
- const responseMetas = Reflect.getMetadata(OPENAPI_META.RESPONSES, ctor, propKey) ?? [];
532
+ const responseMetas = safeGetMeta(OPENAPI_META.RESPONSES, ctor, propKey) ?? [];
534
533
  for (const [status, opt] of responseMetas) {
535
534
  const r = { description: opt.description };
536
535
  if (opt.schema) {
@@ -618,7 +617,6 @@ function isZodLike(s) {
618
617
  return typeof t === "string" && t.startsWith("Zod");
619
618
  }
620
619
  // packages/openapi/src/openapi.module.ts
621
- import"reflect-metadata";
622
620
  import { Module } from "@nexusts/core";
623
621
  class OpenAPIModule {
624
622
  static forRoot(config) {
@@ -663,82 +661,83 @@ OpenAPIModule = __legacyDecorateClassTS([
663
661
  })
664
662
  ], OpenAPIModule);
665
663
  // packages/openapi/src/decorators/tags.ts
664
+ import { safeGetMeta as safeGetMeta2, safeDefineMeta as safeDefineMeta2 } from "@nexusts/core/di/safe-reflect";
666
665
  function ApiTags(...tags) {
667
666
  return (target) => {
668
- const existing = Reflect.getMetadata(OPENAPI_META.TAGS, target) ?? [];
669
- Reflect.defineMetadata(OPENAPI_META.TAGS, [...existing, ...tags], target);
667
+ const existing = safeGetMeta2(OPENAPI_META.TAGS, target) ?? [];
668
+ safeDefineMeta2(OPENAPI_META.TAGS, [...existing, ...tags], target);
670
669
  };
671
670
  }
672
671
  // packages/openapi/src/decorators/operation.ts
673
- import"reflect-metadata";
672
+ import { safeDefineMeta as safeDefineMeta3 } from "@nexusts/core/di/safe-reflect";
674
673
  function ApiOperation(options) {
675
674
  return (target, propertyKey) => {
676
- Reflect.defineMetadata(OPENAPI_META.OPERATION, options, target.constructor, propertyKey);
675
+ safeDefineMeta3(OPENAPI_META.OPERATION, options, target.constructor, propertyKey);
677
676
  };
678
677
  }
679
678
  // packages/openapi/src/decorators/response.ts
680
- import"reflect-metadata";
679
+ import { safeGetMeta as safeGetMeta4, safeDefineMeta as safeDefineMeta4 } from "@nexusts/core/di/safe-reflect";
681
680
  function ApiResponse(status, options) {
682
681
  return (target, propertyKey) => {
683
- const existing = Reflect.getMetadata(OPENAPI_META.RESPONSES, target.constructor, propertyKey) ?? [];
682
+ const existing = safeGetMeta4(OPENAPI_META.RESPONSES, target.constructor, propertyKey) ?? [];
684
683
  existing.push([String(status), options]);
685
- Reflect.defineMetadata(OPENAPI_META.RESPONSES, existing, target.constructor, propertyKey);
684
+ safeDefineMeta4(OPENAPI_META.RESPONSES, existing, target.constructor, propertyKey);
686
685
  };
687
686
  }
688
687
  // packages/openapi/src/decorators/param.ts
689
- import"reflect-metadata";
688
+ import { safeGetMeta as safeGetMeta5, safeDefineMeta as safeDefineMeta5 } from "@nexusts/core/di/safe-reflect";
690
689
  function ApiParam(options) {
691
690
  return (target, propertyKey) => {
692
- const existing = Reflect.getMetadata(OPENAPI_META.PARAMS, target.constructor, propertyKey) ?? [];
691
+ const existing = safeGetMeta5(OPENAPI_META.PARAMS, target.constructor, propertyKey) ?? [];
693
692
  existing.push(options);
694
- Reflect.defineMetadata(OPENAPI_META.PARAMS, existing, target.constructor, propertyKey);
693
+ safeDefineMeta5(OPENAPI_META.PARAMS, existing, target.constructor, propertyKey);
695
694
  };
696
695
  }
697
696
  function ApiQuery(options) {
698
697
  return (target, propertyKey) => {
699
- const existing = Reflect.getMetadata(OPENAPI_META.QUERIES, target.constructor, propertyKey) ?? [];
698
+ const existing = safeGetMeta5(OPENAPI_META.QUERIES, target.constructor, propertyKey) ?? [];
700
699
  existing.push(options);
701
- Reflect.defineMetadata(OPENAPI_META.QUERIES, existing, target.constructor, propertyKey);
700
+ safeDefineMeta5(OPENAPI_META.QUERIES, existing, target.constructor, propertyKey);
702
701
  };
703
702
  }
704
703
  // packages/openapi/src/decorators/body.ts
705
- import"reflect-metadata";
704
+ import { safeDefineMeta as safeDefineMeta6 } from "@nexusts/core/di/safe-reflect";
706
705
  function ApiBody(options) {
707
706
  return (target, propertyKey) => {
708
- Reflect.defineMetadata(OPENAPI_META.BODY, options, target.constructor, propertyKey);
707
+ safeDefineMeta6(OPENAPI_META.BODY, options, target.constructor, propertyKey);
709
708
  };
710
709
  }
711
710
  // packages/openapi/src/decorators/property.ts
712
- import"reflect-metadata";
711
+ import { safeGetMeta as safeGetMeta7, safeDefineMeta as safeDefineMeta7 } from "@nexusts/core/di/safe-reflect";
713
712
  function ApiProperty(options = {}) {
714
713
  return (target, propertyKey) => {
715
- const existing = Reflect.getMetadata(OPENAPI_META.PROPERTIES, target.constructor) ?? {};
714
+ const existing = safeGetMeta7(OPENAPI_META.PROPERTIES, target.constructor) ?? {};
716
715
  existing[propertyKey] = options;
717
- Reflect.defineMetadata(OPENAPI_META.PROPERTIES, existing, target.constructor);
716
+ safeDefineMeta7(OPENAPI_META.PROPERTIES, existing, target.constructor);
718
717
  };
719
718
  }
720
719
  function ApiSchema(name) {
721
720
  return (target) => {
722
- Reflect.defineMetadata("nexus:openapi:schemaName", name, target);
721
+ safeDefineMeta7("nexus:openapi:schemaName", name, target);
723
722
  };
724
723
  }
725
724
  // packages/openapi/src/decorators/security.ts
726
- import"reflect-metadata";
725
+ import { safeGetMeta as safeGetMeta8, safeDefineMeta as safeDefineMeta8 } from "@nexusts/core/di/safe-reflect";
727
726
  function ApiSecurity(name, scopes = []) {
728
727
  return (target, _propertyKey, _descriptor) => {
729
728
  const key = OPENAPI_META.SECURITY;
730
- const existing = typeof _propertyKey === "string" || typeof _propertyKey === "symbol" ? Reflect.getMetadata(key, target.constructor, _propertyKey) ?? [] : Reflect.getMetadata(key, target) ?? [];
729
+ const existing = typeof _propertyKey === "string" || typeof _propertyKey === "symbol" ? safeGetMeta8(key, target.constructor, _propertyKey) ?? [] : safeGetMeta8(key, target) ?? [];
731
730
  existing.push({ [name]: scopes });
732
731
  if (typeof _propertyKey === "string" || typeof _propertyKey === "symbol") {
733
- Reflect.defineMetadata(key, existing, target.constructor, _propertyKey);
732
+ safeDefineMeta8(key, existing, target.constructor, _propertyKey);
734
733
  } else {
735
- Reflect.defineMetadata(key, existing, target);
734
+ safeDefineMeta8(key, existing, target);
736
735
  }
737
736
  };
738
737
  }
739
738
  function ApiExclude() {
740
739
  return (target, propertyKey) => {
741
- Reflect.defineMetadata(OPENAPI_META.EXCLUDE, true, target.constructor, propertyKey);
740
+ safeDefineMeta8(OPENAPI_META.EXCLUDE, true, target.constructor, propertyKey);
742
741
  };
743
742
  }
744
743
  export {
@@ -759,5 +758,5 @@ export {
759
758
  ApiBody
760
759
  };
761
760
 
762
- //# debugId=CE2341D1AAE8C39064756E2164756E21
761
+ //# debugId=CB69F756A574AB3E64756E2164756E21
763
762
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -3,19 +3,19 @@
3
3
  "sources": ["../src/scalar.ts", "../src/types.ts", "../src/openapi.service.ts", "../src/zod-to-json-schema.ts", "../src/openapi.module.ts", "../src/decorators/tags.ts", "../src/decorators/operation.ts", "../src/decorators/response.ts", "../src/decorators/param.ts", "../src/decorators/body.ts", "../src/decorators/property.ts", "../src/decorators/security.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Scalar UI HTML — a single self-contained page that loads Scalar\n * from the jsDelivr CDN.\n *\n * The page mounts Scalar as a custom-element via `<script\n * id=\"api-reference\" data-url=\"...\">` and waits for the CDN script\n * to upgrade it.\n *\n * No assets are bundled with the framework. No build step required.\n */\n\nexport function scalarHtml(opts: { title: string; specUrl: string; theme?: \"default\" | \"dark\" | \"purple\" | \"alternate\" | \"moon\" | \"solarized\" | \"bluePlanet\" | \"saturn\" | \"kepler\" | \"mars\" | \"deepSpace\" | \"laserwave\" | \"none\" }): string {\n\tconst title = escapeHtml(opts.title);\n\tconst theme = opts.theme ?? \"default\";\n\treturn `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${title} — API Reference</title>\n <meta name=\"description\" content=\"API reference for ${title}, generated from OpenAPI.\" />\n <style>\n :root { color-scheme: light dark; }\n body { margin: 0; font-family: ui-sans-serif, system-ui, sans-serif; }\n </style>\n</head>\n<body>\n <script\n id=\"api-reference\"\n type=\"application/json\"\n data-url=\"${escapeHtml(opts.specUrl)}\"\n data-configuration='${escapeJsonForAttr(JSON.stringify({ theme, hideClientButton: true }))}'\n ></script>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.25.0\"></script>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(s: string): string {\n\treturn s\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&#39;\");\n}\n\n/**\n * Encode a string for use inside an HTML attribute value. We avoid\n * `&quot;` so the value remains valid JSON for Scalar's parser.\n */\nfunction escapeJsonForAttr(s: string): string {\n\treturn s.replace(/'/g, \"&#39;\").replace(/</g, \"&lt;\");\n}",
6
- "/**\n * `nexusjs/openapi` — OpenAPI 3.1 + Scalar UI.\n *\n * @Module({\n * imports: [\n * OpenAPIModule.forRoot({\n * info: { title: 'My API', version: '1.0.0' },\n * servers: [{ url: 'http://localhost:3000' }],\n * }),\n * ],\n * })\n *\n * @Controller('/users')\n * @ApiTags('Users')\n * class UserController {\n * @Get('/')\n * @ApiOperation({ summary: 'List users' })\n * @ApiResponse(200, { description: 'OK', schema: UserSchema })\n * list() { ... }\n * }\n *\n * // -> GET /openapi.json (the spec)\n * // -> GET /docs (Scalar UI)\n */\n\nimport \"reflect-metadata\";\n\n// ---------------------------------------------------------------------------\n// OpenAPI spec types (subset of OpenAPI 3.1 — enough for 95% of real APIs)\n// ---------------------------------------------------------------------------\n\nexport interface OpenAPIConfig {\n\t/** Top-level info block. */\n\tinfo: OpenAPIInfo;\n\t/** Server URLs. Default: [{ url: '/' }]. */\n\tservers?: OpenAPIServer[];\n\t/** Tags grouped at the top of the spec. */\n\ttags?: OpenAPITag[];\n\t/** Path under which the JSON spec is served. Default: '/openapi.json'. */\n\tspecPath?: string;\n\t/** Path under which the Scalar UI is served. Default: '/docs'. */\n\tpath?: string;\n\t/** External docs link. */\n\texternalDocs?: { url: string; description?: string };\n}\n\nexport interface OpenAPIInfo {\n\ttitle: string;\n\tversion: string;\n\tdescription?: string;\n\ttermsOfService?: string;\n\tcontact?: { name?: string; url?: string; email?: string };\n\tlicense?: { name: string; url?: string };\n}\n\nexport interface OpenAPIServer {\n\turl: string;\n\tdescription?: string;\n\tvariables?: Record<string, { default: string; enum?: string[]; description?: string }>;\n}\n\nexport interface OpenAPITag {\n\tname: string;\n\tdescription?: string;\n\texternalDocs?: { url: string; description?: string };\n}\n\n/** OpenAPI Path Item. */\nexport interface OpenAPIPath {\n\t[method: string]: OpenAPIOperation | undefined;\n}\n\n/** OpenAPI Operation. */\nexport interface OpenAPIOperation {\n\ttags?: string[];\n\tsummary?: string;\n\tdescription?: string;\n\toperationId?: string;\n\tparameters?: OpenAPIParameter[];\n\trequestBody?: OpenAPIRequestBody;\n\tresponses: Record<string, OpenAPIResponse>;\n\tdeprecated?: boolean;\n\tsecurity?: OpenAPISecurity[];\n}\n\n/** OpenAPI Parameter (path, query, header, cookie). */\nexport interface OpenAPIParameter {\n\tname: string;\n\tin: \"path\" | \"query\" | \"header\" | \"cookie\";\n\tdescription?: string;\n\trequired?: boolean;\n\tdeprecated?: boolean;\n\tschema: JSONSchema;\n\texample?: unknown;\n\texamples?: Record<string, { summary?: string; value: unknown }>;\n}\n\n/** OpenAPI Request Body. */\nexport interface OpenAPIRequestBody {\n\tdescription?: string;\n\tcontent: Record<string, OpenAPIMediaType>;\n\trequired?: boolean;\n}\n\nexport interface OpenAPIMediaType {\n\tschema: JSONSchema;\n\texample?: unknown;\n\texamples?: Record<string, { summary?: string; value: unknown }>;\n\tencoding?: Record<string, OpenAPIEncoding>;\n}\n\nexport interface OpenAPIEncoding {\n\tcontentType?: string;\n\theaders?: Record<string, OpenAPIParameter>;\n\tstyle?: string;\n\texplode?: boolean;\n\tallowReserved?: boolean;\n}\n\n/** OpenAPI Response. */\nexport interface OpenAPIResponse {\n\tdescription: string;\n\theaders?: Record<string, OpenAPIParameter>;\n\tcontent?: Record<string, OpenAPIMediaType>;\n\tlinks?: Record<string, OpenAPILink>;\n}\n\nexport interface OpenAPILink {\n\toperationRef?: string;\n\toperationId?: string;\n\tparameters?: Record<string, unknown>;\n\tdescription?: string;\n\tserver?: OpenAPIServer;\n}\n\nexport interface OpenAPISecurity {\n\t[name: string]: string[];\n}\n\n/** OpenAPI Component (schemas, parameters, responses, ...). */\nexport interface OpenAPIComponents {\n\tschemas?: Record<string, JSONSchema>;\n\tparameters?: Record<string, OpenAPIParameter>;\n\tresponses?: Record<string, OpenAPIResponse>;\n\trequestBodies?: Record<string, OpenAPIRequestBody>;\n\theaders?: Record<string, OpenAPIParameter>;\n\tsecuritySchemes?: Record<string, OpenAPISecurityScheme>;\n\tlinks?: Record<string, OpenAPILink>;\n}\n\nexport interface OpenAPISecurityScheme {\n\ttype: \"apiKey\" | \"http\" | \"oauth2\" | \"openIdConnect\" | \"mutualTLS\";\n\tdescription?: string;\n\tname?: string;\n\tin?: \"query\" | \"header\" | \"cookie\";\n\tscheme?: string;\n\tbearerFormat?: string;\n\tflows?: unknown;\n\topenIdConnectUrl?: string;\n}\n\nexport interface OpenAPIDocument {\n\topenapi: \"3.1.0\";\n\tinfo: OpenAPIInfo;\n\tservers?: OpenAPIServer[];\n\tpaths: Record<string, OpenAPIPath>;\n\tcomponents?: OpenAPIComponents;\n\ttags?: OpenAPITag[];\n\texternalDocs?: { url: string; description?: string };\n\tsecurity?: OpenAPISecurity[];\n\twebhooks?: Record<string, OpenAPIPath | OpenAPIOperation>;\n}\n\n// ---------------------------------------------------------------------------\n// JSON Schema (subset)\n// ---------------------------------------------------------------------------\n\nexport interface JSONSchema {\n\t$ref?: string;\n\ttype?:\n\t\t| \"string\"\n\t\t| \"number\"\n\t\t| \"integer\"\n\t\t| \"boolean\"\n\t\t| \"object\"\n\t\t| \"array\"\n\t\t| \"null\"\n\t\t| (string & {});\n\tformat?: string;\n\ttitle?: string;\n\tdescription?: string;\n\tdefault?: unknown;\n\texample?: unknown;\n\tenum?: unknown[];\n\tconst?: unknown;\n\tproperties?: Record<string, JSONSchema>;\n\trequired?: string[];\n\tadditionalProperties?: boolean | JSONSchema;\n\titems?: JSONSchema;\n\tprefixItems?: JSONSchema[];\n\tminItems?: number;\n\tmaxItems?: number;\n\tuniqueItems?: boolean;\n\tminimum?: number;\n\tmaximum?: number;\n\tminLength?: number;\n\tmaxLength?: number;\n\tpattern?: string;\n\tnullable?: boolean;\n\toneOf?: JSONSchema[];\n\tanyOf?: JSONSchema[];\n\tallOf?: JSONSchema[];\n\tnot?: JSONSchema;\n\t$defs?: Record<string, JSONSchema>;\n\t$schema?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Decorator payload types\n// ---------------------------------------------------------------------------\n\nexport interface ApiOperationOptions {\n\tsummary?: string;\n\tdescription?: string;\n\toperationId?: string;\n\tdeprecated?: boolean;\n\ttags?: string[];\n}\n\nexport interface ApiResponseOptions {\n\tdescription: string;\n\tschema?: unknown;\n\theaders?: Record<string, OpenAPIParameter>;\n\texample?: unknown;\n\texamples?: Record<string, { summary?: string; value: unknown }>;\n}\n\nexport interface ApiParamOptions {\n\tname: string;\n\tdescription?: string;\n\trequired?: boolean;\n\tschema?: unknown;\n\texample?: unknown;\n}\n\nexport interface ApiQueryOptions extends Omit<ApiParamOptions, \"name\"> {\n\tname: string;\n}\n\nexport interface ApiBodyOptions {\n\tdescription?: string;\n\trequired?: boolean;\n\tschema?: unknown;\n\texample?: unknown;\n}\n\nexport interface ApiPropertyOptions {\n\tdescription?: string;\n\trequired?: boolean;\n\texample?: unknown;\n\tdeprecated?: boolean;\n\tformat?: string;\n\tschema?: unknown;\n}\n\nexport interface ApiSecurityOptions {\n\t[name: string]: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Reflect metadata keys\n// ---------------------------------------------------------------------------\n\nexport const OPENAPI_META = {\n\tTAGS: \"nexus:openapi:tags\",\n\tOPERATION: \"nexus:openapi:operation\",\n\tRESPONSES: \"nexus:openapi:responses\",\n\tPARAMS: \"nexus:openapi:params\",\n\tQUERIES: \"nexus:openapi:queries\",\n\tBODY: \"nexus:openapi:body\",\n\tPROPERTIES: \"nexus:openapi:properties\",\n\tSECURITY: \"nexus:openapi:security\",\n\tEXCLUDE: \"nexus:openapi:exclude\",\n\tPRODUCES: \"nexus:openapi:produces\",\n\tCONSUMES: \"nexus:openapi:consumes\",\n} as const;\n",
7
- "/**\n * `OpenAPIService` — walks the framework's route table, reads\n * `@ApiTags` / `@ApiOperation` / `@ApiResponse` / `@ApiBody` /\n * `@ApiParam` / `@ApiQuery` / `@Validate` metadata, and produces an\n * OpenAPI 3.1 document.\n *\n * The document is rebuilt on demand (cheap: in-memory walk) and\n * exposed via `getSpec()`. The framework's router already exposes a\n * `getRoutes()` method that returns the registered route list, so\n * the spec is always in sync with the actual API.\n */\nimport \"reflect-metadata\";\nimport { Inject, Injectable } from \"@nexusts/core\";\nimport type {\n\tApiOperationOptions,\n\tApiParamOptions,\n\tApiPropertyOptions,\n\tApiResponseOptions,\n\tJSONSchema,\n\tOPENAPI_META as _OM,\n\tOpenAPIConfig,\n\tOpenAPIDocument,\n\tOpenAPIMediaType,\n\tOpenAPIOperation,\n\tOpenAPIParameter,\n\tOpenAPIRequestBody,\n\tOpenAPIResponse,\n} from \"./types.js\";\nimport { OPENAPI_META } from \"./types.js\";\nimport { zodToJsonSchema } from \"./zod-to-json-schema.js\";\n\n@Injectable()\nexport class OpenAPIService {\n\t/** DI token. */\n\tstatic readonly TOKEN = Symbol.for(\"nexus:OpenAPIService\");\n\n\t#config: OpenAPIConfig;\n\t#components: { schemas: Map<string, JSONSchema> } = { schemas: new Map() };\n\t#routes: { method: string; path: string; target: any; propertyKey: string | symbol; validation?: any }[] = [];\n\n\tconstructor(@Inject(\"OPENAPI_CONFIG\") config: OpenAPIConfig) {\n\t\tthis.#config = config;\n\t}\n\n\t/**\n\t * Inject the route list. The framework's router calls this on boot.\n\t * Each entry is the data needed to emit one OpenAPI operation.\n\t */\n\tsetRoutes(\n\t\troutes: {\n\t\t\tmethod: string;\n\t\t\tpath: string;\n\t\t\ttarget: any;\n\t\t\tpropertyKey: string | symbol;\n\t\t\tvalidation?: { body?: unknown; query?: unknown; params?: unknown; headers?: unknown };\n\t\t}[],\n\t): void {\n\t\tthis.#routes = routes;\n\t}\n\n\t/** Register a named component schema (e.g. for re-use). */\n\tregisterSchema(name: string, schema: JSONSchema): void {\n\t\tthis.#components.schemas.set(name, schema);\n\t}\n\n\t/** Build the OpenAPI 3.1 document. */\n\tgetSpec(): OpenAPIDocument {\n\t\tconst paths: Record<string, Record<string, OpenAPIOperation>> = {};\n\t\tfor (const route of this.#routes) {\n\t\t\tif (Reflect.getMetadata(OPENAPI_META.EXCLUDE, route.target.constructor, route.propertyKey)) continue;\n\t\t\tconst op = this.buildOperation(route);\n\t\t\tconst normalized = this.normalizePath(route.path);\n\t\t\tconst method = route.method.toLowerCase();\n\t\t\tif (!paths[normalized]) paths[normalized] = {};\n\t\t\tpaths[normalized][method] = op;\n\t\t}\n\n\t\tconst doc: OpenAPIDocument = {\n\t\t\topenapi: \"3.1.0\",\n\t\t\tinfo: this.#config.info,\n\t\t\tpaths,\n\t\t};\n\t\tif (this.#config.servers?.length) doc.servers = this.#config.servers;\n\t\tif (this.#config.tags?.length) doc.tags = this.#config.tags;\n\t\tif (this.#config.externalDocs) doc.externalDocs = this.#config.externalDocs;\n\t\tif (this.#components.schemas.size > 0) {\n\t\t\tdoc.components = {\n\t\t\t\tschemas: Object.fromEntries(this.#components.schemas),\n\t\t\t};\n\t\t}\n\t\treturn doc;\n\t}\n\n\t/**\n\t * Build one operation from a route.\n\t */\n\tprivate buildOperation(route: {\n\t\tmethod: string;\n\t\tpath: string;\n\t\ttarget: any;\n\t\tpropertyKey: string | symbol;\n\t\tvalidation?: { body?: unknown; query?: unknown; params?: unknown; headers?: unknown };\n\t}): OpenAPIOperation {\n\t\tconst ctor = route.target.constructor ?? route.target;\n\t\tconst propKey = route.propertyKey;\n\n\t\t// 1. Tags from class + operation\n\t\tconst classTags: string[] = Reflect.getMetadata(OPENAPI_META.TAGS, ctor) ?? [];\n\t\tconst opMeta: ApiOperationOptions | undefined = Reflect.getMetadata(\n\t\t\tOPENAPI_META.OPERATION,\n\t\t\tctor,\n\t\t\tpropKey,\n\t\t);\n\t\tconst opTags: string[] = opMeta?.tags ?? [];\n\t\tconst tags = [...new Set([...classTags, ...opTags])];\n\n\t\t// 2. Parameters (path / query / headers)\n\t\tconst params: OpenAPIParameter[] = [];\n\t\t// Auto-derive path params from the route pattern.\n\t\tconst pathParams = this.extractPathParams(route.path);\n\t\tfor (const name of pathParams) {\n\t\t\tconst override = (\n\t\t\t\t(Reflect.getMetadata(OPENAPI_META.PARAMS, ctor, propKey) ?? []) as ApiParamOptions[]\n\t\t\t).find((p) => p.name === name);\n\t\t\tparams.push({\n\t\t\t\tname,\n\t\t\t\tin: \"path\",\n\t\t\t\trequired: true,\n\t\t\t\tdescription: override?.description,\n\t\t\t\tschema: override?.schema ? this.toSchema(override.schema) : { type: \"string\" },\n\t\t\t});\n\t\t}\n\t\t// Auto-derive query params from `@Validate({ query })`.\n\t\tif (route.validation?.query) {\n\t\t\tthis.appendZodParams(\n\t\t\t\tctor,\n\t\t\t\tpropKey,\n\t\t\t\t\"query\",\n\t\t\t\troute.validation.query,\n\t\t\t\tparams,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\t// Auto-derive headers from `@Validate({ headers })`.\n\t\tif (route.validation?.headers) {\n\t\t\tthis.appendZodParams(\n\t\t\t\tctor,\n\t\t\t\tpropKey,\n\t\t\t\t\"header\",\n\t\t\t\troute.validation.headers,\n\t\t\t\tparams,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\t// Explicit `@ApiQuery` decorators override / supplement.\n\t\tconst explicitQueries: ApiParamOptions[] =\n\t\t\tReflect.getMetadata(OPENAPI_META.QUERIES, ctor, propKey) ?? [];\n\t\tfor (const q of explicitQueries) {\n\t\t\t// Replace any auto-derived entry for the same name.\n\t\t\tconst idx = params.findIndex(\n\t\t\t\t(p) => p.in === \"query\" && p.name === q.name,\n\t\t\t);\n\t\t\tconst param: OpenAPIParameter = {\n\t\t\t\tname: q.name,\n\t\t\t\tin: \"query\",\n\t\t\t\trequired: q.required ?? false,\n\t\t\t\tdescription: q.description,\n\t\t\t\tschema: q.schema ? this.toSchema(q.schema) : { type: \"string\" },\n\t\t\t};\n\t\t\tif (idx >= 0) params[idx] = param;\n\t\t\telse params.push(param);\n\t\t}\n\t\t// Explicit `@ApiParam` decorators override path params.\n\t\tconst explicitParams: ApiParamOptions[] =\n\t\t\tReflect.getMetadata(OPENAPI_META.PARAMS, ctor, propKey) ?? [];\n\t\tfor (const p of explicitParams) {\n\t\t\tconst idx = params.findIndex(\n\t\t\t\t(x) => x.in === \"path\" && x.name === p.name,\n\t\t\t);\n\t\t\tconst param: OpenAPIParameter = {\n\t\t\t\tname: p.name,\n\t\t\t\tin: \"path\",\n\t\t\t\trequired: p.required ?? true,\n\t\t\t\tdescription: p.description,\n\t\t\t\tschema: p.schema ? this.toSchema(p.schema) : { type: \"string\" },\n\t\t\t};\n\t\t\tif (idx >= 0) params[idx] = param;\n\t\t\telse params.push(param);\n\t\t}\n\n\t\t// 3. Request body\n\t\tlet requestBody: OpenAPIRequestBody | undefined;\n\t\tconst bodyMeta = Reflect.getMetadata(OPENAPI_META.BODY, ctor, propKey);\n\t\tif (bodyMeta?.schema || route.validation?.body) {\n\t\t\tconst schema = bodyMeta?.schema ?? route.validation?.body;\n\t\t\tconst mediaType: OpenAPIMediaType = { schema: this.toSchema(schema) };\n\t\t\tif (bodyMeta?.example !== undefined) mediaType.example = bodyMeta.example;\n\t\t\trequestBody = {\n\t\t\t\tdescription: bodyMeta?.description ?? \"Request body\",\n\t\t\t\tcontent: { \"application/json\": mediaType },\n\t\t\t\trequired: bodyMeta?.required ?? true,\n\t\t\t};\n\t\t}\n\n\t\t// 4. Responses\n\t\tconst responses: Record<string, OpenAPIResponse> = {};\n\t\tconst responseMetas: Array<[string, ApiResponseOptions]> =\n\t\t\tReflect.getMetadata(OPENAPI_META.RESPONSES, ctor, propKey) ?? [];\n\t\tfor (const [status, opt] of responseMetas) {\n\t\t\tconst r: OpenAPIResponse = { description: opt.description };\n\t\t\tif (opt.schema) {\n\t\t\t\tr.content = {\n\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\tschema: this.toSchema(opt.schema),\n\t\t\t\t\t\t...(opt.example !== undefined ? { example: opt.example } : {}),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tresponses[status] = r;\n\t\t}\n\t\t// Default 200 OK if no responses declared.\n\t\tif (Object.keys(responses).length === 0) {\n\t\t\tresponses[\"200\"] = { description: \"Successful response\" };\n\t\t}\n\n\t\t// 5. Compose\n\t\tconst op: OpenAPIOperation = {\n\t\t\tresponses,\n\t\t};\n\t\tif (tags.length > 0) op.tags = tags;\n\t\tif (opMeta?.summary) op.summary = opMeta.summary;\n\t\tif (opMeta?.description) op.description = opMeta.description;\n\t\tif (opMeta?.operationId) op.operationId = opMeta.operationId;\n\t\tif (opMeta?.deprecated) op.deprecated = true;\n\t\tif (params.length > 0) op.parameters = params;\n\t\tif (requestBody) op.requestBody = requestBody;\n\t\treturn op;\n\t}\n\n\t/**\n\t * Convert any of:\n\t * - a Zod schema → JSON Schema via `zodToJsonSchema`\n\t * - a `JSONSchema` object → passthrough\n\t * - a class decorated with `@ApiProperty` → JSON Schema\n\t * - `null` / `undefined` → empty object\n\t */\n\tprivate toSchema(input: unknown): JSONSchema {\n\t\tif (input == null) return {};\n\t\t// JSONSchema passthrough (has `type` or `$ref` or any of our keys).\n\t\tif (typeof input === \"object\" && !isZodLike(input)) {\n\t\t\treturn input as JSONSchema;\n\t\t}\n\t\t// Zod-like: try the converter.\n\t\ttry {\n\t\t\treturn zodToJsonSchema(input);\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tprivate appendZodParams(\n\t\tctor: any,\n\t\tpropKey: string | symbol,\n\t\twhere: \"query\" | \"header\",\n\t\tschema: unknown,\n\t\tparams: OpenAPIParameter[],\n\t\trequired: boolean,\n\t): void {\n\t\tconst json = this.toSchema(schema);\n\t\t// Unwrap top-level object to one entry per property.\n\t\tif (json.type === \"object\" && json.properties) {\n\t\t\tconst req = new Set(json.required ?? []);\n\t\t\tfor (const [name, sub] of Object.entries(json.properties)) {\n\t\t\t\tparams.push({\n\t\t\t\t\tname,\n\t\t\t\t\tin: where,\n\t\t\t\t\trequired: required || req.has(name),\n\t\t\t\t\tschema: sub,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate extractPathParams(path: string): string[] {\n\t\tconst out: string[] = [];\n\t\tconst re = /:([A-Za-z0-9_]+)/g;\n\t\tlet m: RegExpExecArray | null;\n\t\twhile ((m = re.exec(path)) !== null) out.push(m[1]!);\n\t\treturn out;\n\t}\n\n\tprivate normalizePath(path: string): string {\n\t\treturn path.replace(/:([A-Za-z0-9_]+)/g, \"{$1}\");\n\t}\n}\n\nfunction isZodLike(s: unknown): boolean {\n\tif (typeof s !== \"object\" || s === null) return false;\n\tconst o = s as { _def?: { typeName?: string }; typeName?: string };\n\tconst t = o._def?.typeName ?? o.typeName;\n\treturn typeof t === \"string\" && t.startsWith(\"Zod\");\n}",
6
+ "/**\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n * `nexusjs/openapi` — OpenAPI 3.1 + Scalar UI.\n *\n * @Module({\n * imports: [\n * OpenAPIModule.forRoot({\n * info: { title: 'My API', version: '1.0.0' },\n * servers: [{ url: 'http://localhost:3000' }],\n * }),\n * ],\n * })\n *\n * @Controller('/users')\n * @ApiTags('Users')\n * class UserController {\n * @Get('/')\n * @ApiOperation({ summary: 'List users' })\n * @ApiResponse(200, { description: 'OK', schema: UserSchema })\n * list() { ... }\n * }\n *\n * // -> GET /openapi.json (the spec)\n * // -> GET /docs (Scalar UI)\n */\n\n\n// ---------------------------------------------------------------------------\n// OpenAPI spec types (subset of OpenAPI 3.1 — enough for 95% of real APIs)\n// ---------------------------------------------------------------------------\n\nexport interface OpenAPIConfig {\n\t/** Top-level info block. */\n\tinfo: OpenAPIInfo;\n\t/** Server URLs. Default: [{ url: '/' }]. */\n\tservers?: OpenAPIServer[];\n\t/** Tags grouped at the top of the spec. */\n\ttags?: OpenAPITag[];\n\t/** Path under which the JSON spec is served. Default: '/openapi.json'. */\n\tspecPath?: string;\n\t/** Path under which the Scalar UI is served. Default: '/docs'. */\n\tpath?: string;\n\t/** External docs link. */\n\texternalDocs?: { url: string; description?: string };\n}\n\nexport interface OpenAPIInfo {\n\ttitle: string;\n\tversion: string;\n\tdescription?: string;\n\ttermsOfService?: string;\n\tcontact?: { name?: string; url?: string; email?: string };\n\tlicense?: { name: string; url?: string };\n}\n\nexport interface OpenAPIServer {\n\turl: string;\n\tdescription?: string;\n\tvariables?: Record<string, { default: string; enum?: string[]; description?: string }>;\n}\n\nexport interface OpenAPITag {\n\tname: string;\n\tdescription?: string;\n\texternalDocs?: { url: string; description?: string };\n}\n\n/** OpenAPI Path Item. */\nexport interface OpenAPIPath {\n\t[method: string]: OpenAPIOperation | undefined;\n}\n\n/** OpenAPI Operation. */\nexport interface OpenAPIOperation {\n\ttags?: string[];\n\tsummary?: string;\n\tdescription?: string;\n\toperationId?: string;\n\tparameters?: OpenAPIParameter[];\n\trequestBody?: OpenAPIRequestBody;\n\tresponses: Record<string, OpenAPIResponse>;\n\tdeprecated?: boolean;\n\tsecurity?: OpenAPISecurity[];\n}\n\n/** OpenAPI Parameter (path, query, header, cookie). */\nexport interface OpenAPIParameter {\n\tname: string;\n\tin: \"path\" | \"query\" | \"header\" | \"cookie\";\n\tdescription?: string;\n\trequired?: boolean;\n\tdeprecated?: boolean;\n\tschema: JSONSchema;\n\texample?: unknown;\n\texamples?: Record<string, { summary?: string; value: unknown }>;\n}\n\n/** OpenAPI Request Body. */\nexport interface OpenAPIRequestBody {\n\tdescription?: string;\n\tcontent: Record<string, OpenAPIMediaType>;\n\trequired?: boolean;\n}\n\nexport interface OpenAPIMediaType {\n\tschema: JSONSchema;\n\texample?: unknown;\n\texamples?: Record<string, { summary?: string; value: unknown }>;\n\tencoding?: Record<string, OpenAPIEncoding>;\n}\n\nexport interface OpenAPIEncoding {\n\tcontentType?: string;\n\theaders?: Record<string, OpenAPIParameter>;\n\tstyle?: string;\n\texplode?: boolean;\n\tallowReserved?: boolean;\n}\n\n/** OpenAPI Response. */\nexport interface OpenAPIResponse {\n\tdescription: string;\n\theaders?: Record<string, OpenAPIParameter>;\n\tcontent?: Record<string, OpenAPIMediaType>;\n\tlinks?: Record<string, OpenAPILink>;\n}\n\nexport interface OpenAPILink {\n\toperationRef?: string;\n\toperationId?: string;\n\tparameters?: Record<string, unknown>;\n\tdescription?: string;\n\tserver?: OpenAPIServer;\n}\n\nexport interface OpenAPISecurity {\n\t[name: string]: string[];\n}\n\n/** OpenAPI Component (schemas, parameters, responses, ...). */\nexport interface OpenAPIComponents {\n\tschemas?: Record<string, JSONSchema>;\n\tparameters?: Record<string, OpenAPIParameter>;\n\tresponses?: Record<string, OpenAPIResponse>;\n\trequestBodies?: Record<string, OpenAPIRequestBody>;\n\theaders?: Record<string, OpenAPIParameter>;\n\tsecuritySchemes?: Record<string, OpenAPISecurityScheme>;\n\tlinks?: Record<string, OpenAPILink>;\n}\n\nexport interface OpenAPISecurityScheme {\n\ttype: \"apiKey\" | \"http\" | \"oauth2\" | \"openIdConnect\" | \"mutualTLS\";\n\tdescription?: string;\n\tname?: string;\n\tin?: \"query\" | \"header\" | \"cookie\";\n\tscheme?: string;\n\tbearerFormat?: string;\n\tflows?: unknown;\n\topenIdConnectUrl?: string;\n}\n\nexport interface OpenAPIDocument {\n\topenapi: \"3.1.0\";\n\tinfo: OpenAPIInfo;\n\tservers?: OpenAPIServer[];\n\tpaths: Record<string, OpenAPIPath>;\n\tcomponents?: OpenAPIComponents;\n\ttags?: OpenAPITag[];\n\texternalDocs?: { url: string; description?: string };\n\tsecurity?: OpenAPISecurity[];\n\twebhooks?: Record<string, OpenAPIPath | OpenAPIOperation>;\n}\n\n// ---------------------------------------------------------------------------\n// JSON Schema (subset)\n// ---------------------------------------------------------------------------\n\nexport interface JSONSchema {\n\t$ref?: string;\n\ttype?:\n\t\t| \"string\"\n\t\t| \"number\"\n\t\t| \"integer\"\n\t\t| \"boolean\"\n\t\t| \"object\"\n\t\t| \"array\"\n\t\t| \"null\"\n\t\t| (string & {});\n\tformat?: string;\n\ttitle?: string;\n\tdescription?: string;\n\tdefault?: unknown;\n\texample?: unknown;\n\tenum?: unknown[];\n\tconst?: unknown;\n\tproperties?: Record<string, JSONSchema>;\n\trequired?: string[];\n\tadditionalProperties?: boolean | JSONSchema;\n\titems?: JSONSchema;\n\tprefixItems?: JSONSchema[];\n\tminItems?: number;\n\tmaxItems?: number;\n\tuniqueItems?: boolean;\n\tminimum?: number;\n\tmaximum?: number;\n\tminLength?: number;\n\tmaxLength?: number;\n\tpattern?: string;\n\tnullable?: boolean;\n\toneOf?: JSONSchema[];\n\tanyOf?: JSONSchema[];\n\tallOf?: JSONSchema[];\n\tnot?: JSONSchema;\n\t$defs?: Record<string, JSONSchema>;\n\t$schema?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Decorator payload types\n// ---------------------------------------------------------------------------\n\nexport interface ApiOperationOptions {\n\tsummary?: string;\n\tdescription?: string;\n\toperationId?: string;\n\tdeprecated?: boolean;\n\ttags?: string[];\n}\n\nexport interface ApiResponseOptions {\n\tdescription: string;\n\tschema?: unknown;\n\theaders?: Record<string, OpenAPIParameter>;\n\texample?: unknown;\n\texamples?: Record<string, { summary?: string; value: unknown }>;\n}\n\nexport interface ApiParamOptions {\n\tname: string;\n\tdescription?: string;\n\trequired?: boolean;\n\tschema?: unknown;\n\texample?: unknown;\n}\n\nexport interface ApiQueryOptions extends Omit<ApiParamOptions, \"name\"> {\n\tname: string;\n}\n\nexport interface ApiBodyOptions {\n\tdescription?: string;\n\trequired?: boolean;\n\tschema?: unknown;\n\texample?: unknown;\n}\n\nexport interface ApiPropertyOptions {\n\tdescription?: string;\n\trequired?: boolean;\n\texample?: unknown;\n\tdeprecated?: boolean;\n\tformat?: string;\n\tschema?: unknown;\n}\n\nexport interface ApiSecurityOptions {\n\t[name: string]: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Reflect metadata keys\n// ---------------------------------------------------------------------------\n\nexport const OPENAPI_META = {\n\tTAGS: \"nexus:openapi:tags\",\n\tOPERATION: \"nexus:openapi:operation\",\n\tRESPONSES: \"nexus:openapi:responses\",\n\tPARAMS: \"nexus:openapi:params\",\n\tQUERIES: \"nexus:openapi:queries\",\n\tBODY: \"nexus:openapi:body\",\n\tPROPERTIES: \"nexus:openapi:properties\",\n\tSECURITY: \"nexus:openapi:security\",\n\tEXCLUDE: \"nexus:openapi:exclude\",\n\tPRODUCES: \"nexus:openapi:produces\",\n\tCONSUMES: \"nexus:openapi:consumes\",\n} as const;\n",
7
+ "/**\n * `OpenAPIService` — walks the framework's route table, reads\n * `@ApiTags` / `@ApiOperation` / `@ApiResponse` / `@ApiBody` /\n * `@ApiParam` / `@ApiQuery` / `@Validate` metadata, and produces an\n * OpenAPI 3.1 document.\n *\n * The document is rebuilt on demand (cheap: in-memory walk) and\n * exposed via `getSpec()`. The framework's router already exposes a\n * `getRoutes()` method that returns the registered route list, so\n * the spec is always in sync with the actual API.\n */\nimport { Inject, Injectable } from \"@nexusts/core\";\nimport type {\n\tApiOperationOptions,\n\tApiParamOptions,\n\tApiPropertyOptions,\n\tApiResponseOptions,\n\tJSONSchema,\n\tOPENAPI_META as _OM,\n\tOpenAPIConfig,\n\tOpenAPIDocument,\n\tOpenAPIMediaType,\n\tOpenAPIOperation,\n\tOpenAPIParameter,\n\tOpenAPIRequestBody,\n\tOpenAPIResponse,\n} from \"./types.js\";\nimport { OPENAPI_META } from \"./types.js\";\nimport { zodToJsonSchema } from \"./zod-to-json-schema.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\n@Injectable()\nexport class OpenAPIService {\n\t/** DI token. */\n\tstatic readonly TOKEN = Symbol.for(\"nexus:OpenAPIService\");\n\n\t#config: OpenAPIConfig;\n\t#components: { schemas: Map<string, JSONSchema> } = { schemas: new Map() };\n\t#routes: { method: string; path: string; target: any; propertyKey: string | symbol; validation?: any }[] = [];\n\n\tconstructor(@Inject(\"OPENAPI_CONFIG\") config: OpenAPIConfig) {\n\t\tthis.#config = config;\n\t}\n\n\t/**\n\t * Inject the route list. The framework's router calls this on boot.\n\t * Each entry is the data needed to emit one OpenAPI operation.\n\t */\n\tsetRoutes(\n\t\troutes: {\n\t\t\tmethod: string;\n\t\t\tpath: string;\n\t\t\ttarget: any;\n\t\t\tpropertyKey: string | symbol;\n\t\t\tvalidation?: { body?: unknown; query?: unknown; params?: unknown; headers?: unknown };\n\t\t}[],\n\t): void {\n\t\tthis.#routes = routes;\n\t}\n\n\t/** Register a named component schema (e.g. for re-use). */\n\tregisterSchema(name: string, schema: JSONSchema): void {\n\t\tthis.#components.schemas.set(name, schema);\n\t}\n\n\t/** Build the OpenAPI 3.1 document. */\n\tgetSpec(): OpenAPIDocument {\n\t\tconst paths: Record<string, Record<string, OpenAPIOperation>> = {};\n\t\tfor (const route of this.#routes) {\n\t\t\tif (safeGetMeta(OPENAPI_META.EXCLUDE, route.target.constructor, route.propertyKey)) continue;\n\t\t\tconst op = this.buildOperation(route);\n\t\t\tconst normalized = this.normalizePath(route.path);\n\t\t\tconst method = route.method.toLowerCase();\n\t\t\tif (!paths[normalized]) paths[normalized] = {};\n\t\t\tpaths[normalized][method] = op;\n\t\t}\n\n\t\tconst doc: OpenAPIDocument = {\n\t\t\topenapi: \"3.1.0\",\n\t\t\tinfo: this.#config.info,\n\t\t\tpaths,\n\t\t};\n\t\tif (this.#config.servers?.length) doc.servers = this.#config.servers;\n\t\tif (this.#config.tags?.length) doc.tags = this.#config.tags;\n\t\tif (this.#config.externalDocs) doc.externalDocs = this.#config.externalDocs;\n\t\tif (this.#components.schemas.size > 0) {\n\t\t\tdoc.components = {\n\t\t\t\tschemas: Object.fromEntries(this.#components.schemas),\n\t\t\t};\n\t\t}\n\t\treturn doc;\n\t}\n\n\t/**\n\t * Build one operation from a route.\n\t */\n\tprivate buildOperation(route: {\n\t\tmethod: string;\n\t\tpath: string;\n\t\ttarget: any;\n\t\tpropertyKey: string | symbol;\n\t\tvalidation?: { body?: unknown; query?: unknown; params?: unknown; headers?: unknown };\n\t}): OpenAPIOperation {\n\t\tconst ctor = route.target.constructor ?? route.target;\n\t\tconst propKey = route.propertyKey;\n\n\t\t// 1. Tags from class + operation\n\t\tconst classTags: string[] = safeGetMeta(OPENAPI_META.TAGS, ctor) ?? [];\n\t\tconst opMeta: ApiOperationOptions | undefined = safeGetMeta(\n\t\t\tOPENAPI_META.OPERATION,\n\t\t\tctor,\n\t\t\tpropKey,\n\t\t);\n\t\tconst opTags: string[] = opMeta?.tags ?? [];\n\t\tconst tags = [...new Set([...classTags, ...opTags])];\n\n\t\t// 2. Parameters (path / query / headers)\n\t\tconst params: OpenAPIParameter[] = [];\n\t\t// Auto-derive path params from the route pattern.\n\t\tconst pathParams = this.extractPathParams(route.path);\n\t\tfor (const name of pathParams) {\n\t\t\tconst override = (\n\t\t\t\t(safeGetMeta(OPENAPI_META.PARAMS, ctor, propKey) ?? []) as ApiParamOptions[]\n\t\t\t).find((p) => p.name === name);\n\t\t\tparams.push({\n\t\t\t\tname,\n\t\t\t\tin: \"path\",\n\t\t\t\trequired: true,\n\t\t\t\tdescription: override?.description,\n\t\t\t\tschema: override?.schema ? this.toSchema(override.schema) : { type: \"string\" },\n\t\t\t});\n\t\t}\n\t\t// Auto-derive query params from `@Validate({ query })`.\n\t\tif (route.validation?.query) {\n\t\t\tthis.appendZodParams(\n\t\t\t\tctor,\n\t\t\t\tpropKey,\n\t\t\t\t\"query\",\n\t\t\t\troute.validation.query,\n\t\t\t\tparams,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\t// Auto-derive headers from `@Validate({ headers })`.\n\t\tif (route.validation?.headers) {\n\t\t\tthis.appendZodParams(\n\t\t\t\tctor,\n\t\t\t\tpropKey,\n\t\t\t\t\"header\",\n\t\t\t\troute.validation.headers,\n\t\t\t\tparams,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\t// Explicit `@ApiQuery` decorators override / supplement.\n\t\tconst explicitQueries: ApiParamOptions[] =\n\t\t\tsafeGetMeta(OPENAPI_META.QUERIES, ctor, propKey) ?? [];\n\t\tfor (const q of explicitQueries) {\n\t\t\t// Replace any auto-derived entry for the same name.\n\t\t\tconst idx = params.findIndex(\n\t\t\t\t(p) => p.in === \"query\" && p.name === q.name,\n\t\t\t);\n\t\t\tconst param: OpenAPIParameter = {\n\t\t\t\tname: q.name,\n\t\t\t\tin: \"query\",\n\t\t\t\trequired: q.required ?? false,\n\t\t\t\tdescription: q.description,\n\t\t\t\tschema: q.schema ? this.toSchema(q.schema) : { type: \"string\" },\n\t\t\t};\n\t\t\tif (idx >= 0) params[idx] = param;\n\t\t\telse params.push(param);\n\t\t}\n\t\t// Explicit `@ApiParam` decorators override path params.\n\t\tconst explicitParams: ApiParamOptions[] =\n\t\t\tsafeGetMeta(OPENAPI_META.PARAMS, ctor, propKey) ?? [];\n\t\tfor (const p of explicitParams) {\n\t\t\tconst idx = params.findIndex(\n\t\t\t\t(x) => x.in === \"path\" && x.name === p.name,\n\t\t\t);\n\t\t\tconst param: OpenAPIParameter = {\n\t\t\t\tname: p.name,\n\t\t\t\tin: \"path\",\n\t\t\t\trequired: p.required ?? true,\n\t\t\t\tdescription: p.description,\n\t\t\t\tschema: p.schema ? this.toSchema(p.schema) : { type: \"string\" },\n\t\t\t};\n\t\t\tif (idx >= 0) params[idx] = param;\n\t\t\telse params.push(param);\n\t\t}\n\n\t\t// 3. Request body\n\t\tlet requestBody: OpenAPIRequestBody | undefined;\n\t\tconst bodyMeta = safeGetMeta(OPENAPI_META.BODY, ctor, propKey);\n\t\tif (bodyMeta?.schema || route.validation?.body) {\n\t\t\tconst schema = bodyMeta?.schema ?? route.validation?.body;\n\t\t\tconst mediaType: OpenAPIMediaType = { schema: this.toSchema(schema) };\n\t\t\tif (bodyMeta?.example !== undefined) mediaType.example = bodyMeta.example;\n\t\t\trequestBody = {\n\t\t\t\tdescription: bodyMeta?.description ?? \"Request body\",\n\t\t\t\tcontent: { \"application/json\": mediaType },\n\t\t\t\trequired: bodyMeta?.required ?? true,\n\t\t\t};\n\t\t}\n\n\t\t// 4. Responses\n\t\tconst responses: Record<string, OpenAPIResponse> = {};\n\t\tconst responseMetas: Array<[string, ApiResponseOptions]> =\n\t\t\tsafeGetMeta(OPENAPI_META.RESPONSES, ctor, propKey) ?? [];\n\t\tfor (const [status, opt] of responseMetas) {\n\t\t\tconst r: OpenAPIResponse = { description: opt.description };\n\t\t\tif (opt.schema) {\n\t\t\t\tr.content = {\n\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\tschema: this.toSchema(opt.schema),\n\t\t\t\t\t\t...(opt.example !== undefined ? { example: opt.example } : {}),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tresponses[status] = r;\n\t\t}\n\t\t// Default 200 OK if no responses declared.\n\t\tif (Object.keys(responses).length === 0) {\n\t\t\tresponses[\"200\"] = { description: \"Successful response\" };\n\t\t}\n\n\t\t// 5. Compose\n\t\tconst op: OpenAPIOperation = {\n\t\t\tresponses,\n\t\t};\n\t\tif (tags.length > 0) op.tags = tags;\n\t\tif (opMeta?.summary) op.summary = opMeta.summary;\n\t\tif (opMeta?.description) op.description = opMeta.description;\n\t\tif (opMeta?.operationId) op.operationId = opMeta.operationId;\n\t\tif (opMeta?.deprecated) op.deprecated = true;\n\t\tif (params.length > 0) op.parameters = params;\n\t\tif (requestBody) op.requestBody = requestBody;\n\t\treturn op;\n\t}\n\n\t/**\n\t * Convert any of:\n\t * - a Zod schema → JSON Schema via `zodToJsonSchema`\n\t * - a `JSONSchema` object → passthrough\n\t * - a class decorated with `@ApiProperty` → JSON Schema\n\t * - `null` / `undefined` → empty object\n\t */\n\tprivate toSchema(input: unknown): JSONSchema {\n\t\tif (input == null) return {};\n\t\t// JSONSchema passthrough (has `type` or `$ref` or any of our keys).\n\t\tif (typeof input === \"object\" && !isZodLike(input)) {\n\t\t\treturn input as JSONSchema;\n\t\t}\n\t\t// Zod-like: try the converter.\n\t\ttry {\n\t\t\treturn zodToJsonSchema(input);\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tprivate appendZodParams(\n\t\tctor: any,\n\t\tpropKey: string | symbol,\n\t\twhere: \"query\" | \"header\",\n\t\tschema: unknown,\n\t\tparams: OpenAPIParameter[],\n\t\trequired: boolean,\n\t): void {\n\t\tconst json = this.toSchema(schema);\n\t\t// Unwrap top-level object to one entry per property.\n\t\tif (json.type === \"object\" && json.properties) {\n\t\t\tconst req = new Set(json.required ?? []);\n\t\t\tfor (const [name, sub] of Object.entries(json.properties)) {\n\t\t\t\tparams.push({\n\t\t\t\t\tname,\n\t\t\t\t\tin: where,\n\t\t\t\t\trequired: required || req.has(name),\n\t\t\t\t\tschema: sub,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate extractPathParams(path: string): string[] {\n\t\tconst out: string[] = [];\n\t\tconst re = /:([A-Za-z0-9_]+)/g;\n\t\tlet m: RegExpExecArray | null;\n\t\twhile ((m = re.exec(path)) !== null) out.push(m[1]!);\n\t\treturn out;\n\t}\n\n\tprivate normalizePath(path: string): string {\n\t\treturn path.replace(/:([A-Za-z0-9_]+)/g, \"{$1}\");\n\t}\n}\n\nfunction isZodLike(s: unknown): boolean {\n\tif (typeof s !== \"object\" || s === null) return false;\n\tconst o = s as { _def?: { typeName?: string }; typeName?: string };\n\tconst t = o._def?.typeName ?? o.typeName;\n\treturn typeof t === \"string\" && t.startsWith(\"Zod\");\n}",
8
8
  "/**\n * `zodToJsonSchema` — convert a Zod schema to an OpenAPI-compatible\n * JSON Schema. Zero dependencies, supports the Zod patterns that\n * show up in real APIs:\n *\n * - primitives (string / number / integer / boolean / null)\n * - literal, enum, nativeEnum\n * - object (with required / optional / nullable fields)\n * - array / tuple\n * - union / discriminatedUnion\n * - optional / nullable / default\n * - record / map\n * - format inference (email, uuid, url, datetime, ...)\n * - min / max / length / regex constraints\n *\n * Limitations (by design):\n * - transforms / pipes / preprocess: not represented\n * - branded types: erased\n * - recursive schemas: pass `$ref` manually via `setRefName`\n *\n * For richer support, pre-compute a `JSONSchema` and pass it via\n * the decorator's `schema` field; this converter is a convenience,\n * not a complete codegen.\n */\n\nimport type { JSONSchema } from \"./types.js\";\n\n/**\n * Convert a Zod schema (or any value that quacks like one) to a\n * JSON Schema object.\n */\nexport function zodToJsonSchema(\n\tschema: unknown,\n\topts: { $defs?: Record<string, JSONSchema>; visited?: WeakSet<object> } = {},\n): JSONSchema {\n\tconst defs = opts.$defs ?? {};\n\tconst visited = opts.visited ?? new WeakSet<object>();\n\tif (visited.has(schema as object)) {\n\t\t// Recursive schema — fall back to `{}` so we don't infinite-loop.\n\t\treturn {};\n\t}\n\tif (typeof schema === \"object\" && schema !== null) {\n\t\tvisited.add(schema as object);\n\t}\n\n\tconst def = readDef(schema);\n\n\t// Primitives\n\tif (def.typeName === \"ZodString\") return convertString(def);\n\tif (def.typeName === \"ZodNumber\") return convertNumber(def);\n\tif (def.typeName === \"ZodBigInt\") return { type: \"integer\", format: \"int64\" };\n\tif (def.typeName === \"ZodBoolean\") return { type: \"boolean\" };\n\tif (def.typeName === \"ZodDate\") return { type: \"string\", format: \"date-time\" };\n\tif (def.typeName === \"ZodNull\") return { type: \"null\" };\n\tif (def.typeName === \"ZodUndefined\") return { not: {} };\n\tif (def.typeName === \"ZodAny\") return {};\n\tif (def.typeName === \"ZodUnknown\") return {};\n\tif (def.typeName === \"ZodNever\") return { not: {} };\n\n\tif (def.typeName === \"ZodLiteral\") {\n\t\tconst v = (def as { value: unknown }).value;\n\t\treturn { type: jsonTypeOf(v) as JSONSchema[\"type\"], enum: [v] };\n\t}\n\n\tif (def.typeName === \"ZodEnum\") {\n\t\tconst values = (def as { values: ReadonlyArray<string | number> }).values;\n\t\tconst t = values.every((v) => typeof v === \"number\") ? \"number\" : \"string\";\n\t\treturn { type: t as JSONSchema[\"type\"], enum: [...values] };\n\t}\n\n\tif (def.typeName === \"ZodNativeEnum\") {\n\t\tconst values = (def as { values: Record<string, string | number> }).values;\n\t\tconst entries = Object.entries(values).filter(\n\t\t\t([k, v]) => typeof v !== \"number\" || isNaN(Number(k)),\n\t\t);\n\t\tconst opts = entries.map(([, v]) => v);\n\t\tconst t = opts.every((v) => typeof v === \"number\") ? \"number\" : \"string\";\n\t\treturn { type: t as JSONSchema[\"type\"], enum: opts };\n\t}\n\n\tif (def.typeName === \"ZodObject\") {\n\t\treturn convertObject(schema, def, defs, visited);\n\t}\n\n\tif (def.typeName === \"ZodArray\") {\n\t\treturn convertArray(schema, def, defs, visited);\n\t}\n\n\tif (def.typeName === \"ZodTuple\") {\n\t\tconst items = (def as { items: unknown[] }).items;\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tprefixItems: items.map((s) => zodToJsonSchema(s, { $defs: defs, visited })),\n\t\t\tminItems: items.length,\n\t\t\tmaxItems: items.length,\n\t\t};\n\t}\n\n\tif (def.typeName === \"ZodUnion\" || def.typeName === \"ZodDiscriminatedUnion\") {\n\t\tconst options = (def as { options?: unknown[]; optionsArray?: unknown[] }).options\n\t\t\t?? (def as { optionsArray?: unknown[] }).optionsArray\n\t\t\t?? [];\n\t\treturn {\n\t\t\toneOf: options.map((s) => zodToJsonSchema(s, { $defs: defs, visited })),\n\t\t};\n\t}\n\n\tif (def.typeName === \"ZodDiscriminatedUnion\") {\n\t\tconst discriminator = (def as { discriminator?: string }).discriminator;\n\t\tconst options = (def as { options?: unknown[] }).options ?? [];\n\t\tconst mapping: Record<string, JSONSchema> = {};\n\t\tfor (const opt of options) {\n\t\t\tconst od = readDef(opt);\n\t\t\tif (od.typeName === \"ZodObject\") {\n\t\t\t\tconst shape = (od as { shape: () => Record<string, unknown> }).shape();\n\t\t\t\tconst disc = shape[discriminator ?? \"\"] as { value: unknown } | undefined;\n\t\t\t\tif (disc && \"value\" in disc) {\n\t\t\t\t\tmapping[String(disc.value)] = zodToJsonSchema(opt, { $defs: defs, visited });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\toneOf: Object.values(mapping),\n\t\t\tdiscriminator: { propertyName: discriminator ?? \"type\" },\n\t\t} as JSONSchema;\n\t}\n\n\tif (def.typeName === \"ZodIntersection\") {\n\t\tconst left = (def as { _def?: { left: unknown; right: unknown } })._def?.left\n\t\t\t?? (def as { left: unknown }).left;\n\t\tconst right = (def as { _def?: { left: unknown; right: unknown } })._def?.right\n\t\t\t?? (def as { right: unknown }).right;\n\t\treturn {\n\t\t\tallOf: [\n\t\t\t\tzodToJsonSchema(left, { $defs: defs, visited }),\n\t\t\t\tzodToJsonSchema(right, { $defs: defs, visited }),\n\t\t\t],\n\t\t};\n\t}\n\n\tif (def.typeName === \"ZodRecord\") {\n\t\tconst valueType = (def as { valueType: unknown }).valueType;\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties: zodToJsonSchema(valueType, { $defs: defs, visited }),\n\t\t};\n\t}\n\n\tif (def.typeName === \"ZodMap\") {\n\t\tconst valueType = (def as { valueType: unknown }).valueType;\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties: zodToJsonSchema(valueType, { $defs: defs, visited }),\n\t\t};\n\t}\n\n\tif (def.typeName === \"ZodOptional\") {\n\t\tconst inner = (def as { innerType: unknown }).innerType;\n\t\treturn zodToJsonSchema(inner, { $defs: defs, visited });\n\t}\n\n\tif (def.typeName === \"ZodNullable\") {\n\t\tconst inner = (def as { innerType: unknown }).innerType;\n\t\treturn {\n\t\t\t...zodToJsonSchema(inner, { $defs: defs, visited }),\n\t\t\tnullable: true,\n\t\t};\n\t}\n\n\tif (def.typeName === \"ZodDefault\") {\n\t\tconst inner = (def as { innerType: unknown; defaultValue: () => unknown }).innerType;\n\t\tconst dv = (def as { defaultValue: () => unknown }).defaultValue;\n\t\treturn {\n\t\t\t...zodToJsonSchema(inner, { $defs: defs, visited }),\n\t\t\tdefault: safeCall(dv),\n\t\t};\n\t}\n\n\tif (def.typeName === \"ZodCatch\") {\n\t\tconst inner = (def as { innerType: unknown }).innerType;\n\t\treturn zodToJsonSchema(inner, { $defs: defs, visited });\n\t}\n\n\tif (def.typeName === \"ZodBranded\") {\n\t\tconst inner = (def as { type: unknown }).type;\n\t\treturn zodToJsonSchema(inner, { $defs: defs, visited });\n\t}\n\n\tif (def.typeName === \"ZodReadonly\") {\n\t\tconst inner = (def as { innerType: unknown }).innerType;\n\t\treturn zodToJsonSchema(inner, { $defs: defs, visited });\n\t}\n\n\tif (def.typeName === \"ZodLazy\") {\n\t\tconst getter = (def as { getter: () => unknown }).getter;\n\t\tconst inner = safeCall(getter);\n\t\treturn zodToJsonSchema(inner, { $defs: defs, visited });\n\t}\n\n\tif (def.typeName === \"ZodEffects\") {\n\t\tconst inner = (def as { source?: unknown; schema?: unknown; innerType?: unknown }).source\n\t\t\t?? (def as { schema?: unknown }).schema\n\t\t\t?? (def as { innerType?: unknown }).innerType;\n\t\treturn zodToJsonSchema(inner, { $defs: defs, visited });\n\t}\n\n\tif (def.typeName === \"ZodPipeline\") {\n\t\tconst inner = (def as { out: unknown }).out;\n\t\treturn zodToJsonSchema(inner, { $defs: defs, visited });\n\t}\n\n\tif (def.typeName === \"ZodFunction\") return { type: \"null\" };\n\tif (def.typeName === \"ZodPromise\") {\n\t\tconst inner = (def as { innerType: unknown }).innerType;\n\t\treturn zodToJsonSchema(inner, { $defs: defs, visited });\n\t}\n\n\t// Fallback: emit a permissive object schema so the spec is at least\n\t// structurally valid. The user can refine by passing an explicit\n\t// `schema: {...}` on the decorator.\n\treturn {};\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\ntype ZodDef = Record<string, unknown>;\n\nfunction readDef(schema: unknown): ZodDef {\n\tif (typeof schema !== \"object\" || schema === null) return { typeName: \"\" };\n\t// Zod 3 / 3.25: stores everything under `_def`.\n\tconst s = schema as { _def?: ZodDef };\n\tif (s._def && typeof s._def === \"object\") return s._def;\n\t// Fallback: top-level access (some forks).\n\treturn s as ZodDef;\n}\n\nfunction convertString(def: ZodDef): JSONSchema {\n\tconst out: JSONSchema = { type: \"string\" };\n\tconst checks = (def.checks ?? []) as Array<{ kind: string; value?: unknown; regex?: { source: string; flags?: string } }>;\n\tfor (const c of checks) {\n\t\tswitch (c.kind) {\n\t\t\tcase \"email\": out.format = \"email\"; break;\n\t\t\tcase \"url\": out.format = \"uri\"; break;\n\t\t\tcase \"uuid\": out.format = \"uuid\"; break;\n\t\t\tcase \"cuid\":\n\t\t\tcase \"cuid2\": out.format = \"cuid\"; break;\n\t\t\tcase \"emoji\": break;\n\t\t\tcase \"ip\": out.format = \"ipv4\"; break;\n\t\t\tcase \"cidr\": out.format = \"cidr\"; break;\n\t\t\tcase \"datetime\": out.format = \"date-time\"; break;\n\t\t\tcase \"date\": out.format = \"date\"; break;\n\t\t\tcase \"time\": out.format = \"time\"; break;\n\t\t\tcase \"duration\": break;\n\t\t\tcase \"min\":\n\t\t\tcase \"length\": out.minLength = Number(c.value); break;\n\t\t\tcase \"max\": out.maxLength = Number(c.value); break;\n\t\t\tcase \"regex\": if (c.regex) out.pattern = c.regex.source; break;\n\t\t\tcase \"trim\":\n\t\t\tcase \"toLowerCase\":\n\t\t\tcase \"toUpperCase\":\n\t\t\tcase \"startsWith\":\n\t\t\tcase \"endsWith\":\n\t\t\tcase \"includes\":\n\t\t\t\t// No JSON Schema equivalent; ignore.\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn out;\n}\n\nfunction convertNumber(def: ZodDef): JSONSchema {\n\tconst out: JSONSchema = { type: \"number\" };\n\tconst checks = (def.checks ?? []) as Array<{ kind: string; value?: number }>;\n\tlet isInt = false;\n\tfor (const c of checks) {\n\t\tswitch (c.kind) {\n\t\t\tcase \"int\":\n\t\t\tcase \"safeint\": isInt = true; break;\n\t\t\tcase \"min\": out.minimum = c.value; break;\n\t\t\tcase \"max\": out.maximum = c.value; break;\n\t\t\tcase \"finite\":\n\t\t\tcase \"multipleOf\":\n\t\t\t\t// `multipleOf` accepts arbitrary numbers; we skip the\n\t\t\t\t// stricter check that the value is present.\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tif (isInt) out.type = \"integer\";\n\treturn out;\n}\n\nfunction convertObject(\n\t_schema: unknown,\n\tdef: ZodDef,\n\tdefs: Record<string, JSONSchema>,\n\tvisited: WeakSet<object>,\n): JSONSchema {\n\tconst shapeFn = (def as { shape?: unknown }).shape;\n\tconst shape = typeof shapeFn === \"function\" ? (shapeFn as () => Record<string, unknown>)() : shapeFn;\n\tconst properties: Record<string, JSONSchema> = {};\n\tconst required: string[] = [];\n\tconst catchall = (def as { catchall?: unknown }).catchall;\n\tif (shape && typeof shape === \"object\") {\n\t\tfor (const [key, value] of Object.entries(shape)) {\n\t\t\tconst child = zodToJsonSchema(value, { $defs: defs, visited });\n\t\t\tconst childDef = readDef(value);\n\t\t\t// Zod: optional / nullable / default are NOT in `required`.\n\t\t\tconst isOptional =\n\t\t\t\tchildDef.typeName === \"ZodOptional\" ||\n\t\t\t\tchildDef.typeName === \"ZodDefault\" ||\n\t\t\t\tchildDef.typeName === \"ZodCatch\";\n\t\t\tproperties[key] = child;\n\t\t\tif (!isOptional) required.push(key);\n\t\t}\n\t}\n\tconst description = (def as { description?: string }).description;\n\tconst out: JSONSchema = { type: \"object\", properties };\n\tif (required.length > 0) out.required = required;\n\tif (typeof catchall === \"object\" && catchall !== null) {\n\t\tconst c = readDef(catchall);\n\t\t// `ZodNever` catchall = strict; `ZodAny`/`ZodUnknown` = passthrough.\n\t\tif (c.typeName === \"ZodNever\") out.additionalProperties = false;\n\t\telse out.additionalProperties = true;\n\t}\n\tif (description) out.description = description;\n\treturn out;\n}\n\nfunction convertArray(\n\t_schema: unknown,\n\tdef: ZodDef,\n\tdefs: Record<string, JSONSchema>,\n\tvisited: WeakSet<object>,\n): JSONSchema {\n\tconst out: JSONSchema = { type: \"array\" };\n\tconst element = (def as { element?: unknown; type?: unknown }).element\n\t\t?? (def as { type?: unknown }).type;\n\tif (element) out.items = zodToJsonSchema(element, { $defs: defs, visited });\n\tconst checks = (def as { minLength?: { value: number }; maxLength?: { value: number } });\n\tif (checks.minLength?.value != null) out.minItems = checks.minLength.value;\n\tif (checks.maxLength?.value != null) out.maxItems = checks.maxLength.value;\n\treturn out;\n}\n\nfunction jsonTypeOf(v: unknown): \"string\" | \"number\" | \"boolean\" | \"object\" | \"null\" {\n\tif (v === null) return \"null\";\n\tif (typeof v === \"string\") return \"string\";\n\tif (typeof v === \"number\") return \"number\";\n\tif (typeof v === \"boolean\") return \"boolean\";\n\treturn \"object\";\n}\n\nfunction safeCall<T>(fn: unknown): T {\n\ttry {\n\t\treturn (fn as () => T)();\n\t} catch {\n\t\treturn undefined as unknown as T;\n\t}\n}",
9
- "/**\n * `OpenAPIModule` — drop-in OpenAPI 3.1 + Scalar UI.\n *\n * @Module({\n * imports: [\n * OpenAPIModule.forRoot({\n * info: { title: 'My API', version: '1.0.0' },\n * servers: [{ url: 'http://localhost:3000' }],\n * }),\n * ],\n * })\n * export class AppModule {}\n *\n * After boot, the framework exposes:\n *\n * GET /openapi.json — the OpenAPI 3.1 spec\n * GET /docs — the Scalar UI\n *\n * To feed routes to the spec, the application must call\n * `OpenAPIService.setRoutes(...)` after the router is built. The\n * recommended way is to read routes from the `NexusServer` instance\n * inside the module's onModuleInit hook (see the helper below).\n */\nimport \"reflect-metadata\";\nimport { Module } from \"@nexusts/core\";\nimport { OpenAPIService } from \"./openapi.service.js\";\nimport type { OpenAPIConfig } from \"./types.js\";\n\n@Module({\n\tproviders: [\n\t\tOpenAPIService,\n\t\t{ provide: OpenAPIService.TOKEN, useExisting: OpenAPIService },\n\t],\n\texports: [OpenAPIService, OpenAPIService.TOKEN],\n})\nexport class OpenAPIModule {\n\tstatic forRoot(config: OpenAPIConfig) {\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tOpenAPIService,\n\t\t\t\t{ provide: OpenAPIService.TOKEN, useExisting: OpenAPIService },\n\t\t\t\t{ provide: \"OPENAPI_CONFIG\", useValue: config },\n\t\t\t],\n\t\t\texports: [OpenAPIService, OpenAPIService.TOKEN],\n\t\t})\n\t\tclass ConfiguredOpenAPIModule {}\n\t\tObject.defineProperty(ConfiguredOpenAPIModule, \"name\", {\n\t\t\tvalue: \"ConfiguredOpenAPIModule\",\n\t\t});\n\t\treturn ConfiguredOpenAPIModule;\n\t}\n\n\t/**\n\t * Mount the spec + Scalar UI on an existing Hono app. The user\n\t * calls this once, after the framework's router is built, passing\n\t * the route list.\n\t *\n\t * import { mountOpenAPI } from 'nexusjs/openapi';\n\t * const openapi = new OpenAPIService(config);\n\t * openapi.setRoutes(routes);\n\t * mountOpenAPI(app, openapi, config);\n\t */\n\tstatic mount(\n\t\tapp: { use: (path: string, ...handlers: any[]) => any; get: (path: string, ...handlers: any[]) => any },\n\t\tsvc: OpenAPIService,\n\t\tconfig: OpenAPIConfig,\n\t): void {\n\t\tconst specPath = config.specPath ?? \"/openapi.json\";\n\t\tconst docsPath = config.path ?? \"/docs\";\n\t\t// The route handlers are evaluated lazily at request time.\n\t\tapp.get(specPath, (c: any) => c.json(svc.getSpec(), 200, { \"Content-Type\": \"application/json\" }));\n\t\tapp.get(docsPath, (c: any) => {\n\t\t\t// We import lazily to avoid a circular dep.\n\t\t\tconst { scalarHtml } = require(\"./scalar.js\") as typeof import(\"./scalar.js\");\n\t\t\tconst html = scalarHtml({\n\t\t\t\ttitle: config.info.title,\n\t\t\t\tspecUrl: specPath,\n\t\t\t});\n\t\t\treturn c.html(html, 200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t});\n\t}\n}",
10
- "/**\n * `@ApiTags('Users', 'Admin')` — group operations under one or more\n * tags in the OpenAPI spec.\n */\nimport { OPENAPI_META } from \"../types.js\";\n\nexport function ApiTags(...tags: string[]): ClassDecorator {\n\treturn (target: any) => {\n\t\tconst existing: string[] = Reflect.getMetadata(OPENAPI_META.TAGS, target) ?? [];\n\t\tReflect.defineMetadata(OPENAPI_META.TAGS, [...existing, ...tags], target);\n\t};\n}\n",
11
- "/**\n * `@ApiOperation({ summary, description, operationId, tags, deprecated })`\n *\n * Decorate a controller method to describe the operation in the spec.\n */\nimport \"reflect-metadata\";\nimport { OPENAPI_META, type ApiOperationOptions } from \"../types.js\";\n\nexport function ApiOperation(options: ApiOperationOptions): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tReflect.defineMetadata(OPENAPI_META.OPERATION, options, target.constructor, propertyKey);\n\t};\n}",
12
- "/**\n * `@ApiResponse(200, { description: 'OK', schema: UserSchema })`\n *\n * Decorate a controller method to describe one of its responses.\n * Multiple `@ApiResponse` calls accumulate.\n */\nimport \"reflect-metadata\";\nimport { OPENAPI_META, type ApiResponseOptions } from \"../types.js\";\n\nexport function ApiResponse(\n\tstatus: number | string,\n\toptions: ApiResponseOptions,\n): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tconst existing: Array<[string, ApiResponseOptions]> =\n\t\t\tReflect.getMetadata(OPENAPI_META.RESPONSES, target.constructor, propertyKey) ?? [];\n\t\texisting.push([String(status), options]);\n\t\tReflect.defineMetadata(OPENAPI_META.RESPONSES, existing, target.constructor, propertyKey);\n\t};\n}",
13
- "/**\n * `@ApiParam({ name, description, required, schema })` — document a\n * path parameter. The decorator is optional — the spec builder\n * auto-derives path params from the route pattern (`/users/:id` → `id`).\n * Use this when you want to override the schema or add a description.\n */\nimport \"reflect-metadata\";\nimport { OPENAPI_META, type ApiParamOptions } from \"../types.js\";\n\nexport function ApiParam(options: ApiParamOptions): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tconst existing: ApiParamOptions[] =\n\t\t\tReflect.getMetadata(OPENAPI_META.PARAMS, target.constructor, propertyKey) ?? [];\n\t\texisting.push(options);\n\t\tReflect.defineMetadata(OPENAPI_META.PARAMS, existing, target.constructor, propertyKey);\n\t};\n}\n\n/**\n * `@ApiQuery({ name: 'q', description: '...', schema: z.string() })`\n *\n * Document a query parameter. Auto-derivation from `@Validate({ query })`\n * runs first; explicit `@ApiQuery` decorators take precedence.\n */\nexport function ApiQuery(options: ApiParamOptions): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tconst existing: ApiParamOptions[] =\n\t\t\tReflect.getMetadata(OPENAPI_META.QUERIES, target.constructor, propertyKey) ?? [];\n\t\texisting.push(options);\n\t\tReflect.defineMetadata(OPENAPI_META.QUERIES, existing, target.constructor, propertyKey);\n\t};\n}",
14
- "/**\n * `@ApiBody({ description, required, schema })` — document the request\n * body. Auto-derivation from `@Validate({ body })` runs first; explicit\n * `@ApiBody` decorators take precedence.\n */\nimport \"reflect-metadata\";\nimport { OPENAPI_META, type ApiBodyOptions } from \"../types.js\";\n\nexport function ApiBody(options: ApiBodyOptions): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tReflect.defineMetadata(OPENAPI_META.BODY, options, target.constructor, propertyKey);\n\t};\n}",
15
- "/**\n * `@ApiProperty({ description, required, schema, example })` — document\n * a property on a request / response DTO.\n *\n * ```ts\n * class UserDto {\n * @ApiProperty({ description: 'Unique user id', example: 42 })\n * id!: number;\n *\n * @ApiProperty({ description: 'Email address', required: true })\n * email!: string;\n * }\n * ```\n *\n * The `schema` field accepts either a Zod schema or a pre-computed\n * `JSONSchema`. Without a `schema`, the type is inferred from the\n * TypeScript reflection of the property's design:type metadata.\n */\nimport \"reflect-metadata\";\nimport { OPENAPI_META, type ApiPropertyOptions } from \"../types.js\";\n\nexport function ApiProperty(options: ApiPropertyOptions = {}): PropertyDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tconst existing: Record<string | symbol, ApiPropertyOptions> =\n\t\t\tReflect.getMetadata(OPENAPI_META.PROPERTIES, target.constructor) ?? {};\n\t\texisting[propertyKey] = options;\n\t\tReflect.defineMetadata(OPENAPI_META.PROPERTIES, existing, target.constructor);\n\t};\n}\n\n/** Class-level: mark a DTO class so its properties can be lifted into a schema. */\nexport function ApiSchema(name: string): ClassDecorator {\n\treturn (target: any) => {\n\t\tReflect.defineMetadata(\"nexus:openapi:schemaName\", name, target);\n\t};\n}",
16
- "/**\n * `@ApiSecurity('bearerAuth', [])` — declare the security requirements\n * for an operation or controller.\n */\nimport \"reflect-metadata\";\nimport { OPENAPI_META, type ApiSecurityOptions } from \"../types.js\";\n\nexport function ApiSecurity(name: string, scopes: string[] = []): ClassDecorator & MethodDecorator {\n\treturn (\n\t\ttarget: any,\n\t\t_propertyKey?: string | symbol,\n\t\t_descriptor?: PropertyDescriptor,\n\t) => {\n\t\t// Class or method — store the same way.\n\t\tconst key = OPENAPI_META.SECURITY;\n\t\tconst existing: ApiSecurityOptions[] =\n\t\t\t(typeof _propertyKey === \"string\" || typeof _propertyKey === \"symbol\")\n\t\t\t\t? Reflect.getMetadata(key, target.constructor, _propertyKey) ?? []\n\t\t\t\t: Reflect.getMetadata(key, target) ?? [];\n\t\texisting.push({ [name]: scopes });\n\t\tif (typeof _propertyKey === \"string\" || typeof _propertyKey === \"symbol\") {\n\t\t\tReflect.defineMetadata(key, existing, target.constructor, _propertyKey);\n\t\t} else {\n\t\t\tReflect.defineMetadata(key, existing, target);\n\t\t}\n\t};\n}\n\n/** `@ApiExclude()` — exclude a route from the spec. */\nexport function ApiExclude(): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tReflect.defineMetadata(OPENAPI_META.EXCLUDE, true, target.constructor, propertyKey);\n\t};\n}\n"
9
+ "/**\n * `OpenAPIModule` — drop-in OpenAPI 3.1 + Scalar UI.\n *\n * @Module({\n * imports: [\n * OpenAPIModule.forRoot({\n * info: { title: 'My API', version: '1.0.0' },\n * servers: [{ url: 'http://localhost:3000' }],\n * }),\n * ],\n * })\n * export class AppModule {}\n *\n * After boot, the framework exposes:\n *\n * GET /openapi.json — the OpenAPI 3.1 spec\n * GET /docs — the Scalar UI\n *\n * To feed routes to the spec, the application must call\n * `OpenAPIService.setRoutes(...)` after the router is built. The\n * recommended way is to read routes from the `NexusServer` instance\n * inside the module's onModuleInit hook (see the helper below).\n */\nimport { Module } from \"@nexusts/core\";\nimport { OpenAPIService } from \"./openapi.service.js\";\nimport type { OpenAPIConfig } from \"./types.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\n@Module({\n\tproviders: [\n\t\tOpenAPIService,\n\t\t{ provide: OpenAPIService.TOKEN, useExisting: OpenAPIService },\n\t],\n\texports: [OpenAPIService, OpenAPIService.TOKEN],\n})\nexport class OpenAPIModule {\n\tstatic forRoot(config: OpenAPIConfig) {\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tOpenAPIService,\n\t\t\t\t{ provide: OpenAPIService.TOKEN, useExisting: OpenAPIService },\n\t\t\t\t{ provide: \"OPENAPI_CONFIG\", useValue: config },\n\t\t\t],\n\t\t\texports: [OpenAPIService, OpenAPIService.TOKEN],\n\t\t})\n\t\tclass ConfiguredOpenAPIModule {}\n\t\tObject.defineProperty(ConfiguredOpenAPIModule, \"name\", {\n\t\t\tvalue: \"ConfiguredOpenAPIModule\",\n\t\t});\n\t\treturn ConfiguredOpenAPIModule;\n\t}\n\n\t/**\n\t * Mount the spec + Scalar UI on an existing Hono app. The user\n\t * calls this once, after the framework's router is built, passing\n\t * the route list.\n\t *\n\t * import { mountOpenAPI } from 'nexusjs/openapi';\n\t * const openapi = new OpenAPIService(config);\n\t * openapi.setRoutes(routes);\n\t * mountOpenAPI(app, openapi, config);\n\t */\n\tstatic mount(\n\t\tapp: { use: (path: string, ...handlers: any[]) => any; get: (path: string, ...handlers: any[]) => any },\n\t\tsvc: OpenAPIService,\n\t\tconfig: OpenAPIConfig,\n\t): void {\n\t\tconst specPath = config.specPath ?? \"/openapi.json\";\n\t\tconst docsPath = config.path ?? \"/docs\";\n\t\t// The route handlers are evaluated lazily at request time.\n\t\tapp.get(specPath, (c: any) => c.json(svc.getSpec(), 200, { \"Content-Type\": \"application/json\" }));\n\t\tapp.get(docsPath, (c: any) => {\n\t\t\t// We import lazily to avoid a circular dep.\n\t\t\tconst { scalarHtml } = require(\"./scalar.js\") as typeof import(\"./scalar.js\");\n\t\t\tconst html = scalarHtml({\n\t\t\t\ttitle: config.info.title,\n\t\t\t\tspecUrl: specPath,\n\t\t\t});\n\t\t\treturn c.html(html, 200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t});\n\t}\n}",
10
+ "/**\n * `@ApiTags('Users', 'Admin')` — group operations under one or more\n * tags in the OpenAPI spec.\n */\nimport { safeGetMeta, safeDefineMeta } from \"@nexusts/core/di/safe-reflect\";\nimport { OPENAPI_META } from \"../types.js\";\n\nexport function ApiTags(...tags: string[]): ClassDecorator {\n\treturn (target: any) => {\n\t\tconst existing: string[] = safeGetMeta(OPENAPI_META.TAGS, target) ?? [];\n\t\tsafeDefineMeta(OPENAPI_META.TAGS, [...existing, ...tags], target);\n\t};\n}\n",
11
+ "/**\n * `@ApiOperation({ summary, description, operationId, tags, deprecated })`\n *\n * Decorate a controller method to describe the operation in the spec.\n */\nimport { OPENAPI_META, type ApiOperationOptions } from \"../types.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\nexport function ApiOperation(options: ApiOperationOptions): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tsafeDefineMeta(OPENAPI_META.OPERATION, options, target.constructor, propertyKey);\n\t};\n}",
12
+ "/**\n * `@ApiResponse(200, { description: 'OK', schema: UserSchema })`\n *\n * Decorate a controller method to describe one of its responses.\n * Multiple `@ApiResponse` calls accumulate.\n */\nimport { OPENAPI_META, type ApiResponseOptions } from \"../types.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\nexport function ApiResponse(\n\tstatus: number | string,\n\toptions: ApiResponseOptions,\n): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tconst existing: Array<[string, ApiResponseOptions]> =\n\t\t\tsafeGetMeta(OPENAPI_META.RESPONSES, target.constructor, propertyKey) ?? [];\n\t\texisting.push([String(status), options]);\n\t\tsafeDefineMeta(OPENAPI_META.RESPONSES, existing, target.constructor, propertyKey);\n\t};\n}",
13
+ "/**\n * `@ApiParam({ name, description, required, schema })` — document a\n * path parameter. The decorator is optional — the spec builder\n * auto-derives path params from the route pattern (`/users/:id` → `id`).\n * Use this when you want to override the schema or add a description.\n */\nimport { OPENAPI_META, type ApiParamOptions } from \"../types.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\nexport function ApiParam(options: ApiParamOptions): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tconst existing: ApiParamOptions[] =\n\t\t\tsafeGetMeta(OPENAPI_META.PARAMS, target.constructor, propertyKey) ?? [];\n\t\texisting.push(options);\n\t\tsafeDefineMeta(OPENAPI_META.PARAMS, existing, target.constructor, propertyKey);\n\t};\n}\n\n/**\n * `@ApiQuery({ name: 'q', description: '...', schema: z.string() })`\n *\n * Document a query parameter. Auto-derivation from `@Validate({ query })`\n * runs first; explicit `@ApiQuery` decorators take precedence.\n */\nexport function ApiQuery(options: ApiParamOptions): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tconst existing: ApiParamOptions[] =\n\t\t\tsafeGetMeta(OPENAPI_META.QUERIES, target.constructor, propertyKey) ?? [];\n\t\texisting.push(options);\n\t\tsafeDefineMeta(OPENAPI_META.QUERIES, existing, target.constructor, propertyKey);\n\t};\n}",
14
+ "/**\n * `@ApiBody({ description, required, schema })` — document the request\n * body. Auto-derivation from `@Validate({ body })` runs first; explicit\n * `@ApiBody` decorators take precedence.\n */\nimport { OPENAPI_META, type ApiBodyOptions } from \"../types.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\nexport function ApiBody(options: ApiBodyOptions): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tsafeDefineMeta(OPENAPI_META.BODY, options, target.constructor, propertyKey);\n\t};\n}",
15
+ "/**\n * `@ApiProperty({ description, required, schema, example })` — document\n * a property on a request / response DTO.\n *\n * ```ts\n * class UserDto {\n * @ApiProperty({ description: 'Unique user id', example: 42 })\n * id!: number;\n *\n * @ApiProperty({ description: 'Email address', required: true })\n * email!: string;\n * }\n * ```\n *\n * The `schema` field accepts either a Zod schema or a pre-computed\n * `JSONSchema`. Without a `schema`, the type is inferred from the\n * TypeScript reflection of the property's design:type metadata.\n */\nimport { OPENAPI_META, type ApiPropertyOptions } from \"../types.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\nexport function ApiProperty(options: ApiPropertyOptions = {}): PropertyDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tconst existing: Record<string | symbol, ApiPropertyOptions> =\n\t\t\tsafeGetMeta(OPENAPI_META.PROPERTIES, target.constructor) ?? {};\n\t\texisting[propertyKey] = options;\n\t\tsafeDefineMeta(OPENAPI_META.PROPERTIES, existing, target.constructor);\n\t};\n}\n\n/** Class-level: mark a DTO class so its properties can be lifted into a schema. */\nexport function ApiSchema(name: string): ClassDecorator {\n\treturn (target: any) => {\n\t\tsafeDefineMeta(\"nexus:openapi:schemaName\", name, target);\n\t};\n}",
16
+ "/**\n * `@ApiSecurity('bearerAuth', [])` — declare the security requirements\n * for an operation or controller.\n */\nimport { OPENAPI_META, type ApiSecurityOptions } from \"../types.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\nexport function ApiSecurity(name: string, scopes: string[] = []): ClassDecorator & MethodDecorator {\n\treturn (\n\t\ttarget: any,\n\t\t_propertyKey?: string | symbol,\n\t\t_descriptor?: PropertyDescriptor,\n\t) => {\n\t\t// Class or method — store the same way.\n\t\tconst key = OPENAPI_META.SECURITY;\n\t\tconst existing: ApiSecurityOptions[] =\n\t\t\t(typeof _propertyKey === \"string\" || typeof _propertyKey === \"symbol\")\n\t\t\t\t? safeGetMeta(key, target.constructor, _propertyKey) ?? []\n\t\t\t\t: safeGetMeta(key, target) ?? [];\n\t\texisting.push({ [name]: scopes });\n\t\tif (typeof _propertyKey === \"string\" || typeof _propertyKey === \"symbol\") {\n\t\t\tsafeDefineMeta(key, existing, target.constructor, _propertyKey);\n\t\t} else {\n\t\t\tsafeDefineMeta(key, existing, target);\n\t\t}\n\t};\n}\n\n/** `@ApiExclude()` — exclude a route from the spec. */\nexport function ApiExclude(): MethodDecorator {\n\treturn (target: object, propertyKey: string | symbol) => {\n\t\tsafeDefineMeta(OPENAPI_META.EXCLUDE, true, target.constructor, propertyKey);\n\t};\n}\n"
17
17
  ],
18
- "mappings": "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",
19
- "debugId": "CE2341D1AAE8C39064756E2164756E21",
18
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,SAAS,UAAU,CAAC,MAAiN;AAAA,EAC3O,MAAM,QAAQ,WAAW,KAAK,KAAK;AAAA,EACnC,MAAM,QAAQ,KAAK,SAAS;AAAA,EAC5B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKG;AAAA,wDAC6C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAUxC,WAAW,KAAK,OAAO;AAAA,0BACb,kBAAkB,KAAK,UAAU,EAAE,OAAO,kBAAkB,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7F,SAAS,UAAU,CAAC,GAAmB;AAAA,EACtC,OAAO,EACL,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAAA;AAOxB,SAAS,iBAAiB,CAAC,GAAmB;AAAA,EAC7C,OAAO,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM;AAAA;;;AC6N9C,IAAM,eAAe;AAAA,EAC3B,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AACX;;AClRA;;;ACoBO,SAAS,eAAe,CAC9B,QACA,OAA0E,CAAC,GAC9D;AAAA,EACb,MAAM,OAAO,KAAK,SAAS,CAAC;AAAA,EAC5B,MAAM,UAAU,KAAK,WAAW,IAAI;AAAA,EACpC,IAAI,QAAQ,IAAI,MAAgB,GAAG;AAAA,IAElC,OAAO,CAAC;AAAA,EACT;AAAA,EACA,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAAA,IAClD,QAAQ,IAAI,MAAgB;AAAA,EAC7B;AAAA,EAEA,MAAM,MAAM,QAAQ,MAAM;AAAA,EAG1B,IAAI,IAAI,aAAa;AAAA,IAAa,OAAO,cAAc,GAAG;AAAA,EAC1D,IAAI,IAAI,aAAa;AAAA,IAAa,OAAO,cAAc,GAAG;AAAA,EAC1D,IAAI,IAAI,aAAa;AAAA,IAAa,OAAO,EAAE,MAAM,WAAW,QAAQ,QAAQ;AAAA,EAC5E,IAAI,IAAI,aAAa;AAAA,IAAc,OAAO,EAAE,MAAM,UAAU;AAAA,EAC5D,IAAI,IAAI,aAAa;AAAA,IAAW,OAAO,EAAE,MAAM,UAAU,QAAQ,YAAY;AAAA,EAC7E,IAAI,IAAI,aAAa;AAAA,IAAW,OAAO,EAAE,MAAM,OAAO;AAAA,EACtD,IAAI,IAAI,aAAa;AAAA,IAAgB,OAAO,EAAE,KAAK,CAAC,EAAE;AAAA,EACtD,IAAI,IAAI,aAAa;AAAA,IAAU,OAAO,CAAC;AAAA,EACvC,IAAI,IAAI,aAAa;AAAA,IAAc,OAAO,CAAC;AAAA,EAC3C,IAAI,IAAI,aAAa;AAAA,IAAY,OAAO,EAAE,KAAK,CAAC,EAAE;AAAA,EAElD,IAAI,IAAI,aAAa,cAAc;AAAA,IAClC,MAAM,IAAK,IAA2B;AAAA,IACtC,OAAO,EAAE,MAAM,WAAW,CAAC,GAAyB,MAAM,CAAC,CAAC,EAAE;AAAA,EAC/D;AAAA,EAEA,IAAI,IAAI,aAAa,WAAW;AAAA,IAC/B,MAAM,SAAU,IAAmD;AAAA,IACnE,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,IAAI,WAAW;AAAA,IAClE,OAAO,EAAE,MAAM,GAAyB,MAAM,CAAC,GAAG,MAAM,EAAE;AAAA,EAC3D;AAAA,EAEA,IAAI,IAAI,aAAa,iBAAiB;AAAA,IACrC,MAAM,SAAU,IAAoD;AAAA,IACpE,MAAM,UAAU,OAAO,QAAQ,MAAM,EAAE,OACtC,EAAE,GAAG,OAAO,OAAO,MAAM,YAAY,MAAM,OAAO,CAAC,CAAC,CACrD;AAAA,IACA,MAAM,QAAO,QAAQ,IAAI,IAAI,OAAO,CAAC;AAAA,IACrC,MAAM,IAAI,MAAK,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,IAAI,WAAW;AAAA,IAChE,OAAO,EAAE,MAAM,GAAyB,MAAM,MAAK;AAAA,EACpD;AAAA,EAEA,IAAI,IAAI,aAAa,aAAa;AAAA,IACjC,OAAO,cAAc,QAAQ,KAAK,MAAM,OAAO;AAAA,EAChD;AAAA,EAEA,IAAI,IAAI,aAAa,YAAY;AAAA,IAChC,OAAO,aAAa,QAAQ,KAAK,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI,IAAI,aAAa,YAAY;AAAA,IAChC,MAAM,QAAS,IAA6B;AAAA,IAC5C,OAAO;AAAA,MACN,MAAM;AAAA,MACN,aAAa,MAAM,IAAI,CAAC,MAAM,gBAAgB,GAAG,EAAE,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,MAC1E,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,IACjB;AAAA,EACD;AAAA,EAEA,IAAI,IAAI,aAAa,cAAc,IAAI,aAAa,yBAAyB;AAAA,IAC5E,MAAM,UAAW,IAA0D,WACtE,IAAqC,gBACtC,CAAC;AAAA,IACL,OAAO;AAAA,MACN,OAAO,QAAQ,IAAI,CAAC,MAAM,gBAAgB,GAAG,EAAE,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,IACvE;AAAA,EACD;AAAA,EAEA,IAAI,IAAI,aAAa,yBAAyB;AAAA,IAC7C,MAAM,gBAAiB,IAAmC;AAAA,IAC1D,MAAM,UAAW,IAAgC,WAAW,CAAC;AAAA,IAC7D,MAAM,UAAsC,CAAC;AAAA,IAC7C,WAAW,OAAO,SAAS;AAAA,MAC1B,MAAM,KAAK,QAAQ,GAAG;AAAA,MACtB,IAAI,GAAG,aAAa,aAAa;AAAA,QAChC,MAAM,QAAS,GAAgD,MAAM;AAAA,QACrE,MAAM,OAAO,MAAM,iBAAiB;AAAA,QACpC,IAAI,QAAQ,WAAW,MAAM;AAAA,UAC5B,QAAQ,OAAO,KAAK,KAAK,KAAK,gBAAgB,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,QAC5E;AAAA,MACD;AAAA,IACD;AAAA,IACA,OAAO;AAAA,MACN,OAAO,OAAO,OAAO,OAAO;AAAA,MAC5B,eAAe,EAAE,cAAc,iBAAiB,OAAO;AAAA,IACxD;AAAA,EACD;AAAA,EAEA,IAAI,IAAI,aAAa,mBAAmB;AAAA,IACvC,MAAM,OAAQ,IAAqD,MAAM,QACpE,IAA0B;AAAA,IAC/B,MAAM,QAAS,IAAqD,MAAM,SACrE,IAA2B;AAAA,IAChC,OAAO;AAAA,MACN,OAAO;AAAA,QACN,gBAAgB,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,QAC9C,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,MAChD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,IAAI,IAAI,aAAa,aAAa;AAAA,IACjC,MAAM,YAAa,IAA+B;AAAA,IAClD,OAAO;AAAA,MACN,MAAM;AAAA,MACN,sBAAsB,gBAAgB,WAAW,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IAC1E;AAAA,EACD;AAAA,EAEA,IAAI,IAAI,aAAa,UAAU;AAAA,IAC9B,MAAM,YAAa,IAA+B;AAAA,IAClD,OAAO;AAAA,MACN,MAAM;AAAA,MACN,sBAAsB,gBAAgB,WAAW,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,IAC1E;AAAA,EACD;AAAA,EAEA,IAAI,IAAI,aAAa,eAAe;AAAA,IACnC,MAAM,QAAS,IAA+B;AAAA,IAC9C,OAAO,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,IAAI,aAAa,eAAe;AAAA,IACnC,MAAM,QAAS,IAA+B;AAAA,IAC9C,OAAO;AAAA,SACH,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,MAClD,UAAU;AAAA,IACX;AAAA,EACD;AAAA,EAEA,IAAI,IAAI,aAAa,cAAc;AAAA,IAClC,MAAM,QAAS,IAA4D;AAAA,IAC3E,MAAM,KAAM,IAAwC;AAAA,IACpD,OAAO;AAAA,SACH,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,MAClD,SAAS,SAAS,EAAE;AAAA,IACrB;AAAA,EACD;AAAA,EAEA,IAAI,IAAI,aAAa,YAAY;AAAA,IAChC,MAAM,QAAS,IAA+B;AAAA,IAC9C,OAAO,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,IAAI,aAAa,cAAc;AAAA,IAClC,MAAM,QAAS,IAA0B;AAAA,IACzC,OAAO,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,IAAI,aAAa,eAAe;AAAA,IACnC,MAAM,QAAS,IAA+B;AAAA,IAC9C,OAAO,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,IAAI,aAAa,WAAW;AAAA,IAC/B,MAAM,SAAU,IAAkC;AAAA,IAClD,MAAM,QAAQ,SAAS,MAAM;AAAA,IAC7B,OAAO,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,IAAI,aAAa,cAAc;AAAA,IAClC,MAAM,QAAS,IAAoE,UAC9E,IAA6B,UAC7B,IAAgC;AAAA,IACrC,OAAO,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,IAAI,aAAa,eAAe;AAAA,IACnC,MAAM,QAAS,IAAyB;AAAA,IACxC,OAAO,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,IAAI,aAAa;AAAA,IAAe,OAAO,EAAE,MAAM,OAAO;AAAA,EAC1D,IAAI,IAAI,aAAa,cAAc;AAAA,IAClC,MAAM,QAAS,IAA+B;AAAA,IAC9C,OAAO,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EACvD;AAAA,EAKA,OAAO,CAAC;AAAA;AAST,SAAS,OAAO,CAAC,QAAyB;AAAA,EACzC,IAAI,OAAO,WAAW,YAAY,WAAW;AAAA,IAAM,OAAO,EAAE,UAAU,GAAG;AAAA,EAEzE,MAAM,IAAI;AAAA,EACV,IAAI,EAAE,QAAQ,OAAO,EAAE,SAAS;AAAA,IAAU,OAAO,EAAE;AAAA,EAEnD,OAAO;AAAA;AAGR,SAAS,aAAa,CAAC,KAAyB;AAAA,EAC/C,MAAM,MAAkB,EAAE,MAAM,SAAS;AAAA,EACzC,MAAM,SAAU,IAAI,UAAU,CAAC;AAAA,EAC/B,WAAW,KAAK,QAAQ;AAAA,IACvB,QAAQ,EAAE;AAAA,WACJ;AAAA,QAAS,IAAI,SAAS;AAAA,QAAS;AAAA,WAC/B;AAAA,QAAO,IAAI,SAAS;AAAA,QAAO;AAAA,WAC3B;AAAA,QAAQ,IAAI,SAAS;AAAA,QAAQ;AAAA,WAC7B;AAAA,WACA;AAAA,QAAS,IAAI,SAAS;AAAA,QAAQ;AAAA,WAC9B;AAAA,QAAS;AAAA,WACT;AAAA,QAAM,IAAI,SAAS;AAAA,QAAQ;AAAA,WAC3B;AAAA,QAAQ,IAAI,SAAS;AAAA,QAAQ;AAAA,WAC7B;AAAA,QAAY,IAAI,SAAS;AAAA,QAAa;AAAA,WACtC;AAAA,QAAQ,IAAI,SAAS;AAAA,QAAQ;AAAA,WAC7B;AAAA,QAAQ,IAAI,SAAS;AAAA,QAAQ;AAAA,WAC7B;AAAA,QAAY;AAAA,WACZ;AAAA,WACA;AAAA,QAAU,IAAI,YAAY,OAAO,EAAE,KAAK;AAAA,QAAG;AAAA,WAC3C;AAAA,QAAO,IAAI,YAAY,OAAO,EAAE,KAAK;AAAA,QAAG;AAAA,WACxC;AAAA,QAAS,IAAI,EAAE;AAAA,UAAO,IAAI,UAAU,EAAE,MAAM;AAAA,QAAQ;AAAA,WACpD;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,QAEJ;AAAA;AAAA,EAEH;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,aAAa,CAAC,KAAyB;AAAA,EAC/C,MAAM,MAAkB,EAAE,MAAM,SAAS;AAAA,EACzC,MAAM,SAAU,IAAI,UAAU,CAAC;AAAA,EAC/B,IAAI,QAAQ;AAAA,EACZ,WAAW,KAAK,QAAQ;AAAA,IACvB,QAAQ,EAAE;AAAA,WACJ;AAAA,WACA;AAAA,QAAW,QAAQ;AAAA,QAAM;AAAA,WACzB;AAAA,QAAO,IAAI,UAAU,EAAE;AAAA,QAAO;AAAA,WAC9B;AAAA,QAAO,IAAI,UAAU,EAAE;AAAA,QAAO;AAAA,WAC9B;AAAA,WACA;AAAA,QAGJ;AAAA;AAAA,EAEH;AAAA,EACA,IAAI;AAAA,IAAO,IAAI,OAAO;AAAA,EACtB,OAAO;AAAA;AAGR,SAAS,aAAa,CACrB,SACA,KACA,MACA,SACa;AAAA,EACb,MAAM,UAAW,IAA4B;AAAA,EAC7C,MAAM,QAAQ,OAAO,YAAY,aAAc,QAA0C,IAAI;AAAA,EAC7F,MAAM,aAAyC,CAAC;AAAA,EAChD,MAAM,WAAqB,CAAC;AAAA,EAC5B,MAAM,WAAY,IAA+B;AAAA,EACjD,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,MACjD,MAAM,QAAQ,gBAAgB,OAAO,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC7D,MAAM,WAAW,QAAQ,KAAK;AAAA,MAE9B,MAAM,aACL,SAAS,aAAa,iBACtB,SAAS,aAAa,gBACtB,SAAS,aAAa;AAAA,MACvB,WAAW,OAAO;AAAA,MAClB,IAAI,CAAC;AAAA,QAAY,SAAS,KAAK,GAAG;AAAA,IACnC;AAAA,EACD;AAAA,EACA,MAAM,cAAe,IAAiC;AAAA,EACtD,MAAM,MAAkB,EAAE,MAAM,UAAU,WAAW;AAAA,EACrD,IAAI,SAAS,SAAS;AAAA,IAAG,IAAI,WAAW;AAAA,EACxC,IAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AAAA,IACtD,MAAM,IAAI,QAAQ,QAAQ;AAAA,IAE1B,IAAI,EAAE,aAAa;AAAA,MAAY,IAAI,uBAAuB;AAAA,IACrD;AAAA,UAAI,uBAAuB;AAAA,EACjC;AAAA,EACA,IAAI;AAAA,IAAa,IAAI,cAAc;AAAA,EACnC,OAAO;AAAA;AAGR,SAAS,YAAY,CACpB,SACA,KACA,MACA,SACa;AAAA,EACb,MAAM,MAAkB,EAAE,MAAM,QAAQ;AAAA,EACxC,MAAM,UAAW,IAA8C,WAC1D,IAA2B;AAAA,EAChC,IAAI;AAAA,IAAS,IAAI,QAAQ,gBAAgB,SAAS,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,EAC1E,MAAM,SAAU;AAAA,EAChB,IAAI,OAAO,WAAW,SAAS;AAAA,IAAM,IAAI,WAAW,OAAO,UAAU;AAAA,EACrE,IAAI,OAAO,WAAW,SAAS;AAAA,IAAM,IAAI,WAAW,OAAO,UAAU;AAAA,EACrE,OAAO;AAAA;AAGR,SAAS,UAAU,CAAC,GAAiE;AAAA,EACpF,IAAI,MAAM;AAAA,IAAM,OAAO;AAAA,EACvB,IAAI,OAAO,MAAM;AAAA,IAAU,OAAO;AAAA,EAClC,IAAI,OAAO,MAAM;AAAA,IAAU,OAAO;AAAA,EAClC,IAAI,OAAO,MAAM;AAAA,IAAW,OAAO;AAAA,EACnC,OAAO;AAAA;AAGR,SAAS,QAAW,CAAC,IAAgB;AAAA,EACpC,IAAI;AAAA,IACH,OAAQ,GAAe;AAAA,IACtB,MAAM;AAAA,IACP;AAAA;AAAA;;;ADzUF;AAGO,MAAM,eAAe;AAAA,SAEX,QAAQ,OAAO,IAAI,sBAAsB;AAAA,EAEzD;AAAA,EACA,cAAoD,EAAE,SAAS,IAAI,IAAM;AAAA,EACzE,UAA2G,CAAC;AAAA,EAE5G,WAAW,CAA2B,QAAuB;AAAA,IAC5D,KAAK,UAAU;AAAA;AAAA,EAOhB,SAAS,CACR,QAOO;AAAA,IACP,KAAK,UAAU;AAAA;AAAA,EAIhB,cAAc,CAAC,MAAc,QAA0B;AAAA,IACtD,KAAK,YAAY,QAAQ,IAAI,MAAM,MAAM;AAAA;AAAA,EAI1C,OAAO,GAAoB;AAAA,IAC1B,MAAM,QAA0D,CAAC;AAAA,IACjE,WAAW,SAAS,KAAK,SAAS;AAAA,MACjC,IAAI,YAAY,aAAa,SAAS,MAAM,OAAO,aAAa,MAAM,WAAW;AAAA,QAAG;AAAA,MACpF,MAAM,KAAK,KAAK,eAAe,KAAK;AAAA,MACpC,MAAM,aAAa,KAAK,cAAc,MAAM,IAAI;AAAA,MAChD,MAAM,SAAS,MAAM,OAAO,YAAY;AAAA,MACxC,IAAI,CAAC,MAAM;AAAA,QAAa,MAAM,cAAc,CAAC;AAAA,MAC7C,MAAM,YAAY,UAAU;AAAA,IAC7B;AAAA,IAEA,MAAM,MAAuB;AAAA,MAC5B,SAAS;AAAA,MACT,MAAM,KAAK,QAAQ;AAAA,MACnB;AAAA,IACD;AAAA,IACA,IAAI,KAAK,QAAQ,SAAS;AAAA,MAAQ,IAAI,UAAU,KAAK,QAAQ;AAAA,IAC7D,IAAI,KAAK,QAAQ,MAAM;AAAA,MAAQ,IAAI,OAAO,KAAK,QAAQ;AAAA,IACvD,IAAI,KAAK,QAAQ;AAAA,MAAc,IAAI,eAAe,KAAK,QAAQ;AAAA,IAC/D,IAAI,KAAK,YAAY,QAAQ,OAAO,GAAG;AAAA,MACtC,IAAI,aAAa;AAAA,QAChB,SAAS,OAAO,YAAY,KAAK,YAAY,OAAO;AAAA,MACrD;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,EAMA,cAAc,CAAC,OAMF;AAAA,IACpB,MAAM,OAAO,MAAM,OAAO,eAAe,MAAM;AAAA,IAC/C,MAAM,UAAU,MAAM;AAAA,IAGtB,MAAM,YAAsB,YAAY,aAAa,MAAM,IAAI,KAAK,CAAC;AAAA,IACrE,MAAM,SAA0C,YAC/C,aAAa,WACb,MACA,OACD;AAAA,IACA,MAAM,SAAmB,QAAQ,QAAQ,CAAC;AAAA,IAC1C,MAAM,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,CAAC;AAAA,IAGnD,MAAM,SAA6B,CAAC;AAAA,IAEpC,MAAM,aAAa,KAAK,kBAAkB,MAAM,IAAI;AAAA,IACpD,WAAW,QAAQ,YAAY;AAAA,MAC9B,MAAM,YACJ,YAAY,aAAa,QAAQ,MAAM,OAAO,KAAK,CAAC,GACpD,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,MAC7B,OAAO,KAAK;AAAA,QACX;AAAA,QACA,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,aAAa,UAAU;AAAA,QACvB,QAAQ,UAAU,SAAS,KAAK,SAAS,SAAS,MAAM,IAAI,EAAE,MAAM,SAAS;AAAA,MAC9E,CAAC;AAAA,IACF;AAAA,IAEA,IAAI,MAAM,YAAY,OAAO;AAAA,MAC5B,KAAK,gBACJ,MACA,SACA,SACA,MAAM,WAAW,OACjB,QACA,KACD;AAAA,IACD;AAAA,IAEA,IAAI,MAAM,YAAY,SAAS;AAAA,MAC9B,KAAK,gBACJ,MACA,SACA,UACA,MAAM,WAAW,SACjB,QACA,KACD;AAAA,IACD;AAAA,IAEA,MAAM,kBACL,YAAY,aAAa,SAAS,MAAM,OAAO,KAAK,CAAC;AAAA,IACtD,WAAW,KAAK,iBAAiB;AAAA,MAEhC,MAAM,MAAM,OAAO,UAClB,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,SAAS,EAAE,IACzC;AAAA,MACA,MAAM,QAA0B;AAAA,QAC/B,MAAM,EAAE;AAAA,QACR,IAAI;AAAA,QACJ,UAAU,EAAE,YAAY;AAAA,QACxB,aAAa,EAAE;AAAA,QACf,QAAQ,EAAE,SAAS,KAAK,SAAS,EAAE,MAAM,IAAI,EAAE,MAAM,SAAS;AAAA,MAC/D;AAAA,MACA,IAAI,OAAO;AAAA,QAAG,OAAO,OAAO;AAAA,MACvB;AAAA,eAAO,KAAK,KAAK;AAAA,IACvB;AAAA,IAEA,MAAM,iBACL,YAAY,aAAa,QAAQ,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD,WAAW,KAAK,gBAAgB;AAAA,MAC/B,MAAM,MAAM,OAAO,UAClB,CAAC,MAAM,EAAE,OAAO,UAAU,EAAE,SAAS,EAAE,IACxC;AAAA,MACA,MAAM,QAA0B;AAAA,QAC/B,MAAM,EAAE;AAAA,QACR,IAAI;AAAA,QACJ,UAAU,EAAE,YAAY;AAAA,QACxB,aAAa,EAAE;AAAA,QACf,QAAQ,EAAE,SAAS,KAAK,SAAS,EAAE,MAAM,IAAI,EAAE,MAAM,SAAS;AAAA,MAC/D;AAAA,MACA,IAAI,OAAO;AAAA,QAAG,OAAO,OAAO;AAAA,MACvB;AAAA,eAAO,KAAK,KAAK;AAAA,IACvB;AAAA,IAGA,IAAI;AAAA,IACJ,MAAM,WAAW,YAAY,aAAa,MAAM,MAAM,OAAO;AAAA,IAC7D,IAAI,UAAU,UAAU,MAAM,YAAY,MAAM;AAAA,MAC/C,MAAM,SAAS,UAAU,UAAU,MAAM,YAAY;AAAA,MACrD,MAAM,YAA8B,EAAE,QAAQ,KAAK,SAAS,MAAM,EAAE;AAAA,MACpE,IAAI,UAAU,YAAY;AAAA,QAAW,UAAU,UAAU,SAAS;AAAA,MAClE,cAAc;AAAA,QACb,aAAa,UAAU,eAAe;AAAA,QACtC,SAAS,EAAE,oBAAoB,UAAU;AAAA,QACzC,UAAU,UAAU,YAAY;AAAA,MACjC;AAAA,IACD;AAAA,IAGA,MAAM,YAA6C,CAAC;AAAA,IACpD,MAAM,gBACL,YAAY,aAAa,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACxD,YAAY,QAAQ,QAAQ,eAAe;AAAA,MAC1C,MAAM,IAAqB,EAAE,aAAa,IAAI,YAAY;AAAA,MAC1D,IAAI,IAAI,QAAQ;AAAA,QACf,EAAE,UAAU;AAAA,UACX,oBAAoB;AAAA,YACnB,QAAQ,KAAK,SAAS,IAAI,MAAM;AAAA,eAC5B,IAAI,YAAY,YAAY,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC;AAAA,UAC7D;AAAA,QACD;AAAA,MACD;AAAA,MACA,UAAU,UAAU;AAAA,IACrB;AAAA,IAEA,IAAI,OAAO,KAAK,SAAS,EAAE,WAAW,GAAG;AAAA,MACxC,UAAU,SAAS,EAAE,aAAa,sBAAsB;AAAA,IACzD;AAAA,IAGA,MAAM,KAAuB;AAAA,MAC5B;AAAA,IACD;AAAA,IACA,IAAI,KAAK,SAAS;AAAA,MAAG,GAAG,OAAO;AAAA,IAC/B,IAAI,QAAQ;AAAA,MAAS,GAAG,UAAU,OAAO;AAAA,IACzC,IAAI,QAAQ;AAAA,MAAa,GAAG,cAAc,OAAO;AAAA,IACjD,IAAI,QAAQ;AAAA,MAAa,GAAG,cAAc,OAAO;AAAA,IACjD,IAAI,QAAQ;AAAA,MAAY,GAAG,aAAa;AAAA,IACxC,IAAI,OAAO,SAAS;AAAA,MAAG,GAAG,aAAa;AAAA,IACvC,IAAI;AAAA,MAAa,GAAG,cAAc;AAAA,IAClC,OAAO;AAAA;AAAA,EAUA,QAAQ,CAAC,OAA4B;AAAA,IAC5C,IAAI,SAAS;AAAA,MAAM,OAAO,CAAC;AAAA,IAE3B,IAAI,OAAO,UAAU,YAAY,CAAC,UAAU,KAAK,GAAG;AAAA,MACnD,OAAO;AAAA,IACR;AAAA,IAEA,IAAI;AAAA,MACH,OAAO,gBAAgB,KAAK;AAAA,MAC3B,MAAM;AAAA,MACP,OAAO,CAAC;AAAA;AAAA;AAAA,EAIF,eAAe,CACtB,MACA,SACA,OACA,QACA,QACA,UACO;AAAA,IACP,MAAM,OAAO,KAAK,SAAS,MAAM;AAAA,IAEjC,IAAI,KAAK,SAAS,YAAY,KAAK,YAAY;AAAA,MAC9C,MAAM,MAAM,IAAI,IAAI,KAAK,YAAY,CAAC,CAAC;AAAA,MACvC,YAAY,MAAM,QAAQ,OAAO,QAAQ,KAAK,UAAU,GAAG;AAAA,QAC1D,OAAO,KAAK;AAAA,UACX;AAAA,UACA,IAAI;AAAA,UACJ,UAAU,YAAY,IAAI,IAAI,IAAI;AAAA,UAClC,QAAQ;AAAA,QACT,CAAC;AAAA,MACF;AAAA,IACD;AAAA;AAAA,EAGO,iBAAiB,CAAC,MAAwB;AAAA,IACjD,MAAM,MAAgB,CAAC;AAAA,IACvB,MAAM,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,QAAQ,IAAI,GAAG,KAAK,IAAI,OAAO;AAAA,MAAM,IAAI,KAAK,EAAE,EAAG;AAAA,IACnD,OAAO;AAAA;AAAA,EAGA,aAAa,CAAC,MAAsB;AAAA,IAC3C,OAAO,KAAK,QAAQ,qBAAqB,MAAM;AAAA;AAEjD;AAtQa,iBAAN;AAAA,EADN,WAAW;AAAA,EASE,kCAAO,gBAAgB;AAAA,EAR9B;AAAA;AAAA;AAAA,GAAM;AAwQb,SAAS,SAAS,CAAC,GAAqB;AAAA,EACvC,IAAI,OAAO,MAAM,YAAY,MAAM;AAAA,IAAM,OAAO;AAAA,EAChD,MAAM,IAAI;AAAA,EACV,MAAM,IAAI,EAAE,MAAM,YAAY,EAAE;AAAA,EAChC,OAAO,OAAO,MAAM,YAAY,EAAE,WAAW,KAAK;AAAA;;AErRnD;AAYO,MAAM,cAAc;AAAA,SACnB,OAAO,CAAC,QAAuB;AAAA,IASrC,MAAM,wBAAwB;AAAA,IAAC;AAAA,IAAzB,0BAAN;AAAA,MARC,OAAO;AAAA,QACP,WAAW;AAAA,UACV;AAAA,UACA,EAAE,SAAS,eAAe,OAAO,aAAa,eAAe;AAAA,UAC7D,EAAE,SAAS,kBAAkB,UAAU,OAAO;AAAA,QAC/C;AAAA,QACA,SAAS,CAAC,gBAAgB,eAAe,KAAK;AAAA,MAC/C,CAAC;AAAA,OACK;AAAA,IACN,OAAO,eAAe,yBAAyB,QAAQ;AAAA,MACtD,OAAO;AAAA,IACR,CAAC;AAAA,IACD,OAAO;AAAA;AAAA,SAaD,KAAK,CACX,KACA,KACA,QACO;AAAA,IACP,MAAM,WAAW,OAAO,YAAY;AAAA,IACpC,MAAM,WAAW,OAAO,QAAQ;AAAA,IAEhC,IAAI,IAAI,UAAU,CAAC,MAAW,EAAE,KAAK,IAAI,QAAQ,GAAG,KAAK,EAAE,gBAAgB,mBAAmB,CAAC,CAAC;AAAA,IAChG,IAAI,IAAI,UAAU,CAAC,MAAW;AAAA,MAE7B,QAAQ;AAAA,MACR,MAAM,OAAO,YAAW;AAAA,QACvB,OAAO,OAAO,KAAK;AAAA,QACnB,SAAS;AAAA,MACV,CAAC;AAAA,MACD,OAAO,EAAE,KAAK,MAAM,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AAAA,KACvE;AAAA;AAEH;AA9Ca,gBAAN;AAAA,EAPN,OAAO;AAAA,IACP,WAAW;AAAA,MACV;AAAA,MACA,EAAE,SAAS,eAAe,OAAO,aAAa,eAAe;AAAA,IAC9D;AAAA,IACA,SAAS,CAAC,gBAAgB,eAAe,KAAK;AAAA,EAC/C,CAAC;AAAA,GACY;;AC/Bb,wBAAS,gCAAa;AAGf,SAAS,OAAO,IAAI,MAAgC;AAAA,EAC1D,OAAO,CAAC,WAAgB;AAAA,IACvB,MAAM,WAAqB,aAAY,aAAa,MAAM,MAAM,KAAK,CAAC;AAAA,IACtE,gBAAe,aAAa,MAAM,CAAC,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM;AAAA;AAAA;;ACJlE,2BAAsB;AAEf,SAAS,YAAY,CAAC,SAA+C;AAAA,EAC3E,OAAO,CAAC,QAAgB,gBAAiC;AAAA,IACxD,gBAAe,aAAa,WAAW,SAAS,OAAO,aAAa,WAAW;AAAA;AAAA;;ACHjF,wBAAS,gCAAa;AAEf,SAAS,WAAW,CAC1B,QACA,SACkB;AAAA,EAClB,OAAO,CAAC,QAAgB,gBAAiC;AAAA,IACxD,MAAM,WACL,aAAY,aAAa,WAAW,OAAO,aAAa,WAAW,KAAK,CAAC;AAAA,IAC1E,SAAS,KAAK,CAAC,OAAO,MAAM,GAAG,OAAO,CAAC;AAAA,IACvC,gBAAe,aAAa,WAAW,UAAU,OAAO,aAAa,WAAW;AAAA;AAAA;;ACVlF,wBAAS,gCAAa;AAEf,SAAS,QAAQ,CAAC,SAA2C;AAAA,EACnE,OAAO,CAAC,QAAgB,gBAAiC;AAAA,IACxD,MAAM,WACL,aAAY,aAAa,QAAQ,OAAO,aAAa,WAAW,KAAK,CAAC;AAAA,IACvE,SAAS,KAAK,OAAO;AAAA,IACrB,gBAAe,aAAa,QAAQ,UAAU,OAAO,aAAa,WAAW;AAAA;AAAA;AAUxE,SAAS,QAAQ,CAAC,SAA2C;AAAA,EACnE,OAAO,CAAC,QAAgB,gBAAiC;AAAA,IACxD,MAAM,WACL,aAAY,aAAa,SAAS,OAAO,aAAa,WAAW,KAAK,CAAC;AAAA,IACxE,SAAS,KAAK,OAAO;AAAA,IACrB,gBAAe,aAAa,SAAS,UAAU,OAAO,aAAa,WAAW;AAAA;AAAA;;ACvBhF,2BAAsB;AAEf,SAAS,OAAO,CAAC,SAA0C;AAAA,EACjE,OAAO,CAAC,QAAgB,gBAAiC;AAAA,IACxD,gBAAe,aAAa,MAAM,SAAS,OAAO,aAAa,WAAW;AAAA;AAAA;;ACS5E,wBAAS,gCAAa;AAEf,SAAS,WAAW,CAAC,UAA8B,CAAC,GAAsB;AAAA,EAChF,OAAO,CAAC,QAAgB,gBAAiC;AAAA,IACxD,MAAM,WACL,aAAY,aAAa,YAAY,OAAO,WAAW,KAAK,CAAC;AAAA,IAC9D,SAAS,eAAe;AAAA,IACxB,gBAAe,aAAa,YAAY,UAAU,OAAO,WAAW;AAAA;AAAA;AAK/D,SAAS,SAAS,CAAC,MAA8B;AAAA,EACvD,OAAO,CAAC,WAAgB;AAAA,IACvB,gBAAe,4BAA4B,MAAM,MAAM;AAAA;AAAA;;AC5BzD,wBAAS,gCAAa;AAEf,SAAS,WAAW,CAAC,MAAc,SAAmB,CAAC,GAAqC;AAAA,EAClG,OAAO,CACN,QACA,cACA,gBACI;AAAA,IAEJ,MAAM,MAAM,aAAa;AAAA,IACzB,MAAM,WACJ,OAAO,iBAAiB,YAAY,OAAO,iBAAiB,WAC1D,aAAY,KAAK,OAAO,aAAa,YAAY,KAAK,CAAC,IACvD,aAAY,KAAK,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK,GAAG,OAAO,OAAO,CAAC;AAAA,IAChC,IAAI,OAAO,iBAAiB,YAAY,OAAO,iBAAiB,UAAU;AAAA,MACzE,gBAAe,KAAK,UAAU,OAAO,aAAa,YAAY;AAAA,IAC/D,EAAO;AAAA,MACN,gBAAe,KAAK,UAAU,MAAM;AAAA;AAAA;AAAA;AAMhC,SAAS,UAAU,GAAoB;AAAA,EAC7C,OAAO,CAAC,QAAgB,gBAAiC;AAAA,IACxD,gBAAe,aAAa,SAAS,MAAM,OAAO,aAAa,WAAW;AAAA;AAAA;",
19
+ "debugId": "CB69F756A574AB3E64756E2164756E21",
20
20
  "names": []
21
21
  }
@@ -1,27 +1,3 @@
1
- /**
2
- * `OpenAPIModule` — drop-in OpenAPI 3.1 + Scalar UI.
3
- *
4
- * @Module({
5
- * imports: [
6
- * OpenAPIModule.forRoot({
7
- * info: { title: 'My API', version: '1.0.0' },
8
- * servers: [{ url: 'http://localhost:3000' }],
9
- * }),
10
- * ],
11
- * })
12
- * export class AppModule {}
13
- *
14
- * After boot, the framework exposes:
15
- *
16
- * GET /openapi.json — the OpenAPI 3.1 spec
17
- * GET /docs — the Scalar UI
18
- *
19
- * To feed routes to the spec, the application must call
20
- * `OpenAPIService.setRoutes(...)` after the router is built. The
21
- * recommended way is to read routes from the `NexusServer` instance
22
- * inside the module's onModuleInit hook (see the helper below).
23
- */
24
- import "reflect-metadata";
25
1
  import { OpenAPIService } from "./openapi.service.js";
26
2
  import type { OpenAPIConfig } from "./types.js";
27
3
  export declare class OpenAPIModule {
@@ -1,15 +1,3 @@
1
- /**
2
- * `OpenAPIService` — walks the framework's route table, reads
3
- * `@ApiTags` / `@ApiOperation` / `@ApiResponse` / `@ApiBody` /
4
- * `@ApiParam` / `@ApiQuery` / `@Validate` metadata, and produces an
5
- * OpenAPI 3.1 document.
6
- *
7
- * The document is rebuilt on demand (cheap: in-memory walk) and
8
- * exposed via `getSpec()`. The framework's router already exposes a
9
- * `getRoutes()` method that returns the registered route list, so
10
- * the spec is always in sync with the actual API.
11
- */
12
- import "reflect-metadata";
13
1
  import type { JSONSchema, OpenAPIConfig, OpenAPIDocument } from "./types.js";
14
2
  export declare class OpenAPIService {
15
3
  #private;
package/dist/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  /**
2
+ import { safeGetMeta, safeDefineMeta, safeHasMeta } from "@nexusts/core/di/safe-reflect";
2
3
  * `nexusjs/openapi` — OpenAPI 3.1 + Scalar UI.
3
4
  *
4
5
  * @Module({
@@ -22,7 +23,6 @@
22
23
  * // -> GET /openapi.json (the spec)
23
24
  * // -> GET /docs (Scalar UI)
24
25
  */
25
- import "reflect-metadata";
26
26
  export interface OpenAPIConfig {
27
27
  /** Top-level info block. */
28
28
  info: OpenAPIInfo;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexusts/openapi",
3
- "version": "0.8.4",
3
+ "version": "0.9.0",
4
4
  "description": "OpenAPI 3.1 spec generation from Zod",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "license": "MIT",
28
28
  "dependencies": {
29
- "@nexusts/core": "^0.8.4"
29
+ "@nexusts/core": "^0.9.0"
30
30
  },
31
31
  "repository": {
32
32
  "type": "git",