@open-mercato/shared 0.7.1-develop.7193.1.910a5b0a1e → 0.7.1-develop.7195.1.b5efd1d51a

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.
Files changed (58) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/lib/ai/opencode-tool-parts.js +48 -0
  3. package/dist/lib/ai/opencode-tool-parts.js.map +7 -0
  4. package/dist/lib/ai/token-count.js +11 -0
  5. package/dist/lib/ai/token-count.js.map +7 -0
  6. package/dist/lib/bootstrap/dynamicLoader.js +14 -1
  7. package/dist/lib/bootstrap/dynamicLoader.js.map +2 -2
  8. package/dist/lib/commands/command-bus.js +9 -1
  9. package/dist/lib/commands/command-bus.js.map +2 -2
  10. package/dist/lib/commands/registry.js +9 -0
  11. package/dist/lib/commands/registry.js.map +2 -2
  12. package/dist/lib/commands/types.js.map +2 -2
  13. package/dist/lib/di/container.js +7 -10
  14. package/dist/lib/di/container.js.map +2 -2
  15. package/dist/lib/encryption/subscriber.js +22 -2
  16. package/dist/lib/encryption/subscriber.js.map +2 -2
  17. package/dist/lib/openapi/generator.js +3 -2
  18. package/dist/lib/openapi/generator.js.map +2 -2
  19. package/dist/lib/openapi/index.js +3 -2
  20. package/dist/lib/openapi/index.js.map +2 -2
  21. package/dist/lib/seed/crypto.js +73 -0
  22. package/dist/lib/seed/crypto.js.map +7 -0
  23. package/dist/lib/seed/index.js +4 -0
  24. package/dist/lib/seed/index.js.map +7 -0
  25. package/dist/lib/seed/loader.js +73 -0
  26. package/dist/lib/seed/loader.js.map +7 -0
  27. package/dist/lib/seed/types.js +33 -0
  28. package/dist/lib/seed/types.js.map +7 -0
  29. package/dist/lib/version.js +1 -1
  30. package/dist/lib/version.js.map +1 -1
  31. package/dist/modules/events/factory.js +28 -9
  32. package/dist/modules/events/factory.js.map +2 -2
  33. package/package.json +3 -2
  34. package/src/lib/ai/__tests__/opencode-tool-parts.test.ts +81 -0
  35. package/src/lib/ai/__tests__/token-count.test.ts +20 -0
  36. package/src/lib/ai/opencode-tool-parts.ts +80 -0
  37. package/src/lib/ai/token-count.ts +21 -0
  38. package/src/lib/bootstrap/dynamicLoader.ts +24 -1
  39. package/src/lib/commands/__tests__/command-bus.test.ts +64 -0
  40. package/src/lib/commands/__tests__/registry.test.ts +35 -0
  41. package/src/lib/commands/command-bus.ts +16 -1
  42. package/src/lib/commands/registry.ts +11 -0
  43. package/src/lib/commands/types.ts +31 -0
  44. package/src/lib/di/__tests__/bootstrap-cache.test.ts +59 -3
  45. package/src/lib/di/container.ts +19 -15
  46. package/src/lib/encryption/__tests__/subscriber.kms-recovery.test.ts +112 -0
  47. package/src/lib/encryption/subscriber.ts +28 -1
  48. package/src/lib/openapi/__tests__/generator-response-fallback.test.ts +73 -0
  49. package/src/lib/openapi/generator.ts +3 -3
  50. package/src/lib/openapi/index.ts +1 -1
  51. package/src/lib/seed/__tests__/seed-crypto.test.ts +64 -0
  52. package/src/lib/seed/crypto.ts +87 -0
  53. package/src/lib/seed/index.ts +3 -0
  54. package/src/lib/seed/loader.ts +124 -0
  55. package/src/lib/seed/types.ts +48 -0
  56. package/src/modules/events/__tests__/factory.test.ts +96 -0
  57. package/src/modules/events/factory.ts +41 -10
  58. package/src/modules/events/types.ts +44 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/encryption/subscriber.ts"],
4
- "sourcesContent": ["import type { EntityMetadata, EventArgs, EventSubscriber } from '@mikro-orm/core'\nimport { ReferenceKind } from '@mikro-orm/core'\nimport { resolveEntityIdFromMetadata } from './entityIds'\nimport { TenantDataEncryptionService, parseDecryptedFieldValue } from './tenantDataEncryptionService'\nimport { isTenantDataEncryptionEnabled } from './toggles'\nimport { isEncryptionDebugEnabled } from './toggles'\nimport { resolveTenantEncryptionService } from './customFieldValues'\nimport { createLogger } from '../logger'\nimport { listEntityMetadataFromRegistry } from '../db/entityMetadata'\n\nconst logger = createLogger('shared').child({ component: 'encryption' })\n\ntype Scoped = {\n tenantId?: string | null\n tenant_id?: string | null\n tenant?: { id?: string | null } | null\n organizationId?: string | null\n organization_id?: string | null\n organization?: { id?: string | null } | null\n}\n\ntype Scope = { tenantId: string | null; organizationId: string | null }\n\nfunction resolveScope(entity: Scoped): Scope {\n const tenantId = entity.tenantId ?? entity.tenant_id ?? entity.tenant?.id ?? null\n const organizationId = entity.organizationId ?? entity.organization_id ?? entity.organization?.id ?? null\n return {\n tenantId: tenantId ? String(tenantId) : null,\n organizationId: organizationId ? String(organizationId) : null,\n }\n}\n\nfunction debug(event: string, payload: Record<string, unknown>) {\n if (!isEncryptionDebugEnabled()) return\n try {\n logger.debug(event, payload)\n } catch {\n // ignore\n }\n}\n\nfunction isJsonColumnProperty(prop: unknown): boolean {\n if (!prop || typeof prop !== 'object') return false\n const candidate = prop as Record<string, unknown>\n const type = typeof candidate.type === 'string' ? candidate.type.toLowerCase() : ''\n if (type === 'json' || type === 'jsonb') return true\n const columnTypes = Array.isArray(candidate.columnTypes) ? candidate.columnTypes : []\n if (columnTypes.some((value) => typeof value === 'string' && value.toLowerCase().includes('json'))) return true\n const customTypeName = (candidate.customType as { constructor?: { name?: string } } | undefined)?.constructor?.name\n return typeof customTypeName === 'string' && customTypeName.toLowerCase().includes('json')\n}\n\nconst registeredEventManagers = new WeakSet<object>()\n\nconst subscribersByService = new WeakMap<TenantDataEncryptionService, TenantEncryptionSubscriber>()\n\nfunction getSubscriberForService(service: TenantDataEncryptionService): TenantEncryptionSubscriber {\n const existing = subscribersByService.get(service)\n if (existing) return existing\n const subscriber = new TenantEncryptionSubscriber(service)\n subscribersByService.set(service, subscriber)\n return subscriber\n}\n\nconst toSnakeCase = (value: string): string =>\n value.replace(/([A-Z])/g, '_$1').replace(/__/g, '_').toLowerCase()\n\nexport class TenantEncryptionSubscriber implements EventSubscriber<any> {\n constructor(private readonly service: TenantDataEncryptionService) {}\n\n getSubscribedEntities() {\n return [] // listen to all entities\n }\n\n private resolveMeta(\n meta: EntityMetadata<any> | undefined,\n entity: Record<string, unknown>,\n em?: { getMetadata?: () => any },\n ): EntityMetadata<any> | undefined {\n if (meta) return meta\n const ctor = (entity as any)?.constructor\n const name = ctor?.name\n const registry = em?.getMetadata?.()\n if (!registry || !name) return meta\n try { return registry.find?.(name) } catch {}\n try { return registry.find?.(ctor) } catch {}\n try { return registry.get?.(name) } catch {}\n try { return registry.get?.(ctor) } catch {}\n try {\n const entries = listEntityMetadataFromRegistry(registry)\n const match = entries.find(\n (m: any) =>\n m?.className === name ||\n m?.name === name ||\n m?.entityName === name ||\n m?.collection === ctor?.prototype?.__meta?.tableName ||\n m?.tableName === ctor?.prototype?.__meta?.tableName,\n )\n if (match) return match as EntityMetadata<any>\n } catch {\n // best-effort\n }\n return meta\n }\n\n private resolveEntityId(meta: EntityMetadata<any> | undefined): string | null {\n try {\n return resolveEntityIdFromMetadata(meta)\n } catch {\n return null\n }\n }\n\n private restoreDecryptedJsonColumns(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n ) {\n const properties = meta?.properties\n if (!properties || typeof properties !== 'object') return\n for (const [propertyName, prop] of Object.entries(properties)) {\n if (!isJsonColumnProperty(prop)) continue\n const value = target[propertyName]\n if (typeof value !== 'string') continue\n const parsed = parseDecryptedFieldValue(value)\n if (parsed !== value) target[propertyName] = parsed\n }\n }\n\n private syncOriginalEntityData(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getComparator?: () => any },\n ) {\n const helper = (target as any)?.__helper\n if (!helper || typeof helper !== 'object') return\n\n // Prefer MikroORM comparator snapshot so change detection uses the expected shape.\n try {\n const comparator = em?.getComparator?.()\n if (comparator?.prepareEntity) {\n helper.__originalEntityData = comparator.prepareEntity(target)\n helper.__touched = false\n return\n }\n } catch (err) {\n debug('\u26AA\uFE0F subscriber.sync_original.comparator_failed', {\n entity: meta?.className || meta?.name,\n message: (err as Error)?.message ?? String(err),\n })\n }\n\n // Fallback: shallow snapshot of scalar/owner props to keep entities clean without comparator.\n const properties = meta?.properties ? Object.values(meta.properties) : []\n if (properties.length === 0) return\n const snapshot: Record<string, unknown> = { ...(helper.__originalEntityData ?? {}) }\n for (const prop of properties) {\n if ([ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes((prop as any).kind)) continue\n const name = (prop as any).name\n if (typeof name !== 'string' || !name.length) continue\n snapshot[name] = (target as Record<string, unknown>)[name]\n }\n helper.__originalEntityData = snapshot\n helper.__touched = false\n }\n\n /**\n * Reports whether a managed entity currently carries un-flushed changes relative to its load\n * baseline, using MikroORM's own comparator so the verdict matches the change-set computer that\n * runs at flush time. Used to avoid re-baselining (and thereby discarding) pending writes when a\n * decrypt pass traverses back into an entity a command already mutated.\n */\n private hasPendingChanges(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getComparator?: () => any },\n ): boolean {\n const helper = (target as any)?.__helper\n if (!helper || typeof helper !== 'object') return false\n const original = helper.__originalEntityData\n if (!original) return false\n const entityName = meta?.className || meta?.name\n try {\n const comparator = em?.getComparator?.()\n if (entityName && comparator?.prepareEntity) {\n const current = comparator.prepareEntity(target)\n if (typeof comparator.matching === 'function') {\n return !comparator.matching(entityName, original, current)\n }\n if (typeof comparator.diffEntities === 'function') {\n const diff = comparator.diffEntities(entityName, original, current)\n return !!diff && Object.keys(diff).length > 0\n }\n }\n } catch (err) {\n debug('\u26AA\uFE0F subscriber.pending_changes.compare_failed', {\n entity: entityName,\n message: (err as Error)?.message ?? String(err),\n })\n }\n return helper.__touched === true\n }\n\n private async encrypt(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getMetadata?: () => any; getComparator?: () => any },\n changeSet?: { payload?: Record<string, unknown> },\n ) {\n if (!isTenantDataEncryptionEnabled() || !this.service.isEnabled()) {\n debug('\u26AA\uFE0F subscriber.skip', { reason: 'disabled', entity: meta?.className || meta?.name })\n return\n }\n const resolvedMeta = this.resolveMeta(meta, target, em)\n const entityId = this.resolveEntityId(resolvedMeta)\n if (!entityId) {\n debug('\u26A0\uFE0F subscriber.decrypt.skip.entity_id_missing', {\n metaName: resolvedMeta?.className || resolvedMeta?.name,\n table: (resolvedMeta as any)?.tableName,\n })\n return\n }\n const { tenantId, organizationId } = resolveScope(target)\n const encrypted = await this.service.encryptEntityPayload(entityId, target, tenantId, organizationId)\n const metaProps: Record<string, unknown> = resolvedMeta?.properties && typeof resolvedMeta.properties === 'object'\n ? resolvedMeta.properties\n : {}\n const payloadObj: Record<string, unknown> | null =\n changeSet && typeof changeSet === 'object'\n ? (typeof changeSet.payload === 'object' && changeSet.payload\n ? (changeSet.payload as Record<string, unknown>)\n : ((changeSet.payload = {}) as Record<string, unknown>))\n : null\n const updates: Record<string, unknown> = {}\n const columnNameFor = (propKey: string, prop: Record<string, unknown> | undefined): string => {\n try {\n if (prop && typeof prop === 'object') {\n const explicit = (prop as any)?.fieldName\n if (typeof explicit === 'string' && explicit.length) return explicit\n const name = (prop as any)?.name\n if (typeof name === 'string' && name.length) return name\n }\n } catch (err) {\n debug('\u26A0\uFE0F subscriber.column_name.resolve', {\n entityId,\n propKey,\n message: (err as Error)?.message ?? String(err),\n })\n }\n return toSnakeCase(propKey)\n }\n\n for (const [key, value] of Object.entries(encrypted)) {\n const prop = (metaProps as Record<string, any>)[key]\n if (!prop || typeof prop !== 'object') continue\n if ((target as Record<string, unknown>)[key] === value) continue\n updates[key] = value\n }\n if (Object.keys(updates).length === 0) return\n Object.assign(target, updates)\n if (payloadObj) {\n try {\n const ensureColumnKey = (propKey: string, value: unknown) => {\n const columnName = columnNameFor(propKey, (metaProps as Record<string, any>)[propKey])\n const canonicalKey = columnName || toSnakeCase(propKey)\n const aliases = new Set(\n [propKey, toSnakeCase(propKey), columnName, columnName ? toSnakeCase(columnName) : undefined].filter(\n (v): v is string => typeof v === 'string' && v.length > 0,\n ),\n )\n for (const alias of aliases) {\n if (Object.prototype.hasOwnProperty.call(payloadObj, alias)) delete payloadObj[alias]\n }\n const finalKey = columnName || toSnakeCase(propKey)\n payloadObj[finalKey] = value\n }\n for (const key of Object.keys(updates)) {\n ensureColumnKey(key, updates[key])\n }\n } catch (err) {\n debug('\u26A0\uFE0F subscriber.payload.normalize.error', {\n entityId,\n message: (err as Error)?.message ?? String(err),\n })\n }\n }\n }\n\n async decryptEntityGraph(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getMetadata?: () => any; getComparator?: () => any },\n opts: { syncOriginal?: boolean; seen?: WeakSet<object>; fallbackScope?: Scope } = {},\n ) {\n await this.decrypt(target, meta, em, opts)\n }\n\n private async decrypt(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getMetadata?: () => any; getComparator?: () => any },\n {\n syncOriginal = false,\n seen,\n fallbackScope,\n }: { syncOriginal?: boolean; seen?: WeakSet<object>; fallbackScope?: Scope } = {},\n ) {\n const visited = seen ?? new WeakSet<object>()\n if (visited.has(target as object)) return\n visited.add(target as object)\n if (!isTenantDataEncryptionEnabled() || !this.service.isEnabled()) {\n debug('\u26AA\uFE0F subscriber.skip', { reason: 'disabled', entity: meta?.className || meta?.name })\n return\n }\n const resolvedMeta = this.resolveMeta(meta, target, em)\n const entityId = this.resolveEntityId(resolvedMeta)\n if (!entityId) return\n const { tenantId, organizationId } = resolveScope(target)\n const scopedTenantId = tenantId ?? fallbackScope?.tenantId ?? null\n const scopedOrgId = organizationId ?? fallbackScope?.organizationId ?? null\n // Capture pending (un-flushed) changes BEFORE decrypt mutates the target. Re-baselining a\n // managed entity that a command already mutated would clear its dirty changeset and silently\n // drop the pending write (e.g. an undo handler that mutates an entity, then loads a related\n // encrypted entity whose deep-decrypt recurses back into the still-dirty entity before flush).\n const hadPendingChanges = syncOriginal ? this.hasPendingChanges(target, resolvedMeta, em as any) : false\n const decrypted = await this.service.decryptEntityPayload(entityId, target, scopedTenantId, scopedOrgId)\n Object.assign(target, decrypted)\n this.restoreDecryptedJsonColumns(target, resolvedMeta)\n if (syncOriginal && !hadPendingChanges) {\n this.syncOriginalEntityData(target, resolvedMeta, em as any)\n }\n const nextFallback =\n fallbackScope ??\n (tenantId || organizationId\n ? { tenantId: tenantId ?? null, organizationId: organizationId ?? null }\n : { tenantId: scopedTenantId, organizationId: scopedOrgId })\n // Best-effort deep decrypt for loaded relations so populated graphs get cleaned too.\n try {\n const extractEntities = (value: any): any[] => {\n if (!value) return []\n // MikroORM Collection wrapper \u2014 MUST be checked before the Reference branch: both wrappers\n // expose isInitialized(), but only a Collection exposes getItems(). Matching the Reference\n // branch first returned the Collection wrapper itself instead of its items, so collection\n // relations were never deep-decrypted and leaked ciphertext (issue #2744).\n if (typeof value === 'object' && typeof (value as any).isInitialized === 'function' && typeof (value as any).getItems === 'function') {\n try {\n return (value as any).isInitialized() ? (value as any).getItems() ?? [] : []\n } catch {\n return []\n }\n }\n // MikroORM Reference wrapper\n if (typeof value === 'object' && typeof (value as any).isInitialized === 'function') {\n try {\n if ((value as any).isInitialized()) {\n const unwrapped = typeof (value as any).unwrap === 'function' ? (value as any).unwrap() : (value as any).__entity ?? (value as any)\n if (unwrapped && typeof unwrapped === 'object') return [unwrapped]\n }\n } catch {\n // ignore\n }\n return []\n }\n if (Array.isArray(value)) return value\n if (typeof value === 'object') return [value]\n return []\n }\n const props = resolvedMeta?.properties ? Object.values(resolvedMeta.properties) : []\n for (const prop of props) {\n const kind = (prop as any)?.kind\n const name = (prop as any)?.name\n if (typeof name !== 'string' || !name.length) continue\n const value = (target as any)[name]\n if (!value) continue\n // Single-valued relation\n if ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(kind)) {\n const nestedEntities = extractEntities(value)\n for (const nested of nestedEntities) {\n const nestedMeta = this.resolveMeta((nested as any).__meta ?? (nested as any).__helper?.__meta, nested, em)\n await this.decrypt(nested as Record<string, unknown>, nestedMeta, em, {\n syncOriginal: true,\n seen: visited,\n fallbackScope: nextFallback,\n })\n }\n continue\n }\n // Collections\n if ([ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes(kind)) {\n const items = extractEntities(value)\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n const nestedMeta = this.resolveMeta((item as any).__meta ?? (item as any).__helper?.__meta, item, em)\n await this.decrypt(item as Record<string, unknown>, nestedMeta, em, {\n syncOriginal: true,\n seen: visited,\n fallbackScope: nextFallback,\n })\n }\n }\n }\n } catch (err) {\n debug('\u26A0\uFE0F subscriber.deep_decrypt.error', {\n entityId,\n message: (err as Error)?.message ?? String(err),\n })\n }\n }\n\n async beforeCreate(args: EventArgs<any>) {\n await this.encrypt(args.entity as Record<string, unknown>, args.meta, args.em, args.changeSet as any)\n }\n\n async beforeUpdate(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em)\n await this.encrypt(args.entity as Record<string, unknown>, args.meta, args.em, args.changeSet as any)\n }\n\n async afterCreate(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n\n async afterUpdate(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n\n async afterUpsert(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n\n async onLoad(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n\n async afterFind(args: EventArgs<any> & { entities?: unknown[] }) {\n const entities = Array.isArray(args.entities) ? args.entities : []\n for (const entity of entities) {\n await this.decrypt(entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n }\n}\n\nexport function registerTenantEncryptionSubscriber(\n em: { getEventManager?: () => { registerSubscriber?: (subscriber: EventSubscriber<any>) => void } } | null | undefined,\n service: TenantDataEncryptionService,\n): void {\n const eventManager = em?.getEventManager?.()\n if (!eventManager || typeof eventManager.registerSubscriber !== 'function') return\n if (registeredEventManagers.has(eventManager)) return\n eventManager.registerSubscriber(new TenantEncryptionSubscriber(service))\n registeredEventManagers.add(eventManager)\n}\n\nexport async function decryptEntitiesWithFallbackScope(\n targets: unknown | unknown[],\n {\n em,\n tenantId,\n organizationId,\n encryptionService,\n }: {\n em: { getMetadata?: () => any; getComparator?: () => any }\n tenantId?: string | null\n organizationId?: string | null\n encryptionService?: TenantDataEncryptionService | null\n },\n): Promise<void> {\n if (!isTenantDataEncryptionEnabled()) return\n const list = Array.isArray(targets) ? targets : [targets]\n if (!list.length) return\n const service = encryptionService ?? resolveTenantEncryptionService(em as any)\n if (!service || !service.isEnabled()) return\n const subscriber = getSubscriberForService(service)\n const fallback: Scope | undefined =\n tenantId || organizationId\n ? {\n tenantId: tenantId ?? null,\n organizationId: organizationId ?? null,\n }\n : undefined\n for (const entity of list) {\n if (!entity || typeof entity !== 'object') continue\n const meta = (entity as any).__meta ?? (entity as any).__helper?.__meta\n await subscriber.decryptEntityGraph(entity as Record<string, unknown>, meta, em as any, {\n syncOriginal: true,\n fallbackScope: fallback,\n })\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { EntityMetadata, EventArgs, EventSubscriber } from '@mikro-orm/core'\nimport { ReferenceKind } from '@mikro-orm/core'\nimport { resolveEntityIdFromMetadata } from './entityIds'\nimport { TenantDataEncryptionService, parseDecryptedFieldValue } from './tenantDataEncryptionService'\nimport { isTenantDataEncryptionEnabled } from './toggles'\nimport { isEncryptionDebugEnabled } from './toggles'\nimport { resolveTenantEncryptionService } from './customFieldValues'\nimport { createLogger } from '../logger'\nimport { listEntityMetadataFromRegistry } from '../db/entityMetadata'\n\nconst logger = createLogger('shared').child({ component: 'encryption' })\n\ntype Scoped = {\n tenantId?: string | null\n tenant_id?: string | null\n tenant?: { id?: string | null } | null\n organizationId?: string | null\n organization_id?: string | null\n organization?: { id?: string | null } | null\n}\n\ntype Scope = { tenantId: string | null; organizationId: string | null }\n\nfunction resolveScope(entity: Scoped): Scope {\n const tenantId = entity.tenantId ?? entity.tenant_id ?? entity.tenant?.id ?? null\n const organizationId = entity.organizationId ?? entity.organization_id ?? entity.organization?.id ?? null\n return {\n tenantId: tenantId ? String(tenantId) : null,\n organizationId: organizationId ? String(organizationId) : null,\n }\n}\n\nfunction debug(event: string, payload: Record<string, unknown>) {\n if (!isEncryptionDebugEnabled()) return\n try {\n logger.debug(event, payload)\n } catch {\n // ignore\n }\n}\n\nfunction isJsonColumnProperty(prop: unknown): boolean {\n if (!prop || typeof prop !== 'object') return false\n const candidate = prop as Record<string, unknown>\n const type = typeof candidate.type === 'string' ? candidate.type.toLowerCase() : ''\n if (type === 'json' || type === 'jsonb') return true\n const columnTypes = Array.isArray(candidate.columnTypes) ? candidate.columnTypes : []\n if (columnTypes.some((value) => typeof value === 'string' && value.toLowerCase().includes('json'))) return true\n const customTypeName = (candidate.customType as { constructor?: { name?: string } } | undefined)?.constructor?.name\n return typeof customTypeName === 'string' && customTypeName.toLowerCase().includes('json')\n}\n\n// Encryption is configured on but the service reports disabled \u2014 the KMS is\n// unreachable, so this write lands as plaintext. Throttle the warning so a long\n// outage does not flood the log while still leaving an ongoing signal that the\n// fail-open window is open (#5948).\nconst ENCRYPTION_PAUSED_WARN_INTERVAL_MS = 60_000\nlet lastEncryptionPausedWarnAt = 0\n\nfunction warnEncryptionPaused(entity: string | undefined): void {\n const now = Date.now()\n if (lastEncryptionPausedWarnAt && now - lastEncryptionPausedWarnAt < ENCRYPTION_PAUSED_WARN_INTERVAL_MS) return\n lastEncryptionPausedWarnAt = now\n try {\n logger.warn(\n 'Tenant data encryption is enabled but the KMS is unavailable - entity writes persist as plaintext until it recovers',\n { entity },\n )\n } catch {\n // ignore\n }\n}\n\nexport function resetEncryptionPausedWarnThrottle(): void {\n lastEncryptionPausedWarnAt = 0\n}\n\nconst registeredEventManagers = new WeakSet<object>()\n\nconst subscribersByService = new WeakMap<TenantDataEncryptionService, TenantEncryptionSubscriber>()\n\nfunction getSubscriberForService(service: TenantDataEncryptionService): TenantEncryptionSubscriber {\n const existing = subscribersByService.get(service)\n if (existing) return existing\n const subscriber = new TenantEncryptionSubscriber(service)\n subscribersByService.set(service, subscriber)\n return subscriber\n}\n\nconst toSnakeCase = (value: string): string =>\n value.replace(/([A-Z])/g, '_$1').replace(/__/g, '_').toLowerCase()\n\nexport class TenantEncryptionSubscriber implements EventSubscriber<any> {\n constructor(private readonly service: TenantDataEncryptionService) {}\n\n getSubscribedEntities() {\n return [] // listen to all entities\n }\n\n private resolveMeta(\n meta: EntityMetadata<any> | undefined,\n entity: Record<string, unknown>,\n em?: { getMetadata?: () => any },\n ): EntityMetadata<any> | undefined {\n if (meta) return meta\n const ctor = (entity as any)?.constructor\n const name = ctor?.name\n const registry = em?.getMetadata?.()\n if (!registry || !name) return meta\n try { return registry.find?.(name) } catch {}\n try { return registry.find?.(ctor) } catch {}\n try { return registry.get?.(name) } catch {}\n try { return registry.get?.(ctor) } catch {}\n try {\n const entries = listEntityMetadataFromRegistry(registry)\n const match = entries.find(\n (m: any) =>\n m?.className === name ||\n m?.name === name ||\n m?.entityName === name ||\n m?.collection === ctor?.prototype?.__meta?.tableName ||\n m?.tableName === ctor?.prototype?.__meta?.tableName,\n )\n if (match) return match as EntityMetadata<any>\n } catch {\n // best-effort\n }\n return meta\n }\n\n private resolveEntityId(meta: EntityMetadata<any> | undefined): string | null {\n try {\n return resolveEntityIdFromMetadata(meta)\n } catch {\n return null\n }\n }\n\n private restoreDecryptedJsonColumns(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n ) {\n const properties = meta?.properties\n if (!properties || typeof properties !== 'object') return\n for (const [propertyName, prop] of Object.entries(properties)) {\n if (!isJsonColumnProperty(prop)) continue\n const value = target[propertyName]\n if (typeof value !== 'string') continue\n const parsed = parseDecryptedFieldValue(value)\n if (parsed !== value) target[propertyName] = parsed\n }\n }\n\n private syncOriginalEntityData(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getComparator?: () => any },\n ) {\n const helper = (target as any)?.__helper\n if (!helper || typeof helper !== 'object') return\n\n // Prefer MikroORM comparator snapshot so change detection uses the expected shape.\n try {\n const comparator = em?.getComparator?.()\n if (comparator?.prepareEntity) {\n helper.__originalEntityData = comparator.prepareEntity(target)\n helper.__touched = false\n return\n }\n } catch (err) {\n debug('\u26AA\uFE0F subscriber.sync_original.comparator_failed', {\n entity: meta?.className || meta?.name,\n message: (err as Error)?.message ?? String(err),\n })\n }\n\n // Fallback: shallow snapshot of scalar/owner props to keep entities clean without comparator.\n const properties = meta?.properties ? Object.values(meta.properties) : []\n if (properties.length === 0) return\n const snapshot: Record<string, unknown> = { ...(helper.__originalEntityData ?? {}) }\n for (const prop of properties) {\n if ([ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes((prop as any).kind)) continue\n const name = (prop as any).name\n if (typeof name !== 'string' || !name.length) continue\n snapshot[name] = (target as Record<string, unknown>)[name]\n }\n helper.__originalEntityData = snapshot\n helper.__touched = false\n }\n\n /**\n * Reports whether a managed entity currently carries un-flushed changes relative to its load\n * baseline, using MikroORM's own comparator so the verdict matches the change-set computer that\n * runs at flush time. Used to avoid re-baselining (and thereby discarding) pending writes when a\n * decrypt pass traverses back into an entity a command already mutated.\n */\n private hasPendingChanges(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getComparator?: () => any },\n ): boolean {\n const helper = (target as any)?.__helper\n if (!helper || typeof helper !== 'object') return false\n const original = helper.__originalEntityData\n if (!original) return false\n const entityName = meta?.className || meta?.name\n try {\n const comparator = em?.getComparator?.()\n if (entityName && comparator?.prepareEntity) {\n const current = comparator.prepareEntity(target)\n if (typeof comparator.matching === 'function') {\n return !comparator.matching(entityName, original, current)\n }\n if (typeof comparator.diffEntities === 'function') {\n const diff = comparator.diffEntities(entityName, original, current)\n return !!diff && Object.keys(diff).length > 0\n }\n }\n } catch (err) {\n debug('\u26AA\uFE0F subscriber.pending_changes.compare_failed', {\n entity: entityName,\n message: (err as Error)?.message ?? String(err),\n })\n }\n return helper.__touched === true\n }\n\n private async encrypt(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getMetadata?: () => any; getComparator?: () => any },\n changeSet?: { payload?: Record<string, unknown> },\n ) {\n const encryptionConfigured = isTenantDataEncryptionEnabled()\n if (!encryptionConfigured || !this.service.isEnabled()) {\n debug('\u26AA\uFE0F subscriber.skip', { reason: 'disabled', entity: meta?.className || meta?.name })\n if (encryptionConfigured) warnEncryptionPaused(meta?.className || meta?.name)\n return\n }\n const resolvedMeta = this.resolveMeta(meta, target, em)\n const entityId = this.resolveEntityId(resolvedMeta)\n if (!entityId) {\n debug('\u26A0\uFE0F subscriber.decrypt.skip.entity_id_missing', {\n metaName: resolvedMeta?.className || resolvedMeta?.name,\n table: (resolvedMeta as any)?.tableName,\n })\n return\n }\n const { tenantId, organizationId } = resolveScope(target)\n const encrypted = await this.service.encryptEntityPayload(entityId, target, tenantId, organizationId)\n const metaProps: Record<string, unknown> = resolvedMeta?.properties && typeof resolvedMeta.properties === 'object'\n ? resolvedMeta.properties\n : {}\n const payloadObj: Record<string, unknown> | null =\n changeSet && typeof changeSet === 'object'\n ? (typeof changeSet.payload === 'object' && changeSet.payload\n ? (changeSet.payload as Record<string, unknown>)\n : ((changeSet.payload = {}) as Record<string, unknown>))\n : null\n const updates: Record<string, unknown> = {}\n const columnNameFor = (propKey: string, prop: Record<string, unknown> | undefined): string => {\n try {\n if (prop && typeof prop === 'object') {\n const explicit = (prop as any)?.fieldName\n if (typeof explicit === 'string' && explicit.length) return explicit\n const name = (prop as any)?.name\n if (typeof name === 'string' && name.length) return name\n }\n } catch (err) {\n debug('\u26A0\uFE0F subscriber.column_name.resolve', {\n entityId,\n propKey,\n message: (err as Error)?.message ?? String(err),\n })\n }\n return toSnakeCase(propKey)\n }\n\n for (const [key, value] of Object.entries(encrypted)) {\n const prop = (metaProps as Record<string, any>)[key]\n if (!prop || typeof prop !== 'object') continue\n if ((target as Record<string, unknown>)[key] === value) continue\n updates[key] = value\n }\n if (Object.keys(updates).length === 0) return\n Object.assign(target, updates)\n if (payloadObj) {\n try {\n const ensureColumnKey = (propKey: string, value: unknown) => {\n const columnName = columnNameFor(propKey, (metaProps as Record<string, any>)[propKey])\n const canonicalKey = columnName || toSnakeCase(propKey)\n const aliases = new Set(\n [propKey, toSnakeCase(propKey), columnName, columnName ? toSnakeCase(columnName) : undefined].filter(\n (v): v is string => typeof v === 'string' && v.length > 0,\n ),\n )\n for (const alias of aliases) {\n if (Object.prototype.hasOwnProperty.call(payloadObj, alias)) delete payloadObj[alias]\n }\n const finalKey = columnName || toSnakeCase(propKey)\n payloadObj[finalKey] = value\n }\n for (const key of Object.keys(updates)) {\n ensureColumnKey(key, updates[key])\n }\n } catch (err) {\n debug('\u26A0\uFE0F subscriber.payload.normalize.error', {\n entityId,\n message: (err as Error)?.message ?? String(err),\n })\n }\n }\n }\n\n async decryptEntityGraph(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getMetadata?: () => any; getComparator?: () => any },\n opts: { syncOriginal?: boolean; seen?: WeakSet<object>; fallbackScope?: Scope } = {},\n ) {\n await this.decrypt(target, meta, em, opts)\n }\n\n private async decrypt(\n target: Record<string, unknown>,\n meta: EntityMetadata<any> | undefined,\n em?: { getMetadata?: () => any; getComparator?: () => any },\n {\n syncOriginal = false,\n seen,\n fallbackScope,\n }: { syncOriginal?: boolean; seen?: WeakSet<object>; fallbackScope?: Scope } = {},\n ) {\n const visited = seen ?? new WeakSet<object>()\n if (visited.has(target as object)) return\n visited.add(target as object)\n if (!isTenantDataEncryptionEnabled() || !this.service.isEnabled()) {\n debug('\u26AA\uFE0F subscriber.skip', { reason: 'disabled', entity: meta?.className || meta?.name })\n return\n }\n const resolvedMeta = this.resolveMeta(meta, target, em)\n const entityId = this.resolveEntityId(resolvedMeta)\n if (!entityId) return\n const { tenantId, organizationId } = resolveScope(target)\n const scopedTenantId = tenantId ?? fallbackScope?.tenantId ?? null\n const scopedOrgId = organizationId ?? fallbackScope?.organizationId ?? null\n // Capture pending (un-flushed) changes BEFORE decrypt mutates the target. Re-baselining a\n // managed entity that a command already mutated would clear its dirty changeset and silently\n // drop the pending write (e.g. an undo handler that mutates an entity, then loads a related\n // encrypted entity whose deep-decrypt recurses back into the still-dirty entity before flush).\n const hadPendingChanges = syncOriginal ? this.hasPendingChanges(target, resolvedMeta, em as any) : false\n const decrypted = await this.service.decryptEntityPayload(entityId, target, scopedTenantId, scopedOrgId)\n Object.assign(target, decrypted)\n this.restoreDecryptedJsonColumns(target, resolvedMeta)\n if (syncOriginal && !hadPendingChanges) {\n this.syncOriginalEntityData(target, resolvedMeta, em as any)\n }\n const nextFallback =\n fallbackScope ??\n (tenantId || organizationId\n ? { tenantId: tenantId ?? null, organizationId: organizationId ?? null }\n : { tenantId: scopedTenantId, organizationId: scopedOrgId })\n // Best-effort deep decrypt for loaded relations so populated graphs get cleaned too.\n try {\n const extractEntities = (value: any): any[] => {\n if (!value) return []\n // MikroORM Collection wrapper \u2014 MUST be checked before the Reference branch: both wrappers\n // expose isInitialized(), but only a Collection exposes getItems(). Matching the Reference\n // branch first returned the Collection wrapper itself instead of its items, so collection\n // relations were never deep-decrypted and leaked ciphertext (issue #2744).\n if (typeof value === 'object' && typeof (value as any).isInitialized === 'function' && typeof (value as any).getItems === 'function') {\n try {\n return (value as any).isInitialized() ? (value as any).getItems() ?? [] : []\n } catch {\n return []\n }\n }\n // MikroORM Reference wrapper\n if (typeof value === 'object' && typeof (value as any).isInitialized === 'function') {\n try {\n if ((value as any).isInitialized()) {\n const unwrapped = typeof (value as any).unwrap === 'function' ? (value as any).unwrap() : (value as any).__entity ?? (value as any)\n if (unwrapped && typeof unwrapped === 'object') return [unwrapped]\n }\n } catch {\n // ignore\n }\n return []\n }\n if (Array.isArray(value)) return value\n if (typeof value === 'object') return [value]\n return []\n }\n const props = resolvedMeta?.properties ? Object.values(resolvedMeta.properties) : []\n for (const prop of props) {\n const kind = (prop as any)?.kind\n const name = (prop as any)?.name\n if (typeof name !== 'string' || !name.length) continue\n const value = (target as any)[name]\n if (!value) continue\n // Single-valued relation\n if ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(kind)) {\n const nestedEntities = extractEntities(value)\n for (const nested of nestedEntities) {\n const nestedMeta = this.resolveMeta((nested as any).__meta ?? (nested as any).__helper?.__meta, nested, em)\n await this.decrypt(nested as Record<string, unknown>, nestedMeta, em, {\n syncOriginal: true,\n seen: visited,\n fallbackScope: nextFallback,\n })\n }\n continue\n }\n // Collections\n if ([ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes(kind)) {\n const items = extractEntities(value)\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n const nestedMeta = this.resolveMeta((item as any).__meta ?? (item as any).__helper?.__meta, item, em)\n await this.decrypt(item as Record<string, unknown>, nestedMeta, em, {\n syncOriginal: true,\n seen: visited,\n fallbackScope: nextFallback,\n })\n }\n }\n }\n } catch (err) {\n debug('\u26A0\uFE0F subscriber.deep_decrypt.error', {\n entityId,\n message: (err as Error)?.message ?? String(err),\n })\n }\n }\n\n async beforeCreate(args: EventArgs<any>) {\n await this.encrypt(args.entity as Record<string, unknown>, args.meta, args.em, args.changeSet as any)\n }\n\n async beforeUpdate(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em)\n await this.encrypt(args.entity as Record<string, unknown>, args.meta, args.em, args.changeSet as any)\n }\n\n async afterCreate(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n\n async afterUpdate(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n\n async afterUpsert(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n\n async onLoad(args: EventArgs<any>) {\n await this.decrypt(args.entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n\n async afterFind(args: EventArgs<any> & { entities?: unknown[] }) {\n const entities = Array.isArray(args.entities) ? args.entities : []\n for (const entity of entities) {\n await this.decrypt(entity as Record<string, unknown>, args.meta, args.em, { syncOriginal: true })\n }\n }\n}\n\nexport function registerTenantEncryptionSubscriber(\n em: { getEventManager?: () => { registerSubscriber?: (subscriber: EventSubscriber<any>) => void } } | null | undefined,\n service: TenantDataEncryptionService,\n): void {\n const eventManager = em?.getEventManager?.()\n if (!eventManager || typeof eventManager.registerSubscriber !== 'function') return\n if (registeredEventManagers.has(eventManager)) return\n eventManager.registerSubscriber(new TenantEncryptionSubscriber(service))\n registeredEventManagers.add(eventManager)\n}\n\nexport async function decryptEntitiesWithFallbackScope(\n targets: unknown | unknown[],\n {\n em,\n tenantId,\n organizationId,\n encryptionService,\n }: {\n em: { getMetadata?: () => any; getComparator?: () => any }\n tenantId?: string | null\n organizationId?: string | null\n encryptionService?: TenantDataEncryptionService | null\n },\n): Promise<void> {\n if (!isTenantDataEncryptionEnabled()) return\n const list = Array.isArray(targets) ? targets : [targets]\n if (!list.length) return\n const service = encryptionService ?? resolveTenantEncryptionService(em as any)\n if (!service || !service.isEnabled()) return\n const subscriber = getSubscriberForService(service)\n const fallback: Scope | undefined =\n tenantId || organizationId\n ? {\n tenantId: tenantId ?? null,\n organizationId: organizationId ?? null,\n }\n : undefined\n for (const entity of list) {\n if (!entity || typeof entity !== 'object') continue\n const meta = (entity as any).__meta ?? (entity as any).__helper?.__meta\n await subscriber.decryptEntityGraph(entity as Record<string, unknown>, meta, em as any, {\n syncOriginal: true,\n fallbackScope: fallback,\n })\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -693,7 +693,7 @@ function buildResponses(method, responses, errors, metadata) {
693
693
  ...isNoContent ? {} : {
694
694
  content: {
695
695
  [mediaType]: {
696
- schema: schema ?? { type: "object" },
696
+ schema: schema ?? { type: "object", description: "Schema not declared" },
697
697
  ...example !== void 0 ? { example } : {}
698
698
  }
699
699
  }
@@ -1203,6 +1203,7 @@ function generateMarkdownFromOpenApi(doc) {
1203
1203
  }
1204
1204
  export {
1205
1205
  buildOpenApiDocument,
1206
- generateMarkdownFromOpenApi
1206
+ generateMarkdownFromOpenApi,
1207
+ zodToJsonSchema
1207
1208
  };
1208
1209
  //# sourceMappingURL=generator.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/openapi/generator.ts"],
4
- "sourcesContent": ["import { z, type ZodTypeAny } from 'zod'\nimport type { Module, ModuleApi, ModuleApiLegacy, ModuleApiRouteFile, HttpMethod } from '@open-mercato/shared/modules/registry'\nimport type {\n OpenApiDocument,\n OpenApiDocumentOptions,\n OpenApiMethodDoc,\n OpenApiRequestBodyDoc,\n OpenApiResponseDoc,\n OpenApiRouteDoc,\n} from './types'\n\ntype PathParamInfo = {\n name: string\n catchAll?: boolean\n optional?: boolean\n}\n\ntype ParameterLocation = 'query' | 'path' | 'header'\n\ntype JsonSchema = Record<string, unknown>\n\ntype SchemaConversionContext = {\n memo: WeakMap<ZodTypeAny, JsonSchema>\n}\n\ntype ExampleGenerationContext = {\n stack: WeakSet<ZodTypeAny>\n}\n\ntype ExampleMap = {\n query?: unknown\n body?: unknown\n path?: Record<string, unknown>\n headers?: Record<string, unknown>\n}\n\nconst HTTP_METHODS: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n\nfunction resolveType(def: any): string | undefined {\n if (!def) return undefined\n if (typeof def.typeName === 'string' && def.typeName.length) return def.typeName\n if (typeof def.type === 'string' && def.type.length) return def.type\n return undefined\n}\n\nfunction getShape(def: any): Record<string, ZodTypeAny> {\n if (!def) return {}\n const shape = typeof def.shape === 'function' ? def.shape() : def.shape\n if (shape && typeof shape === 'object') return shape as Record<string, ZodTypeAny>\n return {}\n}\n\nfunction normalizeChecks(checks: any[] | undefined): Array<{ kind?: string; value?: unknown; extra?: Record<string, unknown> }> {\n if (!Array.isArray(checks)) return []\n return checks.map((check) => {\n if (!check) return {}\n const base = (check as any)?._zod?.def ?? (check as any)?.def ?? check\n const kind = typeof (check as any)?.kind === 'string'\n ? (check as any).kind\n : typeof base?.check === 'string'\n ? base.check\n : undefined\n const value =\n base?.value ??\n base?.minimum ??\n base?.maximum ??\n base?.exact ??\n base?.length ??\n base?.limit ??\n base?.includes ??\n base?.min ??\n base?.max\n return { kind, value, extra: base && typeof base === 'object' ? base : undefined }\n })\n}\n\nconst DEFAULT_EXAMPLE_VALUES = {\n string: 'string',\n number: 1,\n integer: 1,\n boolean: true,\n uuid: '00000000-0000-4000-8000-000000000000',\n email: 'user@example.com',\n url: 'https://example.com/resource',\n datetime: new Date('2025-01-01T00:00:00.000Z').toISOString(),\n}\n\nfunction toTitle(str: string): string {\n if (!str) return ''\n return str\n .split(/[_\\-\\s]+/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ')\n}\n\nfunction normalizePath(path: string): { path: string; params: PathParamInfo[] } {\n const segments = path.split('/').filter((seg) => seg.length > 0)\n const params: PathParamInfo[] = []\n const normalized = segments\n .map((seg) => {\n const catchAll = seg.match(/^\\[\\.\\.\\.(.+)\\]$/)\n if (catchAll) {\n params.push({ name: catchAll[1], catchAll: true })\n return `{${catchAll[1]}}`\n }\n const optCatchAll = seg.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/)\n if (optCatchAll) {\n params.push({ name: optCatchAll[1], catchAll: true, optional: true })\n return `{${optCatchAll[1]}}`\n }\n const dyn = seg.match(/^\\[(.+)\\]$/)\n if (dyn) {\n params.push({ name: dyn[1] })\n return `{${dyn[1]}}`\n }\n return seg\n })\n .join('/')\n return { path: '/' + normalized, params }\n}\n\nfunction unwrap(schema?: ZodTypeAny): {\n schema: ZodTypeAny | undefined\n optional: boolean\n nullable: boolean\n defaultValue?: unknown\n} {\n if (!schema) {\n return { schema: undefined, optional: true, nullable: false }\n }\n\n let current: ZodTypeAny = schema\n let optional = false\n let nullable = false\n let defaultValue: unknown\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const def = (current as any)?._def\n if (!def) {\n return { schema: current, optional, nullable, defaultValue }\n }\n const typeName = resolveType(def)\n if (typeName === 'ZodOptional' || typeName === 'optional') {\n optional = true\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodNullable' || typeName === 'nullable') {\n nullable = true\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodDefault' || typeName === 'default') {\n optional = true\n const rawDefault = (current as any)._def.defaultValue\n defaultValue = typeof rawDefault === 'function' ? rawDefault() : rawDefault\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodPipeline' || typeName === 'pipe') {\n current = (current as any)._def.out ?? (current as any)._def.innerType ?? (current as any)._def.schema\n continue\n }\n if (typeName === 'transformer') {\n current = (current as any)._def.output\n continue\n }\n if (typeName === 'ZodLazy' || typeName === 'lazy') {\n const getter = (current as any)._def.getter\n current = typeof getter === 'function' ? getter() : current\n if (current === schema) break\n continue\n }\n if (typeName === 'ZodPromise' || typeName === 'promise') {\n current = (current as any)._def.type\n continue\n }\n if (typeName === 'ZodCatch' || typeName === 'catch') {\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodReadonly' || typeName === 'readonly') {\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodBranded' || typeName === 'branded') {\n current = (current as any)._def.type\n continue\n }\n break\n }\n return { schema: current, optional, nullable, defaultValue }\n}\n\n/**\n * Extract the description from a zod schema, walking through wrappers like optional/nullable/default.\n * Returns the first description found, or undefined if none exists.\n */\nfunction extractZodDescription(schema?: ZodTypeAny): string | undefined {\n if (!schema) return undefined\n\n let current: ZodTypeAny | undefined = schema\n while (current) {\n // In Zod 4/zod-mini, description is stored directly on the schema object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const directDescription = (current as any).description\n if (typeof directDescription === 'string' && directDescription.length > 0) {\n return directDescription\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const def = (current as any)?._def as Record<string, unknown> | undefined\n if (!def) return undefined\n\n // Also check _def.description for Zod 3 compatibility\n if (typeof def.description === 'string' && def.description.length > 0) {\n return def.description\n }\n\n // Walk through wrappers to find description on inner types\n const typeName = resolveType(def)\n if (\n typeName === 'ZodOptional' || typeName === 'optional' ||\n typeName === 'ZodNullable' || typeName === 'nullable' ||\n typeName === 'ZodDefault' || typeName === 'default' ||\n typeName === 'ZodCatch' || typeName === 'catch' ||\n typeName === 'ZodReadonly' || typeName === 'readonly'\n ) {\n current = def.innerType as ZodTypeAny | undefined\n continue\n }\n if (typeName === 'ZodBranded' || typeName === 'branded') {\n current = def.type as ZodTypeAny | undefined\n continue\n }\n if (typeName === 'ZodPipeline' || typeName === 'pipe') {\n current = (def.out ?? def.innerType ?? def.schema) as ZodTypeAny | undefined\n continue\n }\n if (typeName === 'transformer') {\n current = def.output as ZodTypeAny | undefined\n continue\n }\n if (typeName === 'ZodLazy' || typeName === 'lazy') {\n const getter = def.getter\n const next = typeof getter === 'function' ? (getter as () => ZodTypeAny)() : current\n if (next === current) break\n current = next\n continue\n }\n if (typeName === 'ZodPromise' || typeName === 'promise') {\n current = def.type as ZodTypeAny | undefined\n continue\n }\n // No more wrappers to unwrap\n break\n }\n return undefined\n}\n\nfunction zodToJsonSchema(schema?: ZodTypeAny, ctx?: SchemaConversionContext): JsonSchema | undefined {\n if (!schema) return undefined\n const context: SchemaConversionContext = ctx ?? { memo: new WeakMap<ZodTypeAny, JsonSchema>() }\n\n const cached = context.memo.get(schema)\n if (cached) return cached\n\n const placeholder: JsonSchema = {}\n context.memo.set(schema, placeholder)\n\n const { schema: inner, nullable } = unwrap(schema)\n if (!inner) {\n if (nullable) placeholder.nullable = true\n return placeholder\n }\n\n if (inner !== schema && typeof inner === 'object') {\n if (!context.memo.has(inner as ZodTypeAny)) {\n context.memo.set(inner as ZodTypeAny, placeholder)\n }\n }\n\n const def = (inner as any)._def\n if (!def) return placeholder\n const typeName = resolveType(def) as string | undefined\n\n const result = placeholder\n\n switch (typeName) {\n case 'ZodString':\n case 'string': {\n result.type = 'string'\n const checks = normalizeChecks(def.checks)\n for (const check of checks) {\n if (!check.kind) continue\n if (check.kind === 'uuid' || check.extra?.format === 'uuid') {\n result.format = 'uuid'\n } else if (check.kind === 'email' || check.extra?.format === 'email') {\n result.format = 'email'\n } else if (check.kind === 'url' || check.extra?.format === 'uri' || check.extra?.format === 'url') {\n result.format = 'uri'\n } else if (check.kind === 'regex' && check.extra?.pattern instanceof RegExp) {\n result.pattern = check.extra.pattern.source\n } else if (check.kind === 'string_format' && typeof check.extra?.format === 'string') {\n if (check.extra.format === 'regex' && check.extra.pattern != null) {\n result.pattern = check.extra.pattern instanceof RegExp\n ? check.extra.pattern.source\n : String(check.extra.pattern)\n } else {\n result.format = check.extra.format\n }\n } else if (check.kind === 'datetime' || check.extra?.format === 'date-time') {\n result.format = 'date-time'\n } else if (['length', 'len', 'exact_length'].includes(check.kind ?? '')) {\n if (typeof check.value === 'number') {\n result.minLength = check.value\n result.maxLength = check.value\n }\n } else if (check.kind === 'min' || check.kind === 'min_length') {\n if (typeof check.value === 'number') result.minLength = check.value\n } else if (check.kind === 'max' || check.kind === 'max_length') {\n if (typeof check.value === 'number') result.maxLength = check.value\n }\n }\n break\n }\n case 'ZodNumber':\n case 'number': {\n result.type = 'number'\n const checks = normalizeChecks(def.checks)\n for (const check of checks) {\n if (!check.kind) continue\n if (check.kind === 'int' || check.kind === 'isInteger') result.type = 'integer'\n if ((check.kind === 'min' || check.kind === 'gte') && typeof check.value === 'number') result.minimum = check.value\n if ((check.kind === 'max' || check.kind === 'lte') && typeof check.value === 'number') result.maximum = check.value\n if (check.kind === 'multipleOf' && typeof check.value === 'number') result.multipleOf = check.value\n }\n break\n }\n case 'ZodBigInt':\n case 'bigint':\n result.type = 'integer'\n result.format = 'int64'\n break\n case 'ZodBoolean':\n case 'boolean':\n result.type = 'boolean'\n break\n case 'ZodLiteral':\n case 'literal': {\n const value = def.value ?? (Array.isArray(def.values) ? def.values[0] : undefined)\n result.type = typeof value\n result.enum = [value]\n break\n }\n case 'ZodEnum':\n case 'enum': {\n const entries = def.values ?? def.entries\n const values = Array.isArray(entries) ? entries : entries ? Object.values(entries) : []\n const enumerators = values.filter((v: unknown) => typeof v === 'string' || typeof v === 'number')\n const allString = enumerators.every((v: unknown) => typeof v === 'string')\n result.type = allString ? 'string' : 'number'\n result.enum = enumerators\n break\n }\n case 'ZodNativeEnum': {\n const values = Object.values(def.values).filter((v) => typeof v === 'string' || typeof v === 'number')\n const allString = values.every((v) => typeof v === 'string')\n result.type = allString ? 'string' : 'number'\n result.enum = values\n break\n }\n case 'ZodUnion':\n case 'union': {\n const options = def.options || []\n result.oneOf = options.map((option: ZodTypeAny) => zodToJsonSchema(option, context) ?? {})\n break\n }\n case 'ZodIntersection':\n case 'intersection': {\n result.allOf = [\n zodToJsonSchema(def.left, context) ?? {},\n zodToJsonSchema(def.right, context) ?? {},\n ]\n break\n }\n case 'ZodPipeline':\n case 'pipe': {\n const resolved = zodToJsonSchema(def.out ?? def.innerType ?? def.schema, context) ?? {}\n Object.assign(result, resolved)\n break\n }\n case 'ZodLazy':\n case 'lazy': {\n const next = typeof def.getter === 'function' ? def.getter() : undefined\n const resolved = next ? zodToJsonSchema(next, context) : undefined\n if (resolved) Object.assign(result, resolved)\n break\n }\n case 'ZodPromise':\n case 'promise': {\n const resolved = zodToJsonSchema(def.type, context)\n if (resolved) Object.assign(result, resolved)\n break\n }\n case 'ZodCatch':\n case 'catch': {\n const resolved = zodToJsonSchema(def.innerType ?? def.type, context)\n if (resolved) Object.assign(result, resolved)\n break\n }\n case 'ZodReadonly':\n case 'readonly': {\n const resolved = zodToJsonSchema(def.innerType ?? def.type, context)\n if (resolved) Object.assign(result, resolved)\n break\n }\n case 'ZodArray':\n case 'array': {\n const elementSchema =\n def.type && typeof def.type === 'object'\n ? def.type\n : (def.element && typeof def.element === 'object' ? def.element : undefined)\n result.type = 'array'\n result.items = zodToJsonSchema(elementSchema as ZodTypeAny, context) ?? {}\n if (typeof def.minLength === 'number') result.minItems = def.minLength\n if (typeof def.maxLength === 'number') result.maxItems = def.maxLength\n const checks = normalizeChecks(def.checks)\n for (const check of checks) {\n if (check.kind === 'min_length' && typeof check.value === 'number') result.minItems = check.value\n if (check.kind === 'max_length' && typeof check.value === 'number') result.maxItems = check.value\n if (check.kind === 'length' && typeof check.value === 'number') {\n result.minItems = check.value\n result.maxItems = check.value\n }\n }\n break\n }\n case 'ZodTuple':\n case 'tuple': {\n const items = def.items || []\n result.type = 'array'\n result.prefixItems = items.map((item: ZodTypeAny) => zodToJsonSchema(item, context) ?? {})\n result.minItems = items.length\n result.maxItems = items.length\n break\n }\n case 'ZodRecord':\n case 'record': {\n result.type = 'object'\n const valueSchema = def.valueType ?? def.value\n const valueType = valueSchema ? resolveType(valueSchema._def) : undefined\n if (!valueType || valueType === 'ZodUnknown' || valueType === 'unknown' || valueType === 'ZodAny' || valueType === 'any') {\n result.additionalProperties = true\n } else {\n result.additionalProperties = zodToJsonSchema(valueSchema, context) ?? true\n }\n break\n }\n case 'ZodObject':\n case 'object': {\n result.type = 'object'\n const shape = getShape(def)\n const properties: Record<string, JsonSchema> = {}\n const required: string[] = []\n for (const [key, rawSchema] of Object.entries(shape)) {\n const unwrapped = unwrap(rawSchema as ZodTypeAny)\n const childSchema = zodToJsonSchema(unwrapped.schema, context)\n if (!childSchema) continue\n const baseSchema = childSchema\n let propertySchema: JsonSchema = baseSchema\n if (unwrapped.nullable) {\n propertySchema = {\n anyOf: [{ type: 'null' }, propertySchema],\n }\n }\n if (unwrapped.defaultValue !== undefined) {\n if (propertySchema === baseSchema) {\n propertySchema = { allOf: [baseSchema], default: unwrapped.defaultValue }\n } else {\n propertySchema = { ...propertySchema, default: unwrapped.defaultValue }\n }\n }\n properties[key] = propertySchema\n if (!unwrapped.optional) required.push(key)\n }\n result.properties = properties\n if (required.length > 0) result.required = required\n if (def.unknownKeys === 'passthrough') {\n result.additionalProperties = true\n } else if (def.catchall) {\n const catchallType = resolveType(def.catchall._def)\n if (catchallType === 'ZodNever' || catchallType === 'never') {\n result.additionalProperties = false\n } else if (!catchallType || catchallType === 'ZodUnknown' || catchallType === 'unknown' || catchallType === 'ZodAny' || catchallType === 'any') {\n result.additionalProperties = true\n } else {\n result.additionalProperties = zodToJsonSchema(def.catchall, context) ?? true\n }\n } else {\n result.additionalProperties = false\n }\n break\n }\n case 'ZodDate':\n case 'date':\n result.type = 'string'\n result.format = 'date-time'\n break\n case 'ZodNull':\n case 'null':\n result.type = 'null'\n break\n case 'ZodVoid':\n case 'void':\n case 'ZodNever':\n case 'never':\n break\n case 'ZodAny':\n case 'any':\n case 'ZodUnknown':\n case 'unknown':\n case 'ZodNaN':\n case 'nan':\n default:\n break\n }\n\n if (nullable) {\n if (result.type && result.type !== 'null') {\n result.nullable = true\n } else if (!result.type) {\n const clone = { ...result }\n result.anyOf = [{ type: 'null' }, clone]\n }\n }\n\n return result\n}\n\nfunction generateExample(schema?: ZodTypeAny, ctx?: ExampleGenerationContext): unknown {\n if (!schema) return undefined\n if ((typeof schema !== 'object' || schema === null) && typeof schema !== 'function') return undefined\n const trackable = schema as object\n const context: ExampleGenerationContext = ctx ?? { stack: new WeakSet<ZodTypeAny>() }\n if (context.stack.has(trackable as ZodTypeAny)) return undefined\n context.stack.add(trackable as ZodTypeAny)\n\n try {\n const { schema: inner, optional, nullable, defaultValue } = unwrap(schema)\n if (!inner) {\n if (defaultValue !== undefined) return defaultValue\n if (nullable) return null\n if (optional) return undefined\n return undefined\n }\n const def = (inner as any)._def\n const typeName = resolveType(def) as string | undefined\n if (defaultValue !== undefined) return defaultValue\n\n if (nullable) return null\n if (optional) return undefined\n\n switch (typeName) {\n case 'ZodString':\n case 'string': {\n const checks = normalizeChecks(def?.checks)\n for (const check of checks) {\n if (!check.kind && !check.extra?.format) continue\n if (check.kind === 'uuid' || check.extra?.format === 'uuid') return DEFAULT_EXAMPLE_VALUES.uuid\n if (check.kind === 'email' || check.extra?.format === 'email') return DEFAULT_EXAMPLE_VALUES.email\n if (check.kind === 'url' || check.extra?.format === 'url' || check.extra?.format === 'uri') return DEFAULT_EXAMPLE_VALUES.url\n if (check.kind === 'datetime' || check.extra?.format === 'date-time') return DEFAULT_EXAMPLE_VALUES.datetime\n }\n return DEFAULT_EXAMPLE_VALUES.string\n }\n case 'ZodNumber':\n case 'number': {\n const checks = normalizeChecks(def?.checks)\n const isInt = checks.some((check) => check.kind === 'int' || check.kind === 'isInteger')\n return isInt ? DEFAULT_EXAMPLE_VALUES.integer : DEFAULT_EXAMPLE_VALUES.number\n }\n case 'ZodBigInt':\n case 'bigint':\n return BigInt(1)\n case 'ZodBoolean':\n case 'boolean':\n return DEFAULT_EXAMPLE_VALUES.boolean\n case 'ZodEnum':\n case 'enum': {\n const entries = def?.values ?? def?.entries\n const values = Array.isArray(entries) ? entries : entries ? Object.values(entries) : []\n return values[0]\n }\n case 'ZodNativeEnum': {\n const values = Object.values(def?.values || [])\n return values[0]\n }\n case 'ZodLiteral':\n case 'literal':\n return def?.value ?? (Array.isArray(def?.values) ? def.values[0] : undefined)\n case 'ZodArray':\n case 'array': {\n const elementSchema =\n def?.type && typeof def.type === 'object'\n ? def.type\n : (def?.element && typeof def.element === 'object' ? def.element : undefined)\n const child = generateExample(elementSchema, context)\n return child === undefined ? [] : [child]\n }\n case 'ZodTuple':\n case 'tuple': {\n const items = def?.items || []\n return items.map((item: ZodTypeAny) => generateExample(item, context))\n }\n case 'ZodObject':\n case 'object': {\n const shape = getShape(def)\n const obj: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(shape)) {\n const example = generateExample(value as ZodTypeAny, context)\n if (example !== undefined) obj[key] = example\n }\n return obj\n }\n case 'ZodRecord':\n case 'record': {\n const valueExample = generateExample(def?.valueType ?? def?.value, context)\n return valueExample === undefined ? {} : { key: valueExample }\n }\n case 'ZodUnion':\n case 'union': {\n const options = def?.options || []\n return options.length ? generateExample(options[0], context) : undefined\n }\n case 'ZodPipeline':\n case 'pipe':\n return generateExample(def?.out ?? def?.innerType ?? def?.schema, context)\n case 'ZodLazy':\n case 'lazy': {\n const next = typeof def?.getter === 'function' ? def.getter() : undefined\n return next ? generateExample(next, context) : undefined\n }\n case 'ZodPromise':\n case 'promise':\n return generateExample(def?.type, context)\n case 'ZodCatch':\n case 'catch':\n return generateExample(def?.innerType ?? def?.type, context)\n case 'ZodReadonly':\n case 'readonly':\n return generateExample(def?.innerType ?? def?.type, context)\n case 'ZodIntersection':\n case 'intersection': {\n const left = generateExample(def?.left, context)\n const right = generateExample(def?.right, context)\n if (typeof left === 'object' && left && typeof right === 'object' && right) {\n return { ...(left as object), ...(right as object) }\n }\n return left ?? right\n }\n case 'ZodDate':\n case 'date':\n return DEFAULT_EXAMPLE_VALUES.datetime\n default:\n return undefined\n }\n } finally {\n context.stack.delete(trackable as ZodTypeAny)\n }\n}\n\nfunction buildParameters(\n schema: ZodTypeAny | undefined,\n location: ParameterLocation,\n pathParamNames?: PathParamInfo[]\n): Array<Record<string, unknown>> {\n if (!schema && location !== 'path') return []\n\n const params: Array<Record<string, unknown>> = []\n\n if (location === 'path' && pathParamNames && pathParamNames.length) {\n const merged = mergePathParamSchemas(schema, pathParamNames)\n for (const { name, schema: paramSchema, optional } of merged) {\n const jsonSchema = zodToJsonSchema(paramSchema)\n const example = generateExample(paramSchema)\n const description = extractZodDescription(paramSchema)\n params.push({\n name,\n in: 'path',\n required: !optional,\n schema: jsonSchema ?? { type: 'string' },\n example,\n ...(description ? { description } : {}),\n })\n }\n return params\n }\n\n if (!schema) return params\n\n const { schema: unwrapped } = unwrap(schema)\n if (!unwrapped) return params\n const def = (unwrapped as any)._def\n const typeName = resolveType(def) as string | undefined\n if (typeName === 'ZodObject' || typeName === 'object') {\n const shape = getShape(def)\n for (const [key, raw] of Object.entries(shape)) {\n const details = unwrap(raw as ZodTypeAny)\n if (!details.schema) continue\n const jsonSchema = zodToJsonSchema(details.schema)\n const example = generateExample(details.schema)\n const description = extractZodDescription(raw as ZodTypeAny)\n params.push({\n name: key,\n in: location,\n required: location === 'path' ? true : !details.optional,\n schema: jsonSchema ?? {},\n example,\n ...(description ? { description } : {}),\n })\n }\n } else {\n const jsonSchema = zodToJsonSchema(unwrapped)\n const example = generateExample(unwrapped)\n const description = extractZodDescription(unwrapped)\n params.push({\n name: location === 'header' ? 'X-Custom-Header' : 'value',\n in: location,\n required: location === 'path',\n schema: jsonSchema ?? {},\n example,\n ...(description ? { description } : {}),\n })\n }\n\n return params\n}\n\nfunction mergePathParamSchemas(schema: ZodTypeAny | undefined, params: PathParamInfo[]) {\n const merged: Array<{ name: string; schema: ZodTypeAny | undefined; optional: boolean }> = []\n const map: Record<string, ZodTypeAny> = {}\n if (schema) {\n const { schema: unwrapped } = unwrap(schema)\n if (unwrapped && (unwrapped as any)._def && (resolveType((unwrapped as any)._def) === 'ZodObject' || resolveType((unwrapped as any)._def) === 'object')) {\n const shape = getShape((unwrapped as any)._def)\n for (const [key, value] of Object.entries(shape)) {\n map[key] = value as ZodTypeAny\n }\n }\n }\n for (const param of params) {\n merged.push({\n name: param.name,\n schema: map[param.name],\n optional: !!param.optional,\n })\n }\n return merged\n}\n\nfunction buildRequestBody(request?: OpenApiRequestBodyDoc): Record<string, unknown> | undefined {\n if (!request) return undefined\n const schema = zodToJsonSchema(request.schema)\n const example = request.example ?? generateExample(request.schema)\n const contentType = request.contentType ?? 'application/json'\n return {\n required: true,\n content: {\n [contentType]: {\n schema: schema ?? {},\n example,\n },\n },\n description: request.description,\n }\n}\n\nfunction buildResponses(\n method: HttpMethod,\n responses?: OpenApiResponseDoc[],\n errors?: OpenApiResponseDoc[],\n metadata?: any\n): Record<string, unknown> {\n const entries: Record<string, unknown> = {}\n const list = [...(responses ?? [])]\n const errorList = [...(errors ?? [])]\n const inferredList: OpenApiResponseDoc[] = []\n if (metadata?.requireAuth) {\n inferredList.push({\n status: 401,\n description: 'Unauthorized',\n schema: z.object({ error: z.string() }),\n xAutoGenerated: true,\n })\n }\n if (Array.isArray(metadata?.requireFeatures) && metadata.requireFeatures.length) {\n inferredList.push({\n status: 403,\n description: 'Forbidden \u2013 missing required features',\n schema: z.object({ error: z.string() }),\n xAutoGenerated: true,\n })\n }\n if (!list.some((res) => res.status >= 200 && res.status < 300)) {\n const fallbackStatus = method === 'POST' ? 201 : method === 'DELETE' ? 204 : 200\n list.push({\n status: fallbackStatus,\n description: fallbackStatus === 204 ? 'Success' : 'Success response',\n })\n }\n const setEntry = (res: OpenApiResponseDoc, options?: { skipIfPresent?: boolean }) => {\n const status = String(res.status || 200)\n if (options?.skipIfPresent && Object.prototype.hasOwnProperty.call(entries, status)) return\n const mediaType = res.mediaType ?? 'application/json'\n const schema = res.schema ? zodToJsonSchema(res.schema) : undefined\n const example = res.schema ? res.example ?? generateExample(res.schema) : res.example\n const isNoContent = res.status === 204\n entries[status] = {\n description: res.description ?? '',\n ...(isNoContent\n ? {}\n : {\n content: {\n [mediaType]: {\n schema: schema ?? { type: 'object' },\n ...(example !== undefined ? { example } : {}),\n },\n },\n }),\n ...(res.xAutoGenerated ? { 'x-autoGenerated': true } : {}),\n }\n }\n for (const res of [...list, ...errorList]) setEntry(res)\n for (const res of inferredList) setEntry(res, { skipIfPresent: true })\n return entries\n}\n\nfunction buildSecurity(metadata: any, methodDoc?: OpenApiMethodDoc, defaults?: string[]) {\n const securitySchemes = new Set<string>()\n if (Array.isArray(methodDoc?.security)) methodDoc.security.forEach((s) => securitySchemes.add(s))\n if (metadata?.requireAuth) securitySchemes.add('bearerAuth')\n if (defaults) defaults.forEach((s) => securitySchemes.add(s))\n if (securitySchemes.size === 0) return undefined\n return Array.from(securitySchemes.values()).map((scheme) => ({ [scheme]: [] }))\n}\n\nfunction collectExamples(\n querySchema?: ZodTypeAny,\n bodySchema?: ZodTypeAny,\n pathSchema?: ZodTypeAny,\n headerSchema?: ZodTypeAny,\n metadata?: any\n): ExampleMap {\n const examples: ExampleMap = {}\n const queryExample = querySchema ? generateExample(querySchema) : undefined\n if (queryExample && typeof queryExample === 'object') examples.query = queryExample\n const bodyExample = bodySchema ? generateExample(bodySchema) : undefined\n if (bodyExample !== undefined) examples.body = bodyExample\n const pathExample = pathSchema ? generateExample(pathSchema) : undefined\n if (pathExample && typeof pathExample === 'object') examples.path = pathExample as Record<string, unknown>\n const headerExample = headerSchema ? generateExample(headerSchema) : undefined\n if (headerExample && typeof headerExample === 'object') examples.headers = headerExample as Record<string, unknown>\n if (metadata?.requireAuth) {\n if (!examples.headers) examples.headers = {}\n if (typeof examples.headers.authorization !== 'string') {\n examples.headers.authorization = 'Bearer <token>'\n }\n }\n return examples\n}\n\nfunction toFormUrlEncoded(value: unknown): string {\n if (!value || typeof value !== 'object') return ''\n const params = new URLSearchParams()\n for (const [key, raw] of Object.entries(value as Record<string, unknown>)) {\n if (raw === undefined) continue\n params.append(key, raw === null ? '' : String(raw))\n }\n return params.toString()\n}\n\nfunction stringifyBodyExample(value: unknown, mediaType?: string): string {\n if (value === undefined) return ''\n if (mediaType === 'application/x-www-form-urlencoded') {\n return toFormUrlEncoded(value)\n }\n if (!mediaType || mediaType === 'application/json') {\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return ''\n }\n }\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction buildQueryString(example: unknown): string {\n if (!example || typeof example !== 'object') return ''\n const parts: string[] = []\n for (const [key, value] of Object.entries(example as Record<string, unknown>)) {\n if (value === undefined || value === null) continue\n const encoded = encodeURIComponent(String(value))\n parts.push(`${encodeURIComponent(key)}=${encoded}`)\n }\n return parts.length ? `?${parts.join('&')}` : ''\n}\n\nfunction injectPathExamples(path: string, params: PathParamInfo[], examples?: Record<string, unknown>): string {\n if (!params.length) return path\n let result = path\n for (const param of params) {\n const placeholder = `{${param.name}}`\n const example = examples && examples[param.name] !== undefined ? examples[param.name] : `:${param.name}`\n result = result.replace(placeholder, String(example))\n }\n return result\n}\n\nfunction buildCurlSample(\n method: HttpMethod,\n path: string,\n params: PathParamInfo[],\n examples: ExampleMap,\n baseUrl: string,\n metadata: any,\n requestBody?: OpenApiRequestBodyDoc\n): string {\n const lines: string[] = []\n const pathWithExamples = injectPathExamples(path, params, examples.path)\n const query = buildQueryString(examples.query)\n const url = baseUrl.replace(/\\/$/, '') + pathWithExamples + query\n lines.push(`curl -X ${method} \"${url}\"`)\n\n lines.push(' -H \"Accept: application/json\"')\n\n const headers: Record<string, unknown> = { ...(examples.headers ?? {}) }\n if (metadata?.requireAuth && !headers.Authorization && !headers.authorization) {\n headers.Authorization = 'Bearer <token>'\n }\n for (const [key, value] of Object.entries(headers)) {\n lines.push(` -H \"${key.replace(/\"/g, '')}: ${String(value).replace(/\"/g, '')}\"`)\n }\n\n const bodyExample = examples.body ?? requestBody?.example\n const requestContentType = requestBody?.contentType ?? 'application/json'\n if (bodyExample !== undefined) {\n lines.push(` -H \"Content-Type: ${requestContentType}\"`)\n const serialized = stringifyBodyExample(bodyExample, requestContentType)\n if (serialized) {\n const escapedSerialized = escapeShellDoubleQuotes(serialized)\n lines.push(` -d \"${escapedSerialized}\"`)\n }\n }\n\n return lines.join(' \\\\\\n')\n}\n\nfunction escapeShellDoubleQuotes(value: string): string {\n return value.replace(/[\\\\`\"$]/g, '\\\\$&')\n}\n\nfunction ensureSecurityComponents(doc: OpenApiDocument) {\n if (!doc.components) doc.components = {}\n if (!doc.components.securitySchemes) doc.components.securitySchemes = {}\n if (!doc.components.securitySchemes.bearerAuth) {\n doc.components.securitySchemes.bearerAuth = {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n description: 'Send an `Authorization: Bearer <token>` header with a valid API token.',\n }\n }\n}\n\nfunction resolveOperationId(moduleId: string, path: string, method: HttpMethod): string {\n const cleaned = normalizeOperationIdSegment(path)\n return [moduleId, method.toLowerCase(), cleaned].filter(Boolean).join('_')\n}\n\nfunction normalizeOperationIdSegment(input: string): string {\n let output = ''\n let previousUnderscore = false\n\n for (const character of input) {\n const codePoint = character.charCodeAt(0)\n const isLower = codePoint >= 97 && codePoint <= 122\n const isUpper = codePoint >= 65 && codePoint <= 90\n const isNumber = codePoint >= 48 && codePoint <= 57\n const isAlphaNumeric = isLower || isUpper || isNumber\n\n if (isAlphaNumeric) {\n output += character\n previousUnderscore = false\n continue\n }\n\n if (!previousUnderscore) {\n output += '_'\n previousUnderscore = true\n }\n }\n\n while (output.startsWith('_')) output = output.slice(1)\n while (output.endsWith('_')) output = output.slice(0, -1)\n\n return output\n}\n\nfunction collectRouteDoc(api: ModuleApi, moduleId: string): OpenApiRouteDoc | undefined {\n if ('handlers' in api) {\n const route = api as ModuleApiRouteFile & { docs?: OpenApiRouteDoc }\n if (route.docs) return route.docs\n const maybe = (route.handlers as any)?.openApi\n if (maybe && typeof maybe === 'object') return maybe as OpenApiRouteDoc\n } else {\n const legacy = api as ModuleApiLegacy & { docs?: OpenApiMethodDoc }\n if (legacy.docs) {\n return {\n methods: { [legacy.method]: legacy.docs },\n }\n }\n const maybe = (legacy.handler as any)?.openApi\n if (maybe && typeof maybe === 'object') {\n return {\n methods: { [legacy.method]: maybe as OpenApiMethodDoc },\n }\n }\n }\n return undefined\n}\n\nexport function buildOpenApiDocument(modules: Module[], options: OpenApiDocumentOptions = {}): OpenApiDocument {\n const doc: OpenApiDocument = {\n openapi: '3.1.0',\n info: {\n title: options.title ?? 'Open Mercato API',\n version: options.version ?? '1.0.0',\n description: options.description,\n },\n servers: options.servers,\n paths: {},\n }\n\n ensureSecurityComponents(doc)\n\n const includeAccessControlMetadata = options.includeAccessControlMetadata !== false\n const tags = new Map<string, string | undefined>()\n\n for (const moduleEntry of modules) {\n const defaultTag = moduleEntry.info?.title ?? toTitle(moduleEntry.id)\n if (defaultTag) tags.set(defaultTag, moduleEntry.info?.description)\n\n const apis = moduleEntry.apis ?? []\n for (const api of apis) {\n const routeDoc = collectRouteDoc(api, moduleEntry.id)\n const moduleTag = routeDoc?.tag ?? defaultTag\n const normalized = normalizePath((api as any).path ?? (api as any).path ?? '')\n const pathKey = normalized.path\n if (!doc.paths[pathKey]) doc.paths[pathKey] = {}\n const availableMethods: HttpMethod[] =\n 'handlers' in api\n ? HTTP_METHODS.filter((method) => typeof (api as ModuleApiRouteFile).handlers?.[method] === 'function')\n : [api.method as HttpMethod]\n\n for (const method of availableMethods) {\n const methodLower = method.toLowerCase() as Lowercase<HttpMethod>\n const existing = doc.paths[pathKey][methodLower]\n if (existing) continue\n\n const metadata = 'handlers' in api ? (api as ModuleApiRouteFile).metadata?.[method] : undefined\n const methodDoc = routeDoc?.methods?.[method]\n const summary = methodDoc?.summary ?? routeDoc?.summary ?? `${method} ${pathKey}`\n const baseDescription = methodDoc?.description ?? routeDoc?.description\n const meta = metadata && typeof metadata === 'object' ? (metadata as Record<string, unknown>) : undefined\n const requireFeatures = Array.isArray(meta?.['requireFeatures'])\n ? (meta!['requireFeatures'] as string[])\n : undefined\n const requireRoles = Array.isArray(meta?.['requireRoles'])\n ? (meta!['requireRoles'] as string[])\n : undefined\n const requireAuth = meta?.['requireAuth'] === true\n const descriptionParts: string[] = []\n if (baseDescription) descriptionParts.push(baseDescription)\n if (includeAccessControlMetadata && Array.isArray(requireFeatures) && requireFeatures.length) {\n descriptionParts.push(`Requires features: ${requireFeatures.join(', ')}`)\n }\n if (includeAccessControlMetadata && Array.isArray(requireRoles) && requireRoles.length) {\n descriptionParts.push(`Requires roles: ${requireRoles.join(', ')}`)\n }\n\n const querySchema = methodDoc?.query\n const pathSchema = methodDoc?.pathParams ?? routeDoc?.pathParams\n const headerSchema = methodDoc?.headers\n const requestBody = methodDoc?.requestBody\n const examples = collectExamples(querySchema, requestBody?.schema, pathSchema, headerSchema, metadata)\n const curlSample = buildCurlSample(\n method,\n pathKey,\n normalized.params,\n examples,\n options.baseUrlForExamples ?? 'https://api.open-mercato.local',\n metadata,\n requestBody\n )\n\n doc.paths[pathKey][methodLower] = {\n operationId: methodDoc?.operationId ?? resolveOperationId(moduleEntry.id, pathKey, method),\n summary,\n description: descriptionParts.length ? descriptionParts.join('\\n\\n') : undefined,\n tags: methodDoc?.tags ?? (moduleTag ? [moduleTag] : undefined),\n deprecated: methodDoc?.deprecated,\n externalDocs: methodDoc?.externalDocs,\n parameters: [\n ...buildParameters(pathSchema, 'path', normalized.params),\n ...buildParameters(querySchema, 'query'),\n ...buildParameters(headerSchema, 'header'),\n ].filter(Boolean),\n requestBody: buildRequestBody(requestBody),\n responses: buildResponses(method, methodDoc?.responses, methodDoc?.errors, metadata),\n security: buildSecurity(metadata, methodDoc, options.defaultSecurity),\n 'x-codeSamples': methodDoc?.codeSamples ?? [\n {\n lang: 'curl',\n label: 'cURL',\n source: curlSample,\n },\n ],\n ...(includeAccessControlMetadata && Array.isArray(requireFeatures) && requireFeatures.length\n ? { 'x-require-features': requireFeatures }\n : {}),\n ...(includeAccessControlMetadata && Array.isArray(requireRoles) && requireRoles.length\n ? { 'x-require-roles': requireRoles }\n : {}),\n ...(requireAuth ? { 'x-require-auth': true } : {}),\n ...(methodDoc?.extensions ?? {}),\n }\n }\n }\n }\n\n doc.tags = Array.from(tags.entries()).map(([name, description]) => ({\n name,\n description: description ?? undefined,\n }))\n\n return doc\n}\n\nfunction formatMarkdownTable(rows: Array<[string, string, string, string]>): string {\n if (!rows.length) return ''\n const header = ['Name', 'Location', 'Type', 'Description']\n const align = ['---', '---', '---', '---']\n const lines = [\n `| ${header.join(' | ')} |`,\n `| ${align.join(' | ')} |`,\n ...rows.map((row) => `| ${row.join(' | ')} |`),\n ]\n return lines.join('\\n')\n}\n\nfunction schemaTypeLabel(schema: any): string {\n if (!schema) return 'any'\n if (schema.type) return schema.type\n if (schema.oneOf) return schema.oneOf.map(schemaTypeLabel).join(' | ')\n if (schema.allOf) return schema.allOf.map(schemaTypeLabel).join(' & ')\n return 'any'\n}\n\nfunction schemaHasDetails(schema: unknown): boolean {\n if (!schema || typeof schema !== 'object') return false\n const schemaObj = schema as Record<string, unknown>\n if (Array.isArray(schemaObj.enum) && schemaObj.enum.length) return true\n if (schemaObj.const !== undefined) return true\n if (typeof schemaObj.format === 'string') return true\n if (Array.isArray(schemaObj.oneOf) && schemaObj.oneOf.some((s: unknown) => schemaHasDetails(s))) return true\n if (Array.isArray(schemaObj.anyOf) && schemaObj.anyOf.some((s: unknown) => schemaHasDetails(s))) return true\n if (Array.isArray(schemaObj.allOf) && schemaObj.allOf.some((s: unknown) => schemaHasDetails(s))) return true\n if (schemaObj.items && schemaHasDetails(schemaObj.items)) return true\n if (schemaObj.properties && Object.keys(schemaObj.properties as Record<string, unknown>).length) return true\n if (Array.isArray(schemaObj.prefixItems) && schemaObj.prefixItems.some((s: unknown) => schemaHasDetails(s))) return true\n if (schemaObj.type && schemaObj.type !== 'object') return true\n return false\n}\n\ntype ContentSelection = {\n mediaType: string\n entry: any\n}\n\ntype DisplaySnippet = {\n value: string\n language: string\n}\n\nfunction selectContentVariant(content?: Record<string, any>): ContentSelection | undefined {\n if (!content) return undefined\n const entries = Object.entries(content)\n if (!entries.length) return undefined\n const preferred = [\n 'application/json',\n 'application/x-www-form-urlencoded',\n 'multipart/form-data',\n 'text/plain',\n ]\n for (const mediaType of preferred) {\n const match = entries.find(([type]) => type === mediaType)\n if (match) {\n const [selectedType, entry] = match\n return { mediaType: selectedType, entry }\n }\n }\n const [mediaType, entry] = entries[0]\n return { mediaType, entry }\n}\n\nfunction formatExampleForDisplay(example: unknown, mediaType?: string): DisplaySnippet | null {\n if (example === undefined) return null\n if (mediaType === 'application/x-www-form-urlencoded') {\n const encoded = toFormUrlEncoded(example)\n if (!encoded) return null\n return { value: encoded, language: 'text' }\n }\n if (mediaType === 'multipart/form-data') {\n if (example && typeof example === 'object') {\n const lines = Object.entries(example as Record<string, unknown>).map(([key, value]) => {\n const rendered = value === undefined || value === null ? '' : String(value)\n return `${key}=${rendered}`\n })\n if (lines.length) {\n return { value: lines.join('\\n'), language: 'text' }\n }\n }\n if (typeof example === 'string') {\n return { value: example, language: 'text' }\n }\n }\n if (!mediaType || mediaType === 'application/json') {\n try {\n return { value: JSON.stringify(example, null, 2), language: 'json' }\n } catch {\n return null\n }\n }\n if (typeof example === 'string') {\n return { value: example, language: 'text' }\n }\n try {\n return { value: JSON.stringify(example, null, 2), language: 'json' }\n } catch {\n return { value: String(example), language: 'text' }\n }\n}\n\nfunction formatSchemaForDisplay(schema: any): DisplaySnippet | null {\n if (!schema) return null\n try {\n return { value: JSON.stringify(schema, null, 2), language: 'json' }\n } catch {\n return null\n }\n}\n\nexport function generateMarkdownFromOpenApi(doc: OpenApiDocument): string {\n const lines: string[] = []\n lines.push(`# ${doc.info.title}`)\n lines.push('')\n lines.push(`Version: ${doc.info.version}`)\n if (doc.info.description) {\n lines.push('')\n lines.push(doc.info.description)\n }\n if (doc.servers && doc.servers.length) {\n lines.push('')\n lines.push('## Servers')\n for (const server of doc.servers) {\n lines.push(`- ${server.url}${server.description ? ` \u2013 ${server.description}` : ''}`)\n }\n }\n\n const sortedPaths = Object.keys(doc.paths).sort((a, b) => a.localeCompare(b))\n for (const path of sortedPaths) {\n const operations = doc.paths[path]\n const methods = Object.keys(operations).sort((a, b) => a.localeCompare(b))\n for (const method of methods) {\n const op: any = operations[method]\n lines.push('')\n lines.push(`## ${method.toUpperCase()} \\`${path}\\``)\n if (op.summary) {\n lines.push('')\n lines.push(op.summary)\n }\n if (op.description) {\n lines.push('')\n lines.push(op.description)\n }\n if (op.tags && op.tags.length) {\n lines.push('')\n lines.push(`**Tags:** ${op.tags.join(', ')}`)\n }\n if (op['x-require-auth']) {\n lines.push('')\n lines.push(`**Requires authentication.**`)\n }\n if (op['x-require-features']) {\n lines.push('')\n lines.push(`**Features:** ${(op['x-require-features'] as string[]).join(', ')}`)\n }\n if (op['x-require-roles']) {\n lines.push('')\n lines.push(`**Roles:** ${(op['x-require-roles'] as string[]).join(', ')}`)\n }\n\n const parameters = (op.parameters as any[]) ?? []\n if (parameters.length) {\n lines.push('')\n lines.push('### Parameters')\n const rows: Array<[string, string, string, string]> = parameters.map((p) => {\n const requiredLabel = p.required ? 'Required' : 'Optional'\n const descriptionParts = [requiredLabel, p.description].filter(Boolean)\n return [\n p.name,\n p.in,\n schemaTypeLabel(p.schema),\n descriptionParts.join('. '),\n ]\n })\n lines.push(formatMarkdownTable(rows))\n }\n\n if (op.requestBody) {\n const selection = selectContentVariant(op.requestBody.content)\n if (selection) {\n const { mediaType, entry } = selection\n const example = entry?.example ?? entry?.examples?.default?.value\n const formatted = formatExampleForDisplay(example, mediaType)\n const schemaFormatted =\n entry?.schema && schemaHasDetails(entry.schema) ? formatSchemaForDisplay(entry.schema) : null\n lines.push('')\n lines.push('### Request Body')\n lines.push('')\n lines.push(`Content-Type: \\`${mediaType}\\``)\n if (formatted) {\n lines.push('')\n lines.push(`\\`\\`\\`${formatted.language}`)\n lines.push(formatted.value)\n lines.push('```')\n } else if (schemaFormatted) {\n lines.push('')\n lines.push(`\\`\\`\\`${schemaFormatted.language}`)\n lines.push(schemaFormatted.value)\n lines.push('```')\n } else {\n lines.push('')\n lines.push('No example available for this content type.')\n }\n }\n }\n\n const responses = op.responses ?? {}\n const responseStatuses = Object.keys(responses).sort((a, b) => a.localeCompare(b))\n if (responseStatuses.length) {\n lines.push('')\n lines.push('### Responses')\n for (const status of responseStatuses) {\n const response = responses[status]\n if (response?.['x-autoGenerated']) continue\n lines.push('')\n lines.push(`**${status}** \u2013 ${response.description || 'Response'}`)\n const selection = selectContentVariant(response.content)\n if (selection) {\n const { mediaType, entry } = selection\n const example = entry?.example ?? entry?.examples?.default?.value\n const formatted = formatExampleForDisplay(example, mediaType)\n const schemaFormatted =\n entry?.schema && schemaHasDetails(entry.schema) ? formatSchemaForDisplay(entry.schema) : null\n lines.push('')\n lines.push(`Content-Type: \\`${mediaType}\\``)\n if (formatted) {\n lines.push('')\n lines.push(`\\`\\`\\`${formatted.language}`)\n lines.push(formatted.value)\n lines.push('```')\n } else if (schemaFormatted) {\n lines.push('')\n lines.push(`\\`\\`\\`${schemaFormatted.language}`)\n lines.push(schemaFormatted.value)\n lines.push('```')\n }\n }\n }\n }\n\n const samples = op['x-codeSamples'] as any[] | undefined\n if (samples && samples.length) {\n const curl = samples.find((sample) => String(sample.lang).toLowerCase() === 'curl') ?? samples[0]\n if (curl?.source) {\n lines.push('')\n lines.push('### Example')\n lines.push('')\n lines.push('```bash')\n lines.push(curl.source)\n lines.push('```')\n }\n }\n }\n }\n\n return lines.join('\\n')\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z, type ZodTypeAny } from 'zod'\nimport type { Module, ModuleApi, ModuleApiLegacy, ModuleApiRouteFile, HttpMethod } from '@open-mercato/shared/modules/registry'\nimport type {\n OpenApiDocument,\n OpenApiDocumentOptions,\n OpenApiMethodDoc,\n OpenApiRequestBodyDoc,\n OpenApiResponseDoc,\n OpenApiRouteDoc,\n} from './types'\n\ntype PathParamInfo = {\n name: string\n catchAll?: boolean\n optional?: boolean\n}\n\ntype ParameterLocation = 'query' | 'path' | 'header'\n\nexport type JsonSchema = Record<string, unknown>\n\ntype SchemaConversionContext = {\n memo: WeakMap<ZodTypeAny, JsonSchema>\n}\n\ntype ExampleGenerationContext = {\n stack: WeakSet<ZodTypeAny>\n}\n\ntype ExampleMap = {\n query?: unknown\n body?: unknown\n path?: Record<string, unknown>\n headers?: Record<string, unknown>\n}\n\nconst HTTP_METHODS: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n\nfunction resolveType(def: any): string | undefined {\n if (!def) return undefined\n if (typeof def.typeName === 'string' && def.typeName.length) return def.typeName\n if (typeof def.type === 'string' && def.type.length) return def.type\n return undefined\n}\n\nfunction getShape(def: any): Record<string, ZodTypeAny> {\n if (!def) return {}\n const shape = typeof def.shape === 'function' ? def.shape() : def.shape\n if (shape && typeof shape === 'object') return shape as Record<string, ZodTypeAny>\n return {}\n}\n\nfunction normalizeChecks(checks: any[] | undefined): Array<{ kind?: string; value?: unknown; extra?: Record<string, unknown> }> {\n if (!Array.isArray(checks)) return []\n return checks.map((check) => {\n if (!check) return {}\n const base = (check as any)?._zod?.def ?? (check as any)?.def ?? check\n const kind = typeof (check as any)?.kind === 'string'\n ? (check as any).kind\n : typeof base?.check === 'string'\n ? base.check\n : undefined\n const value =\n base?.value ??\n base?.minimum ??\n base?.maximum ??\n base?.exact ??\n base?.length ??\n base?.limit ??\n base?.includes ??\n base?.min ??\n base?.max\n return { kind, value, extra: base && typeof base === 'object' ? base : undefined }\n })\n}\n\nconst DEFAULT_EXAMPLE_VALUES = {\n string: 'string',\n number: 1,\n integer: 1,\n boolean: true,\n uuid: '00000000-0000-4000-8000-000000000000',\n email: 'user@example.com',\n url: 'https://example.com/resource',\n datetime: new Date('2025-01-01T00:00:00.000Z').toISOString(),\n}\n\nfunction toTitle(str: string): string {\n if (!str) return ''\n return str\n .split(/[_\\-\\s]+/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ')\n}\n\nfunction normalizePath(path: string): { path: string; params: PathParamInfo[] } {\n const segments = path.split('/').filter((seg) => seg.length > 0)\n const params: PathParamInfo[] = []\n const normalized = segments\n .map((seg) => {\n const catchAll = seg.match(/^\\[\\.\\.\\.(.+)\\]$/)\n if (catchAll) {\n params.push({ name: catchAll[1], catchAll: true })\n return `{${catchAll[1]}}`\n }\n const optCatchAll = seg.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/)\n if (optCatchAll) {\n params.push({ name: optCatchAll[1], catchAll: true, optional: true })\n return `{${optCatchAll[1]}}`\n }\n const dyn = seg.match(/^\\[(.+)\\]$/)\n if (dyn) {\n params.push({ name: dyn[1] })\n return `{${dyn[1]}}`\n }\n return seg\n })\n .join('/')\n return { path: '/' + normalized, params }\n}\n\nfunction unwrap(schema?: ZodTypeAny): {\n schema: ZodTypeAny | undefined\n optional: boolean\n nullable: boolean\n defaultValue?: unknown\n} {\n if (!schema) {\n return { schema: undefined, optional: true, nullable: false }\n }\n\n let current: ZodTypeAny = schema\n let optional = false\n let nullable = false\n let defaultValue: unknown\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const def = (current as any)?._def\n if (!def) {\n return { schema: current, optional, nullable, defaultValue }\n }\n const typeName = resolveType(def)\n if (typeName === 'ZodOptional' || typeName === 'optional') {\n optional = true\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodNullable' || typeName === 'nullable') {\n nullable = true\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodDefault' || typeName === 'default') {\n optional = true\n const rawDefault = (current as any)._def.defaultValue\n defaultValue = typeof rawDefault === 'function' ? rawDefault() : rawDefault\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodPipeline' || typeName === 'pipe') {\n current = (current as any)._def.out ?? (current as any)._def.innerType ?? (current as any)._def.schema\n continue\n }\n if (typeName === 'transformer') {\n current = (current as any)._def.output\n continue\n }\n if (typeName === 'ZodLazy' || typeName === 'lazy') {\n const getter = (current as any)._def.getter\n current = typeof getter === 'function' ? getter() : current\n if (current === schema) break\n continue\n }\n if (typeName === 'ZodPromise' || typeName === 'promise') {\n current = (current as any)._def.type\n continue\n }\n if (typeName === 'ZodCatch' || typeName === 'catch') {\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodReadonly' || typeName === 'readonly') {\n current = (current as any)._def.innerType\n continue\n }\n if (typeName === 'ZodBranded' || typeName === 'branded') {\n current = (current as any)._def.type\n continue\n }\n break\n }\n return { schema: current, optional, nullable, defaultValue }\n}\n\n/**\n * Extract the description from a zod schema, walking through wrappers like optional/nullable/default.\n * Returns the first description found, or undefined if none exists.\n */\nfunction extractZodDescription(schema?: ZodTypeAny): string | undefined {\n if (!schema) return undefined\n\n let current: ZodTypeAny | undefined = schema\n while (current) {\n // In Zod 4/zod-mini, description is stored directly on the schema object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const directDescription = (current as any).description\n if (typeof directDescription === 'string' && directDescription.length > 0) {\n return directDescription\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const def = (current as any)?._def as Record<string, unknown> | undefined\n if (!def) return undefined\n\n // Also check _def.description for Zod 3 compatibility\n if (typeof def.description === 'string' && def.description.length > 0) {\n return def.description\n }\n\n // Walk through wrappers to find description on inner types\n const typeName = resolveType(def)\n if (\n typeName === 'ZodOptional' || typeName === 'optional' ||\n typeName === 'ZodNullable' || typeName === 'nullable' ||\n typeName === 'ZodDefault' || typeName === 'default' ||\n typeName === 'ZodCatch' || typeName === 'catch' ||\n typeName === 'ZodReadonly' || typeName === 'readonly'\n ) {\n current = def.innerType as ZodTypeAny | undefined\n continue\n }\n if (typeName === 'ZodBranded' || typeName === 'branded') {\n current = def.type as ZodTypeAny | undefined\n continue\n }\n if (typeName === 'ZodPipeline' || typeName === 'pipe') {\n current = (def.out ?? def.innerType ?? def.schema) as ZodTypeAny | undefined\n continue\n }\n if (typeName === 'transformer') {\n current = def.output as ZodTypeAny | undefined\n continue\n }\n if (typeName === 'ZodLazy' || typeName === 'lazy') {\n const getter = def.getter\n const next = typeof getter === 'function' ? (getter as () => ZodTypeAny)() : current\n if (next === current) break\n current = next\n continue\n }\n if (typeName === 'ZodPromise' || typeName === 'promise') {\n current = def.type as ZodTypeAny | undefined\n continue\n }\n // No more wrappers to unwrap\n break\n }\n return undefined\n}\n\nexport function zodToJsonSchema(schema?: ZodTypeAny, ctx?: SchemaConversionContext): JsonSchema | undefined {\n if (!schema) return undefined\n const context: SchemaConversionContext = ctx ?? { memo: new WeakMap<ZodTypeAny, JsonSchema>() }\n\n const cached = context.memo.get(schema)\n if (cached) return cached\n\n const placeholder: JsonSchema = {}\n context.memo.set(schema, placeholder)\n\n const { schema: inner, nullable } = unwrap(schema)\n if (!inner) {\n if (nullable) placeholder.nullable = true\n return placeholder\n }\n\n if (inner !== schema && typeof inner === 'object') {\n if (!context.memo.has(inner as ZodTypeAny)) {\n context.memo.set(inner as ZodTypeAny, placeholder)\n }\n }\n\n const def = (inner as any)._def\n if (!def) return placeholder\n const typeName = resolveType(def) as string | undefined\n\n const result = placeholder\n\n switch (typeName) {\n case 'ZodString':\n case 'string': {\n result.type = 'string'\n const checks = normalizeChecks(def.checks)\n for (const check of checks) {\n if (!check.kind) continue\n if (check.kind === 'uuid' || check.extra?.format === 'uuid') {\n result.format = 'uuid'\n } else if (check.kind === 'email' || check.extra?.format === 'email') {\n result.format = 'email'\n } else if (check.kind === 'url' || check.extra?.format === 'uri' || check.extra?.format === 'url') {\n result.format = 'uri'\n } else if (check.kind === 'regex' && check.extra?.pattern instanceof RegExp) {\n result.pattern = check.extra.pattern.source\n } else if (check.kind === 'string_format' && typeof check.extra?.format === 'string') {\n if (check.extra.format === 'regex' && check.extra.pattern != null) {\n result.pattern = check.extra.pattern instanceof RegExp\n ? check.extra.pattern.source\n : String(check.extra.pattern)\n } else {\n result.format = check.extra.format\n }\n } else if (check.kind === 'datetime' || check.extra?.format === 'date-time') {\n result.format = 'date-time'\n } else if (['length', 'len', 'exact_length'].includes(check.kind ?? '')) {\n if (typeof check.value === 'number') {\n result.minLength = check.value\n result.maxLength = check.value\n }\n } else if (check.kind === 'min' || check.kind === 'min_length') {\n if (typeof check.value === 'number') result.minLength = check.value\n } else if (check.kind === 'max' || check.kind === 'max_length') {\n if (typeof check.value === 'number') result.maxLength = check.value\n }\n }\n break\n }\n case 'ZodNumber':\n case 'number': {\n result.type = 'number'\n const checks = normalizeChecks(def.checks)\n for (const check of checks) {\n if (!check.kind) continue\n if (check.kind === 'int' || check.kind === 'isInteger') result.type = 'integer'\n if ((check.kind === 'min' || check.kind === 'gte') && typeof check.value === 'number') result.minimum = check.value\n if ((check.kind === 'max' || check.kind === 'lte') && typeof check.value === 'number') result.maximum = check.value\n if (check.kind === 'multipleOf' && typeof check.value === 'number') result.multipleOf = check.value\n }\n break\n }\n case 'ZodBigInt':\n case 'bigint':\n result.type = 'integer'\n result.format = 'int64'\n break\n case 'ZodBoolean':\n case 'boolean':\n result.type = 'boolean'\n break\n case 'ZodLiteral':\n case 'literal': {\n const value = def.value ?? (Array.isArray(def.values) ? def.values[0] : undefined)\n result.type = typeof value\n result.enum = [value]\n break\n }\n case 'ZodEnum':\n case 'enum': {\n const entries = def.values ?? def.entries\n const values = Array.isArray(entries) ? entries : entries ? Object.values(entries) : []\n const enumerators = values.filter((v: unknown) => typeof v === 'string' || typeof v === 'number')\n const allString = enumerators.every((v: unknown) => typeof v === 'string')\n result.type = allString ? 'string' : 'number'\n result.enum = enumerators\n break\n }\n case 'ZodNativeEnum': {\n const values = Object.values(def.values).filter((v) => typeof v === 'string' || typeof v === 'number')\n const allString = values.every((v) => typeof v === 'string')\n result.type = allString ? 'string' : 'number'\n result.enum = values\n break\n }\n case 'ZodUnion':\n case 'union': {\n const options = def.options || []\n result.oneOf = options.map((option: ZodTypeAny) => zodToJsonSchema(option, context) ?? {})\n break\n }\n case 'ZodIntersection':\n case 'intersection': {\n result.allOf = [\n zodToJsonSchema(def.left, context) ?? {},\n zodToJsonSchema(def.right, context) ?? {},\n ]\n break\n }\n case 'ZodPipeline':\n case 'pipe': {\n const resolved = zodToJsonSchema(def.out ?? def.innerType ?? def.schema, context) ?? {}\n Object.assign(result, resolved)\n break\n }\n case 'ZodLazy':\n case 'lazy': {\n const next = typeof def.getter === 'function' ? def.getter() : undefined\n const resolved = next ? zodToJsonSchema(next, context) : undefined\n if (resolved) Object.assign(result, resolved)\n break\n }\n case 'ZodPromise':\n case 'promise': {\n const resolved = zodToJsonSchema(def.type, context)\n if (resolved) Object.assign(result, resolved)\n break\n }\n case 'ZodCatch':\n case 'catch': {\n const resolved = zodToJsonSchema(def.innerType ?? def.type, context)\n if (resolved) Object.assign(result, resolved)\n break\n }\n case 'ZodReadonly':\n case 'readonly': {\n const resolved = zodToJsonSchema(def.innerType ?? def.type, context)\n if (resolved) Object.assign(result, resolved)\n break\n }\n case 'ZodArray':\n case 'array': {\n const elementSchema =\n def.type && typeof def.type === 'object'\n ? def.type\n : (def.element && typeof def.element === 'object' ? def.element : undefined)\n result.type = 'array'\n result.items = zodToJsonSchema(elementSchema as ZodTypeAny, context) ?? {}\n if (typeof def.minLength === 'number') result.minItems = def.minLength\n if (typeof def.maxLength === 'number') result.maxItems = def.maxLength\n const checks = normalizeChecks(def.checks)\n for (const check of checks) {\n if (check.kind === 'min_length' && typeof check.value === 'number') result.minItems = check.value\n if (check.kind === 'max_length' && typeof check.value === 'number') result.maxItems = check.value\n if (check.kind === 'length' && typeof check.value === 'number') {\n result.minItems = check.value\n result.maxItems = check.value\n }\n }\n break\n }\n case 'ZodTuple':\n case 'tuple': {\n const items = def.items || []\n result.type = 'array'\n result.prefixItems = items.map((item: ZodTypeAny) => zodToJsonSchema(item, context) ?? {})\n result.minItems = items.length\n result.maxItems = items.length\n break\n }\n case 'ZodRecord':\n case 'record': {\n result.type = 'object'\n const valueSchema = def.valueType ?? def.value\n const valueType = valueSchema ? resolveType(valueSchema._def) : undefined\n if (!valueType || valueType === 'ZodUnknown' || valueType === 'unknown' || valueType === 'ZodAny' || valueType === 'any') {\n result.additionalProperties = true\n } else {\n result.additionalProperties = zodToJsonSchema(valueSchema, context) ?? true\n }\n break\n }\n case 'ZodObject':\n case 'object': {\n result.type = 'object'\n const shape = getShape(def)\n const properties: Record<string, JsonSchema> = {}\n const required: string[] = []\n for (const [key, rawSchema] of Object.entries(shape)) {\n const unwrapped = unwrap(rawSchema as ZodTypeAny)\n const childSchema = zodToJsonSchema(unwrapped.schema, context)\n if (!childSchema) continue\n const baseSchema = childSchema\n let propertySchema: JsonSchema = baseSchema\n if (unwrapped.nullable) {\n propertySchema = {\n anyOf: [{ type: 'null' }, propertySchema],\n }\n }\n if (unwrapped.defaultValue !== undefined) {\n if (propertySchema === baseSchema) {\n propertySchema = { allOf: [baseSchema], default: unwrapped.defaultValue }\n } else {\n propertySchema = { ...propertySchema, default: unwrapped.defaultValue }\n }\n }\n properties[key] = propertySchema\n if (!unwrapped.optional) required.push(key)\n }\n result.properties = properties\n if (required.length > 0) result.required = required\n if (def.unknownKeys === 'passthrough') {\n result.additionalProperties = true\n } else if (def.catchall) {\n const catchallType = resolveType(def.catchall._def)\n if (catchallType === 'ZodNever' || catchallType === 'never') {\n result.additionalProperties = false\n } else if (!catchallType || catchallType === 'ZodUnknown' || catchallType === 'unknown' || catchallType === 'ZodAny' || catchallType === 'any') {\n result.additionalProperties = true\n } else {\n result.additionalProperties = zodToJsonSchema(def.catchall, context) ?? true\n }\n } else {\n result.additionalProperties = false\n }\n break\n }\n case 'ZodDate':\n case 'date':\n result.type = 'string'\n result.format = 'date-time'\n break\n case 'ZodNull':\n case 'null':\n result.type = 'null'\n break\n case 'ZodVoid':\n case 'void':\n case 'ZodNever':\n case 'never':\n break\n case 'ZodAny':\n case 'any':\n case 'ZodUnknown':\n case 'unknown':\n case 'ZodNaN':\n case 'nan':\n default:\n break\n }\n\n if (nullable) {\n if (result.type && result.type !== 'null') {\n result.nullable = true\n } else if (!result.type) {\n const clone = { ...result }\n result.anyOf = [{ type: 'null' }, clone]\n }\n }\n\n return result\n}\n\nfunction generateExample(schema?: ZodTypeAny, ctx?: ExampleGenerationContext): unknown {\n if (!schema) return undefined\n if ((typeof schema !== 'object' || schema === null) && typeof schema !== 'function') return undefined\n const trackable = schema as object\n const context: ExampleGenerationContext = ctx ?? { stack: new WeakSet<ZodTypeAny>() }\n if (context.stack.has(trackable as ZodTypeAny)) return undefined\n context.stack.add(trackable as ZodTypeAny)\n\n try {\n const { schema: inner, optional, nullable, defaultValue } = unwrap(schema)\n if (!inner) {\n if (defaultValue !== undefined) return defaultValue\n if (nullable) return null\n if (optional) return undefined\n return undefined\n }\n const def = (inner as any)._def\n const typeName = resolveType(def) as string | undefined\n if (defaultValue !== undefined) return defaultValue\n\n if (nullable) return null\n if (optional) return undefined\n\n switch (typeName) {\n case 'ZodString':\n case 'string': {\n const checks = normalizeChecks(def?.checks)\n for (const check of checks) {\n if (!check.kind && !check.extra?.format) continue\n if (check.kind === 'uuid' || check.extra?.format === 'uuid') return DEFAULT_EXAMPLE_VALUES.uuid\n if (check.kind === 'email' || check.extra?.format === 'email') return DEFAULT_EXAMPLE_VALUES.email\n if (check.kind === 'url' || check.extra?.format === 'url' || check.extra?.format === 'uri') return DEFAULT_EXAMPLE_VALUES.url\n if (check.kind === 'datetime' || check.extra?.format === 'date-time') return DEFAULT_EXAMPLE_VALUES.datetime\n }\n return DEFAULT_EXAMPLE_VALUES.string\n }\n case 'ZodNumber':\n case 'number': {\n const checks = normalizeChecks(def?.checks)\n const isInt = checks.some((check) => check.kind === 'int' || check.kind === 'isInteger')\n return isInt ? DEFAULT_EXAMPLE_VALUES.integer : DEFAULT_EXAMPLE_VALUES.number\n }\n case 'ZodBigInt':\n case 'bigint':\n return BigInt(1)\n case 'ZodBoolean':\n case 'boolean':\n return DEFAULT_EXAMPLE_VALUES.boolean\n case 'ZodEnum':\n case 'enum': {\n const entries = def?.values ?? def?.entries\n const values = Array.isArray(entries) ? entries : entries ? Object.values(entries) : []\n return values[0]\n }\n case 'ZodNativeEnum': {\n const values = Object.values(def?.values || [])\n return values[0]\n }\n case 'ZodLiteral':\n case 'literal':\n return def?.value ?? (Array.isArray(def?.values) ? def.values[0] : undefined)\n case 'ZodArray':\n case 'array': {\n const elementSchema =\n def?.type && typeof def.type === 'object'\n ? def.type\n : (def?.element && typeof def.element === 'object' ? def.element : undefined)\n const child = generateExample(elementSchema, context)\n return child === undefined ? [] : [child]\n }\n case 'ZodTuple':\n case 'tuple': {\n const items = def?.items || []\n return items.map((item: ZodTypeAny) => generateExample(item, context))\n }\n case 'ZodObject':\n case 'object': {\n const shape = getShape(def)\n const obj: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(shape)) {\n const example = generateExample(value as ZodTypeAny, context)\n if (example !== undefined) obj[key] = example\n }\n return obj\n }\n case 'ZodRecord':\n case 'record': {\n const valueExample = generateExample(def?.valueType ?? def?.value, context)\n return valueExample === undefined ? {} : { key: valueExample }\n }\n case 'ZodUnion':\n case 'union': {\n const options = def?.options || []\n return options.length ? generateExample(options[0], context) : undefined\n }\n case 'ZodPipeline':\n case 'pipe':\n return generateExample(def?.out ?? def?.innerType ?? def?.schema, context)\n case 'ZodLazy':\n case 'lazy': {\n const next = typeof def?.getter === 'function' ? def.getter() : undefined\n return next ? generateExample(next, context) : undefined\n }\n case 'ZodPromise':\n case 'promise':\n return generateExample(def?.type, context)\n case 'ZodCatch':\n case 'catch':\n return generateExample(def?.innerType ?? def?.type, context)\n case 'ZodReadonly':\n case 'readonly':\n return generateExample(def?.innerType ?? def?.type, context)\n case 'ZodIntersection':\n case 'intersection': {\n const left = generateExample(def?.left, context)\n const right = generateExample(def?.right, context)\n if (typeof left === 'object' && left && typeof right === 'object' && right) {\n return { ...(left as object), ...(right as object) }\n }\n return left ?? right\n }\n case 'ZodDate':\n case 'date':\n return DEFAULT_EXAMPLE_VALUES.datetime\n default:\n return undefined\n }\n } finally {\n context.stack.delete(trackable as ZodTypeAny)\n }\n}\n\nfunction buildParameters(\n schema: ZodTypeAny | undefined,\n location: ParameterLocation,\n pathParamNames?: PathParamInfo[]\n): Array<Record<string, unknown>> {\n if (!schema && location !== 'path') return []\n\n const params: Array<Record<string, unknown>> = []\n\n if (location === 'path' && pathParamNames && pathParamNames.length) {\n const merged = mergePathParamSchemas(schema, pathParamNames)\n for (const { name, schema: paramSchema, optional } of merged) {\n const jsonSchema = zodToJsonSchema(paramSchema)\n const example = generateExample(paramSchema)\n const description = extractZodDescription(paramSchema)\n params.push({\n name,\n in: 'path',\n required: !optional,\n schema: jsonSchema ?? { type: 'string' },\n example,\n ...(description ? { description } : {}),\n })\n }\n return params\n }\n\n if (!schema) return params\n\n const { schema: unwrapped } = unwrap(schema)\n if (!unwrapped) return params\n const def = (unwrapped as any)._def\n const typeName = resolveType(def) as string | undefined\n if (typeName === 'ZodObject' || typeName === 'object') {\n const shape = getShape(def)\n for (const [key, raw] of Object.entries(shape)) {\n const details = unwrap(raw as ZodTypeAny)\n if (!details.schema) continue\n const jsonSchema = zodToJsonSchema(details.schema)\n const example = generateExample(details.schema)\n const description = extractZodDescription(raw as ZodTypeAny)\n params.push({\n name: key,\n in: location,\n required: location === 'path' ? true : !details.optional,\n schema: jsonSchema ?? {},\n example,\n ...(description ? { description } : {}),\n })\n }\n } else {\n const jsonSchema = zodToJsonSchema(unwrapped)\n const example = generateExample(unwrapped)\n const description = extractZodDescription(unwrapped)\n params.push({\n name: location === 'header' ? 'X-Custom-Header' : 'value',\n in: location,\n required: location === 'path',\n schema: jsonSchema ?? {},\n example,\n ...(description ? { description } : {}),\n })\n }\n\n return params\n}\n\nfunction mergePathParamSchemas(schema: ZodTypeAny | undefined, params: PathParamInfo[]) {\n const merged: Array<{ name: string; schema: ZodTypeAny | undefined; optional: boolean }> = []\n const map: Record<string, ZodTypeAny> = {}\n if (schema) {\n const { schema: unwrapped } = unwrap(schema)\n if (unwrapped && (unwrapped as any)._def && (resolveType((unwrapped as any)._def) === 'ZodObject' || resolveType((unwrapped as any)._def) === 'object')) {\n const shape = getShape((unwrapped as any)._def)\n for (const [key, value] of Object.entries(shape)) {\n map[key] = value as ZodTypeAny\n }\n }\n }\n for (const param of params) {\n merged.push({\n name: param.name,\n schema: map[param.name],\n optional: !!param.optional,\n })\n }\n return merged\n}\n\nfunction buildRequestBody(request?: OpenApiRequestBodyDoc): Record<string, unknown> | undefined {\n if (!request) return undefined\n const schema = zodToJsonSchema(request.schema)\n const example = request.example ?? generateExample(request.schema)\n const contentType = request.contentType ?? 'application/json'\n return {\n required: true,\n content: {\n [contentType]: {\n schema: schema ?? {},\n example,\n },\n },\n description: request.description,\n }\n}\n\nfunction buildResponses(\n method: HttpMethod,\n responses?: OpenApiResponseDoc[],\n errors?: OpenApiResponseDoc[],\n metadata?: any\n): Record<string, unknown> {\n const entries: Record<string, unknown> = {}\n const list = [...(responses ?? [])]\n const errorList = [...(errors ?? [])]\n const inferredList: OpenApiResponseDoc[] = []\n if (metadata?.requireAuth) {\n inferredList.push({\n status: 401,\n description: 'Unauthorized',\n schema: z.object({ error: z.string() }),\n xAutoGenerated: true,\n })\n }\n if (Array.isArray(metadata?.requireFeatures) && metadata.requireFeatures.length) {\n inferredList.push({\n status: 403,\n description: 'Forbidden \u2013 missing required features',\n schema: z.object({ error: z.string() }),\n xAutoGenerated: true,\n })\n }\n if (!list.some((res) => res.status >= 200 && res.status < 300)) {\n const fallbackStatus = method === 'POST' ? 201 : method === 'DELETE' ? 204 : 200\n list.push({\n status: fallbackStatus,\n description: fallbackStatus === 204 ? 'Success' : 'Success response',\n })\n }\n const setEntry = (res: OpenApiResponseDoc, options?: { skipIfPresent?: boolean }) => {\n const status = String(res.status || 200)\n if (options?.skipIfPresent && Object.prototype.hasOwnProperty.call(entries, status)) return\n const mediaType = res.mediaType ?? 'application/json'\n const schema = res.schema ? zodToJsonSchema(res.schema) : undefined\n const example = res.schema ? res.example ?? generateExample(res.schema) : res.example\n const isNoContent = res.status === 204\n entries[status] = {\n description: res.description ?? '',\n ...(isNoContent\n ? {}\n : {\n content: {\n [mediaType]: {\n schema: schema ?? { type: 'object', description: 'Schema not declared' },\n ...(example !== undefined ? { example } : {}),\n },\n },\n }),\n ...(res.xAutoGenerated ? { 'x-autoGenerated': true } : {}),\n }\n }\n for (const res of [...list, ...errorList]) setEntry(res)\n for (const res of inferredList) setEntry(res, { skipIfPresent: true })\n return entries\n}\n\nfunction buildSecurity(metadata: any, methodDoc?: OpenApiMethodDoc, defaults?: string[]) {\n const securitySchemes = new Set<string>()\n if (Array.isArray(methodDoc?.security)) methodDoc.security.forEach((s) => securitySchemes.add(s))\n if (metadata?.requireAuth) securitySchemes.add('bearerAuth')\n if (defaults) defaults.forEach((s) => securitySchemes.add(s))\n if (securitySchemes.size === 0) return undefined\n return Array.from(securitySchemes.values()).map((scheme) => ({ [scheme]: [] }))\n}\n\nfunction collectExamples(\n querySchema?: ZodTypeAny,\n bodySchema?: ZodTypeAny,\n pathSchema?: ZodTypeAny,\n headerSchema?: ZodTypeAny,\n metadata?: any\n): ExampleMap {\n const examples: ExampleMap = {}\n const queryExample = querySchema ? generateExample(querySchema) : undefined\n if (queryExample && typeof queryExample === 'object') examples.query = queryExample\n const bodyExample = bodySchema ? generateExample(bodySchema) : undefined\n if (bodyExample !== undefined) examples.body = bodyExample\n const pathExample = pathSchema ? generateExample(pathSchema) : undefined\n if (pathExample && typeof pathExample === 'object') examples.path = pathExample as Record<string, unknown>\n const headerExample = headerSchema ? generateExample(headerSchema) : undefined\n if (headerExample && typeof headerExample === 'object') examples.headers = headerExample as Record<string, unknown>\n if (metadata?.requireAuth) {\n if (!examples.headers) examples.headers = {}\n if (typeof examples.headers.authorization !== 'string') {\n examples.headers.authorization = 'Bearer <token>'\n }\n }\n return examples\n}\n\nfunction toFormUrlEncoded(value: unknown): string {\n if (!value || typeof value !== 'object') return ''\n const params = new URLSearchParams()\n for (const [key, raw] of Object.entries(value as Record<string, unknown>)) {\n if (raw === undefined) continue\n params.append(key, raw === null ? '' : String(raw))\n }\n return params.toString()\n}\n\nfunction stringifyBodyExample(value: unknown, mediaType?: string): string {\n if (value === undefined) return ''\n if (mediaType === 'application/x-www-form-urlencoded') {\n return toFormUrlEncoded(value)\n }\n if (!mediaType || mediaType === 'application/json') {\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return ''\n }\n }\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction buildQueryString(example: unknown): string {\n if (!example || typeof example !== 'object') return ''\n const parts: string[] = []\n for (const [key, value] of Object.entries(example as Record<string, unknown>)) {\n if (value === undefined || value === null) continue\n const encoded = encodeURIComponent(String(value))\n parts.push(`${encodeURIComponent(key)}=${encoded}`)\n }\n return parts.length ? `?${parts.join('&')}` : ''\n}\n\nfunction injectPathExamples(path: string, params: PathParamInfo[], examples?: Record<string, unknown>): string {\n if (!params.length) return path\n let result = path\n for (const param of params) {\n const placeholder = `{${param.name}}`\n const example = examples && examples[param.name] !== undefined ? examples[param.name] : `:${param.name}`\n result = result.replace(placeholder, String(example))\n }\n return result\n}\n\nfunction buildCurlSample(\n method: HttpMethod,\n path: string,\n params: PathParamInfo[],\n examples: ExampleMap,\n baseUrl: string,\n metadata: any,\n requestBody?: OpenApiRequestBodyDoc\n): string {\n const lines: string[] = []\n const pathWithExamples = injectPathExamples(path, params, examples.path)\n const query = buildQueryString(examples.query)\n const url = baseUrl.replace(/\\/$/, '') + pathWithExamples + query\n lines.push(`curl -X ${method} \"${url}\"`)\n\n lines.push(' -H \"Accept: application/json\"')\n\n const headers: Record<string, unknown> = { ...(examples.headers ?? {}) }\n if (metadata?.requireAuth && !headers.Authorization && !headers.authorization) {\n headers.Authorization = 'Bearer <token>'\n }\n for (const [key, value] of Object.entries(headers)) {\n lines.push(` -H \"${key.replace(/\"/g, '')}: ${String(value).replace(/\"/g, '')}\"`)\n }\n\n const bodyExample = examples.body ?? requestBody?.example\n const requestContentType = requestBody?.contentType ?? 'application/json'\n if (bodyExample !== undefined) {\n lines.push(` -H \"Content-Type: ${requestContentType}\"`)\n const serialized = stringifyBodyExample(bodyExample, requestContentType)\n if (serialized) {\n const escapedSerialized = escapeShellDoubleQuotes(serialized)\n lines.push(` -d \"${escapedSerialized}\"`)\n }\n }\n\n return lines.join(' \\\\\\n')\n}\n\nfunction escapeShellDoubleQuotes(value: string): string {\n return value.replace(/[\\\\`\"$]/g, '\\\\$&')\n}\n\nfunction ensureSecurityComponents(doc: OpenApiDocument) {\n if (!doc.components) doc.components = {}\n if (!doc.components.securitySchemes) doc.components.securitySchemes = {}\n if (!doc.components.securitySchemes.bearerAuth) {\n doc.components.securitySchemes.bearerAuth = {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n description: 'Send an `Authorization: Bearer <token>` header with a valid API token.',\n }\n }\n}\n\nfunction resolveOperationId(moduleId: string, path: string, method: HttpMethod): string {\n const cleaned = normalizeOperationIdSegment(path)\n return [moduleId, method.toLowerCase(), cleaned].filter(Boolean).join('_')\n}\n\nfunction normalizeOperationIdSegment(input: string): string {\n let output = ''\n let previousUnderscore = false\n\n for (const character of input) {\n const codePoint = character.charCodeAt(0)\n const isLower = codePoint >= 97 && codePoint <= 122\n const isUpper = codePoint >= 65 && codePoint <= 90\n const isNumber = codePoint >= 48 && codePoint <= 57\n const isAlphaNumeric = isLower || isUpper || isNumber\n\n if (isAlphaNumeric) {\n output += character\n previousUnderscore = false\n continue\n }\n\n if (!previousUnderscore) {\n output += '_'\n previousUnderscore = true\n }\n }\n\n while (output.startsWith('_')) output = output.slice(1)\n while (output.endsWith('_')) output = output.slice(0, -1)\n\n return output\n}\n\nfunction collectRouteDoc(api: ModuleApi, moduleId: string): OpenApiRouteDoc | undefined {\n if ('handlers' in api) {\n const route = api as ModuleApiRouteFile & { docs?: OpenApiRouteDoc }\n if (route.docs) return route.docs\n const maybe = (route.handlers as any)?.openApi\n if (maybe && typeof maybe === 'object') return maybe as OpenApiRouteDoc\n } else {\n const legacy = api as ModuleApiLegacy & { docs?: OpenApiMethodDoc }\n if (legacy.docs) {\n return {\n methods: { [legacy.method]: legacy.docs },\n }\n }\n const maybe = (legacy.handler as any)?.openApi\n if (maybe && typeof maybe === 'object') {\n return {\n methods: { [legacy.method]: maybe as OpenApiMethodDoc },\n }\n }\n }\n return undefined\n}\n\nexport function buildOpenApiDocument(modules: Module[], options: OpenApiDocumentOptions = {}): OpenApiDocument {\n const doc: OpenApiDocument = {\n openapi: '3.1.0',\n info: {\n title: options.title ?? 'Open Mercato API',\n version: options.version ?? '1.0.0',\n description: options.description,\n },\n servers: options.servers,\n paths: {},\n }\n\n ensureSecurityComponents(doc)\n\n const includeAccessControlMetadata = options.includeAccessControlMetadata !== false\n const tags = new Map<string, string | undefined>()\n\n for (const moduleEntry of modules) {\n const defaultTag = moduleEntry.info?.title ?? toTitle(moduleEntry.id)\n if (defaultTag) tags.set(defaultTag, moduleEntry.info?.description)\n\n const apis = moduleEntry.apis ?? []\n for (const api of apis) {\n const routeDoc = collectRouteDoc(api, moduleEntry.id)\n const moduleTag = routeDoc?.tag ?? defaultTag\n const normalized = normalizePath((api as any).path ?? (api as any).path ?? '')\n const pathKey = normalized.path\n if (!doc.paths[pathKey]) doc.paths[pathKey] = {}\n const availableMethods: HttpMethod[] =\n 'handlers' in api\n ? HTTP_METHODS.filter((method) => typeof (api as ModuleApiRouteFile).handlers?.[method] === 'function')\n : [api.method as HttpMethod]\n\n for (const method of availableMethods) {\n const methodLower = method.toLowerCase() as Lowercase<HttpMethod>\n const existing = doc.paths[pathKey][methodLower]\n if (existing) continue\n\n const metadata = 'handlers' in api ? (api as ModuleApiRouteFile).metadata?.[method] : undefined\n const methodDoc = routeDoc?.methods?.[method]\n const summary = methodDoc?.summary ?? routeDoc?.summary ?? `${method} ${pathKey}`\n const baseDescription = methodDoc?.description ?? routeDoc?.description\n const meta = metadata && typeof metadata === 'object' ? (metadata as Record<string, unknown>) : undefined\n const requireFeatures = Array.isArray(meta?.['requireFeatures'])\n ? (meta!['requireFeatures'] as string[])\n : undefined\n const requireRoles = Array.isArray(meta?.['requireRoles'])\n ? (meta!['requireRoles'] as string[])\n : undefined\n const requireAuth = meta?.['requireAuth'] === true\n const descriptionParts: string[] = []\n if (baseDescription) descriptionParts.push(baseDescription)\n if (includeAccessControlMetadata && Array.isArray(requireFeatures) && requireFeatures.length) {\n descriptionParts.push(`Requires features: ${requireFeatures.join(', ')}`)\n }\n if (includeAccessControlMetadata && Array.isArray(requireRoles) && requireRoles.length) {\n descriptionParts.push(`Requires roles: ${requireRoles.join(', ')}`)\n }\n\n const querySchema = methodDoc?.query\n const pathSchema = methodDoc?.pathParams ?? routeDoc?.pathParams\n const headerSchema = methodDoc?.headers\n const requestBody = methodDoc?.requestBody\n const examples = collectExamples(querySchema, requestBody?.schema, pathSchema, headerSchema, metadata)\n const curlSample = buildCurlSample(\n method,\n pathKey,\n normalized.params,\n examples,\n options.baseUrlForExamples ?? 'https://api.open-mercato.local',\n metadata,\n requestBody\n )\n\n doc.paths[pathKey][methodLower] = {\n operationId: methodDoc?.operationId ?? resolveOperationId(moduleEntry.id, pathKey, method),\n summary,\n description: descriptionParts.length ? descriptionParts.join('\\n\\n') : undefined,\n tags: methodDoc?.tags ?? (moduleTag ? [moduleTag] : undefined),\n deprecated: methodDoc?.deprecated,\n externalDocs: methodDoc?.externalDocs,\n parameters: [\n ...buildParameters(pathSchema, 'path', normalized.params),\n ...buildParameters(querySchema, 'query'),\n ...buildParameters(headerSchema, 'header'),\n ].filter(Boolean),\n requestBody: buildRequestBody(requestBody),\n responses: buildResponses(method, methodDoc?.responses, methodDoc?.errors, metadata),\n security: buildSecurity(metadata, methodDoc, options.defaultSecurity),\n 'x-codeSamples': methodDoc?.codeSamples ?? [\n {\n lang: 'curl',\n label: 'cURL',\n source: curlSample,\n },\n ],\n ...(includeAccessControlMetadata && Array.isArray(requireFeatures) && requireFeatures.length\n ? { 'x-require-features': requireFeatures }\n : {}),\n ...(includeAccessControlMetadata && Array.isArray(requireRoles) && requireRoles.length\n ? { 'x-require-roles': requireRoles }\n : {}),\n ...(requireAuth ? { 'x-require-auth': true } : {}),\n ...(methodDoc?.extensions ?? {}),\n }\n }\n }\n }\n\n doc.tags = Array.from(tags.entries()).map(([name, description]) => ({\n name,\n description: description ?? undefined,\n }))\n\n return doc\n}\n\nfunction formatMarkdownTable(rows: Array<[string, string, string, string]>): string {\n if (!rows.length) return ''\n const header = ['Name', 'Location', 'Type', 'Description']\n const align = ['---', '---', '---', '---']\n const lines = [\n `| ${header.join(' | ')} |`,\n `| ${align.join(' | ')} |`,\n ...rows.map((row) => `| ${row.join(' | ')} |`),\n ]\n return lines.join('\\n')\n}\n\nfunction schemaTypeLabel(schema: any): string {\n if (!schema) return 'any'\n if (schema.type) return schema.type\n if (schema.oneOf) return schema.oneOf.map(schemaTypeLabel).join(' | ')\n if (schema.allOf) return schema.allOf.map(schemaTypeLabel).join(' & ')\n return 'any'\n}\n\nfunction schemaHasDetails(schema: unknown): boolean {\n if (!schema || typeof schema !== 'object') return false\n const schemaObj = schema as Record<string, unknown>\n if (Array.isArray(schemaObj.enum) && schemaObj.enum.length) return true\n if (schemaObj.const !== undefined) return true\n if (typeof schemaObj.format === 'string') return true\n if (Array.isArray(schemaObj.oneOf) && schemaObj.oneOf.some((s: unknown) => schemaHasDetails(s))) return true\n if (Array.isArray(schemaObj.anyOf) && schemaObj.anyOf.some((s: unknown) => schemaHasDetails(s))) return true\n if (Array.isArray(schemaObj.allOf) && schemaObj.allOf.some((s: unknown) => schemaHasDetails(s))) return true\n if (schemaObj.items && schemaHasDetails(schemaObj.items)) return true\n if (schemaObj.properties && Object.keys(schemaObj.properties as Record<string, unknown>).length) return true\n if (Array.isArray(schemaObj.prefixItems) && schemaObj.prefixItems.some((s: unknown) => schemaHasDetails(s))) return true\n if (schemaObj.type && schemaObj.type !== 'object') return true\n return false\n}\n\ntype ContentSelection = {\n mediaType: string\n entry: any\n}\n\ntype DisplaySnippet = {\n value: string\n language: string\n}\n\nfunction selectContentVariant(content?: Record<string, any>): ContentSelection | undefined {\n if (!content) return undefined\n const entries = Object.entries(content)\n if (!entries.length) return undefined\n const preferred = [\n 'application/json',\n 'application/x-www-form-urlencoded',\n 'multipart/form-data',\n 'text/plain',\n ]\n for (const mediaType of preferred) {\n const match = entries.find(([type]) => type === mediaType)\n if (match) {\n const [selectedType, entry] = match\n return { mediaType: selectedType, entry }\n }\n }\n const [mediaType, entry] = entries[0]\n return { mediaType, entry }\n}\n\nfunction formatExampleForDisplay(example: unknown, mediaType?: string): DisplaySnippet | null {\n if (example === undefined) return null\n if (mediaType === 'application/x-www-form-urlencoded') {\n const encoded = toFormUrlEncoded(example)\n if (!encoded) return null\n return { value: encoded, language: 'text' }\n }\n if (mediaType === 'multipart/form-data') {\n if (example && typeof example === 'object') {\n const lines = Object.entries(example as Record<string, unknown>).map(([key, value]) => {\n const rendered = value === undefined || value === null ? '' : String(value)\n return `${key}=${rendered}`\n })\n if (lines.length) {\n return { value: lines.join('\\n'), language: 'text' }\n }\n }\n if (typeof example === 'string') {\n return { value: example, language: 'text' }\n }\n }\n if (!mediaType || mediaType === 'application/json') {\n try {\n return { value: JSON.stringify(example, null, 2), language: 'json' }\n } catch {\n return null\n }\n }\n if (typeof example === 'string') {\n return { value: example, language: 'text' }\n }\n try {\n return { value: JSON.stringify(example, null, 2), language: 'json' }\n } catch {\n return { value: String(example), language: 'text' }\n }\n}\n\nfunction formatSchemaForDisplay(schema: any): DisplaySnippet | null {\n if (!schema) return null\n try {\n return { value: JSON.stringify(schema, null, 2), language: 'json' }\n } catch {\n return null\n }\n}\n\nexport function generateMarkdownFromOpenApi(doc: OpenApiDocument): string {\n const lines: string[] = []\n lines.push(`# ${doc.info.title}`)\n lines.push('')\n lines.push(`Version: ${doc.info.version}`)\n if (doc.info.description) {\n lines.push('')\n lines.push(doc.info.description)\n }\n if (doc.servers && doc.servers.length) {\n lines.push('')\n lines.push('## Servers')\n for (const server of doc.servers) {\n lines.push(`- ${server.url}${server.description ? ` \u2013 ${server.description}` : ''}`)\n }\n }\n\n const sortedPaths = Object.keys(doc.paths).sort((a, b) => a.localeCompare(b))\n for (const path of sortedPaths) {\n const operations = doc.paths[path]\n const methods = Object.keys(operations).sort((a, b) => a.localeCompare(b))\n for (const method of methods) {\n const op: any = operations[method]\n lines.push('')\n lines.push(`## ${method.toUpperCase()} \\`${path}\\``)\n if (op.summary) {\n lines.push('')\n lines.push(op.summary)\n }\n if (op.description) {\n lines.push('')\n lines.push(op.description)\n }\n if (op.tags && op.tags.length) {\n lines.push('')\n lines.push(`**Tags:** ${op.tags.join(', ')}`)\n }\n if (op['x-require-auth']) {\n lines.push('')\n lines.push(`**Requires authentication.**`)\n }\n if (op['x-require-features']) {\n lines.push('')\n lines.push(`**Features:** ${(op['x-require-features'] as string[]).join(', ')}`)\n }\n if (op['x-require-roles']) {\n lines.push('')\n lines.push(`**Roles:** ${(op['x-require-roles'] as string[]).join(', ')}`)\n }\n\n const parameters = (op.parameters as any[]) ?? []\n if (parameters.length) {\n lines.push('')\n lines.push('### Parameters')\n const rows: Array<[string, string, string, string]> = parameters.map((p) => {\n const requiredLabel = p.required ? 'Required' : 'Optional'\n const descriptionParts = [requiredLabel, p.description].filter(Boolean)\n return [\n p.name,\n p.in,\n schemaTypeLabel(p.schema),\n descriptionParts.join('. '),\n ]\n })\n lines.push(formatMarkdownTable(rows))\n }\n\n if (op.requestBody) {\n const selection = selectContentVariant(op.requestBody.content)\n if (selection) {\n const { mediaType, entry } = selection\n const example = entry?.example ?? entry?.examples?.default?.value\n const formatted = formatExampleForDisplay(example, mediaType)\n const schemaFormatted =\n entry?.schema && schemaHasDetails(entry.schema) ? formatSchemaForDisplay(entry.schema) : null\n lines.push('')\n lines.push('### Request Body')\n lines.push('')\n lines.push(`Content-Type: \\`${mediaType}\\``)\n if (formatted) {\n lines.push('')\n lines.push(`\\`\\`\\`${formatted.language}`)\n lines.push(formatted.value)\n lines.push('```')\n } else if (schemaFormatted) {\n lines.push('')\n lines.push(`\\`\\`\\`${schemaFormatted.language}`)\n lines.push(schemaFormatted.value)\n lines.push('```')\n } else {\n lines.push('')\n lines.push('No example available for this content type.')\n }\n }\n }\n\n const responses = op.responses ?? {}\n const responseStatuses = Object.keys(responses).sort((a, b) => a.localeCompare(b))\n if (responseStatuses.length) {\n lines.push('')\n lines.push('### Responses')\n for (const status of responseStatuses) {\n const response = responses[status]\n if (response?.['x-autoGenerated']) continue\n lines.push('')\n lines.push(`**${status}** \u2013 ${response.description || 'Response'}`)\n const selection = selectContentVariant(response.content)\n if (selection) {\n const { mediaType, entry } = selection\n const example = entry?.example ?? entry?.examples?.default?.value\n const formatted = formatExampleForDisplay(example, mediaType)\n const schemaFormatted =\n entry?.schema && schemaHasDetails(entry.schema) ? formatSchemaForDisplay(entry.schema) : null\n lines.push('')\n lines.push(`Content-Type: \\`${mediaType}\\``)\n if (formatted) {\n lines.push('')\n lines.push(`\\`\\`\\`${formatted.language}`)\n lines.push(formatted.value)\n lines.push('```')\n } else if (schemaFormatted) {\n lines.push('')\n lines.push(`\\`\\`\\`${schemaFormatted.language}`)\n lines.push(schemaFormatted.value)\n lines.push('```')\n }\n }\n }\n }\n\n const samples = op['x-codeSamples'] as any[] | undefined\n if (samples && samples.length) {\n const curl = samples.find((sample) => String(sample.lang).toLowerCase() === 'curl') ?? samples[0]\n if (curl?.source) {\n lines.push('')\n lines.push('### Example')\n lines.push('')\n lines.push('```bash')\n lines.push(curl.source)\n lines.push('```')\n }\n }\n }\n }\n\n return lines.join('\\n')\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["mediaType", "entry"]
7
7
  }