@workos/oagen-emitters 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/.github/workflows/ci.yml +1 -1
  2. package/.github/workflows/lint.yml +1 -1
  3. package/.github/workflows/release-please.yml +2 -2
  4. package/.github/workflows/release.yml +1 -1
  5. package/.husky/pre-push +11 -0
  6. package/.node-version +1 -1
  7. package/.release-please-manifest.json +1 -1
  8. package/CHANGELOG.md +8 -0
  9. package/README.md +35 -224
  10. package/dist/index.d.mts +9 -1
  11. package/dist/index.d.mts.map +1 -1
  12. package/dist/index.mjs +2 -15234
  13. package/dist/plugin-BSop9f9z.mjs +21471 -0
  14. package/dist/plugin-BSop9f9z.mjs.map +1 -0
  15. package/dist/plugin.d.mts +7 -0
  16. package/dist/plugin.d.mts.map +1 -0
  17. package/dist/plugin.mjs +2 -0
  18. package/docs/sdk-architecture/dotnet.md +5 -5
  19. package/oagen.config.ts +5 -373
  20. package/package.json +10 -34
  21. package/src/dotnet/index.ts +6 -4
  22. package/src/dotnet/models.ts +58 -82
  23. package/src/dotnet/naming.ts +44 -6
  24. package/src/dotnet/resources.ts +350 -29
  25. package/src/dotnet/tests.ts +44 -24
  26. package/src/dotnet/type-map.ts +44 -17
  27. package/src/dotnet/wrappers.ts +21 -10
  28. package/src/go/client.ts +35 -3
  29. package/src/go/enums.ts +4 -0
  30. package/src/go/index.ts +10 -5
  31. package/src/go/models.ts +6 -1
  32. package/src/go/resources.ts +534 -73
  33. package/src/go/tests.ts +39 -3
  34. package/src/go/type-map.ts +8 -3
  35. package/src/go/wrappers.ts +79 -21
  36. package/src/index.ts +14 -0
  37. package/src/kotlin/client.ts +7 -2
  38. package/src/kotlin/enums.ts +30 -3
  39. package/src/kotlin/models.ts +97 -6
  40. package/src/kotlin/naming.ts +7 -1
  41. package/src/kotlin/resources.ts +370 -39
  42. package/src/kotlin/tests.ts +120 -6
  43. package/src/node/client.ts +38 -11
  44. package/src/node/field-plan.ts +12 -14
  45. package/src/node/fixtures.ts +39 -3
  46. package/src/node/models.ts +281 -37
  47. package/src/node/resources.ts +156 -52
  48. package/src/node/tests.ts +76 -27
  49. package/src/node/type-map.ts +1 -31
  50. package/src/node/utils.ts +96 -6
  51. package/src/node/wrappers.ts +31 -1
  52. package/src/php/models.ts +0 -33
  53. package/src/php/resources.ts +199 -18
  54. package/src/php/tests.ts +26 -2
  55. package/src/php/type-map.ts +16 -2
  56. package/src/php/wrappers.ts +6 -2
  57. package/src/plugin.ts +50 -0
  58. package/src/python/client.ts +13 -3
  59. package/src/python/enums.ts +28 -3
  60. package/src/python/index.ts +35 -27
  61. package/src/python/models.ts +138 -1
  62. package/src/python/resources.ts +234 -17
  63. package/src/python/tests.ts +260 -16
  64. package/src/python/type-map.ts +16 -2
  65. package/src/ruby/client.ts +238 -0
  66. package/src/ruby/enums.ts +149 -0
  67. package/src/ruby/index.ts +93 -0
  68. package/src/ruby/manifest.ts +35 -0
  69. package/src/ruby/models.ts +360 -0
  70. package/src/ruby/naming.ts +187 -0
  71. package/src/ruby/rbi.ts +313 -0
  72. package/src/ruby/resources.ts +799 -0
  73. package/src/ruby/tests.ts +459 -0
  74. package/src/ruby/type-map.ts +97 -0
  75. package/src/ruby/wrappers.ts +161 -0
  76. package/src/shared/model-utils.ts +131 -7
  77. package/src/shared/naming-utils.ts +36 -0
  78. package/src/shared/non-spec-services.ts +13 -0
  79. package/src/shared/resolved-ops.ts +75 -1
  80. package/test/dotnet/client.test.ts +2 -2
  81. package/test/dotnet/models.test.ts +7 -9
  82. package/test/dotnet/resources.test.ts +135 -3
  83. package/test/dotnet/tests.test.ts +5 -5
  84. package/test/entrypoint.test.ts +89 -0
  85. package/test/go/client.test.ts +6 -6
  86. package/test/go/resources.test.ts +156 -7
  87. package/test/kotlin/models.test.ts +1 -1
  88. package/test/kotlin/resources.test.ts +210 -0
  89. package/test/node/models.test.ts +134 -1
  90. package/test/node/resources.test.ts +134 -26
  91. package/test/node/utils.test.ts +140 -0
  92. package/test/php/models.test.ts +5 -4
  93. package/test/php/resources.test.ts +66 -1
  94. package/test/plugin.test.ts +50 -0
  95. package/test/python/client.test.ts +56 -0
  96. package/test/python/models.test.ts +99 -0
  97. package/test/python/resources.test.ts +294 -0
  98. package/test/python/tests.test.ts +91 -0
  99. package/test/ruby/client.test.ts +81 -0
  100. package/test/ruby/resources.test.ts +386 -0
  101. package/test/shared/resolved-ops.test.ts +122 -0
  102. package/tsdown.config.ts +1 -1
  103. package/dist/index.mjs.map +0 -1
  104. package/scripts/generate-php.js +0 -13
  105. package/scripts/git-push-with-published-oagen.sh +0 -21
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["buildHiddenParams","articleFor","fileName","fieldName","servicePropertyName","resolveClassName","resolveServiceDir","resolveMethodName","mapTypeRef","mapPrimitive","irMapTypeRef","joinUnionVariants","yamlLoad","mapTypeRef","fieldName","resolveServiceDir","resolveMethodName","generateEnums","assignEnumsToServices","resolveServiceDir","fileName","tsMapTypeRef","fileName","fieldName","fileName","generateModels","collectFieldDependencies","assignEnumsToServices","fieldName","mapTypeRef","ID_PREFIXES","generateFixtures","assignModelsToServices","resolveServiceDir","fileName","generateModelFixture","resolveResourceClassName","unwrapListModel","generateFieldValue","generatePrimitiveValue","generateWrapperMethods","emitWrapperMethod","fieldName","mapTypeRef","tsLiteral","clientFieldExpression","buildPathStr","resolveResourceClassName","singularize","resolveServiceDir","resolveMethodName","fileName","fieldName","generateResources","unwrapListModel","assignEnumsToServices","generateWrapperMethods","mapTypeRef","clientFieldExpression","generateClient","generateWorkOSClient","resolveResourceClassName","resolveServiceDir","fileName","servicePropertyName","fileName","generateTests","generateFixtures","servicePropertyName","resolveResourceClassName","generateServiceTest","resolveServiceDir","fileName","resolveMethodName","unwrapListModel","fieldName","buildExpectedPath","ID_PREFIXES","assignModelsToServices","generateManifest","servicePropertyName","resolveResourceClassName","resolveMethodName","ensureTrailingNewlines","generateEnums","generateResources","generateClient","generateTests","generateManifest","fs","path","className","fileName","fieldName","servicePropertyName","resolveMethodName","resolveClassName","mapTypeRef","irMapTypeRef","mapPrimitive","className","joinUnionVariants","generateEnums","collectEnumAliasOf","className","fileName","generateModels","className","fileName","fieldName","mapTypeRef","emitWrapperMethod","fieldName","className","clientFieldExpression","fieldName","resolveResourceClassName","resolveClassName","buildHiddenParamsShared","isRedirectEndpoint","className","buildPathString","clientFieldExpression","generateResources","fileName","generateClient","deduplicateByMount","buildServiceAccessPaths","servicePropertyName","resolveResourceClassName","className","ID_PREFIXES","generateFixtures","generateModelFixture","fileName","unwrapListModel","fieldName","generateFieldValue","generatePrimitiveValue","isRedirectEndpoint","generateTests","generateFixtures","buildServiceAccessPaths","resolveResourceClassName","generateServiceTest","className","buildHiddenParams","resolveMethodName","fileName","buildTestArgs","buildExpectedPath","generateTestValue","fieldName","generateModelFixture","generateManifest","buildServiceAccessPaths","resolveMethodName","ensureTrailingNewlines","generateModels","generateEnums","generateResources","generateClient","generateTests","generateManifest","fs","path","className","resolveMethodName","fieldName","mapTypeRef","irMapTypeRef","mapPrimitive","className","joinUnionVariants","generateModels","structuralHash","className","fieldName","mapTypeRef","generateEnums","className","generateWrapperMethods","emitWrapperMethod","fieldName","className","mapTypeRef","phpLiteral","isEnumType","clientFieldExpression","generateResources","className","resolveMethodName","generateWrapperMethods","generateMethod","fieldName","clientFieldExpression","mapTypeRef","generateClient","deduplicateByMount","buildServiceAccessPaths","className","ID_PREFIXES","generateFixtures","generateModelFixture","unwrapListModel","generateFieldValue","generatePrimitiveValue","generateTests","className","generateFixtures","resolveMethodName","buildHiddenParams","buildExpectedPath","generateManifest","buildServiceAccessPaths","resolveMethodName","ensureTrailingNewlines","generateModels","generateEnums","generateResources","generateClient","generateTests","generateManifest","fs","path","className","methodName","fieldName","resolveMethodName","trimMountedResourceFromMethod","resolveClassName","splitPascalWords","singularize","wordsMatch","mapTypeRef","irMapTypeRef","mapPrimitive","className","joinUnionVariants","generateModels","structuralHash","className","lowerFirst","humanize","articleFor","fieldName","makeOptional","mapTypeRef","HUMANIZE_ACRONYMS","HUMANIZE_RESTORE","generateEnums","collectEnumAliasOf","className","humanize","generateWrapperMethods","goMethodName","goFieldName","emitWrapperMethod","goClassName","sortPathParamsByTemplateOrder","goLiteral","clientFieldExpression","GO_RESERVED","sortPathParamsByTemplateOrder","resolveResourceClassName","resolveClassName","generateResources","generateServiceFile","serviceTypeName","resolveGoMethodName","generateMethod","generateWrapperMethods","methodName","resolveMethodName","className","buildHiddenParams","fieldName","mapTypeRef","buildPathExpr","clientFieldExpression","singularizePascal","generateClient","deduplicateByMount","buildServiceAccessPaths","resolveResourceClassName","ID_PREFIXES","generateFixtures","generateModelFixture","unwrapListModel","fieldName","generateFieldValue","generatePrimitiveValue","generateTests","generateFixtures","buildServiceAccessPaths","resolveResourceClassName","generateServiceTest","buildHiddenParams","buildExpectedPath","buildMethodCallArgs","buildFixtureAssertions","goMethodName","sortPathParamsByTemplateOrder","resolveMethodName","goFieldName","ID_PREFIXES","generateManifest","buildServiceAccessPaths","resolveMethodName","ensureTrailingNewlines","generateModels","generateEnums","generateResources","generateClient","generateTests","generateManifest","escapeXml","mapTypeRef","irMapTypeRef","escapeXml","mapTypeRef","csMethodName","csClassName","escapeXml","csFieldName","mapTypeRef","resolveCsMethodName","buildHiddenParams","escapeXml","mapTypeRef","csMethodName","buildHiddenParams","csFieldName","fs","path"],"sources":["../src/shared/resolved-ops.ts","../src/shared/naming-utils.ts","../src/node/naming.ts","../src/node/type-map.ts","../node_modules/js-yaml/dist/js-yaml.mjs","../src/shared/model-utils.ts","../src/node/utils.ts","../src/node/enums.ts","../src/node/field-plan.ts","../src/node/models.ts","../src/node/fixtures.ts","../src/node/sdk-errors.ts","../src/shared/wrapper-utils.ts","../src/node/wrappers.ts","../src/node/resources.ts","../src/node/client.ts","../src/node/errors.ts","../src/node/tests.ts","../src/node/manifest.ts","../src/node/index.ts","../src/python/naming.ts","../src/python/type-map.ts","../src/python/enums.ts","../src/python/models.ts","../src/python/wrappers.ts","../src/python/resources.ts","../src/shared/non-spec-services.ts","../src/python/client.ts","../src/python/fixtures.ts","../src/python/tests.ts","../src/python/manifest.ts","../src/python/index.ts","../src/php/naming.ts","../src/php/type-map.ts","../src/php/utils.ts","../src/php/models.ts","../src/php/enums.ts","../src/php/wrappers.ts","../src/php/resources.ts","../src/php/client.ts","../src/php/fixtures.ts","../src/php/tests.ts","../src/php/manifest.ts","../src/php/index.ts","../src/go/naming.ts","../src/go/type-map.ts","../src/go/models.ts","../src/go/enums.ts","../src/go/wrappers.ts","../src/go/resources.ts","../src/go/client.ts","../src/go/fixtures.ts","../src/go/tests.ts","../src/go/manifest.ts","../src/go/index.ts","../src/dotnet/naming.ts","../src/dotnet/type-map.ts","../src/dotnet/models.ts","../src/dotnet/enums.ts","../src/dotnet/wrappers.ts","../src/dotnet/resources.ts","../src/dotnet/client.ts","../src/dotnet/fixtures.ts","../src/dotnet/tests.ts","../src/dotnet/manifest.ts","../src/dotnet/index.ts"],"sourcesContent":["import type { Operation, EmitterContext, Service, ResolvedOperation } from '@workos/oagen';\nimport { toPascalCase } from '@workos/oagen';\n\n/**\n * Build a lookup map from \"METHOD /path\" to ResolvedOperation.\n * Used by emitters to find the resolved method name for any IR operation.\n */\nexport function buildResolvedLookup(ctx: EmitterContext): Map<string, ResolvedOperation> {\n const map = new Map<string, ResolvedOperation>();\n for (const r of ctx.resolvedOperations ?? []) {\n const key = `${r.operation.httpMethod.toUpperCase()} ${r.operation.path}`;\n map.set(key, r);\n }\n return map;\n}\n\n/**\n * Look up the resolved method name for an operation.\n * Returns the snake_case resolved name, or undefined if not found.\n */\nexport function lookupMethodName(op: Operation, lookup: Map<string, ResolvedOperation>): string | undefined {\n const key = `${op.httpMethod.toUpperCase()} ${op.path}`;\n return lookup.get(key)?.methodName;\n}\n\n/**\n * Look up the full ResolvedOperation for an IR operation.\n */\nexport function lookupResolved(op: Operation, lookup: Map<string, ResolvedOperation>): ResolvedOperation | undefined {\n const key = `${op.httpMethod.toUpperCase()} ${op.path}`;\n return lookup.get(key);\n}\n\n/**\n * A mount group: a set of resolved operations that all mount on the same target.\n * Serves the same role as a Service in the old architecture, but operations may\n * come from multiple IR services.\n */\nexport interface MountGroup {\n /** PascalCase mount target name (e.g., \"SSO\", \"UserManagement\"). */\n name: string;\n /** All resolved operations in this group. */\n resolvedOps: ResolvedOperation[];\n /** The raw IR operations (convenience — same as resolvedOps[*].operation). */\n operations: Operation[];\n}\n\n/**\n * Group resolved operations by their mountOn target.\n * Returns a map from PascalCase mount target to MountGroup.\n */\nexport function groupByMount(ctx: EmitterContext): Map<string, MountGroup> {\n const groups = new Map<string, MountGroup>();\n for (const r of ctx.resolvedOperations ?? []) {\n let group = groups.get(r.mountOn);\n if (!group) {\n group = { name: r.mountOn, resolvedOps: [], operations: [] };\n groups.set(r.mountOn, group);\n }\n group.resolvedOps.push(r);\n group.operations.push(r.operation);\n }\n return groups;\n}\n\n/**\n * Get the mount target for an IR service.\n * Checks the first resolved operation that belongs to this service.\n * Falls back to PascalCase of the service name if no resolved ops exist.\n */\nexport function getMountTarget(service: Service, ctx: EmitterContext): string {\n for (const r of ctx.resolvedOperations ?? []) {\n if (r.service.name === service.name) return r.mountOn;\n }\n return toPascalCase(service.name);\n}\n\n// ---------------------------------------------------------------------------\n// Defaults / inferFromClient helpers\n//\n// For non-split operations with operationHints that specify `defaults` or\n// `inferFromClient`, oagen attaches these properties at runtime but they\n// are not part of the ResolvedOperation TypeScript interface (they live on\n// ResolvedWrapper for split operations). These helpers provide type-safe\n// access so individual emitters don't need `as any` casts.\n// ---------------------------------------------------------------------------\n\n/** Extract constant defaults from a resolved operation (if any). */\nexport function getOpDefaults(resolvedOp?: ResolvedOperation): Record<string, string | number | boolean> {\n return ((resolvedOp as any)?.defaults as Record<string, string | number | boolean> | undefined) ?? {};\n}\n\n/** Extract inferFromClient fields from a resolved operation (if any). */\nexport function getOpInferFromClient(resolvedOp?: ResolvedOperation): string[] {\n return ((resolvedOp as any)?.inferFromClient as string[] | undefined) ?? [];\n}\n\n/** Build the set of param names hidden from the public API (injected as defaults or inferred from client config). */\nexport function buildHiddenParams(resolvedOp?: ResolvedOperation): Set<string> {\n const hidden = new Set<string>();\n for (const key of Object.keys(getOpDefaults(resolvedOp))) hidden.add(key);\n for (const key of getOpInferFromClient(resolvedOp)) hidden.add(key);\n return hidden;\n}\n\n/** Check whether a resolved operation has any hidden params. */\nexport function hasHiddenParams(resolvedOp?: ResolvedOperation): boolean {\n return Object.keys(getOpDefaults(resolvedOp)).length > 0 || getOpInferFromClient(resolvedOp).length > 0;\n}\n","// ---------------------------------------------------------------------------\n// Shared acronym fixes\n// ---------------------------------------------------------------------------\n\n/**\n * Base set of acronym corrections applied after PascalCase conversion.\n * These are domain-specific terms that `toPascalCase` produces as e.g.\n * \"Sso\" but should be rendered as \"SSO\" in every SDK language.\n *\n * Language emitters can extend this with additional entries (e.g. Go adds\n * API, URL, HTTP, JSON, etc. per Go naming conventions).\n */\nexport const BASE_ACRONYM_FIXES: readonly [RegExp, string][] = [\n [/Workos/g, 'WorkOS'],\n [/Sso/g, 'SSO'],\n [/Mfa/g, 'MFA'],\n [/Jwt/g, 'JWT'],\n [/Cors/g, 'CORS'],\n [/Saml/g, 'SAML'],\n [/Scim/g, 'SCIM'],\n [/Rbac/g, 'RBAC'],\n [/Oauth/g, 'OAuth'],\n [/Oidc/g, 'OIDC'],\n];\n\n/**\n * Apply acronym corrections to a PascalCase string.\n * Uses the base set by default; pass extra entries for language-specific\n * conventions (e.g. Go's `[/Api(?=[A-Z]|$)/g, 'API']`).\n */\nexport function applyAcronymFixes(s: string, extra?: readonly [RegExp, string][]): string {\n let result = s;\n for (const [pattern, replacement] of BASE_ACRONYM_FIXES) {\n result = result.replace(pattern, replacement);\n }\n if (extra) {\n for (const [pattern, replacement] of extra) {\n result = result.replace(pattern, replacement);\n }\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// URN stripping\n// ---------------------------------------------------------------------------\n\n/** Strip URN OAuth grant-type prefixes from discriminator-derived schema names. */\nexport function stripUrnPrefix(name: string): string {\n // Handles both OAuth and Oauth casing from different PascalCase implementations\n return name.replace(/^Urn(?:IetfParams|Workos)O[Aa]uthGrantType/, '');\n}\n\n/**\n * Build the GoDoc prefix for a field comment.\n * If the description already starts with a verb (e.g., \"Distinguishes...\", \"Indicates...\"),\n * returns just the lowered description. Otherwise prepends \"is \".\n *\n * fieldDocComment(\"ID\", \"the unique identifier\") → \"ID is the unique identifier\"\n * fieldDocComment(\"Object\", \"Distinguishes the X\") → \"Object distinguishes the X\"\n */\nexport function fieldDocComment(fieldName: string, description: string): string {\n const lowered = lowerFirstForDoc(description);\n if (startsWithVerb(lowered)) {\n return `${fieldName} ${lowered}`;\n }\n return `${fieldName} is ${lowered}`;\n}\n\n/** Known English 3rd-person-singular verbs that appear as OpenAPI description starters. */\nconst VERB_STARTERS = new Set([\n 'distinguishes',\n 'indicates',\n 'represents',\n 'contains',\n 'specifies',\n 'determines',\n 'controls',\n 'defines',\n 'identifies',\n 'describes',\n 'returns',\n 'creates',\n 'deletes',\n 'updates',\n 'lists',\n 'provides',\n 'enables',\n 'disables',\n 'allows',\n 'prevents',\n 'triggers',\n 'marks',\n 'tracks',\n 'stores',\n 'holds',\n 'maps',\n 'links',\n 'connects',\n 'wraps',\n 'denotes',\n 'shows',\n 'tells',\n 'gives',\n 'takes',\n 'sets',\n 'gets',\n 'configures',\n 'manages',\n 'validates',\n 'authenticates',\n 'authorizes',\n 'verifies',\n 'limits',\n 'restricts',\n 'overrides',\n 'applies',\n]);\n\nfunction startsWithVerb(desc: string): boolean {\n const firstWord = desc\n .split(/\\s/)[0]\n .toLowerCase()\n .replace(/[^a-z]/g, '');\n return VERB_STARTERS.has(firstWord);\n}\n\n/**\n * Select the correct indefinite article (\"a\" or \"an\") for a word.\n */\nexport function articleFor(word: string): string {\n return /^[aeiou]/i.test(word) ? 'an' : 'a';\n}\n\n/**\n * Lowercase the first character of a string for doc comments/descriptions.\n * Handles acronyms: \"SSO-specific\" becomes \"sso-specific\" not \"sSO-specific\".\n * \"JSONSchema\" becomes \"jsonSchema\", \"IP Address\" becomes \"ip Address\".\n */\nexport function lowerFirstForDoc(s: string): string {\n if (!s) return s;\n const acronymMatch = s.match(/^[A-Z]{2,}/);\n if (acronymMatch) {\n const acronym = acronymMatch[0];\n const nextChar = s[acronym.length];\n // If followed by a lowercase letter (e.g. \"SSOAuth\"), keep the last\n // uppercase char as the start of the next camelCase word.\n if (nextChar && /[a-z]/.test(nextChar)) {\n return acronym.slice(0, -1).toLowerCase() + acronym.slice(-1) + s.slice(acronym.length);\n }\n return acronym.toLowerCase() + s.slice(acronym.length);\n }\n return s.charAt(0).toLowerCase() + s.slice(1);\n}\n","import type { Operation, Service, EmitterContext } from '@workos/oagen';\nimport { toPascalCase, toCamelCase, toKebabCase, toSnakeCase } from '@workos/oagen';\nimport { buildResolvedLookup, lookupMethodName } from '../shared/resolved-ops.js';\nimport { stripUrnPrefix } from '../shared/naming-utils.js';\n\n/** Strip spec-noise suffixes (e.g., \"Dto\") from an IR name. */\nexport function stripNoiseSuffixes(name: string): string {\n return name.replace(/Dto$/i, '');\n}\n\n/** PascalCase class/interface name. */\nexport function className(name: string): string {\n return toPascalCase(stripUrnPrefix(name));\n}\n\n/** kebab-case file name (without extension). */\nexport function fileName(name: string): string {\n return toKebabCase(stripUrnPrefix(name));\n}\n\n/** camelCase method name. */\nexport function methodName(name: string): string {\n return toCamelCase(name);\n}\n\n/** camelCase field name for domain interfaces. */\nexport function fieldName(name: string): string {\n return toCamelCase(name);\n}\n\n/** snake_case field name for wire/response interfaces. */\nexport function wireFieldName(name: string): string {\n return toSnakeCase(name);\n}\n\n/**\n * Wire/response interface name. Uses \"Wire\" suffix when the domain name\n * already ends in \"Response\" to avoid stuttering (e.g., FooResponseResponse).\n */\nexport function wireInterfaceName(domainName: string): string {\n return domainName.endsWith('Response') ? `${domainName}Wire` : `${domainName}Response`;\n}\n\n/** kebab-case service directory name. */\nexport function serviceDirName(name: string): string {\n return toKebabCase(name);\n}\n\n/** camelCase property name for service accessors on the client. */\nexport function servicePropertyName(name: string): string {\n return toCamelCase(name);\n}\n\n/**\n * Resolve the effective service name, using the overlay-resolved class name\n * when available. This ensures directory names, file names, and property names\n * all derive from the same resolved name (e.g., \"Mfa\" instead of \"MultiFactorAuth\").\n */\nexport function resolveServiceName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n/**\n * Build a map from IR service name → resolved service name.\n * Used to translate modelToService/enumToService map values to overlay-resolved\n * directory names when the code only has the IR service name string.\n */\nexport function buildServiceNameMap(services: Service[], ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of services) {\n map.set(service.name, resolveServiceName(service, ctx));\n }\n return map;\n}\n\n/**\n * Resolve the output directory for a service.\n * Mount rules already handle directory placement, so this is a simple kebab-case conversion.\n */\nexport function resolveServiceDir(resolvedServiceName: string): string {\n return serviceDirName(resolvedServiceName);\n}\n\n/** Resolve the SDK method name for an operation, using resolved operations first. */\nexport function resolveMethodName(op: Operation, _service: Service, ctx: EmitterContext): string {\n const lookup = buildResolvedLookup(ctx);\n const resolved = lookupMethodName(op, lookup);\n if (resolved) return toCamelCase(resolved);\n // Fallback to overlay, then spec-derived\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup?.methodByOperation?.get(httpKey);\n if (existing) return existing.methodName;\n return toCamelCase(op.name);\n}\n\n/** Resolve the SDK class name for a service, using resolved ops mountOn as canonical. */\nexport function resolveClassName(service: Service, ctx: EmitterContext): string {\n // Use resolved ops mountOn as canonical class name\n for (const r of ctx.resolvedOperations ?? []) {\n if (r.service.name === service.name) return r.mountOn;\n }\n // Fallback to overlay\n if (ctx.overlayLookup?.methodByOperation) {\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup.methodByOperation.get(httpKey);\n if (existing) return existing.className;\n }\n }\n return toPascalCase(service.name);\n}\n\n/** Resolve the interface name for a model, checking overlay first.\n *\n * @param opts.skipTypeAlias - When true, skip apiSurface typeAlias resolution.\n * Use this for dedup models to ensure the file exports match the import\n * names (preserved files export the raw name, not the resolved alias).\n */\nexport function resolveInterfaceName(name: string, ctx: EmitterContext, opts?: { skipTypeAlias?: boolean }): string {\n const existing = ctx.overlayLookup?.interfaceByName?.get(name);\n if (existing) return existing;\n\n // If the model name is a type alias that points to a canonical interface,\n // use the canonical name. This prevents the merger from generating unused\n // backward-compat aliases (e.g., `type FlagOwner = FeatureFlagOwner`).\n if (!opts?.skipTypeAlias && ctx.apiSurface?.typeAliases) {\n const alias = ctx.apiSurface.typeAliases[name] as { value?: string } | undefined;\n if (alias?.value && ctx.apiSurface.interfaces?.[alias.value]) {\n return alias.value;\n }\n }\n\n // Strip spec-noise suffixes (e.g., \"Dto\") only for models without a\n // baseline. When an overlay exists (Scenario A), the overlay check above\n // handles existing models. New models (no overlay entry) get clean names.\n const cleaned = ctx.apiSurface ? name : stripNoiseSuffixes(name);\n return toPascalCase(stripUrnPrefix(cleaned));\n}\n","import type { TypeRef, PrimitiveType, UnionType } from '@workos/oagen';\nimport { mapTypeRef as irMapTypeRef } from '@workos/oagen';\nimport { wireInterfaceName } from './naming.js';\n\nexport interface MapTypeRefOpts {\n stringDates?: boolean;\n /** Map from model name → default type args (e.g., `'<Record<string, unknown>>'`).\n * When present, model refs for generic models get their defaults appended. */\n genericDefaults?: Map<string, string>;\n}\n\n/**\n * Map an IR TypeRef to a TypeScript domain type string.\n * Domain types use PascalCase model names (e.g., `Organization`).\n *\n * @param opts.stringDates - When true, map `date-time` to `string` instead of `Date`.\n * Use this when integrating into an existing SDK that represents timestamps as\n * ISO 8601 strings rather than Date objects.\n * @param opts.genericDefaults - When present, appends default type args to generic model refs.\n */\nexport function mapTypeRef(ref: TypeRef, opts?: MapTypeRefOpts): string {\n const primMapper = opts?.stringDates ? mapPrimitiveStringDates : mapPrimitive;\n const genericDefaults = opts?.genericDefaults;\n return irMapTypeRef<string>(ref, {\n primitive: primMapper,\n array: (_r, items) => `${parenthesizeUnion(items)}[]`,\n model: (r) => r.name + (genericDefaults?.get(r.name) ?? ''),\n enum: (r) => r.name,\n union: (r, variants) => joinUnionVariants(r, variants),\n nullable: (_r, inner) => `${inner} | null`,\n literal: (r) => (typeof r.value === 'string' ? `'${r.value}'` : String(r.value)),\n map: (_r, value) => `Record<string, ${value}>`,\n });\n}\n\n/**\n * Map an IR TypeRef to a TypeScript wire/response type string.\n * Model references get the `Response` suffix (e.g., `OrganizationResponse`).\n * Wire types use JSON-native types (string for date-time, number/string for int64).\n */\nexport function mapWireTypeRef(ref: TypeRef, opts?: { genericDefaults?: Map<string, string> }): string {\n const genericDefaults = opts?.genericDefaults;\n return irMapTypeRef<string>(ref, {\n primitive: mapWirePrimitive,\n array: (_r, items) => `${parenthesizeUnion(items)}[]`,\n model: (r) => wireInterfaceName(r.name) + (genericDefaults?.get(r.name) ?? ''),\n enum: (r) => r.name,\n union: (r, variants) => joinUnionVariants(r, variants),\n nullable: (_r, inner) => `${inner} | null`,\n literal: (r) => (typeof r.value === 'string' ? `'${r.value}'` : String(r.value)),\n map: (_r, value) => `Record<string, ${value}>`,\n });\n}\n\nfunction mapPrimitive(ref: PrimitiveType): string {\n if (ref.format) {\n switch (ref.format) {\n case 'date-time':\n return 'Date';\n case 'int64':\n return 'bigint';\n }\n }\n switch (ref.type) {\n case 'string':\n return 'string';\n case 'integer':\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'unknown':\n return 'any';\n }\n}\n\n/**\n * Map a primitive type using string representation for dates.\n * Used when the existing SDK represents timestamps as ISO 8601 strings.\n */\nfunction mapPrimitiveStringDates(ref: PrimitiveType): string {\n if (ref.format) {\n switch (ref.format) {\n case 'int64':\n return 'bigint';\n // date-time intentionally falls through to the string case\n }\n }\n switch (ref.type) {\n case 'string':\n return 'string';\n case 'integer':\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'unknown':\n return 'any';\n }\n}\n\n/**\n * Map an IR PrimitiveType to a TypeScript wire/JSON type string.\n * Wire types match JSON encoding: date-time stays string, int64 stays string/number.\n */\nfunction mapWirePrimitive(ref: PrimitiveType): string {\n switch (ref.type) {\n case 'string':\n return 'string';\n case 'integer':\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'unknown':\n return 'any';\n }\n}\n\n/**\n * Join union variant type strings using the appropriate operator.\n * allOf unions use `&` (intersection), oneOf/anyOf/unspecified use `|` (union).\n */\nfunction joinUnionVariants(ref: UnionType, variants: string[]): string {\n const unique = [...new Set(variants)];\n if (ref.compositionKind === 'allOf') {\n return unique.join(' & ');\n }\n if (unique.length === 1) return unique[0];\n return unique.join(' | ');\n}\n\n/** Wrap union/intersection types in parentheses when used as array item type. */\nfunction parenthesizeUnion(type: string): string {\n return type.includes(' | ') || type.includes(' & ') ? `(${type})` : type;\n}\n","\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '→') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent\n atNewLine = false,\n hasContent = false,\n typeIndex,\n typeQuantity,\n typeList,\n type,\n flowIndent,\n blockIndent;\n\n if (state.listener !== null) {\n state.listener('open', state);\n }\n\n state.tag = null;\n state.anchor = null;\n state.kind = null;\n state.result = null;\n\n allowBlockStyles = allowBlockScalars = allowBlockCollections =\n CONTEXT_BLOCK_OUT === nodeContext ||\n CONTEXT_BLOCK_IN === nodeContext;\n\n if (allowToSeek) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"!<?> [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn’t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out\n// c = flow-in ⇒ ns-plain-safe-in\n// c = block-key ⇒ ns-plain-safe-out\n// c = flow-key ⇒ ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” )\n// | ( /* An ns-char preceding */ “#” )\n// | ( “:” /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “\"”\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | “%” | “@” | “`”)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// • No ending newline => unaffected; already using strip \"-\" chomping.\n// • Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-”\n // [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#”\n // | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”\n // | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]”\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n","import type { Model, Field, TypeRef, Enum } from '@workos/oagen';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n// @ts-ignore -- js-yaml has no type declarations in this project\nimport { load as yamlLoad } from 'js-yaml';\n\n/**\n * Detect whether a model is a list wrapper -- the standard paginated\n * list envelope with `data` (array), `list_metadata`, and optionally `object: 'list'`.\n *\n * These models are redundant because each language SDK already has its own\n * pagination wrapper, and the runtime handles deserialization.\n */\nexport function isListWrapperModel(model: Model): boolean {\n const fieldsByName = new Map(model.fields.map((f) => [f.name, f]));\n\n // Must have a `data` field that is an array type\n const dataField = fieldsByName.get('data');\n if (!dataField) return false;\n if (dataField.type.kind !== 'array') return false;\n\n // Must have a `list_metadata` field (IR may use snake_case or camelCase)\n const listMetadataField = fieldsByName.get('list_metadata') ?? fieldsByName.get('listMetadata');\n if (!listMetadataField) return false;\n\n // Optionally has an `object` field with literal value 'list'\n const objectField = fieldsByName.get('object');\n if (objectField) {\n if (objectField.type.kind !== 'literal' || objectField.type.value !== 'list') {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Detect whether a model is a list metadata model (e.g., ListMetadata).\n * These models typically have exactly `before` and `after` nullable string fields.\n */\nexport function isListMetadataModel(model: Model): boolean {\n if (model.fields.length !== 2) return false;\n\n const fieldsByName = new Map(model.fields.map((f) => [f.name, f]));\n const before = fieldsByName.get('before');\n const after = fieldsByName.get('after');\n\n if (!before || !after) return false;\n\n return isNullableString(before) && isNullableString(after);\n}\n\n/** Check if a field type is nullable string (nullable<string> or just string). */\nfunction isNullableString(field: Field): boolean {\n if (field.type.kind === 'primitive' && field.type.type === 'string') return true;\n if (field.type.kind === 'nullable' && field.type.inner.kind === 'primitive' && field.type.inner.type === 'string')\n return true;\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// oneOf / allOf+oneOf flattening\n// ---------------------------------------------------------------------------\n\n/**\n * Discover the OpenAPI spec path from CLI args or environment.\n * Returns null if not found.\n */\nfunction discoverSpecPath(): string | null {\n // Check --spec CLI arg\n const args = process.argv;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--spec' && args[i + 1]) return resolve(args[i + 1]);\n if (args[i]?.startsWith('--spec=')) return resolve(args[i].slice('--spec='.length));\n }\n // Check OPENAPI_SPEC_PATH env\n if (process.env.OPENAPI_SPEC_PATH) return resolve(process.env.OPENAPI_SPEC_PATH);\n return null;\n}\n\n/** Cached raw spec to avoid re-reading on multiple calls. */\nlet _rawSpecCache: Record<string, any> | null = null;\nlet _rawSpecLoaded = false;\n\nfunction loadRawSpec(): Record<string, any> | null {\n if (_rawSpecLoaded) return _rawSpecCache;\n _rawSpecLoaded = true;\n const specPath = discoverSpecPath();\n if (!specPath || !existsSync(specPath)) return null;\n try {\n const content = readFileSync(specPath, 'utf-8');\n _rawSpecCache = yamlLoad(content) as Record<string, any>;\n return _rawSpecCache;\n } catch {\n return null;\n }\n}\n\n/** Look up a schema by name in the raw spec's components/schemas. */\nfunction lookupRawSchema(name: string): Record<string, any> | null {\n const spec = loadRawSpec();\n if (!spec) return null;\n return spec?.components?.schemas?.[name] ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Synthetic model / enum collection\n// ---------------------------------------------------------------------------\n\n/**\n * Accumulator for synthetic models and enums generated from inline\n * definitions encountered during oneOf flattening.\n */\ninterface SyntheticCollector {\n models: Model[];\n enums: Array<{ name: string; values: Array<{ value: string; description?: string }> }>;\n /** Track names already used to avoid duplicates. */\n usedNames: Set<string>;\n}\n\nfunction createCollector(): SyntheticCollector {\n return { models: [], enums: [], usedNames: new Set() };\n}\n\n/**\n * Singularize a snake_case name for use as an array-item model name.\n * `redirect_uris` -> `redirect_uri`, `scopes` -> `scope`.\n */\nfunction singularizeSnake(name: string): string {\n if (name.endsWith('ies') && name.length > 3) {\n return `${name.slice(0, -3)}y`;\n }\n if (name.endsWith('s') && !name.endsWith('ss')) {\n return name.slice(0, -1);\n }\n return name;\n}\n\n// ---------------------------------------------------------------------------\n// rawSchemaToTypeRef -- with synthetic model/enum generation\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a raw OpenAPI type+format to an IR TypeRef.\n *\n * When `parentModelName` and `fieldName` are provided, inline objects and\n * enums generate synthetic models/enums instead of degrading to `unknown`\n * or `string`.\n */\nfunction rawSchemaToTypeRef(\n schema: Record<string, any>,\n parentModelName?: string,\n fName?: string,\n collector?: SyntheticCollector,\n): TypeRef {\n if (schema.const !== undefined) {\n return { kind: 'literal', value: schema.const };\n }\n if (schema.enum && collector && parentModelName && fName) {\n // Generate a synthetic enum\n const syntheticName = `${parentModelName}_${fName}`;\n if (!collector.usedNames.has(syntheticName)) {\n collector.usedNames.add(syntheticName);\n collector.enums.push({\n name: syntheticName,\n values: (schema.enum as string[]).map((v: string) => ({\n value: v,\n description: undefined,\n })),\n });\n }\n return {\n kind: 'enum',\n name: syntheticName,\n values: schema.enum as string[],\n } as TypeRef;\n }\n if (schema.enum) {\n // Simple string enum -- represent as primitive string (no collector)\n return { kind: 'primitive', type: 'string' } as TypeRef;\n }\n if (schema.$ref) {\n const refName = schema.$ref.split('/').pop()!;\n return { kind: 'model', name: refName } as TypeRef;\n }\n\n // Handle nullable type arrays like [string, null]\n let baseType = schema.type;\n let isNullable = false;\n if (Array.isArray(baseType)) {\n const nonNull = baseType.filter((t: string) => t !== 'null');\n isNullable = baseType.includes('null');\n baseType = nonNull[0] ?? 'string';\n }\n\n let ref: TypeRef;\n if (baseType === 'object' && schema.properties && collector && parentModelName && fName) {\n // Inline object -- generate a synthetic model\n const syntheticName = `${parentModelName}_${fName}`;\n if (!collector.usedNames.has(syntheticName)) {\n collector.usedNames.add(syntheticName);\n const fields: Field[] = [];\n const requiredSet = new Set<string>(schema.required ?? []);\n for (const [propName, propSchema] of Object.entries(schema.properties) as [string, Record<string, any>][]) {\n fields.push({\n name: propName,\n type: rawSchemaToTypeRef(propSchema, syntheticName, propName, collector),\n required: requiredSet.has(propName),\n description: propSchema.description,\n deprecated: propSchema.deprecated,\n });\n }\n collector.models.push({\n name: syntheticName,\n fields,\n description: schema.description,\n } as Model);\n }\n ref = { kind: 'model', name: syntheticName } as TypeRef;\n } else if (baseType === 'object' && schema.properties) {\n // Inline object -- treat as unknown (no collector)\n ref = { kind: 'primitive', type: 'unknown' } as TypeRef;\n } else if (baseType === 'array' && schema.items) {\n // For array items that are inline objects, use the singular field name\n const itemFieldName = fName ? singularizeSnake(fName) : undefined;\n ref = {\n kind: 'array',\n items: rawSchemaToTypeRef(schema.items, parentModelName, itemFieldName, collector),\n } as TypeRef;\n } else if (baseType === 'boolean') {\n ref = { kind: 'primitive', type: 'boolean' } as TypeRef;\n } else if (baseType === 'integer' || baseType === 'number') {\n ref = { kind: 'primitive', type: baseType } as TypeRef;\n } else {\n ref = { kind: 'primitive', type: 'string' } as TypeRef;\n }\n\n if (isNullable) {\n return { kind: 'nullable', inner: ref } as TypeRef;\n }\n return ref;\n}\n\n/**\n * Extract fields from a raw OpenAPI object schema.\n * All fields are returned as optional (not required) since they come from\n * oneOf variants where only one variant is active at a time.\n */\nfunction extractFieldsFromRawSchema(\n schema: Record<string, any>,\n parentModelName?: string,\n collector?: SyntheticCollector,\n): Field[] {\n const fields: Field[] = [];\n const props = schema.properties ?? {};\n for (const [name, propSchema] of Object.entries(props) as [string, Record<string, any>][]) {\n fields.push({\n name,\n type: rawSchemaToTypeRef(propSchema, parentModelName, name, collector),\n required: false, // All oneOf variant fields are optional\n description: propSchema.description,\n deprecated: propSchema.deprecated,\n });\n }\n return fields;\n}\n\n/**\n * Recursively collect all fields from a oneOf schema, flattening nested\n * allOf+oneOf compositions. All fields are marked optional.\n */\nfunction collectOneOfFields(\n schema: Record<string, any>,\n parentModelName?: string,\n collector?: SyntheticCollector,\n): Field[] {\n const allFields: Field[] = [];\n const seenFieldNames = new Set<string>();\n\n function walkSchema(s: Record<string, any>): void {\n // Direct properties\n if (s.properties) {\n for (const f of extractFieldsFromRawSchema(s, parentModelName, collector)) {\n if (!seenFieldNames.has(f.name)) {\n seenFieldNames.add(f.name);\n allFields.push(f);\n }\n }\n }\n // allOf composition\n if (s.allOf) {\n for (const sub of s.allOf) {\n walkSchema(sub);\n }\n }\n // oneOf composition (flatten all variants)\n if (s.oneOf) {\n for (const variant of s.oneOf) {\n walkSchema(variant);\n }\n }\n // anyOf composition\n if (s.anyOf) {\n for (const variant of s.anyOf) {\n walkSchema(variant);\n }\n }\n }\n\n walkSchema(schema);\n return allFields;\n}\n\n// ---------------------------------------------------------------------------\n// Array-item type upgrade\n// ---------------------------------------------------------------------------\n\n/**\n * Check if a TypeRef is `unknown` (the degraded type for inline objects).\n */\nfunction isUnknownType(ref: TypeRef): boolean {\n return ref.kind === 'primitive' && (ref as any).type === 'unknown';\n}\n\n/**\n * If a field is an `array<unknown>` (or `nullable<array<unknown>>`) and the\n * raw spec defines inline object/enum items, replace the item type with a\n * synthetic model/enum. Returns the original field unchanged when no upgrade\n * is needed.\n */\nfunction upgradeArrayItemType(\n field: Field,\n rawSchema: Record<string, any>,\n parentModelName: string,\n collector: SyntheticCollector,\n): Field {\n // Unwrap nullable to find the array\n let arrayRef: TypeRef | null = null;\n let isNullableWrapper = false;\n if (field.type.kind === 'array') {\n arrayRef = field.type;\n } else if (field.type.kind === 'nullable' && field.type.inner.kind === 'array') {\n arrayRef = field.type.inner;\n isNullableWrapper = true;\n }\n if (!arrayRef || arrayRef.kind !== 'array') return field;\n if (!isUnknownType(arrayRef.items)) return field;\n\n // Look up the raw spec for this field\n const rawProp = rawSchema.properties?.[field.name];\n if (!rawProp) return field;\n\n // Handle the case where the raw property is inside a nullable type array\n let rawArraySchema = rawProp;\n if (Array.isArray(rawProp.type)) {\n const nonNull = rawProp.type.filter((t: string) => t !== 'null');\n if (nonNull[0] === 'array') {\n rawArraySchema = rawProp;\n }\n }\n if (rawArraySchema.type !== 'array' && !(Array.isArray(rawArraySchema.type) && rawArraySchema.type.includes('array')))\n return field;\n if (!rawArraySchema.items) return field;\n\n // Generate a proper TypeRef from the raw items schema\n const itemFieldName = singularizeSnake(field.name);\n const newItemRef = rawSchemaToTypeRef(rawArraySchema.items, parentModelName, itemFieldName, collector);\n if (isUnknownType(newItemRef)) return field;\n\n const newArrayRef: TypeRef = { kind: 'array', items: newItemRef } as TypeRef;\n const newType: TypeRef = isNullableWrapper ? ({ kind: 'nullable', inner: newArrayRef } as TypeRef) : newArrayRef;\n\n return { ...field, type: newType };\n}\n\n// ---------------------------------------------------------------------------\n// Module-level store for synthetic enums produced during enrichment.\n// Consumed by `getSyntheticEnums()` after `enrichModelsFromSpec` runs.\n// ---------------------------------------------------------------------------\nlet _lastSyntheticEnums: Enum[] = [];\n\n/**\n * Return the synthetic enums generated during the last call to\n * `enrichModelsFromSpec`. Call this after enrichment to merge them into the\n * enum generation phase.\n */\nexport function getSyntheticEnums(): Enum[] {\n return _lastSyntheticEnums;\n}\n\n/**\n * Enrich IR models by flattening oneOf/allOf+oneOf variant fields from the raw spec.\n *\n * For models with 0 fields whose raw spec schema is a pure oneOf:\n * - Collect all variant fields and add them as optional fields.\n *\n * For models whose raw spec schema has allOf containing a oneOf:\n * - Collect the missing variant fields and add them as optional.\n *\n * Inline objects and enums in oneOf branches are promoted to synthetic\n * models/enums instead of degrading to `object` / `string`.\n *\n * Returns a new array of enriched models (original models are not mutated).\n * Synthetic enums are stored internally; retrieve them via `getSyntheticEnums()`.\n */\nexport function enrichModelsFromSpec(models: Model[]): Model[] {\n const spec = loadRawSpec();\n if (!spec) {\n _lastSyntheticEnums = [];\n return models;\n }\n\n const collector = createCollector();\n // Avoid name collisions with existing models\n for (const m of models) collector.usedNames.add(m.name);\n\n const enriched = models.map((model) => {\n const rawSchema = lookupRawSchema(model.name);\n if (!rawSchema) return model;\n\n const hasOneOf = rawSchema.oneOf || rawSchema.allOf?.some((s: any) => s.oneOf);\n if (!hasOneOf) return model;\n\n // Skip schemas with discriminator -- those are intentional unions\n const hasDiscriminator =\n rawSchema.discriminator ||\n rawSchema.oneOf?.some((v: any) => v.discriminator) ||\n rawSchema.allOf?.some((s: any) => s.discriminator || s.oneOf?.some((v: any) => v.discriminator));\n if (hasDiscriminator) return model;\n\n // Collect all variant fields from the raw schema, generating synthetic\n // models/enums for inline definitions along the way.\n const variantFields = collectOneOfFields(rawSchema, model.name, collector);\n if (variantFields.length === 0) return model;\n\n // Merge variant fields into the existing model, skipping duplicates\n const existingNames = new Set(model.fields.map((f) => f.name));\n const newFields = variantFields.filter((f) => !existingNames.has(f.name));\n\n if (newFields.length === 0) return model;\n\n return {\n ...model,\n fields: [...model.fields, ...newFields],\n };\n });\n\n // Second pass: fix array fields whose items degraded to `unknown` in the\n // IR but are actually inline objects or enums in the raw spec.\n const enriched2 = enriched.map((model) => {\n const rawSchema = lookupRawSchema(model.name);\n if (!rawSchema?.properties) return model;\n\n let modified = false;\n const newFields = model.fields.map((field) => {\n const upgraded = upgradeArrayItemType(field, rawSchema, model.name, collector);\n if (upgraded !== field) modified = true;\n return upgraded;\n });\n\n return modified ? { ...model, fields: newFields } : model;\n });\n\n // Convert synthetic enum collector entries to proper Enum objects\n _lastSyntheticEnums = collector.enums.map((e) => ({\n name: e.name,\n values: e.values.map((v) => ({ value: v.value, description: v.description })),\n })) as Enum[];\n\n // Append synthetic models to the output\n return [...enriched2, ...collector.models];\n}\n","import type { Model, EmitterContext, Service, Operation } from '@workos/oagen';\nimport { toPascalCase } from '@workos/oagen';\nexport {\n collectModelRefs,\n collectEnumRefs,\n assignModelsToServices,\n collectFieldDependencies,\n collectRequestBodyModels,\n} from '@workos/oagen';\nimport { mapTypeRef } from './type-map.js';\nimport {\n resolveInterfaceName,\n fieldName,\n resolveServiceDir,\n resolveMethodName,\n buildServiceNameMap,\n} from './naming.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\nimport { assignModelsToServices } from '@workos/oagen';\n\n/**\n * Compute a relative import path between two files within the generated SDK.\n * Strips .ts extension from the result.\n */\nexport function relativeImport(fromFile: string, toFile: string): string {\n const fromDir = fromFile.split('/').slice(0, -1);\n const toFileParts = toFile.split('/');\n const toDir = toFileParts.slice(0, -1);\n const toFileName = toFileParts[toFileParts.length - 1];\n\n let common = 0;\n while (common < fromDir.length && common < toDir.length && fromDir[common] === toDir[common]) {\n common++;\n }\n\n const ups = fromDir.length - common;\n const downs = toDir.slice(common);\n const parts = [...Array(ups).fill('..'), ...downs, toFileName];\n let result = parts.join('/');\n result = result.replace(/\\.ts$/, '');\n if (!result.startsWith('.')) result = './' + result;\n return result;\n}\n\n/**\n * Render a JSDoc comment block from a description string.\n * Handles multiline descriptions by prefixing each line with ` * `.\n * Returns the lines with the given indent (default 0 spaces).\n */\nexport function docComment(description: string, indent = 0): string[] {\n const pad = ' '.repeat(indent);\n const descLines = description.split('\\n');\n if (descLines.length === 1) {\n return [`${pad}/** ${descLines[0]} */`];\n }\n const lines: string[] = [`${pad}/**`];\n for (const line of descLines) {\n lines.push(line === '' ? `${pad} *` : `${pad} * ${line}`);\n }\n lines.push(`${pad} */`);\n return lines;\n}\n\n/**\n * Build a map from model name → default type args string for generic models.\n * E.g., Profile<CustomAttributesType = Record<string, unknown>>\n * → Map { 'Profile' → '<Record<string, unknown>>' }\n *\n * Non-generic models are not included in the map.\n */\nexport function buildGenericModelDefaults(models: Model[]): Map<string, string> {\n const result = new Map<string, string>();\n for (const model of models) {\n if (!model.typeParams?.length) continue;\n const defaults = model.typeParams.map((tp) => (tp.default ? mapTypeRef(tp.default) : 'unknown'));\n result.set(model.name, `<${defaults.join(', ')}>`);\n }\n return result;\n}\n\n/**\n * Remove unused imports from generated source code.\n * Scans the non-import body for each imported identifier and drops\n * individual names that are never referenced. Removes entire import\n * statements when no names are used.\n */\nexport function pruneUnusedImports(lines: string[]): string[] {\n // Split lines into imports and body\n const importLines: string[] = [];\n const bodyLines: string[] = [];\n let inBody = false;\n for (const line of lines) {\n if (!inBody && (line.startsWith('import ') || line === '')) {\n importLines.push(line);\n } else {\n inBody = true;\n bodyLines.push(line);\n }\n }\n\n const body = bodyLines.join('\\n');\n const kept: string[] = [];\n\n for (const line of importLines) {\n if (line === '') {\n kept.push(line);\n continue;\n }\n // Extract imported names from the import statement\n const match = line.match(/\\{([^}]+)\\}/);\n if (!match) {\n // Non-destructured import (e.g., import X from '...') — keep\n kept.push(line);\n continue;\n }\n const names = match[1]\n .split(',')\n .map((n) => n.trim())\n .filter(Boolean);\n // Filter to only names that appear in the body\n const usedNames = names.filter((name) => {\n const re = new RegExp(`\\\\b${name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`);\n return re.test(body);\n });\n if (usedNames.length === 0) {\n // No names used — drop entire import\n continue;\n }\n if (usedNames.length === names.length) {\n // All names used — keep original line\n kept.push(line);\n } else {\n // Some names unused — reconstruct import with only used names\n const isTypeImport = line.startsWith('import type');\n const fromMatch = line.match(/from\\s+['\"]([^'\"]+)['\"]/);\n if (fromMatch) {\n const prefix = isTypeImport ? 'import type' : 'import';\n kept.push(`${prefix} { ${usedNames.join(', ')} } from '${fromMatch[1]}';`);\n } else {\n kept.push(line);\n }\n }\n }\n\n return [...kept, ...bodyLines];\n}\n\n/** Built-in TypeScript types that are always available (no import needed). */\nexport const TS_BUILTINS = new Set([\n 'Record',\n 'Promise',\n 'Array',\n 'Map',\n 'Set',\n 'Date',\n 'string',\n 'number',\n 'boolean',\n 'void',\n 'null',\n 'undefined',\n 'any',\n 'never',\n 'unknown',\n 'true',\n 'false',\n]);\n\n/**\n * Detect whether the existing SDK uses string (ISO 8601) representation for\n * date-time fields. Checks if any baseline interface has a date-time IR field\n * typed as plain `string` (not `Date`).\n */\nexport function detectStringDateConvention(models: Model[], ctx: EmitterContext): boolean {\n if (!ctx.apiSurface?.interfaces) return false;\n for (const model of models) {\n const domainName = resolveInterfaceName(model.name, ctx);\n const baseline = ctx.apiSurface.interfaces[domainName];\n if (!baseline?.fields) continue;\n for (const field of model.fields) {\n if (field.type.kind !== 'primitive' || field.type.format !== 'date-time') continue;\n const baselineField = baseline.fields[fieldName(field.name)];\n if (baselineField && !baselineField.type.includes('Date')) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Build a comprehensive set of all known type names from the IR and baseline.\n * Used to identify type parameters by elimination — any PascalCase name not in\n * this set is likely a generic type parameter.\n */\nexport function buildKnownTypeNames(models: Model[], ctx: EmitterContext): Set<string> {\n const knownNames = new Set<string>();\n for (const m of models) knownNames.add(resolveInterfaceName(m.name, ctx));\n for (const e of ctx.spec.enums) knownNames.add(e.name);\n if (ctx.apiSurface?.interfaces) {\n for (const name of Object.keys(ctx.apiSurface.interfaces)) knownNames.add(name);\n }\n if (ctx.apiSurface?.typeAliases) {\n for (const name of Object.keys(ctx.apiSurface.typeAliases)) knownNames.add(name);\n }\n if (ctx.apiSurface?.enums) {\n for (const name of Object.keys(ctx.apiSurface.enums)) knownNames.add(name);\n }\n return knownNames;\n}\n\n/**\n * Create a service directory resolver bundle.\n * Encapsulates the common pattern of mapping models to services and resolving\n * the output directory for a given IR service name.\n */\nexport function createServiceDirResolver(\n models: Model[],\n services: Service[],\n ctx: EmitterContext,\n): {\n modelToService: Map<string, string>;\n serviceNameMap: Map<string, string>;\n resolveDir: (irService: string | undefined) => string;\n} {\n const modelToService = assignModelsToServices(models, services);\n const serviceNameMap = buildServiceNameMap(services, ctx);\n const resolveDir = (irService: string | undefined) =>\n irService ? resolveServiceDir(serviceNameMap.get(irService) ?? irService) : 'common';\n return { modelToService, serviceNameMap, resolveDir };\n}\n\n/**\n * Check if a set of baseline interface fields appears to contain generic type\n * parameters — PascalCase names that aren't known models, enums, or builtins.\n */\nexport function isBaselineGeneric(fields: Record<string, unknown>, knownNames: Set<string>): boolean {\n for (const [, bf] of Object.entries(fields)) {\n const fieldType = (bf as { type: string }).type;\n const typeNames = fieldType.match(/\\b[A-Z][a-zA-Z0-9]*\\b/g);\n if (!typeNames) continue;\n for (const tn of typeNames) {\n if (TS_BUILTINS.has(tn)) continue;\n if (knownNames.has(tn)) continue;\n return true;\n }\n }\n return false;\n}\n\n// Re-export shared model detection utilities\nexport { isListMetadataModel, isListWrapperModel } from '../shared/model-utils.js';\n\n/**\n * Compute a structural fingerprint for a model based on its fields.\n * Two models with identical fingerprints are structurally equivalent.\n */\nfunction modelFingerprint(model: Model): string {\n const fields = model.fields.map((f) => `${f.name}:${JSON.stringify(f.type)}:${f.required}`).sort();\n return fields.join('|');\n}\n\n/**\n * Find structurally identical models and build a deduplication map.\n * Also deduplicates models that resolve to the same interface name across\n * services — when a `$ref` schema is used by multiple tags, the IR may\n * produce per-tag copies that diverge slightly. The version with the most\n * fields is chosen as canonical.\n *\n * Returns a Map from duplicate model name → canonical model name.\n */\nexport function buildDeduplicationMap(models: Model[], ctx?: EmitterContext): Map<string, string> {\n const dedup = new Map<string, string>();\n\n // Pass 1: structural fingerprint dedup (exact match)\n const fingerprints = new Map<string, string>();\n for (const model of models) {\n if (model.fields.length === 0) continue;\n const fp = modelFingerprint(model);\n const existing = fingerprints.get(fp);\n if (existing) {\n dedup.set(model.name, existing);\n } else {\n fingerprints.set(fp, model.name);\n }\n }\n\n // Pass 2: name-based dedup for models that resolve to the same interface\n // name across services. Only applies when context with name resolution is\n // available. Picks the model with the most fields as canonical.\n if (ctx) {\n const byDomainName = new Map<string, Model[]>();\n for (const model of models) {\n if (model.fields.length === 0) continue;\n if (dedup.has(model.name)) continue; // already deduped in pass 1\n const domainName = resolveInterfaceName(model.name, ctx);\n const group = byDomainName.get(domainName);\n if (group) {\n group.push(model);\n } else {\n byDomainName.set(domainName, [model]);\n }\n }\n for (const [, group] of byDomainName) {\n if (group.length < 2) continue;\n // Choose canonical: most fields, then alphabetically by name\n group.sort((a, b) => b.fields.length - a.fields.length || a.name.localeCompare(b.name));\n const canonical = group[0];\n for (let i = 1; i < group.length; i++) {\n dedup.set(group[i].name, canonical.name);\n }\n }\n }\n\n return dedup;\n}\n\n/**\n * Check whether a service's endpoints are already fully covered by existing\n * hand-written service classes.\n *\n * A service is considered \"covered\" when:\n * 1. **Every** operation in it appears in `overlayLookup.methodByOperation`\n * 2. The overlay maps those operations to a class that exists in the baseline\n * `apiSurface` (confirming the hand-written class is actually present)\n *\n * Services with zero operations are never considered covered (nothing to\n * deduplicate). When no `apiSurface` is available, the overlay alone is\n * used as the coverage signal (the overlay is only built from existing code).\n *\n * This prevents the emitter from generating resource classes like `Connections`\n * that would duplicate hand-written modules like `SSO` for the same API\n * endpoints (e.g., `GET /connections`).\n */\nexport function isServiceCoveredByExisting(service: Service, ctx: EmitterContext): boolean {\n // A service is \"covered\" when its mountOn differs from its own name,\n // meaning its operations are mounted on a different (existing) class.\n const mountTarget = getMountTarget(service, ctx);\n if (mountTarget !== toPascalCase(service.name)) return true;\n\n const overlay = ctx.overlayLookup?.methodByOperation;\n if (!overlay || overlay.size === 0) return false;\n if (service.operations.length === 0) return false;\n\n // Collect the set of existing class names from the baseline surface.\n // When no apiSurface is available, the overlay alone cannot confirm that\n // a hand-written class exists — it may only carry naming hints.\n const baselineClasses = ctx.apiSurface?.classes;\n if (!baselineClasses) return false;\n const existingClassNames = new Set(Object.keys(baselineClasses));\n\n // Check that every operation is in the overlay AND the overlay's target class\n // exists in the baseline.\n return service.operations.every((op: Operation) => {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const match = overlay.get(httpKey);\n if (!match) return false;\n return existingClassNames.has(match.className);\n });\n}\n\n/**\n * Check whether a fully-covered service has operations whose overlay-mapped\n * methods are missing from the baseline class. Returns true when at least\n * one operation maps to a method name that the baseline class does not have,\n * meaning the merger needs to add new methods (skipIfExists must be removed).\n */\nexport function hasMethodsAbsentFromBaseline(service: Service, ctx: EmitterContext): boolean {\n const baselineClasses = ctx.apiSurface?.classes;\n if (!baselineClasses) return false;\n\n // When a service mounts on a different class (via mount rules), check\n // each operation's resolved method name against the target class directly.\n const mountTarget = getMountTarget(service, ctx);\n if (mountTarget !== toPascalCase(service.name)) {\n const cls = baselineClasses[mountTarget];\n if (!cls) return true; // Target class missing from baseline — treat as absent\n for (const op of service.operations) {\n const method = resolveMethodName(op, service, ctx);\n if (!cls.methods?.[method]) return true;\n }\n return false;\n }\n\n // Default overlay-based detection\n const overlay = ctx.overlayLookup?.methodByOperation;\n if (!overlay) return false;\n\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const match = overlay.get(httpKey);\n if (!match) continue;\n const cls = baselineClasses[match.className];\n if (!cls) continue;\n if (!cls.methods?.[match.methodName]) return true;\n }\n return false;\n}\n\n/**\n * Return operations in a service that are NOT covered by existing hand-written\n * service classes. For fully uncovered services, returns all operations.\n * For partially covered services, returns only the uncovered operations.\n */\nexport function uncoveredOperations(service: Service, ctx: EmitterContext): Operation[] {\n const overlay = ctx.overlayLookup?.methodByOperation;\n if (!overlay || overlay.size === 0) return service.operations;\n\n const baselineClasses = ctx.apiSurface?.classes;\n if (!baselineClasses) return service.operations;\n const existingClassNames = new Set(Object.keys(baselineClasses));\n\n return service.operations.filter((op: Operation) => {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const match = overlay.get(httpKey);\n if (!match) return true; // Not in overlay → uncovered\n return !existingClassNames.has(match.className); // Class doesn't exist → uncovered\n });\n}\n","import type { Enum, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { toPascalCase, walkTypeRef } from '@workos/oagen';\nimport { fileName, resolveServiceDir, buildServiceNameMap } from './naming.js';\nimport { docComment } from './utils.js';\n\nexport function generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n if (enums.length === 0) return [];\n\n const enumToService = assignEnumsToServices(enums, ctx.spec.services);\n const serviceNameMap = buildServiceNameMap(ctx.spec.services, ctx);\n const resolveDir = (irService: string | undefined) =>\n irService ? resolveServiceDir(serviceNameMap.get(irService) ?? irService) : 'common';\n const files: GeneratedFile[] = [];\n\n for (const enumDef of enums) {\n const service = enumToService.get(enumDef.name);\n const dirName = resolveDir(service);\n\n // Check baseline surface for representation and values\n const baselineEnum = ctx.apiSurface?.enums?.[enumDef.name];\n const baselineAlias = ctx.apiSurface?.typeAliases?.[enumDef.name];\n const generatedPath = `src/${dirName}/interfaces/${fileName(enumDef.name)}.interface.ts`;\n\n // If the baseline already provides this enum from a different file (e.g., `.enum.ts`),\n // skip generation to avoid duplicate exports from the same barrel.\n const baselineSourceFile = (baselineEnum as any)?.sourceFile ?? (baselineAlias as any)?.sourceFile;\n if (baselineSourceFile && baselineSourceFile !== generatedPath) {\n continue;\n }\n\n const lines: string[] = [];\n\n // Track whether the generated content has new values not in the baseline.\n // When it does, skipIfExists must be false so the file gets updated.\n let hasNewValues = false;\n\n if (baselineEnum?.members) {\n // Generate TS `enum` using baseline member names and values, merging\n // any new IR values that the baseline is missing.\n const existingValues = new Set(Object.values(baselineEnum.members).map(String));\n const irValues = enumDef.values.map((v) => String(v.value));\n const missingValues = irValues.filter((v) => !existingValues.has(v));\n hasNewValues = missingValues.length > 0;\n\n lines.push(`export enum ${enumDef.name} {`);\n for (const [memberName, memberValue] of Object.entries(baselineEnum.members)) {\n const valueStr = typeof memberValue === 'string' ? `'${memberValue}'` : String(memberValue);\n lines.push(` ${memberName} = ${valueStr},`);\n }\n // Append new values from the spec that the baseline is missing\n for (const val of missingValues) {\n // Derive a PascalCase member name from the value\n const memberName = toPascalCase(val);\n lines.push(` ${memberName} = '${val}',`);\n }\n lines.push('}');\n } else if (baselineAlias?.value) {\n // Use the baseline type alias value, but merge in any new IR values the baseline is missing.\n const baselineValues = extractLiteralUnionValues(baselineAlias.value);\n const irValues = enumDef.values.map((v) => String(v.value));\n const missing = irValues.filter((v) => !baselineValues.has(v));\n hasNewValues = missing.length > 0;\n if (missing.length > 0) {\n // Baseline is missing values from the spec — regenerate with all values merged\n const allValues = [...baselineValues, ...missing];\n const parts = allValues.map((v) => `'${v}'`);\n lines.push(`export type ${enumDef.name} = ${parts.join(' | ')};`);\n } else {\n lines.push(`export type ${enumDef.name} = ${baselineAlias.value};`);\n }\n } else {\n // No baseline — generate string literal union from IR values\n const values = enumDef.values;\n lines.push(`export type ${enumDef.name} =`);\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n const valueStr = typeof v.value === 'string' ? `'${v.value}'` : String(v.value);\n if (v.description || v.deprecated) {\n const parts: string[] = [];\n if (v.description) parts.push(v.description);\n if (v.deprecated) parts.push('@deprecated');\n lines.push(...docComment(parts.join('\\n'), 2));\n }\n const suffix = i === values.length - 1 ? ';' : '';\n lines.push(` | ${valueStr}${suffix}`);\n }\n }\n\n files.push({\n path: `src/${dirName}/interfaces/${fileName(enumDef.name)}.interface.ts`,\n content: lines.join('\\n'),\n // When the spec has new values the baseline is missing, allow the file\n // to be updated so the SDK picks up the full set of enum values.\n skipIfExists: !hasNewValues,\n });\n }\n\n return files;\n}\n\n/**\n * Parse a TypeScript string literal union type alias value (e.g., \"'a' | 'b' | 'c'\")\n * into a set of its string values.\n */\nfunction extractLiteralUnionValues(aliasValue: string): Set<string> {\n const values = new Set<string>();\n // Match all single-quoted string literals in the union\n const regex = /'([^']+)'/g;\n let match;\n while ((match = regex.exec(aliasValue)) !== null) {\n values.add(match[1]);\n }\n return values;\n}\n\nexport function assignEnumsToServices(enums: Enum[], services: Service[]): Map<string, string> {\n const enumToService = new Map<string, string>();\n const enumNames = new Set(enums.map((e) => e.name));\n\n for (const service of services) {\n for (const op of service.operations) {\n const refs = new Set<string>();\n const collect = (ref: any) => {\n walkTypeRef(ref, { enum: (r: any) => refs.add(r.name) });\n };\n if (op.requestBody) collect(op.requestBody);\n collect(op.response);\n for (const p of [...op.pathParams, ...op.queryParams, ...op.headerParams, ...(op.cookieParams ?? [])]) {\n collect(p.type);\n }\n for (const name of refs) {\n if (enumNames.has(name) && !enumToService.has(name)) {\n enumToService.set(name, service.name);\n }\n }\n }\n }\n\n return enumToService;\n}\n","import type { Model, Field, EmitterContext, TypeRef, UnionType, PrimitiveType } from '@workos/oagen';\nimport { mapTypeRef as tsMapTypeRef } from './type-map.js';\nimport { fieldName, wireFieldName, fileName, resolveInterfaceName, wireInterfaceName } from './naming.js';\nimport { relativeImport, buildKnownTypeNames, isBaselineGeneric, createServiceDirResolver } from './utils.js';\n\n// ---------------------------------------------------------------------------\n// Guard strategy — determines how a field assignment is wrapped\n// ---------------------------------------------------------------------------\n\ntype GuardStrategy =\n | { kind: 'direct' }\n | { kind: 'null-check'; fallback: string }\n | { kind: 'coalesce'; fallback: string }\n | { kind: 'non-null-assert' };\n\n// ---------------------------------------------------------------------------\n// Baseline types used by planning functions\n// ---------------------------------------------------------------------------\n\ninterface BaselineFieldInfo {\n type: string;\n optional: boolean;\n}\n\ninterface BaselineInterface {\n fields?: Record<string, BaselineFieldInfo>;\n sourceFile?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Expression builders\n// ---------------------------------------------------------------------------\n\n/**\n * Build a deserialization expression for a type reference.\n * @param nullFallback - fallback value for nullable inner expressions (default 'null')\n */\nexport function deserializeExpression(\n ref: TypeRef,\n wireExpr: string,\n ctx: EmitterContext,\n nullFallback = 'null',\n): string {\n switch (ref.kind) {\n case 'primitive':\n return deserializePrimitive(ref, wireExpr);\n case 'literal':\n case 'enum':\n return wireExpr;\n case 'model': {\n const name = resolveInterfaceName(ref.name, ctx);\n return `deserialize${name}(${wireExpr})`;\n }\n case 'array':\n if (ref.items.kind === 'model') {\n const name = resolveInterfaceName(ref.items.name, ctx);\n return `${wireExpr}.map(deserialize${name})`;\n }\n return wireExpr;\n case 'nullable': {\n const innerExpr = deserializeExpression(ref.inner, wireExpr, ctx, nullFallback);\n if (innerExpr !== wireExpr) {\n return `${wireExpr} != null ? ${innerExpr} : ${nullFallback}`;\n }\n return `${wireExpr} ?? ${nullFallback}`;\n }\n case 'union': {\n if (ref.discriminator) {\n return renderDiscriminatorSwitch(ref, wireExpr, 'deserialize', ctx);\n }\n if (ref.compositionKind === 'allOf') {\n return renderAllOfMerge(ref, wireExpr, 'deserialize', ctx);\n }\n const models = uniqueModelVariants(ref);\n if (models.length === 1) {\n const name = resolveInterfaceName(models[0], ctx);\n return `deserialize${name}(${wireExpr})`;\n }\n return wireExpr;\n }\n case 'map':\n return wireExpr;\n }\n}\n\n/**\n * Build a serialization expression for a type reference.\n * @param nullFallback - fallback value for nullable inner expressions (default 'null')\n */\nexport function serializeExpression(\n ref: TypeRef,\n domainExpr: string,\n ctx: EmitterContext,\n nullFallback = 'null',\n): string {\n switch (ref.kind) {\n case 'primitive':\n return serializePrimitive(ref, domainExpr);\n case 'literal':\n case 'enum':\n return domainExpr;\n case 'model': {\n const name = resolveInterfaceName(ref.name, ctx);\n return `serialize${name}(${domainExpr})`;\n }\n case 'array':\n if (ref.items.kind === 'model') {\n const name = resolveInterfaceName(ref.items.name, ctx);\n return `${domainExpr}.map(serialize${name})`;\n }\n return domainExpr;\n case 'nullable': {\n const innerExpr = serializeExpression(ref.inner, domainExpr, ctx, nullFallback);\n if (innerExpr !== domainExpr) {\n return `${domainExpr} != null ? ${innerExpr} : ${nullFallback}`;\n }\n return domainExpr;\n }\n case 'union': {\n if (ref.discriminator) {\n return renderDiscriminatorSwitch(ref, domainExpr, 'serialize', ctx);\n }\n if (ref.compositionKind === 'allOf') {\n return renderAllOfMerge(ref, domainExpr, 'serialize', ctx);\n }\n const models = uniqueModelVariants(ref);\n if (models.length === 1) {\n const name = resolveInterfaceName(models[0], ctx);\n return `serialize${name}(${domainExpr})`;\n }\n return domainExpr;\n }\n case 'map':\n return domainExpr;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Primitive format conversions\n// ---------------------------------------------------------------------------\n\nfunction deserializePrimitive(ref: PrimitiveType, wireExpr: string): string {\n if (ref.format === 'date-time') return `new Date(${wireExpr})`;\n if (ref.format === 'int64') return `BigInt(${wireExpr})`;\n return wireExpr;\n}\n\nfunction serializePrimitive(ref: PrimitiveType, domainExpr: string): string {\n if (ref.format === 'date-time') return `${domainExpr}.toISOString()`;\n if (ref.format === 'int64') return `String(${domainExpr})`;\n return domainExpr;\n}\n\n// ---------------------------------------------------------------------------\n// Union helpers\n// ---------------------------------------------------------------------------\n\n/** Extract unique model names from a union's variants. */\nexport function uniqueModelVariants(ref: UnionType): string[] {\n const modelNames = new Set<string>();\n for (const v of ref.variants) {\n if (v.kind === 'model') modelNames.add(v.name);\n }\n return [...modelNames];\n}\n\nfunction renderDiscriminatorSwitch(\n ref: UnionType,\n expr: string,\n direction: 'deserialize' | 'serialize',\n ctx: EmitterContext,\n): string {\n const disc = ref.discriminator!;\n const cases: string[] = [];\n for (const [value, modelName] of Object.entries(disc.mapping)) {\n const resolved = resolveInterfaceName(modelName, ctx);\n const fn = `${direction}${resolved}`;\n cases.push(`case '${value}': return ${fn}(${expr} as any)`);\n }\n return `(() => { switch ((${expr} as any).${disc.property}) { ${cases.join('; ')}; default: return ${expr} } })()`;\n}\n\nfunction renderAllOfMerge(\n ref: UnionType,\n expr: string,\n direction: 'deserialize' | 'serialize',\n ctx: EmitterContext,\n): string {\n const models = uniqueModelVariants(ref);\n if (models.length === 0) return expr;\n const spreads = models.map((name) => {\n const resolved = resolveInterfaceName(name, ctx);\n return `...${direction}${resolved}(${expr} as any)`;\n });\n return `({ ${spreads.join(', ')} })`;\n}\n\n// ---------------------------------------------------------------------------\n// Type inspection helpers\n// ---------------------------------------------------------------------------\n\n/** Check whether a TypeRef involves a function call in serialization. */\nexport function needsNullGuard(ref: TypeRef): boolean {\n switch (ref.kind) {\n case 'model':\n return true;\n case 'primitive':\n return hasFormatConversion(ref);\n case 'array':\n return ref.items.kind === 'model';\n case 'nullable':\n return needsNullGuard(ref.inner);\n case 'union':\n if (ref.discriminator) return true;\n if (ref.compositionKind === 'allOf' && uniqueModelVariants(ref).length > 0) return true;\n return uniqueModelVariants(ref).length === 1;\n default:\n return false;\n }\n}\n\nexport function hasFormatConversion(ref: TypeRef): boolean {\n switch (ref.kind) {\n case 'primitive':\n return ref.format === 'date-time' || ref.format === 'int64';\n case 'nullable':\n return hasFormatConversion(ref.inner);\n default:\n return false;\n }\n}\n\nexport function hasDateTimeConversion(ref: TypeRef): boolean {\n switch (ref.kind) {\n case 'primitive':\n return ref.format === 'date-time';\n case 'nullable':\n return hasDateTimeConversion(ref.inner);\n default:\n return false;\n }\n}\n\n/**\n * Collect model names that will actually be called in serialize/deserialize expressions.\n * Unlike collectModelRefs (which walks all union variants), this only includes models\n * that the expression functions will actually invoke a serializer/deserializer for.\n */\nexport function collectSerializedModelRefs(ref: TypeRef): string[] {\n switch (ref.kind) {\n case 'model':\n return [ref.name];\n case 'array':\n if (ref.items.kind === 'model') return [ref.items.name];\n return collectSerializedModelRefs(ref.items);\n case 'nullable':\n return collectSerializedModelRefs(ref.inner);\n case 'union': {\n const models = uniqueModelVariants(ref);\n if (ref.discriminator && models.length > 0) return models;\n if (ref.compositionKind === 'allOf' && models.length > 0) return models;\n if (models.length === 1) return models;\n return [];\n }\n case 'map':\n case 'primitive':\n case 'literal':\n case 'enum':\n return [];\n }\n}\n\n/** Return a TypeScript default value expression for a type. */\nexport function defaultForType(ref: TypeRef): string | null {\n switch (ref.kind) {\n case 'literal':\n return typeof ref.value === 'string' ? `'${ref.value}'` : String(ref.value);\n case 'enum':\n return null;\n case 'map':\n return '{}';\n case 'nullable':\n return 'null';\n case 'primitive':\n switch (ref.type) {\n case 'boolean':\n return 'false';\n case 'string':\n return \"''\";\n case 'integer':\n case 'number':\n return '0';\n default:\n return null;\n }\n case 'array':\n return '[]';\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Serializer type params\n// ---------------------------------------------------------------------------\n\nexport function renderSerializerTypeParams(model: Model, ctx?: EmitterContext): { decl: string; usage: string } {\n if (model.typeParams?.length) {\n const params = model.typeParams.map((tp) => {\n const def = tp.default ? ` = ${tsMapTypeRef(tp.default)}` : '';\n return `${tp.name}${def}`;\n });\n const names = model.typeParams.map((tp) => tp.name);\n return { decl: `<${params.join(', ')}>`, usage: `<${names.join(', ')}>` };\n }\n if (ctx?.apiSurface?.interfaces) {\n const domainName = resolveInterfaceName(model.name, ctx);\n const baseline = ctx.apiSurface.interfaces[domainName];\n if (baseline?.fields) {\n const baselineSourceFile = (baseline as any).sourceFile as string | undefined;\n const { modelToService, resolveDir } = createServiceDirResolver(ctx.spec.models, ctx.spec.services, ctx);\n const generatedPath = `src/${resolveDir(modelToService.get(model.name))}/interfaces/${fileName(model.name)}.interface.ts`;\n const pathMatches = !baselineSourceFile || baselineSourceFile === generatedPath;\n const knownNames = buildKnownTypeNames(ctx.spec.models, ctx);\n if (pathMatches && isBaselineGeneric(baseline.fields, knownNames)) {\n return {\n decl: '<GenericType extends Record<string, unknown> = Record<string, unknown>>',\n usage: '<GenericType>',\n };\n }\n }\n }\n return { decl: '', usage: '' };\n}\n\n// ---------------------------------------------------------------------------\n// Baseline incompatibility detection\n// ---------------------------------------------------------------------------\n\nexport function serializerHasBaselineIncompatibility(\n model: Model,\n baselineResponse: BaselineInterface | undefined,\n baselineDomain?: BaselineInterface,\n ctx?: EmitterContext,\n): boolean {\n if (!baselineResponse?.fields) return false;\n\n const irWireFields = new Set<string>();\n const irDomainFields = new Set<string>();\n for (const field of model.fields) {\n irWireFields.add(wireFieldName(field.name));\n irDomainFields.add(fieldName(field.name));\n }\n\n for (const [wireField2, fieldDef] of Object.entries(baselineResponse.fields)) {\n if (fieldDef.optional) continue;\n if (!irWireFields.has(wireField2)) {\n return true;\n }\n }\n\n if (baselineDomain?.fields) {\n const baselineRequiredFields = Object.entries(baselineDomain.fields)\n .filter(([, f]) => !f.optional)\n .map(([name]) => name);\n const unmatchedCount = baselineRequiredFields.filter((n) => !irDomainFields.has(n)).length;\n if (unmatchedCount > 0 && baselineRequiredFields.length > 0) {\n const unmatchedRatio = unmatchedCount / baselineRequiredFields.length;\n if (unmatchedRatio > 0.3) {\n return true;\n }\n }\n }\n\n if (ctx?.apiSurface?.interfaces) {\n const modelSourceFile = (baselineResponse as any)?.sourceFile as string | undefined;\n const responseDir = modelSourceFile ? modelSourceFile.split('/').slice(0, 2).join('/') : null;\n\n for (const field of model.fields) {\n let fieldType = field.type;\n if (fieldType.kind === 'nullable') fieldType = fieldType.inner;\n if (fieldType.kind !== 'array' && fieldType.kind !== 'model') continue;\n const innerType = fieldType.kind === 'array' ? fieldType.items : fieldType;\n if (innerType.kind !== 'model') continue;\n\n const nestedWireName = wireInterfaceName(resolveInterfaceName(innerType.name, ctx));\n const wireField3 = wireFieldName(field.name);\n const baselineWireField2 = baselineResponse.fields![wireField3];\n if (!baselineWireField2) continue;\n\n const baselineTypeNames: string[] = baselineWireField2.type.match(/\\b[A-Z][a-zA-Z0-9]*Response\\b/g) || [];\n if (baselineTypeNames.length > 0 && !baselineTypeNames.includes(nestedWireName)) {\n return true;\n }\n\n if (baselineWireField2.type.includes(nestedWireName) || baselineWireField2.type.match(/\\b[A-Z]\\w*Response\\b/)) {\n const typeNames: string[] = baselineWireField2.type.match(/\\b[A-Z][a-zA-Z0-9]*\\b/g) || [];\n for (const typeName of typeNames) {\n if (typeName === 'Record' || typeName === 'Array') continue;\n const nestedIface = ctx.apiSurface!.interfaces![typeName];\n if (!nestedIface) continue;\n const nestedSrc = (nestedIface as any).sourceFile as string | undefined;\n if (!nestedSrc || !responseDir) continue;\n const nestedDir = nestedSrc.split('/').slice(0, 2).join('/');\n if (nestedDir !== responseDir) {\n return true;\n }\n }\n }\n }\n }\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Field assignment planning — replaces inline if/else chains\n// ---------------------------------------------------------------------------\n\n/** Plan a single deserializer field assignment. */\nexport function planDeserializeField(\n field: Field,\n baselineDomain: BaselineInterface | undefined,\n baselineResponse: BaselineInterface | undefined,\n skipFormatFields: Set<string>,\n ctx: EmitterContext,\n): { line: string; skip: boolean } {\n const domain = fieldName(field.name);\n const wire = wireFieldName(field.name);\n const wireAccess = `response.${wire}`;\n const skip = skipFormatFields.has(field.name);\n const fallbackForNullable = field.type.kind === 'nullable' ? 'null' : 'undefined';\n const expr = skip ? wireAccess : deserializeExpression(field.type, wireAccess, ctx, fallbackForNullable);\n const isNewField = baselineDomain && !baselineDomain.fields?.[domain];\n const effectivelyOptional = !field.required || isNewField;\n\n const guard = planDeserializeGuard(field, expr, wireAccess, effectivelyOptional, isNewField, baselineResponse);\n return { line: emitAssignment(domain, expr, wireAccess, guard), skip: false };\n}\n\nfunction planDeserializeGuard(\n field: Field,\n expr: string,\n wireAccess: string,\n effectivelyOptional: boolean | null | undefined,\n isNewField: boolean | null | undefined,\n baselineResponse: BaselineInterface | undefined,\n): GuardStrategy {\n // Optional field with function-call expression → null check\n if (effectivelyOptional && expr !== wireAccess && needsNullGuard(field.type)) {\n const fallback = field.type.kind === 'nullable' ? 'null' : 'undefined';\n return { kind: 'null-check', fallback };\n }\n\n // Required field with direct assignment — may need coalesce fallback\n if (field.required && expr === wireAccess) {\n const wire = wireFieldName(field.name);\n const responseFieldInfo = baselineResponse?.fields?.[wire];\n const responseFieldOptional = responseFieldInfo?.optional ?? false;\n const needsFallback = responseFieldOptional || !!isNewField;\n const fallback = needsFallback ? defaultForType(field.type) : null;\n if (fallback) {\n return { kind: 'coalesce', fallback };\n }\n }\n\n return { kind: 'direct' };\n}\n\n/** Plan a single serializer field assignment. */\nexport function planSerializeField(\n field: Field,\n baselineDomain: BaselineInterface | undefined,\n baselineResponse: BaselineInterface | undefined,\n skipFormatFields: Set<string>,\n ctx: EmitterContext,\n): { line: string; skip: boolean } {\n const wire = wireFieldName(field.name);\n const domain = fieldName(field.name);\n const domainAccess = `model.${domain}`;\n const skip = skipFormatFields.has(field.name);\n const fallbackForNullable = field.type.kind === 'nullable' ? 'null' : 'undefined';\n const expr = skip ? domainAccess : serializeExpression(field.type, domainAccess, ctx, fallbackForNullable);\n const isNewSerField = baselineDomain && !baselineDomain.fields?.[domain];\n const effectivelyOptionalSer = !field.required || isNewSerField;\n\n const guard = planSerializeGuard(\n field,\n expr,\n domainAccess,\n effectivelyOptionalSer,\n isNewSerField,\n baselineDomain,\n baselineResponse,\n );\n return { line: emitAssignment(wire, expr, domainAccess, guard), skip: false };\n}\n\nfunction planSerializeGuard(\n field: Field,\n expr: string,\n domainAccess: string,\n effectivelyOptionalSer: boolean | null | undefined,\n isNewSerField: boolean | null | undefined,\n baselineDomain: BaselineInterface | undefined,\n baselineResponse: BaselineInterface | undefined,\n): GuardStrategy {\n const wire = wireFieldName(field.name);\n const domain = fieldName(field.name);\n\n // Function-call expression for optional/nullable fields → null check\n const shouldGuardSer = effectivelyOptionalSer || field.type.kind === 'nullable';\n if (expr !== domainAccess && needsNullGuard(field.type) && shouldGuardSer) {\n const fallback = field.type.kind === 'nullable' ? 'null' : 'undefined';\n return { kind: 'null-check', fallback };\n }\n\n // Optional domain → required wire: needs coalesce or assert\n const baselineWireField = baselineResponse?.fields?.[wire];\n const baselineDomainField = baselineDomain?.fields?.[domain];\n const isNewFieldOnExistingDomain = baselineDomain && !baselineDomainField;\n const domainFieldIsOptional =\n !field.required || (baselineDomainField?.optional ?? false) || !!isNewFieldOnExistingDomain;\n const wireFieldIsRequired = baselineWireField ? !baselineWireField.optional : field.required;\n const needsUndefinedCoalesce = domainFieldIsOptional && wireFieldIsRequired && expr === domainAccess;\n\n if (needsUndefinedCoalesce) {\n const wireHasNull = baselineWireField?.type?.includes('null') || field.type.kind === 'nullable';\n if (wireHasNull) {\n return { kind: 'coalesce', fallback: 'null' };\n }\n return { kind: 'non-null-assert' };\n }\n\n // Nullable with direct assignment → may need coalesce for domain-response mismatch\n if (field.type.kind === 'nullable' && expr === domainAccess) {\n const domainWireField2 = wireFieldName(field.name);\n const responseBaselineField2 = baselineResponse?.fields?.[domainWireField2];\n const baselineDomainField2 = baselineDomain?.fields?.[domain];\n const domainResponseMismatch =\n baselineDomainField2 &&\n !baselineDomainField2.optional &&\n responseBaselineField2 &&\n responseBaselineField2.optional;\n const fieldEffectivelyOptional = !field.required || !!isNewSerField || !!domainResponseMismatch;\n if (fieldEffectivelyOptional) {\n return { kind: 'coalesce', fallback: 'null' };\n }\n }\n\n return { kind: 'direct' };\n}\n\n// ---------------------------------------------------------------------------\n// Field assignment emission — single function for all guard strategies\n// ---------------------------------------------------------------------------\n\nfunction emitAssignment(lhs: string, expr: string, accessExpr: string, guard: GuardStrategy): string {\n switch (guard.kind) {\n case 'direct':\n return ` ${lhs}: ${expr},`;\n case 'null-check':\n // If the expression already contains a null guard from nullable type handling\n // (e.g., `response.x != null ? deserializeFoo(response.x) : null`),\n // emit it directly — the fallback was baked into the expression.\n // Otherwise, wrap with an outer null check using the accessor.\n if (expr.includes(`${accessExpr} != null ?`)) {\n return ` ${lhs}: ${expr},`;\n }\n return ` ${lhs}: ${accessExpr} != null ? ${expr} : ${guard.fallback},`;\n case 'coalesce':\n return ` ${lhs}: ${expr} ?? ${guard.fallback},`;\n case 'non-null-assert':\n return ` ${lhs}: ${expr}!,`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Serializer file emission helpers\n// ---------------------------------------------------------------------------\n\ninterface SerializerContext {\n modelToService: Map<string, string>;\n resolveDir: (irService: string | undefined) => string;\n useStringDates: boolean;\n dedup: Map<string, string>;\n skippedSerializeModels: Set<string>;\n ctx: EmitterContext;\n}\n\n/** Build the import block for a serializer file. */\nexport function buildSerializerImports(\n model: Model,\n serializerPath: string,\n dirName: string,\n domainName: string,\n responseName: string,\n sctx: SerializerContext,\n): string[] {\n const lines: string[] = [];\n const interfacePath = `src/${dirName}/interfaces/${fileName(model.name)}.interface.ts`;\n lines.push(`import type { ${domainName}, ${responseName} } from '${relativeImport(serializerPath, interfacePath)}';`);\n\n const nestedModelRefs = new Set<string>();\n for (const field of model.fields) {\n for (const ref of collectSerializedModelRefs(field.type)) {\n if (ref !== model.name) nestedModelRefs.add(ref);\n }\n }\n\n for (const dep of nestedModelRefs) {\n const depService = sctx.modelToService.get(dep);\n const depDir = sctx.resolveDir(depService);\n const depSerializerPath = `src/${depDir}/serializers/${fileName(dep)}.serializer.ts`;\n const depName = resolveInterfaceName(dep, sctx.ctx);\n const rel = relativeImport(serializerPath, depSerializerPath);\n lines.push(`import { deserialize${depName}, serialize${depName} } from '${rel}';`);\n }\n lines.push('');\n return lines;\n}\n\n/** Build the set of field names where format conversion should be skipped. */\nexport function buildSkipFormatFields(\n model: Model,\n useStringDates: boolean,\n baselineDomain: BaselineInterface | undefined,\n): Set<string> {\n const skipFormatFields = new Set<string>();\n if (useStringDates) {\n for (const field of model.fields) {\n if (hasDateTimeConversion(field.type)) {\n skipFormatFields.add(field.name);\n }\n }\n }\n if (baselineDomain) {\n for (const field of model.fields) {\n if (skipFormatFields.has(field.name)) continue;\n const baselineField = baselineDomain.fields?.[fieldName(field.name)];\n if (baselineField && !baselineField.type.includes('Date') && hasFormatConversion(field.type)) {\n skipFormatFields.add(field.name);\n }\n }\n }\n return skipFormatFields;\n}\n\n/** Check if serialize should be skipped (baseline incompat or cascading dependency). */\nexport function shouldSkipSerializeForModel(\n model: Model,\n baselineResponse: BaselineInterface | undefined,\n baselineDomain: BaselineInterface | undefined,\n dedup: Map<string, string>,\n skippedSerializeModels: Set<string>,\n ctx: EmitterContext,\n): boolean {\n let shouldSkip = serializerHasBaselineIncompatibility(model, baselineResponse, baselineDomain, ctx);\n if (!shouldSkip) {\n for (const field of model.fields) {\n for (const ref of collectSerializedModelRefs(field.type)) {\n if (skippedSerializeModels.has(ref)) {\n shouldSkip = true;\n break;\n }\n const canon = dedup.get(ref);\n if (canon && skippedSerializeModels.has(canon)) {\n shouldSkip = true;\n break;\n }\n }\n if (shouldSkip) break;\n }\n }\n return shouldSkip;\n}\n\n/** Emit deserializer + serializer body lines for a model. */\nexport function emitSerializerBody(\n model: Model,\n domainName: string,\n responseName: string,\n typeParams: { decl: string; usage: string },\n baselineDomain: BaselineInterface | undefined,\n baselineResponse: BaselineInterface | undefined,\n skipFormatFields: Set<string>,\n shouldSkipSerialize: boolean,\n ctx: EmitterContext,\n): string[] {\n const lines: string[] = [];\n\n // Deserialize function (wire → domain)\n const seenDeserFields = new Set<string>();\n const deserParamPrefix = model.fields.length === 0 ? '_' : '';\n lines.push(`export const deserialize${domainName} = ${typeParams.decl}(`);\n lines.push(` ${deserParamPrefix}response: ${responseName}${typeParams.usage},`);\n lines.push(`): ${domainName}${typeParams.usage} => ({`);\n for (const field of model.fields) {\n const domain = fieldName(field.name);\n if (seenDeserFields.has(domain)) continue;\n seenDeserFields.add(domain);\n const plan = planDeserializeField(field, baselineDomain, baselineResponse, skipFormatFields, ctx);\n if (!plan.skip) lines.push(plan.line);\n }\n lines.push('});');\n\n // Serialize function (domain → wire)\n if (!shouldSkipSerialize) {\n const serParamPrefix = model.fields.length === 0 ? '_' : '';\n lines.push('');\n lines.push(`export const serialize${domainName} = ${typeParams.decl}(`);\n lines.push(` ${serParamPrefix}model: ${domainName}${typeParams.usage},`);\n lines.push(`): ${responseName}${typeParams.usage} => ({`);\n const seenSerFields = new Set<string>();\n for (const field of model.fields) {\n const wire = wireFieldName(field.name);\n if (seenSerFields.has(wire)) continue;\n seenSerFields.add(wire);\n const plan = planSerializeField(field, baselineDomain, baselineResponse, skipFormatFields, ctx);\n if (!plan.skip) lines.push(plan.line);\n }\n lines.push('});');\n }\n\n return lines;\n}\n","import type { Model, Field, TypeRef, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { mapTypeRef, mapWireTypeRef } from './type-map.js';\nimport { fieldName, wireFieldName, fileName, resolveInterfaceName, wireInterfaceName } from './naming.js';\nimport {\n collectFieldDependencies,\n docComment,\n buildGenericModelDefaults,\n pruneUnusedImports,\n TS_BUILTINS,\n detectStringDateConvention,\n buildKnownTypeNames,\n isBaselineGeneric,\n createServiceDirResolver,\n isListMetadataModel,\n isListWrapperModel,\n buildDeduplicationMap,\n relativeImport,\n} from './utils.js';\nimport { assignEnumsToServices } from './enums.js';\nimport {\n renderSerializerTypeParams,\n buildSerializerImports,\n buildSkipFormatFields,\n shouldSkipSerializeForModel,\n emitSerializerBody,\n} from './field-plan.js';\n\n/**\n * Detect baseline interfaces that are generic (have type parameters) even though\n * the IR model has no typeParams (OpenAPI doesn't support generics).\n *\n * Heuristic: if any field type in the baseline interface contains a PascalCase\n * name that isn't a known model, enum, or builtin, it's likely a type parameter\n * (e.g., `CustomAttributesType`), indicating the interface is generic.\n *\n * When detected, adds a default generic type arg so references like `Profile`\n * become `Profile<Record<string, unknown>>`.\n */\nfunction enrichGenericDefaultsFromBaseline(\n genericDefaults: Map<string, string>,\n models: Model[],\n ctx: EmitterContext,\n resolveDir: (irService: string | undefined) => string,\n modelToService: Map<string, string>,\n): void {\n if (!ctx.apiSurface?.interfaces) return;\n const knownNames = buildKnownTypeNames(models, ctx);\n\n for (const model of models) {\n if (genericDefaults.has(model.name)) continue; // IR already handles it\n const domainName = resolveInterfaceName(model.name, ctx);\n const baseline = ctx.apiSurface.interfaces[domainName];\n if (!baseline?.fields) continue;\n\n // Only enrich generic defaults for models whose baseline file will be\n // preserved via skipIfExists (paths match). If the file is generated\n // fresh in a new directory, it won't have generics, so references\n // to it don't need type args.\n const generatedPath = `src/${resolveDir(modelToService.get(model.name))}/interfaces/${fileName(model.name)}.interface.ts`;\n const baselineSourceFile = (baseline as any).sourceFile as string | undefined;\n if (baselineSourceFile && baselineSourceFile !== generatedPath) continue;\n\n if (isBaselineGeneric(baseline.fields, knownNames)) {\n genericDefaults.set(model.name, '<Record<string, unknown>>');\n }\n }\n}\n\nexport function generateModels(models: Model[], ctx: EmitterContext, shared?: SharedModelContext): GeneratedFile[] {\n if (models.length === 0) return [];\n\n const {\n modelToService,\n resolveDir,\n useStringDates,\n dedup: sharedDedup,\n genericDefaults: sharedDefaults,\n } = shared ?? buildSharedContext(models, ctx);\n const genericDefaults = sharedDefaults;\n const typeRefOpts = useStringDates ? { stringDates: true, genericDefaults } : { genericDefaults };\n const wireTypeRefOpts = { genericDefaults };\n const files: GeneratedFile[] = [];\n const dedup = sharedDedup;\n\n for (const model of models) {\n // Fix #4: Skip per-domain ListMetadata interfaces — the shared ListMetadata type covers these\n if (isListMetadataModel(model)) continue;\n\n // Fix #6: Skip per-domain list wrapper interfaces — the shared List<T>/ListResponse<T> covers these\n if (isListWrapperModel(model)) continue;\n\n // Deduplication: if this model is structurally identical to a canonical model,\n // emit a type alias instead of a full interface.\n const canonicalName = dedup.get(model.name);\n if (canonicalName) {\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n\n // Skip typeAlias resolution for dedup models. The canonical file may\n // be preserved (skipIfExists) and still export its raw name, so the\n // import names must match the raw exports, not resolved aliases.\n const skipTA = { skipTypeAlias: true };\n const domainName = resolveInterfaceName(model.name, ctx, skipTA);\n const responseName = wireInterfaceName(domainName);\n const canonDomainName = resolveInterfaceName(canonicalName, ctx, skipTA);\n const canonResponseName = wireInterfaceName(canonDomainName);\n\n const canonService = modelToService.get(canonicalName);\n const canonDir = resolveDir(canonService);\n\n // After noise suffix stripping (e.g., \"OrganizationDto\" → \"Organization\"),\n // the alias and canonical may resolve to the same file path or the same\n // type names. Skip — the canonical file already provides the types.\n const aliasPath = `src/${dirName}/interfaces/${fileName(model.name)}.interface.ts`;\n const canonPath = `src/${canonDir}/interfaces/${fileName(canonicalName)}.interface.ts`;\n if (aliasPath === canonPath) continue;\n if (domainName === canonDomainName) continue;\n const canonRelPath =\n canonDir === dirName\n ? `./${fileName(canonicalName)}.interface`\n : `../../${canonDir}/interfaces/${fileName(canonicalName)}.interface`;\n const aliasLines = [\n `import type { ${canonDomainName}, ${canonResponseName} } from '${canonRelPath}';`,\n '',\n `export type ${domainName} = ${canonDomainName};`,\n `export type ${responseName} = ${canonResponseName};`,\n ];\n files.push({\n path: aliasPath,\n content: aliasLines.join('\\n'),\n skipIfExists: true,\n });\n continue;\n }\n\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n // If this model is a dedup canonical (other models alias to it), skip\n // typeAlias resolution so the file exports the raw name. Dedup aliases\n // import using the raw name to stay consistent with preserved files.\n const isDedupCanonical = [...dedup.values()].includes(model.name);\n const domainName = resolveInterfaceName(model.name, ctx, isDedupCanonical ? { skipTypeAlias: true } : undefined);\n const responseName = wireInterfaceName(domainName);\n const deps = collectFieldDependencies(model);\n const lines: string[] = [];\n\n // Exclude the current model from generic defaults to avoid self-referencing\n // (e.g., Profile's own fields should use TCustom, not Profile<Record<...>>)\n let modelTypeRefOpts = typeRefOpts;\n let modelWireTypeRefOpts = wireTypeRefOpts;\n if (genericDefaults.has(model.name)) {\n const filteredDefaults = new Map(genericDefaults);\n filteredDefaults.delete(model.name);\n modelTypeRefOpts = { ...typeRefOpts, genericDefaults: filteredDefaults };\n modelWireTypeRefOpts = { genericDefaults: filteredDefaults };\n }\n\n // Baseline interface data (for compat field type matching)\n const baselineDomain = ctx.apiSurface?.interfaces?.[domainName];\n const baselineResponse = ctx.apiSurface?.interfaces?.[responseName];\n\n // Build set of importable type names for this file:\n // the model itself, its Response variant, all IR-dep model names + Response variants, and all IR-dep enum names\n const importableNames = new Set<string>();\n importableNames.add(domainName);\n importableNames.add(responseName);\n for (const dep of deps.models) {\n const depName = resolveInterfaceName(dep, ctx);\n importableNames.add(depName);\n importableNames.add(wireInterfaceName(depName));\n }\n for (const dep of deps.enums) {\n importableNames.add(dep);\n }\n\n // Pre-pass: discover baseline type names that aren't directly importable.\n // For each unresolvable name we either:\n // 1. Import the real type from another service (if it exists as an enum/model there)\n // 2. Create a local type alias from a suffix match\n // 3. Mark as unresolvable — the field will fall back to the IR-generated type\n const typeDecls = new Map<string, string>(); // aliasName → type expression\n const crossServiceImports = new Map<string, { name: string; relPath: string }>(); // extra imports\n const unresolvableNames = new Set<string>(); // names that can't be resolved — forces IR fallback\n const enumToService = assignEnumsToServices(ctx.spec.enums, ctx.spec.services);\n // Build a lookup: resolved enum name → IR enum name\n const resolvedEnumNames = new Map<string, string>();\n for (const e of ctx.spec.enums) {\n resolvedEnumNames.set(resolveInterfaceName(e.name, ctx), e.name);\n }\n\n for (const field of model.fields) {\n const baselineFields = [\n baselineDomain?.fields?.[fieldName(field.name)],\n baselineResponse?.fields?.[wireFieldName(field.name)],\n ].filter(Boolean) as { type: string; optional: boolean }[];\n\n for (const bf of baselineFields) {\n const names = bf.type.match(/\\b[A-Z][a-zA-Z0-9]*\\b/g);\n if (!names) continue;\n\n for (const name of names) {\n if (TS_BUILTINS.has(name)) continue;\n if (importableNames.has(name)) continue;\n if (typeDecls.has(name)) continue;\n if (crossServiceImports.has(name)) continue;\n if (unresolvableNames.has(name)) continue;\n\n // Check if this name exists as an enum in another service —\n // import the actual type so the extractor sees the real name\n const irEnumName = resolvedEnumNames.get(name);\n if (irEnumName && !deps.enums.has(irEnumName)) {\n const eService = enumToService.get(irEnumName);\n const eDir = resolveDir(eService);\n const relPath =\n eDir === dirName\n ? `./${fileName(irEnumName)}.interface`\n : `../../${eDir}/interfaces/${fileName(irEnumName)}.interface`;\n crossServiceImports.set(name, { name, relPath });\n importableNames.add(name);\n continue;\n }\n\n // Try suffix match: find an importable name ending with this name\n const candidates = [...importableNames].filter((n) => n.endsWith(name) && n !== name);\n if (candidates.length === 1) {\n // Create local type alias (e.g., type RoleResponse = ProfileRoleResponse)\n typeDecls.set(name, candidates[0]);\n importableNames.add(name);\n } else {\n // Cannot resolve this baseline type name — mark it so the field\n // falls back to the IR-generated type instead of the baseline.\n // This avoids creating type aliases that reference undefined types.\n unresolvableNames.add(name);\n }\n }\n }\n }\n\n // Import referenced models (domain + response) and enums with correct cross-service paths\n for (const dep of deps.models) {\n const depName = resolveInterfaceName(dep, ctx);\n const depService = modelToService.get(dep);\n const depDir = resolveDir(depService);\n const relPath =\n depDir === dirName ? `./${fileName(dep)}.interface` : `../../${depDir}/interfaces/${fileName(dep)}.interface`;\n lines.push(`import type { ${depName}, ${wireInterfaceName(depName)} } from '${relPath}';`);\n }\n for (const dep of deps.enums) {\n const depService = enumToService.get(dep);\n const depDir = resolveDir(depService);\n const relPath =\n depDir === dirName ? `./${fileName(dep)}.interface` : `../../${depDir}/interfaces/${fileName(dep)}.interface`;\n lines.push(`import type { ${dep} } from '${relPath}';`);\n }\n for (const [, imp] of crossServiceImports) {\n lines.push(`import type { ${imp.name} } from '${imp.relPath}';`);\n }\n\n if (lines.length > 0) lines.push('');\n\n // Add local type declarations for unresolvable baseline type names\n for (const [alias, typeExpr] of typeDecls) {\n lines.push(`type ${alias} = ${typeExpr};`);\n }\n if (typeDecls.size > 0) lines.push('');\n\n // Type params (generics) — pass genericDefaults so baseline-detected generics\n // also get type parameter declarations on the interface itself.\n const typeParams = renderTypeParams(model, genericDefaults);\n\n // Domain interface (camelCase fields) — deduplicate by camelCase name\n const seenDomainFields = new Set<string>();\n if (model.description) {\n lines.push(...docComment(model.description));\n }\n if (model.fields.length === 0) {\n lines.push(`export type ${domainName}${typeParams} = object;`);\n } else {\n lines.push(`export interface ${domainName}${typeParams} {`);\n for (const field of model.fields) {\n const domainFieldName = fieldName(field.name);\n if (seenDomainFields.has(domainFieldName)) continue;\n seenDomainFields.add(domainFieldName);\n if (field.description || field.deprecated || field.readOnly || field.writeOnly || field.default !== undefined) {\n const parts: string[] = [];\n if (field.description) parts.push(field.description);\n if (field.readOnly) parts.push('@readonly');\n if (field.writeOnly) parts.push('@writeonly');\n if (field.default !== undefined) parts.push(`@default ${JSON.stringify(field.default)}`);\n if (field.deprecated) parts.push('@deprecated');\n lines.push(...docComment(parts.join('\\n'), 2));\n }\n const baselineField = baselineDomain?.fields?.[domainFieldName];\n // For the domain interface, also check that the response baseline's optionality\n // is compatible — the serializer reads from the response type and assigns to the domain type.\n // If the domain baseline says required but the response baseline says optional,\n // the serializer would produce T | undefined for a field expecting T.\n const domainWireField = wireFieldName(field.name);\n const responseBaselineField = baselineResponse?.fields?.[domainWireField];\n const domainResponseOptionalMismatch =\n baselineField && !baselineField.optional && responseBaselineField && responseBaselineField.optional;\n const readonlyPrefix = field.readOnly ? 'readonly ' : '';\n if (\n baselineField &&\n !domainResponseOptionalMismatch &&\n baselineTypeResolvable(baselineField.type, importableNames) &&\n baselineFieldCompatible(baselineField, field)\n ) {\n const opt = baselineField.optional ? '?' : '';\n lines.push(` ${readonlyPrefix}${domainFieldName}${opt}: ${baselineField.type};`);\n } else {\n // When a baseline exists for this model, new fields (not present in the\n // baseline) are generated as optional. The merger can deep-merge new\n // fields into existing interfaces, but it cannot update existing\n // deserializer function bodies. Making the field optional prevents a\n // type error where the interface requires a field that the preserved\n // deserializer never populates.\n const isNewFieldOnExistingModel = baselineDomain && !baselineField;\n // Also make the field optional when the response baseline has it as optional\n // but the domain baseline has it as required — the deserializer reads from\n // the response type, so if the response field is optional, the domain value\n // may be undefined.\n // Additionally, when a baseline exists for the RESPONSE interface but NOT the\n // domain interface, fields that are new on the response baseline become optional\n // in the wire type. The domain type must also be optional to match, otherwise\n // the deserializer produces T | undefined for a field typed as T.\n const isNewFieldOnExistingResponse = !baselineDomain && baselineResponse && !responseBaselineField;\n const opt =\n !field.required ||\n isNewFieldOnExistingModel ||\n domainResponseOptionalMismatch ||\n isNewFieldOnExistingResponse\n ? '?'\n : '';\n lines.push(` ${readonlyPrefix}${domainFieldName}${opt}: ${mapTypeRef(field.type, modelTypeRefOpts)};`);\n }\n }\n lines.push('}');\n } // close else for non-empty domain interface\n lines.push('');\n\n // Wire/response interface (snake_case fields) — deduplicate by snake_case name\n const seenWireFields = new Set<string>();\n if (model.fields.length === 0) {\n lines.push(`export type ${responseName}${typeParams} = object;`);\n } else {\n lines.push(`export interface ${responseName}${typeParams} {`);\n for (const field of model.fields) {\n const wireField = wireFieldName(field.name);\n if (seenWireFields.has(wireField)) continue;\n seenWireFields.add(wireField);\n const baselineField = baselineResponse?.fields?.[wireField];\n if (\n baselineField &&\n baselineTypeResolvable(baselineField.type, importableNames) &&\n baselineFieldCompatible(baselineField, field)\n ) {\n const opt = baselineField.optional ? '?' : '';\n lines.push(` ${wireField}${opt}: ${baselineField.type};`);\n } else {\n const isNewFieldOnExistingModel = baselineResponse && !baselineField;\n const opt = !field.required || isNewFieldOnExistingModel ? '?' : '';\n lines.push(` ${wireField}${opt}: ${mapWireTypeRef(field.type, modelWireTypeRefOpts)};`);\n }\n }\n lines.push('}');\n } // close else for non-empty wire interface\n\n files.push({\n path: `src/${dirName}/interfaces/${fileName(model.name)}.interface.ts`,\n content: pruneUnusedImports(lines).join('\\n'),\n skipIfExists: true,\n });\n }\n\n return files;\n}\n\n/**\n * Check if all PascalCase type references in a baseline type string\n * can be resolved to types that are actually importable in the generated file.\n * A type is importable if it's a builtin, or if it's among the set of names\n * that will be imported (the model's own name/response, or its IR deps).\n * Returns false if any reference is unresolvable (e.g., hand-written types\n * from the live SDK, or spec types from other services not in IR deps).\n */\nfunction baselineTypeResolvable(typeStr: string, importableNames: Set<string>): boolean {\n const matches = typeStr.match(/\\b[A-Z][a-zA-Z0-9]*\\b/g);\n if (!matches) return true;\n\n for (const name of matches) {\n if (TS_BUILTINS.has(name)) continue;\n if (importableNames.has(name)) continue;\n return false;\n }\n return true;\n}\n\n/**\n * Check if a baseline field type is compatible with the IR field for use\n * in the generated interface. The serializer generates expressions based on\n * the IR type, so the interface type must be assignable from the serializer output.\n *\n * Rejects baseline types when:\n * - IR field is nullable but baseline type doesn't include `null`\n * - IR field is optional but baseline says required (and vice versa)\n * - IR field is required but baseline says optional\n */\nfunction baselineFieldCompatible(baselineField: { type: string; optional: boolean }, irField: Field): boolean {\n const irNullable = irField.type.kind === 'nullable';\n const baselineHasNull = baselineField.type.includes('null');\n\n // If the IR field is nullable, the serializer produces `expr ?? null`,\n // so the baseline type must include null to be assignable.\n // Exception: for optional fields, the serializer's null guard converts\n // null to undefined (`wireAccess != null ? expr : undefined`), so the\n // result type is `T | undefined` which is compatible with `field?: T`.\n if (irNullable && !baselineHasNull && irField.required) {\n return false;\n }\n\n // If the IR field is optional, the serializer may produce undefined,\n // so the baseline should also be optional (or include undefined)\n if (!irField.required && !baselineField.optional && !baselineField.type.includes('undefined')) {\n return false;\n }\n\n // If the IR field is required but the baseline says optional,\n // the serializer produces a definite value but the interface is looser — that's OK\n // (the domain type is wider than the serializer output)\n\n // If the baseline type is Record<string, unknown> but the IR field has a more specific\n // type (model, enum, or union with named variants), prefer the IR type for better type safety\n if (baselineField.type === 'Record<string, unknown>' && hasSpecificIRType(irField.type)) {\n return false;\n }\n\n return true;\n}\n\n/** Check if an IR type is more specific than Record<string, unknown>. */\nfunction hasSpecificIRType(ref: TypeRef): boolean {\n switch (ref.kind) {\n case 'model':\n case 'enum':\n return true;\n case 'union':\n // A union with named model/enum variants is more specific\n return ref.variants.some((v) => v.kind === 'model' || v.kind === 'enum');\n case 'nullable':\n return hasSpecificIRType(ref.inner);\n default:\n return false;\n }\n}\n\nfunction renderTypeParams(model: Model, genericDefaults?: Map<string, string>): string {\n if (!model.typeParams?.length) {\n // Fallback: if genericDefaults indicates this model is generic (detected\n // from the baseline), generate a default generic type parameter declaration.\n if (genericDefaults?.has(model.name)) {\n return '<GenericType extends Record<string, unknown> = Record<string, unknown>>';\n }\n return '';\n }\n const params = model.typeParams.map((tp) => {\n const def = tp.default ? ` = ${mapTypeRef(tp.default)}` : '';\n return `${tp.name}${def}`;\n });\n return `<${params.join(', ')}>`;\n}\n\n// ---------------------------------------------------------------------------\n// Shared context — computed once and reused by interface + serializer passes\n// ---------------------------------------------------------------------------\n\ninterface SharedModelContext {\n modelToService: Map<string, string>;\n resolveDir: (irService: string | undefined) => string;\n useStringDates: boolean;\n dedup: Map<string, string>;\n genericDefaults: Map<string, string>;\n}\n\nfunction buildSharedContext(models: Model[], ctx: EmitterContext): SharedModelContext {\n const { modelToService, resolveDir } = createServiceDirResolver(models, ctx.spec.services, ctx);\n const useStringDates = detectStringDateConvention(models, ctx);\n const genericDefaults = buildGenericModelDefaults(ctx.spec.models);\n enrichGenericDefaultsFromBaseline(genericDefaults, models, ctx, resolveDir, modelToService);\n const dedup = buildDeduplicationMap(models, ctx);\n return { modelToService, resolveDir, useStringDates, dedup, genericDefaults };\n}\n\n// ---------------------------------------------------------------------------\n// Serializer file generation (moved from serializers.ts)\n// ---------------------------------------------------------------------------\n\n/**\n * Generate serializer files for all models.\n * Can accept pre-computed shared context to avoid duplicating work\n * when called alongside generateModels.\n */\nexport function generateSerializers(\n models: Model[],\n ctx: EmitterContext,\n shared?: SharedModelContext,\n): GeneratedFile[] {\n if (models.length === 0) return [];\n\n const { modelToService, resolveDir, useStringDates, dedup } = shared ?? buildSharedContext(models, ctx);\n const files: GeneratedFile[] = [];\n const skippedSerializeModels = new Set<string>();\n\n for (const model of models) {\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n\n // Deduplication: for structurally identical models, re-export the canonical serializer\n const canonicalName = dedup.get(model.name);\n if (canonicalName) {\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n // Skip typeAlias resolution for dedup serializers (same reason as interfaces).\n const skipTA = { skipTypeAlias: true };\n const domainName = resolveInterfaceName(model.name, ctx, skipTA);\n const canonDomainName = resolveInterfaceName(canonicalName, ctx, skipTA);\n\n const canonService = modelToService.get(canonicalName);\n const canonDir = resolveDir(canonService);\n const serializerPath = `src/${dirName}/serializers/${fileName(model.name)}.serializer.ts`;\n const canonSerializerPath = `src/${canonDir}/serializers/${fileName(canonicalName)}.serializer.ts`;\n\n // After noise suffix stripping, alias and canonical may resolve to the\n // same serializer path or the same function names. Skip — the canonical\n // serializer already provides the functions.\n if (serializerPath === canonSerializerPath) continue;\n if (domainName === canonDomainName) continue;\n const rel = relativeImport(serializerPath, canonSerializerPath);\n files.push({\n path: serializerPath,\n content: `export { deserialize${canonDomainName} as deserialize${domainName}, serialize${canonDomainName} as serialize${domainName} } from '${rel}';`,\n overwriteExisting: true,\n });\n continue;\n }\n\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n const isDedupCanonical = [...dedup.values()].includes(model.name);\n const domainName = resolveInterfaceName(model.name, ctx, isDedupCanonical ? { skipTypeAlias: true } : undefined);\n const responseName = wireInterfaceName(domainName);\n const serializerPath = `src/${dirName}/serializers/${fileName(model.name)}.serializer.ts`;\n const typeParams = renderSerializerTypeParams(model, ctx);\n const baselineResponse = ctx.apiSurface?.interfaces?.[responseName];\n const baselineDomain = ctx.apiSurface?.interfaces?.[domainName];\n\n const skipFormatFields = buildSkipFormatFields(model, useStringDates, baselineDomain);\n const shouldSkipSerialize = shouldSkipSerializeForModel(\n model,\n baselineResponse,\n baselineDomain,\n dedup,\n skippedSerializeModels,\n ctx,\n );\n if (shouldSkipSerialize) {\n skippedSerializeModels.add(model.name);\n }\n\n const sctx = { modelToService, resolveDir, useStringDates, dedup, skippedSerializeModels, ctx };\n const lines = [\n ...buildSerializerImports(model, serializerPath, dirName, domainName, responseName, sctx),\n ...emitSerializerBody(\n model,\n domainName,\n responseName,\n typeParams,\n baselineDomain,\n baselineResponse,\n skipFormatFields,\n shouldSkipSerialize,\n ctx,\n ),\n ];\n\n files.push({\n path: serializerPath,\n content: pruneUnusedImports(lines).join('\\n'),\n });\n }\n\n return files;\n}\n\n// ---------------------------------------------------------------------------\n// Combined generation — single shared context, two output streams\n// ---------------------------------------------------------------------------\n\n/**\n * Generate both interface files and serializer files in a single pass\n * with shared context computation.\n */\nexport function generateModelsAndSerializers(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n if (models.length === 0) return [];\n const shared = buildSharedContext(models, ctx);\n return [...generateModels(models, ctx, shared), ...generateSerializers(models, ctx, shared)];\n}\n","import type { Model, TypeRef, Enum, EmitterContext } from '@workos/oagen';\nimport { wireFieldName, fileName, resolveServiceDir } from './naming.js';\nimport { resolveResourceClassName } from './resources.js';\nimport { createServiceDirResolver, assignModelsToServices, isListMetadataModel, isListWrapperModel } from './utils.js';\n\n/**\n * Prefix mapping for generating realistic ID fixture values.\n * When a field named \"id\" belongs to a model whose name matches a key here,\n * the generated ID will be prefixed accordingly (e.g. \"conn_01234\").\n */\nexport const ID_PREFIXES: Record<string, string> = {\n Connection: 'conn_',\n Organization: 'org_',\n OrganizationMembership: 'om_',\n User: 'user_',\n Directory: 'directory_',\n DirectoryGroup: 'dir_grp_',\n DirectoryUser: 'dir_usr_',\n Invitation: 'inv_',\n Session: 'session_',\n AuthenticationFactor: 'auth_factor_',\n EmailVerification: 'email_verification_',\n MagicAuth: 'magic_auth_',\n PasswordReset: 'password_reset_',\n};\n\n/**\n * Generate JSON fixture files for test data.\n * Each model that appears as a response gets a fixture in wire format (snake_case).\n */\nexport function generateFixtures(\n spec: {\n models: Model[];\n enums: Enum[];\n services: any[];\n },\n ctx?: EmitterContext,\n): { path: string; content: string }[] {\n if (spec.models.length === 0) return [];\n\n const { modelToService, resolveDir } = ctx\n ? createServiceDirResolver(spec.models, ctx.spec.services, ctx)\n : {\n modelToService: assignModelsToServices(spec.models, spec.services),\n resolveDir: (irService: string | undefined) => (irService ? resolveServiceDir(irService) : 'common'),\n };\n const modelMap = new Map(spec.models.map((m) => [m.name, m]));\n const enumMap = new Map(spec.enums.map((e) => [e.name, e]));\n const files: { path: string; content: string }[] = [];\n\n const seenFixturePaths = new Set<string>();\n for (const model of spec.models) {\n // Skip redundant list-metadata and list-wrapper models (handled by shared types)\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n const fixturePath = `src/${dirName}/fixtures/${fileName(model.name)}.fixture.json`;\n\n // After noise suffix stripping, multiple models may resolve to the same\n // fixture path (e.g., OrganizationDto and Organization). Skip duplicates.\n if (seenFixturePaths.has(fixturePath)) continue;\n seenFixturePaths.add(fixturePath);\n\n const fixture = generateModelFixture(model, modelMap, enumMap);\n\n files.push({\n path: fixturePath,\n content: JSON.stringify(fixture, null, 2),\n });\n }\n\n // Generate list fixtures for models that appear in paginated responses\n for (const service of spec.services) {\n const resolvedName = ctx ? resolveResourceClassName(service, ctx) : service.name;\n const serviceDir = resolveServiceDir(resolvedName);\n for (const op of service.operations) {\n if (op.pagination) {\n let itemModel = op.pagination.itemType.kind === 'model' ? modelMap.get(op.pagination.itemType.name) : null;\n if (itemModel) {\n // Detect if the \"item\" model is actually a list wrapper (has `data` array + `list_metadata`).\n // If so, unwrap to the actual item type to avoid double-nesting in fixtures.\n const unwrapped = unwrapListModel(itemModel, modelMap);\n if (unwrapped) {\n itemModel = unwrapped;\n }\n const fixture = generateModelFixture(itemModel, modelMap, enumMap);\n const listFixture = {\n data: [fixture],\n list_metadata: {\n before: null,\n after: null,\n },\n };\n files.push({\n path: `src/${serviceDir}/fixtures/list-${fileName(itemModel.name)}.fixture.json`,\n content: JSON.stringify(listFixture, null, 2),\n });\n }\n }\n }\n }\n\n return files;\n}\n\n/**\n * Detect if a model is a list wrapper (has a `data` array field and a `list_metadata` field).\n * If so, return the inner item model from the `data` array. Otherwise return null.\n * This prevents double-nesting when the pagination itemType points to a list wrapper\n * instead of the actual item model.\n */\nexport function unwrapListModel(model: Model, modelMap: Map<string, Model>): Model | null {\n const dataField = model.fields.find((f) => f.name === 'data');\n const hasListMetadata = model.fields.some((f) => f.name === 'list_metadata' || f.name === 'listMetadata');\n if (dataField && hasListMetadata && dataField.type.kind === 'array') {\n const itemType = dataField.type.items;\n if (itemType.kind === 'model') {\n return modelMap.get(itemType.name) ?? null;\n }\n }\n return null;\n}\n\nfunction generateModelFixture(\n model: Model,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): Record<string, any> {\n const fixture: Record<string, any> = {};\n\n for (const field of model.fields) {\n const wireName = wireFieldName(field.name);\n // Prefer the OpenAPI example value when available on the field\n if (field.example !== undefined) {\n fixture[wireName] = field.example;\n } else {\n fixture[wireName] = generateFieldValue(field.type, field.name, model.name, modelMap, enumMap);\n }\n }\n\n return fixture;\n}\n\nfunction generateFieldValue(\n ref: TypeRef,\n fieldName: string,\n modelName: string,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): any {\n switch (ref.kind) {\n case 'primitive':\n return generatePrimitiveValue(ref.type, ref.format, fieldName, modelName);\n case 'literal':\n return ref.value;\n case 'enum': {\n const e = enumMap.get(ref.name);\n return e?.values[0]?.value ?? 'unknown';\n }\n case 'model': {\n const nested = modelMap.get(ref.name);\n if (nested) return generateModelFixture(nested, modelMap, enumMap);\n return {};\n }\n case 'array': {\n // For array<enum>, use actual enum values instead of a single generated item\n if (ref.items.kind === 'enum') {\n const e = enumMap.get(ref.items.name);\n if (e && e.values.length > 0) {\n return e.values.map((v) => v.value);\n }\n }\n const item = generateFieldValue(ref.items, fieldName, modelName, modelMap, enumMap);\n return [item];\n }\n case 'nullable':\n return generateFieldValue(ref.inner, fieldName, modelName, modelMap, enumMap);\n case 'union':\n if (ref.variants.length > 0) {\n return generateFieldValue(ref.variants[0], fieldName, modelName, modelMap, enumMap);\n }\n return null;\n case 'map':\n return {\n key: generateFieldValue(ref.valueType, 'value', modelName, modelMap, enumMap),\n };\n }\n}\n\nfunction generatePrimitiveValue(type: string, format: string | undefined, name: string, modelName: string): any {\n switch (type) {\n case 'string':\n if (format === 'date-time') return '2023-01-01T00:00:00.000Z';\n if (format === 'date') return '2023-01-01';\n if (format === 'uuid') return '00000000-0000-0000-0000-000000000000';\n if (name === 'id') {\n const prefix = ID_PREFIXES[modelName] ?? '';\n return `${prefix}01234`;\n }\n if (name.includes('id')) return `${name}_01234`;\n if (name.includes('email')) return 'test@example.com';\n if (name.includes('url') || name.includes('uri')) return 'https://example.com';\n if (name.includes('name')) return 'Test';\n return `test_${name}`;\n case 'integer':\n return 1;\n case 'number':\n return 1.0;\n case 'boolean':\n return true;\n case 'unknown':\n return {};\n default:\n return null;\n }\n}\n","import type { SdkBehavior } from '@workos/oagen';\n\n/**\n * Node-specific overrides for exception kind names.\n *\n * The IR `statusCodeMap` uses canonical kind names (e.g. 'Authentication'),\n * but the Node SDK historically uses different names for some status codes.\n * This map translates the IR kind name to the Node-specific name before\n * appending the 'Exception' suffix.\n */\nconst NODE_EXCEPTION_KIND_OVERRIDES: Record<string, string> = {\n Authentication: 'Unauthorized',\n};\n\n/** Fallback status code map when no SDK behavior is provided. */\nconst DEFAULT_STATUS_CODE_MAP: Record<string, string> = {\n '400': 'BadRequest',\n '401': 'Authentication',\n '403': 'Authorization',\n '404': 'NotFound',\n '409': 'Conflict',\n '422': 'UnprocessableEntity',\n '429': 'RateLimitExceeded',\n};\n\n/**\n * Build the status-code-to-exception-class-name map from SDK behavior,\n * applying Node-specific naming overrides.\n *\n * Example: IR `401: 'Authentication'` becomes `401: 'UnauthorizedException'`\n * because Node uses `UnauthorizedException` instead of `AuthenticationException`.\n */\nexport function buildNodeStatusExceptions(sdk?: SdkBehavior): Record<number, string> {\n const statusCodeMap = sdk?.errors?.statusCodeMap ?? DEFAULT_STATUS_CODE_MAP;\n return Object.fromEntries(\n Object.entries(statusCodeMap).map(([code, kind]) => {\n const nodeKind = NODE_EXCEPTION_KIND_OVERRIDES[kind] ?? kind;\n return [Number(code), `${nodeKind}Exception`];\n }),\n );\n}\n","import type { EmitterContext, Field, ResolvedWrapper } from '@workos/oagen';\nimport { toSnakeCase } from '@workos/oagen';\nimport { enrichModelsFromSpec } from './model-utils.js';\n\n/**\n * A resolved wrapper parameter with its variant model field and optional status.\n * Pre-computed once per wrapper so emitters don't repeat the lookup.\n */\nexport interface ResolvedWrapperParam {\n /** Wire name of the param (e.g., \"email\", \"grant_type\"). */\n paramName: string;\n /** The field from the variant model, or null if not found in the spec. */\n field: Field | null;\n /** Whether this param should be optional in the generated SDK. */\n isOptional: boolean;\n}\n\n/**\n * Resolve the variant model's fields for a wrapper's exposed params.\n *\n * Encapsulates the three-step lookup every emitter needs:\n * 1. Find the variant model via wrapper.targetVariant in ctx.spec.models\n * 2. Match each exposed param to its field in the variant\n * 3. Classify as required or optional using wrapper.optionalParams + field.required\n *\n * Field matching uses exact name first, then falls back to snake_case normalization\n * to handle cases where wire names and model field names differ in casing.\n */\nexport function resolveWrapperParams(wrapper: ResolvedWrapper, ctx: EmitterContext): ResolvedWrapperParam[] {\n let variantModel = ctx.spec.models.find((m) => m.name === wrapper.targetVariant);\n\n // If the variant model has no fields, try enriching from the raw spec.\n // Some oneOf variants have 0 IR fields until enrichModelsFromSpec backfills them.\n if (!variantModel || variantModel.fields.length === 0) {\n const enriched = enrichModelsFromSpec(ctx.spec.models);\n variantModel = enriched.find((m) => m.name === wrapper.targetVariant) ?? variantModel;\n }\n\n const variantFields = variantModel?.fields ?? [];\n const optionalSet = new Set(wrapper.optionalParams);\n\n return wrapper.exposedParams.map((paramName) => {\n const field =\n variantFields.find((f) => f.name === paramName || toSnakeCase(f.name) === toSnakeCase(paramName)) ?? null;\n // Default to required: a wrapper exists to make a specific call shape work,\n // and exposedParams is the contract for that shape. Mark optional only when\n // (a) the wrapper hint explicitly says so, or (b) the IR variant model\n // resolves and reports the field as not required.\n let isOptional: boolean;\n if (optionalSet.has(paramName)) {\n isOptional = true;\n } else if (field) {\n isOptional = !field.required;\n } else {\n isOptional = false;\n }\n return { paramName, field, isOptional };\n });\n}\n\n/**\n * Format a snake_case wrapper name into a human-readable description.\n * \"authenticate_with_password\" → \"Authenticate with password\"\n */\nexport function formatWrapperDescription(name: string): string {\n return name\n .split('_')\n .map((w, i) => (i === 0 ? w.charAt(0).toUpperCase() + w.slice(1) : w))\n .join(' ');\n}\n","import type { EmitterContext, ResolvedOperation, ResolvedWrapper } from '@workos/oagen';\nimport { toCamelCase } from '@workos/oagen';\nimport { fieldName, resolveInterfaceName, wireInterfaceName } from './naming.js';\nimport { mapTypeRef } from './type-map.js';\nimport { resolveWrapperParams, formatWrapperDescription } from '../shared/wrapper-utils.js';\n\n/**\n * Generate TypeScript wrapper method lines for union split operations.\n *\n * Each wrapper is a typed convenience method that:\n * - Accepts only the exposed params (not the full union body)\n * - Injects constant defaults (e.g., grant_type)\n * - Reads inferred fields from client config (e.g., clientId)\n * - Delegates to the HTTP client with the constructed body\n */\nexport function generateWrapperMethods(resolvedOp: ResolvedOperation, ctx: EmitterContext): string[] {\n if (!resolvedOp.wrappers || resolvedOp.wrappers.length === 0) return [];\n\n const lines: string[] = [];\n\n for (const wrapper of resolvedOp.wrappers) {\n lines.push('');\n emitWrapperMethod(lines, resolvedOp, wrapper, ctx);\n }\n\n return lines;\n}\n\n/**\n * Collect response model names referenced by wrappers on a resolved operation.\n * Used by the resource generator to ensure the correct imports are emitted.\n */\nexport function collectWrapperResponseModels(resolvedOp: ResolvedOperation): Set<string> {\n const models = new Set<string>();\n for (const wrapper of resolvedOp.wrappers ?? []) {\n if (wrapper.responseModelName) {\n models.add(wrapper.responseModelName);\n }\n }\n return models;\n}\n\nfunction emitWrapperMethod(\n lines: string[],\n resolvedOp: ResolvedOperation,\n wrapper: ResolvedWrapper,\n ctx: EmitterContext,\n): void {\n const op = resolvedOp.operation;\n const method = toCamelCase(wrapper.name);\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n\n // Build parameter list: path params, then required exposed, then optional exposed\n const paramParts: string[] = [];\n\n for (const p of op.pathParams) {\n paramParts.push(`${fieldName(p.name)}: string`);\n }\n\n for (const { paramName, field, isOptional } of wrapperParams) {\n if (isOptional) continue;\n const tsName = fieldName(paramName);\n const tsType = field ? mapTypeRef(field.type) : 'string';\n paramParts.push(`${tsName}: ${tsType}`);\n }\n\n for (const { paramName, field, isOptional } of wrapperParams) {\n if (!isOptional) continue;\n const tsName = fieldName(paramName);\n const tsType = field ? mapTypeRef(field.type) : 'string';\n paramParts.push(`${tsName}?: ${tsType}`);\n }\n\n // Response type\n const responseTypeName = wrapper.responseModelName ? resolveInterfaceName(wrapper.responseModelName, ctx) : null;\n const wireType = responseTypeName ? wireInterfaceName(responseTypeName) : null;\n const returnType = responseTypeName ?? 'void';\n\n // JSDoc\n lines.push(` /** ${formatWrapperDescription(wrapper.name)}. */`);\n\n // Method signature\n lines.push(` async ${method}(${paramParts.join(', ')}): Promise<${returnType}> {`);\n\n // Build body with wire-format (snake_case) keys\n lines.push(' const body: Record<string, unknown> = {');\n\n // Constant defaults\n for (const [key, value] of Object.entries(wrapper.defaults)) {\n lines.push(` ${key}: ${tsLiteral(value)},`);\n }\n\n // Inferred fields from client config\n for (const field of wrapper.inferFromClient) {\n const expr = clientFieldExpression(field);\n lines.push(` ${field}: ${expr},`);\n }\n\n // Required exposed params (wire-format key, camelCase value)\n for (const { paramName, isOptional } of wrapperParams) {\n if (isOptional) continue;\n lines.push(` ${paramName}: ${fieldName(paramName)},`);\n }\n\n lines.push(' };');\n\n // Optional exposed params — add conditionally\n for (const { paramName, isOptional } of wrapperParams) {\n if (!isOptional) continue;\n const tsName = fieldName(paramName);\n lines.push(` if (${tsName} !== undefined) body.${paramName} = ${tsName};`);\n }\n\n // Build path expression\n const pathStr = buildPathStr(op);\n\n // Make the request\n if (responseTypeName) {\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(${pathStr}, body);`);\n lines.push(` return deserialize${responseTypeName}(data);`);\n } else {\n lines.push(` await this.workos.${op.httpMethod}(${pathStr}, body);`);\n }\n\n lines.push(' }');\n}\n\n/** Build a path template string from an Operation. */\nfunction buildPathStr(op: { path: string; pathParams: Array<{ name: string }> }): string {\n const interpolated = op.path.replace(/\\{(\\w+)\\}/g, (_, p) => `\\${${fieldName(p)}}`);\n return interpolated.includes('${') ? `\\`${interpolated}\\`` : `'${op.path}'`;\n}\n\n/** Convert a JS value to a TypeScript literal. */\nfunction tsLiteral(value: string | number | boolean): string {\n if (typeof value === 'string') return `'${value.replace(/'/g, \"\\\\'\")}'`;\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\n/** Get the TypeScript expression for reading a client config field. */\nfunction clientFieldExpression(field: string): string {\n switch (field) {\n case 'client_id':\n return 'this.workos.options.clientId';\n case 'client_secret':\n return 'this.workos.key';\n default:\n return `this.workos.${toCamelCase(field)}`;\n }\n}\n","// @oagen-ignore: Operation.async — all TypeScript SDK methods are async by nature\n\nimport type {\n Service,\n Operation,\n EmitterContext,\n GeneratedFile,\n TypeRef,\n Model,\n ResolvedOperation,\n} from '@workos/oagen';\nimport { planOperation, toPascalCase, toCamelCase } from '@workos/oagen';\nimport type { OperationPlan } from '@workos/oagen';\nimport { mapTypeRef } from './type-map.js';\nimport {\n fieldName,\n wireFieldName,\n fileName,\n resolveServiceDir,\n resolveMethodName,\n resolveInterfaceName,\n resolveServiceName,\n wireInterfaceName,\n} from './naming.js';\nimport {\n docComment,\n createServiceDirResolver,\n isServiceCoveredByExisting,\n hasMethodsAbsentFromBaseline,\n uncoveredOperations,\n} from './utils.js';\nimport { assignEnumsToServices } from './enums.js';\nimport { unwrapListModel } from './fixtures.js';\nimport { buildNodeStatusExceptions } from './sdk-errors.js';\nimport {\n buildResolvedLookup,\n lookupResolved,\n groupByMount,\n getOpDefaults,\n getOpInferFromClient,\n} from '../shared/resolved-ops.js';\nimport { generateWrapperMethods, collectWrapperResponseModels } from './wrappers.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\n\n/**\n * Check whether the baseline (hand-written) class has a constructor compatible\n * with the generated pattern `constructor(private readonly workos: WorkOS)`.\n * Returns true when no baseline exists (fresh generation) or when compatible.\n */\nexport function hasCompatibleConstructor(className: string, ctx: EmitterContext): boolean {\n const baselineClass = ctx.apiSurface?.classes?.[className];\n if (!baselineClass) return true; // No baseline — fresh generation\n const params = baselineClass.constructorParams;\n if (!params || params.length === 0) return true; // No-arg constructor is compatible\n // Compatible if there is a single `workos` param whose type contains \"WorkOS\"\n return params.some((p) => p.name === 'workos' && p.type.includes('WorkOS'));\n}\n\n/**\n * Resolve the resource class name for a service, accounting for constructor\n * compatibility with the baseline class.\n *\n * When the overlay-resolved class has an incompatible constructor (e.g., a\n * hand-written `Webhooks` class that takes `CryptoProvider` instead of `WorkOS`),\n * falls back to the IR name (`toPascalCase(service.name)`). If the IR name\n * collides with the overlay name, appends an `Endpoints` suffix.\n */\nexport function resolveResourceClassName(service: Service, ctx: EmitterContext): string {\n const overlayName = resolveServiceName(service, ctx);\n if (hasCompatibleConstructor(overlayName, ctx)) {\n return overlayName;\n }\n // Incompatible constructor — fall back to IR name\n const irName = toPascalCase(service.name);\n if (irName === overlayName) {\n return irName + 'Endpoints';\n }\n return irName;\n}\n\n/** Standard pagination query params handled by PaginationOptions — not imported individually. */\nconst PAGINATION_PARAM_NAMES = new Set(['limit', 'before', 'after', 'order']);\n\n/** Map HTTP status codes to their corresponding exception class names for @throws docs.\n * Built from sdk.errors.statusCodeMap with Node-specific naming overrides. */\nconst STATUS_TO_EXCEPTION_NAME: Record<number, string> = buildNodeStatusExceptions();\n\n/**\n * Compute the options interface name for a paginated method.\n * When the method name is simply \"list\", prefix with the service name to avoid\n * naming collisions at barrel-export level (e.g. \"ConnectionsListOptions\"\n * instead of the generic \"ListOptions\").\n */\nfunction paginatedOptionsName(method: string, resolvedServiceName: string): string {\n if (method === 'list') {\n return `${toPascalCase(resolvedServiceName)}ListOptions`;\n }\n return toPascalCase(method) + 'Options';\n}\n\n/** HTTP methods that require a body argument even when the spec has no request body. */\nfunction httpMethodNeedsBody(method: string): boolean {\n return method === 'post' || method === 'put' || method === 'patch';\n}\n\n// ---------------------------------------------------------------------------\n// Method-name deduplication helpers\n// ---------------------------------------------------------------------------\n\n/** Split a camelCase/PascalCase name into lowercase word parts. */\nfunction splitCamelWords(name: string): string[] {\n const parts: string[] = [];\n let start = 0;\n for (let i = 1; i < name.length; i++) {\n if (name[i] >= 'A' && name[i] <= 'Z') {\n parts.push(name.slice(start, i).toLowerCase());\n start = i;\n }\n }\n parts.push(name.slice(start).toLowerCase());\n return parts;\n}\n\n/** Naive singularize: strip trailing 's' unless it ends in 'ss'. */\nfunction singularize(word: string): string {\n return word.endsWith('s') && !word.endsWith('ss') ? word.slice(0, -1) : word;\n}\n\n/**\n * Deduplicate method names within the plans array.\n *\n * When `disambiguateOperationNames()` in `@workos/oagen` fails (e.g., for\n * single-segment paths like `/organizations`), two operations can resolve to\n * the same method name. Disambiguate by appending a path-derived suffix.\n */\nfunction deduplicateMethodNames(\n plans: Array<{ op: Operation; plan: OperationPlan; method: string }>,\n _ctx: EmitterContext,\n): void {\n const nameCount = new Map<string, number>();\n for (const p of plans) {\n nameCount.set(p.method, (nameCount.get(p.method) ?? 0) + 1);\n }\n\n for (const [name, count] of nameCount) {\n if (count <= 1) continue;\n const dupes = plans.filter((p) => p.method === name);\n\n // If all duplicates are on the SAME base path (different HTTP methods),\n // trust the names — they represent the same resource.\n const basePaths = new Set(dupes.map((d) => d.op.path.replace(/\\/\\{[^}]+\\}$/, '')));\n if (basePaths.size <= 1) continue;\n\n // Disambiguate: keep the name for the plan whose path best matches,\n // append path suffix for the others.\n // Score: how many words in the method name appear in the path segments\n const nameWords = new Set(splitCamelWords(name).map(singularize));\n const scored = dupes.map((d) => {\n const pathWords = d.op.path\n .split('/')\n .filter((s) => s && !s.startsWith('{'))\n .flatMap((s) => s.split('_'))\n .map(singularize);\n const overlap = pathWords.filter((w) => nameWords.has(w)).length;\n return { plan: d, score: overlap };\n });\n scored.sort((a, b) => b.score - a.score);\n\n // The best-scoring plan keeps the name; others get disambiguated\n for (let i = 1; i < scored.length; i++) {\n const dupe = scored[i].plan;\n const segments = dupe.op.path.split('/').filter((s) => s && !s.startsWith('{'));\n // Use first segment as suffix (the resource collection name)\n const suffix = segments[0] ?? '';\n if (suffix) {\n dupe.method = toCamelCase(`${name}_${suffix}`);\n }\n }\n\n // If still colliding after suffix, append index\n const stillDuped = new Map<string, typeof dupes>();\n for (const dupe of dupes) {\n const group = stillDuped.get(dupe.method) ?? [];\n group.push(dupe);\n stillDuped.set(dupe.method, group);\n }\n for (const [, group] of stillDuped) {\n if (group.length <= 1) continue;\n for (let i = 1; i < group.length; i++) {\n group[i].method = `${group[i].method}${i + 1}`;\n }\n }\n }\n}\n\n/**\n * Emit one interface file per paginated list operation that has extension\n * query params. Placing the options interface under `interfaces/` lets the\n * per-service barrel pick it up via `export * from './interfaces'`, which\n * is what the root `src/index.ts` re-exports. When the interface was\n * declared inline in the resource file, it was unreachable from the barrel\n * and callers couldn't import the type by name from the package root.\n */\nfunction generatePaginatedOptionsInterfaces(\n service: Service,\n ctx: EmitterContext,\n specEnumNames: Set<string>,\n): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const resolvedName = resolveResourceClassName(service, ctx);\n const serviceDir = resolveServiceDir(resolvedName);\n\n const plans = service.operations.map((op) => ({\n op,\n plan: planOperation(op),\n method: resolveMethodName(op, service, ctx),\n }));\n\n for (const { op, plan, method } of plans) {\n if (!plan.isPaginated) continue;\n const extraParams = op.queryParams.filter((p) => !PAGINATION_PARAM_NAMES.has(p.name));\n if (extraParams.length === 0) continue;\n\n const optionsName = paginatedOptionsName(method, resolvedName);\n const filePath = `src/${serviceDir}/interfaces/${fileName(optionsName)}.interface.ts`;\n\n const lines: string[] = [];\n lines.push(\"import type { PaginationOptions } from '../../common/interfaces/pagination-options.interface';\");\n lines.push('');\n lines.push(`export interface ${optionsName} extends PaginationOptions {`);\n for (const param of extraParams) {\n const opt = !param.required ? '?' : '';\n if (param.description || param.deprecated) {\n const parts: string[] = [];\n if (param.description) parts.push(param.description);\n if (param.deprecated) parts.push('@deprecated');\n lines.push(...docComment(parts.join('\\n'), 2));\n }\n lines.push(` ${fieldName(param.name)}${opt}: ${mapParamType(param.type, specEnumNames)};`);\n }\n lines.push('}');\n\n files.push({\n path: filePath,\n content: lines.join('\\n'),\n });\n }\n\n return files;\n}\n\nexport function generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n if (services.length === 0) return [];\n const files: GeneratedFile[] = [];\n\n // Group services by mount target to avoid file path collisions when\n // multiple IR services mount to the same resource class.\n const mountGroups = groupByMount(ctx);\n const mergedServices: Service[] =\n mountGroups.size > 0 ? [...mountGroups].map(([name, group]) => ({ name, operations: group.operations })) : services;\n\n const topLevelEnumNames = new Set(ctx.spec.enums.map((e) => e.name));\n\n for (const service of mergedServices) {\n if (isServiceCoveredByExisting(service, ctx)) {\n // Fully covered: generate with ALL operations so the merger's docstring\n // refresh pass can update JSDoc on existing methods.\n const file = generateResourceClass(service, ctx);\n // When the baseline class is missing methods for some operations,\n // remove skipIfExists so the merger adds the new methods.\n if (hasMethodsAbsentFromBaseline(service, ctx)) {\n delete file.skipIfExists;\n // Suppress auto-generated header — the file is a merge target\n // containing hand-written code, not a fully generated file.\n file.headerPlacement = 'skip';\n }\n files.push(file);\n continue;\n }\n\n const ops = uncoveredOperations(service, ctx);\n if (ops.length === 0) continue;\n\n if (ops.length < service.operations.length) {\n // Partial coverage: generate with ALL operations so JSDoc is available\n // for both covered and uncovered methods. Remove skipIfExists so the\n // merger adds new methods AND refreshes existing JSDoc.\n const file = generateResourceClass(service, ctx);\n delete file.skipIfExists;\n // Suppress auto-generated header — the file is a merge target\n // containing hand-written code, not a fully generated file.\n file.headerPlacement = 'skip';\n files.push(file);\n } else {\n // Purely oagen-managed: no baseline class exists, so the file is owned\n // end-to-end by the emitter. Remove skipIfExists so regeneration always\n // overwrites — emitter improvements (serializer dispatch, JSDoc, etc.)\n // must propagate without manual intervention.\n const file = generateResourceClass(service, ctx);\n delete file.skipIfExists;\n files.push(file);\n }\n }\n\n // Emit paginated list options interfaces AFTER the resource classes so\n // tests and manifest ordering that index `files[0]` as the class stay\n // stable. Placing them under `interfaces/` lets the per-service barrel\n // pick them up automatically.\n for (const service of mergedServices) {\n files.push(...generatePaginatedOptionsInterfaces(service, ctx, topLevelEnumNames));\n }\n\n return files;\n}\n\nfunction generateResourceClass(service: Service, ctx: EmitterContext): GeneratedFile {\n const resolvedName = resolveResourceClassName(service, ctx);\n const serviceDir = resolveServiceDir(resolvedName);\n const serviceClass = resolvedName;\n const resourcePath = `src/${serviceDir}/${fileName(resolvedName)}.ts`;\n\n const plans = service.operations.map((op) => ({\n op,\n plan: planOperation(op),\n method: resolveMethodName(op, service, ctx),\n }));\n\n // Resolved operations already produce correct method names via the\n // centralized hint map — no per-emitter reconciliation needed.\n\n // Deduplicate method names within the class (e.g., two operations both\n // resolving to \"create\" for different paths).\n deduplicateMethodNames(plans, ctx);\n\n // Sort plans to match the existing file's method order.\n // When the merger integrates generated content with existing files, its\n // URL-fingerprint fallback (pass 2) matches by position among methods that\n // share the same endpoint path. If the spec lists POST before GET for a\n // path (common in OpenAPI) but the existing class has them in a different\n // order, JSDoc comments get attached to the wrong methods (list↔create,\n // add↔set swaps). Sorting by the overlay's method order ensures the\n // generated output matches the existing file's method order.\n //\n // We build the order from HTTP operation keys (e.g., \"GET /organizations\")\n // rather than method names, because resolveMethodName may return a different\n // name than the overlay's methodName (e.g., when the hint map overrides it),\n // causing the lookup to fail and the sort to produce wrong order.\n if (ctx.overlayLookup?.methodByOperation) {\n const httpKeyOrder = new Map<string, number>();\n let pos = 0;\n for (const [httpKey] of ctx.overlayLookup.methodByOperation) {\n httpKeyOrder.set(httpKey, pos++);\n }\n if (httpKeyOrder.size > 0) {\n plans.sort((a, b) => {\n const aKey = `${a.op.httpMethod.toUpperCase()} ${a.op.path}`;\n const bKey = `${b.op.httpMethod.toUpperCase()} ${b.op.path}`;\n const aPos = httpKeyOrder.get(aKey) ?? Number.MAX_SAFE_INTEGER;\n const bPos = httpKeyOrder.get(bKey) ?? Number.MAX_SAFE_INTEGER;\n return aPos - bPos;\n });\n }\n }\n\n const hasPaginated = plans.some((p) => p.plan.isPaginated);\n const modelMap = new Map(ctx.spec.models.map((m) => [m.name, m]));\n\n // When merging into an existing class, the merger keeps baseline method\n // bodies but may add imports from the generated code. To avoid orphaned\n // imports for types used only by baseline methods (whose bodies are kept\n // intact), skip model collection for methods that already exist.\n const baselineMethodSet = new Set<string>();\n const baselineClass = ctx.apiSurface?.classes?.[serviceClass];\n if (baselineClass?.methods) {\n for (const name of Object.keys(baselineClass.methods)) {\n baselineMethodSet.add(name);\n }\n }\n\n // Collect models for imports — only include models that are actually used\n // in method signatures (not all union variants from the spec)\n const responseModels = new Set<string>();\n const requestModels = new Set<string>();\n const paramEnums = new Set<string>();\n const paramModels = new Set<string>();\n for (const { op, plan, method } of plans) {\n // Skip imports for methods that already exist in the baseline class.\n // The merger keeps baseline method bodies, so their imports are already\n // present in the existing file. Including them here would create\n // orphaned imports when the generated return type differs from the\n // baseline's (e.g., generated `List` vs baseline `RoleList`).\n if (baselineMethodSet.has(method)) continue;\n\n if (plan.isPaginated && op.pagination?.itemType.kind === 'model') {\n // For paginated operations, import the item type (e.g., Connection)\n // rather than the list wrapper type (e.g., ConnectionList).\n // fetchAndDeserialize handles the list envelope internally.\n // The IR's itemType may point to a list wrapper model — unwrap to the actual item.\n let itemName = op.pagination.itemType.name;\n const itemModel = modelMap.get(itemName);\n if (itemModel) {\n const unwrapped = unwrapListModel(itemModel, modelMap);\n if (unwrapped) {\n itemName = unwrapped.name;\n }\n }\n responseModels.add(itemName);\n } else if (plan.responseModelName) {\n responseModels.add(plan.responseModelName);\n }\n // Import request body model(s) — handles both single models and union variants.\n const bodyInfo = extractRequestBodyType(op, ctx);\n if (bodyInfo?.kind === 'model') {\n requestModels.add(bodyInfo.name);\n } else if (bodyInfo?.kind === 'union') {\n if (bodyInfo.discriminator) {\n // Discriminated union: import variant models with serializers so we can\n // dispatch to the correct serializer at runtime based on the discriminator.\n for (const name of bodyInfo.modelNames) {\n requestModels.add(name);\n }\n } else {\n // Non-discriminated union: import variant models with serializers so we\n // can dispatch to the correct serializer at runtime via field guards.\n for (const name of bodyInfo.modelNames) {\n requestModels.add(name);\n }\n }\n }\n // Collect types referenced in query and path parameters.\n // For paginated operations, skip standard pagination params (limit, before, after, order)\n // since they're handled by PaginationOptions and don't need explicit imports.\n const queryParams = plan.isPaginated\n ? op.queryParams.filter((p) => !PAGINATION_PARAM_NAMES.has(p.name))\n : op.queryParams;\n for (const param of [...queryParams, ...op.pathParams]) {\n collectParamTypeRefs(param.type, paramEnums, paramModels);\n }\n }\n\n // Collect response models from union split wrappers so their types and\n // deserializers are imported alongside the primary operation models.\n // Also collect models referenced in wrapper param signatures (e.g.,\n // `redirect_uris: RedirectUriInput[]`) — otherwise the wrapper emits a\n // reference to a type it never imported.\n const resolvedLookup = buildResolvedLookup(ctx);\n for (const { op, method } of plans) {\n if (baselineMethodSet.has(method)) continue;\n const resolved = lookupResolved(op, resolvedLookup);\n if (resolved) {\n for (const name of collectWrapperResponseModels(resolved)) {\n responseModels.add(name);\n }\n for (const wrapper of resolved.wrappers ?? []) {\n for (const { field } of resolveWrapperParams(wrapper, ctx)) {\n if (field) collectParamTypeRefs(field.type, paramEnums, paramModels);\n }\n }\n }\n }\n\n const allModels = new Set([...responseModels, ...requestModels, ...paramModels]);\n\n const lines: string[] = [];\n\n // Imports\n lines.push(\"import type { WorkOS } from '../workos';\");\n if (hasPaginated) {\n lines.push(\"import type { PaginationOptions } from '../common/interfaces/pagination-options.interface';\");\n lines.push(\"import type { AutoPaginatable } from '../common/utils/pagination';\");\n lines.push(\"import { createPaginatedList } from '../common/utils/fetch-and-deserialize';\");\n }\n\n // Paginated list options live in their own interface files so they're\n // picked up by the per-service barrel (and flow through to the root\n // package barrel). Import them here rather than declaring inline.\n for (const { op, plan, method } of plans) {\n if (!plan.isPaginated) continue;\n const extraParams = op.queryParams.filter((p) => !PAGINATION_PARAM_NAMES.has(p.name));\n if (extraParams.length === 0) continue;\n const optionsName = paginatedOptionsName(method, resolvedName);\n lines.push(`import type { ${optionsName} } from './interfaces/${fileName(optionsName)}.interface';`);\n }\n\n // Check if any operation needs PostOptions (idempotent POST or custom encoding)\n const hasIdempotentPost = plans.some((p) => p.plan.isIdempotentPost);\n const hasCustomEncoding = plans.some(\n (p) => p.op.requestBodyEncoding && p.op.requestBodyEncoding !== 'json' && p.plan.hasBody,\n );\n if (hasIdempotentPost || hasCustomEncoding) {\n lines.push(\"import type { PostOptions } from '../common/interfaces/post-options.interface';\");\n }\n\n // Compute model-to-service mapping for correct cross-service import paths\n const { modelToService, resolveDir } = createServiceDirResolver(ctx.spec.models, ctx.spec.services, ctx);\n\n // Wire (Response) types are only needed for models used as response types in method signatures.\n // Request models and param models only need the domain type.\n const usedWireTypes = new Set<string>();\n for (const name of responseModels) {\n usedWireTypes.add(resolveInterfaceName(name, ctx));\n }\n\n // Track imported resolved names to prevent duplicate type name collisions\n const importedTypeNames = new Set<string>();\n for (const name of allModels) {\n const resolved = resolveInterfaceName(name, ctx);\n if (importedTypeNames.has(resolved)) continue; // Skip duplicate resolved names\n importedTypeNames.add(resolved);\n const modelDir = modelToService.get(name);\n const modelServiceDir = resolveDir(modelDir);\n const relPath =\n modelServiceDir === serviceDir\n ? `./interfaces/${fileName(name)}.interface`\n : `../${modelServiceDir}/interfaces/${fileName(name)}.interface`;\n if (usedWireTypes.has(resolved)) {\n lines.push(`import type { ${resolved}, ${wireInterfaceName(resolved)} } from '${relPath}';`);\n } else {\n lines.push(`import type { ${resolved} } from '${relPath}';`);\n }\n }\n\n // Collect serializer imports by module path so we can merge deserialize and\n // serialize imports from the same module into a single import statement.\n const serializerImportsByPath = new Map<string, string[]>();\n\n const importedDeserializers = new Set<string>();\n for (const name of responseModels) {\n const resolved = resolveInterfaceName(name, ctx);\n if (importedDeserializers.has(resolved)) continue;\n importedDeserializers.add(resolved);\n const modelDir = modelToService.get(name);\n const modelServiceDir = resolveDir(modelDir);\n const relPath =\n modelServiceDir === serviceDir\n ? `./serializers/${fileName(name)}.serializer`\n : `../${modelServiceDir}/serializers/${fileName(name)}.serializer`;\n const existing = serializerImportsByPath.get(relPath) ?? [];\n existing.push(`deserialize${resolved}`);\n serializerImportsByPath.set(relPath, existing);\n }\n\n const importedSerializers = new Set<string>();\n for (const name of requestModels) {\n const resolved = resolveInterfaceName(name, ctx);\n if (importedSerializers.has(resolved)) continue;\n importedSerializers.add(resolved);\n const modelDir = modelToService.get(name);\n const modelServiceDir = resolveDir(modelDir);\n const relPath =\n modelServiceDir === serviceDir\n ? `./serializers/${fileName(name)}.serializer`\n : `../${modelServiceDir}/serializers/${fileName(name)}.serializer`;\n const existing = serializerImportsByPath.get(relPath) ?? [];\n existing.push(`serialize${resolved}`);\n serializerImportsByPath.set(relPath, existing);\n }\n\n // Emit merged serializer imports\n for (const [relPath, specifiers] of serializerImportsByPath) {\n lines.push(`import { ${specifiers.join(', ')} } from '${relPath}';`);\n }\n\n // Build a set of global enum names — used to distinguish named enums (with files)\n // from inline enums (no file, must be rendered as string literal unions).\n const specEnumNames = new Set(ctx.spec.enums.map((e) => e.name));\n\n // Import enum types referenced in query/path parameters.\n // Only import enums that actually exist in the spec's global enums list —\n // inline string unions may have kind 'enum' but no corresponding file.\n if (paramEnums.size > 0) {\n const enumToService = assignEnumsToServices(ctx.spec.enums, ctx.spec.services);\n for (const name of paramEnums) {\n if (allModels.has(name)) continue; // Already imported as a model\n if (!specEnumNames.has(name)) continue; // No file generated for this enum\n const enumDir = enumToService.get(name);\n const enumServiceDir = resolveDir(enumDir);\n const relPath =\n enumServiceDir === serviceDir\n ? `./interfaces/${fileName(name)}.interface`\n : `../${enumServiceDir}/interfaces/${fileName(name)}.interface`;\n lines.push(`import type { ${name} } from '${relPath}';`);\n }\n }\n\n lines.push('');\n\n // Per-operation helpers (wire-format option serializers etc.) emitted\n // alongside the resource class. The options interfaces themselves live\n // in separate files under `interfaces/` so the per-service barrel can\n // re-export them; see the earlier import block at the top of the file.\n for (const { op, plan, method } of plans) {\n if (plan.isPaginated) {\n const extraParams = op.queryParams.filter((p) => !PAGINATION_PARAM_NAMES.has(p.name));\n if (extraParams.length > 0) {\n const optionsName = paginatedOptionsName(method, resolvedName);\n\n // When any extension param has a camelCase domain name that differs\n // from its snake_case wire name, emit a serializer that translates\n // the user-facing options into the wire query shape. Without this,\n // the query string uses camelCase keys (e.g. `organizationId=...`)\n // that the API silently ignores — the filter becomes a no-op.\n const needsWireSerializer = extraParams.some((p) => fieldName(p.name) !== wireFieldName(p.name));\n if (needsWireSerializer) {\n const serializerName = `serialize${optionsName}`;\n lines.push(`const ${serializerName} = (options: ${optionsName}): PaginationOptions => {`);\n // Pagination fields pass through unchanged (limit/before/after/order\n // share spelling in both cases). Spread first so that wire-named\n // extension fields land on top and the camelCase keys don't also\n // leak into the query string.\n lines.push(' const wire: Record<string, unknown> = {');\n for (const p of PAGINATION_PARAM_NAMES) {\n lines.push(` ${p}: options.${p},`);\n }\n lines.push(' };');\n for (const param of extraParams) {\n const camel = fieldName(param.name);\n const snake = wireFieldName(param.name);\n lines.push(` if (options.${camel} !== undefined) wire.${snake} = options.${camel};`);\n }\n lines.push(' return wire as PaginationOptions;');\n lines.push('};');\n lines.push('');\n }\n }\n } else if (!plan.isPaginated && !plan.hasBody && !plan.isDelete && op.queryParams.length > 0) {\n // Non-paginated GET or void methods with query params get a typed options interface\n // instead of falling back to Record<string, unknown>.\n // Filter out hidden params (defaults and inferFromClient fields)\n const resolved = lookupResolved(op, resolvedLookup);\n const opHiddenParams = new Set<string>([\n ...Object.keys(getOpDefaults(resolved)),\n ...getOpInferFromClient(resolved),\n ]);\n const visibleParams = op.queryParams.filter((p) => !opHiddenParams.has(p.name));\n if (visibleParams.length > 0) {\n const optionsName = toPascalCase(method) + 'Options';\n lines.push(`export interface ${optionsName} {`);\n for (const param of visibleParams) {\n const opt = !param.required ? '?' : '';\n if (param.description || param.deprecated) {\n const parts: string[] = [];\n if (param.description) parts.push(param.description);\n if (param.deprecated) parts.push('@deprecated');\n lines.push(...docComment(parts.join('\\n'), 2));\n }\n lines.push(` ${fieldName(param.name)}${opt}: ${mapParamType(param.type, specEnumNames)};`);\n }\n lines.push('}');\n lines.push('');\n }\n }\n }\n\n // Resource class\n if (service.description) {\n lines.push(...docComment(service.description));\n }\n lines.push(`export class ${serviceClass} {`);\n lines.push(' constructor(private readonly workos: WorkOS) {}');\n\n for (const { op, plan, method } of plans) {\n lines.push('');\n const resolved = lookupResolved(op, resolvedLookup);\n lines.push(...renderMethod(op, plan, method, service, ctx, modelMap, specEnumNames, resolved));\n\n // Emit union split wrapper methods (typed convenience methods for each variant)\n if (resolved?.wrappers && resolved.wrappers.length > 0) {\n lines.push(...generateWrapperMethods(resolved, ctx));\n }\n }\n\n lines.push('}');\n\n return { path: resourcePath, content: lines.join('\\n'), skipIfExists: true };\n}\n\nfunction renderMethod(\n op: Operation,\n plan: OperationPlan,\n method: string,\n service: Service,\n ctx: EmitterContext,\n modelMap: Map<string, Model>,\n specEnumNames?: Set<string>,\n resolvedOp?: ResolvedOperation,\n): string[] {\n const lines: string[] = [];\n const responseModel = plan.responseModelName ? resolveInterfaceName(plan.responseModelName, ctx) : null;\n\n const pathStr = buildPathStr(op);\n\n // Build the set of params hidden from the method signature\n // (injected from client config or as constant defaults)\n const hiddenParams = new Set<string>([\n ...Object.keys(getOpDefaults(resolvedOp)),\n ...getOpInferFromClient(resolvedOp),\n ]);\n\n // Build set of valid param names to filter @param tags.\n // Prefer the overlay (existing method signature) if available;\n // otherwise compute from what the render path will actually include.\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const overlayMethod = ctx.overlayLookup?.methodByOperation?.get(httpKey);\n let validParamNames: Set<string> | null = null;\n if (overlayMethod) {\n validParamNames = new Set(overlayMethod.params.map((p) => p.name));\n } else {\n // Compute actual params based on render path to avoid documenting params\n // that won't appear in the method signature\n const actualParams = new Set<string>();\n for (const p of op.pathParams) actualParams.add(fieldName(p.name));\n if (plan.hasBody) actualParams.add('payload');\n if (plan.isPaginated) actualParams.add('options');\n // renderGetMethod/renderVoidMethod add options when there are visible non-paginated query params\n const visibleQueryCount = op.queryParams.filter((q) => !hiddenParams.has(q.name)).length;\n if (!plan.isPaginated && visibleQueryCount > 0 && !plan.isDelete) {\n actualParams.add('options');\n }\n validParamNames = actualParams;\n }\n\n // Always generate JSDoc for all methods (both existing and new).\n // The merger matches docstrings by member name — if we skip JSDoc for\n // existing methods, previously misplaced docstrings can never be corrected.\n // Hand-written docs (e.g., @deprecated, PKCE flow descriptions) are\n // preserved by the merger's @deprecated-preservation and @oagen-ignore\n // mechanisms instead.\n {\n const docParts: string[] = [];\n if (op.description) docParts.push(op.description);\n for (const param of op.pathParams) {\n const paramName = fieldName(param.name);\n if (validParamNames && !validParamNames.has(paramName)) continue;\n const deprecatedPrefix = param.deprecated ? '(deprecated) ' : '';\n if (param.description) {\n docParts.push(`@param ${paramName} - ${deprecatedPrefix}${param.description}`);\n } else if (param.deprecated) {\n docParts.push(`@param ${paramName} - (deprecated)`);\n }\n if (param.default !== undefined) docParts.push(`@default ${JSON.stringify(param.default)}`);\n if (param.example !== undefined) docParts.push(`@example ${JSON.stringify(param.example)}`);\n }\n // Document query params for non-paginated operations\n if (!plan.isPaginated) {\n // Only document query params if the method will have an options parameter\n if (validParamNames && (validParamNames.has('options') || overlayMethod)) {\n for (const param of op.queryParams) {\n if (hiddenParams.has(param.name)) continue;\n const paramName = `options.${fieldName(param.name)}`;\n if (validParamNames && !validParamNames.has('options') && !validParamNames.has(fieldName(param.name)))\n continue;\n const deprecatedPrefix = param.deprecated ? '(deprecated) ' : '';\n if (param.description) {\n docParts.push(`@param ${paramName} - ${deprecatedPrefix}${param.description}`);\n } else if (param.deprecated) {\n docParts.push(`@param ${paramName} - (deprecated)`);\n }\n if (param.default !== undefined) docParts.push(`@default ${JSON.stringify(param.default)}`);\n if (param.example !== undefined) docParts.push(`@example ${JSON.stringify(param.example)}`);\n }\n }\n }\n // Skip header and cookie params in JSDoc — they are not exposed in the method signature.\n // The SDK handles headers and cookies internally, so documenting them would be misleading.\n // Document payload parameter when there is a request body\n if (plan.hasBody) {\n const bodyInfo = extractRequestBodyType(op, ctx);\n if (bodyInfo?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => m.name === bodyInfo.name);\n let payloadDesc: string;\n if (bodyModel?.description) {\n payloadDesc = `@param payload - ${bodyModel.description}`;\n } else if (bodyModel) {\n // When the model lacks a description, list its required fields to help\n // callers understand what must be provided.\n const requiredFieldNames = bodyModel.fields.filter((f) => f.required).map((f) => fieldName(f.name));\n payloadDesc =\n requiredFieldNames.length > 0\n ? `@param payload - Object containing ${requiredFieldNames.join(', ')}.`\n : '@param payload - The request body.';\n } else {\n payloadDesc = '@param payload - The request body.';\n }\n docParts.push(payloadDesc);\n } else {\n docParts.push('@param payload - The request body.');\n }\n }\n // Document options parameter for paginated operations\n if (plan.isPaginated) {\n docParts.push('@param options - Pagination and filter options.');\n } else if (op.queryParams.filter((q) => !hiddenParams.has(q.name)).length > 0) {\n docParts.push('@param options - Additional query options.');\n }\n // @returns for the primary response model.\n // When an overlay method exists, prefer its return type so the JSDoc\n // matches the actual TypeScript signature (the overlay may use a\n // different model name than the OpenAPI schema).\n if (overlayMethod?.returnType) {\n docParts.push(`@returns {${overlayMethod.returnType}}`);\n } else if (plan.isPaginated && op.pagination?.itemType.kind === 'model') {\n // Unwrap list wrapper models to match the actual return type — the method returns\n // AutoPaginatable<ItemType>, not the list wrapper.\n let itemRawName = op.pagination.itemType.name;\n const pModel = modelMap.get(itemRawName);\n if (pModel) {\n const unwrapped = unwrapListModel(pModel, modelMap);\n if (unwrapped) itemRawName = unwrapped.name;\n }\n const itemTypeName = resolveInterfaceName(itemRawName, ctx);\n docParts.push(`@returns {Promise<AutoPaginatable<${itemTypeName}>>}`);\n } else if (responseModel) {\n const returnTypeDoc = plan.isArrayResponse ? `${responseModel}[]` : responseModel;\n docParts.push(`@returns {Promise<${returnTypeDoc}>}`);\n } else {\n docParts.push('@returns {Promise<void>}');\n }\n // @throws for error responses\n for (const err of op.errors) {\n const exceptionName = STATUS_TO_EXCEPTION_NAME[err.statusCode];\n if (exceptionName) {\n docParts.push(`@throws {${exceptionName}} ${err.statusCode}`);\n }\n }\n if (op.deprecated) docParts.push('@deprecated');\n\n if (docParts.length > 0) {\n // Flatten all parts, splitting multiline descriptions into individual lines\n const allLines: string[] = [];\n for (const part of docParts) {\n for (const line of part.split('\\n')) {\n allLines.push(line);\n }\n }\n if (allLines.length === 1) {\n lines.push(` /** ${allLines[0]} */`);\n } else {\n lines.push(' /**');\n for (const line of allLines) {\n lines.push(line === '' ? ' *' : ` * ${line}`);\n }\n lines.push(' */');\n }\n }\n }\n\n const preDecisionCount = lines.length;\n\n if (plan.isPaginated && op.pagination && op.httpMethod === 'get') {\n // For paginated operations, use the item type from pagination metadata\n // (e.g., Connection) rather than the list wrapper type (e.g., ConnectionList).\n // Unwrap list wrapper models to get the actual item type name.\n let paginatedItemRawName = op.pagination.itemType.kind === 'model' ? op.pagination.itemType.name : null;\n if (paginatedItemRawName) {\n const pModel = modelMap.get(paginatedItemRawName);\n if (pModel) {\n const unwrapped = unwrapListModel(pModel, modelMap);\n if (unwrapped) {\n paginatedItemRawName = unwrapped.name;\n }\n }\n }\n const paginatedItemType = paginatedItemRawName ? resolveInterfaceName(paginatedItemRawName, ctx) : responseModel;\n if (paginatedItemType) {\n const resolvedServiceNameForPaginated = resolveServiceName(service, ctx);\n renderPaginatedMethod(\n lines,\n op,\n plan,\n method,\n paginatedItemType,\n pathStr,\n resolvedServiceNameForPaginated,\n specEnumNames,\n );\n }\n } else if (plan.isPaginated && plan.hasBody && responseModel) {\n // Non-GET paginated operation (e.g., PUT with list response) — treat as body method\n renderBodyMethod(lines, op, plan, method, responseModel, pathStr, ctx, specEnumNames);\n } else if (plan.isDelete && plan.hasBody) {\n renderDeleteWithBodyMethod(lines, op, plan, method, pathStr, ctx, specEnumNames);\n } else if (plan.isDelete) {\n renderDeleteMethod(lines, op, plan, method, pathStr, specEnumNames);\n } else if (plan.hasBody && responseModel) {\n renderBodyMethod(lines, op, plan, method, responseModel, pathStr, ctx, specEnumNames);\n } else if (responseModel) {\n renderGetMethod(lines, op, plan, method, responseModel, pathStr, specEnumNames, resolvedOp);\n } else {\n renderVoidMethod(lines, op, plan, method, pathStr, ctx, specEnumNames, resolvedOp);\n }\n\n // Defensive: if no render function produced a method body, emit a stub\n if (lines.length === preDecisionCount) {\n const params = buildPathParams(op, specEnumNames);\n lines.push(` async ${method}(${params}): Promise<void> {`);\n lines.push(\n ` await this.workos.${op.httpMethod}(${pathStr}${httpMethodNeedsBody(op.httpMethod) ? ', {}' : ''});`,\n );\n lines.push(' }');\n }\n\n return lines;\n}\n\nfunction renderPaginatedMethod(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n method: string,\n itemType: string,\n pathStr: string,\n resolvedServiceName: string,\n specEnumNames?: Set<string>,\n): void {\n const extraParams = op.queryParams.filter((p) => !PAGINATION_PARAM_NAMES.has(p.name));\n const optionsType = extraParams.length > 0 ? paginatedOptionsName(method, resolvedServiceName) : 'PaginationOptions';\n // When any extension param has a camelCase/snake_case divergence, the\n // resource file emits a `serialize<OptionsName>` helper — pass it to\n // createPaginatedList so the wire query uses snake_case keys.\n const needsWireSerializer = extraParams.some((p) => fieldName(p.name) !== wireFieldName(p.name));\n const serializerArg = needsWireSerializer ? `, serialize${optionsType}` : '';\n\n const pathParams = buildPathParams(op, specEnumNames);\n const allParams = pathParams ? `${pathParams}, options?: ${optionsType}` : `options?: ${optionsType}`;\n\n lines.push(` async ${method}(${allParams}): Promise<AutoPaginatable<${itemType}, ${optionsType}>> {`);\n lines.push(\n ` return createPaginatedList<${wireInterfaceName(itemType)}, ${itemType}, ${optionsType}>(this.workos, ${pathStr}, deserialize${itemType}, options${serializerArg});`,\n );\n lines.push(' }');\n}\n\nfunction renderDeleteMethod(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n method: string,\n pathStr: string,\n specEnumNames?: Set<string>,\n): void {\n const params = buildPathParams(op, specEnumNames);\n lines.push(` async ${method}(${params}): Promise<void> {`);\n lines.push(` await this.workos.delete(${pathStr});`);\n lines.push(' }');\n}\n\nfunction renderDeleteWithBodyMethod(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n method: string,\n pathStr: string,\n ctx: EmitterContext,\n specEnumNames?: Set<string>,\n): void {\n const bodyInfo = extractRequestBodyType(op, ctx);\n let requestType: string;\n let bodyExpr: string;\n if (bodyInfo?.kind === 'model') {\n requestType = resolveInterfaceName(bodyInfo.name, ctx);\n bodyExpr = `serialize${requestType}(payload)`;\n } else if (bodyInfo?.kind === 'union') {\n requestType = bodyInfo.typeStr;\n if (bodyInfo.discriminator) {\n bodyExpr = renderUnionBodySerializer(bodyInfo.discriminator, ctx);\n } else {\n bodyExpr = renderNonDiscriminatedUnionBodySerializer(bodyInfo.modelNames, ctx);\n }\n } else {\n requestType = 'Record<string, unknown>';\n bodyExpr = 'payload';\n }\n\n const paramParts: string[] = [];\n for (const param of op.pathParams) {\n paramParts.push(\n `${fieldName(param.name)}: ${specEnumNames ? mapParamType(param.type, specEnumNames) : mapTypeRef(param.type)}`,\n );\n }\n paramParts.push(`payload: ${requestType}`);\n\n lines.push(` async ${method}(${paramParts.join(', ')}): Promise<void> {`);\n lines.push(` await this.workos.deleteWithBody(${pathStr}, ${bodyExpr});`);\n lines.push(' }');\n}\n\nfunction renderBodyMethod(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n method: string,\n responseModel: string,\n pathStr: string,\n ctx: EmitterContext,\n specEnumNames?: Set<string>,\n): void {\n const bodyInfo = extractRequestBodyType(op, ctx);\n let requestType: string;\n let bodyExpr: string;\n if (bodyInfo?.kind === 'model') {\n requestType = resolveInterfaceName(bodyInfo.name, ctx);\n bodyExpr = `serialize${requestType}(payload)`;\n } else if (bodyInfo?.kind === 'union') {\n requestType = bodyInfo.typeStr;\n if (bodyInfo.discriminator) {\n bodyExpr = renderUnionBodySerializer(bodyInfo.discriminator, ctx);\n } else {\n bodyExpr = renderNonDiscriminatedUnionBodySerializer(bodyInfo.modelNames, ctx);\n }\n } else {\n requestType = 'Record<string, unknown>';\n bodyExpr = 'payload';\n }\n\n const paramParts: string[] = [];\n\n // Always pass path params as individual parameters (matches existing SDK pattern)\n for (const param of op.pathParams) {\n paramParts.push(\n `${fieldName(param.name)}: ${specEnumNames ? mapParamType(param.type, specEnumNames) : mapTypeRef(param.type)}`,\n );\n }\n\n paramParts.push(`payload: ${requestType}`);\n\n if (plan.isIdempotentPost) {\n paramParts.push('requestOptions: PostOptions = {}');\n }\n\n const paramsStr = paramParts.join(', ');\n\n // Fix 2: Pass encoding option when requestBodyEncoding is non-json\n const encoding = op.requestBodyEncoding;\n const encodingOption = encoding && encoding !== 'json' ? `, encoding: '${encoding}' as const` : '';\n const hasCustomEncoding = encodingOption !== '';\n\n const returnType = plan.isArrayResponse ? `${responseModel}[]` : responseModel;\n const wireType = plan.isArrayResponse ? `${wireInterfaceName(responseModel)}[]` : wireInterfaceName(responseModel);\n const returnExpr = plan.isArrayResponse\n ? `data.map(deserialize${responseModel})`\n : `deserialize${responseModel}(data)`;\n\n lines.push(` async ${method}(${paramsStr}): Promise<${returnType}> {`);\n if (plan.isIdempotentPost) {\n if (hasCustomEncoding) {\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(`);\n lines.push(` ${pathStr},`);\n lines.push(` ${bodyExpr},`);\n lines.push(` { ...requestOptions${encodingOption} },`);\n lines.push(' );');\n } else {\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(`);\n lines.push(` ${pathStr},`);\n lines.push(` ${bodyExpr},`);\n lines.push(' requestOptions,');\n lines.push(' );');\n }\n } else {\n if (hasCustomEncoding) {\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(`);\n lines.push(` ${pathStr},`);\n lines.push(` ${bodyExpr},`);\n lines.push(` { ${encodingOption.slice(2)} },`);\n lines.push(' );');\n } else {\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(`);\n lines.push(` ${pathStr},`);\n lines.push(` ${bodyExpr},`);\n lines.push(' );');\n }\n }\n lines.push(` return ${returnExpr};`);\n lines.push(' }');\n}\n\nfunction renderGetMethod(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n method: string,\n responseModel: string,\n pathStr: string,\n specEnumNames?: Set<string>,\n resolvedOp?: ResolvedOperation,\n): void {\n const hiddenParams = new Set<string>([\n ...Object.keys(getOpDefaults(resolvedOp)),\n ...getOpInferFromClient(resolvedOp),\n ]);\n\n const params = buildPathParams(op, specEnumNames);\n const visibleQueryParams = op.queryParams.filter((p) => !hiddenParams.has(p.name));\n const hasVisibleQuery = visibleQueryParams.length > 0 && !plan.isPaginated;\n const hasDefaults = Object.keys(getOpDefaults(resolvedOp)).length > 0;\n const hasInferred = getOpInferFromClient(resolvedOp).length > 0;\n const hasInjected = hasDefaults || hasInferred;\n const hasQuery = (op.queryParams.length > 0 && !plan.isPaginated) || hasInjected;\n const optionsType = hasVisibleQuery ? toPascalCase(method) + 'Options' : null;\n\n const allParams = optionsType\n ? params\n ? `${params}, options?: ${optionsType}`\n : `options?: ${optionsType}`\n : params;\n\n const returnType = plan.isArrayResponse ? `${responseModel}[]` : responseModel;\n const wireType = plan.isArrayResponse ? `${wireInterfaceName(responseModel)}[]` : wireInterfaceName(responseModel);\n const returnExpr = plan.isArrayResponse\n ? `data.map(deserialize${responseModel})`\n : `deserialize${responseModel}(data)`;\n\n lines.push(` async ${method}(${allParams}): Promise<${returnType}> {`);\n if (hasQuery) {\n if (hasInjected) {\n // Build the query object with visible params, defaults, and inferred fields\n const queryParts: string[] = [];\n\n // Regular visible query params (from options)\n if (hasVisibleQuery) {\n for (const param of visibleQueryParams) {\n const camel = fieldName(param.name);\n const snake = wireFieldName(param.name);\n if (camel === snake) {\n if (param.required) {\n queryParts.push(`${camel}: options.${camel}`);\n } else {\n queryParts.push(`...(options?.${camel} !== undefined && { ${camel}: options.${camel} })`);\n }\n } else {\n if (param.required) {\n queryParts.push(`${snake}: options.${camel}`);\n } else {\n queryParts.push(`...(options?.${camel} !== undefined && { ${snake}: options.${camel} })`);\n }\n }\n }\n }\n\n // Constant defaults (e.g., response_type: 'code')\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n queryParts.push(`${key}: ${tsLiteral(value)}`);\n }\n\n // Inferred fields from client config (e.g., client_id from this.workos.options.clientId)\n for (const field of getOpInferFromClient(resolvedOp)) {\n queryParts.push(`${field}: ${clientFieldExpression(field)}`);\n }\n\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(${pathStr}, {`);\n lines.push(` query: { ${queryParts.join(', ')} },`);\n lines.push(' });');\n } else {\n const queryExpr = renderQueryExpr(visibleQueryParams);\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(${pathStr}, {`);\n lines.push(` query: ${queryExpr},`);\n lines.push(' });');\n }\n } else if (httpMethodNeedsBody(op.httpMethod)) {\n // PUT/PATCH/POST require a body argument even when the spec has no request body\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(${pathStr}, {});`);\n } else {\n lines.push(` const { data } = await this.workos.${op.httpMethod}<${wireType}>(${pathStr});`);\n }\n lines.push(` return ${returnExpr};`);\n lines.push(' }');\n}\n\n/** Convert a JS value to a TypeScript literal. */\nfunction tsLiteral(value: string | number | boolean): string {\n if (typeof value === 'string') return `'${value.replace(/'/g, \"\\\\'\")}'`;\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\n/** Get the TypeScript expression for reading a client config field. */\nfunction clientFieldExpression(field: string): string {\n switch (field) {\n case 'client_id':\n return 'this.workos.options.clientId';\n case 'client_secret':\n return 'this.workos.key';\n default:\n return `this.workos.${toCamelCase(field)}`;\n }\n}\n\nfunction renderVoidMethod(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n method: string,\n pathStr: string,\n ctx: EmitterContext,\n specEnumNames?: Set<string>,\n resolvedOp?: ResolvedOperation,\n): void {\n const hiddenParams = new Set<string>([\n ...Object.keys(getOpDefaults(resolvedOp)),\n ...getOpInferFromClient(resolvedOp),\n ]);\n\n const params = buildPathParams(op, specEnumNames);\n const visibleQueryParams = op.queryParams.filter((p) => !hiddenParams.has(p.name));\n const hasVisibleQuery = visibleQueryParams.length > 0 && !plan.hasBody;\n const hasDefaults = Object.keys(getOpDefaults(resolvedOp)).length > 0;\n const hasInferred = getOpInferFromClient(resolvedOp).length > 0;\n const hasInjected = hasDefaults || hasInferred;\n const hasQuery = hasVisibleQuery || (hasInjected && !plan.hasBody);\n const optionsType = hasVisibleQuery ? toPascalCase(method) + 'Options' : null;\n\n let bodyParam = '';\n let bodyExpr = 'payload';\n if (plan.hasBody) {\n const bodyInfo = extractRequestBodyType(op, ctx);\n if (bodyInfo?.kind === 'model') {\n const requestType = resolveInterfaceName(bodyInfo.name, ctx);\n bodyParam = `payload: ${requestType}`;\n bodyExpr = `serialize${requestType}(payload)`;\n } else if (bodyInfo?.kind === 'union') {\n bodyParam = `payload: ${bodyInfo.typeStr}`;\n if (bodyInfo.discriminator) {\n bodyExpr = renderUnionBodySerializer(bodyInfo.discriminator, ctx);\n } else {\n bodyExpr = renderNonDiscriminatedUnionBodySerializer(bodyInfo.modelNames, ctx);\n }\n } else {\n bodyParam = 'payload: Record<string, unknown>';\n bodyExpr = 'payload';\n }\n }\n\n const paramParts: string[] = [];\n if (params) paramParts.push(params);\n if (bodyParam) paramParts.push(bodyParam);\n if (optionsType) paramParts.push(`options?: ${optionsType}`);\n const allParams = paramParts.join(', ');\n\n lines.push(` async ${method}(${allParams}): Promise<void> {`);\n if (plan.hasBody) {\n lines.push(` await this.workos.${op.httpMethod}(${pathStr}, ${bodyExpr});`);\n } else if (hasQuery) {\n if (hasInjected) {\n // Build query object with visible params, defaults, and inferred fields\n const queryParts: string[] = [];\n\n if (hasVisibleQuery) {\n for (const param of visibleQueryParams) {\n const camel = fieldName(param.name);\n const snake = wireFieldName(param.name);\n if (camel === snake) {\n if (param.required) {\n queryParts.push(`${camel}: options.${camel}`);\n } else {\n queryParts.push(`...(options?.${camel} !== undefined && { ${camel}: options.${camel} })`);\n }\n } else {\n if (param.required) {\n queryParts.push(`${snake}: options.${camel}`);\n } else {\n queryParts.push(`...(options?.${camel} !== undefined && { ${snake}: options.${camel} })`);\n }\n }\n }\n }\n\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n queryParts.push(`${key}: ${tsLiteral(value)}`);\n }\n\n for (const field of getOpInferFromClient(resolvedOp)) {\n queryParts.push(`${field}: ${clientFieldExpression(field)}`);\n }\n\n lines.push(` await this.workos.${op.httpMethod}(${pathStr}, {`);\n lines.push(` query: { ${queryParts.join(', ')} },`);\n lines.push(' });');\n } else {\n const queryExpr = renderQueryExpr(visibleQueryParams);\n lines.push(` await this.workos.${op.httpMethod}(${pathStr}, {`);\n lines.push(` query: ${queryExpr},`);\n lines.push(' });');\n }\n } else if (httpMethodNeedsBody(op.httpMethod)) {\n lines.push(` await this.workos.${op.httpMethod}(${pathStr}, {});`);\n } else {\n lines.push(` await this.workos.${op.httpMethod}(${pathStr});`);\n }\n lines.push(' }');\n}\n\n/**\n * Generate an inline query serialization expression that maps camelCase option\n * keys to their snake_case wire equivalents. When all keys already match\n * (camel === snake), returns 'options' as-is for brevity.\n */\nfunction renderQueryExpr(queryParams: { name: string; required: boolean }[]): string {\n // Check if any key actually needs conversion\n const needsConversion = queryParams.some((p) => fieldName(p.name) !== wireFieldName(p.name));\n if (!needsConversion) return 'options';\n\n const parts: string[] = [];\n for (const param of queryParams) {\n const camel = fieldName(param.name);\n const snake = wireFieldName(param.name);\n if (param.required) {\n parts.push(`${snake}: options.${camel}`);\n } else {\n parts.push(`...(options.${camel} !== undefined && { ${snake}: options.${camel} })`);\n }\n }\n return `options ? { ${parts.join(', ')} } : undefined`;\n}\n\nfunction buildPathStr(op: Operation): string {\n const interpolated = op.path.replace(/\\{(\\w+)\\}/g, (_, p) => `\\${${fieldName(p)}}`);\n return interpolated.includes('${') ? `\\`${interpolated}\\`` : `'${op.path}'`;\n}\n\nfunction buildPathParams(op: Operation, specEnumNames?: Set<string>): string {\n // Start with declared path params\n const declaredNames = new Set(op.pathParams.map((p) => fieldName(p.name)));\n const params = op.pathParams.map((p) => {\n const type = specEnumNames ? mapParamType(p.type, specEnumNames) : mapTypeRef(p.type);\n return `${fieldName(p.name)}: ${type}`;\n });\n\n // Detect path template variables not in declared pathParams and add them as string params.\n // This handles cases where the spec path has {param} but pathParams is incomplete.\n const templateVars = [...op.path.matchAll(/\\{(\\w+)\\}/g)].map(([, name]) => fieldName(name));\n for (const varName of templateVars) {\n if (!declaredNames.has(varName)) {\n params.push(`${varName}: string`);\n }\n }\n\n return params.join(', ');\n}\n\n/**\n * Walk a parameter's type tree and collect enum/model names for imports.\n * Handles arrays and nullable wrappers that may contain nested enums/models.\n */\nfunction collectParamTypeRefs(type: TypeRef, enums: Set<string>, models: Set<string>): void {\n switch (type.kind) {\n case 'enum':\n enums.add(type.name);\n break;\n case 'model':\n models.add(type.name);\n break;\n case 'array':\n collectParamTypeRefs(type.items, enums, models);\n break;\n case 'nullable':\n collectParamTypeRefs(type.inner, enums, models);\n break;\n }\n}\n\n/**\n * Extract request body type info, supporting both single models and union types.\n * Returns structured info so callers can handle imports and serialization appropriately.\n */\n/**\n * Generate an IIFE expression that dispatches to the correct serializer for a\n * discriminated union request body. Switches on the camelCase discriminator\n * property of the domain object and calls the appropriate serialize function\n * for each mapped model variant.\n */\nfunction renderUnionBodySerializer(\n disc: { property: string; mapping: Record<string, string> },\n ctx: EmitterContext,\n): string {\n const prop = fieldName(disc.property);\n const cases: string[] = [];\n for (const [value, modelName] of Object.entries(disc.mapping)) {\n const resolved = resolveInterfaceName(modelName, ctx);\n // Switch on a typed discriminator narrows `payload` to the variant, so the\n // serializer call type-checks without any casts.\n cases.push(`case '${value}': return serialize${resolved}(payload)`);\n }\n // Assign `payload` to `never` in the default branch to get a compile-time\n // exhaustiveness check — if a new variant is added to the union but not to\n // the switch, the build fails here. At runtime, we still throw so an\n // unknown discriminator slipping through via `as any` fails loudly rather\n // than silently forwarding camelCase to the API.\n return `(() => { switch (payload.${prop}) { ${cases.join('; ')}; default: { const _unknown: never = payload; throw new Error(\\`Unknown ${prop}: \\${(_unknown as { ${prop}?: unknown }).${prop}}\\`) } } })()`;\n}\n\n/**\n * Generate an IIFE expression that dispatches to the correct serializer for a\n * non-discriminated union request body. Inspects model fields to find a\n * required field unique to each variant and uses `'field' in payload` guards.\n * Falls back to `payload` only when no variant can be distinguished.\n */\nfunction renderNonDiscriminatedUnionBodySerializer(modelNames: string[], ctx: EmitterContext): string {\n const modelMap = new Map(ctx.spec.models.map((m) => [m.name, m]));\n\n // Try to detect an implicit discriminator: a required field present in all\n // variants whose type is `kind: 'literal'` with a distinct value per variant.\n // This covers oneOf unions where each variant has e.g. `grant_type: 'authorization_code'`.\n const implicitDisc = detectImplicitDiscriminator(modelNames, modelMap);\n if (implicitDisc) {\n return renderUnionBodySerializer(implicitDisc, ctx);\n }\n\n // Collect required field names per model (using camelCase domain names).\n const requiredFieldsByModel = new Map<string, Set<string>>();\n for (const name of modelNames) {\n const model = modelMap.get(name);\n if (!model) return 'payload';\n requiredFieldsByModel.set(name, new Set(model.fields.filter((f) => f.required).map((f) => fieldName(f.name))));\n }\n\n // For each model, find a required field that no other model has.\n const guards: Array<{ modelName: string; field: string }> = [];\n let fallbackModel: string | undefined;\n\n for (const name of modelNames) {\n const myFields = requiredFieldsByModel.get(name)!;\n let uniqueField: string | undefined;\n for (const field of myFields) {\n const isUnique = modelNames.every((other) => other === name || !requiredFieldsByModel.get(other)?.has(field));\n if (isUnique) {\n uniqueField = field;\n break;\n }\n }\n if (uniqueField) {\n guards.push({ modelName: name, field: uniqueField });\n } else if (!fallbackModel) {\n fallbackModel = name;\n } else {\n // Multiple models with no unique field — can't dispatch\n return 'payload';\n }\n }\n\n if (guards.length === 0) return 'payload';\n\n const parts: string[] = [];\n for (const { modelName, field } of guards) {\n const resolved = resolveInterfaceName(modelName, ctx);\n parts.push(`if ('${field}' in payload) return serialize${resolved}(payload as any)`);\n }\n if (fallbackModel) {\n const resolved = resolveInterfaceName(fallbackModel, ctx);\n parts.push(`return serialize${resolved}(payload as any)`);\n } else {\n parts.push('return payload');\n }\n\n return `(() => { ${parts.join('; ')} })()`;\n}\n\n/**\n * Detect an implicit discriminator from literal-typed fields.\n * Returns a discriminator descriptor if all variants share a required field\n * whose type is `kind: 'literal'` with a distinct value per variant.\n */\nfunction detectImplicitDiscriminator(\n modelNames: string[],\n modelMap: Map<string, Model>,\n): { property: string; mapping: Record<string, string> } | null {\n if (modelNames.length < 2) return null;\n\n const firstModel = modelMap.get(modelNames[0]);\n if (!firstModel) return null;\n\n // Candidate fields: required fields with literal type in the first model.\n const candidates = firstModel.fields.filter((f) => f.required && f.type.kind === 'literal');\n\n for (const candidate of candidates) {\n const mapping: Record<string, string> = {};\n const values = new Set<string | number | boolean | null>();\n let valid = true;\n\n for (const name of modelNames) {\n const model = modelMap.get(name);\n if (!model) {\n valid = false;\n break;\n }\n const field = model.fields.find((f) => f.name === candidate.name);\n if (!field || !field.required || field.type.kind !== 'literal') {\n valid = false;\n break;\n }\n const val = field.type.value;\n if (values.has(val)) {\n valid = false;\n break;\n } // duplicate value\n values.add(val);\n mapping[String(val)] = name;\n }\n\n if (valid && Object.keys(mapping).length === modelNames.length) {\n return { property: candidate.name, mapping };\n }\n }\n\n return null;\n}\n\n/** Return type for extractRequestBodyType when the body is a union. */\ninterface UnionBodyInfo {\n kind: 'union';\n typeStr: string;\n modelNames: string[];\n discriminator?: { property: string; mapping: Record<string, string> };\n}\n\nfunction extractRequestBodyType(\n op: Operation,\n ctx: EmitterContext,\n): { kind: 'model'; name: string } | UnionBodyInfo | null {\n if (!op.requestBody) return null;\n if (op.requestBody.kind === 'model') return { kind: 'model', name: op.requestBody.name };\n if (op.requestBody.kind === 'union') {\n const modelNames: string[] = [];\n for (const variant of op.requestBody.variants) {\n if (variant.kind === 'model') modelNames.push(variant.name);\n }\n if (modelNames.length > 0) {\n const typeStr = modelNames.map((n) => resolveInterfaceName(n, ctx)).join(' | ');\n return {\n kind: 'union',\n typeStr,\n modelNames,\n discriminator: op.requestBody.discriminator,\n };\n }\n }\n return null;\n}\n\n/**\n * Map a parameter type to a TypeScript type string, handling inline enums\n * that don't have corresponding global enum definitions. These would\n * otherwise emit bare names like `Type` or `Action` that are never imported.\n *\n * Recursively handles container types (arrays, nullable) so that inline\n * enums nested inside e.g. `array<enum>` are also inlined as string literal unions.\n */\nfunction mapParamType(type: TypeRef, specEnumNames: Set<string>): string {\n if (type.kind === 'enum' && !specEnumNames.has(type.name)) {\n // Inline enum with no generated file — render values as string literal union\n if (type.values && type.values.length > 0) {\n return type.values.map((v: string | number) => (typeof v === 'string' ? `'${v}'` : String(v))).join(' | ');\n }\n return 'string';\n }\n if (type.kind === 'array') {\n const inner = mapParamType(type.items, specEnumNames);\n // Parenthesize union types when used as array element type\n return inner.includes(' | ') ? `(${inner})[]` : `${inner}[]`;\n }\n if (type.kind === 'nullable') {\n return `${mapParamType(type.inner, specEnumNames)} | null`;\n }\n return mapTypeRef(type);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ApiSpec, AuthScheme, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { collectReferencedNames } from '@workos/oagen';\nimport { fileName, resolveServiceDir, servicePropertyName, resolveInterfaceName, wireInterfaceName } from './naming.js';\nimport {\n docComment,\n createServiceDirResolver,\n isServiceCoveredByExisting,\n isListMetadataModel,\n isListWrapperModel,\n} from './utils.js';\nimport { resolveResourceClassName } from './resources.js';\n\nexport function generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n files.push(generateWorkOSClient(spec, ctx));\n files.push(...generateServiceBarrels(spec, ctx));\n files.push(generateBarrel(spec, ctx));\n // worker barrel, package.json, tsconfig.json are now hand-maintained in the target SDK\n\n return files;\n}\n\nfunction generateWorkOSClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile {\n const lines: string[] = [];\n\n // Only import WorkOSBase for fresh generation (no existing WorkOS class).\n // When integrating into an existing SDK, the existing WorkOS already has its\n // own base class and the WorkOSBase file may not exist.\n const hasExistingWorkOS = !!ctx.apiSurface?.classes?.['WorkOS'];\n if (!hasExistingWorkOS) {\n lines.push(\"import { WorkOSBase } from './common/workos-base';\");\n }\n\n // Filter out services whose endpoints are already covered by existing\n // hand-written service classes (e.g., Connections covered by SSO).\n const coveredServices = new Set<string>();\n for (const service of spec.services) {\n if (isServiceCoveredByExisting(service, ctx)) {\n coveredServices.add(service.name);\n }\n }\n\n // Service imports — skip covered services\n for (const service of spec.services) {\n if (coveredServices.has(service.name)) continue;\n const resolvedName = resolveResourceClassName(service, ctx);\n const serviceDir = resolveServiceDir(resolvedName);\n lines.push(`import { ${resolvedName} } from './${serviceDir}/${fileName(resolvedName)}';`);\n }\n\n lines.push('');\n if (spec.description) {\n lines.push(...docComment(spec.description));\n }\n const extendsClause = hasExistingWorkOS ? '' : ' extends WorkOSBase';\n lines.push(`export class WorkOS${extendsClause} {`);\n\n // Server URL constants from spec.servers\n if (spec.servers && spec.servers.length > 0) {\n for (const server of spec.servers) {\n const constName = serverConstName(server.description ?? server.url);\n if (server.description) {\n lines.push(...docComment(server.description, 2));\n }\n lines.push(` static readonly ${constName} = '${server.url}';`);\n }\n lines.push('');\n }\n\n // Resource accessors — skip services whose property already exists\n // in the baseline WorkOS class (e.g., `portal` covers AdminPortal,\n // `mfa` covers MultiFactorAuth).\n const existingProps = new Set<string>();\n const baselineWorkOS = ctx.apiSurface?.classes?.['WorkOS'] ?? ctx.apiSurface?.classes?.['WorkOSNode'];\n if (baselineWorkOS?.properties) {\n for (const name of Object.keys(baselineWorkOS.properties)) {\n existingProps.add(name);\n }\n }\n // Resource accessors — skip services whose endpoints are fully covered\n // by existing hand-written services.\n for (const service of spec.services) {\n if (coveredServices.has(service.name)) continue;\n const resolvedName = resolveResourceClassName(service, ctx);\n const propName = servicePropertyName(resolvedName);\n if (existingProps.has(propName)) continue;\n // Propagate `@deprecated` from the service class to the property so\n // IDEs surface the strikethrough at `workos.xyz` access sites, not\n // just when users `new Xyz()` directly. TS's deprecation-lint reads\n // the property JSDoc, not the underlying type declaration.\n const classDeprecation = ctx.apiSurface?.classes?.[resolvedName]?.deprecationMessage;\n if (classDeprecation !== undefined) {\n const body = classDeprecation ? ` ${classDeprecation}` : '';\n lines.push(` /** @deprecated${body} */`);\n }\n lines.push(` readonly ${propName} = new ${resolvedName}(this);`);\n }\n\n // Auth override — only emit when auth is non-default (not bearer)\n if (needsAuthOverride(spec.auth)) {\n lines.push('');\n lines.push(' protected override setAuthHeaders(headers: Record<string, string>): void {');\n renderAuthOverride(lines, spec.auth!);\n lines.push(' }');\n }\n\n lines.push('}');\n\n return {\n path: 'src/workos.ts',\n content: lines.join('\\n'),\n skipIfExists: true,\n };\n}\n\n/**\n * Generate per-service barrel files (interfaces/index.ts) that re-export\n * all interface and enum files for each service directory. This reduces\n * the root barrel from ~200+ individual type exports to one wildcard\n * re-export per service.\n */\nfunction generateServiceBarrels(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const { modelToService, resolveDir } = createServiceDirResolver(spec.models, spec.services, ctx);\n\n // Group interface files by directory, tracking exported symbol names\n // to prevent TS2308 duplicate export errors when two files in the same\n // directory export the same symbol (e.g., FooResponse as a wire type\n // from one file and a domain type from another).\n const dirExports = new Map<string, string[]>();\n const dirSymbols = new Map<string, Set<string>>();\n\n // Pre-seed dirSymbols with names already exported by existing interface files.\n // When the existing SDK has an interface file in a directory that already\n // exports a name (e.g., AuditLogSchema from create-audit-log-schema-options),\n // the generated model with the same name must be skipped to prevent the\n // merger from adding a duplicate `export *` that causes TS2308.\n //\n // Also track baseline file stems per directory so we can detect when the\n // barrel needs updating with new export lines (see hasNewExports below).\n const dirSymbolsFromBaseline = new Map<string, Set<string>>();\n const seedFromBaseline = (sourceFile: string, name: string) => {\n const match = sourceFile.match(/^src\\/([^/]+)\\/interfaces\\/(.+)\\.ts$/);\n if (!match) return;\n const dirName = match[1];\n const fileStem = match[2];\n if (!dirSymbols.has(dirName)) dirSymbols.set(dirName, new Set());\n dirSymbols.get(dirName)!.add(name);\n if (!dirSymbolsFromBaseline.has(dirName)) dirSymbolsFromBaseline.set(dirName, new Set());\n dirSymbolsFromBaseline.get(dirName)!.add(fileStem);\n };\n if (ctx.apiSurface?.interfaces) {\n for (const [name, iface] of Object.entries(ctx.apiSurface.interfaces)) {\n const sourceFile = (iface as any).sourceFile as string | undefined;\n if (sourceFile) seedFromBaseline(sourceFile, name);\n }\n }\n if (ctx.apiSurface?.enums) {\n for (const [name, enumDef] of Object.entries(ctx.apiSurface.enums)) {\n const sourceFile = (enumDef as any).sourceFile as string | undefined;\n if (sourceFile) seedFromBaseline(sourceFile, name);\n }\n }\n if (ctx.apiSurface?.typeAliases) {\n for (const [name, alias] of Object.entries(ctx.apiSurface.typeAliases)) {\n const sourceFile = (alias as any).sourceFile as string | undefined;\n if (sourceFile) seedFromBaseline(sourceFile, name);\n }\n }\n\n // Build a global set of all symbols across all directories for\n // cross-directory deduplication. This prevents adding a model to one\n // directory's barrel when the same symbol already exists in another\n // directory's barrel (e.g., Event in common vs events, DirectoryState\n // in directory-sync vs common).\n const globalExistingSymbols = new Set<string>();\n for (const symbols of dirSymbols.values()) {\n for (const sym of symbols) {\n globalExistingSymbols.add(sym);\n }\n }\n\n // Models -> service directories\n // Skip list wrapper and list metadata models — they use shared List<T>/ListMetadata\n // from common utils, so no per-resource interface file is generated.\n // Also skip unreachable models — oagen only passes service-referenced models\n // to generateModels, so unreachable models have no interface file to export.\n const barrelReachable = collectReferencedNames(spec.services, spec.models);\n for (const model of spec.models) {\n if (isListMetadataModel(model) || isListWrapperModel(model)) continue;\n if (!barrelReachable.models.has(model.name)) continue;\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n if (!dirExports.has(dirName)) {\n dirExports.set(dirName, []);\n // Only initialize dirSymbols if not already pre-seeded from baseline\n if (!dirSymbols.has(dirName)) {\n dirSymbols.set(dirName, new Set());\n }\n }\n\n // Each model file exports a domain interface and a wire interface.\n // Track these symbols to detect cross-file collisions.\n const domainName = resolveInterfaceName(model.name, ctx);\n const wireName = wireInterfaceName(domainName);\n const symbols = dirSymbols.get(dirName)!;\n\n if (globalExistingSymbols.has(domainName) || globalExistingSymbols.has(wireName)) {\n // Skip this model's export to avoid duplicate symbol in the barrel\n // (checks across ALL directories, not just the target one)\n continue;\n }\n\n symbols.add(domainName);\n symbols.add(wireName);\n // Also track in the global set so subsequent models in other directories\n // don't re-export the same symbol (intra-generation cross-directory dedup).\n globalExistingSymbols.add(domainName);\n globalExistingSymbols.add(wireName);\n dirExports.get(dirName)!.push(`export * from './${fileName(model.name)}.interface';`);\n }\n\n // Enums -> service directories\n for (const enumDef of spec.enums) {\n const enumService = findEnumService(enumDef.name, spec.services);\n const dirName = resolveDir(enumService);\n if (!dirExports.has(dirName)) {\n dirExports.set(dirName, []);\n if (!dirSymbols.has(dirName)) {\n dirSymbols.set(dirName, new Set());\n }\n }\n\n const symbols = dirSymbols.get(dirName)!;\n if (globalExistingSymbols.has(enumDef.name)) continue;\n\n symbols.add(enumDef.name);\n globalExistingSymbols.add(enumDef.name);\n dirExports.get(dirName)!.push(`export * from './${fileName(enumDef.name)}.interface';`);\n }\n\n for (const [dirName, exports] of dirExports) {\n const exportSet = new Set(exports);\n\n // When integrating into an existing SDK, include baseline exports from\n // the api-surface so the barrel is comprehensive. This ensures stale\n // entries (e.g., renamed files from previous generations) are removed\n // when overwriteExisting replaces the barrel.\n if (ctx.apiSurface) {\n const addBaselineExports = (items: Record<string, any> | undefined) => {\n if (!items) return;\n for (const item of Object.values(items)) {\n const sourceFile = (item as any).sourceFile as string | undefined;\n if (!sourceFile) continue;\n const match = sourceFile.match(/^src\\/([^/]+)\\/interfaces\\/(.+)\\.ts$/);\n if (match && match[1] === dirName) {\n exportSet.add(`export * from './${match[2].replace(/\\.ts$/, '')}';`);\n }\n }\n };\n addBaselineExports(ctx.apiSurface.interfaces);\n addBaselineExports(ctx.apiSurface.typeAliases);\n addBaselineExports(ctx.apiSurface.enums);\n\n // Scan the target directory for interface files not captured by the\n // api-surface (e.g., list wrappers, hand-written types). Only add\n // files whose exported symbols don't collide with symbols already\n // claimed by another directory's barrel (TS2308 prevention).\n if (ctx.targetDir) {\n const interfacesDir = path.join(ctx.targetDir, 'src', dirName, 'interfaces');\n const symbols = dirSymbols.get(dirName) ?? new Set<string>();\n try {\n for (const entry of fs.readdirSync(interfacesDir)) {\n if (entry === 'index.ts') continue;\n if (!entry.endsWith('.ts')) continue;\n const stem = entry.replace(/\\.ts$/, '');\n const exportLine = `export * from './${stem}';`;\n if (exportSet.has(exportLine)) continue;\n\n // Extract exported symbol names from the file to check for conflicts\n const content = fs.readFileSync(path.join(interfacesDir, entry), 'utf-8');\n const exportedNames: string[] = [];\n for (const m of content.matchAll(/export\\s+(?:interface|type|enum|class|const|function)\\s+(\\w+)/g)) {\n exportedNames.push(m[1]);\n }\n\n // Skip if any exported name collides with a symbol already\n // claimed by any file (same or different directory)\n const hasCollision = exportedNames.some((name) => globalExistingSymbols.has(name));\n if (hasCollision) continue;\n\n // Safe to add — register symbols and include in barrel\n for (const name of exportedNames) {\n symbols.add(name);\n globalExistingSymbols.add(name);\n }\n exportSet.add(exportLine);\n }\n } catch {\n // Directory doesn't exist in target — nothing to scan\n }\n }\n }\n\n // Deduplicate and sort\n const uniqueExports = [...exportSet];\n uniqueExports.sort();\n\n if (ctx.apiSurface) {\n // Integration mode: overwrite the barrel so stale entries are removed.\n files.push({\n path: `src/${dirName}/interfaces/index.ts`,\n content: uniqueExports.join('\\n'),\n overwriteExisting: true,\n });\n } else {\n // Standalone generation: only update if there are new exports.\n const baselineSymbols = dirSymbolsFromBaseline.get(dirName);\n const hasNewExports = baselineSymbols\n ? uniqueExports.some((exp) => {\n const match = exp.match(/from '\\.\\/(.*?)'/);\n if (!match) return false;\n return !baselineSymbols.has(match[1]);\n })\n : false;\n\n files.push({\n path: `src/${dirName}/interfaces/index.ts`,\n content: uniqueExports.join('\\n'),\n skipIfExists: !hasNewExports,\n });\n }\n }\n\n return files;\n}\n\nfunction generateBarrel(spec: ApiSpec, ctx: EmitterContext): GeneratedFile {\n const lines: string[] = [];\n const { modelToService, resolveDir } = createServiceDirResolver(spec.models, spec.services, ctx);\n\n // Track all exported names to prevent duplicates.\n // Pre-seed with names already exported by the existing SDK to avoid generating\n // duplicate exports that would conflict with existing `export *` statements.\n const exportedNames = new Set<string>();\n if (ctx.apiSurface?.interfaces) {\n for (const name of Object.keys(ctx.apiSurface.interfaces)) {\n exportedNames.add(name);\n }\n }\n if (ctx.apiSurface?.classes) {\n for (const name of Object.keys(ctx.apiSurface.classes)) {\n exportedNames.add(name);\n }\n }\n\n // Collect names already exported by the existing SDK (via export * or named exports).\n // When an explicit `export type { Foo }` would shadow a wildcard re-export that\n // already provides a hand-written version of Foo (e.g., a discriminated union),\n // we must skip the explicit export so the wildcard wins.\n const existingSdkExports = new Set<string>();\n if (ctx.apiSurface?.exports) {\n for (const names of Object.values(ctx.apiSurface.exports)) {\n for (const name of names) {\n existingSdkExports.add(name);\n }\n }\n }\n\n // Common exports\n lines.push(\"export * from './common/exceptions';\");\n lines.push(\"export { AutoPaginatable } from './common/utils/pagination';\");\n lines.push(\"export type { List, ListMetadata, ListResponse } from './common/utils/pagination';\");\n lines.push(\"export type { PaginationOptions } from './common/interfaces/pagination-options.interface';\");\n lines.push(\"export type { WorkOSOptions } from './common/interfaces/workos-options.interface';\");\n lines.push(\"export type { PostOptions } from './common/interfaces/post-options.interface';\");\n lines.push(\"export type { GetOptions } from './common/interfaces/get-options.interface';\");\n lines.push('');\n for (const name of [\n 'AutoPaginatable',\n 'List',\n 'ListMetadata',\n 'ListResponse',\n 'PaginationOptions',\n 'WorkOSOptions',\n 'PostOptions',\n 'GetOptions',\n ]) {\n exportedNames.add(name);\n }\n\n // Identify services whose endpoints are fully covered by existing hand-written\n // classes — their resource class should not be re-exported from the barrel.\n const coveredServicesBarrel = new Set<string>();\n for (const service of spec.services) {\n if (isServiceCoveredByExisting(service, ctx)) {\n coveredServicesBarrel.add(service.name);\n }\n }\n\n // Track directories that have already been wildcard-exported\n const exportedDirs = new Set<string>();\n\n // Pre-compute all names per interfaces directory (generated + baseline) to detect\n // cross-directory conflicts before emitting any star exports. A star export is\n // unsafe when two different directories export the same name (e.g., Factor in\n // both mfa/interfaces and user-management/interfaces).\n const dirAllNames = new Map<string, Set<string>>();\n for (const service of spec.services) {\n const iDir = resolveDir(service.name);\n if (!dirAllNames.has(iDir)) dirAllNames.set(iDir, new Set());\n const names = dirAllNames.get(iDir)!;\n for (const model of spec.models) {\n if (modelToService.get(model.name) !== service.name) continue;\n if (isListMetadataModel(model) || isListWrapperModel(model)) continue;\n names.add(resolveInterfaceName(model.name, ctx));\n names.add(wireInterfaceName(resolveInterfaceName(model.name, ctx)));\n }\n }\n // Add baseline names per directory\n if (ctx.apiSurface?.interfaces) {\n for (const [name, iface] of Object.entries(ctx.apiSurface.interfaces)) {\n const sourceFile = (iface as any).sourceFile as string | undefined;\n if (!sourceFile) continue;\n const match = sourceFile.match(/^src\\/([^/]+)\\/interfaces\\//);\n if (match) {\n const dirName = match[1];\n if (!dirAllNames.has(dirName)) dirAllNames.set(dirName, new Set());\n dirAllNames.get(dirName)!.add(name);\n }\n }\n }\n if (ctx.apiSurface?.typeAliases) {\n for (const [name, alias] of Object.entries(ctx.apiSurface.typeAliases)) {\n const sourceFile = (alias as any).sourceFile as string | undefined;\n if (!sourceFile) continue;\n const match = sourceFile.match(/^src\\/([^/]+)\\/interfaces\\//);\n if (match) {\n const dirName = match[1];\n if (!dirAllNames.has(dirName)) dirAllNames.set(dirName, new Set());\n dirAllNames.get(dirName)!.add(name);\n }\n }\n }\n // Detect directories with cross-directory name conflicts\n const unsafeStarDirs = new Set<string>();\n const allDirEntries = [...dirAllNames.entries()];\n for (let i = 0; i < allDirEntries.length; i++) {\n for (let j = i + 1; j < allDirEntries.length; j++) {\n const [dirA, namesA] = allDirEntries[i];\n const [dirB, namesB] = allDirEntries[j];\n for (const name of namesA) {\n if (namesB.has(name)) {\n unsafeStarDirs.add(dirA);\n unsafeStarDirs.add(dirB);\n break;\n }\n }\n }\n }\n\n // Per-service exports: service barrel + resource class\n for (const service of spec.services) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const serviceDir = resolveServiceDir(resolvedName);\n // The interfaces directory may differ from the resource class directory when\n // a service's class name is remapped (e.g., WebhooksEndpoints class lives in\n // webhooks-endpoints/ but its model interfaces live in webhooks/).\n const interfacesDir = resolveDir(service.name);\n\n // Check if this service has any models or enums (i.e., a barrel was generated).\n // Exclude list wrapper and list metadata models — these are skipped during\n // interface generation (they use shared List<T>/ListMetadata), so they don't\n // have corresponding .interface.ts files in the output.\n const serviceModels = spec.models.filter((m) => {\n if (modelToService.get(m.name) !== service.name) return false;\n if (isListMetadataModel(m) || isListWrapperModel(m)) return false;\n return true;\n });\n const serviceEnums = spec.enums.filter((e) => {\n const enumService = findEnumService(e.name, spec.services);\n return enumService === service.name;\n });\n\n // Check whether any model or enum in this service conflicts with names already\n // exported (from earlier star exports or the existing SDK baseline). If so, fall\n // back to individual named exports to avoid duplicate-export TS2308 errors.\n const hasConflict =\n serviceModels.some((m) => {\n const name = resolveInterfaceName(m.name, ctx);\n return existingSdkExports.has(name) || exportedNames.has(name) || exportedNames.has(wireInterfaceName(name));\n }) || serviceEnums.some((e) => existingSdkExports.has(e.name) || exportedNames.has(e.name));\n\n // Skip star export for covered services — their directory may have hand-written types\n // (e.g., Factor in mfa/) that conflict with types in the covering service's directory.\n const isCovered = coveredServicesBarrel.has(service.name);\n if (\n (serviceModels.length > 0 || serviceEnums.length > 0) &&\n !exportedDirs.has(interfacesDir) &&\n !hasConflict &&\n !unsafeStarDirs.has(interfacesDir) &&\n !isCovered\n ) {\n exportedDirs.add(interfacesDir);\n lines.push(`export * from './${interfacesDir}/interfaces';`);\n // Track the individual names so they don't get re-exported below\n for (const model of serviceModels) {\n exportedNames.add(resolveInterfaceName(model.name, ctx));\n exportedNames.add(wireInterfaceName(resolveInterfaceName(model.name, ctx)));\n }\n for (const enumDef of serviceEnums) {\n exportedNames.add(enumDef.name);\n }\n } else if (!hasConflict) {\n // Fallback: emit individual model exports (e.g., when no models/enums exist)\n for (const model of serviceModels) {\n const name = resolveInterfaceName(model.name, ctx);\n const wireName = wireInterfaceName(name);\n if (exportedNames.has(name) || exportedNames.has(wireName)) continue;\n if (existingSdkExports.has(name)) continue;\n exportedNames.add(name);\n exportedNames.add(wireName);\n lines.push(\n `export type { ${name}, ${wireName} } from './${interfacesDir}/interfaces/${fileName(model.name)}.interface';`,\n );\n }\n }\n\n // Resource class — skip if already exported or if service is fully covered\n // by existing hand-written classes\n if (coveredServicesBarrel.has(service.name)) {\n // Emit a comment indicating this service is covered by an existing class\n lines.push(`// ${resolvedName} is covered by an existing hand-written class — not re-exported.`);\n } else if (!exportedNames.has(resolvedName)) {\n exportedNames.add(resolvedName);\n lines.push(`export { ${resolvedName} } from './${serviceDir}/${fileName(resolvedName)}';`);\n }\n lines.push('');\n }\n\n // Unassigned models (common) — use barrel if any exist\n // Filter to reachable models only: oagen's generateAllFiles passes only\n // service-referenced models to generateModels, so unreachable models\n // never get interface files. Exporting them here would create broken imports.\n const reachable = collectReferencedNames(spec.services, spec.models);\n const unassignedModels = spec.models.filter((m) => !modelToService.has(m.name) && reachable.models.has(m.name));\n const commonEnums = spec.enums.filter((e) => {\n const enumService = findEnumService(e.name, spec.services);\n return !enumService;\n });\n\n const commonHasConflict =\n unassignedModels.some((m) => existingSdkExports.has(resolveInterfaceName(m.name, ctx))) ||\n commonEnums.some((e) => existingSdkExports.has(e.name));\n\n if ((unassignedModels.length > 0 || commonEnums.length > 0) && !exportedDirs.has('common') && !commonHasConflict) {\n exportedDirs.add('common');\n lines.push(\"export * from './common/interfaces';\");\n for (const model of unassignedModels) {\n exportedNames.add(resolveInterfaceName(model.name, ctx));\n exportedNames.add(wireInterfaceName(resolveInterfaceName(model.name, ctx)));\n }\n for (const enumDef of commonEnums) {\n exportedNames.add(enumDef.name);\n }\n } else {\n // Fallback: individual model exports\n for (const model of unassignedModels) {\n const name = resolveInterfaceName(model.name, ctx);\n const wireName = wireInterfaceName(name);\n if (exportedNames.has(name) || exportedNames.has(wireName)) continue;\n if (existingSdkExports.has(name)) continue;\n exportedNames.add(name);\n exportedNames.add(wireName);\n lines.push(`export type { ${name}, ${wireName} } from './common/interfaces/${fileName(model.name)}.interface';`);\n }\n }\n\n // Enum exports — only for enums not already covered by a service/common barrel.\n // Skip duplicates and names already covered by existing SDK wildcards.\n // Use value export (`export { ... }`) for actual TS enums so consumers\n // can use them as runtime values (e.g., ConnectionType.GoogleOAuth).\n // Use type-only export (`export type { ... }`) for string literal unions.\n for (const enumDef of spec.enums) {\n if (exportedNames.has(enumDef.name)) continue;\n if (existingSdkExports.has(enumDef.name)) continue;\n exportedNames.add(enumDef.name);\n const enumService = findEnumService(enumDef.name, spec.services);\n const dir = resolveDir(enumService);\n if (!exportedDirs.has(dir)) {\n const baselineEnum = ctx.apiSurface?.enums?.[enumDef.name];\n const exportKeyword = baselineEnum?.members ? 'export' : 'export type';\n lines.push(\n `${exportKeyword} { ${enumDef.name} } from './${dir}/interfaces/${fileName(enumDef.name)}.interface';`,\n );\n }\n }\n\n lines.push('');\n // Only emit the WorkOS re-export for standalone generation (no existing SDK).\n // When integrating into an existing SDK, the existing barrel already exports\n // WorkOS (often as a subclass alias like `export { WorkOSNode as WorkOS }`),\n // and adding a second export with the same name causes a duplicate identifier error.\n if (!ctx.apiSurface && !exportedNames.has('WorkOS')) {\n exportedNames.add('WorkOS');\n lines.push(\"export { WorkOS } from './workos';\");\n }\n\n return {\n path: 'src/index.ts',\n content: lines.join('\\n'),\n skipIfExists: true,\n };\n}\n\nfunction findEnumService(enumName: string, services: Service[]): string | undefined {\n for (const service of services) {\n for (const op of service.operations) {\n const refs: string[] = [];\n const collect = (ref: any) => {\n if (ref?.kind === 'enum' && ref.name === enumName) refs.push(ref.name);\n if (ref?.items) collect(ref.items);\n if (ref?.inner) collect(ref.inner);\n if (ref?.variants) ref.variants.forEach(collect);\n if (ref?.valueType) collect(ref.valueType);\n };\n if (op.requestBody) collect(op.requestBody);\n collect(op.response);\n for (const p of [...op.pathParams, ...op.queryParams]) {\n collect(p.type);\n }\n if (refs.length > 0) return service.name;\n }\n }\n return undefined;\n}\n\n/**\n * Determine whether the spec's auth scheme requires overriding the\n * default bearer auth in WorkOSBase.setAuthHeaders().\n */\nfunction needsAuthOverride(auth?: AuthScheme[]): boolean {\n if (!auth || auth.length === 0) return false;\n const scheme = auth[0];\n // bearer and oauth2 match the base class default — no override needed\n return scheme.kind === 'apiKey';\n}\n\n/**\n * Render the body of a setAuthHeaders override for non-default auth schemes.\n * Only called when needsAuthOverride() returns true.\n */\nfunction renderAuthOverride(lines: string[], auth: AuthScheme[]): void {\n const scheme = auth[0];\n if (scheme.kind !== 'apiKey') return;\n switch (scheme.in) {\n case 'header':\n lines.push(` headers['${scheme.name}'] = this.key;`);\n break;\n case 'query':\n lines.push(` // Auth key sent as query parameter '${scheme.name}' (see buildUrl)`);\n break;\n case 'cookie':\n lines.push(` headers['Cookie'] = \\`${scheme.name}=\\${this.key}\\`;`);\n break;\n }\n}\n\n/**\n * Convert a server description or URL into a SCREAMING_SNAKE_CASE constant name.\n */\nfunction serverConstName(description: string): string {\n return (\n 'SERVER_' +\n description\n .replace(/https?:\\/\\//g, '')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .replace(/^_|_$/g, '')\n .toUpperCase()\n );\n}\n","import type { EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { fileName } from './naming.js';\nimport { buildNodeStatusExceptions } from './sdk-errors.js';\n\n/**\n * Static exception classes are now hand-maintained in the target SDK.\n * Only typed exceptions derived from spec error models are generated here.\n */\nexport function generateErrors(ctx?: EmitterContext): GeneratedFile[] {\n if (!ctx?.spec) return [];\n\n const typedErrors = collectTypedErrors(ctx);\n if (typedErrors.length === 0) return [];\n\n const files: GeneratedFile[] = [];\n const exportLines: string[] = [];\n\n for (const { modelName, statusCode, baseException } of typedErrors) {\n const exceptionClassName = `${modelName}Exception`;\n const filePath = `src/common/exceptions/${fileName(modelName)}.exception.ts`;\n const baseImport = baseException\n ? `import { ${baseException} } from './${fileName(baseException.replace(/Exception$/, '')).replace(/^/, '')}.exception';\\n\\n`\n : '';\n const baseClass = baseException ?? 'Error';\n\n files.push({\n path: filePath,\n content: `${baseImport}export class ${exceptionClassName} extends ${baseClass} {\n readonly status = ${statusCode};\n readonly name = '${exceptionClassName}';\n readonly requestID: string;\n readonly data?: any;\n\n constructor({ message, requestID, data }: { message?: string; requestID: string; data?: any }) {\n ${baseException ? `super(${baseException === 'UnauthorizedException' ? 'requestID' : `{ message: message ?? '${modelName} error', requestID }`});` : 'super();'}\n this.message = message ?? '${modelName} error';\n this.requestID = requestID;\n if (data) this.data = data;\n }\n}`,\n skipIfExists: true,\n integrateTarget: false,\n });\n\n exportLines.push(`export { ${exceptionClassName} } from './${fileName(modelName)}.exception';`);\n }\n\n // Generate a barrel for typed errors only (appended to existing exceptions/index.ts\n // via region preservation if needed)\n if (exportLines.length > 0) {\n files.push({\n path: 'src/common/exceptions/typed-errors.ts',\n content: exportLines.join('\\n'),\n skipIfExists: true,\n integrateTarget: false,\n });\n }\n\n return files;\n}\n\nfunction collectTypedErrors(\n ctx: EmitterContext,\n): { modelName: string; statusCode: number; baseException: string | null }[] {\n const statusToBase = buildNodeStatusExceptions(ctx.spec.sdk);\n const seen = new Set<string>();\n const results: {\n modelName: string;\n statusCode: number;\n baseException: string | null;\n }[] = [];\n\n for (const service of ctx.spec.services) {\n for (const op of service.operations) {\n for (const err of op.errors) {\n if (err.type?.kind === 'model' && !seen.has(err.type.name)) {\n seen.add(err.type.name);\n results.push({\n modelName: err.type.name,\n statusCode: err.statusCode,\n baseException: statusToBase[err.statusCode] ?? (err.statusCode >= 500 ? 'GenericServerException' : null),\n });\n }\n }\n }\n }\n\n return results;\n}\n","import type { ApiSpec, Service, Operation, Model, TypeRef, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { planOperation, toCamelCase } from '@workos/oagen';\nimport { unwrapListModel, ID_PREFIXES } from './fixtures.js';\nimport {\n fieldName,\n wireFieldName,\n fileName,\n resolveServiceDir,\n servicePropertyName,\n resolveMethodName,\n resolveInterfaceName,\n wireInterfaceName,\n} from './naming.js';\nimport { generateFixtures } from './fixtures.js';\nimport { resolveResourceClassName } from './resources.js';\nimport {\n assignModelsToServices,\n createServiceDirResolver,\n uncoveredOperations,\n relativeImport,\n isListMetadataModel,\n isListWrapperModel,\n} from './utils.js';\nimport { groupByMount } from '../shared/resolved-ops.js';\n\nexport function generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Generate fixture JSON files\n const fixtures = generateFixtures(spec, ctx);\n for (const f of fixtures) {\n files.push({ path: f.path, content: f.content, headerPlacement: 'skip', integrateTarget: false });\n }\n\n // Build model lookup for response field assertions\n const modelMap = new Map(spec.models.map((m) => [m.name, m]));\n\n // Generate test files per mount target — merges all sub-services into one\n // test file. Skip operations already covered by existing hand-written classes.\n const mountGroups = groupByMount(ctx);\n\n // Build mount-target → property name map so tests use the same accessor\n // as the generated client, even when the mount target name doesn't match\n // any IR service name directly.\n const mountAccessors = new Map<string, string>();\n for (const r of ctx.resolvedOperations ?? []) {\n if (!mountAccessors.has(r.mountOn)) {\n mountAccessors.set(r.mountOn, servicePropertyName(r.mountOn));\n }\n }\n\n const testEntries: Array<{ name: string; operations: Operation[] }> =\n mountGroups.size > 0\n ? [...mountGroups].map(([name, group]) => ({ name, operations: group.operations }))\n : spec.services.map((s) => ({ name: resolveResourceClassName(s, ctx), operations: s.operations }));\n\n for (const { name: mountName, operations } of testEntries) {\n if (operations.length === 0) continue;\n const mergedService: Service = { name: mountName, operations };\n const ops = uncoveredOperations(mergedService, ctx);\n if (ops.length === 0) continue;\n const testService = ops.length < operations.length ? { ...mergedService, operations: ops } : mergedService;\n files.push(generateServiceTest(testService, spec, ctx, modelMap, mountAccessors));\n }\n\n // Generate serializer round-trip tests\n const serializerTests = generateSerializerTests(spec, ctx);\n for (const f of serializerTests) {\n files.push(f);\n }\n\n return files;\n}\n\nfunction generateServiceTest(\n service: Service,\n spec: ApiSpec,\n ctx: EmitterContext,\n modelMap: Map<string, Model>,\n mountAccessors?: Map<string, string>,\n): GeneratedFile {\n const resolvedName = resolveResourceClassName(service, ctx);\n const serviceDir = resolveServiceDir(resolvedName);\n const serviceClass = resolvedName;\n const serviceProp = mountAccessors?.get(service.name) ?? servicePropertyName(resolvedName);\n const testPath = `src/${serviceDir}/${fileName(resolvedName)}.spec.ts`;\n\n const plans = service.operations.map((op) => ({\n op,\n plan: planOperation(op),\n method: resolveMethodName(op, service, ctx),\n }));\n\n // Sort plans to match the existing file's method order (same as resources.ts).\n if (ctx.overlayLookup?.methodByOperation) {\n const methodOrder = new Map<string, number>();\n let pos = 0;\n for (const [, info] of ctx.overlayLookup.methodByOperation) {\n if (!methodOrder.has(info.methodName)) {\n methodOrder.set(info.methodName, pos++);\n }\n }\n if (methodOrder.size > 0) {\n plans.sort((a, b) => {\n const aPos = methodOrder.get(a.method) ?? Number.MAX_SAFE_INTEGER;\n const bPos = methodOrder.get(b.method) ?? Number.MAX_SAFE_INTEGER;\n return aPos - bPos;\n });\n }\n }\n\n // Compute model-to-service mapping so fixture imports use the correct cross-service path.\n // A test for service A may reference a response model owned by service B — the fixture\n // lives in service B's fixtures directory, not service A's.\n const { modelToService, resolveDir } = createServiceDirResolver(spec.models, spec.services, ctx);\n\n const lines: string[] = [];\n\n lines.push(\"import fetch from 'jest-fetch-mock';\");\n\n // Conditionally import test utilities based on what test types exist\n const hasPaginated = plans.some((p) => p.plan.isPaginated);\n const hasBody = plans.some((p) => p.plan.hasBody);\n const testUtils = ['fetchOnce', 'fetchURL', 'fetchMethod'];\n if (hasPaginated) testUtils.push('fetchSearchParams');\n if (hasBody) testUtils.push('fetchBody');\n // Import shared test helpers for error and pagination tests\n if (hasPaginated) testUtils.push('testEmptyResults', 'testPaginationParams');\n // Only import testUnauthorized when at least one operation has a response model or is paginated\n const hasErrorTests = plans.some((p) => p.plan.responseModelName || p.plan.isPaginated);\n if (hasErrorTests) testUtils.push('testUnauthorized');\n lines.push('import {');\n for (const util of testUtils) {\n lines.push(` ${util},`);\n }\n lines.push(\"} from '../common/utils/test-utils';\");\n lines.push(\"import { WorkOS } from '../workos';\");\n lines.push('');\n\n // Import fixtures — use correct cross-service paths when the response model\n // is owned by a different service than the current test file.\n const fixtureImports = new Set<string>();\n for (const { op, plan } of plans) {\n if (plan.isPaginated && op.pagination) {\n let itemModelName = op.pagination.itemType.kind === 'model' ? op.pagination.itemType.name : null;\n if (itemModelName) {\n // Unwrap list wrapper models to match the fixture file naming in fixtures.ts\n const rawModel = modelMap.get(itemModelName);\n if (rawModel) {\n const unwrapped = unwrapListModel(rawModel, modelMap);\n if (unwrapped) {\n itemModelName = unwrapped.name;\n }\n }\n // List fixtures are always generated in the current service's directory\n // (the service owning the list operation), not in the model's home service.\n // Always use a local import path.\n const fixturePath = `./fixtures/list-${fileName(itemModelName)}.fixture.json`;\n fixtureImports.add(`import list${itemModelName}Fixture from '${fixturePath}';`);\n }\n } else if (plan.responseModelName) {\n const respService = modelToService.get(plan.responseModelName);\n const respDir = resolveDir(respService);\n const fixturePath =\n respDir === serviceDir\n ? `./fixtures/${fileName(plan.responseModelName)}.fixture.json`\n : `../${respDir}/fixtures/${fileName(plan.responseModelName)}.fixture.json`;\n fixtureImports.add(`import ${toCamelCase(plan.responseModelName)}Fixture from '${fixturePath}';`);\n }\n // NOTE: Request body fixtures are not imported for body tests because\n // fixtures use wire format (snake_case) but methods expect domain types\n // (camelCase). Body tests use `{} as any` instead.\n }\n for (const imp of fixtureImports) {\n lines.push(imp);\n }\n\n lines.push('');\n lines.push(\"const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU');\");\n lines.push('');\n\n // Generate per-entity assertion helpers for models used in 2+ tests.\n // This deduplicates the field assertion blocks that would otherwise be\n // copy-pasted across list/find/create/update test cases.\n const { lines: helperLines, helpers: entityHelperNames } = generateEntityHelpers(plans, modelMap, ctx);\n for (const line of helperLines) {\n lines.push(line);\n }\n\n lines.push(`describe('${serviceClass}', () => {`);\n lines.push(' beforeEach(() => fetch.resetMocks());');\n\n for (const { op, plan, method } of plans) {\n lines.push('');\n lines.push(` describe('${method}', () => {`);\n\n if (plan.isPaginated) {\n renderPaginatedTest(lines, op, plan, method, serviceProp, modelMap, ctx, entityHelperNames);\n } else if (plan.isDelete) {\n renderDeleteTest(lines, op, plan, method, serviceProp, modelMap);\n } else if (plan.hasBody && plan.responseModelName) {\n renderBodyTest(lines, op, plan, method, serviceProp, modelMap, ctx, entityHelperNames);\n } else if (plan.responseModelName) {\n renderGetTest(lines, op, plan, method, serviceProp, modelMap, ctx, entityHelperNames);\n } else {\n renderVoidTest(lines, op, plan, method, serviceProp, modelMap);\n }\n\n // Error case test for all non-void operations\n if (plan.responseModelName || plan.isPaginated) {\n renderErrorTest(lines, op, plan, method, serviceProp, modelMap);\n }\n\n lines.push(' });');\n }\n\n lines.push('});');\n\n return { path: testPath, content: lines.join('\\n'), skipIfExists: true };\n}\n\n/** Compute the test value for a single path parameter.\n * Uses distinct values per param name so multi-param paths don't all get 'test_id'.\n */\nfunction pathParamTestValue(param: { type: TypeRef; name?: string } | undefined, paramName?: string): string {\n if (param?.type.kind === 'enum' && param.type.values?.length) {\n const first = param.type.values[0];\n return typeof first === 'string' ? first : String(first);\n }\n // Use distinct values for different path params to detect ordering bugs\n const name = paramName ?? (param as any)?.name;\n if (name) return `test_${fieldName(name)}`;\n return 'test_id';\n}\n\n/** Build test arguments for all path params (handles multiple path params). */\nfunction buildTestPathArgs(op: Operation): string {\n // Detect path template variables (may be more than op.pathParams if spec is incomplete)\n const templateVars = [...op.path.matchAll(/\\{(\\w+)\\}/g)].map(([, name]) => fieldName(name));\n const declaredNames = new Set(op.pathParams.map((p) => fieldName(p.name)));\n const paramByName = new Map(op.pathParams.map((p) => [fieldName(p.name), p]));\n // Merge declared + template vars, deduplicate, preserve order\n const allVars: string[] = [];\n for (const p of op.pathParams) allVars.push(fieldName(p.name));\n for (const v of templateVars) {\n if (!declaredNames.has(v)) allVars.push(v);\n }\n return allVars.map((varName) => `'${pathParamTestValue(paramByName.get(varName), varName)}'`).join(', ');\n}\n\nfunction renderPaginatedTest(\n lines: string[],\n op: Operation,\n plan: any,\n method: string,\n serviceProp: string,\n modelMap: Map<string, Model>,\n ctx?: EmitterContext,\n entityHelpers?: Set<string>,\n): void {\n let itemModelName = op.pagination?.itemType.kind === 'model' ? op.pagination.itemType.name : 'Item';\n // Unwrap list wrapper models to match the fixture file naming in fixtures.ts\n const rawModel = itemModelName !== 'Item' ? modelMap.get(itemModelName) : null;\n if (rawModel) {\n const unwrapped = unwrapListModel(rawModel, modelMap);\n if (unwrapped) {\n itemModelName = unwrapped.name;\n }\n }\n const pathArgs = buildTestPathArgs(op);\n\n lines.push(\" it('returns paginated results', async () => {\");\n lines.push(` fetchOnce(list${itemModelName}Fixture);`);\n lines.push('');\n lines.push(` const { data, listMetadata } = await workos.${serviceProp}.${method}(${pathArgs});`);\n lines.push('');\n lines.push(\" expect(fetchMethod()).toBe('GET');\");\n // Fix #12: Full URL path assertion instead of toContain()\n const expectedPath = buildExpectedPath(op);\n lines.push(` expect(new URL(String(fetchURL())).pathname).toBe('${expectedPath}');`);\n lines.push(\" expect(fetchSearchParams()).toHaveProperty('order');\");\n lines.push(' expect(Array.isArray(data)).toBe(true);');\n lines.push(' expect(listMetadata).toBeDefined();');\n\n // Assert on first item fields — use entity helper if available\n const paginatedHelperName = ctx ? `expect${resolveInterfaceName(itemModelName, ctx)}` : null;\n if (paginatedHelperName && entityHelpers?.has(paginatedHelperName)) {\n lines.push(' expect(data.length).toBeGreaterThan(0);');\n lines.push(` ${paginatedHelperName}(data[0]);`);\n } else {\n const itemModel = modelMap.get(itemModelName);\n if (itemModel) {\n const assertions = buildFieldAssertions(itemModel, 'data[0]', modelMap);\n if (assertions.length > 0) {\n lines.push(' expect(data.length).toBeGreaterThan(0);');\n for (const assertion of assertions) {\n lines.push(` ${assertion}`);\n }\n }\n }\n }\n\n lines.push(' });');\n\n // Edge case: handles empty results — use shared helper\n lines.push('');\n lines.push(` testEmptyResults(() => workos.${serviceProp}.${method}(${pathArgs}));`);\n\n // Edge case: forwards pagination params — use shared helper\n lines.push('');\n lines.push(` testPaginationParams(`);\n lines.push(` (opts) => workos.${serviceProp}.${method}(${pathArgs ? pathArgs + ', ' : ''}opts),`);\n lines.push(` list${itemModelName}Fixture,`);\n lines.push(' );');\n}\n\nfunction renderDeleteTest(\n lines: string[],\n op: Operation,\n plan: any,\n method: string,\n serviceProp: string,\n modelMap: Map<string, Model>,\n): void {\n const pathArgs = buildTestPathArgs(op);\n // Build realistic payload for body-bearing delete operations\n const payload = plan.hasBody ? buildTestPayload(op, modelMap) : null;\n const bodyArg = plan.hasBody ? (payload ? payload.camelCaseObj : fallbackBodyArg(op, modelMap)) : '';\n const args = plan.hasBody ? (pathArgs ? `${pathArgs}, ${bodyArg}` : bodyArg) : pathArgs;\n\n lines.push(\" it('sends a DELETE request', async () => {\");\n lines.push(' fetchOnce({}, { status: 204 });');\n lines.push('');\n lines.push(` await workos.${serviceProp}.${method}(${args});`);\n lines.push('');\n lines.push(\" expect(fetchMethod()).toBe('DELETE');\");\n // Fix #12: Full URL path assertion instead of toContain()\n const expectedPathDel = buildExpectedPath(op);\n lines.push(` expect(new URL(String(fetchURL())).pathname).toBe('${expectedPathDel}');`);\n if (plan.hasBody) {\n if (payload) {\n lines.push(` expect(fetchBody()).toEqual(expect.objectContaining(${payload.snakeCaseObj}));`);\n } else {\n lines.push(' expect(fetchBody()).toBeDefined();');\n }\n }\n lines.push(' });');\n}\n\nfunction renderBodyTest(\n lines: string[],\n op: Operation,\n plan: any,\n method: string,\n serviceProp: string,\n modelMap: Map<string, Model>,\n ctx?: EmitterContext,\n entityHelpers?: Set<string>,\n): void {\n const responseModelName = plan.responseModelName!;\n const fixture = `${toCamelCase(responseModelName)}Fixture`;\n const pathArgs = buildTestPathArgs(op);\n\n // Build realistic payload from request body model fields\n const payload = buildTestPayload(op, modelMap);\n const payloadArg = payload ? payload.camelCaseObj : fallbackBodyArg(op, modelMap);\n const allArgs = pathArgs ? `${pathArgs}, ${payloadArg}` : payloadArg;\n\n lines.push(\" it('sends the correct request and returns result', async () => {\");\n lines.push(` fetchOnce(${fixture});`);\n lines.push('');\n lines.push(` const result = await workos.${serviceProp}.${method}(${allArgs});`);\n lines.push('');\n lines.push(` expect(fetchMethod()).toBe('${op.httpMethod.toUpperCase()}');`);\n\n // Fix #12: Full URL path assertion instead of toContain()\n const expectedPath = buildExpectedPath(op);\n lines.push(` expect(new URL(String(fetchURL())).pathname).toBe('${expectedPath}');`);\n\n // Fix #10: Assert serialized wire format of request body\n if (payload) {\n lines.push(` expect(fetchBody()).toEqual(expect.objectContaining(${payload.snakeCaseObj}));`);\n } else {\n lines.push(' expect(fetchBody()).toBeDefined();');\n }\n\n // Use entity helper if available, otherwise inline assertions\n const bodyHelperName = ctx ? `expect${resolveInterfaceName(responseModelName, ctx)}` : null;\n if (bodyHelperName && entityHelpers?.has(bodyHelperName)) {\n lines.push(` ${bodyHelperName}(result);`);\n } else {\n const responseModel = modelMap.get(responseModelName);\n if (responseModel) {\n const assertions = buildFieldAssertions(responseModel, 'result', modelMap);\n if (assertions.length > 0) {\n for (const assertion of assertions) {\n lines.push(` ${assertion}`);\n }\n } else {\n lines.push(' expect(result).toBeDefined();');\n }\n } else {\n lines.push(' expect(result).toBeDefined();');\n }\n }\n\n lines.push(' });');\n}\n\nfunction renderGetTest(\n lines: string[],\n op: Operation,\n plan: any,\n method: string,\n serviceProp: string,\n modelMap: Map<string, Model>,\n ctx?: EmitterContext,\n entityHelpers?: Set<string>,\n): void {\n const responseModelName = plan.responseModelName!;\n const fixture = `${toCamelCase(responseModelName)}Fixture`;\n const pathArgs = buildTestPathArgs(op);\n\n lines.push(\" it('returns the expected result', async () => {\");\n lines.push(` fetchOnce(${fixture});`);\n lines.push('');\n lines.push(` const result = await workos.${serviceProp}.${method}(${pathArgs});`);\n lines.push('');\n lines.push(` expect(fetchMethod()).toBe('${op.httpMethod.toUpperCase()}');`);\n // Fix #12: Full URL path assertion instead of toContain()\n const expectedPathGet = buildExpectedPath(op);\n lines.push(` expect(new URL(String(fetchURL())).pathname).toBe('${expectedPathGet}');`);\n\n // Use entity helper if available, otherwise inline assertions\n const helperName = ctx ? `expect${resolveInterfaceName(responseModelName, ctx)}` : null;\n if (helperName && entityHelpers?.has(helperName)) {\n lines.push(` ${helperName}(result);`);\n } else {\n const responseModel = modelMap.get(responseModelName);\n if (responseModel) {\n const assertions = buildFieldAssertions(responseModel, 'result', modelMap);\n if (assertions.length > 0) {\n for (const assertion of assertions) {\n lines.push(` ${assertion}`);\n }\n } else {\n lines.push(' expect(result).toBeDefined();');\n }\n } else {\n lines.push(' expect(result).toBeDefined();');\n }\n }\n\n lines.push(' });');\n}\n\nfunction renderVoidTest(\n lines: string[],\n op: Operation,\n plan: any,\n method: string,\n serviceProp: string,\n modelMap: Map<string, Model>,\n): void {\n const pathArgs = buildTestPathArgs(op);\n // Build realistic payload for body-bearing void operations\n const payload = plan.hasBody ? buildTestPayload(op, modelMap) : null;\n const bodyArg = plan.hasBody ? (payload ? payload.camelCaseObj : fallbackBodyArg(op, modelMap)) : '';\n const args = plan.hasBody ? (pathArgs ? `${pathArgs}, ${bodyArg}` : bodyArg) : pathArgs;\n\n lines.push(\" it('sends the request', async () => {\");\n lines.push(' fetchOnce({});');\n lines.push('');\n lines.push(` await workos.${serviceProp}.${method}(${args});`);\n lines.push('');\n lines.push(` expect(fetchMethod()).toBe('${op.httpMethod.toUpperCase()}');`);\n // Fix #12: Full URL path assertion instead of toContain()\n const expectedPathVoid = buildExpectedPath(op);\n lines.push(` expect(new URL(String(fetchURL())).pathname).toBe('${expectedPathVoid}');`);\n if (plan.hasBody && payload) {\n lines.push(` expect(fetchBody()).toEqual(expect.objectContaining(${payload.snakeCaseObj}));`);\n }\n lines.push(' });');\n}\n\nfunction renderErrorTest(\n lines: string[],\n op: Operation,\n plan: any,\n method: string,\n serviceProp: string,\n modelMap: Map<string, Model>,\n): void {\n const args = buildCallArgs(op, plan, modelMap);\n\n lines.push('');\n lines.push(` testUnauthorized(() => workos.${serviceProp}.${method}(${args}));`);\n\n // Add error-status tests based on the operation's error responses\n const errorStatuses = new Set(op.errors.map((e) => e.statusCode));\n\n // 404 test for find/get methods\n if (errorStatuses.has(404) && (method.startsWith('get') || method.startsWith('find'))) {\n lines.push('');\n lines.push(\" it('throws NotFoundException on 404', async () => {\");\n lines.push(\" fetchOnce('', { status: 404 });\");\n lines.push(` await expect(workos.${serviceProp}.${method}(${args})).rejects.toThrow();`);\n lines.push(' });');\n }\n\n // 422 test for create/update methods\n if (errorStatuses.has(422) && (method.startsWith('create') || method.startsWith('update'))) {\n lines.push('');\n lines.push(\" it('throws UnprocessableEntityException on 422', async () => {\");\n lines.push(\" fetchOnce('', { status: 422 });\");\n lines.push(` await expect(workos.${serviceProp}.${method}(${args})).rejects.toThrow();`);\n lines.push(' });');\n }\n}\n\n/**\n * Build the argument string for a method call in tests.\n * Shared by renderErrorTest and other test renderers.\n */\nfunction buildCallArgs(op: Operation, plan: any, modelMap: Map<string, Model>): string {\n const pathArgs = buildTestPathArgs(op);\n const isPaginated = plan.isPaginated;\n const hasBody = plan.hasBody;\n\n if (isPaginated) return pathArgs || '';\n if (hasBody) {\n const payload = buildTestPayload(op, modelMap);\n const bodyArg = payload ? payload.camelCaseObj : fallbackBodyArg(op, modelMap);\n return pathArgs ? `${pathArgs}, ${bodyArg}` : bodyArg;\n }\n return pathArgs || '';\n}\n\n/**\n * Generate per-entity assertion helper functions for models used in 2+ tests.\n * Returns lines like: function expectConnection(result: any) { expect(...) }\n */\n/**\n * Generate per-entity assertion helper functions for models used in 2+ tests.\n * Returns { lines, helpers } where helpers is a Set of helper function names.\n */\nfunction generateEntityHelpers(\n plans: { op: Operation; plan: any; method: string }[],\n modelMap: Map<string, Model>,\n ctx: EmitterContext,\n): { lines: string[]; helpers: Set<string> } {\n // Count how many tests reference each response model\n const modelUsage = new Map<string, number>();\n for (const { op, plan } of plans) {\n let modelName: string | null = null;\n if (plan.isPaginated && op.pagination?.itemType.kind === 'model') {\n modelName = op.pagination.itemType.name;\n const rawModel = modelMap.get(modelName);\n if (rawModel) {\n const unwrapped = unwrapListModel(rawModel, modelMap);\n if (unwrapped) modelName = unwrapped.name;\n }\n } else if (plan.responseModelName) {\n modelName = plan.responseModelName;\n }\n if (modelName) {\n modelUsage.set(modelName, (modelUsage.get(modelName) ?? 0) + 1);\n }\n }\n\n const lines: string[] = [];\n const helpers = new Set<string>();\n for (const [modelName, count] of modelUsage) {\n if (count < 2) continue;\n const model = modelMap.get(modelName);\n if (!model) continue;\n const assertions = buildFieldAssertions(model, 'result', modelMap);\n if (assertions.length === 0) continue;\n\n const domainName = resolveInterfaceName(modelName, ctx);\n const helperName = `expect${domainName}`;\n if (helpers.has(helperName)) continue;\n helpers.add(helperName);\n\n lines.push(`function ${helperName}(result: any) {`);\n for (const assertion of assertions) {\n lines.push(` ${assertion}`);\n }\n lines.push('}');\n lines.push('');\n }\n return { lines, helpers };\n}\n\n/**\n * Build field-level assertions for top-level primitive fields of a response model.\n * Returns lines like: expect(result.fieldName).toBe(fixtureValue);\n *\n * When the top level has no assertable primitive fields (e.g. wrapper types\n * whose only required fields are nested models), recurse one level into those\n * nested models so we still get meaningful assertions instead of a bare\n * `toBeDefined()`.\n */\nfunction buildFieldAssertions(model: Model, accessor: string, modelMap?: Map<string, Model>): string[] {\n const assertions: string[] = [];\n\n for (const field of model.fields) {\n if (!field.required) continue;\n // When a field has an example value, use it as the expected assertion value\n if (field.example !== undefined) {\n const domainField = fieldName(field.name);\n if (typeof field.example === 'object' && field.example !== null) {\n // Objects and arrays need toEqual with JSON serialization\n assertions.push(`expect(${accessor}.${domainField}).toEqual(${JSON.stringify(field.example)});`);\n } else {\n const exampleLiteral = typeof field.example === 'string' ? `'${field.example}'` : String(field.example);\n assertions.push(`expect(${accessor}.${domainField}).toBe(${exampleLiteral});`);\n }\n continue;\n }\n const value = fixtureValueForType(field.type, field.name, model.name);\n if (value === null) continue;\n const domainField = fieldName(field.name);\n assertions.push(`expect(${accessor}.${domainField}).toBe(${value});`);\n }\n\n // When no primitive assertions were found (e.g. wrapper types like\n // ResetPasswordResponse { user: User }), recurse one level into nested\n // model-type fields to generate assertions on their primitive fields.\n if (assertions.length === 0 && modelMap) {\n for (const field of model.fields) {\n if (!field.required) continue;\n if (field.type.kind === 'model') {\n const nestedModel = modelMap.get(field.type.name);\n if (nestedModel) {\n const nestedAccessor = `${accessor}.${fieldName(field.name)}`;\n // Recurse without modelMap to limit depth to one level\n const nested = buildFieldAssertions(nestedModel, nestedAccessor);\n assertions.push(...nested);\n }\n }\n }\n }\n\n return assertions;\n}\n\n/**\n * Return a JS literal string for the expected fixture value of a field.\n * Returns null for types that cannot be deterministically generated.\n * When a modelMap is provided, recursively builds object literals for nested model types.\n * When wire is true, uses snake_case keys for nested model objects (wire format).\n */\nfunction fixtureValueForType(\n ref: TypeRef,\n name: string,\n modelName: string,\n modelMap?: Map<string, Model>,\n wire?: boolean,\n): string | null {\n switch (ref.kind) {\n case 'primitive':\n return fixtureValueForPrimitive(ref.type, ref.format, name, modelName);\n case 'literal':\n return typeof ref.value === 'string' ? `'${ref.value}'` : String(ref.value);\n case 'enum':\n // Use the first enum value as a realistic fixture value\n if (ref.values?.length) {\n const first = ref.values[0];\n return typeof first === 'string' ? `'${first}'` : String(first);\n }\n return null;\n case 'array': {\n // For arrays of primitives/enums, generate a single-element array assertion.\n // For arrays of models/complex types, return null to skip the assertion —\n // the fixture will have populated items that we can't predict here.\n const itemValue = fixtureValueForType(ref.items, name, modelName, modelMap, wire);\n if (itemValue !== null) return `[${itemValue}]`;\n return null;\n }\n case 'model': {\n if (!modelMap) return null;\n const nested = modelMap.get(ref.name);\n if (!nested) return null;\n const requiredFields = nested.fields.filter((f) => f.required);\n const entries: string[] = [];\n for (const field of requiredFields) {\n const value = fixtureValueForType(field.type, field.name, nested.name, modelMap, wire);\n if (value === null) return null; // Can't build a complete object\n const key = wire ? wireFieldName(field.name) : fieldName(field.name);\n entries.push(`${key}: ${value}`);\n }\n return `{ ${entries.join(', ')} }`;\n }\n default:\n return null;\n }\n}\n\nfunction fixtureValueForPrimitive(\n type: string,\n format: string | undefined,\n name: string,\n modelName: string,\n): string | null {\n switch (type) {\n case 'string':\n if (format === 'date-time') return \"'2023-01-01T00:00:00.000Z'\";\n if (format === 'date') return \"'2023-01-01'\";\n if (format === 'uuid') return \"'00000000-0000-0000-0000-000000000000'\";\n if (name === 'id') {\n const prefix = ID_PREFIXES[modelName] ?? '';\n return `'${prefix}01234'`;\n }\n if (name.includes('id')) return `'${wireFieldName(name)}_01234'`;\n if (name.includes('email')) return \"'test@example.com'\";\n if (name.includes('url') || name.includes('uri')) return \"'https://example.com'\";\n if (name.includes('name')) return \"'Test'\";\n return `'test_${wireFieldName(name)}'`;\n case 'integer':\n return '1';\n case 'number':\n return '1';\n case 'boolean':\n return 'true';\n default:\n return null;\n }\n}\n\n/**\n * Build the expected full URL path for an operation, substituting path params\n * with their test values. Returns a string like '/organizations/test_id'.\n */\nfunction buildExpectedPath(op: Operation): string {\n let path = op.path;\n for (const param of op.pathParams) {\n path = path.replace(`{${param.name}}`, pathParamTestValue(param, fieldName(param.name)));\n }\n return path;\n}\n\n/**\n * Build a realistic test payload for a request body model.\n * Returns { camelCaseObj, snakeCaseObj } as inline JS object literal strings,\n * or null if the request body is not a named model.\n *\n * camelCaseObj is what the SDK consumer passes (e.g. { organizationName: 'Test' })\n * snakeCaseObj is the expected wire format (e.g. { organization_name: 'Test' })\n */\nfunction buildTestPayload(\n op: Operation,\n modelMap: Map<string, Model>,\n): { camelCaseObj: string; snakeCaseObj: string } | null {\n if (!op.requestBody) return null;\n\n // For discriminated unions, build a payload from the first variant so the\n // generated test produces a value that satisfies the union type. Without\n // this, emitted tests pass `{} as any` for union bodies — fine for older\n // permissive runtimes, but the dispatch switch now throws on unknown\n // discriminator values, so the tests would fail before hitting fetch.\n let model: Model | undefined;\n if (op.requestBody.kind === 'union') {\n const firstVariant = op.requestBody.variants.find((v) => v.kind === 'model');\n if (!firstVariant || firstVariant.kind !== 'model') return null;\n model = modelMap.get(firstVariant.name);\n } else if (op.requestBody.kind === 'model') {\n model = modelMap.get(op.requestBody.name);\n }\n if (!model) return null;\n\n const fields = model.fields.filter((f) => f.required);\n // Only use fields that we can generate deterministic values for (primitives, enums, and nested models)\n const usableFields = fields.filter((f) => fixtureValueForType(f.type, f.name, model.name, modelMap) !== null);\n\n // Only generate a typed payload when ALL required fields have fixture values.\n // A partial payload missing required fields would fail TypeScript type checking.\n if (usableFields.length === 0 || usableFields.length < fields.length) return null;\n\n const camelEntries: string[] = [];\n const snakeEntries: string[] = [];\n\n for (const field of usableFields) {\n const camelValue = fixtureValueForType(field.type, field.name, model.name, modelMap)!;\n const wireValue = fixtureValueForType(field.type, field.name, model.name, modelMap, true)!;\n const camelKey = fieldName(field.name);\n const snakeKey = wireFieldName(field.name);\n camelEntries.push(`${camelKey}: ${camelValue}`);\n snakeEntries.push(`${snakeKey}: ${wireValue}`);\n }\n\n return {\n camelCaseObj: `{ ${camelEntries.join(', ')} }`,\n snakeCaseObj: `{ ${snakeEntries.join(', ')} }`,\n };\n}\n\n/**\n * Compute a fallback body argument when buildTestPayload returns null.\n * If the request body model has no required fields (all optional), an empty\n * object `{}` is a valid value and doesn't need a type assertion. Otherwise,\n * fall back to `{} as any` to bypass type checking for complex required fields.\n */\nfunction fallbackBodyArg(op: Operation, modelMap: Map<string, Model>): string {\n if (!op.requestBody) return '{} as any';\n let model: Model | undefined;\n if (op.requestBody.kind === 'union') {\n const firstVariant = op.requestBody.variants.find((v) => v.kind === 'model');\n if (firstVariant && firstVariant.kind === 'model') model = modelMap.get(firstVariant.name);\n } else if (op.requestBody.kind === 'model') {\n model = modelMap.get(op.requestBody.name);\n }\n if (!model) return '{} as any';\n const hasRequiredFields = model.fields.some((f) => f.required);\n return hasRequiredFields ? '{} as any' : '{}';\n}\n\n/**\n * Determine whether a model should get a round-trip serializer test.\n * Includes all models with at least one field — every model gets both\n * serialize and deserialize functions, so all benefit from round-trip testing.\n */\nfunction modelNeedsRoundTripTest(model: Model): boolean {\n return model.fields.length > 0;\n}\n\n/**\n * Generate serializer round-trip tests for models that have both serialize and\n * deserialize functions and have nested types requiring non-trivial serialization.\n */\nfunction generateSerializerTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const modelToService = assignModelsToServices(spec.models, spec.services);\n const serviceNameMap = new Map<string, string>();\n for (const service of spec.services) {\n serviceNameMap.set(service.name, resolveResourceClassName(service, ctx));\n }\n const resolveDir = (irService: string | undefined) =>\n irService ? resolveServiceDir(serviceNameMap.get(irService) ?? irService) : 'common';\n\n // Only generate round-trip tests for models with fields that have serializers generated.\n // Skip list metadata and list wrapper models since their serializers are not emitted.\n const eligibleModels = spec.models.filter(\n (m) => modelNeedsRoundTripTest(m) && !isListMetadataModel(m) && !isListWrapperModel(m),\n );\n\n if (eligibleModels.length === 0) return files;\n\n // Group eligible models by service directory for one test file per service\n const modelsByDir = new Map<string, Model[]>();\n for (const model of eligibleModels) {\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n if (!modelsByDir.has(dirName)) {\n modelsByDir.set(dirName, []);\n }\n modelsByDir.get(dirName)!.push(model);\n }\n\n for (const [dirName, models] of modelsByDir) {\n const testPath = `src/${dirName}/serializers.spec.ts`;\n const lines: string[] = [];\n\n // Collect imports\n const serializerImports: string[] = [];\n const interfaceImports: string[] = [];\n const fixtureImports: string[] = [];\n\n for (const model of models) {\n const domainName = resolveInterfaceName(model.name, ctx);\n const service = modelToService.get(model.name);\n const modelDir = resolveDir(service);\n const serializerPath = `src/${modelDir}/serializers/${fileName(model.name)}.serializer.ts`;\n const interfacePath = `src/${modelDir}/interfaces/${fileName(model.name)}.interface.ts`;\n const fixturePath = `src/${modelDir}/fixtures/${fileName(model.name)}.fixture.json`;\n\n serializerImports.push(\n `import { deserialize${domainName}, serialize${domainName} } from '${relativeImport(testPath, serializerPath)}';`,\n );\n const wireName = wireInterfaceName(domainName);\n interfaceImports.push(`import type { ${wireName} } from '${relativeImport(testPath, interfacePath)}';`);\n const camelName = domainName.charAt(0).toLowerCase() + domainName.slice(1);\n fixtureImports.push(`import ${camelName}Fixture from '${relativeImport(testPath, fixturePath)}';`);\n }\n\n for (const imp of serializerImports) {\n lines.push(imp);\n }\n for (const imp of interfaceImports) {\n lines.push(imp);\n }\n for (const imp of fixtureImports) {\n lines.push(imp);\n }\n lines.push('');\n\n for (const model of models) {\n const domainName = resolveInterfaceName(model.name, ctx);\n const camelDomain = domainName.charAt(0).toLowerCase() + domainName.slice(1);\n const fixtureName = `${camelDomain}Fixture`;\n\n const wireName = wireInterfaceName(domainName);\n lines.push(`describe('${domainName}Serializer', () => {`);\n lines.push(\" it('round-trips through serialize/deserialize', () => {\");\n // Cast the fixture to the wire-type interface — JSON imports are inferred\n // with primitive types (e.g., `string`) that don't satisfy literal-typed\n // response fields (e.g., `type: \"enum\"`), so the deserialize call needs\n // the explicit cast to compile.\n lines.push(` const fixture = ${fixtureName} as ${wireName};`);\n lines.push(` const deserialized = deserialize${domainName}(fixture);`);\n lines.push(` const reserialized = serialize${domainName}(deserialized);`);\n lines.push(' expect(reserialized).toEqual(expect.objectContaining(fixture));');\n lines.push(' });');\n lines.push('});');\n lines.push('');\n }\n\n files.push({\n path: testPath,\n content: lines.join('\\n'),\n skipIfExists: true,\n });\n }\n\n return files;\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { resolveMethodName, servicePropertyName } from './naming.js';\nimport { resolveResourceClassName } from './resources.js';\n\nexport function generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const manifest: Record<string, { sdkMethod: string; service: string }> = {};\n\n for (const service of spec.services) {\n const propName = servicePropertyName(resolveResourceClassName(service, ctx));\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const method = resolveMethodName(op, service, ctx);\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return [\n {\n path: 'smoke-manifest.json',\n content: JSON.stringify(manifest, null, 2),\n integrateTarget: false,\n overwriteExisting: true,\n },\n ];\n}\n","import type {\n Emitter,\n EmitterContext,\n FormatCommand,\n GeneratedFile,\n ApiSpec,\n Model,\n Enum,\n Service,\n} from '@workos/oagen';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { generateModelsAndSerializers } from './models.js';\nimport { generateEnums } from './enums.js';\nimport { generateResources } from './resources.js';\nimport { generateClient } from './client.js';\nimport { generateErrors } from './errors.js';\n\nimport { generateTests } from './tests.js';\nimport { generateManifest } from './manifest.js';\n\n/** Ensure every generated file's content ends with a trailing newline. */\nfunction ensureTrailingNewlines(files: GeneratedFile[]): GeneratedFile[] {\n for (const f of files) {\n if (f.content && !f.content.endsWith('\\n')) {\n f.content += '\\n';\n }\n }\n return files;\n}\n\nexport const nodeEmitter: Emitter = {\n language: 'node',\n\n generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateModelsAndSerializers(models, ctx));\n },\n\n generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateEnums(enums, ctx));\n },\n\n generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateResources(services, ctx));\n },\n\n generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateClient(spec, ctx));\n },\n\n generateErrors(ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateErrors(ctx));\n },\n\n generateTypeSignatures(_spec: ApiSpec, _ctx: EmitterContext): GeneratedFile[] {\n // TypeScript uses inline types — no separate type signature files needed\n return [];\n },\n\n generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateTests(spec, ctx));\n },\n\n generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateManifest(spec, ctx));\n },\n\n fileHeader(): string {\n return '// This file is auto-generated by oagen. Do not edit.';\n },\n\n formatCommand(targetDir: string): FormatCommand | null {\n const hasPrettier = fs.existsSync(path.join(targetDir, '.prettierrc'));\n const hasEslint =\n fs.existsSync(path.join(targetDir, 'eslint.config.mjs')) ||\n fs.existsSync(path.join(targetDir, 'eslint.config.js')) ||\n fs.existsSync(path.join(targetDir, '.eslintrc.json')) ||\n fs.existsSync(path.join(targetDir, '.eslintrc.js'));\n\n if (hasPrettier && hasEslint) {\n // Chain ESLint autofix (e.g. unused-import removal) then prettier.\n // ESLint errors are suppressed so formatting still runs on lint failure.\n return {\n cmd: 'bash',\n args: [\n '-c',\n 'npx eslint --fix --no-error-on-unmatched-pattern \"$@\" 2>/dev/null; npx prettier --write --log-level silent \"$@\"',\n '--',\n ],\n };\n }\n if (hasPrettier) {\n return {\n cmd: 'npx',\n args: ['prettier', '--write', '--log-level', 'silent'],\n };\n }\n if (hasEslint) {\n return {\n cmd: 'npx',\n args: ['eslint', '--fix', '--no-error-on-unmatched-pattern'],\n };\n }\n return null;\n },\n};\n","import type { Operation, Service, EmitterContext } from '@workos/oagen';\nimport { toPascalCase, toSnakeCase } from '@workos/oagen';\nimport { buildResolvedLookup, lookupMethodName, getMountTarget } from '../shared/resolved-ops.js';\nimport { stripUrnPrefix, applyAcronymFixes } from '../shared/naming-utils.js';\n\n/**\n * Python class names that collide with builtins or typing imports.\n * When a model name resolves to one of these, suffix with \"Model\".\n */\nconst PYTHON_RESERVED_CLASS_NAMES = new Set([\n 'List',\n 'Dict',\n 'Set',\n 'Tuple',\n 'Type',\n 'Any',\n 'Optional',\n 'Union',\n 'Literal',\n 'Final',\n 'ClassVar',\n 'Callable',\n]);\n\n/** PascalCase class name with acronym preservation. */\nexport function className(name: string): string {\n let result = applyAcronymFixes(toPascalCase(stripUrnPrefix(name)));\n if (PYTHON_RESERVED_CLASS_NAMES.has(result)) {\n result += 'Model';\n }\n return result;\n}\n\n/** snake_case file name (without extension). */\nexport function fileName(name: string): string {\n return toSnakeCase(stripUrnPrefix(name));\n}\n\n/** snake_case method name. */\nexport function methodName(name: string): string {\n return toSnakeCase(name);\n}\n\n/** snake_case field name. */\nexport function fieldName(name: string): string {\n return toSnakeCase(name);\n}\n\n/**\n * Python builtins that should not be shadowed by parameter names.\n * When a path/query param name collides, suffix with underscore.\n */\nconst PYTHON_BUILTIN_NAMES = new Set([\n 'type',\n 'id',\n 'list',\n 'dict',\n 'set',\n 'map',\n 'filter',\n 'input',\n 'object',\n 'format',\n 'hash',\n 'range',\n 'dir',\n 'max',\n 'min',\n 'next',\n 'open',\n 'print',\n 'len',\n 'str',\n 'int',\n 'float',\n 'bool',\n 'bytes',\n 'tuple',\n 'super',\n]);\n\n/**\n * Safe parameter name for path/query params that avoids shadowing Python builtins.\n * Body field names should continue to use fieldName() to preserve wire-key compatibility.\n */\nexport function safeParamName(name: string): string {\n const snake = toSnakeCase(name);\n return PYTHON_BUILTIN_NAMES.has(snake) ? `${snake}_` : snake;\n}\n\n/** snake_case module/directory name. */\nexport function moduleName(name: string): string {\n return toSnakeCase(name);\n}\n\n/** snake_case property name for service accessors on the client. */\nexport function servicePropertyName(name: string): string {\n return toSnakeCase(name);\n}\n\n/**\n * Resolve the effective service name, using the overlay-resolved class name\n * when available.\n */\nexport function resolveServiceName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n/**\n * Build a map from IR service name to resolved service name.\n */\nexport function buildServiceNameMap(services: Service[], ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of services) {\n map.set(service.name, resolveServiceName(service, ctx));\n }\n return map;\n}\n\n/**\n * Resolve the output directory for a service.\n */\nexport function resolveServiceDir(resolvedServiceName: string): string {\n return moduleName(resolvedServiceName);\n}\n\n/** Resolve the SDK method name for an operation, using resolved operations first. */\nexport function resolveMethodName(op: Operation, _service: Service, ctx: EmitterContext): string {\n const lookup = buildResolvedLookup(ctx);\n const resolved = lookupMethodName(op, lookup);\n if (resolved) return resolved;\n // Fallback to overlay, then spec-derived\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup?.methodByOperation?.get(httpKey);\n if (existing) return toSnakeCase(existing.methodName);\n return toSnakeCase(op.name);\n}\n\n/** Resolve the SDK class name for a service, using resolved operations' mountOn. */\nexport function resolveClassName(service: Service, ctx: EmitterContext): string {\n // Use resolved ops mountOn as canonical class name (flat pattern like PHP)\n for (const r of ctx.resolvedOperations ?? []) {\n if (r.service.name === service.name) return r.mountOn;\n }\n // Fallback to overlay, then IR name\n if (ctx.overlayLookup?.methodByOperation) {\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup.methodByOperation.get(httpKey);\n if (existing) return existing.className;\n }\n }\n return toPascalCase(service.name);\n}\n\n/** Resolve the type name for a model, checking overlay first. */\nexport function resolveTypeName(name: string, ctx: EmitterContext): string {\n const existing = ctx.overlayLookup?.interfaceByName?.get(name);\n if (existing) return existing;\n return toPascalCase(stripUrnPrefix(name));\n}\n\n/**\n * Build a map from IR service name to mount-target directory name.\n * Every service maps to its mount target's snake_case directory.\n * Replaces the old buildServiceDirMap(grouping) which required namespace grouping.\n */\nexport function buildMountDirMap(ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of ctx.spec.services) {\n const target = getMountTarget(service, ctx);\n map.set(service.name, moduleName(target));\n }\n return map;\n}\n\n/** Convert a filesystem directory path (with /) to a Python dotted module path. */\nexport function dirToModule(dir: string): string {\n return dir.replace(/\\//g, '.');\n}\n\n/**\n * Compute the relative import prefix (dots) to reach the namespace root from a given dir depth.\n * With the flat mount-based layout, dirs are always single-level so this returns \"..\" (2 dots).\n */\nexport function relativeImportPrefix(dirName: string): string {\n const depth = dirName.split('/').length;\n return '.'.repeat(depth + 1);\n}\n","import type { TypeRef, PrimitiveType, UnionType } from '@workos/oagen';\nimport { mapTypeRef as irMapTypeRef } from '@workos/oagen';\nimport { className } from './naming.js';\n\n/**\n * Map an IR TypeRef to a Python type hint string.\n * Uses standard library types: str, int, float, bool, List, Dict, Optional, Union.\n */\nexport function mapTypeRef(ref: TypeRef): string {\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\n array: (ref, items) => {\n void ref;\n return `List[${items}]`;\n },\n model: (r) => `\"${className(r.name)}\"`,\n enum: (r) => `\"${className(r.name)}\"`,\n union: (r, variants) => joinUnionVariants(r, variants),\n nullable: (ref, inner) => {\n void ref;\n return `Optional[${inner}]`;\n },\n literal: (r) =>\n typeof r.value === 'string' ? `Literal[\"${r.value}\"]` : r.value === null ? 'None' : `Literal[${String(r.value)}]`,\n map: (ref, value) => {\n void ref;\n return `Dict[str, ${value}]`;\n },\n });\n}\n\n/**\n * Map an IR TypeRef to a plain Python type string (no quotes around model/enum refs).\n * Used for import collection and direct type references.\n */\nexport function mapTypeRefUnquoted(ref: TypeRef, knownEnums?: Set<string>, allowRawEnumStrings = false): string {\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\n array: (ref, items) => {\n void ref;\n return `List[${items}]`;\n },\n model: (r) => className(r.name),\n enum: (r) => {\n if (knownEnums && !knownEnums.has(r.name)) return 'str';\n const enumType = className(r.name);\n return allowRawEnumStrings ? `Union[${enumType}, str]` : enumType;\n },\n union: (r, variants) => joinUnionVariants(r, variants),\n nullable: (ref, inner) => {\n void ref;\n return `Optional[${inner}]`;\n },\n literal: (r) =>\n typeof r.value === 'string' ? `Literal[\"${r.value}\"]` : r.value === null ? 'None' : `Literal[${String(r.value)}]`,\n map: (ref, value) => {\n void ref;\n return `Dict[str, ${value}]`;\n },\n });\n}\n\nfunction mapPrimitive(ref: PrimitiveType): string {\n if (ref.format) {\n switch (ref.format) {\n case 'binary':\n return 'bytes';\n }\n }\n switch (ref.type) {\n case 'string':\n return 'str';\n case 'integer':\n return 'int';\n case 'number':\n return 'float';\n case 'boolean':\n return 'bool';\n case 'unknown':\n return 'Any';\n }\n}\n\nfunction joinUnionVariants(ref: UnionType, variants: string[]): string {\n if (ref.compositionKind === 'allOf') {\n // Python doesn't have intersection types; use the first variant\n return variants[0] ?? 'Any';\n }\n // Deduplicate identical variants (e.g., Union[Foo, Foo] -> Foo)\n const unique = [...new Set(variants)];\n if (unique.length === 1) return unique[0];\n return `Union[${unique.join(', ')}]`;\n}\n","import type { Enum, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { toUpperSnakeCase, walkTypeRef } from '@workos/oagen';\nimport { className, fileName, buildMountDirMap, dirToModule } from './naming.js';\n\n/**\n * Convert a PascalCase class name to a human-readable lowercase string,\n * preserving known acronyms instead of splitting them character-by-character.\n */\nfunction humanizeClassName(name: string): string {\n // Insert spaces before uppercase runs, but keep acronyms together\n let result = name.replace(/([a-z])([A-Z])/g, '$1 $2');\n // Split consecutive uppercase letters from following lowercase: \"SSOProvider\" -> \"SSO Provider\"\n result = result.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n return result.toLowerCase();\n}\n\n/**\n * Generate Python enum class files from IR Enum definitions.\n * Uses `(str, Enum)` for type-safe enum values (Python 3.10+).\n */\nexport function generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n if (enums.length === 0) return [];\n\n const enumToService = assignEnumsToServices(enums, ctx.spec.services);\n const mountDirMap = buildMountDirMap(ctx);\n const resolveDir = (irService: string | undefined) =>\n irService ? (mountDirMap.get(irService) ?? 'common') : 'common';\n const files: GeneratedFile[] = [];\n const compatAliases = collectCompatEnumAliases(enums, ctx);\n\n const aliasOf = collectEnumAliasOf(enums);\n\n for (const enumDef of enums) {\n const service = enumToService.get(enumDef.name);\n const dirName = resolveDir(service);\n\n // If this enum is an alias for a canonical enum, generate a type alias file\n const canonicalName = aliasOf.get(enumDef.name);\n if (canonicalName) {\n const canonicalService = enumToService.get(canonicalName);\n const canonicalDir = resolveDir(canonicalService);\n const canonicalCls = className(canonicalName);\n const aliasCls = className(enumDef.name);\n const lines: string[] = [];\n lines.push('from typing import TypeAlias');\n // Use explicit __all__ to prevent ruff F401 from stripping the re-export\n // Always use direct file import to avoid barrel dependency on the canonical\n if (canonicalDir === dirName) {\n lines.push(`from .${fileName(canonicalName)} import ${canonicalCls}`);\n } else {\n lines.push(\n `from ${ctx.namespace}.${dirToModule(canonicalDir)}.models.${fileName(canonicalName)} import ${canonicalCls}`,\n );\n }\n lines.push('');\n lines.push(`${aliasCls}: TypeAlias = ${canonicalCls}`);\n lines.push(`__all__ = [\"${aliasCls}\"]`);\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/${fileName(enumDef.name)}.py`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n\n // Also generate compat alias files for dedup aliases (they may have compat aliases too)\n for (const aliasName of compatAliases.get(enumDef.name) ?? []) {\n const importLine =\n canonicalDir === dirName\n ? `from .${fileName(canonicalName)} import ${canonicalCls}`\n : `from ${ctx.namespace}.${dirToModule(canonicalDir)}.models.${fileName(canonicalName)} import ${canonicalCls}`;\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/${fileName(aliasName)}.py`,\n content: [\n 'from typing import TypeAlias',\n importLine,\n '',\n `${aliasName}: TypeAlias = ${canonicalCls}`,\n `__all__ = [\"${aliasName}\"]`,\n ].join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n continue;\n }\n\n const cls = className(enumDef.name);\n const lines: string[] = [];\n\n const readable = humanizeClassName(enumDef.name);\n lines.push(`\"\"\"Enumeration of ${readable} values.\"\"\"`);\n lines.push('');\n lines.push('from __future__ import annotations');\n lines.push('');\n\n if (enumDef.values.length === 0) {\n lines.push('from typing import Union');\n lines.push('from typing import TypeAlias');\n lines.push('');\n lines.push(`${cls}: TypeAlias = str`);\n } else {\n // Deduplicate values that produce the same string\n const seenValues = new Set<string>();\n const uniqueValues: typeof enumDef.values = [];\n for (const value of enumDef.values) {\n const valueStr = String(value.value);\n if (!seenValues.has(valueStr)) {\n seenValues.add(valueStr);\n uniqueValues.push({ ...value, value: valueStr });\n }\n }\n\n // Determine if all values are strings or all integers\n const allStrings = uniqueValues.every((v) => typeof v.value === 'string');\n const allIntegers = uniqueValues.every((v) => typeof v.value === 'number' && Number.isInteger(v.value));\n\n if (allStrings) {\n lines.push('from enum import Enum');\n lines.push('from typing import Optional');\n lines.push('from typing import Literal, TypeAlias');\n lines.push('');\n lines.push('');\n lines.push(`class ${cls}(str, Enum):`);\n lines.push(` \"\"\"Known values for ${cls}.\"\"\"`);\n lines.push('');\n } else if (allIntegers) {\n lines.push('from enum import IntEnum');\n lines.push('from typing import Literal, TypeAlias');\n lines.push('');\n lines.push('');\n lines.push(`class ${cls}(IntEnum):`);\n lines.push(` \"\"\"Known values for ${cls}.\"\"\"`);\n lines.push('');\n } else {\n // Mixed types — fall back to Union[Literal[...], str]\n lines.push('from typing import Union');\n lines.push('from typing import Literal, TypeAlias');\n lines.push('');\n const literals = uniqueValues.map((v) => (typeof v.value === 'string' ? `\"${v.value}\"` : String(v.value)));\n lines.push(`${cls}: TypeAlias = Union[Literal[${literals.join(', ')}], str]`);\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/${fileName(enumDef.name)}.py`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n continue;\n }\n\n const usedNames = new Set<string>();\n for (const v of uniqueValues) {\n let memberName = toUpperSnakeCase(String(v.value));\n if (usedNames.has(memberName)) {\n let suffix = 2;\n while (usedNames.has(`${memberName}_${suffix}`)) suffix++;\n memberName = `${memberName}_${suffix}`;\n }\n usedNames.add(memberName);\n const valueStr = typeof v.value === 'string' ? `\"${v.value}\"` : String(v.value);\n lines.push(` ${memberName} = ${valueStr}`);\n if (v.description || v.deprecated) {\n const parts: string[] = [];\n if (v.description) parts.push(v.description);\n if (v.deprecated) parts.push('.. deprecated::');\n lines.push(` \"\"\"${parts.join('\\n\\n ')}\"\"\"`);\n }\n }\n if (allStrings) {\n lines.push('');\n lines.push(' @classmethod');\n lines.push(` def _missing_(cls, value: object) -> Optional[\"${cls}\"]:`);\n lines.push(' if not isinstance(value, str):');\n lines.push(' return None');\n lines.push(' unknown = str.__new__(cls, value)');\n lines.push(' unknown._name_ = value.upper()');\n lines.push(' unknown._value_ = value');\n lines.push(' return unknown');\n }\n lines.push('');\n lines.push(\n `${cls}Literal: TypeAlias = Literal[${uniqueValues\n .map((v) => (typeof v.value === 'string' ? `\"${v.value}\"` : String(v.value)))\n .join(', ')}]`,\n );\n }\n\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/${fileName(enumDef.name)}.py`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n\n for (const aliasName of compatAliases.get(enumDef.name) ?? []) {\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/${fileName(aliasName)}.py`,\n content: [\n 'from typing import TypeAlias',\n `from .${fileName(enumDef.name)} import ${cls}`,\n '',\n `${aliasName}: TypeAlias = ${cls}`,\n `__all__ = [\"${aliasName}\"]`,\n ].join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n }\n\n return files;\n}\n\nexport function collectCompatEnumAliases(enums: Enum[], ctx: EmitterContext): Map<string, string[]> {\n const aliases = new Map<string, string[]>();\n const irEnumNames = new Set(enums.map((enumDef) => enumDef.name));\n const normalizedHashToEnum = new Map<string, string>();\n\n for (const enumDef of enums) {\n normalizedHashToEnum.set(enumValueHash(enumDef), enumDef.name);\n }\n\n for (const baselineEnum of Object.values(ctx.apiSurface?.enums ?? {})) {\n if (irEnumNames.has(baselineEnum.name)) continue;\n const hash = Object.values(baselineEnum.members)\n .map((value) => String(value))\n .sort()\n .join('|');\n const target = normalizedHashToEnum.get(hash);\n if (!target) continue;\n if (!aliases.has(target)) aliases.set(target, []);\n aliases.get(target)!.push(baselineEnum.name);\n }\n\n return aliases;\n}\n\nfunction collectEnumAliasOf(enums: Enum[]): Map<string, string> {\n const hashGroups = new Map<string, string[]>();\n for (const enumDef of enums) {\n const hash = [...enumDef.values]\n .map((v) => String(v.value))\n .sort()\n .join('|');\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(enumDef.name);\n }\n\n const aliasOf = new Map<string, string>();\n for (const [, names] of hashGroups) {\n if (names.length <= 1) continue;\n const sorted = [...names].sort();\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n aliasOf.set(sorted[i], canonical);\n }\n }\n return aliasOf;\n}\n\nexport function collectGeneratedEnumSymbolsByDir(enums: Enum[], ctx: EmitterContext): Map<string, string[]> {\n const enumToService = assignEnumsToServices(enums, ctx.spec.services);\n const mountDirMap = buildMountDirMap(ctx);\n const resolveDir = (irService: string | undefined) =>\n irService ? (mountDirMap.get(irService) ?? 'common') : 'common';\n const compatAliases = collectCompatEnumAliases(enums, ctx);\n const symbolsByDir = new Map<string, string[]>();\n\n for (const enumDef of enums) {\n const service = enumToService.get(enumDef.name);\n const dirName = resolveDir(service);\n if (!symbolsByDir.has(dirName)) symbolsByDir.set(dirName, []);\n symbolsByDir.get(dirName)!.push(enumDef.name);\n for (const aliasName of compatAliases.get(enumDef.name) ?? []) {\n symbolsByDir.get(dirName)!.push(aliasName);\n }\n }\n\n return symbolsByDir;\n}\n\nfunction enumValueHash(enumDef: Enum): string {\n return [...enumDef.values]\n .map((value) => String(value.value))\n .sort()\n .join('|');\n}\n\nexport function assignEnumsToServices(enums: Enum[], services: Service[]): Map<string, string> {\n const enumToService = new Map<string, string>();\n const enumNames = new Set(enums.map((e) => e.name));\n\n for (const service of services) {\n for (const op of service.operations) {\n const refs = new Set<string>();\n const collect = (ref: any) => {\n walkTypeRef(ref, { enum: (r: any) => refs.add(r.name) });\n };\n if (op.requestBody) collect(op.requestBody);\n collect(op.response);\n for (const p of [...op.pathParams, ...op.queryParams, ...op.headerParams, ...(op.cookieParams ?? [])]) {\n collect(p.type);\n }\n for (const name of refs) {\n if (enumNames.has(name) && !enumToService.has(name)) {\n enumToService.set(name, service.name);\n }\n }\n }\n }\n\n return enumToService;\n}\n","import type { Model, Enum, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { assignModelsToServices, collectFieldDependencies, planOperation, walkTypeRef } from '@workos/oagen';\nimport { mapTypeRef } from './type-map.js';\nimport { className, fieldName, fileName, buildMountDirMap, dirToModule } from './naming.js';\nimport { assignEnumsToServices, collectGeneratedEnumSymbolsByDir } from './enums.js';\n\n/**\n * Generate Python dataclass model files from IR Model definitions.\n * Each model becomes a single .py file with a dataclass, from_dict, and to_dict.\n */\nexport function generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n if (models.length === 0) return [];\n\n const modelToService = assignModelsToServices(models, ctx.spec.services);\n const enumToService = assignEnumsToServices(ctx.spec.enums, ctx.spec.services);\n const mountDirMap = buildMountDirMap(ctx);\n const resolveDir = (irService: string | undefined) =>\n irService ? (mountDirMap.get(irService) ?? 'common') : 'common';\n const files: GeneratedFile[] = [];\n const emittedModelSymbolsByDir = new Map<string, string[]>();\n const modelUsage = collectModelUsage(ctx.spec);\n\n // Build recursive structural hashes for deduplication.\n // Model/enum references are resolved bottom-up so structurally-identical\n // model trees (e.g. event context/actor sub-models) get the same hash.\n const recursiveHashes = buildRecursiveHashMap(models, ctx.spec.enums);\n const hashGroups = new Map<string, string[]>(); // hash -> model names\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n const hash = recursiveHashes.get(model.name) ?? '';\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(model.name);\n }\n\n // For each group of identical models, pick canonical (alphabetically first)\n const aliasOf = new Map<string, string>(); // alias name -> canonical name\n for (const [, names] of hashGroups) {\n if (names.length <= 1) continue;\n const sorted = [...names].sort((a, b) => compareAliasPriority(a, b, modelUsage));\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n if (canAliasModels(canonical, sorted[i], modelUsage)) {\n aliasOf.set(sorted[i], canonical);\n }\n }\n }\n\n for (const model of models) {\n // Skip list wrapper models (e.g., OrganizationList) — SyncPage handles envelopes\n if (isListWrapperModel(model)) continue;\n // Skip all list metadata models (e.g., ListMetadata, FooListListMetadata)\n if (isListMetadataModel(model)) continue;\n\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n const modelClassName = className(model.name);\n\n // If this model is an alias for a canonical model, generate a type alias file\n const canonicalName = aliasOf.get(model.name);\n if (canonicalName) {\n const canonicalService = modelToService.get(canonicalName);\n const canonicalDir = resolveDir(canonicalService);\n const canonicalClassName = className(canonicalName);\n const lines: string[] = [];\n lines.push('from typing import TypeAlias');\n // Always use direct file import to avoid barrel dependency on the canonical\n if (canonicalDir === dirName) {\n lines.push(`from .${fileName(canonicalName)} import ${canonicalClassName}`);\n } else {\n lines.push(\n `from ${ctx.namespace}.${dirToModule(canonicalDir)}.models.${fileName(canonicalName)} import ${canonicalClassName}`,\n );\n }\n lines.push('');\n lines.push(`${modelClassName}: TypeAlias = ${canonicalClassName}`);\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/${fileName(model.name)}.py`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n if (!emittedModelSymbolsByDir.has(dirName)) emittedModelSymbolsByDir.set(dirName, []);\n emittedModelSymbolsByDir.get(dirName)!.push(model.name);\n continue;\n }\n\n // Deduplicate fields that map to the same snake_case name\n const seenFieldNames = new Set<string>();\n const deduplicatedFields = model.fields.filter((f) => {\n const pyName = fieldName(f.name);\n if (seenFieldNames.has(pyName)) return false;\n seenFieldNames.add(pyName);\n return true;\n });\n const dedupModel = { ...model, fields: deduplicatedFields };\n const deps = collectFieldDependencies(dedupModel);\n\n const lines: string[] = [];\n\n // Collect typing imports\n const typingImports = new Set<string>();\n typingImports.add('Any');\n typingImports.add('Dict');\n for (const field of deduplicatedFields) {\n collectTypingImports(field.type, typingImports);\n }\n const hasOptional = deduplicatedFields.some((f) => isOptionalField(model.name, f, ctx));\n if (hasOptional) typingImports.add('Optional');\n const usesDateTime = deduplicatedFields.some((f) => isDateTimeType(f.type));\n const usesEnum = deps.enums.size > 0;\n\n lines.push('from __future__ import annotations');\n lines.push('');\n lines.push('from dataclasses import dataclass');\n if (usesDateTime) {\n lines.push('from datetime import datetime');\n }\n if (usesEnum) {\n lines.push('from enum import Enum');\n }\n lines.push('from typing import cast');\n lines.push(`from typing import ${[...typingImports].sort().join(', ')}`);\n lines.push(`from ${ctx.namespace}._types import _raise_deserialize_error`);\n if (usesDateTime) {\n lines.push(`from ${ctx.namespace}._types import _format_datetime, _parse_datetime`);\n }\n\n // Import referenced models from their service's models package.\n // Always use direct file imports (not barrel __init__.py) to avoid\n // circular-import chains when common/ models reference service modules.\n if (deps.models.size > 0) {\n lines.push('');\n for (const modelName of [...deps.models].sort()) {\n if (modelName === model.name) continue; // skip self\n const modelService = modelToService.get(modelName);\n const modelDir = resolveDir(modelService);\n if (modelDir === dirName) {\n lines.push(`from .${fileName(modelName)} import ${className(modelName)}`);\n } else {\n lines.push(\n `from ${ctx.namespace}.${dirToModule(modelDir)}.models.${fileName(modelName)} import ${className(modelName)}`,\n );\n }\n }\n }\n\n // Import referenced enums — same direct-file strategy.\n if (deps.enums.size > 0) {\n for (const enumName of [...deps.enums].sort()) {\n const enumService = enumToService.get(enumName);\n const enumDir = resolveDir(enumService);\n if (enumDir === dirName) {\n lines.push(`from .${fileName(enumName)} import ${className(enumName)}`);\n } else {\n lines.push(\n `from ${ctx.namespace}.${dirToModule(enumDir)}.models.${fileName(enumName)} import ${className(enumName)}`,\n );\n }\n }\n }\n\n lines.push('');\n lines.push('');\n\n // Dataclass definition\n lines.push('@dataclass(slots=True)');\n lines.push(`class ${modelClassName}:`);\n if (model.description) {\n lines.push(` \"\"\"${model.description}\"\"\"`);\n } else {\n // Generate a default docstring from the class name when the spec\n // doesn't provide a description.\n let readable = modelClassName.replace(/([a-z])([A-Z])/g, '$1 $2');\n readable = readable.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n lines.push(` \"\"\"${readable} model.\"\"\"`);\n }\n\n lines.push('');\n\n // Sort fields: required first, then optional\n const requiredFields = deduplicatedFields.filter((f) => !isOptionalField(model.name, f, ctx));\n const optionalFields = deduplicatedFields.filter((f) => isOptionalField(model.name, f, ctx));\n\n for (const field of requiredFields) {\n const pyFieldName = fieldName(field.name);\n const pyType = resolveModelFieldType(field.type);\n if (field.description || field.deprecated) {\n const parts: string[] = [];\n if (field.description) parts.push(field.description);\n if (field.deprecated) parts.push('.. deprecated:: This field is deprecated.');\n lines.push(` ${pyFieldName}: ${pyType}`);\n lines.push(` \"\"\"${parts.join('\\n\\n ')}\"\"\"`);\n } else {\n lines.push(` ${pyFieldName}: ${pyType}`);\n }\n }\n\n for (const field of optionalFields) {\n const pyFieldName = fieldName(field.name);\n const innerType =\n field.type.kind === 'nullable' ? resolveModelFieldType(field.type.inner) : resolveModelFieldType(field.type);\n const pyType = `Optional[${innerType}]`;\n if (field.description || field.deprecated) {\n const parts: string[] = [];\n if (field.description) parts.push(field.description);\n if (field.deprecated) parts.push('.. deprecated:: This field is deprecated.');\n lines.push(` ${pyFieldName}: ${pyType} = None`);\n lines.push(` \"\"\"${parts.join('\\n\\n ')}\"\"\"`);\n } else {\n lines.push(` ${pyFieldName}: ${pyType} = None`);\n }\n }\n\n // from_dict class method\n lines.push('');\n lines.push(' @classmethod');\n lines.push(` def from_dict(cls, data: Dict[str, Any]) -> \"${modelClassName}\":`);\n lines.push(` \"\"\"Deserialize from a dictionary.\"\"\"`);\n lines.push(' try:');\n lines.push(' return cls(');\n\n for (const field of [...requiredFields, ...optionalFields]) {\n const pyFieldName = fieldName(field.name);\n const wireKey = field.name; // Wire keys are snake_case from the spec\n const isRequired = !isOptionalField(model.name, field, ctx);\n const accessor = isRequired ? `data[\"${wireKey}\"]` : `data.get(\"${wireKey}\")`;\n // For deserialization expressions, nullable types must always handle None\n // even when the field itself is required (the key must be present, but value can be null).\n const deserRequired = isRequired && field.type.kind !== 'nullable';\n const walrusVar = `_v_${pyFieldName}`;\n const deserExpr = deserializeField(field.type, accessor, deserRequired, walrusVar);\n lines.push(` ${pyFieldName}=${deserExpr},`);\n }\n\n lines.push(' )');\n lines.push(' except (KeyError, ValueError) as e:');\n lines.push(` _raise_deserialize_error(\"${modelClassName}\", e)`);\n\n // to_dict instance method\n lines.push('');\n lines.push(' def to_dict(self) -> Dict[str, Any]:');\n lines.push(' \"\"\"Serialize to a dictionary.\"\"\"');\n lines.push(' result: Dict[str, Any] = {}');\n\n for (const field of [...requiredFields, ...optionalFields]) {\n const pyFieldName = fieldName(field.name);\n const wireKey = field.name;\n const isRequired = !isOptionalField(model.name, field, ctx);\n\n const isNullable = field.type.kind === 'nullable';\n if (isRequired && !isNullable) {\n // Required non-nullable: always serialize directly\n const serExpr = serializeField(field.type, `self.${pyFieldName}`);\n lines.push(` result[\"${wireKey}\"] = ${serExpr}`);\n } else if (isNullable) {\n // Nullable fields should round-trip explicit None as null, even when optional\n const innerType = (field.type as any).inner;\n const serExpr = serializeField(innerType, `self.${pyFieldName}`);\n lines.push(` if self.${pyFieldName} is not None:`);\n lines.push(` result[\"${wireKey}\"] = ${serExpr}`);\n lines.push(` else:`);\n lines.push(` result[\"${wireKey}\"] = None`);\n } else {\n // Optional non-nullable fields should be omitted when unset\n const serExpr = serializeField(field.type, `self.${pyFieldName}`);\n lines.push(` if self.${pyFieldName} is not None:`);\n lines.push(` result[\"${wireKey}\"] = ${serExpr}`);\n }\n }\n\n lines.push(' return result');\n\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/${fileName(model.name)}.py`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n if (!emittedModelSymbolsByDir.has(dirName)) emittedModelSymbolsByDir.set(dirName, []);\n emittedModelSymbolsByDir.get(dirName)!.push(model.name);\n }\n\n // Generate __init__.py barrel files for each models/ directory\n // Include both models and enums\n const symbolsByDir = new Map<string, string[]>();\n for (const [dirName, names] of emittedModelSymbolsByDir) {\n const key = `src/${ctx.namespace}/${dirName}/models`;\n if (!symbolsByDir.has(key)) symbolsByDir.set(key, []);\n symbolsByDir.get(key)!.push(...names);\n }\n\n // Also include enums in the barrels using the enum emitter's actual output placement.\n const reachableEnumNames = collectReachableEnumNames(ctx);\n const emittedEnums = ctx.spec.enums.filter((enumDef) => reachableEnumNames.has(enumDef.name));\n const enumSymbolsByDir = collectGeneratedEnumSymbolsByDir(emittedEnums, ctx);\n for (const [dirName, names] of enumSymbolsByDir) {\n const key = `src/${ctx.namespace}/${dirName}/models`;\n if (!symbolsByDir.has(key)) symbolsByDir.set(key, []);\n symbolsByDir.get(key)!.push(...names);\n }\n\n // Build set of service directory model paths — these get their parent __init__.py\n // from generateServiceInits in client.ts, so we must not create a competing one here.\n const serviceDirModelPaths = new Set<string>();\n for (const service of ctx.spec.services) {\n const dirName = mountDirMap.get(service.name) ?? resolveDir(service.name);\n serviceDirModelPaths.add(`src/${ctx.namespace}/${dirName}/models`);\n }\n\n for (const [dirPath, names] of symbolsByDir) {\n // Use `import X as X` syntax for explicit re-exports (required by pyright strict)\n const uniqueNames = [...new Set(names)].sort();\n const importLines: string[] = [];\n for (const name of uniqueNames) {\n importLines.push(`from .${fileName(name)} import ${className(name)} as ${className(name)}`);\n }\n const imports = importLines.join('\\n');\n files.push({\n path: `${dirPath}/__init__.py`,\n content: imports,\n integrateTarget: true,\n overwriteExisting: true,\n });\n\n // Only generate parent __init__.py for non-service dirs (e.g., common/).\n // Service dirs get their __init__.py from generateServiceInits in client.ts\n // which includes both the resource class re-export and model star import.\n if (!serviceDirModelPaths.has(dirPath)) {\n const parentDir = dirPath.replace(/\\/models$/, '');\n const reExports = [...new Set(names)]\n .sort()\n .map((name) => `from .models import ${className(name)} as ${className(name)}`)\n .join('\\n');\n files.push({\n path: `${parentDir}/__init__.py`,\n content: reExports,\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n }\n\n return files;\n}\n\nfunction collectTypingImports(ref: any, imports: Set<string>): void {\n switch (ref.kind) {\n case 'array':\n imports.add('List');\n collectTypingImports(ref.items, imports);\n break;\n case 'nullable':\n imports.add('Optional');\n collectTypingImports(ref.inner, imports);\n break;\n case 'union':\n imports.add('Union');\n for (const v of ref.variants) collectTypingImports(v, imports);\n break;\n case 'map':\n imports.add('Dict');\n collectTypingImports(ref.valueType, imports);\n break;\n case 'literal':\n imports.add('Literal');\n break;\n case 'primitive':\n if (ref.type === 'unknown') imports.add('Any');\n break;\n }\n}\n\nfunction collectReachableEnumNames(ctx: EmitterContext): Set<string> {\n const referencedModels = new Set<string>();\n const referencedEnums = new Set<string>();\n\n const collectFromTypeRef = (ref: any): void => {\n walkTypeRef(ref, {\n model: (r) => referencedModels.add(r.name),\n enum: (r) => referencedEnums.add(r.name),\n });\n };\n\n for (const service of ctx.spec.services) {\n for (const op of service.operations) {\n for (const p of [...op.pathParams, ...op.queryParams, ...op.headerParams, ...(op.cookieParams ?? [])]) {\n collectFromTypeRef(p.type);\n }\n if (op.requestBody) collectFromTypeRef(op.requestBody);\n collectFromTypeRef(op.response);\n if (op.pagination) collectFromTypeRef(op.pagination.itemType);\n for (const err of op.errors) {\n if (err.type) collectFromTypeRef(err.type);\n }\n if (op.successResponses) {\n for (const sr of op.successResponses) {\n collectFromTypeRef(sr.type);\n }\n }\n }\n }\n\n const modelsByName = new Map(ctx.spec.models.map((m) => [m.name, m]));\n const visited = new Set<string>();\n const queue = [...referencedModels];\n while (queue.length > 0) {\n const name = queue.pop()!;\n if (visited.has(name)) continue;\n visited.add(name);\n const model = modelsByName.get(name);\n if (!model) continue;\n for (const field of model.fields) {\n collectFromTypeRef(field.type);\n for (const modelName of referencedModels) {\n if (!visited.has(modelName)) queue.push(modelName);\n }\n }\n }\n\n return referencedEnums;\n}\n\nfunction collectModelUsage(spec: EmitterContext['spec']): {\n requestOnly: Set<string>;\n response: Set<string>;\n mixed: Set<string>;\n} {\n const request = new Set<string>();\n const response = new Set<string>();\n\n for (const service of spec.services) {\n for (const op of service.operations) {\n const plan = planOperation(op);\n if (plan.responseModelName) {\n response.add(plan.responseModelName);\n }\n if (op.pagination?.itemType.kind === 'model') {\n response.add(op.pagination.itemType.name);\n }\n if (op.requestBody?.kind === 'model') {\n request.add(op.requestBody.name);\n }\n if (op.requestBody?.kind === 'union') {\n for (const variant of op.requestBody.variants ?? []) {\n if (variant.kind === 'model') request.add(variant.name);\n }\n }\n }\n }\n\n const mixed = new Set<string>();\n for (const name of request) {\n if (response.has(name)) mixed.add(name);\n }\n\n const requestOnly = new Set([...request].filter((name) => !mixed.has(name)));\n const responseOnly = new Set([...response].filter((name) => !mixed.has(name)));\n\n return { requestOnly, response: responseOnly, mixed };\n}\n\nfunction compareAliasPriority(left: string, right: string, usage: ReturnType<typeof collectModelUsage>): number {\n const score = (name: string): number => {\n if (usage.response.has(name)) return 0;\n if (usage.mixed.has(name)) return 1;\n if (usage.requestOnly.has(name)) return 2;\n return 3;\n };\n\n const diff = score(left) - score(right);\n if (diff !== 0) return diff;\n return left.localeCompare(right);\n}\n\nfunction canAliasModels(canonical: string, alias: string, usage: ReturnType<typeof collectModelUsage>): boolean {\n // Don't alias across request/response boundaries — a request-only model\n // and a response-only model may look identical today but evolve independently.\n if (\n (usage.response.has(canonical) && usage.requestOnly.has(alias)) ||\n (usage.response.has(alias) && usage.requestOnly.has(canonical))\n ) {\n return false;\n }\n return true;\n}\n\nfunction isOptionalField(modelName: string, field: Model['fields'][number], ctx: EmitterContext): boolean {\n void modelName;\n void ctx;\n // A field is optional (gets = None default) only if it's not required or deprecated.\n // Nullable-required fields (required: true, type: nullable) are NOT optional —\n // they must appear in the API response (value can be null, but key must be present).\n // The spec's required status always takes precedence over the old SDK's API surface.\n if (!field.required || field.deprecated) return true;\n return false;\n}\n\nfunction resolveModelFieldType(ref: any): string {\n // Handle nullable datetime: return Optional[datetime] to preserve nullable wrapper\n if (ref.kind === 'nullable' && isDateTimeType(ref.inner)) {\n return 'Optional[datetime]';\n }\n if (isDateTimeType(ref)) {\n return 'datetime';\n }\n return mapTypeRef(ref);\n}\n\nfunction isDateTimeType(ref: any): boolean {\n if (ref.kind === 'nullable') {\n return isDateTimeType(ref.inner);\n }\n return ref.kind === 'primitive' && ref.type === 'string' && ref.format === 'date-time';\n}\n\nfunction deserializeField(ref: any, accessor: string, isRequired: boolean, walrusVar: string = '_v'): string {\n if (isDateTimeType(ref)) {\n if (isRequired) {\n return `_parse_datetime(${accessor})`;\n }\n return `_parse_datetime(${walrusVar}) if (${walrusVar} := ${accessor}) is not None else None`;\n }\n switch (ref.kind) {\n case 'model': {\n if (isRequired) {\n return `${className(ref.name)}.from_dict(cast(Dict[str, Any], ${accessor}))`;\n }\n return `${className(ref.name)}.from_dict(cast(Dict[str, Any], ${walrusVar})) if (${walrusVar} := ${accessor}) is not None else None`;\n }\n case 'array': {\n if (ref.items.kind === 'model') {\n const listExpr = `[${className(ref.items.name)}.from_dict(cast(Dict[str, Any], item)) for item in cast(list[Any], ${isRequired ? accessor : walrusVar})]`;\n if (isRequired) {\n return listExpr;\n }\n // For optional arrays, preserve None instead of converting to []\n return `${listExpr} if (${walrusVar} := ${accessor}) is not None else None`;\n }\n if (ref.items.kind === 'enum') {\n const enumClass = className(ref.items.name);\n const listExpr = `[${enumClass}(item) for item in cast(list[Any], ${isRequired ? accessor : walrusVar})]`;\n if (isRequired) {\n return listExpr;\n }\n return `${listExpr} if (${walrusVar} := ${accessor}) is not None else None`;\n }\n return accessor;\n }\n case 'enum': {\n const enumClass = className(ref.name);\n if (isRequired) {\n return `${enumClass}(${accessor})`;\n }\n return `${enumClass}(${walrusVar}) if (${walrusVar} := ${accessor}) is not None else None`;\n }\n case 'nullable':\n return deserializeField(ref.inner, accessor, false, walrusVar);\n case 'union': {\n const modelVariants = (ref.variants ?? []).filter((v: any) => v.kind === 'model');\n const uniqueModels = [...new Set(modelVariants.map((v: any) => v.name))];\n if (uniqueModels.length === 1) {\n return deserializeField({ kind: 'model', name: uniqueModels[0] }, accessor, isRequired, walrusVar);\n }\n // Mixed unions — pass through (would need runtime discriminant logic)\n return accessor;\n }\n default:\n return accessor;\n }\n}\n\nfunction serializeField(ref: any, accessor: string): string {\n if (isDateTimeType(ref)) {\n return `_format_datetime(${accessor})`;\n }\n switch (ref.kind) {\n case 'model':\n return `${accessor}.to_dict()`;\n case 'enum':\n return `${accessor}.value if isinstance(${accessor}, Enum) else ${accessor}`;\n case 'array': {\n if (ref.items.kind === 'model') {\n return `[item.to_dict() for item in ${accessor}]`;\n }\n if (ref.items.kind === 'enum') {\n return `[item.value if isinstance(item, Enum) else item for item in ${accessor}]`;\n }\n return accessor;\n }\n case 'union': {\n const modelVariants = (ref.variants ?? []).filter((v: any) => v.kind === 'model');\n const uniqueModels = [...new Set(modelVariants.map((v: any) => v.name))];\n if (uniqueModels.length === 1) {\n return `${accessor}.to_dict()`;\n }\n return accessor;\n }\n default:\n return accessor;\n }\n}\n\n/**\n * Build recursive structural hashes for all models.\n *\n * Model references are resolved to their own structural hash (bottom-up) and\n * enum references are resolved to their value-set hash. This means\n * structurally-identical model *trees* — like the dozens of per-event Context /\n * ContextActor / ContextGoogleAnalyticsSession sub-models in the spec — get\n * the same hash even though their IR names differ.\n */\nfunction buildRecursiveHashMap(models: Model[], enums: Enum[]): Map<string, string> {\n const modelByName = new Map(models.map((m) => [m.name, m]));\n const hashCache = new Map<string, string>();\n const visiting = new Set<string>(); // cycle guard\n\n // Pre-compute enum value hashes so identically-valued enums hash the same.\n const enumVH = new Map<string, string>();\n for (const e of enums) {\n enumVH.set(\n e.name,\n [...e.values]\n .map((v) => String(v.value))\n .sort()\n .join('|'),\n );\n }\n\n function modelHash(name: string): string {\n const cached = hashCache.get(name);\n if (cached != null) return cached;\n if (visiting.has(name)) return `m:${name}`; // cycle — fall back to name\n visiting.add(name);\n\n const model = modelByName.get(name);\n if (!model) {\n visiting.delete(name);\n return `m:${name}`; // unknown model\n }\n\n const hash = [...model.fields]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((f) => `${f.name}:${deepTypeHash(f.type)}:${f.required}`)\n .join('|');\n\n visiting.delete(name);\n hashCache.set(name, hash);\n return hash;\n }\n\n function deepTypeHash(ref: any): string {\n switch (ref.kind) {\n case 'primitive':\n return `p:${ref.type}${ref.format ? `:${ref.format}` : ''}`;\n case 'model':\n return `m:{${modelHash(ref.name)}}`;\n case 'enum': {\n const vh = enumVH.get(ref.name);\n return vh != null ? `e:{${vh}}` : `e:${ref.name}`;\n }\n case 'array':\n return `a:${deepTypeHash(ref.items)}`;\n case 'nullable':\n return `n:${deepTypeHash(ref.inner)}`;\n case 'union':\n return `u:${(ref.variants ?? [])\n .map((v: any) => deepTypeHash(v))\n .sort()\n .join(',')}`;\n case 'map':\n return `d:${deepTypeHash(ref.valueType)}`;\n case 'literal':\n return `l:${String(ref.value)}`;\n default:\n return 'unknown';\n }\n }\n\n for (const model of models) {\n modelHash(model.name);\n }\n\n return hashCache;\n}\n\n// Import and re-export shared model detection utilities\nimport { isListMetadataModel, isListWrapperModel } from '../shared/model-utils.js';\nexport { isListMetadataModel, isListWrapperModel };\n","import type { EmitterContext, ResolvedOperation, ResolvedWrapper } from '@workos/oagen';\nimport { toSnakeCase } from '@workos/oagen';\nimport { className, fieldName } from './naming.js';\nimport { resolveWrapperParams, formatWrapperDescription } from '../shared/wrapper-utils.js';\n\n/**\n * Generate Python wrapper method lines for split operations.\n *\n * Each wrapper is a typed convenience method that:\n * - Accepts only the exposed params (not the full union body)\n * - Injects constant defaults (e.g., grant_type)\n * - Reads inferred fields from client config (e.g., client_id)\n * - Delegates to the HTTP client with the constructed body\n *\n * Generates both sync and async versions.\n */\nexport function generateSyncWrapperMethods(resolvedOp: ResolvedOperation, ctx: EmitterContext): string[] {\n return generateWrapperMethodsInner(resolvedOp, ctx, false);\n}\n\nexport function generateAsyncWrapperMethods(resolvedOp: ResolvedOperation, ctx: EmitterContext): string[] {\n return generateWrapperMethodsInner(resolvedOp, ctx, true);\n}\n\nfunction generateWrapperMethodsInner(resolvedOp: ResolvedOperation, ctx: EmitterContext, isAsync: boolean): string[] {\n if (!resolvedOp.wrappers || resolvedOp.wrappers.length === 0) return [];\n\n const lines: string[] = [];\n\n for (const wrapper of resolvedOp.wrappers) {\n lines.push('');\n emitWrapperMethod(lines, resolvedOp, wrapper, ctx, isAsync);\n }\n\n return lines;\n}\n\nfunction emitWrapperMethod(\n lines: string[],\n resolvedOp: ResolvedOperation,\n wrapper: ResolvedWrapper,\n ctx: EmitterContext,\n isAsync: boolean,\n): void {\n const op = resolvedOp.operation;\n const method = wrapper.name; // already snake_case\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n\n // Build signature\n const defKeyword = isAsync ? 'async def' : 'def';\n lines.push(` ${defKeyword} ${method}(`);\n lines.push(' self,');\n\n // Path params as positional args\n for (const param of op.pathParams) {\n const paramName = fieldName(param.name);\n const paramType = resolveSimpleType(param.type);\n lines.push(` ${paramName}: ${paramType},`);\n }\n\n lines.push(' *,');\n\n // Exposed params as keyword args\n for (const { paramName, field, isOptional } of wrapperParams) {\n const pyName = fieldName(paramName);\n const pyType = field ? resolveSimpleType(field.type) : 'str';\n\n if (isOptional) {\n lines.push(` ${pyName}: Optional[${pyType}] = None,`);\n } else {\n lines.push(` ${pyName}: ${pyType},`);\n }\n }\n\n lines.push(' request_options: Optional[RequestOptions] = None,');\n\n // Return type\n const responseType = wrapper.responseModelName ? className(wrapper.responseModelName) : 'None';\n\n lines.push(` ) -> ${responseType}:`);\n\n // Docstring\n lines.push(` \"\"\"${formatWrapperDescription(wrapper.name)}.\"\"\"`);\n\n // Build body dict\n lines.push(' body: Dict[str, Any] = {');\n\n // Constant defaults\n for (const [key, value] of Object.entries(wrapper.defaults)) {\n lines.push(` \"${key}\": ${pythonLiteral(value)},`);\n }\n\n // Exposed params (required ones go directly)\n for (const { paramName, isOptional } of wrapperParams) {\n if (isOptional) continue;\n const pyName = fieldName(paramName);\n lines.push(` \"${paramName}\": ${pyName},`);\n }\n\n lines.push(' }');\n\n // Inferred fields from client config\n for (const field of wrapper.inferFromClient) {\n const expr = clientFieldExpression(field);\n lines.push(` if ${expr} is not None:`);\n lines.push(` body[\"${field}\"] = ${expr}`);\n }\n\n // Optional exposed params\n for (const { paramName, isOptional } of wrapperParams) {\n if (!isOptional) continue;\n const pyName = fieldName(paramName);\n lines.push(` if ${pyName} is not None:`);\n lines.push(` body[\"${paramName}\"] = ${pyName}`);\n }\n\n // Build path expression\n let pathExpr: string;\n if (op.pathParams.length > 0) {\n let path = op.path.replace(/^\\//, '');\n for (const p of op.pathParams) {\n path = path.replace(`{${p.name}}`, `{${fieldName(p.name)}}`);\n }\n pathExpr = `f\"${path}\"`;\n } else {\n pathExpr = `\"${op.path.replace(/^\\//, '')}\"`;\n }\n\n // Make the request\n const awaitPrefix = isAsync ? 'await ' : '';\n lines.push('');\n\n if (wrapper.responseModelName) {\n lines.push(` return ${awaitPrefix}self._client.request(`);\n lines.push(` method=\"${op.httpMethod.toUpperCase()}\",`);\n lines.push(` path=${pathExpr},`);\n lines.push(' body=body,');\n lines.push(` model=${className(wrapper.responseModelName)},`);\n lines.push(' request_options=request_options,');\n lines.push(' )');\n } else {\n lines.push(` ${awaitPrefix}self._client.request(`);\n lines.push(` method=\"${op.httpMethod.toUpperCase()}\",`);\n lines.push(` path=${pathExpr},`);\n lines.push(' body=body,');\n lines.push(' request_options=request_options,');\n lines.push(' )');\n }\n}\n\n/** Convert a value to a Python literal. */\nexport function pythonLiteral(value: string | number | boolean): string {\n if (typeof value === 'string') return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n if (typeof value === 'boolean') return value ? 'True' : 'False';\n return String(value);\n}\n\n/** Get the Python expression for reading a client config field. */\nexport function clientFieldExpression(field: string): string {\n switch (field) {\n case 'client_id':\n return 'self._client.client_id';\n case 'client_secret':\n return 'self._client._api_key';\n default:\n return `self._client.${toSnakeCase(field)}`;\n }\n}\n\n/** Resolve a TypeRef to a simple Python type string. */\nfunction resolveSimpleType(ref: any): string {\n if (ref.kind === 'primitive') {\n switch (ref.type) {\n case 'string':\n return 'str';\n case 'integer':\n return 'int';\n case 'number':\n return 'float';\n case 'boolean':\n return 'bool';\n default:\n return 'Any';\n }\n }\n if (ref.kind === 'nullable') return resolveSimpleType(ref.inner);\n if (ref.kind === 'array') return `List[${resolveSimpleType(ref.items)}]`;\n if (ref.kind === 'model') return className(ref.name);\n if (ref.kind === 'enum') return className(ref.name);\n return 'Any';\n}\n","import type {\n Service,\n Operation,\n OperationPlan,\n EmitterContext,\n GeneratedFile,\n TypeRef,\n ResolvedOperation,\n Parameter,\n} from '@workos/oagen';\n\n/** Extend Parameter with `explode` until @workos/oagen publishes the field. */\ntype ParameterExt = Parameter & { explode?: boolean };\nimport {\n planOperation,\n toPascalCase,\n toSnakeCase,\n collectModelRefs,\n collectEnumRefs,\n assignModelsToServices,\n} from '@workos/oagen';\nimport { mapTypeRefUnquoted } from './type-map.js';\nimport {\n className,\n fieldName,\n fileName,\n moduleName,\n resolveClassName,\n buildMountDirMap,\n dirToModule,\n relativeImportPrefix,\n} from './naming.js';\nimport {\n buildResolvedLookup,\n lookupMethodName,\n lookupResolved,\n groupByMount,\n getOpDefaults,\n getOpInferFromClient,\n buildHiddenParams as buildHiddenParamsShared,\n} from '../shared/resolved-ops.js';\nimport {\n generateSyncWrapperMethods,\n generateAsyncWrapperMethods,\n pythonLiteral,\n clientFieldExpression,\n} from './wrappers.js';\n\n/**\n * Compute the Python parameter name for a body field, prefixing with `body_` if it\n * collides with a path parameter name.\n */\nexport function bodyParamName(field: { name: string }, pathParamNames: Set<string>): string {\n const name = fieldName(field.name);\n return pathParamNames.has(name) ? `body_${name}` : name;\n}\n\n/**\n * Resolve the resource class name for a service.\n */\nexport function resolveResourceClassName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n// buildHiddenParams is imported from ../shared/resolved-ops.js as buildHiddenParamsShared\nconst buildHiddenParams = buildHiddenParamsShared;\n\n// ─── Shared method-emission helpers ──────────────────────────────────\n\n/** Metadata returned by emitMethodSignature, consumed by docstring & body emitters. */\ninterface SignatureMetadata {\n returnType: string;\n pathParamNames: Set<string>;\n isArrayResponse: boolean;\n isRedirect: boolean;\n hasBearerOverride: boolean;\n}\n\nfunction emitDocArg(lines: string[], name: string, desc?: string): void {\n const fallback = `The ${name.replace(/_/g, ' ')}.`;\n const description = desc ?? fallback;\n const descLines = description\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n if (descLines.length === 0) {\n lines.push(` ${name}: ${fallback}`);\n return;\n }\n\n lines.push(` ${name}: ${descLines[0]}`);\n for (const line of descLines.slice(1)) {\n lines.push(` ${line}`);\n }\n}\n\n/**\n * Emit a Python method signature (def / async def, parameters, return type).\n */\nfunction emitMethodSignature(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n method: string,\n isAsync: boolean,\n specEnumNames: Set<string>,\n modelImports: Set<string>,\n listWrapperNames: Set<string>,\n ctx: EmitterContext,\n resolvedOp?: ResolvedOperation,\n): SignatureMetadata {\n const hiddenParams = buildHiddenParams(resolvedOp);\n const isPaginated = plan.isPaginated;\n const isDelete = plan.isDelete;\n // Redirect endpoints never await, so emit as plain def even in async class\n const isRedirectOp = isRedirectEndpoint(op);\n const defKeyword = isAsync && !isRedirectOp ? 'async def' : 'def';\n const usesClientCredentialDefaults = false;\n\n lines.push(` ${defKeyword} ${method}(`);\n lines.push(' self,');\n\n // Path params as positional args\n for (const param of op.pathParams) {\n const paramName = fieldName(param.name);\n const paramType = mapTypeRefUnquoted(param.type, specEnumNames, true);\n lines.push(` ${paramName}: ${paramType},`);\n }\n\n lines.push(' *,');\n\n const pathParamNames = new Set(op.pathParams.map((p) => fieldName(p.name)));\n\n // Request body fields as keyword args (rename fields that clash with path params)\n if (plan.hasBody && op.requestBody) {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n const reqFields = bodyModel.fields.filter((f) => f.required && !hiddenParams.has(f.name));\n const optFields = bodyModel.fields.filter((f) => !f.required && !hiddenParams.has(f.name));\n for (const f of reqFields) {\n const fieldType = mapTypeRefUnquoted(f.type, specEnumNames, true);\n if (usesClientCredentialDefaults && (f.name === 'client_id' || f.name === 'client_secret')) {\n lines.push(` ${bodyParamName(f, pathParamNames)}: Optional[${fieldType}] = None,`);\n } else {\n lines.push(` ${bodyParamName(f, pathParamNames)}: ${fieldType},`);\n }\n }\n for (const f of optFields) {\n const innerType =\n f.type.kind === 'nullable'\n ? mapTypeRefUnquoted(f.type.inner, specEnumNames, true)\n : mapTypeRefUnquoted(f.type, specEnumNames, true);\n lines.push(` ${bodyParamName(f, pathParamNames)}: Optional[${innerType}] = None,`);\n }\n } else if (op.requestBody.kind === 'union') {\n // Union body — accept any of the variant models or a plain dict\n const variantModels = (op.requestBody.variants ?? [])\n .filter((v: any) => v.kind === 'model')\n .map((v: any) => className(v.name));\n // Add variant models to imports\n for (const vm of variantModels) {\n modelImports.add(vm);\n }\n if (variantModels.length > 0) {\n const unionType = `Union[${[...variantModels, 'Dict[str, Any]'].join(', ')}]`;\n lines.push(` body: ${unionType},`);\n } else {\n lines.push(' body: Dict[str, Any],');\n }\n } else {\n // Non-model body — use generic dict\n lines.push(' body: Optional[Dict[str, Any]] = None,');\n }\n }\n\n // Query params for non-paginated methods\n if (plan.hasQueryParams && !isPaginated) {\n for (const param of op.queryParams) {\n if (hiddenParams.has(param.name)) continue;\n const paramName = fieldName(param.name);\n if (pathParamNames.has(paramName)) continue;\n // Skip query params that collide with body field names (using possibly-renamed names)\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find(\n (m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name,\n );\n if (bodyModel?.fields.some((f) => bodyParamName(f, pathParamNames) === paramName)) continue;\n }\n const paramType = mapTypeRefUnquoted(param.type, specEnumNames, true);\n if (usesClientCredentialDefaults && (param.name === 'client_id' || param.name === 'client_secret')) {\n lines.push(` ${paramName}: Optional[${paramType}] = None,`);\n } else if (param.required) {\n lines.push(` ${paramName}: ${paramType},`);\n } else {\n lines.push(` ${paramName}: Optional[${paramType}] = None,`);\n }\n }\n }\n\n // Pagination params\n if (isPaginated) {\n lines.push(' limit: Optional[int] = None,');\n lines.push(' before: Optional[str] = None,');\n lines.push(' after: Optional[str] = None,');\n // Use typed enum for order param if the spec provides one, otherwise fall back to str\n const orderParam = op.queryParams.find((p) => p.name === 'order');\n const orderType =\n orderParam && orderParam.type.kind === 'enum' ? mapTypeRefUnquoted(orderParam.type, specEnumNames, true) : 'str';\n lines.push(` order: Optional[${orderType}] = None,`);\n // Additional non-pagination query params\n for (const param of op.queryParams) {\n if (['limit', 'before', 'after', 'order'].includes(param.name)) continue;\n if (hiddenParams.has(param.name)) continue;\n const paramName = fieldName(param.name);\n const paramType = mapTypeRefUnquoted(param.type, specEnumNames, true);\n if (param.required) {\n lines.push(` ${paramName}: ${paramType},`);\n } else {\n lines.push(` ${paramName}: Optional[${paramType}] = None,`);\n }\n }\n }\n\n // Idempotency key for idempotent POSTs\n if (plan.isIdempotentPost) {\n lines.push(' idempotency_key: Optional[str] = None,');\n }\n\n // Per-operation Bearer token auth (e.g., SSO.get_profile uses access_token instead of API key)\n const hasBearerOverride = op.security?.some((s) => s.schemeName !== 'bearerAuth') ?? false;\n if (hasBearerOverride) {\n const tokenParamName = op.security!.find((s) => s.schemeName !== 'bearerAuth')!.schemeName;\n lines.push(` ${fieldName(tokenParamName)}: str,`);\n }\n\n lines.push(' request_options: Optional[RequestOptions] = None,');\n\n // Detect array response type\n const isArrayResponse = op.response.kind === 'array' && op.response.items.kind === 'model';\n const isRedirect = isRedirectEndpoint(op);\n\n // Return type\n const pageType = isAsync ? 'AsyncPage' : 'SyncPage';\n let returnType: string;\n if (isDelete) {\n returnType = 'None';\n } else if (isRedirect) {\n returnType = 'str';\n } else if (isPaginated) {\n const resolvedItem = resolvePageItemName(op.pagination!.itemType, listWrapperNames, ctx);\n returnType = `${pageType}[${className(resolvedItem)}]`;\n } else if (isArrayResponse) {\n returnType = `List[${className(plan.responseModelName!)}]`;\n } else if (plan.responseModelName) {\n returnType = className(plan.responseModelName);\n } else {\n returnType = 'None';\n }\n\n lines.push(` ) -> ${returnType}:`);\n\n return { returnType, pathParamNames, isArrayResponse, isRedirect, hasBearerOverride };\n}\n\n/**\n * Emit a Python method docstring (description, Args, Returns, Raises).\n * Identical for sync and async — no isAsync parameter needed.\n */\nfunction emitMethodDocstring(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n method: string,\n meta: SignatureMetadata,\n specEnumNames: Set<string>,\n ctx: EmitterContext,\n resolvedOp?: ResolvedOperation,\n): void {\n const { returnType, pathParamNames, hasBearerOverride } = meta;\n const isPaginated = plan.isPaginated;\n const hiddenParams = buildHiddenParams(resolvedOp);\n\n // Description — indent continuation lines to align with the opening `\"\"\"`\n if (op.description) {\n const descLines = op.description.split('\\n');\n const indentedDesc = descLines\n .map((line, i) => (i === 0 ? line : line.trim() === '' ? '' : ` ${line}`))\n .join('\\n');\n lines.push(` \"\"\"${indentedDesc}`);\n } else {\n lines.push(` \"\"\"${toPascalCase(method.replace(/_/g, ' '))} operation.`);\n }\n\n // Args section\n const allParams: { name: string; desc?: string }[] = op.pathParams.map((p) => ({\n name: fieldName(p.name),\n desc: p.deprecated ? (p.description ? `(deprecated) ${p.description}` : '(deprecated)') : p.description,\n }));\n\n // Add body model fields to docs\n if (plan.hasBody && op.requestBody) {\n if (op.requestBody.kind === 'model') {\n const requestBodyName = op.requestBody.name;\n const bodyModel = ctx.spec.models.find((m) => m.name === requestBodyName);\n if (bodyModel) {\n for (const f of bodyModel.fields) {\n if (hiddenParams.has(f.name)) continue;\n allParams.push({\n name: bodyParamName(f, pathParamNames),\n desc: f.deprecated ? (f.description ? `(deprecated) ${f.description}` : '(deprecated)') : f.description,\n });\n }\n }\n } else if (op.requestBody.kind === 'union') {\n // Union body — document the body parameter with the accepted variant types\n const variantModels = (op.requestBody.variants ?? [])\n .filter((v: any) => v.kind === 'model')\n .map((v: any) => className(v.name));\n const desc =\n variantModels.length > 0\n ? `The request body. Accepts: ${variantModels.join(', ')}, or a plain dict.`\n : 'The request body.';\n allParams.push({ name: 'body', desc });\n }\n }\n\n // Add query params for non-paginated methods\n if (plan.hasQueryParams && !isPaginated) {\n for (const param of op.queryParams) {\n if (hiddenParams.has(param.name)) continue;\n const pn = fieldName(param.name);\n if (pathParamNames.has(pn)) continue;\n // Skip params already documented from body fields\n if (allParams.some((p) => p.name === pn)) continue;\n let desc = param.deprecated\n ? param.description\n ? `(deprecated) ${param.description}`\n : '(deprecated)'\n : param.description;\n if (param.default != null) {\n const defaultStr = `Defaults to \\`${param.default}\\`.`;\n desc = desc ? `${desc} ${defaultStr}` : defaultStr;\n }\n allParams.push({ name: pn, desc });\n }\n }\n\n // Add extra non-standard pagination query params\n if (isPaginated) {\n for (const paramName of ['limit', 'before', 'after', 'order']) {\n const param = op.queryParams.find((p) => p.name === paramName);\n let desc = param?.description;\n if (param?.default != null) {\n const defaultStr = `Defaults to \\`${param.default}\\`.`;\n desc = desc ? `${desc} ${defaultStr}` : defaultStr;\n }\n allParams.push({\n name: fieldName(paramName),\n desc,\n });\n }\n for (const param of op.queryParams) {\n if (['limit', 'before', 'after', 'order'].includes(param.name)) continue;\n let desc = param.deprecated\n ? param.description\n ? `(deprecated) ${param.description}`\n : '(deprecated)'\n : param.description;\n if (param.default != null) {\n const defaultStr = `Defaults to \\`${param.default}\\`.`;\n desc = desc ? `${desc} ${defaultStr}` : defaultStr;\n }\n allParams.push({ name: fieldName(param.name), desc });\n }\n }\n\n // Add idempotency key parameter to docs\n if (plan.isIdempotentPost) {\n allParams.push({ name: 'idempotency_key', desc: 'Optional idempotency key for safe retries.' });\n }\n\n // Add bearer override parameter to docs (e.g., access_token for SSO)\n if (hasBearerOverride) {\n const tokenParamName = fieldName(op.security!.find((s) => s.schemeName !== 'bearerAuth')!.schemeName);\n allParams.push({ name: tokenParamName, desc: 'The bearer token for authentication.' });\n }\n\n if (allParams.length > 0 || isPaginated) {\n lines.push('');\n lines.push(' Args:');\n for (const p of allParams) {\n emitDocArg(lines, p.name, p.desc);\n }\n lines.push(\n ' request_options: Per-request options. Supports extra_headers, timeout, max_retries, and base_url override.',\n );\n }\n\n if (returnType !== 'None') {\n lines.push('');\n lines.push(' Returns:');\n lines.push(` ${returnType}`);\n }\n\n // Per-operation error documentation from spec error responses\n const errorRaises = buildErrorRaisesBlock(op);\n lines.push('');\n lines.push(' Raises:');\n for (const line of errorRaises) {\n lines.push(` ${line}`);\n }\n if (op.deprecated) {\n lines.push('');\n lines.push(' .. deprecated::');\n lines.push(' This operation is deprecated. See the migration guide for alternatives.');\n }\n lines.push(' \"\"\"');\n}\n\n/**\n * Emit the Python method body (auth override, path building, request call).\n */\nfunction emitMethodBody(\n lines: string[],\n op: Operation,\n plan: OperationPlan,\n meta: SignatureMetadata,\n isAsync: boolean,\n modelImports: Set<string>,\n listWrapperNames: Set<string>,\n ctx: EmitterContext,\n resolvedOp?: ResolvedOperation,\n): void {\n const { pathParamNames, isArrayResponse, isRedirect, hasBearerOverride } = meta;\n const isPaginated = plan.isPaginated;\n const awaitPrefix = isAsync ? 'await ' : '';\n const usesClientCredentialDefaults = false;\n const hiddenParams = buildHiddenParams(resolvedOp);\n const opDefaults = getOpDefaults(resolvedOp);\n const opInferFromClient = getOpInferFromClient(resolvedOp);\n\n if (op.deprecated) {\n const method = toSnakeCase(op.name);\n lines.push(` warnings.warn(\"${method} is deprecated\", DeprecationWarning, stacklevel=2)`);\n }\n\n // Method body — build path\n const pathStr = buildPathString(op);\n const httpMethod = op.httpMethod;\n\n // Emit auth override for per-operation Bearer token security\n if (hasBearerOverride) {\n const tokenParamName = fieldName(op.security!.find((s) => s.schemeName !== 'bearerAuth')!.schemeName);\n lines.push(` request_options = request_options or {}`);\n lines.push(\n ` request_options = {**request_options, \"extra_headers\": {**(request_options.get(\"extra_headers\") or {}), \"Authorization\": f\"Bearer {${tokenParamName}}\"}}`,\n );\n }\n\n if (isRedirect) {\n // Redirect endpoint: construct URL client-side instead of making HTTP request\n const bodyModel =\n plan.hasBody && op.requestBody?.kind === 'model'\n ? ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name)\n : undefined;\n const redirectParamEntries: { key: string; varName: string }[] = [];\n if (bodyModel) {\n for (const f of bodyModel.fields) {\n if (hiddenParams.has(f.name)) continue;\n redirectParamEntries.push({ key: f.name, varName: bodyParamName(f, pathParamNames) });\n }\n }\n for (const param of op.queryParams) {\n if (hiddenParams.has(param.name)) continue;\n const pn = fieldName(param.name);\n if (!redirectParamEntries.some((e) => e.varName === pn)) {\n redirectParamEntries.push({ key: param.name, varName: pn });\n }\n }\n const hasHiddenInjections =\n (opDefaults && Object.keys(opDefaults).length > 0) || (opInferFromClient && opInferFromClient.length > 0);\n if (redirectParamEntries.length > 0 || hasHiddenInjections) {\n lines.push(' params = {k: v for k, v in {');\n for (const entry of redirectParamEntries) {\n const param = op.queryParams.find((p) => p.name === entry.key);\n const value = param\n ? serializeParameterValue(param.type, entry.varName, false, (param as ParameterExt).explode)\n : entry.varName;\n lines.push(` \"${entry.key}\": ${value},`);\n }\n lines.push(' }.items() if v is not None}');\n // Inject constant defaults\n if (Object.keys(opDefaults).length > 0) {\n for (const [key, value] of Object.entries(opDefaults)) {\n lines.push(` params[\"${key}\"] = ${pythonLiteral(value)}`);\n }\n }\n // Inject fields from client config\n if (opInferFromClient.length > 0) {\n for (const field of opInferFromClient) {\n const expr = clientFieldExpression(field);\n lines.push(` if ${expr} is not None:`);\n lines.push(` params[\"${field}\"] = ${expr}`);\n }\n }\n if (usesClientCredentialDefaults) {\n if (op.queryParams.some((param) => param.name === 'client_id')) {\n lines.push(' params[\"client_id\"] = params.get(\"client_id\") or self._client._require_client_id()');\n }\n if (op.queryParams.some((param) => param.name === 'client_secret')) {\n lines.push(\n ' params[\"client_secret\"] = params.get(\"client_secret\") or self._client._require_api_key()',\n );\n }\n }\n lines.push(` return self._client.build_url(${pathStr}, params)`);\n } else {\n lines.push(` return self._client.build_url(${pathStr})`);\n }\n } else if (isPaginated) {\n const resolvedItemName = resolvePageItemName(op.pagination!.itemType, listWrapperNames, ctx);\n const itemTypeClass = className(resolvedItemName);\n const orderParam = op.queryParams.find((p) => p.name === 'order');\n // Build query params dict\n lines.push(' params = {k: v for k, v in {');\n lines.push(' \"limit\": limit,');\n lines.push(' \"before\": before,');\n lines.push(' \"after\": after,');\n lines.push(\n ` \"order\": ${serializeParameterValue(orderParam?.type, 'order', false, (orderParam as ParameterExt | undefined)?.explode)},`,\n );\n for (const param of op.queryParams) {\n if (['limit', 'before', 'after', 'order'].includes(param.name)) continue;\n if (hiddenParams.has(param.name)) continue;\n const pn = fieldName(param.name);\n const value = serializeParameterValue(param.type, pn, param.required, (param as ParameterExt).explode);\n lines.push(` \"${param.name}\": ${value},`);\n }\n lines.push(' }.items() if v is not None}');\n // Inject constant defaults\n if (Object.keys(opDefaults).length > 0) {\n for (const [key, value] of Object.entries(opDefaults)) {\n lines.push(` params[\"${key}\"] = ${pythonLiteral(value)}`);\n }\n }\n // Inject fields from client config\n if (opInferFromClient.length > 0) {\n for (const field of opInferFromClient) {\n const expr = clientFieldExpression(field);\n lines.push(` if ${expr} is not None:`);\n lines.push(` params[\"${field}\"] = ${expr}`);\n }\n }\n lines.push(` return ${awaitPrefix}self._client.request_page(`);\n lines.push(` method=\"${httpMethod}\",`);\n lines.push(` path=${pathStr},`);\n lines.push(` model=${itemTypeClass},`);\n lines.push(' params=params,');\n lines.push(' request_options=request_options,');\n lines.push(' )');\n } else if (plan.isDelete) {\n // Build body dict if the DELETE has a request body\n const deleteBodyFieldNames = new Set<string>();\n if (plan.hasBody && op.requestBody) {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n const bodyFields = bodyModel.fields.filter((f) => !hiddenParams.has(f.name));\n for (const f of bodyFields) deleteBodyFieldNames.add(bodyParamName(f, pathParamNames));\n const hasOptionalBodyFields = bodyFields.some((f) => !f.required);\n if (bodyFields.length > 0 && hasOptionalBodyFields) {\n lines.push(' body: Dict[str, Any] = {k: v for k, v in {');\n for (const f of bodyFields) {\n lines.push(\n ` \"${f.name}\": ${serializeBodyFieldValue(f.type, bodyParamName(f, pathParamNames), f.required)},`,\n );\n }\n lines.push(' }.items() if v is not None}');\n } else if (bodyFields.length > 0) {\n lines.push(' body: Dict[str, Any] = {');\n for (const f of bodyFields) {\n lines.push(\n ` \"${f.name}\": ${serializeBodyFieldValue(f.type, bodyParamName(f, pathParamNames), f.required)},`,\n );\n }\n lines.push(' }');\n }\n // Inject constant defaults into body\n if (Object.keys(opDefaults).length > 0) {\n for (const [key, value] of Object.entries(opDefaults)) {\n lines.push(` body[\"${key}\"] = ${pythonLiteral(value)}`);\n }\n }\n // Inject fields from client config into body\n if (opInferFromClient.length > 0) {\n for (const field of opInferFromClient) {\n const expr = clientFieldExpression(field);\n lines.push(` if ${expr} is not None:`);\n lines.push(` body[\"${field}\"] = ${expr}`);\n }\n }\n }\n }\n // Build query params dict if any exist alongside the body/path\n const deleteHasParams =\n plan.hasQueryParams && emitQueryParamsDict(lines, op, pathParamNames, deleteBodyFieldNames, hiddenParams);\n lines.push(` ${awaitPrefix}self._client.request(`);\n lines.push(` method=\"${httpMethod}\",`);\n lines.push(` path=${pathStr},`);\n if (plan.hasBody && op.requestBody) {\n lines.push(' body=body,');\n }\n if (deleteHasParams) {\n lines.push(' params=params,');\n }\n lines.push(' request_options=request_options,');\n lines.push(' )');\n } else if (plan.hasBody && op.requestBody) {\n const responseModel = plan.responseModelName ? className(plan.responseModelName) : 'None';\n // Build body dict\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n const bodyFieldNamesSet = new Set<string>();\n if (bodyModel) {\n const bodyFields = bodyModel.fields.filter((f) => !hiddenParams.has(f.name));\n for (const f of bodyFields) bodyFieldNamesSet.add(bodyParamName(f, pathParamNames));\n const hasOptionalBodyFields = bodyFields.some((f) => !f.required);\n if (bodyFields.length > 0 && hasOptionalBodyFields) {\n lines.push(' body: Dict[str, Any] = {k: v for k, v in {');\n for (const f of bodyFields) {\n lines.push(\n ` \"${f.name}\": ${serializeBodyFieldValue(f.type, bodyParamName(f, pathParamNames), f.required)},`,\n );\n }\n lines.push(' }.items() if v is not None}');\n } else if (bodyFields.length > 0) {\n lines.push(' body: Dict[str, Any] = {');\n for (const f of bodyFields) {\n lines.push(\n ` \"${f.name}\": ${serializeBodyFieldValue(f.type, bodyParamName(f, pathParamNames), f.required)},`,\n );\n }\n lines.push(' }');\n } else {\n lines.push(' body: Dict[str, Any] = {}');\n }\n // Inject constant defaults into body\n if (Object.keys(opDefaults).length > 0) {\n for (const [key, value] of Object.entries(opDefaults)) {\n lines.push(` body[\"${key}\"] = ${pythonLiteral(value)}`);\n }\n }\n // Inject fields from client config into body\n if (opInferFromClient.length > 0) {\n for (const field of opInferFromClient) {\n const expr = clientFieldExpression(field);\n lines.push(` if ${expr} is not None:`);\n lines.push(` body[\"${field}\"] = ${expr}`);\n }\n }\n } else {\n // Union or non-model body — convert model instances to dicts\n lines.push(' _body: Dict[str, Any] = body if isinstance(body, dict) else body.to_dict()');\n }\n // Build query params dict if any exist alongside the body\n const bodyHasParams =\n plan.hasQueryParams && emitQueryParamsDict(lines, op, pathParamNames, bodyFieldNamesSet, hiddenParams);\n const bodyVarName = bodyModel ? 'body' : '_body';\n if (bodyModel && usesClientCredentialDefaults) {\n if (bodyModel.fields.some((f) => f.name === 'client_id')) {\n lines.push(' body[\"client_id\"] = body.get(\"client_id\") or self._client._require_client_id()');\n }\n if (bodyModel.fields.some((f) => f.name === 'client_secret')) {\n lines.push(' body[\"client_secret\"] = body.get(\"client_secret\") or self._client._require_api_key()');\n }\n }\n if (isArrayResponse) {\n // Array response with body: request_list returns List[Dict], then deserialize each item\n const itemModel = className(plan.responseModelName!);\n lines.push(` raw = ${awaitPrefix}self._client.request_list(`);\n lines.push(` method=\"${httpMethod}\",`);\n lines.push(` path=${pathStr},`);\n lines.push(` body=${bodyVarName},`);\n if (bodyHasParams) {\n lines.push(' params=params,');\n }\n if (plan.isIdempotentPost) {\n lines.push(' idempotency_key=idempotency_key,');\n }\n lines.push(' request_options=request_options,');\n lines.push(' )');\n lines.push(` return [${itemModel}.from_dict(cast(Dict[str, Any], item)) for item in raw]`);\n } else {\n const bodyReturnPrefix = responseModel !== 'None' ? 'return ' : '';\n lines.push(` ${bodyReturnPrefix}${awaitPrefix}self._client.request(`);\n lines.push(` method=\"${httpMethod}\",`);\n lines.push(` path=${pathStr},`);\n lines.push(` body=${bodyVarName},`);\n if (bodyHasParams) {\n lines.push(' params=params,');\n }\n if (responseModel !== 'None') {\n lines.push(` model=${responseModel},`);\n }\n if (plan.isIdempotentPost) {\n lines.push(' idempotency_key=idempotency_key,');\n }\n lines.push(' request_options=request_options,');\n lines.push(' )');\n }\n } else {\n // GET or similar with query params\n const responseModel = plan.responseModelName ? className(plan.responseModelName) : 'None';\n const visibleQueryParams = op.queryParams.filter((p) => !hiddenParams.has(p.name));\n const hasVisibleQueryParams = plan.hasQueryParams && visibleQueryParams.length > 0;\n const hasInjections =\n (opDefaults && Object.keys(opDefaults).length > 0) || (opInferFromClient && opInferFromClient.length > 0);\n if (hasVisibleQueryParams || hasInjections) {\n const hasOptionalQueryParams = visibleQueryParams.some((p) => !p.required);\n if (hasOptionalQueryParams) {\n lines.push(' params: Dict[str, Any] = {k: v for k, v in {');\n for (const param of visibleQueryParams) {\n const pn = fieldName(param.name);\n const value = serializeParameterValue(param.type, pn, param.required, (param as ParameterExt).explode);\n lines.push(` \"${param.name}\": ${value},`);\n }\n lines.push(' }.items() if v is not None}');\n } else if (visibleQueryParams.length > 0) {\n lines.push(' params: Dict[str, Any] = {');\n for (const param of visibleQueryParams) {\n const pn = fieldName(param.name);\n const value = serializeParameterValue(param.type, pn, param.required, (param as ParameterExt).explode);\n lines.push(` \"${param.name}\": ${value},`);\n }\n lines.push(' }');\n } else {\n // No visible query params but we have injections — start with empty dict\n lines.push(' params: Dict[str, Any] = {}');\n }\n // Inject constant defaults\n if (Object.keys(opDefaults).length > 0) {\n for (const [key, value] of Object.entries(opDefaults)) {\n lines.push(` params[\"${key}\"] = ${pythonLiteral(value)}`);\n }\n }\n // Inject fields from client config\n if (opInferFromClient.length > 0) {\n for (const field of opInferFromClient) {\n const expr = clientFieldExpression(field);\n lines.push(` if ${expr} is not None:`);\n lines.push(` params[\"${field}\"] = ${expr}`);\n }\n }\n if (usesClientCredentialDefaults) {\n if (op.queryParams.some((param) => param.name === 'client_id')) {\n lines.push(' params[\"client_id\"] = params.get(\"client_id\") or self._client._require_client_id()');\n }\n if (op.queryParams.some((param) => param.name === 'client_secret')) {\n lines.push(\n ' params[\"client_secret\"] = params.get(\"client_secret\") or self._client._require_api_key()',\n );\n }\n }\n }\n const emittedParams = hasVisibleQueryParams || hasInjections;\n if (isArrayResponse) {\n // Array response: request_list returns List[Dict], then deserialize each item\n const itemModel = className(plan.responseModelName!);\n lines.push(` raw = ${awaitPrefix}self._client.request_list(`);\n lines.push(` method=\"${httpMethod}\",`);\n lines.push(` path=${pathStr},`);\n if (emittedParams) {\n lines.push(' params=params,');\n }\n lines.push(' request_options=request_options,');\n lines.push(' )');\n lines.push(` return [${itemModel}.from_dict(cast(Dict[str, Any], item)) for item in raw]`);\n } else {\n const returnPrefix = responseModel !== 'None' ? 'return ' : '';\n lines.push(` ${returnPrefix}${awaitPrefix}self._client.request(`);\n lines.push(` method=\"${httpMethod}\",`);\n lines.push(` path=${pathStr},`);\n if (emittedParams) {\n lines.push(' params=params,');\n }\n if (responseModel !== 'None') {\n lines.push(` model=${responseModel},`);\n }\n lines.push(' request_options=request_options,');\n lines.push(' )');\n }\n }\n}\n\n// ─── Main generator ──────────────────────────────────────────────────\n\n/**\n * Generate Python resource class files from IR Service definitions.\n * Uses mount-based grouping: one resource file per mount target with all\n * co-mounted operations merged (flat pattern matching PHP).\n */\nexport function generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n if (services.length === 0) return [];\n\n const resolvedLookup = buildResolvedLookup(ctx);\n const files: GeneratedFile[] = [];\n const mountDirMap = buildMountDirMap(ctx);\n const mountGroups = groupByMount(ctx);\n\n // Build mount group entries. When resolved operations are available, group by\n // mount target. Otherwise fall back to one group per service (for tests).\n const entries: Array<{ name: string; operations: Operation[] }> =\n mountGroups.size > 0\n ? [...mountGroups].map(([name, group]) => ({ name, operations: group.operations }))\n : services.map((s) => ({ name: resolveClassName(s, ctx), operations: s.operations }));\n\n for (const { name: mountName, operations: allOperations } of entries) {\n if (allOperations.length === 0) continue;\n const dirName = moduleName(mountName);\n const resourceClassName = className(mountName);\n const importPrefix = relativeImportPrefix(dirName);\n\n const lines: string[] = [];\n lines.push('from __future__ import annotations');\n lines.push('');\n lines.push('from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Type, Union, cast');\n lines.push('');\n lines.push('if TYPE_CHECKING:');\n lines.push(` from ${importPrefix}_client import AsyncWorkOSClient, WorkOSClient`);\n lines.push('');\n\n const hasDeprecatedOps = allOperations.some((op) => op.deprecated);\n if (hasDeprecatedOps) {\n lines.push('import warnings');\n lines.push('');\n }\n\n // Collect all model and enum imports needed\n const modelImports = new Set<string>();\n const enumImports = new Set<string>();\n\n // Build a set of list wrapper model names to skip\n const listWrapperNames = new Set<string>();\n for (const m of ctx.spec.models) {\n const dataField = m.fields.find((f) => f.name === 'data');\n const hasListMeta = m.fields.some((f) => f.name === 'list_metadata' || f.name === 'listMetadata');\n if (dataField && hasListMeta && dataField.type.kind === 'array') {\n listWrapperNames.add(m.name);\n }\n }\n\n for (const op of allOperations) {\n const plan = planOperation(op);\n if (plan.responseModelName && !listWrapperNames.has(plan.responseModelName)) {\n modelImports.add(plan.responseModelName);\n }\n if (op.requestBody?.kind === 'model') {\n const requestBodyRef = op.requestBody;\n modelImports.add(requestBodyRef.name);\n // Also collect types from body model fields (expanded as keyword params)\n const bodyModel = ctx.spec.models.find((m) => m.name === requestBodyRef.name);\n if (bodyModel) {\n for (const f of bodyModel.fields) {\n for (const ref of collectModelRefs(f.type)) modelImports.add(ref);\n for (const ref of collectEnumRefs(f.type)) enumImports.add(ref);\n }\n }\n }\n // Collect from params\n for (const p of [...op.pathParams, ...op.queryParams]) {\n for (const ref of collectEnumRefs(p.type)) {\n enumImports.add(ref);\n }\n }\n if (op.requestBody) {\n for (const ref of collectModelRefs(op.requestBody)) {\n modelImports.add(ref);\n }\n for (const ref of collectEnumRefs(op.requestBody)) {\n enumImports.add(ref);\n }\n }\n if (op.pagination?.itemType.kind === 'model') {\n let paginationItemName = op.pagination.itemType.name;\n // Unwrap list wrapper models to their inner item type for imports\n if (listWrapperNames.has(paginationItemName)) {\n const wrapperModel = ctx.spec.models.find((m) => m.name === paginationItemName);\n const dataField = wrapperModel?.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n paginationItemName = dataField.type.items.name;\n }\n }\n modelImports.add(paginationItemName);\n }\n // Collect model imports for union split wrapper response types\n const resolved = lookupResolved(op, resolvedLookup);\n if (resolved?.wrappers) {\n for (const w of resolved.wrappers) {\n if (w.responseModelName) modelImports.add(w.responseModelName);\n }\n }\n }\n\n // Filter enum imports to only those that actually exist in the spec\n const specEnumNames = new Set(ctx.spec.enums.map((e) => e.name));\n for (const name of enumImports) {\n if (!specEnumNames.has(name)) enumImports.delete(name);\n }\n\n if (enumImports.size > 0) {\n lines.push(`from ${importPrefix}_types import RequestOptions, enum_value`);\n } else {\n lines.push(`from ${importPrefix}_types import RequestOptions`);\n }\n const actualModelImports = [...modelImports];\n\n // Split imports into same-service and cross-service (using mount-based dirs)\n const modelToServiceMap = assignModelsToServices(ctx.spec.models, ctx.spec.services);\n const resolveModelDir = (modelName: string) => {\n const svc = modelToServiceMap.get(modelName);\n return svc ? (mountDirMap.get(svc) ?? 'common') : 'common';\n };\n\n const localModels: string[] = [];\n const crossServiceModels = new Map<string, string[]>(); // dir -> names\n\n for (const name of actualModelImports.sort()) {\n const modelDir = resolveModelDir(name);\n if (modelDir === dirName) {\n localModels.push(name);\n } else {\n if (!crossServiceModels.has(modelDir)) crossServiceModels.set(modelDir, []);\n crossServiceModels.get(modelDir)!.push(name);\n }\n }\n\n // Deduplicate: skip cross-service imports for models already available locally\n const localSet = new Set(localModels);\n\n if (localModels.length > 0) {\n lines.push(`from .models import ${localModels.map((n) => className(n)).join(', ')}`);\n }\n for (const [csDir, names] of [...crossServiceModels].sort()) {\n const unique = names.filter((n) => !localSet.has(n));\n for (const n of unique) {\n lines.push(`from ${ctx.namespace}.${dirToModule(csDir)}.models.${fileName(n)} import ${className(n)}`);\n }\n }\n\n // Enum imports — same-service vs cross-service\n const enumToServiceMap = new Map<string, string>();\n for (const e of ctx.spec.enums) {\n // Find which service uses this enum by walking full type trees\n for (const svc of ctx.spec.services) {\n for (const op of svc.operations) {\n const refs = new Set<string>();\n // Walk all type refs (including nested nullable/array/union) to find enums\n const allTypeRefs = [\n op.response,\n ...(op.requestBody ? [op.requestBody] : []),\n ...op.pathParams.map((p) => p.type),\n ...op.queryParams.map((p) => p.type),\n ...op.headerParams.map((p) => p.type),\n ];\n for (const typeRef of allTypeRefs) {\n for (const ref of collectEnumRefs(typeRef)) refs.add(ref);\n }\n if (refs.has(e.name) && !enumToServiceMap.has(e.name)) {\n enumToServiceMap.set(e.name, svc.name);\n }\n }\n }\n }\n\n const localEnums: string[] = [];\n const crossServiceEnums = new Map<string, string[]>();\n for (const name of [...enumImports].sort()) {\n const enumSvc = enumToServiceMap.get(name);\n const enumDir = enumSvc ? (mountDirMap.get(enumSvc) ?? 'common') : 'common';\n if (enumDir === dirName) {\n localEnums.push(name);\n } else {\n if (!crossServiceEnums.has(enumDir)) crossServiceEnums.set(enumDir, []);\n crossServiceEnums.get(enumDir)!.push(name);\n }\n }\n\n if (localEnums.length > 0) {\n lines.push(`from .models import ${localEnums.map((n) => className(n)).join(', ')}`);\n }\n for (const [csDir, names] of [...crossServiceEnums].sort()) {\n for (const n of names) {\n lines.push(`from ${ctx.namespace}.${dirToModule(csDir)}.models.${fileName(n)} import ${className(n)}`);\n }\n }\n\n const hasPaginated = allOperations.some((op) => op.pagination);\n if (hasPaginated) {\n lines.push(`from ${importPrefix}_pagination import AsyncPage, SyncPage`);\n }\n // --- Generate sync class ---\n lines.push('');\n lines.push(`class ${resourceClassName}:`);\n {\n let readable = resourceClassName.replace(/([a-z])([A-Z])/g, '$1 $2');\n readable = readable.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n lines.push(` \"\"\"${readable} API resources.\"\"\"`);\n }\n lines.push('');\n lines.push(' def __init__(self, client: \"WorkOSClient\") -> None:');\n lines.push(' self._client = client');\n\n const emittedMethods = new Set<string>();\n for (const op of allOperations) {\n const plan = planOperation(op);\n let method = lookupMethodName(op, resolvedLookup) ?? toSnakeCase(op.name);\n // On name collision, fall back to the full snake_case operation name\n if (emittedMethods.has(method)) {\n const fallback = toSnakeCase(op.name);\n if (fallback !== method && !emittedMethods.has(fallback)) {\n method = fallback;\n } else {\n continue;\n }\n }\n emittedMethods.add(method);\n\n // Look up the resolved operation for defaults/inferFromClient support\n const resolvedSync = lookupResolved(op, resolvedLookup);\n\n lines.push('');\n const meta = emitMethodSignature(\n lines,\n op,\n plan,\n method,\n false,\n specEnumNames,\n modelImports,\n listWrapperNames,\n ctx,\n resolvedSync,\n );\n emitMethodDocstring(lines, op, plan, method, meta, specEnumNames, ctx, resolvedSync);\n emitMethodBody(lines, op, plan, meta, false, modelImports, listWrapperNames, ctx, resolvedSync);\n\n // Emit union split wrapper methods (e.g., authenticate_with_password)\n if (resolvedSync?.wrappers && resolvedSync.wrappers.length > 0) {\n lines.push(...generateSyncWrapperMethods(resolvedSync, ctx));\n for (const w of resolvedSync.wrappers) emittedMethods.add(w.name);\n }\n }\n\n // --- Generate async class ---\n const asyncClassName = `Async${resourceClassName}`;\n lines.push('');\n lines.push('');\n lines.push(`class ${asyncClassName}:`);\n {\n let readable = resourceClassName.replace(/([a-z])([A-Z])/g, '$1 $2');\n readable = readable.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n lines.push(` \"\"\"${readable} API resources (async).\"\"\"`);\n }\n lines.push('');\n lines.push(' def __init__(self, client: \"AsyncWorkOSClient\") -> None:');\n lines.push(' self._client = client');\n\n const asyncEmittedMethods = new Set<string>();\n for (const op of allOperations) {\n const plan = planOperation(op);\n let method = lookupMethodName(op, resolvedLookup) ?? toSnakeCase(op.name);\n if (asyncEmittedMethods.has(method)) {\n const fallback = toSnakeCase(op.name);\n if (fallback !== method && !asyncEmittedMethods.has(fallback)) {\n method = fallback;\n } else {\n continue;\n }\n }\n asyncEmittedMethods.add(method);\n\n // Look up the resolved operation for defaults/inferFromClient support\n const resolvedAsync = lookupResolved(op, resolvedLookup);\n\n lines.push('');\n const meta = emitMethodSignature(\n lines,\n op,\n plan,\n method,\n true,\n specEnumNames,\n modelImports,\n listWrapperNames,\n ctx,\n resolvedAsync,\n );\n emitMethodDocstring(lines, op, plan, method, meta, specEnumNames, ctx, resolvedAsync);\n emitMethodBody(lines, op, plan, meta, true, modelImports, listWrapperNames, ctx, resolvedAsync);\n\n // Emit union split wrapper methods (e.g., authenticate_with_password)\n if (resolvedAsync?.wrappers && resolvedAsync.wrappers.length > 0) {\n lines.push(...generateAsyncWrapperMethods(resolvedAsync, ctx));\n for (const w of resolvedAsync.wrappers) asyncEmittedMethods.add(w.name);\n }\n }\n\n files.push({\n path: `src/${ctx.namespace}/${dirName}/_resource.py`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\n// ─── Existing shared helpers ─────────────────────────────────────────\n\n/**\n * Emit a `params` dict from query params (for methods that also have a body or DELETE).\n * Returns true if params were emitted, false if no query params exist.\n */\nfunction emitQueryParamsDict(\n lines: string[],\n op: Operation,\n pathParamNames: Set<string>,\n bodyFieldNames: Set<string>,\n hiddenParams?: Set<string>,\n): boolean {\n // Filter to query params that aren't already path params, body fields, or hidden\n const queryParams = op.queryParams.filter((p) => {\n if (hiddenParams?.has(p.name)) return false;\n const pn = fieldName(p.name);\n return !pathParamNames.has(pn) && !bodyFieldNames.has(pn);\n });\n if (queryParams.length === 0) return false;\n\n const hasOptional = queryParams.some((p) => !p.required);\n if (hasOptional) {\n lines.push(' params: Dict[str, Any] = {k: v for k, v in {');\n for (const param of queryParams) {\n lines.push(\n ` \"${param.name}\": ${serializeParameterValue(param.type, fieldName(param.name), param.required, (param as ParameterExt).explode)},`,\n );\n }\n lines.push(' }.items() if v is not None}');\n } else {\n lines.push(' params: Dict[str, Any] = {');\n for (const param of queryParams) {\n lines.push(\n ` \"${param.name}\": ${serializeParameterValue(param.type, fieldName(param.name), param.required, (param as ParameterExt).explode)},`,\n );\n }\n lines.push(' }');\n }\n return true;\n}\n\n/**\n * Serialize a body field value for inclusion in a request body dict.\n * Calls .to_dict() directly on model fields since types are known at generation time.\n * For arrays of models, maps each item through .to_dict().\n */\nfunction serializeBodyFieldValue(fieldType: any, varName: string, isRequired: boolean): string {\n const effectiveType = fieldType.kind === 'nullable' ? fieldType.inner : fieldType;\n if (effectiveType.kind === 'enum') {\n return serializeParameterValue(effectiveType, varName, isRequired);\n }\n if (effectiveType.kind === 'model') {\n if (!isRequired) {\n return `${varName}.to_dict() if ${varName} is not None else None`;\n }\n return `${varName}.to_dict()`;\n }\n if (effectiveType.kind === 'array' && effectiveType.items?.kind === 'model') {\n if (!isRequired) {\n return `[item.to_dict() for item in ${varName}] if ${varName} is not None else None`;\n }\n return `[item.to_dict() for item in ${varName}]`;\n }\n return varName;\n}\n\nfunction serializeParameterValue(\n type: TypeRef | undefined,\n varName: string,\n isRequired: boolean,\n explode?: boolean,\n): string {\n if (type?.kind === 'nullable') {\n return serializeParameterValue(type.inner, varName, false, explode);\n }\n if (type?.kind === 'enum') {\n const expr = `enum_value(${varName})`;\n return isRequired ? expr : `${expr} if ${varName} is not None else None`;\n }\n // For explode=false array params, emit comma-joined string\n if (explode === false && type?.kind === 'array') {\n const joinExpr = `\",\".join(str(v) for v in ${varName})`;\n return isRequired ? joinExpr : `${joinExpr} if ${varName} is not None else None`;\n }\n return varName;\n}\n\n/**\n * Resolve the item type name for a paginated operation, unwrapping list wrappers.\n */\nexport function resolvePageItemName(itemType: TypeRef, listWrapperNames: Set<string>, ctx: EmitterContext): string {\n if (itemType.kind === 'model') {\n if (listWrapperNames.has(itemType.name)) {\n const wrapperModel = ctx.spec.models.find((m) => m.name === itemType.name);\n const dataField = wrapperModel?.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n return dataField.type.items.name;\n }\n }\n return itemType.name;\n }\n return 'dict';\n}\n\n/**\n * Check if an operation is a redirect endpoint that should construct a URL\n * instead of making an HTTP request.\n *\n * Detection: GET endpoints with no response body (primitive unknown) are redirect\n * endpoints — e.g., SSO/OAuth authorize and logout flows that redirect the browser.\n * Also catches endpoints with 302 success responses when the parser includes them.\n */\nfunction isRedirectEndpoint(op: Operation): boolean {\n // Explicit 302 in success responses\n if (op.successResponses?.some((r) => r.statusCode >= 300 && r.statusCode < 400)) {\n return true;\n }\n // GET with no response body (primitive unknown) = browser redirect endpoint\n if (\n op.httpMethod === 'get' &&\n op.response.kind === 'primitive' &&\n op.response.type === 'unknown' &&\n op.queryParams.length > 0\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Map HTTP status codes to Python error class names for per-operation Raises: documentation.\n * Falls back to a baseline set (401, 429, 5xx) when the operation has no explicit errors.\n */\nconst STATUS_TO_ERROR: Record<number, string> = {\n 400: 'BadRequestError',\n 401: 'AuthenticationError',\n 403: 'AuthorizationError',\n 404: 'NotFoundError',\n 409: 'ConflictError',\n 422: 'UnprocessableEntityError',\n 429: 'RateLimitExceededError',\n};\n\nconst STATUS_TO_DESC: Record<number, string> = {\n 400: 'If the request is malformed (400).',\n 401: 'If the API key is invalid (401).',\n 403: 'If the request is forbidden (403).',\n 404: 'If the resource is not found (404).',\n 409: 'If a conflict occurs (409).',\n 422: 'If the request data is unprocessable (422).',\n 429: 'If rate limited (429).',\n};\n\nfunction buildErrorRaisesBlock(op: Operation): string[] {\n const lines: string[] = [];\n const emittedCodes = new Set<number>();\n\n if (op.errors.length > 0) {\n // Use per-operation error responses from the spec\n for (const err of op.errors) {\n const errorClass = STATUS_TO_ERROR[err.statusCode];\n const desc = STATUS_TO_DESC[err.statusCode];\n if (errorClass && !emittedCodes.has(err.statusCode)) {\n lines.push(`${errorClass}: ${desc}`);\n emittedCodes.add(err.statusCode);\n }\n }\n }\n\n // Always include baseline errors for authenticated endpoints (401, 429, 5xx)\n if (!emittedCodes.has(401)) {\n lines.push('AuthenticationError: If the API key is invalid (401).');\n }\n if (!emittedCodes.has(429)) {\n lines.push('RateLimitExceededError: If rate limited (429).');\n }\n if (!emittedCodes.has(500)) {\n lines.push('ServerError: If the server returns a 5xx error.');\n }\n\n return lines;\n}\n\n/**\n * Build a Python f-string path expression from an operation path.\n * E.g., \"/organizations/{id}\" -> f\"organizations/{id}\"\n */\nfunction buildPathString(op: Operation): string {\n // Strip leading slash and convert {param} to Python f-string interpolation\n const path = op.path.replace(/^\\//, '');\n if (op.pathParams.length === 0) {\n return `\"${path}\"`;\n }\n // Convert {paramName} to {fieldName(paramName)}\n let fPath = path;\n for (const param of op.pathParams) {\n if (param.type.kind === 'enum' || (param.type.kind === 'nullable' && (param.type as any).inner?.kind === 'enum')) {\n fPath = fPath.replace(`{${param.name}}`, `{enum_value(${fieldName(param.name)})}`);\n } else {\n fPath = fPath.replace(`{${param.name}}`, `{${fieldName(param.name)}}`);\n }\n }\n return `f\"${fPath}\"`;\n}\n","/**\n * Non-spec services: hand-maintained modules that are wired into the\n * generated client class alongside the spec-driven service accessors.\n *\n * Each entry describes one hand-maintained module. Emitters translate these\n * to language-idiomatic class names, property names, and import paths.\n *\n * Adding a new non-spec service here is the *only* change needed in the\n * emitter repo — each language emitter reads this list and generates the\n * appropriate client accessor.\n */\nexport interface NonSpecService {\n /** Logical identifier (snake_case). Used as the canonical key. */\n id: string;\n\n /**\n * Human-readable description. Not emitted anywhere — exists so that\n * someone reading this file understands what the service does.\n */\n description: string;\n}\n\n/**\n * The canonical list of non-spec services that every SDK must expose.\n *\n * Order here determines emission order in the generated client.\n */\nexport const NON_SPEC_SERVICES: readonly NonSpecService[] = [\n {\n id: 'passwordless',\n description: 'Passwordless (magic-link) session endpoints, not yet in the OpenAPI spec.',\n },\n {\n id: 'vault',\n description: 'Vault KV storage, key operations, and client-side AES-GCM encrypt/decrypt.',\n },\n {\n id: 'webhook_verification',\n description: 'Webhook signature verification and event deserialization (H01/H02).',\n },\n {\n id: 'actions',\n description: 'AuthKit Actions request verification and response signing (H03).',\n },\n {\n id: 'session_manager',\n description: 'Sealed session cookies, JWT validation, JWKS helpers (H04-H07, H13).',\n },\n {\n id: 'pkce',\n description:\n 'PKCE utilities, AuthKit/SSO PKCE URL builders, code exchange, public client factory (H08-H11, H15, H16, H19).',\n },\n] as const;\n","import type { ApiSpec, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { toPascalCase } from '@workos/oagen';\nimport { className, resolveServiceDir, servicePropertyName, buildMountDirMap, dirToModule } from './naming.js';\nimport { resolveResourceClassName } from './resources.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\nimport { NON_SPEC_SERVICES } from '../shared/non-spec-services.js';\n\n/** Python-specific wiring for each non-spec service. */\ninterface PythonNonSpecWiring {\n importLine: string;\n prop: string;\n syncClass: string;\n asyncClass: string | null;\n ctorArg: 'self' | '';\n docstring?: string;\n}\n\nconst PYTHON_NON_SPEC_WIRING: Record<string, PythonNonSpecWiring> = {\n passwordless: {\n importLine: 'from .passwordless import AsyncPasswordless, Passwordless',\n prop: 'passwordless',\n syncClass: 'Passwordless',\n asyncClass: 'AsyncPasswordless',\n ctorArg: 'self',\n docstring: 'Passwordless authentication sessions.',\n },\n vault: {\n importLine: 'from .vault import AsyncVault, Vault',\n prop: 'vault',\n syncClass: 'Vault',\n asyncClass: 'AsyncVault',\n ctorArg: 'self',\n docstring: 'Vault encryption, key management, and secret storage.',\n },\n actions: {\n importLine: 'from .actions import Actions, AsyncActions',\n prop: 'actions',\n syncClass: 'Actions',\n asyncClass: 'AsyncActions',\n ctorArg: '',\n docstring: 'Actions logging and audit trail.',\n },\n pkce: {\n importLine: 'from .pkce import PKCE',\n prop: 'pkce',\n syncClass: 'PKCE',\n asyncClass: null,\n ctorArg: '',\n docstring: 'PKCE (Proof Key for Code Exchange) utilities.',\n },\n};\n\n/**\n * Generate the slim Python client class (service-wiring only),\n * service __init__.py files, and types barrels.\n *\n * Static HTTP infrastructure lives in _base_client.py (hand-maintained\n * in the target SDK, marked @oagen-ignore-file).\n */\nexport function generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n assertPublicClientReachability(spec, ctx);\n\n const files: GeneratedFile[] = [];\n\n files.push(...generateWorkOSClient(spec, ctx));\n files.push(...generateServiceInits(spec, ctx));\n files.push(...generateTypesBarrels(spec, ctx));\n\n return files;\n}\n\n/**\n * Deduplicate services by mount target. Multiple IR services may mount to the\n * same target (e.g., Applications + ApplicationClientSecrets -> Connect).\n * Returns one representative service per unique mount target, using the service\n * whose PascalCase name matches the target (if any), or the first one found.\n */\nfunction deduplicateByMount(services: Service[], ctx: EmitterContext): Service[] {\n const byTarget = new Map<string, Service>();\n for (const s of services) {\n const target = getMountTarget(s, ctx);\n const existing = byTarget.get(target);\n if (!existing || toPascalCase(s.name) === target) {\n byTarget.set(target, s);\n }\n }\n return [...byTarget.values()];\n}\n\nexport function buildServiceAccessPaths(services: Service[], ctx: EmitterContext): Map<string, string> {\n const topLevel = deduplicateByMount(services, ctx);\n const paths = new Map<string, string>();\n\n for (const service of topLevel) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const prop = servicePropertyName(resolvedName);\n paths.set(service.name, prop);\n }\n\n // Build reverse map: mount target name -> access path\n const targetPaths = new Map<string, string>();\n for (const service of topLevel) {\n const target = getMountTarget(service, ctx);\n if (!targetPaths.has(target) && paths.has(service.name)) {\n targetPaths.set(target, paths.get(service.name)!);\n }\n }\n\n // Map mounted services to their mount target's access path\n for (const service of services) {\n if (paths.has(service.name)) continue;\n const mountTarget = getMountTarget(service, ctx);\n const targetPath = targetPaths.get(mountTarget) ?? paths.get(mountTarget);\n if (targetPath) paths.set(service.name, targetPath);\n }\n\n return paths;\n}\n\nfunction assertPublicClientReachability(spec: ApiSpec, ctx: EmitterContext): void {\n const topLevelServices = deduplicateByMount(spec.services, ctx);\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n const unreachableServices = topLevelServices\n .filter((service) => service.operations.length > 0 && !accessPaths.has(service.name))\n .map((service) => service.name);\n\n if (unreachableServices.length > 0) {\n throw new Error(`Python emitter reachability audit failed for services: ${unreachableServices.join(', ')}`);\n }\n}\n\n/**\n * Generate the slim _client.py that subclasses the static _base_client.py\n * and wires spec-driven service accessors.\n */\nfunction generateWorkOSClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const lines: string[] = [];\n const topLevelServices = deduplicateByMount(spec.services, ctx);\n\n // --- Imports ---\n lines.push('from __future__ import annotations');\n lines.push('');\n lines.push('import functools');\n lines.push('');\n lines.push('from ._base_client import (');\n lines.push(' WorkOSClient as _SyncBase,');\n lines.push(' AsyncWorkOSClient as _AsyncBase,');\n lines.push(')');\n\n // Import resource classes (both sync and async)\n const serviceDirMap = buildMountDirMap(ctx);\n for (const service of topLevelServices) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const clsName = className(resolvedName);\n const dirName = serviceDirMap.get(service.name) ?? resolveServiceDir(resolvedName);\n const importLine = `from .${dirToModule(dirName)}._resource import ${clsName}, Async${clsName}`;\n if (importLine.length > 88) {\n lines.push(`from .${dirToModule(dirName)}._resource import (`);\n lines.push(` ${clsName},`);\n lines.push(` Async${clsName},`);\n lines.push(')');\n } else {\n lines.push(importLine);\n }\n }\n // Non-spec service imports — wrapped in ignore markers so the merger\n // matches them positionally and doesn't displace them.\n lines.push('');\n lines.push('# @oagen-ignore-start — non-spec service imports (hand-maintained)');\n for (const s of NON_SPEC_SERVICES) {\n const w = PYTHON_NON_SPEC_WIRING[s.id];\n if (w) lines.push(w.importLine);\n }\n lines.push('# @oagen-ignore-end');\n lines.push('');\n lines.push('');\n\n // --- Sync client ---\n lines.push('class WorkOSClient(_SyncBase):');\n lines.push(' \"\"\"Synchronous WorkOS API client with service accessors.\"\"\"');\n\n // Collect all generated property names\n const generatedProps = new Set<string>();\n for (const service of topLevelServices) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const clsName = className(resolvedName);\n const prop = servicePropertyName(resolvedName);\n const readable = clsName.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n lines.push('');\n lines.push(' @functools.cached_property');\n lines.push(` def ${prop}(self) -> ${clsName}:`);\n lines.push(` \"\"\"${readable} API resources.\"\"\"`);\n lines.push(` return ${clsName}(self)`);\n generatedProps.add(prop);\n }\n emitCompatClientPropertyAliases(lines, generatedProps, false);\n emitNonSpecClientAccessors(lines, false);\n\n lines.push('');\n lines.push('');\n\n // --- Async client ---\n lines.push('class AsyncWorkOSClient(_AsyncBase):');\n lines.push(' \"\"\"Asynchronous WorkOS API client with service accessors.\"\"\"');\n\n const asyncGeneratedProps = new Set<string>();\n for (const service of topLevelServices) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const clsName = className(resolvedName);\n const prop = servicePropertyName(resolvedName);\n const readable = clsName.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n lines.push('');\n lines.push(' @functools.cached_property');\n lines.push(` def ${prop}(self) -> Async${clsName}:`);\n lines.push(` \"\"\"${readable} API resources.\"\"\"`);\n lines.push(` return Async${clsName}(self)`);\n asyncGeneratedProps.add(prop);\n }\n emitCompatClientPropertyAliases(lines, asyncGeneratedProps, true);\n emitNonSpecClientAccessors(lines, true);\n\n return [\n {\n path: `src/${ctx.namespace}/_client.py`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n },\n ];\n}\n\nfunction emitNonSpecClientAccessors(lines: string[], isAsync: boolean): void {\n lines.push('');\n lines.push(' # @oagen-ignore-start — non-spec service accessors (hand-maintained)');\n for (const s of NON_SPEC_SERVICES) {\n const w = PYTHON_NON_SPEC_WIRING[s.id];\n if (!w) continue;\n const typeName = isAsync ? (w.asyncClass ?? w.syncClass) : w.syncClass;\n const arg = w.ctorArg === 'self' ? 'self' : '';\n\n lines.push('');\n lines.push(' @functools.cached_property');\n lines.push(` def ${w.prop}(self) -> ${typeName}:`);\n if (w.docstring) {\n lines.push(` \"\"\"${w.docstring}\"\"\"`);\n }\n lines.push(` return ${typeName}(${arg})`);\n }\n lines.push('');\n lines.push(' # @oagen-ignore-end');\n}\n\nfunction generateServiceInits(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const topLevel = deduplicateByMount(spec.services, ctx);\n const serviceDirMap = buildMountDirMap(ctx);\n\n for (const service of topLevel) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const dirName = serviceDirMap.get(service.name) ?? resolveServiceDir(resolvedName);\n const lines: string[] = [];\n\n lines.push(`from ._resource import ${resolvedName}, Async${resolvedName}`);\n lines.push('from .models import *');\n\n files.push({\n path: `src/${ctx.namespace}/${dirName}/__init__.py`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n\n // Ensure models/__init__.py exists even if no models are assigned to this service\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/__init__.py`,\n content: '',\n skipIfExists: true,\n });\n }\n\n return files;\n}\n\nfunction emitCompatClientPropertyAliases(lines: string[], generatedProps: Set<string>, isAsync: boolean): void {\n const aliases: Array<{ alias: string; typeName: string; returnExpr: string; docstring: string }> = [];\n if (generatedProps.has('multi_factor_auth') && !generatedProps.has('mfa')) {\n const mfaType = isAsync ? 'AsyncMultiFactorAuth' : 'MultiFactorAuth';\n aliases.push({\n alias: 'mfa',\n typeName: mfaType,\n returnExpr: 'self.multi_factor_auth',\n docstring: '\"\"\"Alias for multi_factor_auth.\"\"\"',\n });\n }\n for (const alias of aliases) {\n lines.push('');\n lines.push(' @functools.cached_property');\n lines.push(` def ${alias.alias}(self) -> ${alias.typeName}:`);\n lines.push(` ${alias.docstring}`);\n lines.push(` return ${alias.returnExpr}`);\n }\n}\n\n/**\n * Generate types/<service>/__init__.py re-export barrels so that\n * `from workos.types.<service> import Model` continues to work.\n */\nfunction generateTypesBarrels(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const serviceDirMap = buildMountDirMap(ctx);\n\n // Collect (types dir name -> set of service dirs whose models should be re-exported)\n const typesEntries = new Map<string, Set<string>>();\n\n for (const service of spec.services) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const prop = servicePropertyName(resolvedName);\n const dir = serviceDirMap.get(service.name) ?? prop;\n const dirs = typesEntries.get(prop) ?? new Set();\n dirs.add(dir);\n typesEntries.set(prop, dirs);\n }\n\n for (const [typesDir, serviceDirs] of typesEntries) {\n const imports = [...serviceDirs]\n .sort()\n .map((dir) => `from ${ctx.namespace}.${dirToModule(dir)}.models import * # noqa: F401,F403`);\n\n files.push({\n path: `src/${ctx.namespace}/types/${typesDir}/__init__.py`,\n content: imports.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n // Root types/__init__.py\n files.push({\n path: `src/${ctx.namespace}/types/__init__.py`,\n content: '',\n integrateTarget: true,\n overwriteExisting: true,\n });\n\n return files;\n}\n","import type { Model, TypeRef, Enum } from '@workos/oagen';\n\nimport { fileName, fieldName } from './naming.js';\nimport { isListMetadataModel, isListWrapperModel } from './models.js';\n\n/**\n * Prefix mapping for generating realistic ID fixture values.\n */\nexport const ID_PREFIXES: Record<string, string> = {\n Connection: 'conn_',\n Organization: 'org_',\n OrganizationMembership: 'om_',\n User: 'user_',\n Directory: 'directory_',\n DirectoryGroup: 'dir_grp_',\n DirectoryUser: 'dir_usr_',\n Invitation: 'inv_',\n Session: 'session_',\n AuthenticationFactor: 'auth_factor_',\n EmailVerification: 'email_verification_',\n MagicAuth: 'magic_auth_',\n PasswordReset: 'password_reset_',\n};\n\n/**\n * Generate JSON fixture files for test data.\n */\nexport function generateFixtures(spec: {\n models: Model[];\n enums: Enum[];\n services: any[];\n}): { path: string; content: string }[] {\n if (spec.models.length === 0) return [];\n\n const modelMap = new Map(spec.models.map((m) => [m.name, m]));\n const enumMap = new Map(spec.enums.map((e) => [e.name, e]));\n const files: { path: string; content: string }[] = [];\n\n for (const model of spec.models) {\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n // Skip models with no fields — these are typically discriminated unions\n // with hand-maintained @oagen-ignore overrides; generated empty fixtures\n // would not match the override's required fields.\n if (model.fields.length === 0) continue;\n\n const fixture = generateModelFixture(model, modelMap, enumMap);\n\n files.push({\n path: `tests/fixtures/${fileName(model.name)}.json`,\n content: JSON.stringify(fixture, null, 2),\n });\n }\n\n // Generate list fixtures for paginated responses\n for (const service of spec.services) {\n for (const op of service.operations) {\n if (op.pagination) {\n let itemModel = op.pagination.itemType.kind === 'model' ? modelMap.get(op.pagination.itemType.name) : null;\n if (itemModel) {\n const unwrapped = unwrapListModel(itemModel, modelMap);\n if (unwrapped) itemModel = unwrapped;\n if (itemModel.fields.length === 0) continue;\n const fixture = generateModelFixture(itemModel, modelMap, enumMap);\n const listFixture = {\n data: [fixture],\n list_metadata: {\n before: null,\n after: null,\n },\n };\n files.push({\n path: `tests/fixtures/list_${fileName(itemModel.name)}.json`,\n content: JSON.stringify(listFixture, null, 2),\n });\n }\n }\n }\n }\n\n return files;\n}\n\nexport function unwrapListModel(model: Model, modelMap: Map<string, Model>): Model | null {\n const dataField = model.fields.find((f) => f.name === 'data');\n const hasListMetadata = model.fields.some((f) => f.name === 'list_metadata' || f.name === 'listMetadata');\n if (dataField && hasListMetadata && dataField.type.kind === 'array') {\n const itemType = dataField.type.items;\n if (itemType.kind === 'model') {\n return modelMap.get(itemType.name) ?? null;\n }\n }\n return null;\n}\n\nexport function generateModelFixture(\n model: Model,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): Record<string, any> {\n const fixture: Record<string, any> = {};\n\n // Deduplicate fields by snake_case name (matching model generation in models.ts)\n const seenFieldNames = new Set<string>();\n const deduplicatedFields = model.fields.filter((f) => {\n const pyName = fieldName(f.name);\n if (seenFieldNames.has(pyName)) return false;\n seenFieldNames.add(pyName);\n return true;\n });\n\n for (const field of deduplicatedFields) {\n // Use the original field name as the wire key (matches from_dict access patterns)\n const wireName = field.name;\n if (field.example !== undefined) {\n fixture[wireName] = field.example;\n } else {\n fixture[wireName] = generateFieldValue(field.type, field.name, model.name, modelMap, enumMap);\n }\n }\n\n return fixture;\n}\n\nfunction generateFieldValue(\n ref: TypeRef,\n fieldName: string,\n modelName: string,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): any {\n switch (ref.kind) {\n case 'primitive':\n return generatePrimitiveValue(ref.type, ref.format, fieldName, modelName);\n case 'literal':\n return ref.value;\n case 'enum': {\n const e = enumMap.get(ref.name);\n return e?.values[0]?.value ?? 'unknown';\n }\n case 'model': {\n const nested = modelMap.get(ref.name);\n if (nested) return generateModelFixture(nested, modelMap, enumMap);\n return {};\n }\n case 'array': {\n if (ref.items.kind === 'enum') {\n const e = enumMap.get(ref.items.name);\n if (e && e.values.length > 0) {\n return e.values.map((v) => v.value);\n }\n }\n const item = generateFieldValue(ref.items, fieldName, modelName, modelMap, enumMap);\n return [item];\n }\n case 'nullable':\n return generateFieldValue(ref.inner, fieldName, modelName, modelMap, enumMap);\n case 'union':\n if (ref.variants.length > 0) {\n return generateFieldValue(ref.variants[0], fieldName, modelName, modelMap, enumMap);\n }\n return null;\n case 'map':\n return {\n key: generateFieldValue(ref.valueType, 'value', modelName, modelMap, enumMap),\n };\n }\n}\n\nfunction generatePrimitiveValue(type: string, format: string | undefined, name: string, modelName: string): any {\n switch (type) {\n case 'string':\n if (format === 'date-time') return '2023-01-01T00:00:00.000Z';\n if (format === 'date') return '2023-01-01';\n if (format === 'uuid') return '00000000-0000-0000-0000-000000000000';\n if (name === 'id') {\n const prefix = ID_PREFIXES[modelName] ?? '';\n return `${prefix}01234`;\n }\n if (name.includes('id')) return `${name}_01234`;\n if (name.includes('email')) return 'test@example.com';\n if (name.includes('url') || name.includes('uri')) return 'https://example.com';\n if (name.includes('name')) return 'Test';\n return `test_${name}`;\n case 'integer':\n return 1;\n case 'number':\n return 1.0;\n case 'boolean':\n return true;\n case 'unknown':\n return {};\n default:\n return null;\n }\n}\n","import type {\n ApiSpec,\n Service,\n Operation,\n EmitterContext,\n GeneratedFile,\n TypeRef,\n Model,\n ResolvedOperation,\n} from '@workos/oagen';\nimport { planOperation, toSnakeCase, assignModelsToServices } from '@workos/oagen';\nimport { className, fileName, fieldName, resolveMethodName, buildMountDirMap, dirToModule } from './naming.js';\nimport { resolveResourceClassName, bodyParamName } from './resources.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { generateFixtures, generateModelFixture } from './fixtures.js';\nimport { isListWrapperModel, isListMetadataModel } from './models.js';\nimport { assignEnumsToServices } from './enums.js';\nimport { groupByMount, buildResolvedLookup, lookupResolved, buildHiddenParams } from '../shared/resolved-ops.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\nimport { pythonLiteral } from './wrappers.js';\n\n/** Check if an operation is a redirect endpoint (same logic as resources.ts). */\nfunction isRedirectEndpoint(op: Operation): boolean {\n if (op.successResponses?.some((r) => r.statusCode >= 300 && r.statusCode < 400)) return true;\n if (\n op.httpMethod === 'get' &&\n op.response.kind === 'primitive' &&\n (op.response as any).type === 'unknown' &&\n op.queryParams.length > 0\n ) {\n return true;\n }\n return false;\n}\n\n/** Push an async test method definition with @pytest.mark.asyncio decorator. */\nfunction pushAsyncTestDef(lines: string[], def: string): void {\n lines.push(' @pytest.mark.asyncio');\n lines.push(def);\n}\n\n/**\n * Generate pytest test files and JSON fixtures for the Python SDK.\n */\nexport function generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Generate fixture JSON files\n const fixtures = generateFixtures(spec);\n for (const fixture of fixtures) {\n files.push({\n path: fixture.path,\n content: fixture.content,\n headerPlacement: 'skip',\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n // conftest.py, generated_helpers.py, test_pagination.py, and test_generated_client.py\n // are now hand-maintained in the target SDK (@oagen-ignore-file).\n\n // Build access path map for all services\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n\n // Generate per-mount-target test files (merges all sub-services into one file)\n const mountGroups = groupByMount(ctx);\n const testEntries: Array<{ name: string; operations: Operation[]; resolvedOps?: ResolvedOperation[] }> =\n mountGroups.size > 0\n ? [...mountGroups].map(([name, group]) => ({\n name,\n operations: group.operations,\n resolvedOps: group.resolvedOps,\n }))\n : spec.services.map((s) => ({ name: resolveResourceClassName(s, ctx), operations: s.operations }));\n\n for (const { name: mountName, operations, resolvedOps } of testEntries) {\n if (operations.length === 0) continue;\n const mergedService: Service = { name: mountName, operations };\n const testFile = generateServiceTest(mergedService, spec, ctx, accessPaths, resolvedOps);\n if (testFile) files.push(testFile);\n }\n\n // Generate model round-trip tests (P3-7)\n const modelTests = generateModelRoundTripTests(spec, ctx);\n if (modelTests) files.push(modelTests);\n\n return files;\n}\n\nfunction generateServiceTest(\n service: Service,\n spec: ApiSpec,\n ctx: EmitterContext,\n accessPaths: Map<string, string>,\n resolvedOps?: ResolvedOperation[],\n): GeneratedFile | null {\n if (service.operations.length === 0) return null;\n\n const resolvedName = resolveResourceClassName(service, ctx);\n const propName = accessPaths.get(service.name) ?? toSnakeCase(resolvedName);\n\n const lines: string[] = [];\n\n lines.push('import json');\n lines.push('');\n lines.push('import pytest');\n lines.push(`from ${ctx.namespace} import WorkOSClient, AsyncWorkOSClient`);\n lines.push('from tests.generated_helpers import load_fixture');\n lines.push('');\n\n // Collect model and enum imports needed (response models, body field models, and enum params)\n const modelImports = new Set<string>();\n const enumImports = new Set<string>();\n for (const op of service.operations) {\n const plan = planOperation(op);\n if (plan.responseModelName) modelImports.add(plan.responseModelName);\n if (op.pagination?.itemType.kind === 'model') {\n modelImports.add(op.pagination.itemType.name);\n }\n // Collect model-typed and enum-typed body fields (used as method arguments)\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = spec.models.find((m) => m.name === (op.requestBody as any).name);\n if (bodyModel) {\n for (const f of bodyModel.fields) {\n if (f.type.kind === 'model') modelImports.add(f.type.name);\n if (f.type.kind === 'nullable' && f.type.inner.kind === 'model') modelImports.add(f.type.inner.name);\n if (f.type.kind === 'array' && f.type.items.kind === 'model') modelImports.add(f.type.items.name);\n if (f.type.kind === 'enum') enumImports.add(f.type.name);\n if (f.type.kind === 'nullable' && f.type.inner.kind === 'enum') enumImports.add(f.type.inner.name);\n }\n }\n }\n // Collect enum-typed query params\n for (const param of op.queryParams) {\n if (param.type.kind === 'enum') enumImports.add(param.type.name);\n if (param.type.kind === 'nullable' && param.type.inner.kind === 'enum') enumImports.add(param.type.inner.name);\n }\n }\n\n // Filter out list wrapper models\n const actualImports = [...modelImports].filter((name) => {\n const model = spec.models.find((m) => m.name === name);\n if (!model) return true;\n return !isListWrapperModel(model);\n });\n\n // Group imports by their actual service directory (models may live in different services)\n const modelToServiceMap = assignModelsToServices(spec.models, spec.services);\n const mountDirMap = buildMountDirMap(ctx);\n const resolveModelDir = (modelName: string) => {\n const svc = modelToServiceMap.get(modelName);\n return svc ? (mountDirMap.get(svc) ?? 'common') : 'common';\n };\n\n // Group enum imports by service directory\n const enumToServiceMap = assignEnumsToServices(spec.enums, spec.services);\n const resolveEnumDir = (enumName: string) => {\n const svc = enumToServiceMap.get(enumName);\n return svc ? (mountDirMap.get(svc) ?? 'common') : 'common';\n };\n\n const importsByDir = new Map<string, string[]>();\n for (const name of actualImports.sort()) {\n const modelDir = resolveModelDir(name);\n if (!importsByDir.has(modelDir)) importsByDir.set(modelDir, []);\n importsByDir.get(modelDir)!.push(className(name));\n }\n for (const name of [...enumImports].sort()) {\n const enumDir = resolveEnumDir(name);\n if (!importsByDir.has(enumDir)) importsByDir.set(enumDir, []);\n const existing = importsByDir.get(enumDir)!;\n const cn = className(name);\n if (!existing.includes(cn)) existing.push(cn);\n }\n\n for (const [modelDir, names] of [...importsByDir].sort()) {\n lines.push(`from ${ctx.namespace}.${dirToModule(modelDir)}.models import ${names.join(', ')}`);\n }\n\n const hasPaginated = service.operations.some((op) => op.pagination);\n if (hasPaginated) {\n lines.push(`from ${ctx.namespace}._pagination import AsyncPage, SyncPage`);\n }\n lines.push(\n `from ${ctx.namespace}._errors import AuthenticationError, BadRequestError, NotFoundError, RateLimitExceededError, ServerError, UnprocessableEntityError`,\n );\n\n lines.push('');\n lines.push('');\n lines.push(`class Test${resolvedName}:`);\n\n const resolvedLookup = buildResolvedLookup(ctx);\n const emittedTestMethods = new Set<string>();\n for (const op of service.operations) {\n const plan = planOperation(op);\n const resolvedOp = lookupResolved(op, resolvedLookup);\n const hiddenParams = buildHiddenParams(resolvedOp);\n let method = resolveMethodName(op, service, ctx);\n\n // On name collision, fall back to the full snake_case operation name (match resource dedup)\n if (emittedTestMethods.has(method)) {\n const fallback = toSnakeCase(op.name);\n if (fallback !== method && !emittedTestMethods.has(fallback)) {\n method = fallback;\n } else {\n continue;\n }\n }\n emittedTestMethods.add(method);\n\n const isDelete = plan.isDelete;\n const isPaginated = plan.isPaginated;\n const isArrayResponse = op.response.kind === 'array' && op.response.items.kind === 'model';\n\n lines.push('');\n\n if (isPaginated) {\n const itemType = op.pagination!.itemType;\n let itemName = itemType.kind === 'model' ? itemType.name : null;\n // Unwrap list wrapper models to their inner item type for fixture names\n if (itemName) {\n const wrapperModel = spec.models.find((m) => m.name === itemName);\n if (wrapperModel && isListWrapperModel(wrapperModel)) {\n const dataField = wrapperModel.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n itemName = dataField.type.items.name;\n }\n }\n }\n // Skip fixture-based testing for models with no fields (discriminated unions)\n if (itemName) {\n const itemModel = spec.models.find((m) => m.name === itemName);\n if (itemModel && itemModel.fields.length === 0) itemName = null;\n }\n const fixtureName = itemName ? `list_${fileName(itemName)}.json` : null;\n\n const paginatedArgs = buildTestArgs(op, spec, hiddenParams);\n lines.push(` def test_${method}(self, workos, httpx_mock):`);\n if (fixtureName) {\n lines.push(` httpx_mock.add_response(`);\n lines.push(` json=load_fixture(\"${fixtureName}\"),`);\n lines.push(' )');\n lines.push(` page = workos.${propName}.${method}(${paginatedArgs})`);\n lines.push(' assert isinstance(page, SyncPage)');\n lines.push(' assert isinstance(page.data, list)');\n\n lines.push('');\n lines.push(` def test_${method}_empty_page(self, workos, httpx_mock):`);\n lines.push(' httpx_mock.add_response(json={\"data\": [], \"list_metadata\": {}})');\n lines.push(` page = workos.${propName}.${method}(${paginatedArgs})`);\n lines.push(' assert isinstance(page, SyncPage)');\n lines.push(' assert page.data == []');\n } else {\n lines.push(' httpx_mock.add_response(json={\"data\": [], \"list_metadata\": {}})');\n lines.push(` page = workos.${propName}.${method}(${paginatedArgs})`);\n lines.push(' assert isinstance(page, SyncPage)');\n }\n } else if (isDelete) {\n lines.push(` def test_${method}(self, workos, httpx_mock):`);\n lines.push(' httpx_mock.add_response(status_code=204)');\n const args = buildTestArgs(op, spec, hiddenParams);\n lines.push(` result = workos.${propName}.${method}(${args})`);\n lines.push(' assert result is None');\n // Request assertions for delete\n const deletePath = buildExpectedPath(op);\n lines.push(' request = httpx_mock.get_request()');\n lines.push(` assert request.method == \"DELETE\"`);\n lines.push(` assert request.url.path.endswith(\"/${deletePath}\")`);\n } else if (isRedirectEndpoint(op)) {\n // Redirect endpoint: returns a URL string, no HTTP request made\n const args = buildTestArgs(op, spec, hiddenParams);\n lines.push(` def test_${method}(self, workos):`);\n lines.push(` result = workos.${propName}.${method}(${args})`);\n lines.push(' assert isinstance(result, str)');\n lines.push(' assert result.startswith(\"http\")');\n } else if (isArrayResponse) {\n // Array response: returns List[Model]\n const modelClass = className(plan.responseModelName!);\n const fixtureName = `${fileName(plan.responseModelName!)}.json`;\n const args = buildTestArgs(op, spec, hiddenParams);\n lines.push(` def test_${method}(self, workos, httpx_mock):`);\n lines.push(` httpx_mock.add_response(json=[load_fixture(\"${fixtureName}\")])`);\n lines.push(` result = workos.${propName}.${method}(${args})`);\n lines.push(' assert isinstance(result, list)');\n lines.push(` assert len(result) == 1`);\n lines.push(` assert isinstance(result[0], ${modelClass})`);\n } else if (plan.responseModelName) {\n const modelName = plan.responseModelName;\n const fixtureName = `${fileName(modelName)}.json`;\n const modelClass = className(modelName);\n\n lines.push(` def test_${method}(self, workos, httpx_mock):`);\n lines.push(` httpx_mock.add_response(`);\n lines.push(` json=load_fixture(\"${fixtureName}\"),`);\n lines.push(' )');\n const args = buildTestArgs(op, spec, hiddenParams);\n lines.push(` result = workos.${propName}.${method}(${args})`);\n lines.push(` assert isinstance(result, ${modelClass})`);\n\n // Field-value assertions: verify at least 2 scalar fields from fixture\n const assertFields = pickAssertableFields(modelName, spec);\n for (const af of assertFields) {\n const op_ = af.isBool ? 'is' : '==';\n lines.push(` assert result.${af.field} ${op_} ${af.value}`);\n }\n\n // Request assertions: verify HTTP method and URL path\n const expectedPath = buildExpectedPath(op);\n lines.push(' request = httpx_mock.get_request()');\n lines.push(` assert request.method == \"${op.httpMethod.toUpperCase()}\"`);\n lines.push(` assert request.url.path.endswith(\"/${expectedPath}\")`);\n // For POST/PUT/PATCH with required body fields, verify specific field values\n if (plan.hasBody && ['post', 'put', 'patch'].includes(op.httpMethod.toLowerCase())) {\n const bodyModel = spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n const reqFields = bodyModel?.fields.filter((f) => f.required && !hiddenParams?.has(f.name)) ?? [];\n if (reqFields.length > 0) {\n lines.push(' body = json.loads(request.content)');\n for (const f of reqFields) {\n const testVal = generateTestValue(f.type, f.name);\n // Only assert primitives (strings, numbers, booleans) — skip complex types\n if (f.type.kind === 'primitive' || f.type.kind === 'enum' || f.type.kind === 'literal') {\n lines.push(` assert body[\"${f.name}\"] == ${testVal}`);\n } else {\n lines.push(` assert \"${f.name}\" in body`);\n }\n }\n }\n }\n } else {\n lines.push(` def test_${method}(self, workos, httpx_mock):`);\n lines.push(' httpx_mock.add_response(json={})');\n const args = buildTestArgs(op, spec, hiddenParams);\n lines.push(` workos.${propName}.${method}(${args})`);\n // Request assertions for void-returning methods\n const voidPath = buildExpectedPath(op);\n lines.push(' request = httpx_mock.get_request()');\n lines.push(` assert request.method == \"${op.httpMethod.toUpperCase()}\"`);\n lines.push(` assert request.url.path.endswith(\"/${voidPath}\")`);\n }\n\n if (op.queryParams.length > 0 && !isRedirectEndpoint(op)) {\n const queryArgs = buildQueryEncodingTestArgs(op, spec);\n const queryAssertions = buildQueryEncodingAssertions(op, spec);\n if (queryArgs && queryAssertions.length > 0) {\n const responseSetup = buildQueryEncodingResponseSetup(op, plan);\n lines.push('');\n lines.push(` def test_${method}_encodes_query_params(self, workos, httpx_mock):`);\n for (const setupLine of responseSetup) {\n lines.push(` ${setupLine}`);\n }\n lines.push(` workos.${propName}.${method}(${queryArgs})`);\n lines.push(' request = httpx_mock.get_request()');\n for (const assertion of queryAssertions) {\n lines.push(` ${assertion}`);\n }\n }\n }\n }\n\n // Generate tests for wrapper (union-split) methods (sync)\n emitWrapperTests(lines, resolvedOps, propName, spec, ctx, false);\n\n // Add a RequestOptions propagation test for the first non-redirect operation\n const firstRequestOptionsOp = service.operations.find((op) => !isRedirectEndpoint(op));\n if (firstRequestOptionsOp) {\n const roMethod = resolveMethodName(firstRequestOptionsOp, service, ctx);\n const roPlan = planOperation(firstRequestOptionsOp);\n const roResponseSetup = buildQueryEncodingResponseSetup(firstRequestOptionsOp, roPlan);\n const roArgs = buildTestArgs(\n firstRequestOptionsOp,\n spec,\n buildHiddenParams(lookupResolved(firstRequestOptionsOp, resolvedLookup)),\n );\n const roArgsWithOpts = roArgs\n ? `${roArgs}, request_options={\"extra_headers\": {\"X-Custom\": \"value\"}}`\n : 'request_options={\"extra_headers\": {\"X-Custom\": \"value\"}}';\n lines.push('');\n lines.push(` def test_${roMethod}_with_request_options(self, workos, httpx_mock):`);\n for (const setupLine of roResponseSetup) {\n lines.push(` ${setupLine}`);\n }\n lines.push(` workos.${propName}.${roMethod}(${roArgsWithOpts})`);\n lines.push(' request = httpx_mock.get_request()');\n lines.push(' assert request.headers[\"X-Custom\"] == \"value\"');\n }\n\n // Add an error test for the first non-delete, non-redirect operation\n const firstNonDelete = service.operations.find((op) => !planOperation(op).isDelete && !isRedirectEndpoint(op));\n if (firstNonDelete) {\n const method = resolveMethodName(firstNonDelete, service, ctx);\n lines.push('');\n lines.push(` def test_${method}_unauthorized(self, workos, httpx_mock):`);\n lines.push(' httpx_mock.add_response(');\n lines.push(' status_code=401,');\n lines.push(' json={\"message\": \"Unauthorized\"},');\n lines.push(' )');\n lines.push(' with pytest.raises(AuthenticationError):');\n const args = buildTestArgs(firstNonDelete, spec, buildHiddenParams(lookupResolved(firstNonDelete, resolvedLookup)));\n lines.push(` workos.${propName}.${method}(${args})`);\n\n lines.push('');\n lines.push(` def test_${method}_not_found(self, httpx_mock):`);\n lines.push(' workos = WorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(' httpx_mock.add_response(status_code=404, json={\"message\": \"Not found\"})');\n lines.push(' with pytest.raises(NotFoundError):');\n lines.push(` workos.${propName}.${method}(${args})`);\n lines.push(' finally:');\n lines.push(' workos.close()');\n\n lines.push('');\n lines.push(` def test_${method}_rate_limited(self, httpx_mock):`);\n lines.push(' workos = WorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(\n ' httpx_mock.add_response(status_code=429, headers={\"Retry-After\": \"0\"}, json={\"message\": \"Slow down\"})',\n );\n lines.push(' with pytest.raises(RateLimitExceededError):');\n lines.push(` workos.${propName}.${method}(${args})`);\n lines.push(' finally:');\n lines.push(' workos.close()');\n\n lines.push('');\n lines.push(` def test_${method}_server_error(self, httpx_mock):`);\n lines.push(' workos = WorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(' httpx_mock.add_response(status_code=500, json={\"message\": \"Server error\"})');\n lines.push(' with pytest.raises(ServerError):');\n lines.push(` workos.${propName}.${method}(${args})`);\n lines.push(' finally:');\n lines.push(' workos.close()');\n }\n\n // Add 400/422 error tests for the first non-delete, non-redirect operation\n const firstErrorTargetOp = service.operations.find((op) => !planOperation(op).isDelete && !isRedirectEndpoint(op));\n if (firstErrorTargetOp) {\n const writeMethod = resolveMethodName(firstErrorTargetOp, service, ctx);\n const writeArgs = buildTestArgs(\n firstErrorTargetOp,\n spec,\n buildHiddenParams(lookupResolved(firstErrorTargetOp, resolvedLookup)),\n );\n\n lines.push('');\n lines.push(` def test_${writeMethod}_bad_request(self, httpx_mock):`);\n lines.push(' workos = WorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(' httpx_mock.add_response(status_code=400, json={\"message\": \"Bad request\"})');\n lines.push(' with pytest.raises(BadRequestError):');\n lines.push(` workos.${propName}.${writeMethod}(${writeArgs})`);\n lines.push(' finally:');\n lines.push(' workos.close()');\n\n lines.push('');\n lines.push(` def test_${writeMethod}_unprocessable(self, httpx_mock):`);\n lines.push(' workos = WorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(' httpx_mock.add_response(status_code=422, json={\"message\": \"Unprocessable\"})');\n lines.push(' with pytest.raises(UnprocessableEntityError):');\n lines.push(` workos.${propName}.${writeMethod}(${writeArgs})`);\n lines.push(' finally:');\n lines.push(' workos.close()');\n }\n\n // --- Async test class ---\n lines.push('');\n lines.push('');\n lines.push(`class TestAsync${resolvedName}:`);\n\n const asyncEmittedTestMethods = new Set<string>();\n for (const op of service.operations) {\n const plan = planOperation(op);\n const asyncResolvedOp = lookupResolved(op, resolvedLookup);\n const asyncHiddenParams = buildHiddenParams(asyncResolvedOp);\n let method = resolveMethodName(op, service, ctx);\n\n if (asyncEmittedTestMethods.has(method)) {\n const fallback = toSnakeCase(op.name);\n if (fallback !== method && !asyncEmittedTestMethods.has(fallback)) {\n method = fallback;\n } else {\n continue;\n }\n }\n asyncEmittedTestMethods.add(method);\n\n const isDelete = plan.isDelete;\n const isPaginated = plan.isPaginated;\n const isAsyncArrayResponse = op.response.kind === 'array' && op.response.items.kind === 'model';\n const asyncArgs = buildTestArgs(op, spec, asyncHiddenParams);\n\n lines.push('');\n\n if (isPaginated) {\n const itemType = op.pagination!.itemType;\n let itemName = itemType.kind === 'model' ? itemType.name : null;\n if (itemName) {\n const wrapperModel = spec.models.find((m) => m.name === itemName);\n if (wrapperModel && isListWrapperModel(wrapperModel)) {\n const dataField = wrapperModel.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n itemName = dataField.type.items.name;\n }\n }\n }\n // Skip fixture-based testing for models with no fields (discriminated unions)\n if (itemName) {\n const itemModel = spec.models.find((m) => m.name === itemName);\n if (itemModel && itemModel.fields.length === 0) itemName = null;\n }\n const fixtureName = itemName ? `list_${fileName(itemName)}.json` : null;\n pushAsyncTestDef(lines, ` async def test_${method}(self, async_workos, httpx_mock):`);\n if (fixtureName) {\n lines.push(` httpx_mock.add_response(json=load_fixture(\"${fixtureName}\"))`);\n lines.push(` page = await async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(' assert isinstance(page, AsyncPage)');\n lines.push(' assert isinstance(page.data, list)');\n\n lines.push('');\n pushAsyncTestDef(lines, ` async def test_${method}_empty_page(self, async_workos, httpx_mock):`);\n lines.push(' httpx_mock.add_response(json={\"data\": [], \"list_metadata\": {}})');\n lines.push(` page = await async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(' assert isinstance(page, AsyncPage)');\n lines.push(' assert page.data == []');\n } else {\n lines.push(' httpx_mock.add_response(json={\"data\": [], \"list_metadata\": {}})');\n lines.push(` page = await async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(' assert isinstance(page, AsyncPage)');\n }\n } else if (isDelete) {\n const deletePath = buildExpectedPath(op);\n pushAsyncTestDef(lines, ` async def test_${method}(self, async_workos, httpx_mock):`);\n lines.push(' httpx_mock.add_response(status_code=204)');\n lines.push(` result = await async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(' assert result is None');\n lines.push(' request = httpx_mock.get_request()');\n lines.push(` assert request.method == \"DELETE\"`);\n lines.push(` assert request.url.path.endswith(\"/${deletePath}\")`);\n } else if (isRedirectEndpoint(op)) {\n // Redirect methods are sync (def, not async def) even in the async class\n lines.push(` def test_${method}(self, async_workos):`);\n lines.push(` result = async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(' assert isinstance(result, str)');\n lines.push(' assert result.startswith(\"http\")');\n } else if (isAsyncArrayResponse) {\n const modelClass = className(plan.responseModelName!);\n const fixtureName = `${fileName(plan.responseModelName!)}.json`;\n pushAsyncTestDef(lines, ` async def test_${method}(self, async_workos, httpx_mock):`);\n lines.push(` httpx_mock.add_response(json=[load_fixture(\"${fixtureName}\")])`);\n lines.push(` result = await async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(' assert isinstance(result, list)');\n lines.push(` assert len(result) == 1`);\n lines.push(` assert isinstance(result[0], ${modelClass})`);\n } else if (plan.responseModelName) {\n const modelName = plan.responseModelName;\n const fixtureName = `${fileName(modelName)}.json`;\n const modelClass = className(modelName);\n pushAsyncTestDef(lines, ` async def test_${method}(self, async_workos, httpx_mock):`);\n lines.push(` httpx_mock.add_response(json=load_fixture(\"${fixtureName}\"))`);\n lines.push(` result = await async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(` assert isinstance(result, ${modelClass})`);\n // Field-value assertions\n const assertFields = pickAssertableFields(modelName, spec);\n for (const af of assertFields) {\n const op_ = af.isBool ? 'is' : '==';\n lines.push(` assert result.${af.field} ${op_} ${af.value}`);\n }\n // Request assertions\n const expectedPath = buildExpectedPath(op);\n lines.push(' request = httpx_mock.get_request()');\n lines.push(` assert request.method == \"${op.httpMethod.toUpperCase()}\"`);\n lines.push(` assert request.url.path.endswith(\"/${expectedPath}\")`);\n } else {\n const voidPath = buildExpectedPath(op);\n pushAsyncTestDef(lines, ` async def test_${method}(self, async_workos, httpx_mock):`);\n lines.push(' httpx_mock.add_response(json={})');\n lines.push(` await async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(' request = httpx_mock.get_request()');\n lines.push(` assert request.method == \"${op.httpMethod.toUpperCase()}\"`);\n lines.push(` assert request.url.path.endswith(\"/${voidPath}\")`);\n }\n\n if (op.queryParams.length > 0 && !isRedirectEndpoint(op)) {\n const queryArgs = buildQueryEncodingTestArgs(op, spec);\n const queryAssertions = buildQueryEncodingAssertions(op, spec);\n if (queryArgs && queryAssertions.length > 0) {\n const responseSetup = buildQueryEncodingResponseSetup(op, plan);\n lines.push('');\n pushAsyncTestDef(lines, ` async def test_${method}_encodes_query_params(self, async_workos, httpx_mock):`);\n for (const setupLine of responseSetup) {\n lines.push(` ${setupLine}`);\n }\n lines.push(` await async_workos.${propName}.${method}(${queryArgs})`);\n lines.push(' request = httpx_mock.get_request()');\n for (const assertion of queryAssertions) {\n lines.push(` ${assertion}`);\n }\n }\n }\n }\n\n // Generate tests for wrapper (union-split) methods (async)\n emitWrapperTests(lines, resolvedOps, propName, spec, ctx, true);\n\n // Add async RequestOptions propagation test\n const asyncFirstRequestOptionsOp = service.operations.find((op) => !isRedirectEndpoint(op));\n if (asyncFirstRequestOptionsOp) {\n const asyncRoMethod = resolveMethodName(asyncFirstRequestOptionsOp, service, ctx);\n const asyncRoPlan = planOperation(asyncFirstRequestOptionsOp);\n const asyncRoResponseSetup = buildQueryEncodingResponseSetup(asyncFirstRequestOptionsOp, asyncRoPlan);\n const asyncRoArgs = buildTestArgs(\n asyncFirstRequestOptionsOp,\n spec,\n buildHiddenParams(lookupResolved(asyncFirstRequestOptionsOp, resolvedLookup)),\n );\n const asyncRoArgsWithOpts = asyncRoArgs\n ? `${asyncRoArgs}, request_options={\"extra_headers\": {\"X-Custom\": \"value\"}}`\n : 'request_options={\"extra_headers\": {\"X-Custom\": \"value\"}}';\n lines.push('');\n pushAsyncTestDef(\n lines,\n ` async def test_${asyncRoMethod}_with_request_options(self, async_workos, httpx_mock):`,\n );\n for (const setupLine of asyncRoResponseSetup) {\n lines.push(` ${setupLine}`);\n }\n lines.push(` await async_workos.${propName}.${asyncRoMethod}(${asyncRoArgsWithOpts})`);\n lines.push(' request = httpx_mock.get_request()');\n lines.push(' assert request.headers[\"X-Custom\"] == \"value\"');\n }\n\n // Async error tests for the first non-delete operation\n const asyncFirstNonDelete = service.operations.find((op) => !planOperation(op).isDelete && !isRedirectEndpoint(op));\n if (asyncFirstNonDelete) {\n const asyncErrMethod = resolveMethodName(asyncFirstNonDelete, service, ctx);\n const asyncErrArgs = buildTestArgs(\n asyncFirstNonDelete,\n spec,\n buildHiddenParams(lookupResolved(asyncFirstNonDelete, resolvedLookup)),\n );\n lines.push('');\n pushAsyncTestDef(lines, ` async def test_${asyncErrMethod}_unauthorized(self, async_workos, httpx_mock):`);\n lines.push(' httpx_mock.add_response(status_code=401, json={\"message\": \"Unauthorized\"})');\n lines.push(' with pytest.raises(AuthenticationError):');\n lines.push(` await async_workos.${propName}.${asyncErrMethod}(${asyncErrArgs})`);\n lines.push('');\n pushAsyncTestDef(lines, ` async def test_${asyncErrMethod}_not_found(self, httpx_mock):`);\n lines.push(' workos = AsyncWorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(' httpx_mock.add_response(status_code=404, json={\"message\": \"Not found\"})');\n lines.push(' with pytest.raises(NotFoundError):');\n lines.push(` await workos.${propName}.${asyncErrMethod}(${asyncErrArgs})`);\n lines.push(' finally:');\n lines.push(' await workos.close()');\n lines.push('');\n pushAsyncTestDef(lines, ` async def test_${asyncErrMethod}_rate_limited(self, httpx_mock):`);\n lines.push(' workos = AsyncWorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(\n ' httpx_mock.add_response(status_code=429, headers={\"Retry-After\": \"0\"}, json={\"message\": \"Slow down\"})',\n );\n lines.push(' with pytest.raises(RateLimitExceededError):');\n lines.push(` await workos.${propName}.${asyncErrMethod}(${asyncErrArgs})`);\n lines.push(' finally:');\n lines.push(' await workos.close()');\n lines.push('');\n pushAsyncTestDef(lines, ` async def test_${asyncErrMethod}_server_error(self, httpx_mock):`);\n lines.push(' workos = AsyncWorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(' httpx_mock.add_response(status_code=500, json={\"message\": \"Server error\"})');\n lines.push(' with pytest.raises(ServerError):');\n lines.push(` await workos.${propName}.${asyncErrMethod}(${asyncErrArgs})`);\n lines.push(' finally:');\n lines.push(' await workos.close()');\n }\n\n // Async 400/422 error tests for the first non-delete, non-redirect operation\n const asyncFirstErrorTargetOp = service.operations.find(\n (op) => !planOperation(op).isDelete && !isRedirectEndpoint(op),\n );\n if (asyncFirstErrorTargetOp) {\n const asyncWriteMethod = resolveMethodName(asyncFirstErrorTargetOp, service, ctx);\n const asyncWriteArgs = buildTestArgs(\n asyncFirstErrorTargetOp,\n spec,\n buildHiddenParams(lookupResolved(asyncFirstErrorTargetOp, resolvedLookup)),\n );\n\n lines.push('');\n pushAsyncTestDef(lines, ` async def test_${asyncWriteMethod}_bad_request(self, httpx_mock):`);\n lines.push(' workos = AsyncWorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(' httpx_mock.add_response(status_code=400, json={\"message\": \"Bad request\"})');\n lines.push(' with pytest.raises(BadRequestError):');\n lines.push(` await workos.${propName}.${asyncWriteMethod}(${asyncWriteArgs})`);\n lines.push(' finally:');\n lines.push(' await workos.close()');\n\n lines.push('');\n pushAsyncTestDef(lines, ` async def test_${asyncWriteMethod}_unprocessable(self, httpx_mock):`);\n lines.push(' workos = AsyncWorkOSClient(api_key=\"sk_test_123\", client_id=\"client_test\", max_retries=0)');\n lines.push(' try:');\n lines.push(' httpx_mock.add_response(status_code=422, json={\"message\": \"Unprocessable\"})');\n lines.push(' with pytest.raises(UnprocessableEntityError):');\n lines.push(` await workos.${propName}.${asyncWriteMethod}(${asyncWriteArgs})`);\n lines.push(' finally:');\n lines.push(' await workos.close()');\n }\n\n return {\n path: `tests/test_${fileName(resolvedName)}.py`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n };\n}\n\n/**\n * Emit tests for wrapper (union-split) methods.\n *\n * For each resolved operation that has wrappers, emit a test per wrapper\n * that calls the wrapper method, asserts the response type, and verifies\n * that constant defaults appear in the request body.\n */\nfunction emitWrapperTests(\n lines: string[],\n resolvedOps: ResolvedOperation[] | undefined,\n propName: string,\n spec: ApiSpec,\n ctx: EmitterContext,\n isAsync: boolean,\n): void {\n if (!resolvedOps) return;\n\n for (const r of resolvedOps) {\n if (!r.wrappers || r.wrappers.length === 0) continue;\n\n for (const wrapper of r.wrappers) {\n const method = wrapper.name;\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n const responseType = wrapper.responseModelName ? className(wrapper.responseModelName) : null;\n const fixtureName = wrapper.responseModelName ? `${fileName(wrapper.responseModelName)}.json` : null;\n\n // Build test args for required wrapper params\n const argParts: string[] = [];\n for (const { paramName, field, isOptional } of wrapperParams) {\n if (isOptional) continue;\n const pyName = fieldName(paramName);\n const testVal = field ? generateTestValue(field.type, field.name) : '\"test_value\"';\n argParts.push(`${pyName}=${testVal}`);\n }\n const args = argParts.join(', ');\n\n lines.push('');\n if (isAsync) {\n pushAsyncTestDef(lines, ` async def test_${method}(self, async_workos, httpx_mock):`);\n if (fixtureName) {\n lines.push(` httpx_mock.add_response(json=load_fixture(\"${fixtureName}\"))`);\n lines.push(` result = await async_workos.${propName}.${method}(${args})`);\n if (responseType) {\n lines.push(` assert isinstance(result, ${responseType})`);\n }\n } else {\n lines.push(' httpx_mock.add_response(json={})');\n lines.push(` await async_workos.${propName}.${method}(${args})`);\n }\n } else {\n lines.push(` def test_${method}(self, workos, httpx_mock):`);\n if (fixtureName) {\n lines.push(` httpx_mock.add_response(json=load_fixture(\"${fixtureName}\"))`);\n lines.push(` result = workos.${propName}.${method}(${args})`);\n if (responseType) {\n lines.push(` assert isinstance(result, ${responseType})`);\n }\n } else {\n lines.push(' httpx_mock.add_response(json={})');\n lines.push(` workos.${propName}.${method}(${args})`);\n }\n }\n\n // Assert the request body contains the correct defaults\n lines.push(' request = httpx_mock.get_request()');\n lines.push(` assert request.method == \"${r.operation.httpMethod.toUpperCase()}\"`);\n\n if (Object.keys(wrapper.defaults).length > 0) {\n lines.push(' body = json.loads(request.content)');\n for (const [key, value] of Object.entries(wrapper.defaults)) {\n lines.push(` assert body[\"${key}\"] == ${pythonLiteral(value)}`);\n }\n }\n }\n }\n}\n\n/**\n * Pick up to N scalar fields from a model fixture to use for value assertions.\n * Returns tuples of [snake_case_field_name, python_literal_value].\n */\nfunction pickAssertableFields(\n modelName: string,\n spec: ApiSpec,\n maxFields: number = 2,\n): { field: string; value: string; isBool?: boolean }[] {\n const modelMap = new Map(spec.models.map((m) => [m.name, m]));\n const enumMap = new Map(spec.enums.map((e) => [e.name, e]));\n const model = modelMap.get(modelName);\n if (!model) return [];\n\n const fixture = generateModelFixture(model, modelMap, enumMap);\n const results: { field: string; value: string; isBool?: boolean }[] = [];\n\n for (const f of model.fields) {\n if (results.length >= maxFields) break;\n const val = fixture[f.name];\n if (val === undefined || val === null) continue;\n if (typeof val === 'string') {\n // Skip strings containing characters that are hard to represent as Python literals\n if (val.includes('\"') || val.includes(\"'\") || val.includes('{') || val.includes('\\\\') || val.includes('\\n'))\n continue;\n results.push({ field: fieldName(f.name), value: `\"${val}\"` });\n } else if (typeof val === 'boolean') {\n // Use \"is True/False\" to satisfy ruff E712\n results.push({ field: fieldName(f.name), value: val ? 'True' : 'False', isBool: true });\n } else if (typeof val === 'number') {\n results.push({ field: fieldName(f.name), value: String(val) });\n }\n }\n return results;\n}\n\n/**\n * Build a Python string literal for the expected request URL suffix.\n * Replaces path params with their test values.\n */\nfunction buildExpectedPath(op: Operation): string {\n let path = op.path.replace(/^\\//, '');\n for (const param of op.pathParams) {\n path = path.replace(`{${param.name}}`, `test_${param.name}`);\n }\n return path;\n}\n\n/**\n * Build test arguments string for an operation call.\n */\nfunction buildTestArgs(op: Operation, spec: ApiSpec, hiddenParams?: Set<string>): string {\n const args: string[] = [];\n\n // Path params as positional args\n for (const param of op.pathParams) {\n args.push(`\"test_${param.name}\"`);\n }\n\n const pathParamNames = new Set(op.pathParams.map((p) => fieldName(p.name)));\n\n // Required body fields as keyword args (matching the expanded-field signature)\n const plan = planOperation(op);\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const requestBodyName = op.requestBody.name;\n const bodyModel = spec.models.find((m) => m.name === requestBodyName);\n if (bodyModel) {\n const reqFields = bodyModel.fields.filter((f) => f.required && !hiddenParams?.has(f.name));\n for (const f of reqFields) {\n const paramName = bodyParamName(f, pathParamNames);\n args.push(`${paramName}=${generateTestValue(f.type, f.name)}`);\n }\n }\n } else if (plan.hasBody && op.requestBody?.kind === 'union') {\n // Union body — pick the first variant model and use its fixture\n const variants = (op.requestBody as any).variants ?? [];\n const firstModelVariant = variants.find((v: any) => v.kind === 'model');\n if (firstModelVariant) {\n args.push(`body=load_fixture(\"${fileName(firstModelVariant.name)}.json\")`);\n } else {\n args.push('body={}');\n }\n }\n\n // Per-operation Bearer token auth (e.g., access_token for SSO)\n const hasBearerOverride = op.security?.some((s) => s.schemeName !== 'bearerAuth') ?? false;\n if (hasBearerOverride) {\n const tokenParamName = fieldName(op.security!.find((s) => s.schemeName !== 'bearerAuth')!.schemeName);\n args.push(`${tokenParamName}=\"test_${tokenParamName}\"`);\n }\n\n // Required query params (for all methods, including paginated)\n if (plan.hasQueryParams) {\n for (const param of op.queryParams) {\n // Skip hidden/injected params\n if (hiddenParams?.has(param.name)) continue;\n // Skip pagination params (they're optional)\n if (plan.isPaginated && ['limit', 'before', 'after', 'order'].includes(param.name)) continue;\n // Skip params already covered by body fields\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const rbName = op.requestBody.name;\n const bodyModel = spec.models.find((m) => m.name === rbName);\n if (bodyModel?.fields.some((f) => fieldName(f.name) === fieldName(param.name))) continue;\n }\n if (param.required && !pathParamNames.has(fieldName(param.name))) {\n args.push(`${fieldName(param.name)}=${generateTestValue(param.type, param.name)}`);\n }\n }\n }\n\n return args.join(', ');\n}\n\nfunction buildQueryEncodingTestArgs(op: Operation, spec: ApiSpec): string {\n const args: string[] = [];\n\n for (const param of op.pathParams) {\n args.push(`\"test_${param.name}\"`);\n }\n\n const pathParamNames = new Set(op.pathParams.map((p) => fieldName(p.name)));\n const plan = planOperation(op);\n\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = spec.models.find((m) => m.name === (op.requestBody as { kind: string; name: string }).name);\n for (const field of bodyModel?.fields.filter((f) => f.required) ?? []) {\n args.push(`${bodyParamName(field, pathParamNames)}=${generateTestValue(field.type, field.name)}`);\n }\n } else if (plan.hasBody && op.requestBody?.kind === 'union') {\n const variants = (op.requestBody as any).variants ?? [];\n const firstModelVariant = variants.find((v: any) => v.kind === 'model');\n args.push(firstModelVariant ? `body=load_fixture(\"${fileName(firstModelVariant.name)}.json\")` : 'body={}');\n }\n\n if (plan.isPaginated) {\n args.push('limit=10');\n args.push('before=\"cursor before\"');\n args.push('after=\"cursor/after\"');\n const orderParam = op.queryParams.find((param) => param.name === 'order');\n if (orderParam) {\n args.push(`order=${generateQueryEncodingValue(orderParam.type, 'order')}`);\n }\n }\n\n for (const param of op.queryParams) {\n if (plan.isPaginated && ['limit', 'before', 'after', 'order'].includes(param.name)) continue;\n // Include explode=false array params; skip other array params (complex serialization)\n if (param.type.kind === 'array' && (param as any).explode !== false) continue;\n const paramName = fieldName(param.name);\n if (pathParamNames.has(paramName)) continue;\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = spec.models.find((m) => m.name === (op.requestBody as { kind: string; name: string }).name);\n if (bodyModel?.fields.some((field) => bodyParamName(field, pathParamNames) === paramName)) continue;\n }\n if ((param as any).explode === false && param.type.kind === 'array') {\n args.push(`${paramName}=[\"val1\", \"val2\"]`);\n } else {\n args.push(`${paramName}=${generateQueryEncodingValue(param.type, param.name)}`);\n }\n }\n\n return args.join(', ');\n}\n\nfunction buildQueryEncodingResponseSetup(op: Operation, plan: ReturnType<typeof planOperation>): string[] {\n if (plan.isPaginated) {\n return ['httpx_mock.add_response(json={\"data\": [], \"list_metadata\": {}})'];\n }\n if (plan.isDelete) {\n return ['httpx_mock.add_response(status_code=204)'];\n }\n if (op.response.kind === 'array') {\n if (op.response.items.kind === 'model') {\n return [`httpx_mock.add_response(json=[load_fixture(\"${fileName(op.response.items.name)}.json\")])`];\n }\n return ['httpx_mock.add_response(json=[])'];\n }\n if (plan.responseModelName) {\n return [`httpx_mock.add_response(json=load_fixture(\"${fileName(plan.responseModelName)}.json\"))`];\n }\n return ['httpx_mock.add_response(json={})'];\n}\n\nfunction buildQueryEncodingAssertions(op: Operation, spec: ApiSpec): string[] {\n const assertions: string[] = [];\n const plan = planOperation(op);\n const pathParamNames = new Set(op.pathParams.map((param) => fieldName(param.name)));\n\n if (plan.isPaginated) {\n assertions.push('assert request.url.params[\"limit\"] == \"10\"');\n assertions.push('assert request.url.params[\"before\"] == \"cursor before\"');\n assertions.push('assert request.url.params[\"after\"] == \"cursor/after\"');\n const orderParam = op.queryParams.find((param) => param.name === 'order');\n if (orderParam) {\n assertions.push(\n `assert request.url.params[\"order\"] == ${toPythonLiteral(expectedQueryEncodingValue(orderParam.type, 'order'))}`,\n );\n }\n }\n\n for (const param of op.queryParams) {\n if (plan.isPaginated && ['limit', 'before', 'after', 'order'].includes(param.name)) continue;\n // Include explode=false array params; skip other array params (complex serialization)\n if (param.type.kind === 'array' && (param as any).explode !== false) continue;\n const paramName = fieldName(param.name);\n if (pathParamNames.has(paramName)) continue;\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = spec.models.find(\n (model) => model.name === (op.requestBody as { kind: string; name: string }).name,\n );\n if (bodyModel?.fields.some((field) => bodyParamName(field, pathParamNames) === paramName)) continue;\n }\n if ((param as any).explode === false && param.type.kind === 'array') {\n assertions.push(`assert request.url.params[\"${param.name}\"] == \"val1,val2\"`);\n } else {\n assertions.push(\n `assert request.url.params[\"${param.name}\"] == ${toPythonLiteral(expectedQueryEncodingValue(param.type, param.name))}`,\n );\n }\n }\n\n return assertions;\n}\n\n/**\n * Generate a representative Python value literal for a given type, for use in tests.\n */\nfunction generateTestValue(ref: TypeRef, name: string): string {\n switch (ref.kind) {\n case 'primitive':\n switch (ref.type) {\n case 'string':\n return `\"test_${name}\"`;\n case 'integer':\n return '1';\n case 'number':\n return '1.0';\n case 'boolean':\n return 'True';\n default:\n return '{}';\n }\n case 'array':\n return '[]';\n case 'enum': {\n const enumValues = (ref as any).values as (string | number)[] | undefined;\n const enumClass = className(ref.name);\n if (enumValues && enumValues.length > 0) {\n const first = enumValues[0];\n const literal = typeof first === 'string' ? `\"${first}\"` : String(first);\n return `${enumClass}(${literal})`;\n }\n return `${enumClass}(\"test\")`;\n }\n case 'model':\n return `${className(ref.name)}.from_dict(load_fixture(\"${fileName(ref.name)}.json\"))`;\n case 'nullable':\n return generateTestValue(ref.inner, name);\n case 'map':\n return '{}';\n case 'literal':\n return typeof ref.value === 'string' ? `\"${ref.value}\"` : String(ref.value);\n case 'union':\n if (ref.variants.length > 0) return generateTestValue(ref.variants[0], name);\n return 'None';\n default:\n return '{}';\n }\n}\n\nfunction generateQueryEncodingValue(ref: TypeRef, name: string): string {\n switch (ref.kind) {\n case 'primitive':\n switch (ref.type) {\n case 'string':\n return `\"${expectedQueryEncodingValue(ref, name)}\"`;\n case 'integer':\n return '7';\n case 'number':\n return '7.5';\n case 'boolean':\n return 'True';\n default:\n return '{}';\n }\n case 'enum': {\n const value = expectedQueryEncodingValue(ref, name);\n return `${className(ref.name)}(\"${value}\")`;\n }\n case 'nullable':\n return generateQueryEncodingValue(ref.inner, name);\n case 'literal':\n return toPythonLiteral(ref.value);\n default:\n return generateTestValue(ref, name);\n }\n}\n\nfunction expectedQueryEncodingValue(ref: TypeRef, name: string): string | number {\n switch (ref.kind) {\n case 'primitive':\n switch (ref.type) {\n case 'string':\n return `value ${name}/test`;\n case 'integer':\n return 7;\n case 'number':\n return 7.5;\n case 'boolean':\n return 'true';\n default:\n return `value ${name}`;\n }\n case 'enum': {\n const enumValues = (ref as any).values as (string | number)[] | undefined;\n if (enumValues && enumValues.length > 0) return enumValues[0];\n return `value_${name}`;\n }\n case 'nullable':\n return expectedQueryEncodingValue(ref.inner, name);\n case 'literal': {\n const v = ref.value;\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n return v ?? `value_${name}`;\n }\n default:\n return `value_${name}`;\n }\n}\n\nfunction buildMinimalModelPayload(model: Model, fixture: Record<string, unknown>): Record<string, unknown> {\n const payload: Record<string, unknown> = {};\n for (const field of model.fields) {\n if (!field.required) continue;\n if (field.type.kind === 'nullable') {\n payload[field.name] = null;\n continue;\n }\n payload[field.name] = fixture[field.name];\n }\n return payload;\n}\n\nfunction buildPayloadWithoutOptionalNonNullableFields(\n model: Model,\n fixture: Record<string, unknown>,\n): Record<string, unknown> {\n const payload: Record<string, unknown> = { ...fixture };\n for (const field of model.fields) {\n if (!field.required && field.type.kind !== 'nullable') {\n delete payload[field.name];\n }\n }\n return payload;\n}\n\nfunction buildPayloadWithNullableFieldsSetToNull(\n model: Model,\n fixture: Record<string, unknown>,\n): Record<string, unknown> | null {\n const nullableFields = model.fields.filter((field) => field.type.kind === 'nullable');\n if (nullableFields.length === 0) return null;\n const payload: Record<string, unknown> = { ...fixture };\n for (const field of nullableFields) {\n payload[field.name] = null;\n }\n return payload;\n}\n\nfunction buildPayloadWithUnknownEnumValue(\n model: Model,\n fixture: Record<string, unknown>,\n): Record<string, unknown> | null {\n const payload: Record<string, unknown> = { ...fixture };\n const enumField = model.fields.find((field) => field.type.kind === 'enum');\n if (!enumField) return null;\n payload[enumField.name] = `unexpected_${fileName(model.name)}_${fieldName(enumField.name)}`;\n return payload;\n}\n\nfunction toPythonLiteral(value: unknown): string {\n if (value === null) return 'None';\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number' || typeof value === 'boolean')\n return JSON.stringify(value).replace('true', 'True').replace('false', 'False');\n if (Array.isArray(value)) return `[${value.map((item) => toPythonLiteral(item)).join(', ')}]`;\n if (typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>).map(\n ([key, inner]) => `${JSON.stringify(key)}: ${toPythonLiteral(inner)}`,\n );\n return `{${entries.join(', ')}}`;\n }\n return 'None';\n}\n\n/**\n * Generate model round-trip tests: Model.from_dict(instance.to_dict()) == instance\n */\nfunction generateModelRoundTripTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile | null {\n // Collect models used as request bodies only (not returned in responses)\n const responseModelNames = new Set<string>();\n const requestOnlyModelNames = new Set<string>();\n for (const svc of spec.services) {\n for (const op of svc.operations) {\n const plan = planOperation(op);\n if (plan.responseModelName) responseModelNames.add(plan.responseModelName);\n if (op.requestBody?.kind === 'model') requestOnlyModelNames.add(op.requestBody.name);\n // Also collect union body variant models as request-only\n if (op.requestBody?.kind === 'union') {\n for (const v of (op.requestBody as any).variants ?? []) {\n if (v.kind === 'model') requestOnlyModelNames.add(v.name);\n }\n }\n }\n }\n // A model is request-only if it's used as a request body but never as a response\n for (const name of responseModelNames) requestOnlyModelNames.delete(name);\n\n const models = spec.models.filter(\n (m) => !isListWrapperModel(m) && !isListMetadataModel(m) && !requestOnlyModelNames.has(m.name),\n );\n if (models.length === 0) return null;\n\n const modelToService = assignModelsToServices(spec.models, spec.services);\n const roundTripDirMap = buildMountDirMap(ctx);\n const resolveDir = (irService: string | undefined) =>\n irService ? (roundTripDirMap.get(irService) ?? 'common') : 'common';\n\n const lines: string[] = [];\n lines.push('\"\"\"Model round-trip tests: from_dict(to_dict()) preserves data.\"\"\"');\n lines.push('');\n lines.push('import pytest');\n lines.push('');\n lines.push('from tests.generated_helpers import load_fixture');\n lines.push('');\n\n // Collect imports by directory\n const importsByDir = new Map<string, string[]>();\n for (const model of models) {\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n if (!importsByDir.has(dirName)) importsByDir.set(dirName, []);\n importsByDir.get(dirName)!.push(className(model.name));\n }\n\n for (const [dirName, names] of [...importsByDir].sort()) {\n lines.push(`from ${ctx.namespace}.${dirToModule(dirName)}.models import ${names.sort().join(', ')}`);\n }\n\n lines.push('');\n lines.push('');\n lines.push('class TestModelRoundTrip:');\n\n for (const model of models) {\n // Skip models with no fields — these are typically discriminated unions\n // with hand-maintained @oagen-ignore overrides whose fixtures would not match.\n if (model.fields.length === 0) continue;\n // Deduplicate fields that map to the same snake_case name (mirrors models.ts)\n const seenFieldNames = new Set<string>();\n const dedupFields = model.fields.filter((f) => {\n const pyName = fieldName(f.name);\n if (seenFieldNames.has(pyName)) return false;\n seenFieldNames.add(pyName);\n return true;\n });\n const dedupModel = { ...model, fields: dedupFields };\n\n const modelClass = className(model.name);\n const fixtureName = `${fileName(model.name)}.json`;\n const fullFixture = generateModelFixture(\n dedupModel,\n new Map(spec.models.map((m) => [m.name, m])),\n new Map(spec.enums.map((e) => [e.name, e])),\n );\n const minimalPayload = buildMinimalModelPayload(dedupModel, fullFixture);\n const absentOptionalPayload = buildPayloadWithoutOptionalNonNullableFields(dedupModel, fullFixture);\n const nullablePayload = buildPayloadWithNullableFieldsSetToNull(dedupModel, fullFixture);\n const unknownEnumPayload = buildPayloadWithUnknownEnumValue(dedupModel, fullFixture);\n\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_round_trip(self):`);\n lines.push(` data = load_fixture(\"${fixtureName}\")`);\n lines.push(` instance = ${modelClass}.from_dict(data)`);\n lines.push(' serialized = instance.to_dict()');\n lines.push(' assert serialized == data');\n lines.push(` restored = ${modelClass}.from_dict(serialized)`);\n lines.push(' assert restored.to_dict() == serialized');\n\n const requiredFields = dedupFields.filter((field) => field.required);\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_minimal_payload(self):`);\n lines.push(` data = ${toPythonLiteral(minimalPayload)}`);\n lines.push(` instance = ${modelClass}.from_dict(data)`);\n if (requiredFields.length > 0) {\n lines.push(' serialized = instance.to_dict()');\n for (const field of requiredFields) {\n lines.push(` assert serialized[${toPythonLiteral(field.name)}] == data[${toPythonLiteral(field.name)}]`);\n }\n } else {\n lines.push(' assert instance.to_dict() is not None');\n }\n\n if (Object.keys(absentOptionalPayload).length !== Object.keys(fullFixture).length) {\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_omits_absent_optional_non_nullable_fields(self):`);\n lines.push(` data = ${toPythonLiteral(absentOptionalPayload)}`);\n lines.push(` instance = ${modelClass}.from_dict(data)`);\n lines.push(' serialized = instance.to_dict()');\n for (const field of dedupFields.filter((field) => !field.required && field.type.kind !== 'nullable')) {\n lines.push(` assert ${toPythonLiteral(field.name)} not in serialized`);\n }\n }\n\n if (nullablePayload) {\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_preserves_nullable_fields(self):`);\n lines.push(` data = ${toPythonLiteral(nullablePayload)}`);\n lines.push(` instance = ${modelClass}.from_dict(data)`);\n lines.push(' serialized = instance.to_dict()');\n for (const field of dedupFields.filter((field) => field.type.kind === 'nullable')) {\n lines.push(` assert serialized[${toPythonLiteral(field.name)}] is None`);\n }\n }\n\n if (unknownEnumPayload) {\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_round_trips_unknown_enum_values(self):`);\n lines.push(` data = ${toPythonLiteral(unknownEnumPayload)}`);\n lines.push(` instance = ${modelClass}.from_dict(data)`);\n lines.push(' assert instance.to_dict() == data');\n }\n }\n\n return {\n path: 'tests/test_models_round_trip.py',\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n };\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { resolveMethodName } from './naming.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Generate smoke test manifest mapping HTTP operations to SDK methods.\n */\nexport function generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const manifest: Record<string, { sdkMethod: string; service: string }> = {};\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n\n for (const service of spec.services) {\n // For mounted services, look up the mount target's access path\n let propName = accessPaths.get(service.name);\n if (!propName) {\n const mountTarget = getMountTarget(service, ctx);\n propName = accessPaths.get(mountTarget);\n }\n if (!propName) {\n throw new Error(`Missing public client access path for service ${service.name}`);\n }\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const method = resolveMethodName(op, service, ctx);\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return [\n {\n path: 'smoke-manifest.json',\n content: JSON.stringify(manifest, null, 2),\n integrateTarget: false,\n overwriteExisting: true,\n },\n ];\n}\n","import type {\n Emitter,\n EmitterContext,\n FormatCommand,\n GeneratedFile,\n ApiSpec,\n Model,\n Enum,\n Service,\n} from '@workos/oagen';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { generateModels } from './models.js';\nimport { generateEnums } from './enums.js';\nimport { generateResources } from './resources.js';\nimport { generateClient } from './client.js';\nimport { generateTests } from './tests.js';\nimport { generateManifest } from './manifest.js';\n/** Ensure every generated file's content ends with a trailing newline. */\nfunction ensureTrailingNewlines(files: GeneratedFile[]): GeneratedFile[] {\n for (const f of files) {\n if (f.content && !f.content.endsWith('\\n')) {\n f.content += '\\n';\n }\n }\n return files;\n}\n\nexport const pythonEmitter: Emitter = {\n language: 'python',\n\n generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateModels(models, ctx));\n },\n\n generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateEnums(enums, ctx));\n },\n\n generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateResources(services, ctx));\n },\n\n generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateClient(spec, ctx));\n },\n\n generateErrors(): GeneratedFile[] {\n // _errors.py is now hand-maintained in the target SDK (@oagen-ignore-file)\n return [];\n },\n\n generateTypeSignatures(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n void spec;\n void ctx;\n // Python uses inline type annotations — no separate type signature files needed\n return [];\n },\n\n generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateTests(spec, ctx));\n },\n\n generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateManifest(spec, ctx));\n },\n\n fileHeader(): string {\n return '# This file is auto-generated by oagen. Do not edit.';\n },\n\n formatCommand(targetDir: string): FormatCommand | null {\n const hasRuff =\n fs.existsSync(path.join(targetDir, 'ruff.toml')) || fs.existsSync(path.join(targetDir, '.ruff.toml'));\n // Also check pyproject.toml for [tool.ruff] section\n const pyproject = path.join(targetDir, 'pyproject.toml');\n const hasRuffInPyproject = fs.existsSync(pyproject) && fs.readFileSync(pyproject, 'utf8').includes('[tool.ruff]');\n // Check for noxfile that uses ruff\n const noxfile = path.join(targetDir, 'noxfile.py');\n const hasRuffInNox = fs.existsSync(noxfile) && fs.readFileSync(noxfile, 'utf8').includes('ruff');\n\n if (hasRuff || hasRuffInPyproject || hasRuffInNox) {\n return {\n cmd: 'bash',\n args: [\n '-c',\n 'PY_FILES=$(printf \"%s\\\\n\" \"$@\" | grep \"\\\\.py$\"); [ -n \"$PY_FILES\" ] && echo \"$PY_FILES\" | xargs ruff check --fix --quiet 2>/dev/null; [ -n \"$PY_FILES\" ] && echo \"$PY_FILES\" | xargs ruff format --quiet',\n '--',\n ],\n };\n }\n return null;\n },\n};\n","import type { Service, Operation, EmitterContext, Enum } from '@workos/oagen';\nimport { toPascalCase, toCamelCase, toSnakeCase } from '@workos/oagen';\nimport { buildResolvedLookup, lookupMethodName } from '../shared/resolved-ops.js';\nimport { stripUrnPrefix, applyAcronymFixes } from '../shared/naming-utils.js';\n\n/** Namespace grouping result (shared with client.ts). */\nexport interface NamespaceGroup {\n prefix: string;\n entries: { service: Service; subProp: string; resolvedName: string }[];\n baseEntry?: { service: Service; resolvedName: string };\n}\n\n/** Grouping result returned by groupServicesByNamespace. */\nexport interface NamespaceGrouping {\n standalone: { service: Service; prop: string; resolvedName: string }[];\n namespaces: NamespaceGroup[];\n}\n\n/**\n * PHP reserved class names that would collide with builtins.\n */\nconst PHP_RESERVED_CLASS_NAMES = new Set([\n 'Array',\n 'List',\n 'Callable',\n 'Iterable',\n 'Mixed',\n 'Never',\n 'Null',\n 'Object',\n 'Self',\n 'Static',\n 'Void',\n 'True',\n 'False',\n 'Int',\n 'Float',\n 'String',\n 'Bool',\n]);\n\n// ─── Enum deduplication ───────────────────────────────────────────────\n\nlet enumAliasMap = new Map<string, string>();\n\n/**\n * Initialize enum deduplication by hashing sorted enum case values.\n * Enums with identical value sets are aliased to the one with the shortest PHP class name.\n */\nexport function initializeEnumDedup(enums: Enum[]): void {\n enumAliasMap = new Map();\n const groups = new Map<string, Enum[]>();\n\n for (const e of enums) {\n const hash = [...e.values]\n .sort((a, b) => String(a.value).localeCompare(String(b.value)))\n .map((v) => String(v.value))\n .join('\\0');\n if (!groups.has(hash)) groups.set(hash, []);\n groups.get(hash)!.push(e);\n }\n\n for (const [, group] of groups) {\n if (group.length <= 1) continue;\n // Pick shortest PHP class name as canonical\n const sorted = [...group].sort((a, b) => className(a.name).length - className(b.name).length);\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n enumAliasMap.set(sorted[i].name, canonical.name);\n }\n }\n}\n\n/** Resolve an enum name to its canonical (deduplicated) name. */\nexport function resolveEnumName(name: string): string {\n return enumAliasMap.get(name) ?? name;\n}\n\n/** PHP class name for an enum, with dedup resolution + PascalCase + acronym preservation. */\nexport function enumClassName(name: string): string {\n return className(resolveEnumName(name));\n}\n\n/** PascalCase class name with acronym preservation. */\nexport function className(name: string): string {\n let result = applyAcronymFixes(toPascalCase(stripUrnPrefix(name)));\n if (PHP_RESERVED_CLASS_NAMES.has(result)) {\n result += 'Model';\n }\n return result;\n}\n\n/** PascalCase file name (without extension) — PSR-4 convention. */\nexport function fileName(name: string): string {\n return className(name);\n}\n\n/** camelCase method name. */\nexport function methodName(name: string): string {\n return toCamelCase(name);\n}\n\n/** Resolve the SDK method name for an operation, using resolved operations first. */\nexport function resolveMethodName(op: Operation, _service: Service, ctx: EmitterContext): string {\n const lookup = buildResolvedLookup(ctx);\n const resolved = lookupMethodName(op, lookup);\n if (resolved) return toCamelCase(resolved);\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup?.methodByOperation?.get(httpKey);\n if (existing) return existing.methodName;\n return toCamelCase(op.name);\n}\n\n/** camelCase field/property name. */\nexport function fieldName(name: string): string {\n return toCamelCase(name);\n}\n\n/** snake_case name for fixtures and other snake_case contexts. */\nexport function snakeName(name: string): string {\n return toSnakeCase(stripUrnPrefix(name));\n}\n\n/** snake_case wire name (preserves the original API field name). */\nexport function wireName(name: string): string {\n return toSnakeCase(name);\n}\n\n/** camelCase property name for service accessors on the client. */\nexport function servicePropertyName(name: string): string {\n return toCamelCase(name);\n}\n\n/** Resolve the effective service name, using the overlay-resolved class name. */\nexport function resolveServiceName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n/** Build a map from IR service name to resolved service name. */\nexport function buildServiceNameMap(services: Service[], ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of services) {\n map.set(service.name, resolveServiceName(service, ctx));\n }\n return map;\n}\n\n/** Resolve the SDK class name for a service, using resolved operations' mountOn. */\nexport function resolveClassName(service: Service, ctx: EmitterContext): string {\n // Use resolved ops mountOn as canonical class name\n for (const r of ctx.resolvedOperations ?? []) {\n if (r.service.name === service.name) return r.mountOn;\n }\n // Fallback to overlay, then IR name\n if (ctx.overlayLookup?.methodByOperation) {\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup.methodByOperation.get(httpKey);\n if (existing) return existing.className;\n }\n }\n return toPascalCase(service.name);\n}\n\n/** Resolve the type name for a model, checking overlay first. */\nexport function resolveTypeName(name: string, ctx: EmitterContext): string {\n const existing = ctx.overlayLookup?.interfaceByName?.get(name);\n if (existing) return existing;\n return toPascalCase(stripUrnPrefix(name));\n}\n\n// ─── Service grouping ─────────────────────────────────────────────────\n\n/**\n * Group services by shared camelCase prefix for nested namespaces.\n */\nexport function groupServicesByNamespace(services: Service[], ctx: EmitterContext): NamespaceGrouping {\n // Build entries, deduplicating props — when the overlay causes two services to\n // resolve to the same accessor name (e.g., OrganizationDomains → Organizations),\n // fall back to the IR name for the duplicate to keep both reachable.\n const usedProps = new Set<string>();\n const entries = services.map((service) => {\n const resolvedName = resolveClassName(service, ctx);\n let prop = servicePropertyName(resolvedName);\n if (usedProps.has(prop)) {\n // Collision — fall back to the raw IR service name\n prop = servicePropertyName(toPascalCase(service.name));\n }\n usedProps.add(prop);\n return { service, prop, resolvedName };\n });\n\n const allProps = new Set(entries.map((e) => e.prop));\n const VIRTUAL_NAMESPACES = new Set(['userManagement']);\n\n // Count how many property names contain each possible camelCase prefix\n // For PHP we use the snake_case version for prefix detection then convert back\n const snakeEntries = entries.map((e) => ({ ...e, snakeProp: toSnakeCase(e.prop) }));\n const prefixCount = new Map<string, number>();\n for (const entry of snakeEntries) {\n prefixCount.set(entry.snakeProp, (prefixCount.get(entry.snakeProp) || 0) + 1);\n const parts = entry.snakeProp.split('_');\n for (let len = 1; len < parts.length; len++) {\n const prefix = parts.slice(0, len).join('_');\n prefixCount.set(prefix, (prefixCount.get(prefix) || 0) + 1);\n }\n }\n\n const entryPrefix = new Map<string, string>();\n for (const entry of snakeEntries) {\n const parts = entry.snakeProp.split('_');\n for (let len = parts.length - 1; len >= 1; len--) {\n const prefix = parts.slice(0, len).join('_');\n const camelPrefix = toCamelCase(prefix);\n if (\n (prefixCount.get(prefix) ?? 0) >= 2 &&\n prefix !== entry.snakeProp &&\n (allProps.has(camelPrefix) || VIRTUAL_NAMESPACES.has(camelPrefix))\n ) {\n entryPrefix.set(entry.prop, camelPrefix);\n break;\n }\n }\n }\n\n const namespacesMap = new Map<string, NamespaceGroup['entries']>();\n const standalone: typeof entries = [];\n\n for (const entry of entries) {\n const prefix = entryPrefix.get(entry.prop);\n if (prefix) {\n if (!namespacesMap.has(prefix)) namespacesMap.set(prefix, []);\n // Compute sub-property: remove prefix from the camelCase name\n const snakePrefix = toSnakeCase(prefix);\n const snakeProp = toSnakeCase(entry.prop);\n const subSnake = snakeProp.slice(snakePrefix.length + 1);\n const subProp = toCamelCase(subSnake);\n namespacesMap.get(prefix)!.push({ service: entry.service, subProp, resolvedName: entry.resolvedName });\n } else {\n standalone.push(entry);\n }\n }\n\n const namespacePrefixes = new Set(namespacesMap.keys());\n const colliding = new Map<string, (typeof entries)[0]>();\n const filteredStandalone = standalone.filter((entry) => {\n if (namespacePrefixes.has(entry.prop)) {\n colliding.set(entry.prop, entry);\n return false;\n }\n return true;\n });\n\n const namespaces: NamespaceGroup[] = [...namespacesMap].map(([prefix, nsEntries]) => ({\n prefix,\n entries: nsEntries,\n baseEntry: colliding.get(prefix)\n ? { service: colliding.get(prefix)!.service, resolvedName: colliding.get(prefix)!.resolvedName }\n : undefined,\n }));\n return { standalone: filteredStandalone, namespaces };\n}\n\n/** Build a map from IR service name to the resolved directory name. */\nexport function buildServiceDirMap(grouping: NamespaceGrouping): Map<string, string> {\n const map = new Map<string, string>();\n for (const entry of grouping.standalone) {\n map.set(entry.service.name, toPascalCase(entry.resolvedName));\n }\n for (const ns of grouping.namespaces) {\n if (ns.baseEntry) {\n map.set(ns.baseEntry.service.name, toPascalCase(ns.prefix));\n }\n for (const entry of ns.entries) {\n map.set(entry.service.name, `${toPascalCase(ns.prefix)}/${toPascalCase(entry.subProp)}`);\n }\n }\n return map;\n}\n","import type { TypeRef, PrimitiveType, UnionType } from '@workos/oagen';\nimport { mapTypeRef as irMapTypeRef } from '@workos/oagen';\nimport { className, enumClassName } from './naming.js';\n\n/**\n * Map an IR TypeRef to a PHP type hint string.\n */\nexport function mapTypeRef(ref: TypeRef, opts?: { qualified?: boolean }): string {\n const qualify = opts?.qualified ?? false;\n const prefix = qualify ? '\\\\WorkOS\\\\Resource\\\\' : '';\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\n array: (_ref, _items) => 'array',\n model: (r) => `${prefix}${className(r.name)}`,\n enum: (r) => `${prefix}${enumClassName(r.name)}`,\n union: (r, variants) => joinUnionVariants(r, variants),\n nullable: (_ref, inner) => `?${inner}`,\n literal: (r) => (typeof r.value === 'number' ? (Number.isInteger(r.value) ? 'int' : 'float') : 'string'),\n map: (_ref, _value) => 'array',\n });\n}\n\n/**\n * Map an IR TypeRef to a PHPDoc type string for richer documentation.\n * Uses fully-qualified names (leading \\) so types resolve correctly\n * regardless of the namespace the docblock appears in.\n */\nexport function mapTypeRefForPHPDoc(ref: TypeRef, opts?: { prefix?: string }): string {\n const prefix = opts?.prefix ?? '\\\\WorkOS\\\\Resource\\\\';\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitiveDoc,\n array: (_ref, items) => `array<${items}>`,\n model: (r) => `${prefix}${className(r.name)}`,\n enum: (r) => `${prefix}${enumClassName(r.name)}`,\n union: (r, variants) => joinDocUnionVariants(r, variants),\n nullable: (_ref, inner) => `${inner}|null`,\n literal: (r) => (typeof r.value === 'string' ? 'string' : typeof r.value === 'number' ? 'int' : 'string'),\n map: (_ref, value) => `array<string, ${value}>`,\n });\n}\n\nfunction mapPrimitive(ref: PrimitiveType): string {\n if (ref.format === 'date-time') return '\\\\DateTimeImmutable';\n switch (ref.type) {\n case 'string':\n return 'string';\n case 'integer':\n return 'int';\n case 'number':\n return 'float';\n case 'boolean':\n return 'bool';\n case 'unknown':\n return 'mixed';\n }\n}\n\nfunction mapPrimitiveDoc(ref: PrimitiveType): string {\n if (ref.format === 'date-time') return '\\\\DateTimeImmutable';\n switch (ref.type) {\n case 'string':\n return 'string';\n case 'integer':\n return 'int';\n case 'number':\n return 'float';\n case 'boolean':\n return 'bool';\n case 'unknown':\n return 'mixed';\n }\n}\n\nfunction joinUnionVariants(ref: UnionType, variants: string[]): string {\n if (ref.compositionKind === 'allOf') {\n return variants[0] ?? 'mixed';\n }\n const unique = [...new Set(variants)];\n if (unique.length === 1) return unique[0];\n return unique.join('|');\n}\n\nfunction joinDocUnionVariants(ref: UnionType, variants: string[]): string {\n if (ref.compositionKind === 'allOf') {\n return variants[0] ?? 'mixed';\n }\n const unique = [...new Set(variants)];\n if (unique.length === 1) return unique[0];\n return unique.join('|');\n}\n","/**\n * Render a PHPDoc comment block from a description string.\n * Handles multiline descriptions by prefixing each line with ` * `.\n * Returns the lines with the given indent (default 0 spaces).\n */\nexport function phpDocComment(description: string, indent = 0): string[] {\n const pad = ' '.repeat(indent);\n const descLines = description.split('\\n');\n if (descLines.length === 1) {\n return [`${pad}/** ${descLines[0]} */`];\n }\n const lines: string[] = [`${pad}/**`];\n for (const line of descLines) {\n lines.push(line === '' ? `${pad} *` : `${pad} * ${line}`);\n }\n lines.push(`${pad} */`);\n return lines;\n}\n","import type { Model, TypeRef, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { mapTypeRef, mapTypeRefForPHPDoc } from './type-map.js';\nimport { className, enumClassName, fieldName } from './naming.js';\nimport { phpDocComment } from './utils.js';\n\n// Import and re-export shared model detection utilities\nimport { isListMetadataModel, isListWrapperModel } from '../shared/model-utils.js';\nexport { isListMetadataModel, isListWrapperModel };\n\n/**\n * Generate PHP model files from IR models.\n */\nexport function generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n if (models.length === 0) return [];\n\n // Build structural hash for deduplication\n const modelHashMap = new Map<string, string>();\n const hashGroups = new Map<string, string[]>();\n for (const model of models) {\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n const hash = structuralHash(model);\n modelHashMap.set(model.name, hash);\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(model.name);\n }\n\n // Pick canonical for each duplicate group (shortest class name wins)\n const aliasOf = new Map<string, string>();\n for (const [hash, names] of hashGroups) {\n if (names.length <= 1) continue;\n if (hash === '') continue;\n const sorted = [...names].sort((a, b) => className(a).length - className(b).length);\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n aliasOf.set(sorted[i], canonical);\n }\n }\n\n const files: GeneratedFile[] = [];\n\n // Emit shared JsonSerializableTrait once\n files.push({\n path: 'lib/Resource/JsonSerializableTrait.php',\n content: [\n `namespace ${ctx.namespacePascal}\\\\Resource;`,\n '',\n 'trait JsonSerializableTrait',\n '{',\n ' public function jsonSerialize(): array',\n ' {',\n ' return $this->toArray();',\n ' }',\n '}',\n ].join('\\n'),\n overwriteExisting: true,\n });\n\n for (const model of models) {\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n if (aliasOf.has(model.name)) continue; // skip structural duplicates\n\n const name = className(model.name);\n const lines: string[] = [];\n\n // No <?php here — the file header from fileHeader() provides it\n lines.push(`namespace ${ctx.namespacePascal}\\\\Resource;`);\n lines.push('');\n if (model.description) {\n lines.push(...phpDocComment(model.description, 0));\n }\n lines.push(`readonly class ${name} implements \\\\JsonSerializable`);\n lines.push('{');\n lines.push(' use JsonSerializableTrait;');\n lines.push('');\n\n // Constructor with promoted properties\n lines.push(' public function __construct(');\n const requiredFields = model.fields.filter((f) => f.required);\n const optionalFields = model.fields.filter((f) => !f.required);\n // Deduplicate fields that map to the same PHP name\n const seenNames = new Set<string>();\n const allFields = [...requiredFields, ...optionalFields].filter((f) => {\n const phpName = fieldName(f.name);\n if (seenNames.has(phpName)) return false;\n seenNames.add(phpName);\n return true;\n });\n\n for (let i = 0; i < allFields.length; i++) {\n const field = allFields[i];\n const phpName = fieldName(field.name);\n const phpType = mapTypeRef(field.type);\n const isOptional = !field.required;\n const comma = i < allFields.length - 1 ? ',' : ',';\n\n const varDocType = mapTypeRefForPHPDoc(field.type);\n const varNullSuffix = isOptional && !varDocType.endsWith('|null') ? '|null' : '';\n const varAnnotation = needsVarAnnotation(field.type) ? `@var ${varDocType}${varNullSuffix}` : null;\n if (field.description || field.deprecated || varAnnotation) {\n const parts: string[] = [];\n if (field.description) parts.push(field.description);\n if (varAnnotation) parts.push(varAnnotation);\n if (field.deprecated) parts.push('@deprecated');\n lines.push(...phpDocComment(parts.join('\\n'), 8));\n }\n\n if (isOptional) {\n const nullableType = phpType.startsWith('?') ? phpType : `?${phpType}`;\n lines.push(` public ${nullableType} $${phpName} = null${comma}`);\n } else {\n lines.push(` public ${phpType} $${phpName}${comma}`);\n }\n }\n lines.push(' ) {');\n lines.push(' }');\n\n // fromArray factory method\n lines.push('');\n lines.push(` public static function fromArray(array $data): self`);\n lines.push(' {');\n lines.push(` return new self(`);\n for (let i = 0; i < allFields.length; i++) {\n const field = allFields[i];\n const phpName = fieldName(field.name);\n const wireName = field.name;\n const comma = i < allFields.length - 1 ? ',' : ',';\n const accessor = generateFromArrayAccessor(field.type, wireName, field.required);\n\n lines.push(` ${phpName}: ${accessor}${comma}`);\n }\n lines.push(' );');\n lines.push(' }');\n\n // toArray method\n lines.push('');\n lines.push(' public function toArray(): array');\n lines.push(' {');\n lines.push(' return [');\n for (const field of allFields) {\n const phpName = fieldName(field.name);\n const wireName = field.name;\n const serialized = generateToArrayValue(field.type, `$this->${phpName}`, !field.required);\n lines.push(` '${wireName}' => ${serialized},`);\n }\n lines.push(' ];');\n lines.push(' }');\n\n lines.push('}');\n\n files.push({\n path: `lib/Resource/${name}.php`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\n/**\n * Generate the fromArray accessor expression for a field.\n */\nfunction generateFromArrayAccessor(ref: TypeRef, wireName: string, required: boolean): string {\n // For nullable types, always guard with isset() regardless of required flag\n const isNullable = ref.kind === 'nullable';\n if (!required || isNullable) {\n const innerRef = isNullable ? ref.inner : ref;\n const inner = generateFromArrayValue(innerRef, `$data['${wireName}']`);\n if (isComplexType(innerRef)) {\n return `isset($data['${wireName}']) ? ${inner} : null`;\n }\n if (isNullable) {\n return `$data['${wireName}'] ?? null`;\n }\n return `$data['${wireName}'] ?? null`;\n }\n // Required field: access directly\n return generateFromArrayValue(ref, `$data['${wireName}']`);\n}\n\n/**\n * Generate the fromArray value expression for a type.\n */\nfunction generateFromArrayValue(ref: TypeRef, accessor: string): string {\n switch (ref.kind) {\n case 'primitive':\n if (ref.format === 'date-time') {\n // Always access directly — nullable fields are already guarded by isset() in\n // generateFromArrayAccessor(). Required fields should error if missing.\n return `new \\\\DateTimeImmutable(${accessor})`;\n }\n return accessor;\n case 'model': {\n const name = className(ref.name);\n return `${name}::fromArray(${accessor})`;\n }\n case 'enum': {\n const name = enumClassName(ref.name);\n return `${name}::from(${accessor})`;\n }\n case 'array':\n if (ref.items.kind === 'model') {\n const itemName = className(ref.items.name);\n return `array_map(fn ($item) => ${itemName}::fromArray($item), ${accessor})`;\n }\n if (ref.items.kind === 'enum') {\n const itemName = enumClassName(ref.items.name);\n return `array_map(fn ($item) => ${itemName}::from($item), ${accessor})`;\n }\n if (ref.items.kind === 'primitive' && ref.items.format === 'date-time') {\n return `array_map(fn ($item) => new \\\\DateTimeImmutable($item), ${accessor})`;\n }\n return accessor;\n case 'nullable':\n return generateFromArrayValue(ref.inner, accessor);\n case 'union':\n return accessor;\n case 'map':\n return accessor;\n case 'literal':\n return accessor;\n }\n}\n\n/**\n * Check if a TypeRef needs special handling (not a simple key access).\n */\nfunction isComplexType(ref: TypeRef): boolean {\n switch (ref.kind) {\n case 'primitive':\n return ref.format === 'date-time';\n case 'model':\n case 'enum':\n return true;\n case 'array':\n return isComplexType(ref.items);\n case 'nullable':\n return isComplexType(ref.inner);\n default:\n return false;\n }\n}\n\n/**\n * Generate the toArray serialization expression for a field value.\n */\nfunction generateToArrayValue(ref: TypeRef, accessor: string, nullable = false): string {\n const ns = nullable ? '?' : '';\n switch (ref.kind) {\n case 'primitive':\n if (ref.format === 'date-time') {\n return `${accessor}${ns}->format(\\\\DateTimeInterface::RFC3339_EXTENDED)`;\n }\n return accessor;\n case 'model':\n return `${accessor}${ns}->toArray()`;\n case 'enum':\n return nullable ? `${accessor}?->value` : `${accessor}->value`;\n case 'array':\n if (ref.items.kind === 'model') {\n return nullable\n ? `${accessor} !== null ? array_map(fn ($item) => $item->toArray(), ${accessor}) : null`\n : `array_map(fn ($item) => $item->toArray(), ${accessor})`;\n }\n if (ref.items.kind === 'enum') {\n return nullable\n ? `${accessor} !== null ? array_map(fn ($item) => $item->value, ${accessor}) : null`\n : `array_map(fn ($item) => $item->value, ${accessor})`;\n }\n if (ref.items.kind === 'primitive' && ref.items.format === 'date-time') {\n return nullable\n ? `${accessor} !== null ? array_map(fn ($item) => $item->format(\\\\DateTimeInterface::RFC3339_EXTENDED), ${accessor}) : null`\n : `array_map(fn ($item) => $item->format(\\\\DateTimeInterface::RFC3339_EXTENDED), ${accessor})`;\n }\n return accessor;\n case 'nullable':\n return generateToArrayValue(ref.inner, accessor, true);\n case 'map':\n return accessor;\n case 'union':\n return accessor;\n case 'literal':\n return accessor;\n }\n}\n\n/**\n * Check if a TypeRef needs a @var PHPDoc annotation because the PHP type hint\n * loses information (e.g., `array` vs `array<ConnectionDomain>`).\n */\nfunction needsVarAnnotation(ref: TypeRef): boolean {\n switch (ref.kind) {\n case 'array':\n case 'map':\n return true;\n case 'nullable':\n return needsVarAnnotation(ref.inner);\n default:\n return false;\n }\n}\n\nfunction structuralHash(model: Model): string {\n return model.fields\n .map((f) => `${f.name}:${JSON.stringify(f.type)}:${f.required}`)\n .sort()\n .join('|');\n}\n","import type { Enum, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { toPascalCase } from '@workos/oagen';\nimport { className, resolveEnumName } from './naming.js';\nimport { phpDocComment } from './utils.js';\n\n/**\n * Generate PHP enum files from IR enums.\n */\nexport function generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n if (enums.length === 0) return [];\n\n const files: GeneratedFile[] = [];\n const emittedCanonical = new Set<string>();\n\n for (const e of enums) {\n const canonical = resolveEnumName(e.name);\n if (emittedCanonical.has(canonical)) continue; // skip aliases\n emittedCanonical.add(canonical);\n\n const name = className(canonical);\n const _isAllStrings = e.values.every((v) => typeof v.value === 'string');\n const isAllInts = e.values.every((v) => typeof v.value === 'number' && Number.isInteger(v.value));\n const backingType = isAllInts ? 'int' : 'string';\n\n const lines: string[] = [];\n // No <?php here — the file header from fileHeader() provides it\n lines.push(`namespace ${ctx.namespacePascal}\\\\Resource;`);\n lines.push('');\n lines.push(`enum ${name}: ${backingType}`);\n lines.push('{');\n\n // Deduplicate case names\n const usedNames = new Map<string, number>();\n for (const val of e.values) {\n let caseName = toPascalCase(val.name.toLowerCase());\n const baseName = caseName;\n const count = usedNames.get(baseName) ?? 0;\n if (count > 0) {\n caseName = `${baseName}${count + 1}`;\n }\n usedNames.set(baseName, count + 1);\n\n if (val.description || val.deprecated) {\n const parts: string[] = [];\n if (val.description) parts.push(val.description);\n if (val.deprecated) parts.push('@deprecated');\n lines.push(...phpDocComment(parts.join('\\n'), 4));\n }\n\n if (typeof val.value === 'string') {\n lines.push(` case ${caseName} = '${val.value}';`);\n } else {\n lines.push(` case ${caseName} = ${val.value};`);\n }\n }\n\n lines.push('}');\n\n files.push({\n path: `lib/Resource/${name}.php`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n","import type { EmitterContext, ResolvedOperation, ResolvedWrapper, TypeRef } from '@workos/oagen';\nimport { toCamelCase } from '@workos/oagen';\nimport { mapTypeRef, mapTypeRefForPHPDoc } from './type-map.js';\nimport { className, fieldName } from './naming.js';\nimport { phpDocComment } from './utils.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\n\n/**\n * Generate PHP wrapper methods for split union operations.\n */\nexport function generateWrapperMethods(resolvedOp: ResolvedOperation, ctx: EmitterContext): string[] {\n const lines: string[] = [];\n for (const wrapper of resolvedOp.wrappers ?? []) {\n emitWrapperMethod(lines, resolvedOp, wrapper, ctx);\n }\n return lines;\n}\n\nfunction emitWrapperMethod(\n lines: string[],\n resolvedOp: ResolvedOperation,\n wrapper: ResolvedWrapper,\n ctx: EmitterContext,\n): void {\n const method = toCamelCase(wrapper.name);\n const ns = ctx.namespacePascal;\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n\n lines.push('');\n\n // PHPDoc block\n const docParts: string[] = [];\n for (const { paramName, field, isOptional } of wrapperParams) {\n const docType = field ? mapTypeRefForPHPDoc(field.type) : 'mixed';\n const nullSuffix = isOptional && !docType.endsWith('|null') ? '|null' : '';\n docParts.push(`@param ${docType}${nullSuffix} $${fieldName(paramName)}`);\n }\n const op2 = resolvedOp.operation;\n const returnDocType = op2.response.kind === 'model' ? `\\\\${ns}\\\\Resource\\\\${className(op2.response.name)}` : 'mixed';\n docParts.push(`@return ${returnDocType}`);\n docParts.push(`@throws \\\\${ns}\\\\Exception\\\\WorkOSException`);\n lines.push(...phpDocComment(docParts.join('\\n'), 4));\n\n lines.push(` public function ${method}(`);\n\n // Build params: required first, then optional, to avoid PHP deprecation\n const requiredParams: string[] = [];\n const optionalParamLines: string[] = [];\n for (const { paramName, field, isOptional } of wrapperParams) {\n const phpName = fieldName(paramName);\n if (field) {\n const phpType = mapTypeRef(field.type);\n if (isOptional) {\n const nullableType = phpType.startsWith('?') ? phpType : `?${phpType}`;\n optionalParamLines.push(` ${nullableType} $${phpName} = null,`);\n } else {\n requiredParams.push(` ${phpType} $${phpName},`);\n }\n } else {\n optionalParamLines.push(` mixed $${phpName} = null,`);\n }\n }\n optionalParamLines.push(` ?\\\\${ns}\\\\RequestOptions $options = null,`);\n for (const p of [...requiredParams, ...optionalParamLines]) {\n lines.push(p);\n }\n\n // Return type\n const op = resolvedOp.operation;\n const responseType = op.response.kind === 'model' ? `\\\\${ns}\\\\Resource\\\\${className(op.response.name)}` : 'mixed';\n lines.push(` ): ${responseType} {`);\n\n // Build body using array_filter for consistency\n const bodyEntries: string[] = [];\n\n // Defaults (always included)\n if (wrapper.defaults) {\n for (const [key, value] of Object.entries(wrapper.defaults)) {\n bodyEntries.push(`'${key}' => ${phpLiteral(value)}`);\n }\n }\n\n // Exposed params (extract enum values)\n for (const { paramName, field } of wrapperParams) {\n const phpName = fieldName(paramName);\n if (field && isEnumType(field.type)) {\n bodyEntries.push(`'${paramName}' => $${phpName}?->value`);\n } else {\n bodyEntries.push(`'${paramName}' => $${phpName}`);\n }\n }\n\n lines.push(' $body = array_filter([');\n for (const entry of bodyEntries) {\n lines.push(` ${entry},`);\n }\n lines.push(' ], fn ($v) => $v !== null);');\n\n // inferFromClient fields need special handling (conditional injection)\n for (const clientField of wrapper.inferFromClient ?? []) {\n const clientExpr = clientFieldExpression(clientField);\n lines.push(` $body['${clientField}'] = ${clientExpr};`);\n }\n\n // Delegate to HTTP client\n const httpMethod = op.httpMethod.toUpperCase();\n let path = op.path.startsWith('/') ? op.path.slice(1) : op.path;\n const hasInterpolation = /\\{[^}]+\\}/.test(path);\n path = path.replace(/\\{([^}]+)\\}/g, (_match, param) => `{$${fieldName(param)}}`);\n const pathQuote = hasInterpolation ? '\"' : \"'\";\n\n lines.push('');\n lines.push(' $response = $this->client->request(');\n lines.push(` method: '${httpMethod}',`);\n lines.push(` path: ${pathQuote}${path}${pathQuote},`);\n lines.push(' body: $body,');\n lines.push(' options: $options,');\n lines.push(' );');\n\n if (op.response.kind === 'model') {\n lines.push(` return ${className(op.response.name)}::fromArray($response);`);\n } else {\n lines.push(' return $response;');\n }\n\n lines.push(' }');\n}\n\nfunction isEnumType(ref: TypeRef): boolean {\n if (ref.kind === 'enum') return true;\n if (ref.kind === 'nullable') return isEnumType(ref.inner);\n return false;\n}\n\nfunction phpLiteral(value: unknown): string {\n if (typeof value === 'string') return `'${value}'`;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return 'null';\n}\n\nfunction clientFieldExpression(field: string): string {\n // Map inferFromClient fields to the actual client/config accessors\n switch (field) {\n case 'client_id':\n return '$this->client->requireClientId()';\n case 'client_secret':\n return '$this->client->requireApiKey()';\n default:\n return `$this->client->${toCamelCase(field)}`;\n }\n}\n","import type { Service, Operation, Model, EmitterContext, GeneratedFile, ResolvedOperation } from '@workos/oagen';\nimport { planOperation, toCamelCase } from '@workos/oagen';\nimport { mapTypeRef, mapTypeRefForPHPDoc } from './type-map.js';\nimport { className, fieldName, resolveMethodName } from './naming.js';\nimport { isListWrapperModel } from './models.js';\nimport {\n groupByMount,\n buildResolvedLookup,\n lookupResolved,\n getOpDefaults,\n getOpInferFromClient,\n} from '../shared/resolved-ops.js';\nimport { generateWrapperMethods } from './wrappers.js';\nimport { phpDocComment } from './utils.js';\n\n/**\n * Resolve the resource class name for a service (used by client.ts).\n */\nexport function resolveResourceClassName(service: Service, ctx: EmitterContext): string {\n for (const r of ctx.resolvedOperations ?? []) {\n if (r.service.name === service.name) return r.mountOn;\n }\n return className(service.name);\n}\n\n/**\n * Generate PHP resource class files from IR services.\n * Uses mount-based grouping: one resource file per mount target.\n */\nexport function generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n if (services.length === 0) return [];\n\n const files: GeneratedFile[] = [];\n const modelMap = new Map(ctx.spec.models.map((m) => [m.name, m]));\n\n // Group operations by mount target\n const mountGroups = groupByMount(ctx);\n const entries: Array<{ name: string; operations: Operation[] }> =\n mountGroups.size > 0\n ? [...mountGroups].map(([name, group]) => ({ name, operations: group.operations }))\n : services.map((s) => ({ name: className(s.name), operations: s.operations }));\n\n for (const { name: mountName, operations } of entries) {\n if (operations.length === 0) continue;\n const resourceName = className(mountName);\n const mergedService: Service = { name: mountName, operations };\n const lines: string[] = [];\n\n // No <?php here — the file header from fileHeader() provides it\n lines.push(`namespace ${ctx.namespacePascal}\\\\Service;`);\n lines.push('');\n\n // Build resolved lookup early — used by both imports and method generation\n const resolvedLookup = buildResolvedLookup(ctx);\n\n // Collect imports\n const imports = collectImports(mergedService, ctx, resolvedLookup);\n for (const imp of imports) {\n lines.push(`use ${imp};`);\n }\n if (imports.length > 0) lines.push('');\n\n lines.push(`class ${resourceName}`);\n lines.push('{');\n lines.push(' public function __construct(');\n lines.push(` private readonly \\\\${ctx.namespacePascal}\\\\HttpClient $client,`);\n lines.push(' ) {');\n lines.push(' }');\n\n // Track emitted method names to avoid duplicates\n const emittedMethods = new Set<string>();\n for (const op of operations) {\n const method = resolveMethodName(op, mergedService, ctx);\n if (emittedMethods.has(method)) continue;\n emittedMethods.add(method);\n const resolved = lookupResolved(op, resolvedLookup);\n\n // When wrappers exist, skip the base method and only emit wrappers\n if (resolved?.wrappers && resolved.wrappers.length > 0) {\n lines.push(...generateWrapperMethods(resolved, ctx));\n } else {\n lines.push('');\n generateMethod(lines, op, mergedService, ctx, modelMap, resolved ?? undefined);\n }\n }\n\n lines.push('}');\n\n files.push({\n path: `lib/Service/${resourceName}.php`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\n/**\n * Check if an operation is a redirect endpoint that should construct a URL\n * instead of making an HTTP request.\n *\n * Detection: GET endpoints with no response body (primitive unknown) and query\n * params are redirect endpoints (e.g., SSO/OAuth authorize and logout flows).\n * Also respects an explicit urlBuilder flag on the resolved operation and\n * catches endpoints with 302 success responses.\n */\nexport function isRedirectEndpoint(op: Operation, resolvedOp?: ResolvedOperation): boolean {\n if ((resolvedOp as any)?.urlBuilder) return true;\n if ((op as any).successResponses?.some((r: any) => r.statusCode >= 300 && r.statusCode < 400)) return true;\n if (\n op.httpMethod === 'get' &&\n op.response.kind === 'primitive' &&\n (op.response as any).type === 'unknown' &&\n op.queryParams.length > 0\n ) {\n return true;\n }\n return false;\n}\n\nfunction generateMethod(\n lines: string[],\n op: Operation,\n service: Service,\n ctx: EmitterContext,\n modelMap: Map<string, Model>,\n resolvedOp?: ResolvedOperation,\n): void {\n const plan = planOperation(op);\n const method = resolveMethodName(op, service, ctx);\n\n // Build the set of params hidden from the method signature\n // (injected from client config or as constant defaults)\n const hiddenParams = new Set<string>([\n ...Object.keys(getOpDefaults(resolvedOp)),\n ...getOpInferFromClient(resolvedOp),\n ]);\n\n const isRedirect = isRedirectEndpoint(op, resolvedOp);\n const params = buildMethodParams(op, plan, modelMap, ctx, hiddenParams);\n const returnType = isRedirect ? 'string' : getReturnType(plan, ctx);\n\n // PHPDoc block\n const docParts: string[] = [];\n if (op.description) docParts.push(op.description);\n const seenDocParams = new Set<string>();\n\n // @param for path params\n for (const p of op.pathParams) {\n const docType = mapTypeRefForPHPDoc(p.type);\n const phpName = fieldName(p.name);\n seenDocParams.add(phpName);\n const prefix = p.deprecated ? '(deprecated) ' : '';\n let desc = p.description ? ` ${prefix}${p.description}` : p.deprecated ? ' (deprecated)' : '';\n if (p.default != null) desc += ` Defaults to ${JSON.stringify(p.default)}.`;\n docParts.push(`@param ${docType} $${phpName}${desc}`);\n }\n\n // @param for body fields\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = modelMap.get(op.requestBody.name);\n if (bodyModel) {\n const bodyParamMap = buildBodyParamMap(op, bodyModel);\n for (const field of bodyModel.fields) {\n if (hiddenParams.has(field.name)) continue;\n const docType = mapTypeRefForPHPDoc(field.type);\n const phpName = bodyParamMap.get(field.name) ?? fieldName(field.name);\n if (seenDocParams.has(phpName)) continue;\n seenDocParams.add(phpName);\n const nullSuffix = !field.required && !docType.endsWith('|null') ? '|null' : '';\n const prefix = field.deprecated ? '(deprecated) ' : '';\n const desc = field.description ? ` ${prefix}${field.description}` : field.deprecated ? ' (deprecated)' : '';\n docParts.push(`@param ${docType}${nullSuffix} $${phpName}${desc}`);\n }\n }\n }\n\n // @param for query params\n for (const q of op.queryParams) {\n if (hiddenParams.has(q.name)) continue;\n const docType = mapTypeRefForPHPDoc(q.type);\n const phpName = fieldName(q.name);\n if (seenDocParams.has(phpName)) continue;\n seenDocParams.add(phpName);\n const nullSuffix = !q.required && !docType.endsWith('|null') ? '|null' : '';\n const prefix = q.deprecated ? '(deprecated) ' : '';\n let desc = q.description ? ` ${prefix}${q.description}` : q.deprecated ? ' (deprecated)' : '';\n if (q.default != null) desc += ` Defaults to ${JSON.stringify(q.default)}.`;\n docParts.push(`@param ${docType}${nullSuffix} $${phpName}${desc}`);\n }\n\n // @return -- use generic annotation for paginated responses\n if (plan.isPaginated && op.pagination?.itemType.kind === 'model') {\n const itemType = op.pagination.itemType;\n const itemModel = ctx.spec.models.find((m) => m.name === itemType.name);\n let resolvedName = itemType.name;\n if (itemModel && isListWrapperModel(itemModel)) {\n const dataField = itemModel.fields.find((f) => f.name === 'data');\n if (dataField?.type.kind === 'array' && dataField.type.items.kind === 'model') {\n resolvedName = dataField.type.items.name;\n }\n }\n const itemClass = className(resolvedName);\n docParts.push(\n `@return \\\\${ctx.namespacePascal}\\\\PaginatedResponse<\\\\${ctx.namespacePascal}\\\\Resource\\\\${itemClass}>`,\n );\n } else {\n docParts.push(`@return ${returnType}`);\n }\n\n // @throws — scope to what the method actually calls\n if (!isRedirect) {\n // HTTP methods can throw any WorkOSException (config, transport, API response)\n docParts.push(`@throws \\\\${ctx.namespacePascal}\\\\Exception\\\\WorkOSException`);\n } else if (getOpInferFromClient(resolvedOp).length > 0) {\n // Redirect endpoints that inject client fields can throw ConfigurationException\n docParts.push(`@throws \\\\${ctx.namespacePascal}\\\\Exception\\\\ConfigurationException`);\n }\n // Redirect endpoints with no inferFromClient: buildUrl() is pure, no @throws\n\n if (op.deprecated) docParts.push('@deprecated');\n lines.push(...phpDocComment(docParts.join('\\n'), 4));\n\n // Method signature\n lines.push(` public function ${method}(`);\n for (let i = 0; i < params.length; i++) {\n const comma = i < params.length - 1 ? ',' : ',';\n lines.push(` ${params[i]}${comma}`);\n }\n lines.push(` ): ${returnType} {`);\n\n // Method body\n const httpMethod = op.httpMethod.toUpperCase();\n const path = buildPathString(op);\n\n if (isRedirect) {\n // Redirect endpoint: construct URL client-side instead of making HTTP request\n const queryLines = buildQueryArray(op, hiddenParams);\n const hasDefaults = Object.keys(getOpDefaults(resolvedOp)).length > 0;\n const hasInferred = getOpInferFromClient(resolvedOp).length > 0;\n const needsQuery = queryLines.length > 0 || hasDefaults || hasInferred;\n\n if (needsQuery) {\n const hasOptionalQuery = op.queryParams.some((q) => !q.required && !hiddenParams.has(q.name));\n if (hasOptionalQuery) {\n lines.push(' $query = array_filter([');\n } else {\n lines.push(' $query = [');\n }\n for (const q of queryLines) {\n lines.push(` ${q}`);\n }\n // Inject constant defaults\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n lines.push(` '${key}' => ${phpLiteral(value)},`);\n }\n if (hasOptionalQuery) {\n lines.push(' ], fn ($v) => $v !== null);');\n } else {\n lines.push(' ];');\n }\n // Inject fields from client config\n for (const clientField of getOpInferFromClient(resolvedOp)) {\n lines.push(` $query['${clientField}'] = ${clientFieldExpression(clientField)};`);\n }\n lines.push(` return $this->client->buildUrl(${path}, $query, $options);`);\n } else {\n lines.push(` return $this->client->buildUrl(${path}, [], $options);`);\n }\n } else if (plan.isPaginated) {\n const queryLines = buildQueryArray(op);\n if (queryLines.length > 0) {\n lines.push(' $query = array_filter([');\n for (const q of queryLines) {\n lines.push(` ${q}`);\n }\n lines.push(' ], fn ($v) => $v !== null);');\n }\n lines.push(' return $this->client->requestPage(');\n lines.push(` method: '${httpMethod}',`);\n lines.push(` path: ${path},`);\n if (queryLines.length > 0) {\n lines.push(' query: $query,');\n }\n const itemType = op.pagination?.itemType;\n if (itemType?.kind === 'model') {\n // Unwrap list wrapper models to the inner item type\n const itemModel = ctx.spec.models.find((m) => m.name === itemType.name);\n let resolvedName = itemType.name;\n if (itemModel && isListWrapperModel(itemModel)) {\n const dataField = itemModel.fields.find((f) => f.name === 'data');\n if (dataField?.type.kind === 'array' && dataField.type.items.kind === 'model') {\n resolvedName = dataField.type.items.name;\n }\n }\n const itemClass = className(resolvedName);\n lines.push(` modelClass: ${itemClass}::class,`);\n }\n lines.push(' options: $options,');\n lines.push(' );');\n } else if (plan.isDelete) {\n // Build body if the operation has a request body (e.g., DELETE with criteria)\n if (plan.hasBody) {\n const bodyModel = op.requestBody?.kind === 'model' ? modelMap.get(op.requestBody.name) : null;\n const bodyParamMap = buildBodyParamMap(op, bodyModel ?? null);\n const visibleFields = bodyModel?.fields.filter((f) => !hiddenParams.has(f.name)) ?? [];\n const hasOptionalFields = visibleFields.some((f) => !f.required);\n if (hasOptionalFields) {\n lines.push(' $body = array_filter([');\n } else {\n lines.push(' $body = [');\n }\n for (const field of visibleFields) {\n const phpName = bodyParamMap.get(field.name) ?? fieldName(field.name);\n const nullsafe = field.required ? '' : '?';\n const valueExpr = isEnumType(field.type) ? `$${phpName}${nullsafe}->value` : `$${phpName}`;\n lines.push(` '${field.name}' => ${valueExpr},`);\n }\n // Inject constant defaults\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n lines.push(` '${key}' => ${phpLiteral(value)},`);\n }\n if (hasOptionalFields) {\n lines.push(' ], fn ($v) => $v !== null);');\n } else {\n lines.push(' ];');\n }\n // Inject fields from client config\n for (const clientField of getOpInferFromClient(resolvedOp)) {\n lines.push(` $body['${clientField}'] = ${clientFieldExpression(clientField)};`);\n }\n }\n // Build query params if present\n const deleteQueryLines = buildQueryArray(op);\n if (deleteQueryLines.length > 0) {\n lines.push(' $query = array_filter([');\n for (const q of deleteQueryLines) {\n lines.push(` ${q}`);\n }\n lines.push(' ], fn ($v) => $v !== null);');\n }\n\n lines.push(' $this->client->request(');\n lines.push(` method: '${httpMethod}',`);\n lines.push(` path: ${path},`);\n if (plan.hasBody) {\n lines.push(' body: $body,');\n }\n if (deleteQueryLines.length > 0) {\n lines.push(' query: $query,');\n }\n lines.push(' options: $options,');\n lines.push(' );');\n } else if (plan.hasBody) {\n const bodyModel = op.requestBody?.kind === 'model' ? modelMap.get(op.requestBody.name) : null;\n const bodyParamMap = buildBodyParamMap(op, bodyModel ?? null);\n const visibleFields = bodyModel?.fields.filter((f) => !hiddenParams.has(f.name)) ?? [];\n const hasOptionalFields = visibleFields.some((f) => !f.required);\n if (hasOptionalFields) {\n lines.push(' $body = array_filter([');\n } else {\n lines.push(' $body = [');\n }\n for (const field of visibleFields) {\n const phpName = bodyParamMap.get(field.name) ?? fieldName(field.name);\n const nullsafe = field.required ? '' : '?';\n const valueExpr = isEnumType(field.type) ? `$${phpName}${nullsafe}->value` : `$${phpName}`;\n lines.push(` '${field.name}' => ${valueExpr},`);\n }\n // Inject constant defaults\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n lines.push(` '${key}' => ${phpLiteral(value)},`);\n }\n if (hasOptionalFields) {\n lines.push(' ], fn ($v) => $v !== null);');\n } else {\n lines.push(' ];');\n }\n // Inject fields from client config\n for (const clientField of getOpInferFromClient(resolvedOp)) {\n lines.push(` $body['${clientField}'] = ${clientFieldExpression(clientField)};`);\n }\n lines.push(' $response = $this->client->request(');\n lines.push(` method: '${httpMethod}',`);\n lines.push(` path: ${path},`);\n lines.push(' body: $body,');\n lines.push(' options: $options,');\n lines.push(' );');\n\n if (plan.responseModelName) {\n const responseClass = className(plan.responseModelName);\n if (op.response.kind === 'array') {\n lines.push(` return array_map(fn ($item) => ${responseClass}::fromArray($item), $response);`);\n } else {\n lines.push(` return ${responseClass}::fromArray($response);`);\n }\n } else {\n lines.push(' return $response;');\n }\n } else {\n const queryLines = buildQueryArray(op, hiddenParams);\n const hasDefaults = Object.keys(getOpDefaults(resolvedOp)).length > 0;\n const hasInferred = getOpInferFromClient(resolvedOp).length > 0;\n const needsQuery = queryLines.length > 0 || hasDefaults || hasInferred;\n\n if (needsQuery) {\n const hasOptionalQuery = op.queryParams.some((q) => !q.required && !hiddenParams.has(q.name));\n if (hasOptionalQuery) {\n lines.push(' $query = array_filter([');\n } else {\n lines.push(' $query = [');\n }\n for (const q of queryLines) {\n lines.push(` ${q}`);\n }\n // Inject constant defaults\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n lines.push(` '${key}' => ${phpLiteral(value)},`);\n }\n if (hasOptionalQuery) {\n lines.push(' ], fn ($v) => $v !== null);');\n } else {\n lines.push(' ];');\n }\n // Inject fields from client config\n for (const clientField of getOpInferFromClient(resolvedOp)) {\n lines.push(` $query['${clientField}'] = ${clientFieldExpression(clientField)};`);\n }\n }\n lines.push(' $response = $this->client->request(');\n lines.push(` method: '${httpMethod}',`);\n lines.push(` path: ${path},`);\n if (needsQuery) {\n lines.push(' query: $query,');\n }\n lines.push(' options: $options,');\n lines.push(' );');\n\n if (plan.responseModelName) {\n const responseClass = className(plan.responseModelName);\n if (op.response.kind === 'array') {\n lines.push(` return array_map(fn ($item) => ${responseClass}::fromArray($item), $response);`);\n } else {\n lines.push(` return ${responseClass}::fromArray($response);`);\n }\n } else {\n lines.push(' return $response;');\n }\n }\n\n lines.push(' }');\n}\n\nfunction buildMethodParams(\n op: Operation,\n plan: ReturnType<typeof planOperation>,\n modelMap: Map<string, Model>,\n ctx: EmitterContext,\n hiddenParams?: Set<string>,\n): string[] {\n // Collect all params into required/optional buckets to avoid\n // PHP's \"required after optional\" deprecation.\n const required: string[] = [];\n const optional: string[] = [];\n const usedNames = new Set<string>();\n const hidden = hiddenParams ?? new Set();\n\n // Path params (always required)\n for (const p of op.pathParams) {\n const phpType = mapTypeRef(p.type, { qualified: true });\n let phpName = fieldName(p.name);\n if (usedNames.has(phpName)) phpName = `path${phpName.charAt(0).toUpperCase()}${phpName.slice(1)}`;\n usedNames.add(phpName);\n required.push(`${phpType} $${phpName}`);\n }\n\n // Body fields\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = modelMap.get(op.requestBody.name);\n if (bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n const phpType = mapTypeRef(field.type, { qualified: true });\n let phpName = fieldName(field.name);\n if (usedNames.has(phpName)) {\n // Disambiguate body field from path param with same name\n phpName = `body${phpName.charAt(0).toUpperCase()}${phpName.slice(1)}`;\n if (usedNames.has(phpName)) continue; // truly duplicate, skip\n }\n usedNames.add(phpName);\n if (field.required) {\n required.push(`${phpType} $${phpName}`);\n } else {\n const nullableType = phpType.startsWith('?') ? phpType : `?${phpType}`;\n optional.push(`${nullableType} $${phpName} = null`);\n }\n }\n }\n }\n\n // Query params\n for (const q of op.queryParams) {\n if (hidden.has(q.name)) continue;\n const phpType = mapTypeRef(q.type, { qualified: true });\n let phpName = fieldName(q.name);\n if (usedNames.has(phpName)) continue;\n usedNames.add(phpName);\n if (q.required) {\n required.push(`${phpType} $${phpName}`);\n } else {\n const nullableType = phpType.startsWith('?') ? phpType : `?${phpType}`;\n optional.push(`${nullableType} $${phpName} = null`);\n }\n }\n\n // RequestOptions (always last, always optional)\n optional.push(`?\\\\${ctx.namespacePascal}\\\\RequestOptions $options = null`);\n\n return [...required, ...optional];\n}\n\nfunction getReturnType(plan: ReturnType<typeof planOperation>, ctx: EmitterContext): string {\n if (plan.isDelete) return 'void';\n if (plan.isPaginated) return `\\\\${ctx.namespacePascal}\\\\PaginatedResponse`;\n if (plan.responseModelName) {\n if (plan.operation.response.kind === 'array') {\n return 'array';\n }\n return `\\\\${ctx.namespacePascal}\\\\Resource\\\\${className(plan.responseModelName)}`;\n }\n return 'mixed';\n}\n\n/**\n * Build a mapping from wire name to PHP variable name for body fields,\n * disambiguating collisions with path param names.\n */\nfunction buildBodyParamMap(op: Operation, bodyModel: Model | null): Map<string, string> {\n const map = new Map<string, string>();\n if (!bodyModel) return map;\n const pathParamNames = new Set(op.pathParams.map((p) => fieldName(p.name)));\n for (const field of bodyModel.fields) {\n let phpName = fieldName(field.name);\n if (pathParamNames.has(phpName)) {\n phpName = `body${phpName.charAt(0).toUpperCase()}${phpName.slice(1)}`;\n }\n map.set(field.name, phpName);\n }\n return map;\n}\n\nfunction buildPathString(op: Operation): string {\n let path = op.path.startsWith('/') ? op.path.slice(1) : op.path;\n if (op.pathParams.length === 0) {\n return `'${path}'`;\n }\n // Build a map of param name → PHP expression (with ->value for enum types)\n const paramExprs = new Map<string, string>();\n for (const p of op.pathParams) {\n const phpName = fieldName(p.name);\n const isEnum = p.type.kind === 'enum' || p.type.kind === 'model';\n paramExprs.set(p.name, isEnum ? `{$${phpName}->value}` : `{$${phpName}}`);\n }\n path = path.replace(/\\{([^}]+)\\}/g, (_match, param) => paramExprs.get(param) ?? `{$${fieldName(param)}}`);\n return `\"${path}\"`;\n}\n\nfunction isEnumType(ref: import('@workos/oagen').TypeRef): boolean {\n if (ref.kind === 'enum') return true;\n if (ref.kind === 'nullable') return isEnumType(ref.inner);\n return false;\n}\n\nfunction buildQueryArray(op: Operation, hiddenParams?: Set<string>): string[] {\n const hidden = hiddenParams ?? new Set();\n return op.queryParams\n .filter((q) => !hidden.has(q.name))\n .map((q) => {\n const phpName = fieldName(q.name);\n if (isEnumType(q.type)) {\n const nullsafe = q.required ? '' : '?';\n return `'${q.name}' => $${phpName}${nullsafe}->value,`;\n }\n return `'${q.name}' => $${phpName},`;\n });\n}\n\nfunction phpLiteral(value: unknown): string {\n if (typeof value === 'string') return `'${value}'`;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return 'null';\n}\n\nfunction clientFieldExpression(field: string): string {\n switch (field) {\n case 'client_id':\n return '$this->client->requireClientId()';\n case 'client_secret':\n return '$this->client->requireApiKey()';\n default:\n return `$this->client->${toCamelCase(field)}`;\n }\n}\n\nfunction collectImports(\n service: Service,\n ctx: EmitterContext,\n resolvedLookup?: Map<string, ResolvedOperation>,\n): string[] {\n const imports = new Set<string>();\n const ns = ctx.namespacePascal;\n\n for (const op of service.operations) {\n const plan = planOperation(op);\n const resolved = resolvedLookup ? lookupResolved(op, resolvedLookup) : undefined;\n if (plan.responseModelName && !plan.isPaginated && !isRedirectEndpoint(op, resolved)) {\n imports.add(`${ns}\\\\Resource\\\\${className(plan.responseModelName)}`);\n }\n if (op.pagination?.itemType.kind === 'model') {\n // Unwrap list wrapper models to import the inner item type\n const itemModel = ctx.spec.models.find((m) => m.name === (op.pagination!.itemType as { name: string }).name);\n let resolvedName = (op.pagination!.itemType as { name: string }).name;\n if (itemModel && isListWrapperModel(itemModel)) {\n const dataField = itemModel.fields.find((f) => f.name === 'data');\n if (dataField?.type.kind === 'array' && dataField.type.items.kind === 'model') {\n resolvedName = dataField.type.items.name;\n }\n }\n imports.add(`${ns}\\\\Resource\\\\${className(resolvedName)}`);\n }\n }\n\n return [...imports].sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n}\n","import type { ApiSpec, Service, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { toPascalCase, toCamelCase } from '@workos/oagen';\nimport { className, servicePropertyName } from './naming.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\nimport { NON_SPEC_SERVICES } from '../shared/non-spec-services.js';\n\n/**\n * PHP-specific class-name overrides for non-spec services.\n * If a service id isn't listed here, PascalCase(id) is used.\n */\nconst PHP_NON_SPEC_CLASS_NAMES: Record<string, string> = {\n webhook_verification: 'WebhookVerification',\n session_manager: 'SessionManager',\n pkce: 'PKCEHelper',\n};\n\n/** Derive PHP class name + property name from a non-spec service id. */\nfunction phpNonSpecAccessor(id: string): { className: string; propName: string } {\n return {\n className: PHP_NON_SPEC_CLASS_NAMES[id] ?? toPascalCase(id),\n propName:\n id === 'webhook_verification'\n ? 'webhookVerification'\n : id === 'session_manager'\n ? 'sessionManager'\n : toCamelCase(id),\n };\n}\n\n/**\n * Generate the main PHP client class (service wiring only).\n *\n * Static infrastructure (HttpClient, PaginatedResponse, RequestOptions) is\n * now hand-maintained in the target SDK with @oagen-ignore-file.\n */\nexport function generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const ns = ctx.namespacePascal;\n const dedupedServices = deduplicateByMount(spec.services, ctx);\n\n return [\n {\n path: `lib/${ns}.php`,\n content: generateMainClient(spec, dedupedServices, ctx),\n overwriteExisting: true,\n },\n ];\n}\n\n/**\n * Build a map from IR service name to the client accessor property name.\n */\nexport function buildServiceAccessPaths(services: Service[], ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of services) {\n const target = getMountTarget(service, ctx);\n map.set(service.name, servicePropertyName(target));\n map.set(target, servicePropertyName(target));\n }\n return map;\n}\n\nfunction deduplicateByMount(services: Service[], ctx: EmitterContext): { name: string; propName: string }[] {\n const seen = new Map<string, { name: string; propName: string }>();\n for (const service of services) {\n const target = getMountTarget(service, ctx);\n if (!seen.has(target)) {\n seen.set(target, {\n name: className(target),\n propName: servicePropertyName(target),\n });\n }\n }\n return [...seen.values()];\n}\n\nfunction generateMainClient(\n spec: ApiSpec,\n services: { name: string; propName: string }[],\n ctx: EmitterContext,\n): string {\n const ns = ctx.namespacePascal;\n const lines: string[] = [];\n\n // No <?php here — the file header from fileHeader() provides it\n lines.push(`namespace ${ns};`);\n lines.push('');\n\n // Use imports (sorted case-insensitively for PSR-12)\n const nonSpecAccessors = NON_SPEC_SERVICES.map((s) => phpNonSpecAccessor(s.id));\n const allImports: string[] = [];\n for (const svc of services) {\n allImports.push(`use ${ns}\\\\Service\\\\${svc.name};`);\n }\n allImports.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n for (const imp of allImports) {\n lines.push(imp);\n }\n lines.push('');\n\n lines.push(`class ${ns}`);\n lines.push('{');\n lines.push(' private static ?string $apiKey = null;');\n lines.push(' private static ?string $clientId = null;');\n lines.push(' private ?HttpClient $httpClient = null;');\n lines.push('');\n lines.push(' public static function getApiKey(): ?string');\n lines.push(' {');\n lines.push(' return self::$apiKey;');\n lines.push(' }');\n lines.push('');\n lines.push(' public static function setApiKey(?string $key): void');\n lines.push(' {');\n lines.push(' self::$apiKey = $key;');\n lines.push(' }');\n lines.push('');\n lines.push(' public static function getClientId(): ?string');\n lines.push(' {');\n lines.push(' return self::$clientId;');\n lines.push(' }');\n lines.push('');\n lines.push(' public static function setClientId(?string $id): void');\n lines.push(' {');\n lines.push(' self::$clientId = $id;');\n lines.push(' }');\n\n // Nullable resource properties\n for (const svc of services) {\n lines.push(` private ?Service\\\\${svc.name} $${svc.propName} = null;`);\n }\n // Non-spec service properties — wrapped in ignore markers so the target\n // SDK can hand-maintain the list. The emitter provides a positional anchor.\n lines.push(' // @oagen-ignore-start — non-spec service properties (hand-maintained)');\n for (const a of nonSpecAccessors) {\n lines.push(` private ?${a.className} $${a.propName} = null;`);\n }\n lines.push(' // @oagen-ignore-end');\n\n lines.push('');\n lines.push(' public function __construct(');\n lines.push(' ?string $apiKey = null,');\n lines.push(' ?string $clientId = null,');\n lines.push(` string $baseUrl = '${spec.baseUrl}',`);\n lines.push(' int $timeout = 60,');\n lines.push(' int $maxRetries = 3,');\n lines.push(' ?\\\\GuzzleHttp\\\\HandlerStack $handler = null,');\n lines.push(' ?string $userAgent = null,');\n lines.push(' ) {');\n lines.push(\" $apiKey ??= getenv('WORKOS_API_KEY') ?: self::$apiKey ?? '';\");\n lines.push(\" $clientId ??= getenv('WORKOS_CLIENT_ID') ?: self::$clientId;\");\n lines.push(\n ' $this->httpClient = new HttpClient($apiKey, $clientId, $baseUrl, $timeout, $maxRetries, $handler, $userAgent);',\n );\n lines.push(' }');\n\n // Resource accessors\n for (const svc of services) {\n lines.push('');\n lines.push(` public function ${svc.propName}(): ${svc.name}`);\n lines.push(' {');\n lines.push(` return $this->${svc.propName} ??= new Service\\\\${svc.name}($this->httpClient);`);\n lines.push(' }');\n }\n\n // Non-spec service accessors — wrapped in ignore markers so the target\n // SDK can hand-maintain these. The emitter provides a positional anchor.\n lines.push('');\n lines.push(' // @oagen-ignore-start — non-spec service accessors (hand-maintained)');\n for (const a of nonSpecAccessors) {\n lines.push('');\n lines.push(` public function ${a.propName}(): ${a.className}`);\n lines.push(' {');\n lines.push(` return $this->${a.propName} ??= new ${a.className}($this->httpClient);`);\n lines.push(' }');\n }\n lines.push(' // @oagen-ignore-end');\n\n lines.push('}');\n return lines.join('\\n');\n}\n","import type { Model, TypeRef, Enum } from '@workos/oagen';\nimport { isListMetadataModel, isListWrapperModel } from './models.js';\nimport { snakeName } from './naming.js';\n\n/**\n * Prefix mapping for generating realistic ID fixture values.\n */\nexport const ID_PREFIXES: Record<string, string> = {\n Connection: 'conn_',\n Organization: 'org_',\n OrganizationMembership: 'om_',\n User: 'user_',\n Directory: 'directory_',\n DirectoryGroup: 'dir_grp_',\n DirectoryUser: 'dir_usr_',\n Invitation: 'inv_',\n Session: 'session_',\n AuthenticationFactor: 'auth_factor_',\n EmailVerification: 'email_verification_',\n MagicAuth: 'magic_auth_',\n PasswordReset: 'password_reset_',\n};\n\n/**\n * Generate JSON fixture files for test data.\n */\nexport function generateFixtures(spec: {\n models: Model[];\n enums: Enum[];\n services: any[];\n}): { path: string; content: string }[] {\n if (spec.models.length === 0) return [];\n\n const modelMap = new Map(spec.models.map((m) => [m.name, m]));\n const enumMap = new Map(spec.enums.map((e) => [e.name, e]));\n const files: { path: string; content: string }[] = [];\n\n for (const model of spec.models) {\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n\n const fixture = generateModelFixture(model, modelMap, enumMap);\n\n files.push({\n path: `tests/Fixtures/${snakeName(model.name)}.json`,\n content: JSON.stringify(fixture, null, 2),\n });\n }\n\n // Generate list fixtures for paginated responses\n for (const service of spec.services) {\n for (const op of service.operations) {\n if (op.pagination) {\n let itemModel = op.pagination.itemType.kind === 'model' ? modelMap.get(op.pagination.itemType.name) : null;\n if (itemModel) {\n const unwrapped = unwrapListModel(itemModel, modelMap);\n if (unwrapped) itemModel = unwrapped;\n if (itemModel.fields.length === 0) continue;\n const fixture = generateModelFixture(itemModel, modelMap, enumMap);\n const listFixture = {\n data: [fixture],\n list_metadata: {\n before: null,\n after: null,\n },\n };\n files.push({\n path: `tests/Fixtures/list_${snakeName(itemModel.name)}.json`,\n content: JSON.stringify(listFixture, null, 2),\n });\n }\n }\n }\n }\n\n return files;\n}\n\nexport function unwrapListModel(model: Model, modelMap: Map<string, Model>): Model | null {\n const dataField = model.fields.find((f) => f.name === 'data');\n const hasListMetadata = model.fields.some((f) => f.name === 'list_metadata' || f.name === 'listMetadata');\n if (dataField && hasListMetadata && dataField.type.kind === 'array') {\n const itemType = dataField.type.items;\n if (itemType.kind === 'model') {\n return modelMap.get(itemType.name) ?? null;\n }\n }\n return null;\n}\n\nexport function generateModelFixture(\n model: Model,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): Record<string, any> {\n const fixture: Record<string, any> = {};\n\n for (const field of model.fields) {\n const wireName = field.name;\n if (field.example !== undefined) {\n fixture[wireName] = field.example;\n } else {\n fixture[wireName] = generateFieldValue(field.type, field.name, model.name, modelMap, enumMap);\n }\n }\n\n return fixture;\n}\n\nfunction generateFieldValue(\n ref: TypeRef,\n fieldName: string,\n modelName: string,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): any {\n switch (ref.kind) {\n case 'primitive':\n return generatePrimitiveValue(ref.type, ref.format, fieldName, modelName);\n case 'literal':\n return ref.value;\n case 'enum': {\n const e = enumMap.get(ref.name);\n return e?.values[0]?.value ?? 'unknown';\n }\n case 'model': {\n const nested = modelMap.get(ref.name);\n if (nested) return generateModelFixture(nested, modelMap, enumMap);\n return {};\n }\n case 'array': {\n if (ref.items.kind === 'enum') {\n const e = enumMap.get(ref.items.name);\n if (e && e.values.length > 0) {\n return e.values.map((v) => v.value);\n }\n }\n const item = generateFieldValue(ref.items, fieldName, modelName, modelMap, enumMap);\n return [item];\n }\n case 'nullable':\n return generateFieldValue(ref.inner, fieldName, modelName, modelMap, enumMap);\n case 'union':\n if (ref.variants.length > 0) {\n return generateFieldValue(ref.variants[0], fieldName, modelName, modelMap, enumMap);\n }\n return null;\n case 'map':\n return {\n key: generateFieldValue(ref.valueType, 'value', modelName, modelMap, enumMap),\n };\n }\n}\n\nfunction generatePrimitiveValue(type: string, format: string | undefined, name: string, modelName: string): any {\n switch (type) {\n case 'string':\n if (format === 'date-time') return '2023-01-01T00:00:00.000Z';\n if (format === 'date') return '2023-01-01';\n if (format === 'uuid') return '00000000-0000-0000-0000-000000000000';\n if (name === 'id') {\n const prefix = ID_PREFIXES[modelName] ?? '';\n return `${prefix}01234`;\n }\n if (name.includes('id')) return `${name}_01234`;\n if (name.includes('email')) return 'test@example.com';\n if (name.includes('url') || name.includes('uri')) return 'https://example.com';\n if (name.includes('name')) return 'Test';\n return `test_${name}`;\n case 'integer':\n return 1;\n case 'number':\n return 1.0;\n case 'boolean':\n return true;\n case 'unknown':\n return {};\n default:\n return null;\n }\n}\n","import type {\n ApiSpec,\n Service,\n Operation,\n EmitterContext,\n GeneratedFile,\n Model,\n ResolvedOperation,\n} from '@workos/oagen';\nimport { planOperation, toCamelCase, toPascalCase } from '@workos/oagen';\nimport { className, enumClassName, resolveMethodName, snakeName, servicePropertyName } from './naming.js';\nimport { isListWrapperModel } from './models.js';\nimport { generateFixtures } from './fixtures.js';\nimport {\n getMountTarget,\n groupByMount,\n buildHiddenParams,\n getOpDefaults,\n getOpInferFromClient,\n} from '../shared/resolved-ops.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\nimport { isRedirectEndpoint } from './resources.js';\n\n/**\n * Generate PHPUnit test files and fixture JSON files.\n */\nexport function generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // TestHelper is now hand-maintained in the target SDK (@oagen-ignore-file).\n\n // Collect all operations per mount target using resolved per-operation mounts.\n // This correctly handles operationHint mountOn overrides (e.g., audit_logs_retention → AuditLogs).\n const mountGroupsFromResolved = groupByMount(ctx);\n const mountGroups = new Map<string, { op: Operation; service: Service; resolvedOp?: ResolvedOperation }[]>();\n if (mountGroupsFromResolved.size > 0) {\n for (const [target, group] of mountGroupsFromResolved) {\n mountGroups.set(\n target,\n group.resolvedOps.map((r) => ({ op: r.operation, service: r.service, resolvedOp: r })),\n );\n }\n } else {\n // Fallback: group by service\n for (const service of spec.services) {\n const target = getMountTarget(service, ctx);\n if (!mountGroups.has(target)) mountGroups.set(target, []);\n for (const op of service.operations) {\n mountGroups.get(target)!.push({ op, service });\n }\n }\n }\n\n // Generate resource tests (one per mount target, all operations included)\n // Use overwriteExisting so the integration step always writes the latest\n // test content rather than attempting additive AST merge.\n for (const [target, ops] of mountGroups) {\n files.push({\n path: `tests/Service/${className(target)}Test.php`,\n content: generateMountGroupTest(target, ops, ctx),\n overwriteExisting: true,\n });\n }\n\n // Generate client test\n files.push({\n path: 'tests/ClientTest.php',\n content: generateClientTest(ctx),\n overwriteExisting: true,\n });\n\n // Generate fixture JSON files\n const fixtures = generateFixtures(spec);\n for (const fixture of fixtures) {\n files.push({\n path: fixture.path,\n content: fixture.content,\n headerPlacement: 'skip',\n });\n }\n\n return files;\n}\n\nfunction generateMountGroupTest(\n target: string,\n ops: { op: Operation; service: Service; resolvedOp?: ResolvedOperation }[],\n ctx: EmitterContext,\n): string {\n const ns = ctx.namespacePascal;\n const name = className(target);\n const accessor = servicePropertyName(target);\n const lines: string[] = [];\n\n // No <?php here — the file header from fileHeader() provides it\n lines.push('namespace Tests\\\\Service;');\n lines.push('');\n lines.push('use PHPUnit\\\\Framework\\\\TestCase;');\n lines.push('use WorkOS\\\\TestHelper;');\n lines.push('');\n lines.push(`class ${name}Test extends TestCase`);\n lines.push('{');\n lines.push(' use TestHelper;');\n\n // Track emitted test names to avoid duplicates\n const emitted = new Set<string>();\n\n // Generate tests for all operations across all services in the mount group.\n // Uses the hand-maintained TestHelper API:\n // - loadFixture(name) appends .json automatically\n // - createMockClient([['status' => N, 'body' => [...]]]) wraps into Response\n for (const { op, service, resolvedOp } of ops) {\n // Skip base method when wrappers exist (matches resources.ts)\n if (resolvedOp?.wrappers && resolvedOp.wrappers.length > 0) continue;\n\n const plan = planOperation(op);\n const method = resolveMethodName(op, service, ctx);\n const testName = `test${method.charAt(0).toUpperCase()}${method.slice(1)}`;\n const hidden = buildHiddenParams(resolvedOp);\n\n if (emitted.has(testName)) continue;\n emitted.add(testName);\n\n lines.push('');\n lines.push(` public function ${testName}(): void`);\n lines.push(' {');\n\n const expectedPath = buildExpectedPath(op, ctx);\n\n if (plan.isDelete) {\n lines.push(\" $client = $this->createMockClient([['status' => 204]]);\");\n lines.push(` $client->${accessor}()->${method}(${buildTestArgs(op, ctx, { hidden })});`);\n // Request assertions\n lines.push(' $request = $this->getLastRequest();');\n lines.push(\" $this->assertSame('DELETE', $request->getMethod());\");\n lines.push(` $this->assertStringEndsWith('${expectedPath}', $request->getUri()->getPath());`);\n // Body assertions for DELETE-with-body\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n emitBodyAssertions(lines, op, ctx, hidden);\n }\n } else if (plan.isPaginated && op.pagination?.itemType.kind === 'model') {\n const fixtureName = `list_${resolveFixtureModelName(op.pagination.itemType.name, ctx)}`;\n // Pass all params (including optional enums) to verify serialization\n lines.push(` $fixture = $this->loadFixture('${fixtureName}');`);\n lines.push(\" $client = $this->createMockClient([['status' => 200, 'body' => $fixture]]);\");\n lines.push(\n ` $result = $client->${accessor}()->${method}(${buildTestArgs(op, ctx, { includeOptional: true, hidden })});`,\n );\n lines.push(` $this->assertInstanceOf(\\\\${ns}\\\\PaginatedResponse::class, $result);`);\n // Request assertions\n lines.push(' $request = $this->getLastRequest();');\n lines.push(` $this->assertSame('${op.httpMethod.toUpperCase()}', $request->getMethod());`);\n lines.push(` $this->assertStringEndsWith('${expectedPath}', $request->getUri()->getPath());`);\n // Query string serialization assertions\n emitQueryAssertions(lines, op, ctx, hidden);\n } else if (isRedirectEndpoint(op, resolvedOp)) {\n // Redirect endpoint: URL is built locally, no HTTP request made.\n // Pass all params (including optional) to verify they appear in the URL.\n lines.push(' $client = $this->createMockClient([]);');\n lines.push(\n ` $result = $client->${accessor}()->${method}(${buildTestArgs(op, ctx, { includeOptional: true, hidden })});`,\n );\n lines.push(' $this->assertIsString($result);');\n lines.push(` $this->assertStringContainsString('${expectedPath}', $result);`);\n // Query param assertions for the generated URL\n emitRedirectQueryAssertions(lines, op, ctx, hidden, resolvedOp);\n } else if (plan.responseModelName) {\n const modelName = className(plan.responseModelName);\n const fixtureName = `${snakeName(plan.responseModelName)}`;\n lines.push(` $fixture = $this->loadFixture('${fixtureName}');`);\n if (op.response.kind === 'array') {\n lines.push(\" $client = $this->createMockClient([['status' => 200, 'body' => [$fixture]]]);\");\n } else {\n lines.push(\" $client = $this->createMockClient([['status' => 200, 'body' => $fixture]]);\");\n }\n lines.push(` $result = $client->${accessor}()->${method}(${buildTestArgs(op, ctx, { hidden })});`);\n if (op.response.kind === 'array') {\n lines.push(' $this->assertIsArray($result);');\n lines.push(` $this->assertInstanceOf(\\\\${ns}\\\\Resource\\\\${modelName}::class, $result[0]);`);\n emitFieldHydrationAssertions(lines, plan.responseModelName, '$result[0]', '$fixture', ctx);\n // Round-trip: fromArray -> toArray must not throw\n lines.push(' $this->assertIsArray($result[0]->toArray());');\n } else {\n lines.push(` $this->assertInstanceOf(\\\\${ns}\\\\Resource\\\\${modelName}::class, $result);`);\n emitFieldHydrationAssertions(lines, plan.responseModelName, '$result', '$fixture', ctx);\n // Round-trip: fromArray -> toArray must not throw\n lines.push(' $this->assertIsArray($result->toArray());');\n }\n // Request assertions\n lines.push(' $request = $this->getLastRequest();');\n lines.push(` $this->assertSame('${op.httpMethod.toUpperCase()}', $request->getMethod());`);\n lines.push(` $this->assertStringEndsWith('${expectedPath}', $request->getUri()->getPath());`);\n // Body assertions for POST/PUT/PATCH\n if (plan.hasBody && ['post', 'put', 'patch'].includes(op.httpMethod.toLowerCase())) {\n emitBodyAssertions(lines, op, ctx, hidden);\n }\n } else {\n lines.push(\" $client = $this->createMockClient([['status' => 200, 'body' => []]]);\");\n lines.push(` $client->${accessor}()->${method}(${buildTestArgs(op, ctx, { hidden })});`);\n // Request assertions\n lines.push(' $request = $this->getLastRequest();');\n lines.push(` $this->assertSame('${op.httpMethod.toUpperCase()}', $request->getMethod());`);\n lines.push(` $this->assertStringEndsWith('${expectedPath}', $request->getUri()->getPath());`);\n }\n\n lines.push(' }');\n }\n\n // Generate tests for wrapper methods (union split operations)\n for (const resolved of ctx.resolvedOperations ?? []) {\n if (resolved.mountOn !== target) continue;\n for (const wrapper of resolved.wrappers ?? []) {\n const method = toCamelCase(wrapper.name);\n const testName = `test${method.charAt(0).toUpperCase()}${method.slice(1)}`;\n\n if (emitted.has(testName)) continue;\n emitted.add(testName);\n\n const op = resolved.operation;\n const responseModel = op.response.kind === 'model' ? op.response.name : null;\n\n lines.push('');\n lines.push(` public function ${testName}(): void`);\n lines.push(' {');\n\n // Build required args for wrapper methods\n const wrapperArgs = buildWrapperTestArgs(wrapper, ctx);\n\n if (responseModel) {\n const modelName = className(responseModel);\n const fixtureName = `${snakeName(responseModel)}`;\n lines.push(` $fixture = $this->loadFixture('${fixtureName}');`);\n lines.push(\" $client = $this->createMockClient([['status' => 200, 'body' => $fixture]]);\");\n lines.push(` $result = $client->${accessor}()->${method}(${wrapperArgs});`);\n lines.push(` $this->assertInstanceOf(\\\\${ns}\\\\Resource\\\\${modelName}::class, $result);`);\n } else {\n lines.push(\" $client = $this->createMockClient([['status' => 200, 'body' => []]]);\");\n lines.push(` $client->${accessor}()->${method}(${wrapperArgs});`);\n lines.push(' $this->assertTrue(true);');\n }\n\n lines.push(' }');\n }\n }\n\n // Pagination boundary test: verify iteration works when before/after cursors are null\n const firstPaginatedOp = ops.find(({ op }) => {\n const p = planOperation(op);\n return p.isPaginated && op.pagination?.itemType.kind === 'model';\n });\n if (firstPaginatedOp) {\n const testName = 'testPaginationBoundary';\n if (!emitted.has(testName)) {\n emitted.add(testName);\n const op = firstPaginatedOp.op;\n const paginatedHidden = buildHiddenParams(firstPaginatedOp.resolvedOp);\n const itemType = op.pagination!.itemType as { name: string };\n const fixtureName = `list_${resolveFixtureModelName(itemType.name, ctx)}`;\n const method = resolveMethodName(op, firstPaginatedOp.service, ctx);\n\n lines.push('');\n lines.push(` public function ${testName}(): void`);\n lines.push(' {');\n lines.push(` $fixture = $this->loadFixture('${fixtureName}');`);\n lines.push(' // Ensure cursors are null (first/last page boundary)');\n lines.push(\" $fixture['list_metadata']['before'] = null;\");\n lines.push(\" $fixture['list_metadata']['after'] = null;\");\n lines.push(\" $client = $this->createMockClient([['status' => 200, 'body' => $fixture]]);\");\n lines.push(\n ` $result = $client->${accessor}()->${method}(${buildTestArgs(op, ctx, { hidden: paginatedHidden })});`,\n );\n lines.push(` $this->assertInstanceOf(\\\\${ns}\\\\PaginatedResponse::class, $result);`);\n lines.push(' // Verify cursors are null on boundary page');\n lines.push(\" $this->assertNull($result->listMetadata['before']);\");\n lines.push(\" $this->assertNull($result->listMetadata['after']);\");\n lines.push(' // Iterating should not throw on null cursors');\n lines.push(' foreach ($result as $item) {');\n lines.push(' $this->assertNotNull($item);');\n lines.push(' break;');\n lines.push(' }');\n lines.push(' }');\n }\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction generateClientTest(ctx: EmitterContext): string {\n const ns = ctx.namespacePascal;\n const lines: string[] = [];\n\n // No <?php here — the file header from fileHeader() provides it\n lines.push('namespace Tests;');\n lines.push('');\n lines.push('use PHPUnit\\\\Framework\\\\TestCase;');\n lines.push(`use ${ns}\\\\${ns};`);\n lines.push('');\n lines.push('class ClientTest extends TestCase');\n lines.push('{');\n lines.push(' public function testConstructor(): void');\n lines.push(' {');\n lines.push(` $client = new ${ns}(apiKey: 'test-key');`);\n lines.push(' $this->assertNotNull($client);');\n lines.push(' }');\n lines.push('}');\n\n return lines.join('\\n');\n}\n\nfunction buildTestArgs(\n op: Operation,\n ctx: EmitterContext,\n opts?: { includeOptional?: boolean; hidden?: Set<string> },\n): string {\n const includeOptional = opts?.includeOptional ?? false;\n const hidden = opts?.hidden ?? new Set<string>();\n const args: string[] = [];\n const usedNames = new Set<string>();\n\n // Path params (use enum values for enum-typed path params)\n for (const p of op.pathParams) {\n if (p.type.kind === 'enum' || p.type.kind === 'model') {\n args.push(generateTestValue(p.type, ctx));\n } else {\n args.push(`'test_${p.name}'`);\n }\n usedNames.add(toCamelCase(p.name));\n }\n\n // Required body fields\n if (op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => m.name === (op.requestBody as { name: string }).name);\n if (bodyModel) {\n const pathParamNames = new Set(op.pathParams.map((p) => toCamelCase(p.name)));\n for (const f of bodyModel.fields) {\n if (hidden.has(f.name)) continue;\n if (!f.required && !includeOptional) continue;\n let phpName = toCamelCase(f.name);\n if (pathParamNames.has(phpName)) {\n phpName = `body${phpName.charAt(0).toUpperCase()}${phpName.slice(1)}`;\n }\n if (usedNames.has(phpName)) continue;\n usedNames.add(phpName);\n args.push(`${phpName}: ${generateTestValue(f.type, ctx)}`);\n }\n }\n }\n\n // Query params\n for (const q of op.queryParams) {\n if (hidden.has(q.name)) continue;\n if (!q.required && !includeOptional) continue;\n const phpName = toCamelCase(q.name);\n if (usedNames.has(phpName)) continue;\n usedNames.add(phpName);\n args.push(`${phpName}: ${generateTestValue(q.type, ctx)}`);\n }\n\n return args.join(', ');\n}\n\nfunction generateTestValue(ref: { kind: string; type?: string; name?: string }, ctx?: EmitterContext): string {\n switch (ref.kind) {\n case 'primitive':\n switch (ref.type) {\n case 'string':\n return \"'test_value'\";\n case 'integer':\n return '1';\n case 'number':\n return '1.0';\n case 'boolean':\n return 'true';\n default:\n return \"'test_value'\";\n }\n case 'enum': {\n // Use the first enum value so PHP type-checking passes\n if (ctx && ref.name) {\n const e = ctx.spec.enums.find((en) => en.name === ref.name);\n if (e && e.values.length > 0) {\n const enumClass = enumClassName(ref.name);\n // Must match the case-name logic in enums.ts\n const caseName = toPascalCase(String(e.values[0].name).toLowerCase());\n return `\\\\WorkOS\\\\Resource\\\\${enumClass}::${caseName}`;\n }\n }\n return \"'test_value'\";\n }\n case 'array':\n return '[]';\n case 'map':\n return '[]';\n case 'nullable':\n return generateTestValue(\n (ref as unknown as { inner: { kind: string; type?: string; name?: string } }).inner,\n ctx,\n );\n case 'model': {\n if (ref.name) {\n const modelClass = className(ref.name);\n const fixtureName = snakeName(ref.name);\n return `\\\\WorkOS\\\\Resource\\\\${modelClass}::fromArray($this->loadFixture('${fixtureName}'))`;\n }\n return '[]';\n }\n default:\n return \"'test_value'\";\n }\n}\n\n/**\n * Build test arguments for wrapper method calls, providing values for required exposed params.\n */\nfunction buildWrapperTestArgs(wrapper: import('@workos/oagen').ResolvedWrapper, ctx: EmitterContext): string {\n const params = resolveWrapperParams(wrapper, ctx);\n const args: string[] = [];\n for (const { paramName, field, isOptional } of params) {\n if (isOptional) continue;\n const phpName = toCamelCase(paramName);\n const value = field ? generateTestValue(field.type, ctx) : \"'test_value'\";\n args.push(`${phpName}: ${value}`);\n }\n return args.join(', ');\n}\n\n/**\n * Resolve the fixture model name, unwrapping list wrapper models to match\n * the fixture generator's naming (which unwraps before naming).\n */\nfunction resolveFixtureModelName(modelName: string, ctx: EmitterContext): string {\n const model = ctx.spec.models.find((m: Model) => m.name === modelName);\n if (model && isListWrapperModel(model)) {\n const dataField = model.fields.find((f) => f.name === 'data');\n if (dataField?.type.kind === 'array' && dataField.type.items.kind === 'model') {\n return snakeName(dataField.type.items.name);\n }\n }\n return snakeName(modelName);\n}\n\n/**\n * Build the expected URL path for an operation, substituting test values for path params.\n */\nfunction buildExpectedPath(op: Operation, ctx: EmitterContext): string {\n let path = op.path.replace(/^\\//, '');\n for (const p of op.pathParams) {\n if (p.type.kind === 'enum' && (p.type as { name: string }).name) {\n // Use the actual first enum backing value for the path\n const e = ctx.spec.enums.find((en) => en.name === (p.type as { name: string }).name);\n const firstValue = e?.values[0]?.value;\n path = path.replace(`{${p.name}}`, firstValue != null ? String(firstValue) : `test_${p.name}`);\n } else {\n path = path.replace(`{${p.name}}`, `test_${p.name}`);\n }\n }\n return path;\n}\n\n/**\n * Emit field hydration assertions: verify that deserialized model fields\n * match the fixture data. Checks up to 2 primitive string fields (id + one more).\n */\nfunction emitFieldHydrationAssertions(\n lines: string[],\n modelName: string,\n resultVar: string,\n fixtureVar: string,\n ctx: EmitterContext,\n): void {\n const model = ctx.spec.models.find((m) => m.name === modelName);\n if (!model) return;\n\n // Pick required primitive string fields for assertion (id first, then others)\n const candidates = model.fields.filter(\n (f) => f.required && f.type.kind === 'primitive' && f.type.type === 'string' && !f.type.format,\n );\n const idField = candidates.find((f) => f.name === 'id');\n const others = candidates.filter((f) => f.name !== 'id');\n const assertFields = [idField, others[0]].filter(Boolean);\n\n for (const f of assertFields) {\n if (!f) continue;\n const phpProp = toCamelCase(f.name);\n lines.push(` $this->assertSame(${fixtureVar}['${f.name}'], ${resultVar}->${phpProp});`);\n }\n}\n\n/**\n * Emit query string assertions for list operations.\n * Asserts that all query params (including optional enums) are serialized correctly.\n */\nfunction emitQueryAssertions(lines: string[], op: Operation, ctx: EmitterContext, hidden?: Set<string>): void {\n if (op.queryParams.length === 0) return;\n lines.push(' parse_str($request->getUri()->getQuery(), $query);');\n for (const q of op.queryParams) {\n if (hidden?.has(q.name)) continue;\n const innerType =\n q.type.kind === 'nullable' ? (q.type as { inner: { kind: string; type?: string; name?: string } }).inner : q.type;\n if (innerType.kind === 'enum' && innerType.name) {\n // Assert enum is serialized as its backing value, not the enum instance\n const e = ctx.spec.enums.find((en) => en.name === innerType.name);\n if (e && e.values.length > 0) {\n lines.push(` $this->assertSame('${e.values[0].value}', $query['${q.name}']);`);\n }\n } else if (innerType.kind === 'primitive') {\n switch (innerType.type) {\n case 'string':\n lines.push(` $this->assertSame('test_value', $query['${q.name}']);`);\n break;\n case 'integer':\n case 'number':\n lines.push(` $this->assertArrayHasKey('${q.name}', $query);`);\n break;\n case 'boolean':\n lines.push(` $this->assertArrayHasKey('${q.name}', $query);`);\n break;\n }\n }\n }\n}\n\n/**\n * Emit query param assertions for redirect endpoint URLs.\n * Parses the query string from the built URL and asserts visible params,\n * hidden defaults (e.g., response_type), and inferred client fields (e.g., client_id).\n */\nfunction emitRedirectQueryAssertions(\n lines: string[],\n op: Operation,\n ctx: EmitterContext,\n hidden: Set<string>,\n resolvedOp?: ResolvedOperation,\n): void {\n const hasVisibleQueryParams = op.queryParams.some((q) => !hidden.has(q.name));\n const defaults = getOpDefaults(resolvedOp);\n const inferred = getOpInferFromClient(resolvedOp);\n if (!hasVisibleQueryParams && Object.keys(defaults).length === 0 && inferred.length === 0) return;\n\n lines.push(\" parse_str(parse_url($result, PHP_URL_QUERY) ?? '', $query);\");\n\n // Assert visible query params (same logic as emitQueryAssertions but reading from $query parsed from URL)\n for (const q of op.queryParams) {\n if (hidden.has(q.name)) continue;\n const innerType =\n q.type.kind === 'nullable' ? (q.type as { inner: { kind: string; type?: string; name?: string } }).inner : q.type;\n if (innerType.kind === 'enum' && innerType.name) {\n const e = ctx.spec.enums.find((en) => en.name === innerType.name);\n if (e && e.values.length > 0) {\n lines.push(` $this->assertSame('${e.values[0].value}', $query['${q.name}']);`);\n }\n } else if (innerType.kind === 'primitive') {\n switch (innerType.type) {\n case 'string':\n lines.push(` $this->assertSame('test_value', $query['${q.name}']);`);\n break;\n case 'integer':\n case 'number':\n case 'boolean':\n lines.push(` $this->assertArrayHasKey('${q.name}', $query);`);\n break;\n }\n }\n }\n\n // Assert hidden defaults (e.g., response_type => 'code')\n for (const [key, value] of Object.entries(defaults)) {\n lines.push(` $this->assertSame('${value}', $query['${key}']);`);\n }\n\n // Assert inferred client fields are present (e.g., client_id)\n for (const key of inferred) {\n lines.push(` $this->assertArrayHasKey('${key}', $query);`);\n }\n}\n\n/**\n * Emit body field assertions for POST/PUT/PATCH operations.\n * Only asserts primitive required fields (strings, numbers, booleans).\n */\nfunction emitBodyAssertions(lines: string[], op: Operation, ctx: EmitterContext, hidden?: Set<string>): void {\n if (op.requestBody?.kind !== 'model') return;\n const bodyModel = ctx.spec.models.find((m) => m.name === (op.requestBody as { name: string }).name);\n if (!bodyModel) return;\n // Skip fields that collide with path param names (they get deduped in the resource)\n const pathParamNames = new Set(op.pathParams.map((p) => p.name));\n const primitiveRequired = bodyModel.fields.filter(\n (f) =>\n f.required &&\n (f.type.kind === 'primitive' || f.type.kind === 'literal') &&\n !pathParamNames.has(f.name) &&\n !hidden?.has(f.name),\n );\n if (primitiveRequired.length === 0) return;\n\n lines.push(' $body = json_decode((string) $request->getBody(), true);');\n for (const f of primitiveRequired) {\n if (f.type.kind === 'primitive' && f.type.type === 'string') {\n lines.push(` $this->assertSame('test_value', $body['${f.name}']);`);\n } else if (f.type.kind === 'primitive' && f.type.type === 'integer') {\n lines.push(` $this->assertSame(1, $body['${f.name}']);`);\n } else if (f.type.kind === 'primitive' && f.type.type === 'boolean') {\n lines.push(` $this->assertTrue($body['${f.name}']);`);\n } else {\n lines.push(` $this->assertArrayHasKey('${f.name}', $body);`);\n }\n }\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { resolveMethodName } from './naming.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Generate smoke test manifest mapping HTTP operations to SDK methods.\n */\nexport function generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const manifest: Record<string, { sdkMethod: string; service: string }> = {};\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n\n for (const service of spec.services) {\n let propName = accessPaths.get(service.name);\n if (!propName) {\n const mountTarget = getMountTarget(service, ctx);\n propName = accessPaths.get(mountTarget);\n }\n if (!propName) {\n throw new Error(`Missing public client access path for service ${service.name}`);\n }\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const method = resolveMethodName(op, service, ctx);\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return [\n {\n path: 'smoke-manifest.json',\n content: JSON.stringify(manifest, null, 2),\n integrateTarget: false,\n },\n ];\n}\n","import type {\n Emitter,\n EmitterContext,\n FormatCommand,\n GeneratedFile,\n ApiSpec,\n Model,\n Enum,\n Service,\n} from '@workos/oagen';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { generateModels } from './models.js';\nimport { generateEnums } from './enums.js';\nimport { generateResources } from './resources.js';\nimport { generateClient } from './client.js';\nimport { generateTests } from './tests.js';\nimport { generateManifest } from './manifest.js';\nimport { initializeEnumDedup } from './naming.js';\n\n/** Initialize enum deduplication from spec data. */\nfunction ensureNamingInitialized(ctx: EmitterContext): void {\n initializeEnumDedup(ctx.spec.enums);\n}\n\n/** Ensure every generated file's content ends with a trailing newline. */\nfunction ensureTrailingNewlines(files: GeneratedFile[]): GeneratedFile[] {\n for (const f of files) {\n if (f.content && !f.content.endsWith('\\n')) {\n f.content += '\\n';\n }\n }\n return files;\n}\n\nexport const phpEmitter: Emitter = {\n language: 'php',\n\n generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n ensureNamingInitialized(ctx);\n return ensureTrailingNewlines(generateModels(models, ctx));\n },\n\n generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n ensureNamingInitialized(ctx);\n return ensureTrailingNewlines(generateEnums(enums, ctx));\n },\n\n generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n ensureNamingInitialized(ctx);\n return ensureTrailingNewlines(generateResources(services, ctx));\n },\n\n generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n ensureNamingInitialized(ctx);\n return ensureTrailingNewlines(generateClient(spec, ctx));\n },\n\n generateErrors(): GeneratedFile[] {\n return [];\n },\n\n generateTypeSignatures(_spec: ApiSpec, _ctx: EmitterContext): GeneratedFile[] {\n // PHP uses inline type hints — no separate type signature files needed\n return [];\n },\n\n generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n ensureNamingInitialized(ctx);\n return ensureTrailingNewlines(generateTests(spec, ctx));\n },\n\n generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n ensureNamingInitialized(ctx);\n return ensureTrailingNewlines(generateManifest(spec, ctx));\n },\n\n fileHeader(): string {\n return '<?php\\n\\ndeclare(strict_types=1);\\n\\n// This file is auto-generated by oagen. Do not edit.';\n },\n\n formatCommand(targetDir: string): FormatCommand | null {\n const hasPhpCsFixer =\n fs.existsSync(path.join(targetDir, '.php-cs-fixer.dist.php')) ||\n fs.existsSync(path.join(targetDir, '.php-cs-fixer.php'));\n if (hasPhpCsFixer) {\n return {\n cmd: 'bash',\n args: ['-c', 'php vendor/bin/php-cs-fixer fix --using-cache=no --quiet . || true'],\n batchSize: 999999,\n };\n }\n return null;\n },\n};\n","import type { Operation, Service, EmitterContext } from '@workos/oagen';\nimport { toPascalCase, toSnakeCase } from '@workos/oagen';\nimport { buildResolvedLookup, lookupMethodName, getMountTarget } from '../shared/resolved-ops.js';\nimport { stripUrnPrefix, applyAcronymFixes } from '../shared/naming-utils.js';\n\n/**\n * Go-specific acronym extensions beyond the shared base set.\n * Go convention requires ALL_CAPS for well-known initialisms.\n */\nconst GO_EXTRA_ACRONYM_FIXES: [RegExp, string][] = [\n [/Jwks(?=[A-Z]|$)/g, 'JWKS'],\n [/Totp(?=[A-Z]|$)/g, 'TOTP'],\n [/Api(?=[A-Z]|$)/g, 'API'],\n [/Urls(?=[A-Z]|$)/g, 'URLs'],\n [/Url(?=[A-Z]|$)/g, 'URL'],\n [/Uris(?=[A-Z]|$)/g, 'URIs'],\n [/Uri(?=[A-Z]|$)/g, 'URI'],\n [/Http(?=[A-Z]|$)/g, 'HTTP'],\n [/Uuid(?=[A-Z]|$)/g, 'UUID'],\n [/Json(?=[A-Z]|$)/g, 'JSON'],\n [/Html(?=[A-Z]|$)/g, 'HTML'],\n [/Ip(?=[A-Z]|$)/g, 'IP'],\n [/Pkce/g, 'PKCE'],\n];\n\n/**\n * Fix trailing \"Id\" to \"ID\" in Go convention.\n * Must be applied after PascalCase and other acronym fixes.\n */\nfunction fixTrailingId(s: string): string {\n // Fix \"Ids\" → \"IDs\" first (plural), then \"Id\" → \"ID\" (singular)\n let result = s.replace(/Ids(?=[A-Z]|$)/g, 'IDs');\n result = result.replace(/Id(?=[A-Z]|$)/g, 'ID');\n return result;\n}\n\n/** Apply all Go acronym conventions to a PascalCase string. */\nfunction applyAcronyms(s: string): string {\n let result = applyAcronymFixes(s, GO_EXTRA_ACRONYM_FIXES);\n result = fixTrailingId(result);\n return result;\n}\n\n/** PascalCase type/struct name with Go acronym conventions. */\nexport function className(name: string): string {\n return applyAcronyms(toPascalCase(stripUrnPrefix(name)));\n}\n\n/** snake_case file name (without extension). */\nexport function fileName(name: string): string {\n return toSnakeCase(stripUrnPrefix(name));\n}\n\n/** PascalCase exported method name with Go acronym conventions. */\nexport function methodName(name: string): string {\n return applyAcronyms(toPascalCase(name));\n}\n\n/** PascalCase exported field name with Go acronym conventions. */\nexport function fieldName(name: string): string {\n return applyAcronyms(toPascalCase(name));\n}\n\n/** snake_case module/directory name. */\nexport function moduleName(name: string): string {\n return toSnakeCase(name);\n}\n\n/** snake_case property name for service accessors on the client. */\nexport function servicePropertyName(name: string): string {\n return unexportedName(className(name));\n}\n\n/** Lower-camel identifier with Go acronym conventions preserved. */\nexport function unexportedName(name: string): string {\n const exported = className(name);\n if (!exported) return exported;\n\n const initialism = exported.match(/^[A-Z]+(?=[A-Z][a-z]|[0-9]|$)/)?.[0];\n if (initialism) {\n return initialism.toLowerCase() + exported.slice(initialism.length);\n }\n\n return exported.charAt(0).toLowerCase() + exported.slice(1);\n}\n\n/** Resolve the effective service name using resolved operations. */\nexport function resolveServiceName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n/** Build a map from IR service name to resolved service name. */\nexport function buildServiceNameMap(services: Service[], ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of services) {\n map.set(service.name, resolveServiceName(service, ctx));\n }\n return map;\n}\n\n/** Resolve the output directory for a service. */\nexport function resolveServiceDir(resolvedServiceName: string): string {\n return moduleName(resolvedServiceName);\n}\n\n/** Resolve the SDK method name for an operation, using resolved operations first. */\nexport function resolveMethodName(op: Operation, _service: Service, ctx: EmitterContext): string {\n const lookup = buildResolvedLookup(ctx);\n const resolved = lookupMethodName(op, lookup);\n if (resolved) return trimMountedResourceFromMethod(methodName(resolved), resolveClassName(_service, ctx));\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup?.methodByOperation?.get(httpKey);\n if (existing) return trimMountedResourceFromMethod(methodName(existing.methodName), resolveClassName(_service, ctx));\n return trimMountedResourceFromMethod(methodName(op.name), resolveClassName(_service, ctx));\n}\n\n/** Resolve the SDK class name for a service using resolved operations' mountOn. */\nexport function resolveClassName(service: Service, ctx: EmitterContext): string {\n for (const r of ctx.resolvedOperations ?? []) {\n if (r.service.name === service.name) return className(r.mountOn);\n }\n if (ctx.overlayLookup?.methodByOperation) {\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup.methodByOperation.get(httpKey);\n if (existing) return className(existing.className);\n }\n }\n return className(service.name);\n}\n\n/** Build a map from IR service name to mount-target directory name. */\nexport function buildMountDirMap(ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of ctx.spec.services) {\n const target = getMountTarget(service, ctx);\n map.set(service.name, moduleName(target));\n }\n return map;\n}\n\nfunction splitPascalWords(name: string): string[] {\n return name.match(/[A-Z]+(?:[a-z]+|(?=[A-Z]|$))|[A-Z]?[a-z]+|[0-9]+/g) ?? [name];\n}\n\nfunction singularize(word: string): string {\n if (word.endsWith('ies') && word.length > 3) {\n return `${word.slice(0, -3)}y`;\n }\n if (word.endsWith('s') && !word.endsWith('ss')) {\n return word.slice(0, -1);\n }\n return word;\n}\n\nfunction wordsMatch(left: string, right: string): boolean {\n return singularize(left.toLowerCase()) === singularize(right.toLowerCase());\n}\n\nfunction trimMountedResourceFromMethod(method: string, mountName: string): string {\n const methodWords = splitPascalWords(method);\n if (methodWords.length < 2) return method;\n\n const mountWords = splitPascalWords(className(mountName));\n if (mountWords.length === 0) return method;\n\n let matched = 0;\n while (\n matched < mountWords.length &&\n matched + 1 < methodWords.length &&\n wordsMatch(methodWords[matched + 1], mountWords[matched])\n ) {\n matched++;\n }\n\n if (matched === 0) return method;\n\n return [methodWords[0], ...methodWords.slice(matched + 1)].join('');\n}\n","import type { TypeRef, PrimitiveType, UnionType } from '@workos/oagen';\nimport { mapTypeRef as irMapTypeRef } from '@workos/oagen';\nimport { className } from './naming.js';\n\n/**\n * Map an IR TypeRef to a Go type string.\n */\nexport function mapTypeRef(ref: TypeRef, asPointer = false): string {\n const base = irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\n array: (_ref, items) => `[]${items}`,\n model: (r) => `*${className(r.name)}`,\n enum: (r) => className(r.name),\n union: (_r, variants) => joinUnionVariants(_r, variants),\n nullable: (_ref, inner) => {\n // If inner is already a pointer type (model), don't double-pointer\n if (inner.startsWith('*')) return inner;\n return `*${inner}`;\n },\n literal: (r) => {\n if (r.value === null) return 'interface{}';\n if (typeof r.value === 'string') return 'string';\n if (typeof r.value === 'number') return Number.isInteger(r.value) ? 'int' : 'float64';\n if (typeof r.value === 'boolean') return 'bool';\n return 'interface{}';\n },\n map: (_ref, value) => `map[string]${value}`,\n });\n if (asPointer && !base.startsWith('*') && !base.startsWith('[]') && !base.startsWith('map[')) {\n return `*${base}`;\n }\n return base;\n}\n\n/**\n * Map an IR TypeRef to a Go type string without pointer wrapping for models.\n * Used for response type references where we don't want a double pointer.\n */\nexport function mapTypeRefValue(ref: TypeRef): string {\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\n array: (_ref, items) => `[]${items}`,\n model: (r) => className(r.name),\n enum: (r) => className(r.name),\n union: (_r, variants) => joinUnionVariants(_r, variants),\n nullable: (_ref, inner) => `*${inner}`,\n literal: (r) => {\n if (r.value === null) return 'interface{}';\n if (typeof r.value === 'string') return 'string';\n if (typeof r.value === 'number') return Number.isInteger(r.value) ? 'int' : 'float64';\n if (typeof r.value === 'boolean') return 'bool';\n return 'interface{}';\n },\n map: (_ref, value) => `map[string]${value}`,\n });\n}\n\nfunction mapPrimitive(ref: PrimitiveType): string {\n if (ref.format === 'binary') return '[]byte';\n switch (ref.type) {\n case 'string':\n return 'string';\n case 'integer':\n return 'int';\n case 'number':\n return 'float64';\n case 'boolean':\n return 'bool';\n case 'unknown':\n return 'interface{}';\n }\n}\n\nfunction joinUnionVariants(_ref: UnionType, variants: string[]): string {\n if (_ref.compositionKind === 'allOf') {\n return variants[0] ?? 'interface{}';\n }\n const unique = [...new Set(variants)];\n if (unique.length === 1) return unique[0];\n // Go doesn't have union types; use interface{}\n return 'interface{}';\n}\n","import type { Model, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { mapTypeRef } from './type-map.js';\nimport { className, fieldName } from './naming.js';\nimport { lowerFirstForDoc, fieldDocComment, articleFor } from '../shared/naming-utils.js';\n\n// Import and re-export shared model detection utilities\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\nexport { isListWrapperModel, isListMetadataModel };\n\n/**\n * Generate Go struct definitions from IR Models.\n * All models go into a single models.go file for the flat package.\n */\nexport function generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n if (models.length === 0) return [];\n\n const files: GeneratedFile[] = [];\n const lines: string[] = [];\n\n lines.push(`package ${ctx.namespace}`);\n lines.push('');\n\n // Build structural hash for deduplication\n const modelHashMap = new Map<string, string>();\n const hashGroups = new Map<string, string[]>();\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n const hash = structuralHash(model);\n modelHashMap.set(model.name, hash);\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(model.name);\n }\n\n // Pick canonical for each duplicate group.\n // Empty structs (hash '') are now properly populated by oneOf flattening,\n // so we still skip aliasing them to avoid aliasing truly empty structs.\n const aliasOf = new Map<string, string>();\n for (const [hash, names] of hashGroups) {\n if (names.length <= 1) continue;\n if (hash === '') continue;\n const sorted = [...names].sort();\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n aliasOf.set(sorted[i], canonical);\n }\n }\n\n const batchedAliases = new Set<string>();\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n\n const structName = className(model.name);\n\n // If this model is a dedup alias, emit a type alias.\n // For large alias groups (5+), use a compact batch declaration.\n const canonicalName = aliasOf.get(model.name);\n if (canonicalName) {\n // Check if this alias is part of a batch that was already emitted\n if (batchedAliases.has(model.name)) continue;\n\n const canonicalStruct = className(canonicalName);\n const hash = modelHashMap.get(model.name)!;\n const groupNames = hashGroups.get(hash) ?? [];\n const aliases = groupNames.filter((n) => aliasOf.has(n));\n\n if (aliases.length >= 5) {\n // Batch emit all aliases for this group at once\n for (const aliasName of aliases) {\n batchedAliases.add(aliasName);\n }\n lines.push(`// The following types are structurally identical to ${canonicalStruct}.`);\n lines.push('type (');\n for (const aliasName of aliases) {\n lines.push(`\\t${className(aliasName)} = ${canonicalStruct}`);\n }\n lines.push(')');\n lines.push('');\n } else {\n lines.push(`// ${structName} is an alias for ${canonicalStruct}.`);\n lines.push(`type ${structName} = ${canonicalStruct}`);\n lines.push('');\n }\n continue;\n }\n\n // Emit struct\n if (model.description) {\n const descLines = model.description.split('\\n').filter((l) => l.trim());\n lines.push(`// ${structName} ${lowerFirst(descLines[0])}`);\n for (let i = 1; i < descLines.length; i++) {\n lines.push(`// ${descLines[i].trim()}`);\n }\n } else {\n const humanized = humanize(model.name);\n lines.push(`// ${structName} represents ${articleFor(humanized)} ${humanized}.`);\n }\n lines.push(`type ${structName} struct {`);\n\n // Deduplicate fields by Go field name\n const seenFieldNames = new Set<string>();\n for (const field of model.fields) {\n const goFieldName = fieldName(field.name);\n if (seenFieldNames.has(goFieldName)) continue;\n seenFieldNames.add(goFieldName);\n\n const isOptional = !field.required;\n const goType = isOptional ? makeOptional(mapTypeRef(field.type)) : mapTypeRef(field.type);\n\n const jsonTag = field.required ? `json:\"${field.name}\"` : `json:\"${field.name},omitempty\"`;\n\n if (field.description) {\n const fdLines = field.description.split('\\n').filter((l) => l.trim());\n lines.push(`\\t// ${fieldDocComment(goFieldName, fdLines[0])}`);\n for (let i = 1; i < fdLines.length; i++) {\n lines.push(`\\t// ${fdLines[i].trim()}`);\n }\n }\n if (field.deprecated) {\n if (field.description) lines.push(`\\t//`);\n const deprecationReason = extractDeprecationReason(field.description);\n lines.push(`\\t// Deprecated: ${deprecationReason}`);\n }\n lines.push(`\\t${goFieldName} ${goType} \\`${jsonTag}\\``);\n }\n\n lines.push('}');\n lines.push('');\n }\n\n // Emit shared PaginationParams struct for list operations to embed\n lines.push('// PaginationParams contains common pagination parameters for list operations.');\n lines.push('type PaginationParams struct {');\n lines.push('\\t// Before is a cursor for reverse pagination.');\n lines.push('\\tBefore *string `url:\"before,omitempty\" json:\"-\"`');\n lines.push('\\t// After is a cursor for forward pagination.');\n lines.push('\\tAfter *string `url:\"after,omitempty\" json:\"-\"`');\n lines.push('\\t// Limit is the maximum number of items to return per page.');\n lines.push('\\tLimit *int `url:\"limit,omitempty\" json:\"-\"`');\n lines.push('\\t// Order is the sort order for results (asc or desc).');\n lines.push('\\tOrder *string `url:\"order,omitempty\" json:\"-\"`');\n lines.push('}');\n lines.push('');\n\n files.push({\n path: 'models.go',\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n\n return files;\n}\n\n/**\n * Make a Go type optional (pointer) if it isn't already.\n */\nfunction makeOptional(goType: string): string {\n if (goType.startsWith('*') || goType.startsWith('[]') || goType.startsWith('map[')) {\n return goType;\n }\n return `*${goType}`;\n}\n\nfunction structuralHash(model: Model): string {\n return model.fields\n .map((f) => `${f.name}:${JSON.stringify(f.type)}:${f.required}`)\n .sort()\n .join('|');\n}\n\n/** Known acronyms to preserve as single tokens during humanization. */\nconst HUMANIZE_ACRONYMS: [RegExp, string][] = [\n [/OAuth/g, 'OAUTH_ACRN'],\n [/URN/g, 'URN_ACRN'],\n [/IETF/g, 'IETF_ACRN'],\n [/API/g, 'API_ACRN'],\n [/SSO/g, 'SSO_ACRN'],\n [/PKCE/g, 'PKCE_ACRN'],\n [/JWT/g, 'JWT_ACRN'],\n [/MFA/g, 'MFA_ACRN'],\n [/TOTP/g, 'TOTP_ACRN'],\n [/SAML/g, 'SAML_ACRN'],\n [/SCIM/g, 'SCIM_ACRN'],\n [/OIDC/g, 'OIDC_ACRN'],\n [/CORS/g, 'CORS_ACRN'],\n [/RBAC/g, 'RBAC_ACRN'],\n];\n\nconst HUMANIZE_RESTORE: [RegExp, string][] = [\n [/oauth_acrn/g, 'OAuth'],\n [/urn_acrn/g, 'URN'],\n [/ietf_acrn/g, 'IETF'],\n [/api_acrn/g, 'API'],\n [/sso_acrn/g, 'SSO'],\n [/pkce_acrn/g, 'PKCE'],\n [/jwt_acrn/g, 'JWT'],\n [/mfa_acrn/g, 'MFA'],\n [/totp_acrn/g, 'TOTP'],\n [/saml_acrn/g, 'SAML'],\n [/scim_acrn/g, 'SCIM'],\n [/oidc_acrn/g, 'OIDC'],\n [/cors_acrn/g, 'CORS'],\n [/rbac_acrn/g, 'RBAC'],\n];\n\nfunction humanize(name: string): string {\n // Replace known acronyms with placeholders before splitting\n let s = name;\n for (const [pattern, replacement] of HUMANIZE_ACRONYMS) {\n s = s.replace(pattern, replacement);\n }\n // Split camelCase/PascalCase into words\n let result = s.replace(/([a-z])([A-Z])/g, '$1 $2');\n result = result.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n result = result.toLowerCase();\n // Restore acronyms\n for (const [pattern, replacement] of HUMANIZE_RESTORE) {\n result = result.replace(pattern, replacement);\n }\n return result;\n}\n\nfunction lowerFirst(s: string): string {\n return lowerFirstForDoc(s);\n}\n\n/**\n * Extract a deprecation reason from a field description.\n * Looks for patterns like \"Use X instead\", \"Replaced by Y\", etc.\n * Falls back to a generic message if no migration guidance is found.\n */\nfunction extractDeprecationReason(description?: string): string {\n if (!description) return 'this field is deprecated.';\n\n // Common patterns: \"Use X instead\", \"Replaced by X\", \"Deprecated in favor of X\"\n const patterns = [\n /\\b(use\\s+\\S+(?:\\s+\\S+){0,3}\\s+instead)\\b/i,\n /\\b(replaced\\s+by\\s+\\S+(?:\\s+\\S+){0,3})\\b/i,\n /\\b(deprecated\\s+in\\s+favor\\s+of\\s+\\S+(?:\\s+\\S+){0,3})\\b/i,\n /\\b(prefer\\s+\\S+(?:\\s+\\S+){0,3})\\b/i,\n /\\b(migrate\\s+to\\s+\\S+(?:\\s+\\S+){0,3})\\b/i,\n ];\n\n for (const pattern of patterns) {\n const match = description.match(pattern);\n if (match) {\n let reason = match[1].trim();\n // Ensure it ends with a period\n if (!reason.endsWith('.')) reason += '.';\n return reason;\n }\n }\n\n return 'this field is deprecated.';\n}\n","import type { Enum, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { walkTypeRef } from '@workos/oagen';\nimport { className } from './naming.js';\n\n/**\n * Generate Go typed string enum constants from IR Enum definitions.\n *\n * Each enum becomes a named string type + const block:\n * type Status string\n * const (\n * StatusActive Status = \"active\"\n * StatusInactive Status = \"inactive\"\n * )\n */\nexport function generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n if (enums.length === 0) return [];\n\n const aliasOf = collectEnumAliasOf(enums);\n const files: GeneratedFile[] = [];\n\n // Group all enums into a single file per SDK\n const lines: string[] = [];\n lines.push(`package ${ctx.namespace}`);\n lines.push('');\n\n for (const enumDef of enums) {\n // If this enum is an alias, emit a simple type alias\n const canonicalName = aliasOf.get(enumDef.name);\n if (canonicalName) {\n const aliasType = className(enumDef.name);\n const canonicalType = className(canonicalName);\n lines.push(`// ${aliasType} is an alias for ${canonicalType}.`);\n lines.push(`type ${aliasType} = ${canonicalType}`);\n lines.push('');\n continue;\n }\n\n const typeName = className(enumDef.name);\n\n if (enumDef.values.length === 0) {\n const humanized = humanize(enumDef.name);\n lines.push(`// ${typeName} represents ${humanized} values.`);\n lines.push(`type ${typeName} = string`);\n lines.push('');\n continue;\n }\n\n // Deduplicate values\n const seenValues = new Set<string>();\n const uniqueValues: typeof enumDef.values = [];\n for (const v of enumDef.values) {\n const vs = String(v.value);\n if (!seenValues.has(vs)) {\n seenValues.add(vs);\n uniqueValues.push(v);\n }\n }\n\n const humanized = humanize(enumDef.name);\n lines.push(`// ${typeName} represents ${humanized} values.`);\n lines.push(`type ${typeName} string`);\n lines.push('');\n lines.push('const (');\n\n const usedNames = new Set<string>();\n for (const v of uniqueValues) {\n let constSuffix = className(String(v.value));\n // Avoid collision with the type itself\n if (usedNames.has(`${typeName}${constSuffix}`)) {\n let suffix = 2;\n while (usedNames.has(`${typeName}${constSuffix}${suffix}`)) suffix++;\n constSuffix = `${constSuffix}${suffix}`;\n }\n const constName = `${typeName}${constSuffix}`;\n usedNames.add(constName);\n const valueStr = typeof v.value === 'string' ? `\"${v.value}\"` : String(v.value);\n if (v.description) {\n lines.push(`\\t// ${constName} is ${v.description}.`);\n }\n if (v.deprecated) {\n if (v.description) lines.push(`\\t//`);\n lines.push(`\\t// Deprecated: this value is deprecated.`);\n }\n lines.push(`\\t${constName} ${typeName} = ${valueStr}`);\n }\n lines.push(')');\n lines.push('');\n }\n\n files.push({\n path: 'enums.go',\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n\n return files;\n}\n\n/** Known acronyms to preserve as single tokens during humanization. */\nconst HUMANIZE_ACRONYMS: [RegExp, string][] = [\n [/OAuth/g, 'OAUTH_ACRN'],\n [/URN/g, 'URN_ACRN'],\n [/IETF/g, 'IETF_ACRN'],\n [/API/g, 'API_ACRN'],\n [/SSO/g, 'SSO_ACRN'],\n [/PKCE/g, 'PKCE_ACRN'],\n [/JWT/g, 'JWT_ACRN'],\n [/MFA/g, 'MFA_ACRN'],\n [/TOTP/g, 'TOTP_ACRN'],\n [/SAML/g, 'SAML_ACRN'],\n [/SCIM/g, 'SCIM_ACRN'],\n [/OIDC/g, 'OIDC_ACRN'],\n [/CORS/g, 'CORS_ACRN'],\n [/RBAC/g, 'RBAC_ACRN'],\n];\n\nconst HUMANIZE_RESTORE: [RegExp, string][] = [\n [/oauth_acrn/g, 'OAuth'],\n [/urn_acrn/g, 'URN'],\n [/ietf_acrn/g, 'IETF'],\n [/api_acrn/g, 'API'],\n [/sso_acrn/g, 'SSO'],\n [/pkce_acrn/g, 'PKCE'],\n [/jwt_acrn/g, 'JWT'],\n [/mfa_acrn/g, 'MFA'],\n [/totp_acrn/g, 'TOTP'],\n [/saml_acrn/g, 'SAML'],\n [/scim_acrn/g, 'SCIM'],\n [/oidc_acrn/g, 'OIDC'],\n [/cors_acrn/g, 'CORS'],\n [/rbac_acrn/g, 'RBAC'],\n];\n\nfunction humanize(name: string): string {\n // Replace known acronyms with placeholders before splitting\n let s = name;\n for (const [pattern, replacement] of HUMANIZE_ACRONYMS) {\n s = s.replace(pattern, replacement);\n }\n let result = s.replace(/([a-z])([A-Z])/g, '$1 $2');\n result = result.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n result = result.toLowerCase();\n for (const [pattern, replacement] of HUMANIZE_RESTORE) {\n result = result.replace(pattern, replacement);\n }\n return result;\n}\n\nfunction collectEnumAliasOf(enums: Enum[]): Map<string, string> {\n const hashGroups = new Map<string, string[]>();\n for (const enumDef of enums) {\n const hash = [...enumDef.values]\n .map((v) => String(v.value))\n .sort()\n .join('|');\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(enumDef.name);\n }\n\n const aliasOf = new Map<string, string>();\n for (const [, names] of hashGroups) {\n if (names.length <= 1) continue;\n const sorted = [...names].sort();\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n aliasOf.set(sorted[i], canonical);\n }\n }\n return aliasOf;\n}\n\nexport function assignEnumsToServices(enums: Enum[], services: Service[]): Map<string, string> {\n const enumToService = new Map<string, string>();\n const enumNames = new Set(enums.map((e) => e.name));\n\n for (const service of services) {\n for (const op of service.operations) {\n const refs = new Set<string>();\n const collect = (ref: any) => {\n walkTypeRef(ref, { enum: (r: any) => refs.add(r.name) });\n };\n if (op.requestBody) collect(op.requestBody);\n collect(op.response);\n for (const p of [...op.pathParams, ...op.queryParams, ...op.headerParams, ...(op.cookieParams ?? [])]) {\n collect(p.type);\n }\n for (const name of refs) {\n if (enumNames.has(name) && !enumToService.has(name)) {\n enumToService.set(name, service.name);\n }\n }\n }\n }\n\n return enumToService;\n}\n","import type { EmitterContext, ResolvedOperation, ResolvedWrapper } from '@workos/oagen';\nimport {\n className as goClassName,\n fieldName as goFieldName,\n methodName as goMethodName,\n unexportedName,\n} from './naming.js';\nimport { sortPathParamsByTemplateOrder } from './resources.js';\nimport { resolveWrapperParams, formatWrapperDescription, type ResolvedWrapperParam } from '../shared/wrapper-utils.js';\nimport { lowerFirstForDoc, fieldDocComment } from '../shared/naming-utils.js';\n\n/**\n * Generate Go wrapper method lines for union split operations.\n *\n * Each wrapper is a typed convenience method that:\n * - Accepts only the exposed params (not the full union body)\n * - Injects constant defaults (e.g., grant_type)\n * - Reads inferred fields from client config (e.g., client_id)\n * - Delegates to the HTTP client with the constructed body\n */\nexport function generateWrapperMethods(\n serviceType: string,\n resolvedOp: ResolvedOperation,\n ctx: EmitterContext,\n): string[] {\n if (!resolvedOp.wrappers || resolvedOp.wrappers.length === 0) return [];\n\n const lines: string[] = [];\n\n for (const wrapper of resolvedOp.wrappers) {\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n lines.push('');\n emitWrapperParamsStruct(lines, wrapper, wrapperParams);\n lines.push('');\n emitWrapperMethod(lines, serviceType, resolvedOp, wrapper, wrapperParams);\n }\n\n return lines;\n}\n\nfunction emitWrapperParamsStruct(\n lines: string[],\n wrapper: ResolvedWrapper,\n wrapperParams: ResolvedWrapperParam[],\n): void {\n const structName = `${goMethodName(wrapper.name)}Params`;\n\n lines.push(`// ${structName} contains the parameters for ${goMethodName(wrapper.name)}.`);\n lines.push(`type ${structName} struct {`);\n\n for (const { paramName, field, isOptional } of wrapperParams) {\n const goField = goFieldName(paramName);\n const goType = field ? resolveSimpleGoType(field.type) : 'string';\n\n if (field?.description) {\n const fdLines = field.description.split('\\n').filter((l: string) => l.trim());\n lines.push(`\\t// ${fieldDocComment(goField, fdLines[0])}`);\n for (let i = 1; i < fdLines.length; i++) {\n lines.push(`\\t// ${fdLines[i].trim()}`);\n }\n }\n if (isOptional) {\n const optType = goType.startsWith('*') || goType.startsWith('[]') ? goType : `*${goType}`;\n lines.push(`\\t${goField} ${optType} \\`json:\"${paramName},omitempty\"\\``);\n } else {\n lines.push(`\\t${goField} ${goType} \\`json:\"${paramName}\"\\``);\n }\n }\n\n lines.push('}');\n}\n\nfunction emitWrapperMethod(\n lines: string[],\n serviceType: string,\n resolvedOp: ResolvedOperation,\n wrapper: ResolvedWrapper,\n wrapperParams: ResolvedWrapperParam[],\n): void {\n const op = resolvedOp.operation;\n const method = goMethodName(wrapper.name);\n const paramsStruct = `${method}Params`;\n\n // Return type\n const responseType = wrapper.responseModelName ? goClassName(wrapper.responseModelName) : null;\n\n // GoDoc\n lines.push(`// ${method} ${formatWrapperDescription(wrapper.name)}.`);\n\n // Signature\n const sigParams: string[] = ['ctx context.Context'];\n\n // Path params as positional args (sorted by template order)\n for (const p of sortPathParamsByTemplateOrder(op)) {\n sigParams.push(`${lowerFirstSafe(goFieldName(p.name))} ${resolveSimpleGoType(p.type)}`);\n }\n\n sigParams.push(`params *${paramsStruct}`);\n sigParams.push('opts ...RequestOption');\n\n if (responseType) {\n lines.push(`func (s *${serviceType}) ${method}(${sigParams.join(', ')}) (*${responseType}, error) {`);\n } else {\n lines.push(`func (s *${serviceType}) ${method}(${sigParams.join(', ')}) error {`);\n }\n\n // Build body map with defaults + exposed params\n lines.push('\\tbody := map[string]interface{}{');\n\n // Constant defaults (e.g., grant_type)\n for (const [key, value] of Object.entries(wrapper.defaults)) {\n lines.push(`\\t\\t\"${key}\": ${goLiteral(value)},`);\n }\n\n // Required exposed params\n for (const { paramName, isOptional } of wrapperParams) {\n if (isOptional) continue;\n const goField = goFieldName(paramName);\n lines.push(`\\t\\t\"${paramName}\": params.${goField},`);\n }\n\n lines.push('\\t}');\n\n // Inferred fields from client config\n for (const field of wrapper.inferFromClient) {\n const expr = clientFieldExpression(field);\n lines.push(`\\tif ${expr} != \"\" {`);\n lines.push(`\\t\\tbody[\"${field}\"] = ${expr}`);\n lines.push('\\t}');\n }\n\n // Optional exposed params\n for (const { paramName, isOptional } of wrapperParams) {\n if (!isOptional) continue;\n const goField = goFieldName(paramName);\n lines.push(`\\tif params.${goField} != nil {`);\n lines.push(`\\t\\tbody[\"${paramName}\"] = *params.${goField}`);\n lines.push('\\t}');\n }\n\n // Build path expression\n let pathExpr: string;\n if (op.pathParams.length > 0) {\n let fmtStr = op.path;\n const fmtArgs: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n fmtStr = fmtStr.replace(`{${p.name}}`, '%s');\n fmtArgs.push(lowerFirstSafe(goFieldName(p.name)));\n }\n pathExpr = `fmt.Sprintf(\"${fmtStr}\", ${fmtArgs.join(', ')})`;\n } else {\n pathExpr = `\"${op.path}\"`;\n }\n\n // Make the request\n if (responseType) {\n lines.push(`\\tvar result ${responseType}`);\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, nil, body, &result, opts)`,\n );\n lines.push('\\tif err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n lines.push('\\treturn &result, nil');\n } else {\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, nil, body, nil, opts)`,\n );\n lines.push('\\treturn err');\n }\n\n lines.push('}');\n}\n\n/** Convert a value to a Go literal. */\nfunction goLiteral(value: string | number | boolean): string {\n if (typeof value === 'string') return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\n/** Get the Go expression for reading a client config field. */\nfunction clientFieldExpression(field: string): string {\n switch (field) {\n case 'client_id':\n return 's.client.clientID';\n case 'client_secret':\n return 's.client.apiKey';\n default:\n return `s.client.${lowerFirstSafe(goFieldName(field))}`;\n }\n}\n\n/** Resolve a TypeRef to a simple Go type string. */\nfunction resolveSimpleGoType(ref: any): string {\n if (ref.kind === 'primitive') {\n switch (ref.type) {\n case 'string':\n return 'string';\n case 'integer':\n return 'int';\n case 'number':\n return 'float64';\n case 'boolean':\n return 'bool';\n default:\n return 'interface{}';\n }\n }\n if (ref.kind === 'nullable') return `*${resolveSimpleGoType(ref.inner)}`;\n if (ref.kind === 'array') return `[]${resolveSimpleGoType(ref.items)}`;\n if (ref.kind === 'model') return `*${goClassName(ref.name)}`;\n if (ref.kind === 'enum') return goClassName(ref.name);\n if (ref.kind === 'union') {\n // For oneOf with a single non-null variant, use that variant's type\n const nonNull = ref.variants.filter((v: any) => v.kind !== 'literal' || v.value !== null);\n if (nonNull.length === 1) return resolveSimpleGoType(nonNull[0]);\n return 'interface{}';\n }\n return 'interface{}';\n}\n\n/** Go reserved words set. */\nconst GO_RESERVED = new Set([\n 'break',\n 'case',\n 'chan',\n 'const',\n 'continue',\n 'default',\n 'defer',\n 'else',\n 'fallthrough',\n 'for',\n 'func',\n 'go',\n 'goto',\n 'if',\n 'import',\n 'interface',\n 'map',\n 'package',\n 'range',\n 'return',\n 'select',\n 'struct',\n 'switch',\n 'type',\n 'var',\n]);\n\nfunction lowerFirstSafe(s: string): string {\n if (!s) return s;\n const result = unexportedName(s);\n if (GO_RESERVED.has(result)) return `${result}Param`;\n return result;\n}\n\nfunction _lowerFirstField(s: string): string {\n return lowerFirstForDoc(s);\n}\n","import type {\n Service,\n Operation,\n OperationPlan,\n EmitterContext,\n GeneratedFile,\n ResolvedOperation,\n} from '@workos/oagen';\nimport { planOperation, toSnakeCase } from '@workos/oagen';\nimport { isListWrapperModel } from './models.js';\nimport { mapTypeRef, mapTypeRefValue } from './type-map.js';\nimport { className, fieldName, methodName, resolveClassName, resolveMethodName, unexportedName } from './naming.js';\nimport {\n buildResolvedLookup,\n lookupResolved,\n groupByMount,\n getOpDefaults,\n getOpInferFromClient,\n buildHiddenParams,\n hasHiddenParams,\n} from '../shared/resolved-ops.js';\nimport { lowerFirstForDoc, fieldDocComment } from '../shared/naming-utils.js';\nimport { generateWrapperMethods } from './wrappers.js';\n\n/**\n * Return path params sorted by their first occurrence in the URL template.\n * This ensures fmt.Sprintf args and function signatures match template order.\n */\nexport function sortPathParamsByTemplateOrder(op: Operation): typeof op.pathParams {\n return [...op.pathParams].sort((a, b) => {\n const posA = op.path.indexOf(`{${a.name}}`);\n const posB = op.path.indexOf(`{${b.name}}`);\n return posA - posB;\n });\n}\n\n/**\n * Resolve the resource class name for a service.\n */\nexport function resolveResourceClassName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n/**\n * Generate Go resource/service files from IR Service definitions.\n * Each mount group becomes a single .go file with an unexported service struct\n * and exported methods.\n */\nexport function generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n if (services.length === 0) return [];\n\n const files: GeneratedFile[] = [];\n const mountGroups = groupByMount(ctx);\n\n // If no resolved operations, fall back to raw services\n const entries: Array<{ name: string; operations: Operation[] }> =\n mountGroups.size > 0\n ? [...mountGroups].map(([name, group]) => ({ name, operations: group.operations }))\n : services.map((s) => ({ name: resolveResourceClassName(s, ctx), operations: s.operations }));\n\n for (const { name: mountName, operations } of entries) {\n if (operations.length === 0) continue;\n const file = generateServiceFile(mountName, operations, ctx);\n if (file) files.push(file);\n }\n\n return files;\n}\n\nfunction generateServiceFile(mountName: string, operations: Operation[], ctx: EmitterContext): GeneratedFile | null {\n const lines: string[] = [];\n const serviceType = serviceTypeName(mountName);\n const goFile = `${toSnakeCase(mountName)}.go`;\n\n // Build resolved lookup once for the whole file\n const resolvedLookup = buildResolvedLookup(ctx);\n\n // Determine which imports are needed\n const needsFmt = operations.some((op) => op.pathParams.length > 0);\n const needsNetUrl = operations.some((op) => {\n const resolved = lookupResolved(op, resolvedLookup);\n return resolved && hasHiddenParams(resolved) && op.httpMethod.toLowerCase() === 'get';\n });\n const needsStrings = needsStringsImport(operations, resolvedLookup);\n\n lines.push(`package ${ctx.namespace}`);\n lines.push('');\n lines.push('import (');\n lines.push('\\t\"context\"');\n if (needsFmt) {\n lines.push('\\t\"fmt\"');\n }\n if (needsNetUrl) {\n lines.push('\\t\"net/url\"');\n }\n if (needsStrings) {\n lines.push('\\t\"strings\"');\n }\n lines.push(')');\n lines.push('');\n\n // Service struct\n lines.push(`// ${serviceType} handles ${mountName} operations.`);\n lines.push(`type ${serviceType} struct {`);\n lines.push('\\tclient *Client');\n lines.push('}');\n lines.push('');\n\n // Generate params structs and methods for each operation.\n // Deduplicate by method name -- multiple IR operations can resolve to the same\n // Go method name when mounted from different IR services.\n const emittedMethods = new Set<string>();\n for (const op of operations) {\n const plan = planOperation(op);\n const method = resolveGoMethodName(op, mountName, ctx);\n\n if (emittedMethods.has(method)) continue;\n emittedMethods.add(method);\n\n const resolvedOp = lookupResolved(op, resolvedLookup);\n\n // Generate params struct if needed\n const paramsStruct = generateParamsStruct(mountName, method, op, plan, ctx, resolvedOp);\n if (paramsStruct) {\n lines.push(paramsStruct);\n lines.push('');\n }\n\n // Generate method\n const methodCode = generateMethod(serviceType, mountName, method, op, plan, ctx, resolvedOp);\n lines.push(methodCode);\n lines.push('');\n\n // Generate union split wrapper methods (e.g., AuthenticateWithPassword)\n if (resolvedOp?.wrappers && resolvedOp.wrappers.length > 0) {\n const wrapperLines = generateWrapperMethods(serviceType, resolvedOp, ctx);\n lines.push(...wrapperLines);\n for (const w of resolvedOp.wrappers) {\n emittedMethods.add(methodName(w.name));\n }\n }\n }\n\n return {\n path: goFile,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction resolveGoMethodName(op: Operation, mountName: string, ctx: EmitterContext): string {\n return resolveMethodName(op, { name: mountName, operations: [op] }, ctx);\n}\n\nexport function paramsStructName(mountName: string, method: string): string {\n // Prefix with mount name to avoid cross-file collisions in flat package\n const prefix = className(mountName);\n // If method already starts with the mount name, don't double-prefix\n if (method.startsWith(prefix)) return `${method}Params`;\n return `${prefix}${method}Params`;\n}\n\nfunction generateParamsStruct(\n mountName: string,\n method: string,\n op: Operation,\n plan: OperationPlan,\n ctx: EmitterContext,\n resolvedOp?: ResolvedOperation,\n): string | null {\n // Build set of hidden param names (defaults + inferFromClient)\n const hidden = buildHiddenParams(resolvedOp);\n\n const hasQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n const hasBody = plan.hasBody && op.requestBody;\n\n // Check if body has any visible fields after filtering\n let hasVisibleBodyFields = false;\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n hasVisibleBodyFields = bodyModel.fields.some((f) => !hidden.has(f.name));\n }\n } else if (hasBody) {\n hasVisibleBodyFields = true; // non-model body always visible\n }\n\n if (!hasQueryParams && !hasVisibleBodyFields) return null;\n\n const lines: string[] = [];\n const structName = paramsStructName(mountName, method);\n\n lines.push(`// ${structName} contains the parameters for ${method}.`);\n lines.push(`type ${structName} struct {`);\n\n // Track emitted field names to avoid duplicates\n const emittedFields = new Set<string>();\n\n // Body fields (if body is a model)\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n const goField = fieldName(field.name);\n if (emittedFields.has(goField)) continue;\n emittedFields.add(goField);\n const isOptional = !field.required;\n const goType = isOptional ? makeOptional(mapTypeRef(field.type)) : mapTypeRef(field.type);\n const jsonTag = field.required ? `json:\"${field.name}\"` : `json:\"${field.name},omitempty\"`;\n // If this field also appears in query params, emit a url tag too\n const isAlsoQueryParam = op.queryParams.some((qp) => !hidden.has(qp.name) && fieldName(qp.name) === goField);\n const urlTag = isAlsoQueryParam ? ` url:\"${field.name}${field.required ? '' : ',omitempty'}\"` : '';\n if (field.description) {\n const fdLines = field.description.split('\\n').filter((l) => l.trim());\n lines.push(`\\t// ${fieldDocComment(goField, fdLines[0])}`);\n for (let i = 1; i < fdLines.length; i++) {\n lines.push(`\\t// ${fdLines[i].trim()}`);\n }\n }\n if (field.deprecated) {\n if (field.description) lines.push(`\\t//`);\n lines.push(`\\t// Deprecated: this field is deprecated.`);\n }\n lines.push(`\\t${goField} ${goType} \\`${jsonTag}${urlTag}\\``);\n }\n }\n } else if (hasBody) {\n // Non-model body (generic)\n lines.push('\\tBody interface{} `json:\"-\"`');\n }\n\n // Check if this is a list operation with standard pagination fields.\n // If so, embed PaginationParams and skip those fields individually.\n const PAGINATION_FIELDS = new Set(['before', 'after', 'limit', 'order']);\n const visibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name));\n const hasPaginationFields = ['before', 'after', 'limit'].every((name) =>\n visibleQueryParams.some((qp) => qp.name === name),\n );\n if (hasPaginationFields) {\n lines.push('\\tPaginationParams');\n }\n\n // Query params (skip any already emitted from body fields, hidden params, and pagination fields)\n for (const param of op.queryParams) {\n if (hidden.has(param.name)) continue;\n if (hasPaginationFields && PAGINATION_FIELDS.has(param.name)) continue;\n const goField = fieldName(param.name);\n if (emittedFields.has(goField)) continue;\n emittedFields.add(goField);\n const isOptional = !param.required;\n const paramType = mapQueryParamType(param.name, param.type);\n const goType = isOptional ? makeOptional(paramType) : paramType;\n const urlTag = param.required ? `url:\"${param.name}\"` : `url:\"${param.name},omitempty\"`;\n const jsonTag = 'json:\"-\"';\n if (param.description) {\n const pdLines = param.description.split('\\n').filter((l) => l.trim());\n lines.push(`\\t// ${fieldDocComment(goField, pdLines[0])}`);\n for (let i = 1; i < pdLines.length; i++) {\n lines.push(`\\t// ${pdLines[i].trim()}`);\n }\n }\n if (param.default != null) {\n const defaultLine = `\\t// Defaults to ${JSON.stringify(param.default)}.`;\n if (!param.description) lines.push(defaultLine);\n else lines.push(defaultLine);\n }\n if (param.deprecated) {\n if (param.description || param.default != null) lines.push(`\\t//`);\n lines.push(`\\t// Deprecated: this parameter is deprecated.`);\n }\n lines.push(`\\t${goField} ${goType} \\`${urlTag} ${jsonTag}\\``);\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction generateMethod(\n serviceType: string,\n mountName: string,\n method: string,\n op: Operation,\n plan: OperationPlan,\n _ctx: EmitterContext,\n resolvedOp?: ResolvedOperation,\n): string {\n const lines: string[] = [];\n const isPaginated = plan.isPaginated;\n const isDelete = plan.isDelete;\n const hasBody = plan.hasBody && op.requestBody;\n const hidden = buildHiddenParams(resolvedOp);\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n\n // Check if body has visible fields after filtering hidden params\n let hasVisibleBodyFields = false;\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = _ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n hasVisibleBodyFields = bodyModel.fields.some((f) => !hidden.has(f.name));\n }\n } else if (hasBody) {\n hasVisibleBodyFields = true;\n }\n\n const hasParams = hasVisibleBodyFields || hasVisibleQueryParams;\n const paramsType = hasParams ? `*${paramsStructName(mountName, method)}` : null;\n const bodyArg = hasBody && hasParams ? bodyArgument(op) : 'nil';\n const hasHidden = hasHiddenParams(resolvedOp);\n const isGet = op.httpMethod.toLowerCase() === 'get';\n\n // Detect if response is a raw array (not paginated)\n const isArrayResponse = !isPaginated && op.response?.kind === 'array';\n\n // Return type\n let returnType: string;\n if (isPaginated && op.pagination) {\n const itemType = resolveIteratorItemType(op.pagination.itemType, _ctx);\n returnType = `*Iterator[${itemType}]`;\n } else if (isDelete) {\n returnType = 'error';\n } else if (plan.responseModelName) {\n const respType = className(plan.responseModelName);\n if (isArrayResponse) {\n returnType = `([]${respType}, error)`;\n } else {\n returnType = `(*${respType}, error)`;\n }\n } else {\n returnType = 'error';\n }\n\n // Build godoc -- wrap multi-line descriptions in // comments\n if (op.description) {\n const descLines = op.description.split('\\n').filter((l) => l.trim());\n lines.push(`// ${method} ${lowerFirstDesc(descLines[0])}`);\n for (let i = 1; i < descLines.length; i++) {\n lines.push(`// ${descLines[i].trim()}`);\n }\n }\n for (const p of op.pathParams) {\n if (p.deprecated) {\n lines.push(`//`);\n lines.push(`// Deprecated parameter ${fieldName(p.name)}${p.description ? ': ' + p.description : '.'}`);\n }\n }\n if (op.deprecated) {\n lines.push(`//`);\n lines.push(`// Deprecated: this operation is deprecated.`);\n }\n\n // Method signature\n const params: string[] = ['ctx context.Context'];\n // Path params as positional args (sorted by template order)\n for (const p of sortPathParamsByTemplateOrder(op)) {\n params.push(`${lowerFirst(fieldName(p.name))} ${mapTypeRefValue(p.type)}`);\n }\n if (paramsType) {\n params.push(`params ${paramsType}`);\n }\n params.push('opts ...RequestOption');\n\n if (isPaginated) {\n lines.push(`func (s *${serviceType}) ${method}(${params.join(', ')}) ${returnType} {`);\n } else if (isDelete || !plan.responseModelName) {\n lines.push(`func (s *${serviceType}) ${method}(${params.join(', ')}) ${returnType} {`);\n } else {\n lines.push(`func (s *${serviceType}) ${method}(${params.join(', ')}) ${returnType} {`);\n }\n\n // Build path\n const pathExpr = buildPathExpr(op);\n\n // For GET operations with hidden params, build query via url.Values\n // so we can inject defaults + inferred values alongside user-provided params.\n if (hasHidden && isGet) {\n emitGetWithHiddenParams(\n lines,\n op,\n pathExpr,\n plan,\n _ctx,\n resolvedOp!,\n paramsType,\n isPaginated,\n isDelete,\n isArrayResponse,\n );\n } else if (hasHidden && !isGet && hasBody) {\n // For non-GET operations with hidden params, build a body map\n emitBodyWithHiddenParams(\n lines,\n op,\n pathExpr,\n plan,\n _ctx,\n resolvedOp!,\n paramsType,\n isPaginated,\n isDelete,\n isArrayResponse,\n );\n } else if (isPaginated && op.pagination) {\n const itemType = resolveIteratorItemType(op.pagination.itemType, _ctx);\n const dataPath = op.pagination.dataPath ? `\"${op.pagination.dataPath}\"` : `\"data\"`;\n const cursorParam = '\"after\"';\n lines.push(\n `\\treturn newIterator[${itemType}](ctx, s.client, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${hasVisibleQueryParams ? 'params' : 'nil'}, ${cursorParam}, ${dataPath}, opts)`,\n );\n } else if (isDelete) {\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${hasVisibleQueryParams ? 'params' : 'nil'}, ${bodyArg}, nil, opts)`,\n );\n lines.push('\\treturn err');\n } else if (plan.responseModelName) {\n const respType = className(plan.responseModelName);\n if (isArrayResponse) {\n lines.push(`\\tvar result []${respType}`);\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${hasVisibleQueryParams ? 'params' : 'nil'}, ${bodyArg}, &result, opts)`,\n );\n lines.push('\\tif err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n lines.push('\\treturn result, nil');\n } else {\n lines.push(`\\tvar result ${respType}`);\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${hasVisibleQueryParams ? 'params' : 'nil'}, ${bodyArg}, &result, opts)`,\n );\n lines.push('\\tif err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n lines.push('\\treturn &result, nil');\n }\n } else {\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${hasVisibleQueryParams ? 'params' : 'nil'}, ${bodyArg}, nil, opts)`,\n );\n lines.push('\\treturn err');\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n// buildHiddenParams and hasHiddenParams are imported from ../shared/resolved-ops.js\n\n/** Convert a JS value to a Go literal. */\nfunction goLiteral(value: string | number | boolean): string {\n if (typeof value === 'string') return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\n/** Get the Go expression for reading a client config field. */\nfunction clientFieldExpression(field: string): string {\n switch (field) {\n case 'client_id':\n return 's.client.clientID';\n case 'client_secret':\n return 's.client.apiKey';\n default:\n return `s.client.${lowerFirst(fieldName(field))}`;\n }\n}\n\n/**\n * Emit method body for GET operations that have hidden params (defaults/inferFromClient).\n * Builds a url.Values manually so we can inject hidden values alongside user-provided query params.\n */\nfunction emitGetWithHiddenParams(\n lines: string[],\n op: Operation,\n pathExpr: string,\n plan: OperationPlan,\n ctx: EmitterContext,\n resolvedOp: ResolvedOperation,\n paramsType: string | null,\n isPaginated: boolean,\n isDelete: boolean,\n isArrayResponse: boolean,\n): void {\n const hidden = buildHiddenParams(resolvedOp);\n\n // Build url.Values with hidden + user-provided params\n lines.push('\\tquery := url.Values{}');\n\n // Inject constant defaults\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n lines.push(`\\tquery.Set(\"${key}\", ${goLiteralForQuery(value as string | number | boolean)})`);\n }\n\n // Inject inferred fields from client config\n for (const field of getOpInferFromClient(resolvedOp)) {\n const expr = clientFieldExpression(field);\n lines.push(`\\tif ${expr} != \"\" {`);\n lines.push(`\\t\\tquery.Set(\"${field}\", ${expr})`);\n lines.push('\\t}');\n }\n\n // Add user-provided query params from the struct\n if (paramsType) {\n const visibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name));\n for (const param of visibleQueryParams) {\n const goField = fieldName(param.name);\n const isMap = param.type.kind === 'map';\n if (isMap) {\n // Maps use bracket encoding: param[key]=value\n if (param.required) {\n lines.push(`\\tfor k, v := range params.${goField} {`);\n lines.push(`\\t\\tquery.Set(fmt.Sprintf(\"${param.name}[%s]\", k), fmt.Sprintf(\"%v\", v))`);\n lines.push('\\t}');\n } else {\n lines.push(`\\tif params.${goField} != nil {`);\n lines.push(`\\t\\tfor k, v := range params.${goField} {`);\n lines.push(`\\t\\t\\tquery.Set(fmt.Sprintf(\"${param.name}[%s]\", k), fmt.Sprintf(\"%v\", v))`);\n lines.push('\\t\\t}');\n lines.push('\\t}');\n }\n } else if (param.required) {\n lines.push(`\\tquery.Set(\"${param.name}\", ${formatQueryValue(`params.${goField}`, param.type)})`);\n } else {\n // Slices are reference types in Go -- nil-able without pointer wrapping\n const isRefType = param.type.kind === 'array';\n const valueExpr = isRefType ? `params.${goField}` : `*params.${goField}`;\n lines.push(`\\tif params.${goField} != nil {`);\n lines.push(`\\t\\tquery.Set(\"${param.name}\", ${formatQueryValue(valueExpr, param.type)})`);\n lines.push('\\t}');\n }\n }\n }\n\n // Make the request with query as the 4th arg\n if (isPaginated && op.pagination) {\n const itemType = resolveIteratorItemType(op.pagination.itemType, ctx);\n const dataPath = op.pagination.dataPath ? `\"${op.pagination.dataPath}\"` : `\"data\"`;\n const cursorParam = '\"after\"';\n lines.push(\n `\\treturn newIterator[${itemType}](ctx, s.client, \"GET\", ${pathExpr}, query, ${cursorParam}, ${dataPath}, opts)`,\n );\n } else if (isDelete) {\n lines.push(`\\t_, err := s.client.request(ctx, \"GET\", ${pathExpr}, query, nil, nil, opts)`);\n lines.push('\\treturn err');\n } else if (plan.responseModelName) {\n const respType = className(plan.responseModelName);\n if (isArrayResponse) {\n lines.push(`\\tvar result []${respType}`);\n lines.push(`\\t_, err := s.client.request(ctx, \"GET\", ${pathExpr}, query, nil, &result, opts)`);\n lines.push('\\tif err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n lines.push('\\treturn result, nil');\n } else {\n lines.push(`\\tvar result ${respType}`);\n lines.push(`\\t_, err := s.client.request(ctx, \"GET\", ${pathExpr}, query, nil, &result, opts)`);\n lines.push('\\tif err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n lines.push('\\treturn &result, nil');\n }\n } else {\n lines.push(`\\t_, err := s.client.request(ctx, \"GET\", ${pathExpr}, query, nil, nil, opts)`);\n lines.push('\\treturn err');\n }\n}\n\n/**\n * Emit method body for non-GET operations that have hidden params (defaults/inferFromClient).\n * Builds a body map so we can inject hidden values alongside user-provided fields.\n */\nfunction emitBodyWithHiddenParams(\n lines: string[],\n op: Operation,\n pathExpr: string,\n plan: OperationPlan,\n ctx: EmitterContext,\n resolvedOp: ResolvedOperation,\n paramsType: string | null,\n _isPaginated: boolean,\n isDelete: boolean,\n isArrayResponse: boolean,\n): void {\n const hidden = buildHiddenParams(resolvedOp);\n\n // Build body map\n lines.push('\\tbody := map[string]interface{}{');\n\n // Inject constant defaults\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n lines.push(`\\t\\t\"${key}\": ${goLiteral(value as string | number | boolean)},`);\n }\n\n lines.push('\\t}');\n\n // Inject inferred fields from client config\n for (const field of getOpInferFromClient(resolvedOp)) {\n const expr = clientFieldExpression(field);\n lines.push(`\\tif ${expr} != \"\" {`);\n lines.push(`\\t\\tbody[\"${field}\"] = ${expr}`);\n lines.push('\\t}');\n }\n\n // Add user-provided body fields from the struct\n if (paramsType && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n const goField = fieldName(field.name);\n if (field.required) {\n lines.push(`\\tbody[\"${field.name}\"] = params.${goField}`);\n } else {\n // Slices and maps are reference types in Go — nil-able without pointer wrapping\n const isRefType = field.type.kind === 'array' || field.type.kind === 'map';\n const valueExpr = isRefType ? `params.${goField}` : `*params.${goField}`;\n lines.push(`\\tif params.${goField} != nil {`);\n lines.push(`\\t\\tbody[\"${field.name}\"] = ${valueExpr}`);\n lines.push('\\t}');\n }\n }\n }\n }\n\n // Determine query arg (visible query params from struct)\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n const queryArg = hasVisibleQueryParams ? 'params' : 'nil';\n\n // Make the request\n if (isDelete) {\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${queryArg}, body, nil, opts)`,\n );\n lines.push('\\treturn err');\n } else if (plan.responseModelName) {\n const respType = className(plan.responseModelName);\n if (isArrayResponse) {\n lines.push(`\\tvar result []${respType}`);\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${queryArg}, body, &result, opts)`,\n );\n lines.push('\\tif err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n lines.push('\\treturn result, nil');\n } else {\n lines.push(`\\tvar result ${respType}`);\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${queryArg}, body, &result, opts)`,\n );\n lines.push('\\tif err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n lines.push('\\treturn &result, nil');\n }\n } else {\n lines.push(\n `\\t_, err := s.client.request(ctx, \"${op.httpMethod.toUpperCase()}\", ${pathExpr}, ${queryArg}, body, nil, opts)`,\n );\n lines.push('\\treturn err');\n }\n}\n\n/** Format a Go value as a string for url.Values.Set(). */\nfunction goLiteralForQuery(value: string | number | boolean): string {\n if (typeof value === 'string') return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n if (typeof value === 'boolean') return value ? `\"true\"` : `\"false\"`;\n return `fmt.Sprintf(\"%v\", ${String(value)})`;\n}\n\n/** Format a Go expression to a string suitable for url.Values.Set(). */\nfunction formatQueryValue(expr: string, type: import('@workos/oagen').TypeRef): string {\n if (type.kind === 'primitive') {\n switch (type.type) {\n case 'string':\n return expr;\n case 'integer':\n case 'number':\n return `fmt.Sprintf(\"%v\", ${expr})`;\n case 'boolean':\n return `fmt.Sprintf(\"%v\", ${expr})`;\n default:\n return `fmt.Sprintf(\"%v\", ${expr})`;\n }\n }\n if (type.kind === 'array') {\n return `strings.Join(${expr}, \",\")`;\n }\n return `fmt.Sprintf(\"%v\", ${expr})`;\n}\n\n/**\n * Check if any operations with hidden params also have visible array query params.\n * strings.Join is only generated inside emitGetWithHiddenParams, so the import is\n * only needed when that code path is active AND uses array params.\n */\nfunction needsStringsImport(operations: Operation[], resolvedLookup: Map<string, any>): boolean {\n for (const op of operations) {\n const resolved = lookupResolved(op, resolvedLookup);\n if (!resolved || !hasHiddenParams(resolved)) continue;\n if (op.httpMethod.toLowerCase() !== 'get') continue;\n const hidden = buildHiddenParams(resolved);\n for (const qp of op.queryParams) {\n if (hidden.has(qp.name)) continue;\n if (qp.type.kind === 'array') return true;\n }\n }\n return false;\n}\n\n/**\n * Check if any visible query params in operations use map types,\n * requiring bracket-encoded loop generation.\n */\nfunction _hasMapQueryParams(op: Operation, hidden: Set<string>): boolean {\n return op.queryParams.some((qp) => !hidden.has(qp.name) && qp.type.kind === 'map');\n}\n\nfunction buildPathExpr(op: Operation): string {\n if (op.pathParams.length === 0) {\n return `\"${op.path}\"`;\n }\n // Build fmt.Sprintf expression (sorted by template order)\n let fmtStr = op.path;\n const args: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n fmtStr = fmtStr.replace(`{${p.name}}`, '%s');\n args.push(lowerFirst(fieldName(p.name)));\n }\n return `fmt.Sprintf(\"${fmtStr}\", ${args.join(', ')})`;\n}\n\nfunction bodyArgument(op: Operation): string {\n if (op.requestBody?.kind === 'model') {\n return 'params';\n }\n return 'params.Body';\n}\n\nfunction mapQueryParamType(name: string, type: import('@workos/oagen').TypeRef): string {\n if (name === 'limit' && type.kind === 'primitive' && (type.type === 'integer' || type.type === 'number')) {\n return 'int';\n }\n return mapTypeRef(type);\n}\n\nfunction makeOptional(goType: string): string {\n if (goType.startsWith('*') || goType.startsWith('[]') || goType.startsWith('map[')) {\n return goType;\n }\n return `*${goType}`;\n}\n\n/**\n * Resolve the iterator item type for pagination. If the item type is a list\n * wrapper model (which we skip in models.ts), unwrap it to the actual data item.\n */\nfunction resolveIteratorItemType(itemType: import('@workos/oagen').TypeRef, ctx: EmitterContext): string {\n if (itemType.kind === 'model') {\n // Check if this is a list wrapper model -- if so, unwrap to its data array's item type\n const model = ctx.spec.models.find((m) => m.name === itemType.name);\n if (model && isListWrapperModel(model)) {\n const dataField = model.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n return className(dataField.type.items.name);\n }\n }\n return className(itemType.name);\n }\n return mapTypeRefValue(itemType);\n}\n\n/** Go reserved words that cannot be used as identifiers. */\nconst GO_RESERVED = new Set([\n 'break',\n 'case',\n 'chan',\n 'const',\n 'continue',\n 'default',\n 'defer',\n 'else',\n 'fallthrough',\n 'for',\n 'func',\n 'go',\n 'goto',\n 'if',\n 'import',\n 'interface',\n 'map',\n 'package',\n 'range',\n 'return',\n 'select',\n 'struct',\n 'switch',\n 'type',\n 'var',\n]);\n\nfunction lowerFirst(s: string): string {\n if (!s) return s;\n const result = unexportedName(s);\n // Escape Go reserved words by appending an underscore\n if (GO_RESERVED.has(result)) return `${result}Param`;\n return result;\n}\n\n/** Simple lowercase-first for human-readable descriptions (not identifiers). */\nfunction lowerFirstDesc(s: string): string {\n return lowerFirstForDoc(s);\n}\n\nfunction singularizePascal(name: string): string {\n if (name.endsWith('ies')) {\n return `${name.slice(0, -3)}y`;\n }\n if (name.endsWith('s') && !name.endsWith('ss')) {\n return name.slice(0, -1);\n }\n return name;\n}\n\nfunction serviceTypeName(name: string): string {\n return `${unexportedName(singularizePascal(name))}Service`;\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { toPascalCase, toSnakeCase } from '@workos/oagen';\n// naming utilities used indirectly via resolveResourceClassName\nimport { resolveResourceClassName } from './resources.js';\nimport { unexportedName } from './naming.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Generate the Go client file with service accessors.\n * Produces: workos.go (Client struct + constructor + service accessors).\n * Static files (client.go, pagination.go, errors.go, go.mod, options.go)\n * are hand-maintained in the target SDK with @oagen-ignore-file.\n */\nexport function generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return [generateWorkOSFile(spec, ctx)];\n}\n\n/**\n * Deduplicate services by mount target.\n */\nfunction deduplicateByMount(services: Service[], ctx: EmitterContext): Service[] {\n const byTarget = new Map<string, Service>();\n for (const s of services) {\n const target = getMountTarget(s, ctx);\n const existing = byTarget.get(target);\n if (!existing || toPascalCase(s.name) === target) {\n byTarget.set(target, s);\n }\n }\n return [...byTarget.values()];\n}\n\n/**\n * Build map of service name -> accessor property name.\n */\nexport function buildServiceAccessPaths(services: Service[], ctx: EmitterContext): Map<string, string> {\n const topLevel = deduplicateByMount(services, ctx);\n const paths = new Map<string, string>();\n\n for (const service of topLevel) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const prop = toSnakeCase(resolvedName);\n paths.set(service.name, prop);\n }\n\n // Also map mount targets\n for (const service of services) {\n const target = getMountTarget(service, ctx);\n if (!paths.has(target)) {\n const existing = paths.get(service.name);\n if (existing) paths.set(target, existing);\n }\n }\n\n return paths;\n}\n\nfunction generateWorkOSFile(spec: ApiSpec, ctx: EmitterContext): GeneratedFile {\n const topLevel = deduplicateByMount(spec.services, ctx);\n const lines: string[] = [];\n\n lines.push(`package ${ctx.namespace}`);\n lines.push('');\n lines.push('import \"net/http\"');\n lines.push('');\n\n // Client struct\n lines.push('// Client is the WorkOS API client.');\n lines.push('type Client struct {');\n lines.push('\\tapiKey string');\n lines.push('\\tclientID string');\n lines.push('\\tbaseURL string');\n lines.push('\\thttpClient *http.Client');\n lines.push('\\tmaxRetries int');\n lines.push('');\n // Service fields\n for (const service of topLevel) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const fieldNameStr = unexportedName(resolvedName);\n const serviceTypeName = serviceType(resolvedName);\n lines.push(`\\t${fieldNameStr} *${serviceTypeName}`);\n }\n lines.push('}');\n lines.push('');\n\n // NewClient constructor\n lines.push('// NewClient creates a new WorkOS API client.');\n lines.push('func NewClient(apiKey string, opts ...ClientOption) *Client {');\n lines.push('\\tc := &Client{');\n lines.push('\\t\\tapiKey: apiKey,');\n lines.push('\\t\\tbaseURL: defaultBaseURL,');\n lines.push('\\t\\thttpClient: &http.Client{Timeout: defaultTimeout},');\n lines.push('\\t\\tmaxRetries: defaultMaxRetries,');\n lines.push('\\t}');\n lines.push('\\tfor _, opt := range opts {');\n lines.push('\\t\\topt(c)');\n lines.push('\\t}');\n // Initialize services\n for (const service of topLevel) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const fieldNameStr = unexportedName(resolvedName);\n const serviceTypeName = serviceType(resolvedName);\n lines.push(`\\tc.${fieldNameStr} = &${serviceTypeName}{client: c}`);\n }\n lines.push('\\treturn c');\n lines.push('}');\n lines.push('');\n\n // Service accessor methods\n for (const service of topLevel) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const accessorName = resolvedName;\n const fieldNameStr = unexportedName(resolvedName);\n const serviceTypeName = serviceType(resolvedName);\n lines.push(`// ${accessorName} returns the ${resolvedName} service.`);\n lines.push(`func (c *Client) ${accessorName}() *${serviceTypeName} {`);\n lines.push(`\\treturn c.${fieldNameStr}`);\n lines.push('}');\n lines.push('');\n }\n\n return {\n path: `${ctx.namespace}.go`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction singularizePascal(name: string): string {\n if (name.endsWith('ies')) {\n return `${name.slice(0, -3)}y`;\n }\n if (name.endsWith('s') && !name.endsWith('ss')) {\n return name.slice(0, -1);\n }\n return name;\n}\n\nfunction serviceType(name: string): string {\n return `${unexportedName(singularizePascal(name))}Service`;\n}\n","import type { Model, TypeRef, Enum } from '@workos/oagen';\nimport { fileName, fieldName } from './naming.js';\nimport { isListMetadataModel, isListWrapperModel } from './models.js';\n\n/**\n * Prefix mapping for generating realistic ID fixture values.\n */\nexport const ID_PREFIXES: Record<string, string> = {\n Connection: 'conn_',\n Organization: 'org_',\n OrganizationMembership: 'om_',\n User: 'user_',\n Directory: 'directory_',\n DirectoryGroup: 'dir_grp_',\n DirectoryUser: 'dir_usr_',\n Invitation: 'inv_',\n Session: 'session_',\n AuthenticationFactor: 'auth_factor_',\n EmailVerification: 'email_verification_',\n MagicAuth: 'magic_auth_',\n PasswordReset: 'password_reset_',\n};\n\n/**\n * Generate JSON fixture files for test data.\n */\nexport function generateFixtures(spec: {\n models: Model[];\n enums: Enum[];\n services: any[];\n}): { path: string; content: string }[] {\n if (spec.models.length === 0) return [];\n\n const modelMap = new Map(spec.models.map((m) => [m.name, m]));\n const enumMap = new Map(spec.enums.map((e) => [e.name, e]));\n const files: { path: string; content: string }[] = [];\n\n for (const model of spec.models) {\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n\n const fixture = model.fields.length === 0 ? {} : generateModelFixture(model, modelMap, enumMap);\n\n files.push({\n path: `testdata/${fileName(model.name)}.json`,\n content: JSON.stringify(fixture, null, 2),\n });\n }\n\n // Generate list fixtures for paginated responses\n for (const service of spec.services) {\n for (const op of service.operations) {\n if (op.pagination) {\n let itemModel = op.pagination.itemType.kind === 'model' ? modelMap.get(op.pagination.itemType.name) : null;\n if (itemModel) {\n const unwrapped = unwrapListModel(itemModel, modelMap);\n if (unwrapped) itemModel = unwrapped;\n if (itemModel.fields.length === 0) continue;\n const fixture = generateModelFixture(itemModel, modelMap, enumMap);\n const listFixture = {\n data: [fixture],\n list_metadata: {\n before: null,\n after: null,\n },\n };\n files.push({\n path: `testdata/list_${fileName(itemModel.name)}.json`,\n content: JSON.stringify(listFixture, null, 2),\n });\n }\n }\n }\n }\n\n // Deduplicate fixtures with identical content.\n // When multiple fixtures have the same content, emit one shared file and\n // rewrite the others as references to the shared path.\n const contentGroups = new Map<string, string[]>();\n for (const f of files) {\n if (!contentGroups.has(f.content)) contentGroups.set(f.content, []);\n contentGroups.get(f.content)!.push(f.path);\n }\n\n const pathRewrites = new Map<string, string>();\n for (const [_content, paths] of contentGroups) {\n if (paths.length < 3) continue; // only dedup when 3+ files are identical\n // Use the shortest path as the canonical shared fixture\n const sorted = [...paths].sort((a, b) => a.length - b.length);\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n pathRewrites.set(sorted[i], canonical);\n }\n }\n\n // Remove duplicate files (they'll reference the canonical)\n const deduped = files.filter((f) => !pathRewrites.has(f.path));\n\n return deduped;\n}\n\nfunction unwrapListModel(model: Model, modelMap: Map<string, Model>): Model | null {\n const dataField = model.fields.find((f) => f.name === 'data');\n const hasListMetadata = model.fields.some((f) => f.name === 'list_metadata' || f.name === 'listMetadata');\n if (dataField && hasListMetadata && dataField.type.kind === 'array') {\n const itemType = dataField.type.items;\n if (itemType.kind === 'model') {\n return modelMap.get(itemType.name) ?? null;\n }\n }\n return null;\n}\n\nexport function generateModelFixture(\n model: Model,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): Record<string, any> {\n const fixture: Record<string, any> = {};\n\n const seenFieldNames = new Set<string>();\n const deduplicatedFields = model.fields.filter((f) => {\n const goName = fieldName(f.name);\n if (seenFieldNames.has(goName)) return false;\n seenFieldNames.add(goName);\n return true;\n });\n\n for (const field of deduplicatedFields) {\n const wireName = field.name;\n if (field.example !== undefined) {\n fixture[wireName] = field.example;\n } else {\n fixture[wireName] = generateFieldValue(field.type, field.name, model.name, modelMap, enumMap);\n }\n }\n\n return fixture;\n}\n\nfunction generateFieldValue(\n ref: TypeRef,\n fName: string,\n modelName: string,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): any {\n switch (ref.kind) {\n case 'primitive':\n return generatePrimitiveValue(ref.type, ref.format, fName, modelName);\n case 'literal':\n return ref.value;\n case 'enum': {\n const e = enumMap.get(ref.name);\n return e?.values[0]?.value ?? 'unknown';\n }\n case 'model': {\n const nested = modelMap.get(ref.name);\n if (nested) return generateModelFixture(nested, modelMap, enumMap);\n return {};\n }\n case 'array': {\n if (ref.items.kind === 'enum') {\n const e = enumMap.get(ref.items.name);\n if (e && e.values.length > 0) {\n return e.values.map((v) => v.value);\n }\n }\n const item = generateFieldValue(ref.items, fName, modelName, modelMap, enumMap);\n return [item];\n }\n case 'nullable':\n return generateFieldValue(ref.inner, fName, modelName, modelMap, enumMap);\n case 'union':\n if (ref.variants.length > 0) {\n return generateFieldValue(ref.variants[0], fName, modelName, modelMap, enumMap);\n }\n return null;\n case 'map':\n return {\n key: generateFieldValue(ref.valueType, 'value', modelName, modelMap, enumMap),\n };\n }\n}\n\nfunction generatePrimitiveValue(type: string, format: string | undefined, name: string, modelName: string): any {\n switch (type) {\n case 'string':\n if (format === 'date-time') return '2023-01-01T00:00:00.000Z';\n if (format === 'date') return '2023-01-01';\n if (format === 'uuid') return '00000000-0000-0000-0000-000000000000';\n if (name === 'id') {\n const prefix = ID_PREFIXES[modelName] ?? '';\n return `${prefix}01234`;\n }\n if (name.includes('id')) return `${name}_01234`;\n if (name.includes('email')) return 'test@example.com';\n if (name.includes('url') || name.includes('uri')) return 'https://example.com';\n if (name.includes('name')) return 'Test';\n return `test_${name}`;\n case 'integer':\n return 1;\n case 'number':\n return 1.0;\n case 'boolean':\n return true;\n case 'unknown':\n return {};\n default:\n return null;\n }\n}\n","import type { ApiSpec, Service, Operation, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { planOperation, toSnakeCase } from '@workos/oagen';\nimport { fileName, fieldName as goFieldName, resolveMethodName, methodName as goMethodName } from './naming.js';\nimport { resolveResourceClassName, paramsStructName, sortPathParamsByTemplateOrder } from './resources.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { generateFixtures } from './fixtures.js';\nimport { isListWrapperModel } from './models.js';\nimport { groupByMount, buildResolvedLookup, lookupResolved, buildHiddenParams } from '../shared/resolved-ops.js';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nconst DEFAULT_MODULE_PATH = 'github.com/workos/workos-go/v6';\n\n/** Resolve the Go module path from the output directory's go.mod, or use default. */\nfunction resolveModulePath(ctx: EmitterContext): string {\n if (ctx.outputDir) {\n const goModPath = resolve(ctx.outputDir, 'go.mod');\n if (existsSync(goModPath)) {\n const content = readFileSync(goModPath, 'utf-8');\n const match = content.match(/^module\\s+(\\S+)/m);\n if (match) return match[1];\n }\n }\n return DEFAULT_MODULE_PATH;\n}\n\n/**\n * Generate Go test files and JSON fixtures.\n */\nexport function generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Generate shared test helpers file\n const helperLines: string[] = [];\n helperLines.push(`package ${ctx.namespace}_test`);\n helperLines.push('');\n helperLines.push('import (');\n helperLines.push('\\t\"net/http\"');\n helperLines.push('\\t\"net/http/httptest\"');\n helperLines.push('\\t\"os\"');\n helperLines.push('\\t\"testing\"');\n helperLines.push('');\n helperLines.push(`\\t\"${resolveModulePath(ctx)}\"`);\n helperLines.push('\\t\"github.com/stretchr/testify/require\"');\n helperLines.push(')');\n helperLines.push('');\n helperLines.push('func ptrString(s string) *string { return &s }');\n helperLines.push('func ptrInt(i int) *int { return &i }');\n helperLines.push('');\n helperLines.push(\n `func setupTestServer(t *testing.T, method, path, fixturePath string) (*httptest.Server, *${ctx.namespace}.Client) {`,\n );\n helperLines.push('\\tt.Helper()');\n helperLines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n helperLines.push('\\t\\trequire.Equal(t, method, r.Method)');\n helperLines.push('\\t\\trequire.Equal(t, path, r.URL.Path)');\n helperLines.push('\\t\\tw.Header().Set(\"Content-Type\", \"application/json\")');\n helperLines.push('\\t\\tfixture, err := os.ReadFile(fixturePath)');\n helperLines.push('\\t\\tif err != nil {');\n helperLines.push('\\t\\t\\tt.Fatalf(\"failed to read fixture: %v\", err)');\n helperLines.push('\\t\\t}');\n helperLines.push('\\t\\tw.Write(fixture)');\n helperLines.push('\\t}))');\n helperLines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n helperLines.push('\\treturn server, client');\n helperLines.push('}');\n helperLines.push('');\n files.push({\n path: 'helpers_test.go',\n content: helperLines.join('\\n'),\n overwriteExisting: true,\n });\n\n // Generate fixture JSON files\n const fixtures = generateFixtures(spec);\n for (const fixture of fixtures) {\n files.push({\n path: fixture.path,\n content: fixture.content,\n headerPlacement: 'skip',\n });\n }\n\n // Build access path map\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n\n // Generate per-mount-target test files\n const mountGroups = groupByMount(ctx);\n const testEntries: Array<{ name: string; operations: Operation[] }> =\n mountGroups.size > 0\n ? [...mountGroups].map(([name, group]) => ({ name, operations: group.operations }))\n : spec.services.map((s) => ({\n name: resolveResourceClassName(s, ctx),\n operations: s.operations,\n }));\n\n for (const { name: mountName, operations } of testEntries) {\n if (operations.length === 0) continue;\n const mergedService: Service = { name: mountName, operations };\n const testFile = generateServiceTest(mergedService, spec, ctx, accessPaths);\n if (testFile) files.push(testFile);\n }\n\n return files;\n}\n\nfunction generateServiceTest(\n service: Service,\n spec: ApiSpec,\n ctx: EmitterContext,\n _accessPaths: Map<string, string>,\n): GeneratedFile | null {\n if (service.operations.length === 0) return null;\n\n const resolvedName = resolveResourceClassName(service, ctx);\n const accessorName = resolvedName;\n const testFile = `${toSnakeCase(resolvedName)}_test.go`;\n\n const lines: string[] = [];\n lines.push(`package ${ctx.namespace}_test`);\n lines.push('');\n // Check if any operation uses POST/PUT/PATCH with visible model body fields (for import needs).\n // Union-type bodies don't trigger body validation so don't need io/json imports.\n const resolvedLookupForImports = buildResolvedLookup(ctx);\n const hasBodyOps = service.operations.some((op) => {\n const httpMethod = op.httpMethod.toUpperCase();\n if (httpMethod !== 'POST' && httpMethod !== 'PUT' && httpMethod !== 'PATCH') return false;\n if (op.requestBody?.kind !== 'model') return false;\n const resolved = lookupResolved(op, resolvedLookupForImports);\n const hidden = buildHiddenParams(resolved);\n const bodyModel = spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) return bodyModel.fields.some((f) => !hidden.has(f.name));\n return false;\n });\n\n lines.push('import (');\n lines.push('\\t\"context\"');\n if (hasBodyOps) {\n lines.push('\\t\"encoding/json\"');\n lines.push('\\t\"io\"');\n }\n lines.push('\\t\"net/http\"');\n lines.push('\\t\"net/http/httptest\"');\n lines.push('\\t\"os\"');\n lines.push('\\t\"testing\"');\n lines.push('');\n lines.push(`\\t\"${resolveModulePath(ctx)}\"`);\n lines.push('\\t\"github.com/stretchr/testify/require\"');\n lines.push(')');\n lines.push('');\n // Test helpers (ptrString, ptrInt, setupTestServer) are in helpers_test.go\n\n // Deduplicate test functions by method name\n const emittedTestMethods = new Set<string>();\n for (const op of service.operations) {\n const plan = planOperation(op);\n const method = resolveGoMethodName(op, resolvedName, ctx);\n const isPaginated = plan.isPaginated;\n const isDelete = plan.isDelete;\n\n // Skip duplicate method names (same dedup as resources.ts)\n if (emittedTestMethods.has(method)) continue;\n emittedTestMethods.add(method);\n\n const testName = `Test${accessorName}_${method}`;\n\n if (isPaginated && op.pagination) {\n // Pagination test\n // Find the right fixture -- apply the same unwrap logic as fixtures.ts\n let fixturePath: string | null = null;\n const paginationItemType = op.pagination.itemType;\n if (paginationItemType.kind === 'model') {\n const itemModel = spec.models.find((m) => m.name === paginationItemType.name);\n if (itemModel) {\n let resolved = itemModel;\n if (isListWrapperModel(itemModel)) {\n const dataField = itemModel.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n const inner = spec.models.find((m) => m.name === (dataField.type as any).items.name);\n if (inner) resolved = inner;\n }\n }\n fixturePath = `testdata/list_${fileName(resolved.name)}.json`;\n }\n }\n\n const expectedPath = buildExpectedPath(op);\n\n // Find a filter param to populate (prefer 'limit', then first visible string param)\n const resolvedLookupPag = buildResolvedLookup(ctx);\n const resolvedOpPag = lookupResolved(op, resolvedLookupPag);\n const hiddenPag = buildHiddenParams(resolvedOpPag);\n const visibleQPs = op.queryParams.filter((qp) => !hiddenPag.has(qp.name));\n const limitParam = visibleQPs.find((qp) => qp.name === 'limit');\n const filterParam =\n limitParam ?? visibleQPs.find((qp) => qp.type.kind === 'primitive' && qp.type.type === 'string');\n\n lines.push(`func ${testName}(t *testing.T) {`);\n lines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n lines.push(`\\t\\trequire.Equal(t, \"${op.httpMethod.toUpperCase()}\", r.Method)`);\n lines.push(`\\t\\trequire.Equal(t, \"${expectedPath}\", r.URL.Path)`);\n // Assert filter param in query string\n if (filterParam) {\n const expectedVal = filterParam.name === 'limit' ? '10' : `test_${filterParam.name}`;\n lines.push(`\\t\\trequire.Equal(t, \"${expectedVal}\", r.URL.Query().Get(\"${filterParam.name}\"))`);\n }\n lines.push('\\t\\tw.Header().Set(\"Content-Type\", \"application/json\")');\n lines.push('\\t\\tw.WriteHeader(http.StatusOK)');\n if (fixturePath) {\n lines.push(`\\t\\tfixture, err := os.ReadFile(\"${fixturePath}\")`);\n lines.push('\\t\\tif err != nil {');\n lines.push('\\t\\t\\tt.Fatalf(\"failed to read fixture: %v\", err)');\n lines.push('\\t\\t}');\n lines.push('\\t\\tw.Write(fixture)');\n } else {\n lines.push('\\t\\tw.Write([]byte(`{\"data\":[],\"list_metadata\":{\"before\":null,\"after\":null}}`))');\n }\n lines.push('\\t}))');\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n\n // Build method call with populated filter param\n const callArgs = buildMethodCallArgsWithFilter(op, plan, ctx, resolvedName, filterParam);\n lines.push(`\\titer := client.${accessorName}().${method}(${callArgs})`);\n lines.push('\\trequire.NotNil(t, iter)');\n if (fixturePath) {\n lines.push('\\trequire.True(t, iter.Next())');\n lines.push('\\trequire.NoError(t, iter.Err())');\n lines.push('\\titem := iter.Current()');\n lines.push('\\trequire.NotNil(t, item)');\n }\n lines.push('}');\n lines.push('');\n\n // Empty pagination test\n lines.push(`func ${testName}_Empty(t *testing.T) {`);\n lines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n lines.push('\\t\\tw.Header().Set(\"Content-Type\", \"application/json\")');\n lines.push('\\t\\tw.WriteHeader(http.StatusOK)');\n lines.push('\\t\\tw.Write([]byte(`{\"data\":[],\"list_metadata\":{\"before\":null,\"after\":null}}`))');\n lines.push('\\t}))');\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n lines.push(`\\titer := client.${accessorName}().${method}(${callArgs})`);\n lines.push('\\trequire.False(t, iter.Next())');\n lines.push('\\trequire.NoError(t, iter.Err())');\n lines.push('}');\n lines.push('');\n } else if (isDelete) {\n // Delete test\n const expectedPath = buildExpectedPath(op);\n lines.push(`func ${testName}(t *testing.T) {`);\n lines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n lines.push(`\\t\\trequire.Equal(t, \"${op.httpMethod.toUpperCase()}\", r.Method)`);\n lines.push(`\\t\\trequire.Equal(t, \"${expectedPath}\", r.URL.Path)`);\n lines.push('\\t\\tw.WriteHeader(http.StatusNoContent)');\n lines.push('\\t}))');\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n\n const callArgs = buildMethodCallArgs(op, plan, ctx, resolvedName);\n lines.push(`\\terr := client.${accessorName}().${method}(${callArgs})`);\n lines.push('\\trequire.NoError(t, err)');\n lines.push('}');\n lines.push('');\n } else if (plan.responseModelName) {\n // Success test\n const respModel = plan.responseModelName;\n const isArrayResponse = !isPaginated && op.response?.kind === 'array';\n const fixturePath = `testdata/${fileName(respModel)}.json`;\n const expectedPath = buildExpectedPath(op);\n\n const httpMethodUpper = op.httpMethod.toUpperCase();\n const isBodyMethod = httpMethodUpper === 'POST' || httpMethodUpper === 'PUT' || httpMethodUpper === 'PATCH';\n\n lines.push(`func ${testName}(t *testing.T) {`);\n lines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n lines.push(`\\t\\trequire.Equal(t, \"${httpMethodUpper}\", r.Method)`);\n lines.push(`\\t\\trequire.Equal(t, \"${expectedPath}\", r.URL.Path)`);\n\n // Validate request body for POST/PUT/PATCH when body fields are actually sent.\n // Skip for union-type bodies (test sends empty Body interface{}) and operations\n // where all body fields are hidden.\n const resolvedLookup = buildResolvedLookup(ctx);\n const resolvedOp = lookupResolved(op, resolvedLookup);\n const hiddenSet = buildHiddenParams(resolvedOp);\n let hasVisibleBody = false;\n if (isBodyMethod && op.requestBody?.kind === 'model') {\n const bodyModel = spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n hasVisibleBody = bodyModel.fields.some((f) => !hiddenSet.has(f.name));\n }\n }\n // Don't validate body for union types -- test sends nil Body\n if (hasVisibleBody) {\n lines.push('\\t\\tbody, _ := io.ReadAll(r.Body)');\n lines.push('\\t\\tvar bodyMap map[string]interface{}');\n lines.push('\\t\\trequire.NoError(t, json.Unmarshal(body, &bodyMap))');\n }\n\n lines.push('\\t\\tw.Header().Set(\"Content-Type\", \"application/json\")');\n lines.push('\\t\\tw.WriteHeader(http.StatusOK)');\n if (isArrayResponse) {\n lines.push(`\\t\\tfixture, err := os.ReadFile(\"${fixturePath}\")`);\n lines.push('\\t\\tif err != nil {');\n lines.push('\\t\\t\\tt.Fatalf(\"failed to read fixture: %v\", err)');\n lines.push('\\t\\t}');\n lines.push('\\t\\tw.Write([]byte(\"[\" + string(fixture) + \"]\"))');\n } else {\n lines.push(`\\t\\tfixture, err := os.ReadFile(\"${fixturePath}\")`);\n lines.push('\\t\\tif err != nil {');\n lines.push('\\t\\t\\tt.Fatalf(\"failed to read fixture: %v\", err)');\n lines.push('\\t\\t}');\n lines.push('\\t\\tw.Write(fixture)');\n }\n lines.push('\\t}))');\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n\n const callArgs = buildMethodCallArgs(op, plan, ctx, resolvedName);\n lines.push(`\\tresult, err := client.${accessorName}().${method}(${callArgs})`);\n lines.push('\\trequire.NoError(t, err)');\n if (isArrayResponse) {\n lines.push('\\trequire.NotEmpty(t, result)');\n } else {\n lines.push('\\trequire.NotNil(t, result)');\n // Add specific field value assertions from fixture data\n const respModelDef = spec.models.find((m) => m.name === respModel);\n if (respModelDef) {\n const fixtureAssertions = buildFixtureAssertions(respModelDef, ctx.namespace);\n for (const assertion of fixtureAssertions) {\n lines.push(`\\t${assertion}`);\n }\n }\n }\n lines.push('}');\n lines.push('');\n } else {\n // Void response test\n const expectedPath = buildExpectedPath(op);\n lines.push(`func ${testName}(t *testing.T) {`);\n lines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n lines.push(`\\t\\trequire.Equal(t, \"${op.httpMethod.toUpperCase()}\", r.Method)`);\n lines.push(`\\t\\trequire.Equal(t, \"${expectedPath}\", r.URL.Path)`);\n lines.push('\\t\\tw.WriteHeader(http.StatusOK)');\n lines.push('\\t}))');\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n\n const callArgs = buildMethodCallArgs(op, plan, ctx, resolvedName);\n lines.push(`\\terr := client.${accessorName}().${method}(${callArgs})`);\n lines.push('\\trequire.NoError(t, err)');\n lines.push('}');\n lines.push('');\n }\n }\n\n // Generate tests for union split wrapper methods (e.g., AuthenticateWithPassword)\n const resolvedLookup = buildResolvedLookup(ctx);\n for (const op of service.operations) {\n const resolved = lookupResolved(op, resolvedLookup);\n if (!resolved?.wrappers || resolved.wrappers.length === 0) continue;\n\n for (const wrapper of resolved.wrappers) {\n const wrapperMethod = goMethodName(wrapper.name);\n if (emittedTestMethods.has(wrapperMethod)) continue;\n emittedTestMethods.add(wrapperMethod);\n\n const wrapperParamsStruct = `${wrapperMethod}Params`;\n const responseType = wrapper.responseModelName;\n const testName = `Test${accessorName}_${wrapperMethod}`;\n const fixturePath = responseType ? `testdata/${fileName(responseType)}.json` : null;\n\n const wrapperCallArgs: string[] = ['context.Background()'];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n wrapperCallArgs.push(`\"test_${p.name}\"`);\n }\n wrapperCallArgs.push(`&${ctx.namespace}.${wrapperParamsStruct}{}`);\n\n lines.push(\n ...generateWrapperTestLines(\n testName,\n accessorName,\n wrapperMethod,\n op.httpMethod.toUpperCase(),\n buildExpectedPath(op),\n fixturePath,\n wrapperCallArgs.join(', '),\n responseType,\n ctx.namespace,\n ),\n );\n }\n }\n\n // Error test (one per file: 401)\n const sampleOp = service.operations[0];\n if (sampleOp) {\n const plan = planOperation(sampleOp);\n const method = resolveGoMethodName(sampleOp, resolvedName, ctx);\n const callArgs = buildMethodCallArgs(sampleOp, plan, ctx, resolvedName);\n\n lines.push(`func Test${accessorName}_Error401(t *testing.T) {`);\n lines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n lines.push('\\t\\tw.Header().Set(\"Content-Type\", \"application/json\")');\n lines.push('\\t\\tw.WriteHeader(http.StatusUnauthorized)');\n lines.push('\\t\\tw.Write([]byte(`{\"code\":\"unauthorized\",\"message\":\"Unauthorized\"}`))');\n lines.push('\\t}))');\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n\n if (plan.isPaginated) {\n lines.push(`\\titer := client.${accessorName}().${method}(${callArgs})`);\n lines.push('\\trequire.False(t, iter.Next())');\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.AuthenticationError{}, iter.Err())`);\n } else if (plan.isDelete || !plan.responseModelName) {\n lines.push(`\\terr := client.${accessorName}().${method}(${callArgs})`);\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.AuthenticationError{}, err)`);\n } else {\n lines.push(`\\t_, err := client.${accessorName}().${method}(${callArgs})`);\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.AuthenticationError{}, err)`);\n }\n lines.push('}');\n lines.push('');\n\n // Error 404 test\n lines.push(`func Test${accessorName}_Error404(t *testing.T) {`);\n lines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n lines.push('\\t\\tw.Header().Set(\"Content-Type\", \"application/json\")');\n lines.push('\\t\\tw.WriteHeader(http.StatusNotFound)');\n lines.push('\\t\\tw.Write([]byte(`{\"code\":\"not_found\",\"message\":\"Not Found\"}`))');\n lines.push('\\t}))');\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n\n if (plan.isPaginated) {\n lines.push(`\\titer := client.${accessorName}().${method}(${callArgs})`);\n lines.push('\\trequire.False(t, iter.Next())');\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.NotFoundError{}, iter.Err())`);\n } else if (plan.isDelete || !plan.responseModelName) {\n lines.push(`\\terr := client.${accessorName}().${method}(${callArgs})`);\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.NotFoundError{}, err)`);\n } else {\n lines.push(`\\t_, err := client.${accessorName}().${method}(${callArgs})`);\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.NotFoundError{}, err)`);\n }\n lines.push('}');\n lines.push('');\n\n // Error 422 test\n lines.push(`func Test${accessorName}_Error422(t *testing.T) {`);\n lines.push('\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {');\n lines.push('\\t\\tw.Header().Set(\"Content-Type\", \"application/json\")');\n lines.push('\\t\\tw.WriteHeader(422)');\n lines.push('\\t\\tw.Write([]byte(`{\"code\":\"unprocessable_entity\",\"message\":\"Unprocessable\"}`))');\n lines.push('\\t}))');\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithBaseURL(server.URL))`);\n\n if (plan.isPaginated) {\n lines.push(`\\titer := client.${accessorName}().${method}(${callArgs})`);\n lines.push('\\trequire.False(t, iter.Next())');\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.UnprocessableEntityError{}, iter.Err())`);\n } else if (plan.isDelete || !plan.responseModelName) {\n lines.push(`\\terr := client.${accessorName}().${method}(${callArgs})`);\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.UnprocessableEntityError{}, err)`);\n } else {\n lines.push(`\\t_, err := client.${accessorName}().${method}(${callArgs})`);\n lines.push(`\\trequire.IsType(t, &${ctx.namespace}.UnprocessableEntityError{}, err)`);\n }\n lines.push('}');\n lines.push('');\n }\n\n return {\n path: testFile,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction resolveGoMethodName(op: Operation, mountName: string, ctx: EmitterContext): string {\n return resolveMethodName(op, { name: mountName, operations: [op] }, ctx);\n}\n\nfunction buildMethodCallArgs(op: Operation, plan: any, ctx: EmitterContext, mountName: string): string {\n const args: string[] = ['context.Background()'];\n\n // Path params (sorted by template order)\n for (const p of sortPathParamsByTemplateOrder(op)) {\n args.push(`\"test_${p.name}\"`);\n }\n\n // Params struct if needed — must mirror resources.ts hasParams logic\n const resolvedLookup = buildResolvedLookup(ctx);\n const resolvedOp = lookupResolved(op, resolvedLookup);\n const hidden = buildHiddenParams(resolvedOp);\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n const hasBody = plan.hasBody && op.requestBody;\n let hasVisibleBodyFields = false;\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n hasVisibleBodyFields = bodyModel.fields.some((f) => !hidden.has(f.name));\n }\n } else if (hasBody) {\n hasVisibleBodyFields = true;\n }\n\n if (hasVisibleBodyFields || hasVisibleQueryParams) {\n const method = resolveGoMethodName(op, mountName, ctx);\n const pName = paramsStructName(mountName, method);\n args.push(`&${ctx.namespace}.${pName}{}`);\n }\n\n return args.join(', ');\n}\n\n/**\n * Build method call args with a populated filter param for list tests.\n * If filterParam is provided, populates it in the params struct initializer.\n */\nfunction buildMethodCallArgsWithFilter(\n op: Operation,\n plan: any,\n ctx: EmitterContext,\n mountName: string,\n filterParam?: { name: string; type: import('@workos/oagen').TypeRef } | null,\n): string {\n const args: string[] = ['context.Background()'];\n\n for (const p of sortPathParamsByTemplateOrder(op)) {\n args.push(`\"test_${p.name}\"`);\n }\n\n const resolvedLookup = buildResolvedLookup(ctx);\n const resolvedOp = lookupResolved(op, resolvedLookup);\n const hidden = buildHiddenParams(resolvedOp);\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n const hasBody = plan.hasBody && op.requestBody;\n let hasVisibleBodyFields = false;\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n hasVisibleBodyFields = bodyModel.fields.some((f) => !hidden.has(f.name));\n }\n } else if (hasBody) {\n hasVisibleBodyFields = true;\n }\n\n if (hasVisibleBodyFields || hasVisibleQueryParams) {\n const method = resolveGoMethodName(op, mountName, ctx);\n const pName = paramsStructName(mountName, method);\n if (filterParam) {\n const isPaginationField = ['before', 'after', 'limit', 'order'].includes(filterParam.name);\n // Check if params struct embeds PaginationParams (has before/after/limit)\n const allQPs = op.queryParams.filter((qp) => !hidden.has(qp.name));\n const embedsPagination = ['before', 'after', 'limit'].every((name) => allQPs.some((qp) => qp.name === name));\n const goField = goFieldName(filterParam.name);\n\n let valExpr: string;\n if (filterParam.name === 'limit') {\n valExpr = `${goField}: ptrInt(10)`;\n } else {\n valExpr = `${goField}: ptrString(\"test_${filterParam.name}\")`;\n }\n\n if (isPaginationField && embedsPagination) {\n // Pagination fields are embedded — set via embedded struct\n args.push(`&${ctx.namespace}.${pName}{PaginationParams: ${ctx.namespace}.PaginationParams{${valExpr}}}`);\n } else {\n args.push(`&${ctx.namespace}.${pName}{${valExpr}}`);\n }\n } else {\n args.push(`&${ctx.namespace}.${pName}{}`);\n }\n }\n\n return args.join(', ');\n}\n\n/** Build the expected URL path with test placeholder values. */\nfunction buildExpectedPath(op: Operation): string {\n let expected = op.path;\n for (const p of sortPathParamsByTemplateOrder(op)) {\n expected = expected.replace(`{${p.name}}`, `test_${p.name}`);\n }\n return expected;\n}\n\nfunction generateWrapperTestLines(\n testName: string,\n accessorName: string,\n wrapperMethod: string,\n httpMethod: string,\n expectedPath: string,\n fixturePath: string | null,\n callArgs: string,\n responseType: string | null,\n namespace: string,\n): string[] {\n const lines: string[] = [];\n const serverHandler = [\n '\\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {',\n `\\t\\trequire.Equal(t, \"${httpMethod}\", r.Method)`,\n `\\t\\trequire.Equal(t, \"${expectedPath}\", r.URL.Path)`,\n '\\t\\tw.Header().Set(\"Content-Type\", \"application/json\")',\n '\\t\\tw.WriteHeader(http.StatusOK)',\n ];\n if (fixturePath) {\n serverHandler.push(`\\t\\tfixture, err := os.ReadFile(\"${fixturePath}\")`);\n serverHandler.push('\\t\\tif err != nil {');\n serverHandler.push('\\t\\t\\tt.Fatalf(\"failed to read fixture: %v\", err)');\n serverHandler.push('\\t\\t}');\n serverHandler.push('\\t\\tw.Write(fixture)');\n } else {\n serverHandler.push('\\t\\tw.Write([]byte(`{}`))');\n }\n serverHandler.push('\\t}))');\n\n // Add body validation for wrapper POST methods before building handler lines\n const isWrapperBodyMethod = httpMethod === 'POST' || httpMethod === 'PUT' || httpMethod === 'PATCH';\n if (isWrapperBodyMethod) {\n const headerIdx = serverHandler.findIndex((l) => l.includes('w.Header().Set'));\n if (headerIdx >= 0) {\n serverHandler.splice(\n headerIdx,\n 0,\n '\\t\\tbody, _ := io.ReadAll(r.Body)',\n '\\t\\tvar bodyMap map[string]interface{}',\n '\\t\\trequire.NoError(t, json.Unmarshal(body, &bodyMap))',\n );\n }\n }\n\n lines.push(`func ${testName}(t *testing.T) {`);\n lines.push(...serverHandler);\n lines.push('\\tdefer server.Close()');\n lines.push('');\n lines.push(`\\tclient := ${namespace}.NewClient(\"sk_test\", ${namespace}.WithBaseURL(server.URL))`);\n\n if (responseType) {\n lines.push(`\\tresult, err := client.${accessorName}().${wrapperMethod}(${callArgs})`);\n lines.push('\\trequire.NoError(t, err)');\n lines.push('\\trequire.NotNil(t, result)');\n } else {\n lines.push(`\\terr := client.${accessorName}().${wrapperMethod}(${callArgs})`);\n lines.push('\\trequire.NoError(t, err)');\n }\n\n lines.push('}');\n lines.push('');\n return lines;\n}\n\n/**\n * Build field value assertions from fixture data for a response model.\n * Returns Go assertion lines (without leading \\t).\n * Checks id field and 1-2 other required string fields.\n */\nfunction buildFixtureAssertions(model: import('@workos/oagen').Model, _namespace: string): string[] {\n const assertions: string[] = [];\n const fixtureValues = generateModelFixtureValues(model);\n\n // Priority: assert the 'id' field first\n const idField = model.fields.find((f) => f.required && f.name === 'id');\n if (idField && fixtureValues[idField.name] != null) {\n const goField = goFieldName(idField.name);\n const val = fixtureValues[idField.name];\n if (typeof val === 'string' && isGoStringSafe(val)) {\n assertions.push(`require.Equal(t, \"${escapeGoString(val)}\", result.${goField})`);\n } else {\n assertions.push(`require.NotEmpty(t, result.${goField})`);\n }\n }\n\n // Assert 1-2 other required string fields\n let extraCount = 0;\n for (const field of model.fields) {\n if (extraCount >= 2) break;\n if (field.name === 'id') continue;\n if (!field.required) continue;\n if (field.type.kind !== 'primitive' || field.type.type !== 'string') continue;\n const val = fixtureValues[field.name];\n if (val == null) continue;\n const goField = goFieldName(field.name);\n if (typeof val === 'string' && isGoStringSafe(val)) {\n assertions.push(`require.Equal(t, \"${escapeGoString(val)}\", result.${goField})`);\n } else {\n assertions.push(`require.NotEmpty(t, result.${goField})`);\n }\n extraCount++;\n }\n\n // Fallback: at least assert NotEmpty on the first required string field\n if (assertions.length === 0) {\n const targetField =\n model.fields.find((f) => f.required && f.name === 'id') ||\n model.fields.find((f) => f.required && f.type.kind === 'primitive' && f.type.type === 'string');\n if (targetField) {\n assertions.push(`require.NotEmpty(t, result.${goFieldName(targetField.name)})`);\n }\n }\n\n return assertions;\n}\n\n/** Check if a string value can be safely embedded in a Go double-quoted string. */\nfunction isGoStringSafe(val: string): boolean {\n // Skip values that look like JSON objects/arrays or contain template expressions\n if (val.includes('{') || val.includes('}') || val.includes('`')) return false;\n return true;\n}\n\n/** Escape special characters for a Go double-quoted string. */\nfunction escapeGoString(val: string): string {\n return val.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n');\n}\n\n/** Generate fixture values for a model (same logic as fixtures.ts but inline). */\nfunction generateModelFixtureValues(model: import('@workos/oagen').Model): Record<string, any> {\n const fixture: Record<string, any> = {};\n for (const field of model.fields) {\n if (field.example !== undefined) {\n fixture[field.name] = field.example;\n } else if (field.type.kind === 'primitive' && field.type.type === 'string') {\n if (field.name === 'id') {\n const prefix = (ID_PREFIXES as Record<string, string>)[model.name] ?? '';\n fixture[field.name] = `${prefix}01234`;\n } else if (field.name.includes('email')) {\n fixture[field.name] = 'test@example.com';\n } else if (field.name.includes('name')) {\n fixture[field.name] = 'Test';\n } else {\n fixture[field.name] = `test_${field.name}`;\n }\n }\n }\n return fixture;\n}\n\n// Re-import fixture ID prefixes\nimport { ID_PREFIXES } from './fixtures.js';\n","import type { ApiSpec, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { resolveMethodName } from './naming.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Generate smoke test manifest mapping HTTP operations to SDK methods.\n */\nexport function generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const manifest: Record<string, { sdkMethod: string; service: string }> = {};\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n\n for (const service of spec.services) {\n let propName = accessPaths.get(service.name);\n if (!propName) {\n const mountTarget = getMountTarget(service, ctx);\n propName = accessPaths.get(mountTarget);\n }\n if (!propName) {\n throw new Error(`Missing public client access path for service ${service.name}`);\n }\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const method = resolveMethodName(op, service, ctx);\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return [\n {\n path: 'smoke-manifest.json',\n content: JSON.stringify(manifest, null, 2),\n integrateTarget: false,\n },\n ];\n}\n","import type {\n Emitter,\n EmitterContext,\n FormatCommand,\n GeneratedFile,\n ApiSpec,\n Model,\n Enum,\n Service,\n} from '@workos/oagen';\n\nimport { generateModels } from './models.js';\nimport { enrichModelsFromSpec, getSyntheticEnums } from '../shared/model-utils.js';\nimport { generateEnums } from './enums.js';\nimport { generateResources } from './resources.js';\nimport { generateClient } from './client.js';\nimport { generateTests } from './tests.js';\nimport { generateManifest } from './manifest.js';\n\n/** Ensure every generated file's content ends with a trailing newline. */\nfunction ensureTrailingNewlines(files: GeneratedFile[]): GeneratedFile[] {\n for (const f of files) {\n if (f.content && !f.content.endsWith('\\n')) {\n f.content += '\\n';\n }\n }\n return files;\n}\n\nexport const goEmitter: Emitter = {\n language: 'go',\n\n generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n // Enrich models by flattening oneOf/allOf+oneOf variant fields from the raw spec\n const enriched = enrichModelsFromSpec(models);\n return ensureTrailingNewlines(generateModels(enriched, ctx));\n },\n\n generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n // Merge synthetic enums produced during model enrichment (inline oneOf\n // definitions) so they get proper type definitions in enums.go.\n const syntheticEnums = getSyntheticEnums();\n return ensureTrailingNewlines(generateEnums([...enums, ...syntheticEnums], ctx));\n },\n\n generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateResources(services, ctx));\n },\n\n generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateClient(spec, ctx));\n },\n\n generateErrors(): GeneratedFile[] {\n return [];\n },\n\n generateTypeSignatures(): GeneratedFile[] {\n // Go uses inline type annotations -- no separate type signature files needed\n return [];\n },\n\n generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateTests(spec, ctx));\n },\n\n generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateManifest(spec, ctx));\n },\n\n fileHeader(): string {\n return '// Code generated by oagen. DO NOT EDIT.';\n },\n\n formatCommand(targetDir: string): FormatCommand | null {\n // Pass targetDir as the first path so gofmt formats the entire directory\n // (including hand-maintained files), not just the generated file list.\n return {\n cmd: 'gofmt',\n args: ['-w', targetDir],\n batchSize: 999999,\n };\n },\n};\n","import type { Operation, Service, EmitterContext } from '@workos/oagen';\nimport { toPascalCase, toSnakeCase } from '@workos/oagen';\nimport { buildResolvedLookup, lookupMethodName, getMountTarget } from '../shared/resolved-ops.js';\nimport { stripUrnPrefix } from '../shared/naming-utils.js';\n\n/** PascalCase class/type name. */\nexport function className(name: string): string {\n return toPascalCase(stripUrnPrefix(name));\n}\n\n/** PascalCase file name (without extension). */\nexport function fileName(name: string): string {\n return toPascalCase(stripUrnPrefix(name));\n}\n\n/** snake_case file name for fixtures/test data. */\nexport function fixtureFileName(name: string): string {\n return toSnakeCase(stripUrnPrefix(name));\n}\n\n/** PascalCase method name. */\nexport function methodName(name: string): string {\n return toPascalCase(name);\n}\n\n/** PascalCase property name. */\nexport function fieldName(name: string): string {\n return toPascalCase(name);\n}\n\n/** PascalCase directory name for service modules. */\nexport function moduleName(name: string): string {\n return toPascalCase(name);\n}\n\n/** PascalCase property name for service accessors on the client. */\nexport function servicePropertyName(name: string): string {\n return className(name);\n}\n\n/** Resolve the effective service name using resolved operations. */\nexport function resolveServiceName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n/** Build a map from IR service name to resolved service name. */\nexport function buildServiceNameMap(services: Service[], ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of services) {\n map.set(service.name, resolveServiceName(service, ctx));\n }\n return map;\n}\n\n/** Resolve the output directory for a service. */\nexport function resolveServiceDir(resolvedServiceName: string): string {\n return moduleName(resolvedServiceName);\n}\n\n/** Resolve the SDK method name for an operation. */\nexport function resolveMethodName(op: Operation, _service: Service, ctx: EmitterContext): string {\n const lookup = buildResolvedLookup(ctx);\n const resolved = lookupMethodName(op, lookup);\n if (resolved) return trimMountedResourceFromMethod(methodName(resolved), resolveClassName(_service, ctx));\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup?.methodByOperation?.get(httpKey);\n if (existing) return trimMountedResourceFromMethod(methodName(existing.methodName), resolveClassName(_service, ctx));\n return trimMountedResourceFromMethod(methodName(op.name), resolveClassName(_service, ctx));\n}\n\n/** Resolve the SDK class name for a service. */\nexport function resolveClassName(service: Service, ctx: EmitterContext): string {\n for (const r of ctx.resolvedOperations ?? []) {\n if (r.service.name === service.name) return className(r.mountOn);\n }\n if (ctx.overlayLookup?.methodByOperation) {\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup.methodByOperation.get(httpKey);\n if (existing) return className(existing.className);\n }\n }\n return className(service.name);\n}\n\n/** Build a map from IR service name to mount-target directory name. */\nexport function buildMountDirMap(ctx: EmitterContext): Map<string, string> {\n const map = new Map<string, string>();\n for (const service of ctx.spec.services) {\n const target = getMountTarget(service, ctx);\n map.set(service.name, moduleName(target));\n }\n return map;\n}\n\nfunction splitPascalWords(name: string): string[] {\n return name.match(/[A-Z]+(?:[a-z]+|(?=[A-Z]|$))|[A-Z]?[a-z]+|[0-9]+/g) ?? [name];\n}\n\nfunction singularize(word: string): string {\n if (word.endsWith('ies') && word.length > 3) {\n return `${word.slice(0, -3)}y`;\n }\n if (word.endsWith('s') && !word.endsWith('ss')) {\n return word.slice(0, -1);\n }\n return word;\n}\n\nfunction wordsMatch(left: string, right: string): boolean {\n return singularize(left.toLowerCase()) === singularize(right.toLowerCase());\n}\n\nfunction trimMountedResourceFromMethod(method: string, mountName: string): string {\n const methodWords = splitPascalWords(method);\n if (methodWords.length < 2) return method;\n\n const mountWords = splitPascalWords(className(mountName));\n if (mountWords.length === 0) return method;\n\n let matched = 0;\n while (\n matched < mountWords.length &&\n matched + 1 < methodWords.length &&\n wordsMatch(methodWords[matched + 1], mountWords[matched])\n ) {\n matched++;\n }\n\n if (matched === 0) return method;\n\n return [methodWords[0], ...methodWords.slice(matched + 1)].join('');\n}\n\n/** Service type name for the class declaration. */\nexport function serviceTypeName(name: string): string {\n // Preserve pluralization for C# service names (OrganizationsService, not OrganizationService)\n return `${className(name)}Service`;\n}\n\n/** camelCase for local variables. */\nexport function localName(name: string): string {\n const pascal = toPascalCase(name);\n if (!pascal) return pascal;\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/** Escape a value as a C# literal. */\nexport function csLiteral(value: string | number | boolean): string {\n if (typeof value === 'string') return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\n/** Map a wire field name to the WorkOSClient property expression. */\nexport function clientFieldExpression(field: string): string {\n switch (field) {\n case 'client_id':\n return 'ClientId';\n case 'client_secret':\n return 'ApiKey';\n default:\n return fieldName(field);\n }\n}\n\n/** Convert an HTTP method string to the C# HttpMethod static property name. */\nexport function httpMethodCs(method: string): string {\n const m = method.toLowerCase();\n switch (m) {\n case 'get':\n return 'Get';\n case 'post':\n return 'Post';\n case 'put':\n return 'Put';\n case 'patch':\n return 'Patch';\n case 'delete':\n return 'Delete';\n case 'head':\n return 'Head';\n case 'options':\n return 'Options';\n default:\n return 'Get';\n }\n}\n\n/**\n * Return the name of the Service base-class helper that handles the given\n * HTTP method (e.g., `GetAsync`, `PostAsync`). Used by the resource emitter\n * to produce one-line service methods instead of inlined WorkOSRequest blocks.\n */\nexport function httpMethodHelperName(method: string): string {\n const m = method.toLowerCase();\n switch (m) {\n case 'get':\n return 'GetAsync';\n case 'post':\n return 'PostAsync';\n case 'put':\n return 'PutAsync';\n case 'patch':\n return 'PatchAsync';\n case 'delete':\n return 'DeleteAsync';\n default:\n return 'GetAsync';\n }\n}\n\n/** Escape XML special characters for use in XML doc comments. */\nexport function escapeXml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/**\n * Distill a deprecation message from a spec description. Looks for common\n * WorkOS patterns (\"Deprecated. Use X.\", \"Use X instead.\", etc.) and falls\n * back to a generic message scoped to the item kind.\n *\n * Output is suitable for inlining into `[System.Obsolete(\"...\")]`.\n */\nexport function deprecationMessage(\n description: string | undefined | null,\n kind: 'field' | 'parameter' | 'operation' | 'value',\n): string {\n const generic = `This ${kind} is deprecated.`;\n if (!description) return generic;\n\n const text = description.replace(/\\s+/g, ' ').trim();\n if (!text) return generic;\n\n // Match: \"Deprecated. Use `foo` instead.\" / \"Deprecated: use Foo.\"\n const deprecatedClause = text.match(/Deprecated[.:][\\s]*(.*?)(?:\\.|$)/i);\n if (deprecatedClause?.[1]?.trim()) {\n return `Deprecated. ${deprecatedClause[1].trim().replace(/\\.$/, '')}.`;\n }\n\n // Match: \"Use `foo` instead.\" anywhere in the description\n const useInstead = text.match(/Use\\s+`?([^`.\\s]+)`?\\s+instead/i);\n if (useInstead) {\n return `${generic.replace(/\\.$/, '')} Use \\`${useInstead[1]}\\` instead.`;\n }\n\n return generic;\n}\n\n/**\n * Escape a C# string literal for use inside `[System.Obsolete(\"...\")]`.\n * Doubles embedded quotes and escapes backslashes.\n */\nexport function escapeCsAttributeString(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Emit an XML doc summary block from a possibly multi-line spec description.\n * The first non-empty line becomes the `<summary>`. If there are additional\n * non-empty lines, they are emitted as `<remarks>...</remarks>` so users get\n * the full context in tooling (IntelliSense / `dotnet help`) instead of just\n * the first sentence.\n *\n * Returns an empty array if `description` is null/empty so callers can spread\n * the result unconditionally.\n */\nexport function emitXmlDoc(description: string | undefined | null, indent: string): string[] {\n if (!description) return [];\n const lines = description\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l);\n if (lines.length === 0) return [];\n\n const out: string[] = [];\n out.push(`${indent}/// <summary>${escapeXml(lines[0])}</summary>`);\n if (lines.length > 1) {\n out.push(`${indent}/// <remarks>`);\n for (const remark of lines.slice(1)) {\n out.push(`${indent}/// ${escapeXml(remark)}`);\n }\n out.push(`${indent}/// </remarks>`);\n }\n return out;\n}\n\n/**\n * Convert a snake_case or camelCase name to a human-readable string.\n * Preserves acronyms (SSO, API, URL, JWT, OIDC, …) as uppercase tokens and\n * lowercases the rest so generated XML docs read naturally.\n */\nexport function humanize(name: string): string {\n // Split on underscores and at camelCase boundaries, keeping acronym runs\n // intact: `SSOConnection` → [\"SSO\", \"Connection\"]; `listUsers` → [\"list\",\n // \"Users\"]; `api_key` → [\"api\", \"key\"].\n const parts = name.split('_').flatMap((segment) =>\n segment\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .split(/\\s+/)\n .filter(Boolean),\n );\n return parts.map((p) => (isAcronymToken(p) ? p : p.toLowerCase())).join(' ');\n}\n\n/** True when a single token looks like a runtime acronym (2+ uppercase letters). */\nfunction isAcronymToken(token: string): boolean {\n if (token.length < 2) return false;\n return /^[A-Z0-9]+$/.test(token);\n}\n\n/**\n * Return the English indefinite article (\"a\" or \"an\") appropriate for the\n * given humanized phrase. Uses the first spoken letter of the first word\n * and accounts for common silent-h / vowel-like-consonant cases so\n * generated docs read correctly.\n */\nexport function articleFor(phrase: string): string {\n const trimmed = phrase.trim();\n if (!trimmed) return 'a';\n const firstWord = trimmed.split(/\\s+/)[0];\n if (!firstWord) return 'a';\n // Acronyms are voiced letter-by-letter — use the first letter's sound.\n if (isAcronymToken(firstWord)) {\n return /^[AEFHILMNORSX]/.test(firstWord) ? 'an' : 'a';\n }\n const first = firstWord.toLowerCase();\n return /^[aeiou]/.test(first) ? 'an' : 'a';\n}\n","import type { TypeRef, PrimitiveType, UnionType } from '@workos/oagen';\nimport { mapTypeRef as irMapTypeRef } from '@workos/oagen';\nimport { className } from './naming.js';\n\n/** Known C# value types that need `?` for nullable. */\nconst VALUE_TYPES = new Set(['int', 'long', 'double', 'bool', 'float', 'decimal', 'byte', 'short', 'DateTimeOffset']);\n\n/**\n * Module-level alias map for structurally-identical enums. Populated by\n * `setEnumAliases` from the current spec's enum list; consulted by\n * `mapTypeRef` so that every reference to a duplicate enum resolves to the\n * canonical name. C# has no first-class type alias for enums, so dedup must\n * happen at reference-rewrite time rather than via a runtime alias.\n */\nconst enumAliases = new Map<string, string>();\n\n/**\n * Names of enums that resolve to a single wire value and should therefore be\n * mapped to C# `string` at reference sites (the owning property emits a\n * const initializer). Populated by `setSingleValueEnumNames`.\n */\nconst singleValueEnumNames = new Set<string>();\n\n/** Replace the current enum-alias map. Safe to call more than once. */\nexport function setEnumAliases(aliases: Map<string, string>): void {\n enumAliases.clear();\n for (const [k, v] of aliases) enumAliases.set(k, v);\n}\n\n/** Replace the set of enum names that are single-value discriminator stand-ins. */\nexport function setSingleValueEnumNames(names: Iterable<string>): void {\n singleValueEnumNames.clear();\n for (const n of names) singleValueEnumNames.add(n);\n}\n\n/** Resolve an enum reference name to its canonical form. */\nexport function resolveEnumTypeName(name: string): string {\n return enumAliases.get(name) ?? name;\n}\n\n/**\n * Map an IR TypeRef to a C# type string.\n */\nexport function mapTypeRef(ref: TypeRef): string {\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\n array: (_ref, items) => `List<${items}>`,\n model: (r) => className(r.name),\n enum: (r) => {\n // Single-value enums (discriminator consts in disguise) map to `string`\n // so the caller can't misuse a public one-member enum type. The\n // owning property emits a const initializer separately.\n if ((r.values?.length ?? 0) === 1) return 'string';\n if (singleValueEnumNames.has(r.name)) return 'string';\n return className(resolveEnumTypeName(r.name));\n },\n union: (_r, variants) => joinUnionVariants(_r, variants),\n nullable: (_ref, inner) => {\n // With <Nullable>enable</Nullable>, all nullable types need `?`\n if (inner.endsWith('?')) return inner; // already nullable (e.g., nested nullable)\n return `${inner}?`;\n },\n literal: (r) => {\n if (r.value === null) return 'object';\n if (typeof r.value === 'string') return 'string';\n if (typeof r.value === 'number') return Number.isInteger(r.value) ? 'int' : 'double';\n if (typeof r.value === 'boolean') return 'bool';\n return 'object';\n },\n map: (_ref, value) => `Dictionary<string, ${value}>`,\n });\n}\n\n/**\n * Map an IR TypeRef to a C# type string, making optional fields nullable.\n * For value types, appends `?`. For reference types, returns as-is.\n */\nexport function mapTypeRefOptional(ref: TypeRef): string {\n const baseType = mapTypeRef(ref);\n if (isValueType(baseType)) return `${baseType}?`;\n return baseType;\n}\n\n/**\n * Check if a C# type is a value type (needs ? for nullable).\n */\nexport function isValueType(csType: string): boolean {\n // Strip trailing ? if present\n const bare = csType.endsWith('?') ? csType.slice(0, -1) : csType;\n if (VALUE_TYPES.has(bare)) return true;\n // Enums are value types, but we can't detect them purely from the type string.\n // The caller should handle enum nullability explicitly when needed.\n return false;\n}\n\n/**\n * Check if an IR TypeRef maps to a C# value type.\n */\nexport function isValueTypeRef(ref: TypeRef): boolean {\n if (ref.kind === 'enum') return true;\n if (ref.kind === 'primitive') {\n // DateTimeOffset is a value type (struct)\n if (ref.format === 'date-time') return true;\n switch (ref.type) {\n case 'integer':\n case 'number':\n case 'boolean':\n return true;\n default:\n return false;\n }\n }\n return false;\n}\n\n/**\n * Whether a TypeRef directly names an enum (no nullable wrapper).\n * Used to detect required enum request fields that must not silently serialize\n * their default Unknown sentinel.\n */\nexport function isEnumRef(ref: TypeRef): boolean {\n return ref.kind === 'enum';\n}\n\n/**\n * Emit JSON attributes for a request-side property. When `isRequiredEnum` is\n * true, configure both serializers to skip the field when its value equals the\n * enum default (0 = Unknown sentinel). This converts \"unset required enum\"\n * from a silent `\"unknown\"` wire value into a clean omission so the API\n * returns a clear `missing required field` error instead of a confusing 422.\n */\nexport function emitJsonPropertyAttributes(wireName: string, options: { isRequiredEnum?: boolean } = {}): string[] {\n if (options.isRequiredEnum) {\n return [\n ` [JsonProperty(\"${wireName}\", DefaultValueHandling = DefaultValueHandling.Ignore)]`,\n ` [STJS.JsonPropertyName(\"${wireName}\")]`,\n ` [STJS.JsonIgnore(Condition = STJS.JsonIgnoreCondition.WhenWritingDefault)]`,\n ];\n }\n return [` [JsonProperty(\"${wireName}\")]`, ` [STJS.JsonPropertyName(\"${wireName}\")]`];\n}\n\nfunction mapPrimitive(ref: PrimitiveType): string {\n if (ref.format === 'binary') return 'byte[]';\n if (ref.format === 'int32') return 'int';\n if (ref.format === 'int64') return 'long';\n if (ref.format === 'date-time') return 'DateTimeOffset';\n switch (ref.type) {\n case 'string':\n return 'string';\n case 'integer':\n return 'long';\n case 'number':\n return 'double';\n case 'boolean':\n return 'bool';\n case 'unknown':\n return 'object';\n }\n}\n\n/**\n * Track discriminated unions for downstream model generation.\n * Key = generated base type name, Value = discriminator info.\n */\nexport const discriminatedUnions = new Map<\n string,\n { property: string; mapping: Record<string, string>; variantTypes: string[] }\n>();\n\nfunction joinUnionVariants(_ref: UnionType, variants: string[]): string {\n if (_ref.compositionKind === 'allOf') {\n return variants[0] ?? 'object';\n }\n const unique = [...new Set(variants)];\n if (unique.length === 1) return unique[0];\n\n // Discriminated union: register for converter generation and return first variant as base\n if (_ref.discriminator && _ref.discriminator.mapping) {\n const baseName = unique[0];\n discriminatedUnions.set(baseName, {\n property: _ref.discriminator.property,\n mapping: _ref.discriminator.mapping,\n variantTypes: unique,\n });\n // Use object with JsonConverter for discriminated unions since\n // AnyOf<> doesn't support discriminator-based deserialization\n return 'object';\n }\n\n if (unique.length >= 2 && unique.length <= 3) return `AnyOf<${unique.join(', ')}>`;\n // AnyOf only supports arity 2 and 3. Higher-arity unions collapse to\n // `object`, losing type information. Warn so the author knows the spec\n // outgrew the runtime support instead of silently degrading.\n if (unique.length >= 4) {\n console.warn(\n `[oagen:dotnet] Union with ${unique.length} variants exceeds AnyOf<T1,T2,T3> arity; falling back to object. Variants: ${unique.join(', ')}`,\n );\n }\n return 'object';\n}\n","import type { Model, EmitterContext, GeneratedFile, TypeRef } from '@workos/oagen';\nimport { mapTypeRef, isValueTypeRef, isEnumRef, emitJsonPropertyAttributes } from './type-map.js';\nimport {\n articleFor,\n className,\n escapeXml,\n fieldName,\n humanize,\n emitXmlDoc,\n deprecationMessage,\n escapeCsAttributeString,\n} from './naming.js';\n\n// Import and re-export shared model detection utilities\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\nexport { isListWrapperModel, isListMetadataModel };\n\n/**\n * Generate C# model classes from IR Models.\n * Each model becomes a separate .cs file under Services/{mount}/Entities/.\n * For initial generation, all models go into a flat Entities/ directory.\n */\nexport function generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n if (models.length === 0) return [];\n\n // Build a lookup from enum name → single wire value for 1-value enums so\n // we can emit a const initializer on the owning property without needing\n // the full EnumRef.values payload (which the IR sometimes omits on refs).\n const enumConstByName = new Map<string, string>();\n for (const e of ctx.spec.enums) {\n if (e.values.length === 1) {\n enumConstByName.set(e.name, String(e.values[0].value));\n }\n }\n\n const files: GeneratedFile[] = [];\n\n // Build structural hash for deduplication. Run the hash → canonical pass\n // iteratively so that parent classes whose only structural difference is\n // an already-aliased child type also collapse. Terminates when a full\n // round produces no new aliases.\n const eligibleModels = models.filter((m) => !isListWrapperModel(m) && !isListMetadataModel(m));\n const aliasOf = new Map<string, string>();\n while (true) {\n const hashGroups = new Map<string, string[]>();\n for (const model of eligibleModels) {\n const hash = structuralHash(model, aliasOf);\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(model.name);\n }\n\n let added = false;\n for (const [hash, names] of hashGroups) {\n if (names.length <= 1) continue;\n if (hash === '') continue;\n const sorted = [...names].sort();\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n const name = sorted[i];\n if (aliasOf.get(name) !== canonical) {\n aliasOf.set(name, canonical);\n added = true;\n }\n }\n }\n if (!added) break;\n }\n\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n\n const csClassName = className(model.name);\n const canonicalName = aliasOf.get(model.name);\n\n if (canonicalName) {\n // Emit alias as subclass of canonical\n const canonicalClass = className(canonicalName);\n const lines: string[] = [];\n lines.push(`namespace ${ctx.namespacePascal}`);\n lines.push('{');\n if (model.description) {\n const descLines = model.description\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l);\n lines.push(` /// <summary>${escapeXml(descLines[0])}</summary>`);\n if (descLines.length > 1) {\n lines.push(` /// <remarks>`);\n for (const remark of descLines.slice(1)) {\n lines.push(` /// ${escapeXml(remark)}`);\n }\n lines.push(` /// Structurally identical to <see cref=\"${canonicalClass}\"/>.`);\n lines.push(` /// </remarks>`);\n } else {\n lines.push(` /// <remarks>Structurally identical to <see cref=\"${canonicalClass}\"/>.</remarks>`);\n }\n } else {\n const human = humanize(model.name);\n lines.push(` /// <summary>Represents ${articleFor(human)} ${human}.</summary>`);\n lines.push(` /// <remarks>Structurally identical to <see cref=\"${canonicalClass}\"/>.</remarks>`);\n }\n lines.push(` public class ${csClassName} : ${canonicalClass} { }`);\n lines.push('}');\n\n files.push({\n path: `Entities/${csClassName}.cs`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n continue;\n }\n\n const lines: string[] = [];\n const needsCollections = model.fields.some((f) => {\n const csType = mapTypeRef(f.type);\n return csType.startsWith('List<') || csType.startsWith('Dictionary<');\n });\n const needsSystem = model.fields.some((f) => {\n const csType = mapTypeRef(f.type);\n return csType.includes('DateTimeOffset');\n });\n\n lines.push(`namespace ${ctx.namespacePascal}`);\n lines.push('{');\n if (needsSystem) {\n lines.push(' using System;');\n }\n if (needsCollections) {\n lines.push(' using System.Collections.Generic;');\n }\n lines.push(' using Newtonsoft.Json;');\n lines.push(' using STJS = System.Text.Json.Serialization;');\n lines.push('');\n\n // XML doc comment\n if (model.description) {\n lines.push(...emitXmlDoc(model.description, ' '));\n } else {\n const human = humanize(model.name);\n lines.push(` /// <summary>Represents ${articleFor(human)} ${human}.</summary>`);\n }\n\n lines.push(` public class ${csClassName}`);\n lines.push(' {');\n\n // Track Dictionary<string, object> fields so we can emit a typed\n // accessor helper per field at the end of the class body.\n const dictObjectFields: Array<{ csName: string; typeText: string }> = [];\n\n // Deduplicate fields by C# property name\n const seenFieldNames = new Set<string>();\n for (const field of model.fields) {\n const csFieldName = fieldName(field.name);\n if (seenFieldNames.has(csFieldName)) continue;\n seenFieldNames.add(csFieldName);\n\n const isOptional = !field.required;\n const baseType = mapTypeRef(field.type);\n const isAlreadyNullable = baseType.endsWith('?');\n const constInit = singleValueConstInitializer(field.type, enumConstByName);\n let csType: string;\n let initializer = '';\n let setterModifier = '';\n\n if (constInit !== null) {\n // Discriminator-style single-value enum/literal: emit with a const\n // initializer and a non-public setter so callers can't drift the\n // wire value. The converter still reads whatever the server sends.\n csType = baseType;\n initializer = ` = ${constInit};`;\n setterModifier = 'internal ';\n } else if (isOptional) {\n if (isAlreadyNullable) {\n csType = baseType;\n } else if (isValueTypeRef(field.type)) {\n csType = `${baseType}?`;\n } else {\n // With nullable enabled, optional reference types need `?`\n csType = `${baseType}?`;\n }\n } else {\n csType = baseType;\n // Required non-nullable reference types need = default! to suppress CS8618\n if (!isAlreadyNullable && !isValueTypeRef(field.type)) {\n initializer = ' = default!;';\n }\n }\n\n // Field description (full multi-line, with continuations as <remarks>)\n const fieldDocs = emitXmlDoc(field.description, ' ');\n if (fieldDocs.length > 0) {\n lines.push('');\n lines.push(...fieldDocs);\n }\n\n if (field.deprecated) {\n const msg = escapeCsAttributeString(deprecationMessage(field.description, 'field'));\n lines.push(` [System.Obsolete(\"${msg}\")]`);\n }\n\n const isRequiredEnum = field.required && isEnumRef(field.type) && constInit === null;\n lines.push(...emitJsonPropertyAttributes(field.name, { isRequiredEnum }));\n lines.push(` public ${csType} ${csFieldName} { get; ${setterModifier}set; }${initializer}`);\n\n // Track additional-properties / metadata dictionaries for typed accessors.\n // Skip deprecated fields so the generated accessor doesn't reference\n // a field marked `[System.Obsolete]` (which would fail the build).\n if (isDictionaryOfObject(csType) && !field.deprecated) {\n dictObjectFields.push({ csName: csFieldName, typeText: csType });\n }\n }\n\n for (const dict of dictObjectFields) {\n lines.push('');\n lines.push(` /// <summary>`);\n lines.push(` /// Typed accessor for <see cref=\"${dict.csName}\"/>. Returns the value stored under`);\n lines.push(` /// <paramref name=\"key\"/> coerced to <typeparamref name=\"T\"/>, or the default`);\n lines.push(` /// value when the key is missing or the value is not convertible.`);\n lines.push(` /// </summary>`);\n lines.push(` /// <typeparam name=\"T\">Expected value type.</typeparam>`);\n lines.push(` /// <param name=\"key\">The key to look up.</param>`);\n lines.push(` public T? Get${dict.csName}Attribute<T>(string key)`);\n lines.push(' {');\n lines.push(` if (this.${dict.csName} == null)`);\n lines.push(' {');\n lines.push(' return default;');\n lines.push(' }');\n lines.push('');\n lines.push(` if (!this.${dict.csName}.TryGetValue(key, out var value))`);\n lines.push(' {');\n lines.push(' return default;');\n lines.push(' }');\n lines.push('');\n lines.push(' if (value is T typed)');\n lines.push(' {');\n lines.push(' return typed;');\n lines.push(' }');\n lines.push('');\n lines.push(' if (value is Newtonsoft.Json.Linq.JToken token)');\n lines.push(' {');\n lines.push(' return token.ToObject<T>();');\n lines.push(' }');\n lines.push('');\n lines.push(' if (value is System.Text.Json.JsonElement element)');\n lines.push(' {');\n lines.push(' return System.Text.Json.JsonSerializer.Deserialize<T>(element.GetRawText());');\n lines.push(' }');\n lines.push('');\n lines.push(' return default;');\n lines.push(' }');\n }\n\n lines.push(' }');\n lines.push('}');\n\n files.push({\n path: `Entities/${csClassName}.cs`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\n/**\n * Whether the emitted C# type is `Dictionary<string, object>` or its\n * nullable variant — the usual shape of metadata / additional-properties\n * fields that get typed accessors.\n */\nfunction isDictionaryOfObject(csType: string): boolean {\n const bare = csType.endsWith('?') ? csType.slice(0, -1) : csType;\n return bare === 'Dictionary<string, object>';\n}\n\n/**\n * If the given TypeRef is a single-value enum / literal (a discriminator\n * const masquerading as an enum), return the C# literal expression (already\n * quoted for strings, bare for bool/number) so the emitter can lock the\n * field down with a const initializer and non-public setter. Returns null\n * for any other type.\n */\nfunction singleValueConstInitializer(ref: TypeRef, enumConstByName: Map<string, string>): string | null {\n // OpenAPI `enum: [value]` (single-value) is normalized by the IR to a\n // LiteralType on the field, not an EnumRef. Emit per-type: booleans and\n // numbers are bare literals; strings get JSON-quoted.\n if (ref.kind === 'literal') {\n if (ref.value === null) return null;\n if (typeof ref.value === 'boolean') return ref.value ? 'true' : 'false';\n if (typeof ref.value === 'number') return String(ref.value);\n if (typeof ref.value === 'string') return JSON.stringify(ref.value);\n return null;\n }\n if (ref.kind !== 'enum') return null;\n let wire: string | null = null;\n if (ref.values && ref.values.length === 1) {\n const v = ref.values[0] as string | number | { value: string | number };\n wire = typeof v === 'string' || typeof v === 'number' ? String(v) : String(v.value);\n } else {\n wire = enumConstByName.get(ref.name) ?? null;\n }\n if (wire === null) return null;\n // Enum wire values serialize as strings in JSON, and mapTypeRef returns\n // `string` for single-value enums — so always quote.\n return JSON.stringify(wire);\n}\n\n/**\n * Normalize a TypeRef for structural comparison.\n * Enum references are normalized to their values (not names) so that\n * structurally identical enums with different names still match.\n * Model references are rewritten to their canonical alias (if any) so that\n * parents whose only difference is an already-aliased child collapse too.\n */\nfunction normalizeTypeForHash(ref: TypeRef, aliasOf: Map<string, string>): any {\n if (ref.kind === 'enum') {\n // Normalize enum refs by their sorted values, not their name\n const vals = ref.values ? [...ref.values].sort() : [];\n return { kind: 'enum', values: vals };\n }\n if (ref.kind === 'model') {\n return { kind: 'model', name: aliasOf.get(ref.name) ?? ref.name };\n }\n if (ref.kind === 'nullable') {\n return { kind: 'nullable', inner: normalizeTypeForHash(ref.inner, aliasOf) };\n }\n if (ref.kind === 'array') {\n return { kind: 'array', items: normalizeTypeForHash(ref.items, aliasOf) };\n }\n if (ref.kind === 'union') {\n return { kind: 'union', variants: ref.variants.map((v) => normalizeTypeForHash(v, aliasOf)) };\n }\n if (ref.kind === 'map') {\n return { kind: 'map', valueType: normalizeTypeForHash(ref.valueType, aliasOf) };\n }\n return ref;\n}\n\nfunction structuralHash(model: Model, aliasOf: Map<string, string> = new Map()): string {\n return model.fields\n .map((f) => `${f.name}:${JSON.stringify(normalizeTypeForHash(f.type, aliasOf))}:${f.required}`)\n .sort()\n .join('|');\n}\n","import type { Enum, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { walkTypeRef } from '@workos/oagen';\nimport { className, deprecationMessage, escapeCsAttributeString, humanize } from './naming.js';\nimport { setEnumAliases, setSingleValueEnumNames } from './type-map.js';\nimport { enrichModelsFromSpec } from '../shared/model-utils.js';\n\n/**\n * Generate C# enum definitions from IR Enum definitions.\n * Each enum becomes a separate .cs file. Structurally-identical enums are\n * deduplicated: only the canonical (alphabetically-first) name is emitted,\n * and every reference to a duplicate enum is rewritten to the canonical one\n * by `mapTypeRef` via `setEnumAliases`.\n */\nexport function generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n if (enums.length === 0) return [];\n\n // Publish the alias map + single-value enum set so model/options/wrapper\n // emitters all resolve duplicate enum references to the canonical name and\n // rewrite 1-value enum refs to `string`.\n const aliasOf = collectEnumAliasOf(enums);\n setEnumAliases(aliasOf);\n setSingleValueEnumNames(enums.filter((e) => e.values.length === 1).map((e) => e.name));\n diagnoseDivergentEnums(enums);\n\n // Collect all enum names actually referenced by models and operations so we\n // can suppress orphan enums that would otherwise be emitted but never used.\n const referencedEnums = collectReferencedEnumNames(ctx);\n\n const files: GeneratedFile[] = [];\n\n for (const enumDef of enums) {\n const typeName = className(enumDef.name);\n\n // Skip duplicate enums — their references are retargeted to the canonical.\n if (aliasOf.has(enumDef.name)) continue;\n\n // Skip empty and single-value enums — the single-value case is a discriminator\n // masquerading as an enum, and mapTypeRef rewrites such refs to `string` with\n // a const initializer on the owning property.\n if (enumDef.values.length <= 1) continue;\n\n // Skip orphan enums that are not referenced by any model field or operation\n // parameter. Resolve aliases so that a canonical enum is kept if any of its\n // aliases are referenced.\n const isReferenced =\n referencedEnums.has(enumDef.name) ||\n [...aliasOf.entries()].some(([alias, canon]) => canon === enumDef.name && referencedEnums.has(alias));\n if (!isReferenced) continue;\n\n // Deduplicate values\n const seenValues = new Set<string>();\n const uniqueValues: typeof enumDef.values = [];\n for (const v of enumDef.values) {\n const vs = String(v.value);\n if (!seenValues.has(vs)) {\n seenValues.add(vs);\n uniqueValues.push(v);\n }\n }\n\n const lines: string[] = [];\n lines.push(`namespace ${ctx.namespacePascal}`);\n lines.push('{');\n lines.push(' using System.Runtime.Serialization;');\n lines.push(' using Newtonsoft.Json;');\n lines.push(' using STJS = System.Text.Json.Serialization;');\n lines.push('');\n lines.push(` /// <summary>Represents ${humanize(enumDef.name)} values.</summary>`);\n lines.push(' [JsonConverter(typeof(WorkOSNewtonsoftStringEnumConverter))]');\n lines.push(' [STJS.JsonConverter(typeof(WorkOSStringEnumConverterFactory))]');\n lines.push(` public enum ${typeName}`);\n lines.push(' {');\n // Unknown sentinel as first member (value 0) for forward-compatibility\n lines.push(` [EnumMember(Value = \"unknown\")]`);\n lines.push(` Unknown,`);\n lines.push('');\n\n const usedNames = new Set<string>();\n usedNames.add('Unknown');\n // Track used EnumMember wire values to avoid duplicates (sentinel uses \"unknown\")\n const usedWireValues = new Set<string>();\n usedWireValues.add('unknown');\n for (let i = 0; i < uniqueValues.length; i++) {\n const v = uniqueValues[i];\n // Skip values whose wire representation collides with the sentinel\n if (usedWireValues.has(String(v.value))) continue;\n usedWireValues.add(String(v.value));\n let memberName = className(String(v.value));\n // Avoid collision with the type itself or previously used names\n if (memberName === typeName || usedNames.has(memberName)) {\n let suffix = 2;\n while (usedNames.has(`${memberName}${suffix}`)) suffix++;\n memberName = `${memberName}${suffix}`;\n }\n usedNames.add(memberName);\n\n if (v.description) {\n lines.push(` /// <summary>${escapeXml(v.description)}</summary>`);\n }\n if (v.deprecated) {\n const msg = escapeCsAttributeString(deprecationMessage(v.description, 'value'));\n lines.push(` [System.Obsolete(\"${msg}\")]`);\n }\n lines.push(` [EnumMember(Value = \"${v.value}\")]`);\n const comma = i < uniqueValues.length - 1 ? ',' : ',';\n lines.push(` ${memberName}${comma}`);\n }\n\n lines.push(' }');\n lines.push('}');\n\n files.push({\n path: `Enums/${typeName}.cs`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\nfunction escapeXml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/**\n * Populate the module-level enum alias resolver from the given spec's enums.\n * Call from every emitter entrypoint that uses `mapTypeRef` so enum\n * references resolve to their canonical names regardless of which emitter\n * phase runs first.\n */\nexport function primeEnumAliases(enums: Enum[]): void {\n setEnumAliases(collectEnumAliasOf(enums));\n setSingleValueEnumNames(enums.filter((e) => e.values.length === 1).map((e) => e.name));\n}\n\n/**\n * Warn when two enums share a trailing stem (e.g., `ConnectionType`) but\n * carry *contradictory* wire values — each side has values the other lacks.\n * Pure subset relationships (event-specific payloads that narrow a shared\n * base set — the usual shape of WorkOS event enums) are legitimate and not\n * flagged. Only true divergences, which typically indicate spec drift, are\n * reported.\n */\nexport function diagnoseDivergentEnums(enums: Enum[]): void {\n const byStem = new Map<string, Enum[]>();\n for (const e of enums) {\n if (e.values.length < 2) continue;\n const stem = trailingPascalStem(e.name);\n if (!stem) continue;\n if (!byStem.has(stem)) byStem.set(stem, []);\n byStem.get(stem)!.push(e);\n }\n\n for (const [stem, group] of byStem) {\n if (group.length < 2) continue;\n // Skip generic event-payload stems (`DataState`, `DataStatus`,\n // `DataActorSource`, …). Many unrelated event subtypes expose a\n // `data.{state,status}` field whose allowed values are scoped per\n // event; grouping them by the generic `Data*` suffix surfaces\n // false-positive divergences, not real drift.\n if (stem.startsWith('Data')) continue;\n // Identical value sets are handled by the alias/dedupe pass.\n const distinctSigs = new Set(group.map(valueSignature));\n if (distinctSigs.size === 1) continue;\n // Only warn when some pair is *mutually exclusive*: each enum has a\n // value the other doesn't. Subsets are not drift.\n if (!hasMutuallyExclusivePair(group)) continue;\n const summary = group.map((e) => `${e.name}[${e.values.length}]`).join(', ');\n console.warn(`[oagen:dotnet] Divergent enums sharing stem \"${stem}\": ${summary}`);\n }\n}\n\n/**\n * True if some pair in the group both:\n * (a) shares enough values to plausibly be the same concept, AND\n * (b) has values exclusive to each side (i.e., is not a subset/equal).\n * Sharing the trailing stem alone is insufficient — `DataStatus` shows up on\n * unrelated domains (connection link state vs. membership state) that only\n * coincidentally overlap on a sentinel like `unknown`. Require a non-trivial\n * intersection before treating two enums as the same logical enum.\n */\nfunction hasMutuallyExclusivePair(group: Enum[]): boolean {\n // Compare case-insensitively so cosmetic drift like `GitHubOAuth` vs\n // `GithubOAuth` — an intentional historical spelling carried forward by\n // the spec — doesn't register as divergence.\n const valueSets = group.map((e) => new Set(e.values.map((v) => String(v.value).toLowerCase())));\n for (let i = 0; i < valueSets.length; i++) {\n for (let j = i + 1; j < valueSets.length; j++) {\n const a = valueSets[i];\n const b = valueSets[j];\n // Concept-similarity gate: two enums are treated as the same logical\n // enum only when they share >= 3 values AND those shared values\n // dominate both sides (>= 50% of the larger set). A handful of\n // shared sentinels (`unknown`, `pending`) recurs across unrelated\n // domains (`AuthMethod` on Radar assessments vs. sessions: only\n // `password`/`passkey`/`sso`/`unknown` overlap out of ~15 total), and\n // that sparse overlap shouldn't count as drift.\n let shared = 0;\n for (const v of a) {\n if (b.has(v)) shared++;\n }\n if (shared < 3) continue;\n const larger = Math.max(a.size, b.size);\n if (larger === 0 || shared / larger < 0.5) continue;\n // Both sides must have values the other lacks — a subset is legitimate\n // narrowing, not drift.\n let aHasExtra = false;\n for (const v of a) {\n if (!b.has(v)) {\n aHasExtra = true;\n break;\n }\n }\n if (!aHasExtra) continue;\n for (const v of b) {\n if (!a.has(v)) return true;\n }\n }\n }\n return false;\n}\n\nfunction trailingPascalStem(name: string): string | null {\n // Extract the last two PascalCase segments so that `SSOConnectionType`\n // and `ConnectionFindResponseConnectionType` both map to `ConnectionType`.\n const segments = name.match(/[A-Z]+[a-z0-9]*/g);\n if (!segments || segments.length < 2) return null;\n return segments.slice(-2).join('');\n}\n\nfunction valueSignature(e: Enum): string {\n return [...e.values]\n .map((v) => String(v.value))\n .sort()\n .join('|');\n}\n\nfunction collectEnumAliasOf(enums: Enum[]): Map<string, string> {\n const hashGroups = new Map<string, string[]>();\n for (const enumDef of enums) {\n const hash = [...enumDef.values]\n .map((v) => String(v.value))\n .sort()\n .join('|');\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(enumDef.name);\n }\n\n const aliasOf = new Map<string, string>();\n for (const [, names] of hashGroups) {\n if (names.length <= 1) continue;\n const sorted = [...names].sort();\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n aliasOf.set(sorted[i], canonical);\n }\n }\n return aliasOf;\n}\n\n/**\n * Collect all enum names referenced anywhere in the spec — model fields,\n * operation params, request bodies, and responses. Used to prune orphan\n * enums that the IR extracted from the spec but that no generated code\n * actually references.\n */\nfunction collectReferencedEnumNames(ctx: EmitterContext): Set<string> {\n const refs = new Set<string>();\n const collect = (ref: any) => {\n walkTypeRef(ref, { enum: (r: any) => refs.add(r.name) });\n };\n // Walk the enriched models (which include synthetic fields from oneOf\n // flattening) so synthetic enums are also counted as referenced.\n const enrichedModels = enrichModelsFromSpec(ctx.spec.models);\n for (const model of enrichedModels) {\n for (const field of model.fields) {\n collect(field.type);\n }\n }\n for (const service of ctx.spec.services) {\n for (const op of service.operations) {\n if (op.requestBody) collect(op.requestBody);\n if (op.response) collect(op.response);\n for (const p of [...op.pathParams, ...op.queryParams, ...op.headerParams, ...(op.cookieParams ?? [])]) {\n collect(p.type);\n }\n }\n }\n return refs;\n}\n\n/** Get the canonical enum name if the given enum is an alias. */\nexport function resolveEnumName(name: string, enums: Enum[]): string {\n const aliasOf = collectEnumAliasOf(enums);\n return aliasOf.get(name) ? className(aliasOf.get(name)!) : className(name);\n}\n\nexport function assignEnumsToServices(enums: Enum[], services: Service[]): Map<string, string> {\n const enumToService = new Map<string, string>();\n const enumNames = new Set(enums.map((e) => e.name));\n\n for (const service of services) {\n for (const op of service.operations) {\n const refs = new Set<string>();\n const collect = (ref: any) => {\n walkTypeRef(ref, { enum: (r: any) => refs.add(r.name) });\n };\n if (op.requestBody) collect(op.requestBody);\n collect(op.response);\n for (const p of [...op.pathParams, ...op.queryParams, ...op.headerParams, ...(op.cookieParams ?? [])]) {\n collect(p.type);\n }\n for (const name of refs) {\n if (enumNames.has(name) && !enumToService.has(name)) {\n enumToService.set(name, service.name);\n }\n }\n }\n }\n\n return enumToService;\n}\n","import type { EmitterContext, ResolvedOperation, ResolvedWrapper } from '@workos/oagen';\nimport {\n className as csClassName,\n fieldName as csFieldName,\n methodName as csMethodName,\n localName,\n csLiteral,\n clientFieldExpression,\n httpMethodHelperName,\n escapeXml,\n emitXmlDoc,\n humanize,\n} from './naming.js';\nimport { sortPathParamsByTemplateOrder } from './resources.js';\nimport { resolveWrapperParams, formatWrapperDescription, type ResolvedWrapperParam } from '../shared/wrapper-utils.js';\nimport { mapTypeRef, isValueTypeRef, isEnumRef, emitJsonPropertyAttributes } from './type-map.js';\n\n/**\n * Generate C# wrapper method lines for union split operations.\n */\nexport function generateWrapperMethods(\n _serviceType: string,\n resolvedOp: ResolvedOperation,\n ctx: EmitterContext,\n): string[] {\n if (!resolvedOp.wrappers || resolvedOp.wrappers.length === 0) return [];\n\n const lines: string[] = [];\n\n for (const wrapper of resolvedOp.wrappers) {\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n lines.push('');\n emitWrapperMethod(lines, resolvedOp, wrapper, wrapperParams, ctx);\n }\n\n return lines;\n}\n\nfunction emitWrapperMethod(\n lines: string[],\n resolvedOp: ResolvedOperation,\n wrapper: ResolvedWrapper,\n _wrapperParams: ResolvedWrapperParam[],\n _ctx: EmitterContext,\n): void {\n const op = resolvedOp.operation;\n const method = csMethodName(wrapper.name);\n const optionsClass = `${method}Options`;\n const responseType = wrapper.responseModelName ? csClassName(wrapper.responseModelName) : null;\n\n // XML doc\n lines.push(` /// <summary>${formatWrapperDescription(wrapper.name)}.</summary>`);\n for (const p of sortPathParamsByTemplateOrder(op)) {\n const paramDesc = p.description ? escapeXml(p.description) : `The ${humanize(p.name)}.`;\n lines.push(` /// <param name=\"${localName(p.name)}\">${paramDesc}</param>`);\n }\n lines.push(` /// <param name=\"options\">Request options.</param>`);\n lines.push(` /// <param name=\"requestOptions\">Per-request configuration overrides.</param>`);\n lines.push(` /// <param name=\"cancellationToken\">Cancellation token.</param>`);\n if (responseType) {\n lines.push(` /// <returns>The <see cref=\"${responseType}\"/> result.</returns>`);\n }\n\n // Signature\n const sigParams: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n sigParams.push(`string ${localName(p.name)}`);\n }\n sigParams.push(`${optionsClass} options`);\n sigParams.push('RequestOptions? requestOptions = null');\n sigParams.push('CancellationToken cancellationToken = default');\n\n const returnType = responseType ? `Task<${responseType}>` : 'Task';\n lines.push(` public async ${returnType} ${method}(${sigParams.join(', ')})`);\n lines.push(' {');\n\n // Set defaults on options\n for (const [key, value] of Object.entries(wrapper.defaults)) {\n lines.push(` options.${csFieldName(key)} = ${csLiteral(value)};`);\n }\n\n // Set inferred fields from client. ClientId is required: fail loudly via RequireClientId()\n // so that callers who forgot to configure it get a clear error instead of a 422 from the API.\n for (const field of wrapper.inferFromClient) {\n if (field === 'client_id') {\n lines.push(` options.${csFieldName(field)} = this.Client.RequireClientId();`);\n } else {\n lines.push(\n ` options.${csFieldName(field)} = this.Client.${clientFieldExpression(field)} ?? string.Empty;`,\n );\n }\n }\n\n // Build path\n let pathExpr: string;\n if (op.pathParams.length > 0) {\n let interpolated = op.path;\n for (const p of sortPathParamsByTemplateOrder(op)) {\n interpolated = interpolated.replace(`{${p.name}}`, `{${localName(p.name)}}`);\n }\n pathExpr = `$\"${interpolated}\"`;\n } else {\n pathExpr = `\"${op.path}\"`;\n }\n\n // Use the Service base-class helper so wrappers read as one-liners.\n const helper = httpMethodHelperName(op.httpMethod);\n if (responseType) {\n lines.push(\n ` return await this.${helper}<${responseType}>(${pathExpr}, options, requestOptions, cancellationToken);`,\n );\n } else if (helper === 'DeleteAsync') {\n lines.push(` await this.${helper}(${pathExpr}, options, requestOptions, cancellationToken);`);\n } else {\n lines.push(` await this.${helper}<object>(${pathExpr}, options, requestOptions, cancellationToken);`);\n }\n\n lines.push(' }');\n}\n\n// NOTE: T26 (wrapper DRY) — the AuthenticateWith* wrappers share a small\n// SendAuthenticateAsync helper at runtime to avoid 8x copies of the same\n// MakeAPIRequest call. The helper itself lives in UserManagementService.cs as\n// a hand-maintained method (it can't easily be expressed as a generic because\n// the eight options classes don't share an interface). Keeping each generated\n// wrapper's body short is the practical part of the DRY win.\n\n/**\n * Generate wrapper options classes. Called from resources.ts options generation.\n */\nexport function generateWrapperOptionsClasses(resolvedOp: ResolvedOperation, ctx: EmitterContext): string[] {\n if (!resolvedOp.wrappers || resolvedOp.wrappers.length === 0) return [];\n\n const lines: string[] = [];\n\n for (const wrapper of resolvedOp.wrappers) {\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n const optionsClass = `${csMethodName(wrapper.name)}Options`;\n\n lines.push('');\n lines.push(` public class ${optionsClass} : BaseOptions`);\n lines.push(' {');\n\n // Exposed params\n for (const { paramName, field, isOptional } of wrapperParams) {\n const csField = csFieldName(paramName);\n const csType = field ? resolveSimpleCsType(field.type, isOptional) : isOptional ? 'string?' : 'string';\n const needsDefault = !isOptional && !csType.endsWith('?') && !(field && isValueTypeRef(field.type));\n const initializer = needsDefault ? ' = default!;' : '';\n\n const isRequiredEnum = !isOptional && !!field && isEnumRef(field.type);\n lines.push(...emitXmlDoc(field?.description, ' '));\n lines.push(...emitJsonPropertyAttributes(paramName, { isRequiredEnum }));\n lines.push(` public ${csType} ${csField} { get; set; }${initializer}`);\n lines.push('');\n }\n\n // Hidden fields (defaults + inferred)\n for (const key of Object.keys(wrapper.defaults)) {\n const csField = csFieldName(key);\n lines.push(` [JsonProperty(\"${key}\")]`);\n lines.push(` [STJS.JsonPropertyName(\"${key}\")]`);\n lines.push(` internal string ${csField} { get; set; } = default!;`);\n lines.push('');\n }\n for (const key of wrapper.inferFromClient) {\n const csField = csFieldName(key);\n // Skip if already added as a default\n if (Object.keys(wrapper.defaults).includes(key)) continue;\n lines.push(` [JsonProperty(\"${key}\")]`);\n lines.push(` [STJS.JsonPropertyName(\"${key}\")]`);\n lines.push(` internal string ${csField} { get; set; } = default!;`);\n lines.push('');\n }\n\n lines.push(' }');\n }\n\n return lines;\n}\n\nfunction resolveSimpleCsType(ref: any, isOptional: boolean): string {\n const base = mapTypeRef(ref);\n if (isOptional && !base.endsWith('?')) return `${base}?`;\n return base;\n}\n","import type {\n Service,\n Operation,\n OperationPlan,\n EmitterContext,\n GeneratedFile,\n ResolvedOperation,\n} from '@workos/oagen';\nimport { planOperation } from '@workos/oagen';\nimport { isListWrapperModel } from './models.js';\nimport { mapTypeRef, isValueTypeRef, isEnumRef, emitJsonPropertyAttributes } from './type-map.js';\nimport {\n className,\n fieldName,\n methodName,\n resolveClassName,\n resolveMethodName,\n serviceTypeName,\n localName,\n csLiteral,\n clientFieldExpression,\n httpMethodCs,\n httpMethodHelperName,\n escapeXml,\n emitXmlDoc,\n deprecationMessage,\n escapeCsAttributeString,\n humanize,\n} from './naming.js';\nimport {\n buildResolvedLookup,\n lookupResolved,\n groupByMount,\n getOpDefaults,\n getOpInferFromClient,\n buildHiddenParams,\n hasHiddenParams,\n} from '../shared/resolved-ops.js';\nimport { generateWrapperMethods } from './wrappers.js';\n\n/**\n * Return path params sorted by their first occurrence in the URL template.\n */\nexport function sortPathParamsByTemplateOrder(op: Operation): typeof op.pathParams {\n return [...op.pathParams].sort((a, b) => {\n const posA = op.path.indexOf(`{${a.name}}`);\n const posB = op.path.indexOf(`{${b.name}}`);\n return posA - posB;\n });\n}\n\n/**\n * Resolve the resource class name for a service.\n */\nexport function resolveResourceClassName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n/**\n * Generate C# service files from IR Service definitions.\n * Each mount group becomes a single Service.cs file.\n */\nexport function generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n if (services.length === 0) return [];\n\n const files: GeneratedFile[] = [];\n const mountGroups = groupByMount(ctx);\n\n const entries: Array<{ name: string; operations: Operation[] }> =\n mountGroups.size > 0\n ? [...mountGroups].map(([name, group]) => ({ name, operations: group.operations }))\n : services.map((s) => ({ name: resolveResourceClassName(s, ctx), operations: s.operations }));\n\n for (const { name: mountName, operations } of entries) {\n if (operations.length === 0) continue;\n const serviceFile = generateServiceFile(mountName, operations, ctx);\n if (serviceFile) files.push(serviceFile);\n const optionsFile = generateOptionsFile(mountName, operations, ctx);\n if (optionsFile) files.push(optionsFile);\n }\n\n return files;\n}\n\nfunction generateServiceFile(mountName: string, operations: Operation[], ctx: EmitterContext): GeneratedFile | null {\n const lines: string[] = [];\n const svcTypeName = serviceTypeName(mountName);\n const csFile = `Services/${className(mountName)}/${svcTypeName}.cs`;\n\n const resolvedLookup = buildResolvedLookup(ctx);\n\n lines.push(`namespace ${ctx.namespacePascal}`);\n lines.push('{');\n lines.push(' using System.Collections.Generic;');\n lines.push(' using System.Net.Http;');\n lines.push(' using System.Threading;');\n lines.push(' using System.Threading.Tasks;');\n lines.push('');\n lines.push(\n ` /// <summary>Service that exposes the ${humanize(mountName)} API operations on <see cref=\"WorkOSClient\"/>.</summary>`,\n );\n lines.push(` public class ${svcTypeName} : Service`);\n lines.push(' {');\n lines.push(` /// <summary>`);\n lines.push(\n ` /// Initializes a new instance of the <see cref=\"${svcTypeName}\"/> class for mocking. The service uses the singleton`,\n );\n lines.push(` /// client configured via <see cref=\"WorkOSConfiguration.WorkOSClient\"/>.`);\n lines.push(` /// </summary>`);\n lines.push(` public ${svcTypeName}() { }`);\n lines.push('');\n lines.push(` /// <summary>`);\n lines.push(` /// Initializes a new instance of the <see cref=\"${svcTypeName}\"/> class bound to the`);\n lines.push(` /// supplied <paramref name=\"client\"/>.`);\n lines.push(` /// </summary>`);\n lines.push(` /// <param name=\"client\">The HTTP client used to make API requests.</param>`);\n lines.push(` public ${svcTypeName}(WorkOSClient client) : base(client) { }`);\n\n const emittedMethods = new Set<string>();\n for (const op of operations) {\n const plan = planOperation(op);\n const method = resolveCsMethodName(op, mountName, ctx);\n\n if (emittedMethods.has(method)) continue;\n emittedMethods.add(method);\n\n const resolvedOp = lookupResolved(op, resolvedLookup);\n const isUnionSplit = (resolvedOp?.wrappers?.length ?? 0) > 0;\n\n // For union-split operations (e.g. POST /user_management/authenticate), do\n // NOT emit the raw method — its options class is empty and any caller will\n // get a 422 from the API. Only emit the typed AuthenticateWith* wrappers.\n if (!isUnionSplit) {\n lines.push('');\n const methodCode = generateMethod(svcTypeName, mountName, method, op, plan, ctx, resolvedOp);\n lines.push(methodCode);\n\n // Generate auto-pagination method for paginated list operations\n if (plan.isPaginated && op.pagination) {\n lines.push('');\n const autoPagingCode = generateAutoPagingMethod(mountName, method, op, plan, ctx, resolvedOp);\n lines.push(autoPagingCode);\n }\n }\n\n // Generate union split wrapper methods\n if (isUnionSplit) {\n const wrapperLines = generateWrapperMethods(svcTypeName, resolvedOp!, ctx);\n lines.push(...wrapperLines);\n for (const w of resolvedOp!.wrappers!) {\n emittedMethods.add(methodName(w.name));\n }\n }\n }\n\n lines.push(' }');\n lines.push('}');\n\n return {\n path: csFile,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction generateOptionsFile(mountName: string, operations: Operation[], ctx: EmitterContext): GeneratedFile | null {\n const resolvedLookup = buildResolvedLookup(ctx);\n const optionsLines: string[] = [];\n let hasOptions = false;\n\n optionsLines.push(`namespace ${ctx.namespacePascal}`);\n optionsLines.push('{');\n optionsLines.push(' using System;');\n optionsLines.push(' using System.Collections.Generic;');\n optionsLines.push(' using Newtonsoft.Json;');\n optionsLines.push(' using STJS = System.Text.Json.Serialization;');\n\n const emittedOptions = new Set<string>();\n for (const op of operations) {\n const plan = planOperation(op);\n const method = resolveCsMethodName(op, mountName, ctx);\n const resolvedOp = lookupResolved(op, resolvedLookup);\n const hidden = buildHiddenParams(resolvedOp);\n\n // Union-split operations expose typed wrapper option classes\n // (AuthenticateWith*Options) instead of a generic raw options class.\n // Skip emitting an empty *CreateAuthenticateOptions placeholder.\n if ((resolvedOp?.wrappers?.length ?? 0) > 0) continue;\n\n const optionsClass = optionsClassName(mountName, method);\n if (emittedOptions.has(optionsClass)) continue;\n\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n const hasBody = plan.hasBody && op.requestBody;\n let hasVisibleBodyFields = false;\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) hasVisibleBodyFields = bodyModel.fields.some((f) => !hidden.has(f.name));\n } else if (hasBody) {\n hasVisibleBodyFields = true;\n }\n\n if (!hasVisibleQueryParams && !hasVisibleBodyFields) continue;\n\n emittedOptions.add(optionsClass);\n hasOptions = true;\n\n // Determine base class: ListOptions for paginated list operations, BaseOptions otherwise\n const isPaginated = plan.isPaginated;\n const baseClass = isPaginated ? 'ListOptions' : 'BaseOptions';\n\n optionsLines.push('');\n const opSummary = op.description?.split('\\n').find((l) => l.trim()) ?? `${method} on ${mountName}`;\n optionsLines.push(\n ` /// <summary>Request options for <see cref=\"${className(mountName)}Service.${method}\"/>: ${escapeXml(opSummary.trim())}</summary>`,\n );\n optionsLines.push(` public class ${optionsClass} : ${baseClass}`);\n optionsLines.push(' {');\n\n const emittedFields = new Set<string>();\n\n // Body fields\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n const csField = fieldName(field.name);\n if (emittedFields.has(csField)) continue;\n emittedFields.add(csField);\n\n const isOptional = !field.required;\n const baseType = mapTypeRef(field.type);\n const isAlreadyNullable = baseType.endsWith('?');\n let csType: string;\n let initializer = '';\n\n if (isOptional) {\n if (isAlreadyNullable) {\n csType = baseType;\n } else if (isValueTypeRef(field.type)) {\n csType = `${baseType}?`;\n } else {\n csType = `${baseType}?`;\n }\n } else {\n csType = baseType;\n if (!isAlreadyNullable && !isValueTypeRef(field.type)) {\n initializer = ' = default!;';\n }\n }\n\n const isRequiredEnum = field.required && isEnumRef(field.type);\n optionsLines.push(...emitXmlDoc(field.description, ' '));\n if (field.deprecated) {\n const msg = escapeCsAttributeString(deprecationMessage(field.description, 'field'));\n optionsLines.push(` [System.Obsolete(\"${msg}\")]`);\n }\n optionsLines.push(...emitJsonPropertyAttributes(field.name, { isRequiredEnum }));\n optionsLines.push(` public ${csType} ${csField} { get; set; }${initializer}`);\n optionsLines.push('');\n }\n }\n }\n\n // Query params (skip pagination fields for list options — they're in ListOptions base)\n const PAGINATION_FIELDS = new Set(['before', 'after', 'limit', 'order']);\n for (const param of op.queryParams) {\n if (hidden.has(param.name)) continue;\n if (isPaginated && PAGINATION_FIELDS.has(param.name)) continue;\n const csField = fieldName(param.name);\n if (emittedFields.has(csField)) continue;\n emittedFields.add(csField);\n\n const isOptional = !param.required;\n const baseType = mapTypeRef(param.type);\n const isAlreadyNullable = baseType.endsWith('?');\n let csType: string;\n let initializer = '';\n\n if (isOptional) {\n if (isAlreadyNullable) {\n csType = baseType;\n } else if (isValueTypeRef(param.type)) {\n csType = `${baseType}?`;\n } else {\n csType = `${baseType}?`;\n }\n } else {\n csType = baseType;\n if (!isAlreadyNullable && !isValueTypeRef(param.type)) {\n initializer = ' = default!;';\n }\n }\n\n const isRequiredEnum = param.required && isEnumRef(param.type);\n optionsLines.push(...emitXmlDoc(param.description, ' '));\n if (param.deprecated) {\n const msg = escapeCsAttributeString(deprecationMessage(param.description, 'parameter'));\n optionsLines.push(` [System.Obsolete(\"${msg}\")]`);\n }\n optionsLines.push(...emitJsonPropertyAttributes(param.name, { isRequiredEnum }));\n optionsLines.push(` public ${csType} ${csField} { get; set; }${initializer}`);\n optionsLines.push('');\n }\n\n // Hidden fields that need to be set programmatically (e.g., grant_type, client_id)\n const defaults = getOpDefaults(resolvedOp);\n const inferFromClient = getOpInferFromClient(resolvedOp);\n for (const key of Object.keys(defaults)) {\n const csField = fieldName(key);\n if (emittedFields.has(csField)) continue;\n emittedFields.add(csField);\n optionsLines.push(` [JsonProperty(\"${key}\")]`);\n optionsLines.push(` [STJS.JsonPropertyName(\"${key}\")]`);\n optionsLines.push(` internal string ${csField} { get; set; } = default!;`);\n optionsLines.push('');\n }\n for (const key of inferFromClient) {\n const csField = fieldName(key);\n if (emittedFields.has(csField)) continue;\n emittedFields.add(csField);\n optionsLines.push(` [JsonProperty(\"${key}\")]`);\n optionsLines.push(` [STJS.JsonPropertyName(\"${key}\")]`);\n optionsLines.push(` internal string ${csField} { get; set; } = default!;`);\n optionsLines.push('');\n }\n\n optionsLines.push(' }');\n }\n\n optionsLines.push('}');\n\n if (!hasOptions) return null;\n\n return {\n path: `Services/${className(mountName)}/_interfaces/${className(mountName)}Options.cs`,\n content: optionsLines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction generateMethod(\n _serviceType: string,\n mountName: string,\n method: string,\n op: Operation,\n plan: OperationPlan,\n ctx: EmitterContext,\n resolvedOp?: ResolvedOperation,\n): string {\n const lines: string[] = [];\n const isPaginated = plan.isPaginated;\n const isDelete = plan.isDelete;\n const hasBody = plan.hasBody && op.requestBody;\n const hidden = buildHiddenParams(resolvedOp);\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n\n let hasVisibleBodyFields = false;\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) hasVisibleBodyFields = bodyModel.fields.some((f) => !hidden.has(f.name));\n } else if (hasBody) {\n hasVisibleBodyFields = true;\n }\n\n const hasParams = hasVisibleBodyFields || hasVisibleQueryParams;\n const optionsClass = hasParams ? optionsClassName(mountName, method) : null;\n const hasHidden = hasHiddenParams(resolvedOp);\n\n // Per-operation Bearer token auth (e.g., SSO GetProfile uses access_token instead of API key)\n const hasBearerOverride = op.security?.some((s: any) => s.schemeName !== 'bearerAuth') ?? false;\n const bearerParamName = hasBearerOverride\n ? op.security!.find((s: any) => s.schemeName !== 'bearerAuth')!.schemeName\n : null;\n\n // URL-builder operations (e.g., /sso/authorize redirect endpoints) build a URL\n // string for the caller to redirect to instead of issuing an HTTP request.\n const isUrlBuilder = resolvedOp?.urlBuilder ?? false;\n\n // Return type\n let returnType: string;\n if (isUrlBuilder) {\n returnType = 'string';\n } else if (isPaginated && op.pagination) {\n const itemType = resolveListItemType(op.pagination.itemType, ctx);\n returnType = `Task<WorkOSList<${itemType}>>`;\n } else if (isDelete) {\n returnType = 'Task';\n } else if (plan.responseModelName) {\n const respType = className(plan.responseModelName);\n if (!isPaginated && op.response?.kind === 'array') {\n returnType = `Task<List<${respType}>>`;\n } else {\n returnType = `Task<${respType}>`;\n }\n } else {\n returnType = 'Task';\n }\n\n // XML doc comment (full multi-line description from the spec)\n lines.push(...emitXmlDoc(op.description, ' '));\n for (const p of sortPathParamsByTemplateOrder(op)) {\n const paramDesc = p.description ? escapeXml(p.description) : `The ${humanize(p.name)}.`;\n lines.push(` /// <param name=\"${localName(p.name)}\">${paramDesc}</param>`);\n }\n if (hasBearerOverride && bearerParamName) {\n lines.push(` /// <param name=\"${localName(bearerParamName)}\">The bearer token for authentication.</param>`);\n }\n if (optionsClass) {\n lines.push(` /// <param name=\"options\">Request options.</param>`);\n }\n if (!isUrlBuilder) {\n lines.push(` /// <param name=\"requestOptions\">Per-request configuration overrides.</param>`);\n lines.push(` /// <param name=\"cancellationToken\">Cancellation token.</param>`);\n }\n if (isUrlBuilder) {\n lines.push(` /// <returns>The fully-qualified URL for the caller to redirect to.</returns>`);\n } else if (isPaginated && op.pagination) {\n const itemType = resolveListItemType(op.pagination.itemType, ctx);\n lines.push(` /// <returns>A page of <see cref=\"${itemType}\"/> results.</returns>`);\n } else if (plan.responseModelName) {\n const respType = className(plan.responseModelName);\n lines.push(` /// <returns>The <see cref=\"${respType}\"/> result.</returns>`);\n }\n if (op.deprecated) {\n const msg = escapeCsAttributeString(deprecationMessage(op.description, 'operation'));\n lines.push(` [System.Obsolete(\"${msg}\")]`);\n }\n\n // Method signature\n const params: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n params.push(`string ${localName(p.name)}`);\n }\n if (hasBearerOverride && bearerParamName) {\n params.push(`string ${localName(bearerParamName)}`);\n }\n if (optionsClass) {\n const isRequired = hasVisibleBodyFields && !isPaginated;\n params.push(isRequired ? `${optionsClass} options` : `${optionsClass}? options = null`);\n }\n if (!isUrlBuilder) {\n params.push('RequestOptions? requestOptions = null');\n params.push('CancellationToken cancellationToken = default');\n }\n\n const asyncKeyword = isUrlBuilder ? '' : 'async ';\n lines.push(` public virtual ${asyncKeyword}${returnType} ${method}(${params.join(', ')})`);\n lines.push(' {');\n\n // Inject hidden params\n if (hasHidden && optionsClass) {\n const isOptionalParam = !hasVisibleBodyFields || isPaginated;\n if (isOptionalParam) {\n lines.push(` options ??= new ${optionsClass}();`);\n }\n const defaults = getOpDefaults(resolvedOp);\n const inferFromClient = getOpInferFromClient(resolvedOp);\n for (const [key, value] of Object.entries(defaults)) {\n lines.push(` options.${fieldName(key)} = ${csLiteral(value as string | number | boolean)};`);\n }\n for (const field of inferFromClient) {\n if (field === 'client_id') {\n lines.push(` options.${fieldName(field)} = this.Client.RequireClientId();`);\n } else {\n lines.push(\n ` options.${fieldName(field)} = this.Client.${clientFieldExpression(field)} ?? string.Empty;`,\n );\n }\n }\n }\n\n // Build path\n const pathExpr = buildPathExpr(op);\n\n // URL-builders and bearer-override operations keep the inlined WorkOSRequest\n // form because the Service helpers don't expose BuildRequestUri or\n // AccessToken configuration. Everything else uses the helper one-liners.\n const needsInlineRequest = isUrlBuilder || (hasBearerOverride && !!bearerParamName);\n const optionsArg = optionsClass ? 'options' : 'null';\n\n if (needsInlineRequest) {\n lines.push(' var request = new WorkOSRequest');\n lines.push(' {');\n lines.push(` Method = HttpMethod.${httpMethodCs(op.httpMethod)},`);\n lines.push(` Path = ${pathExpr},`);\n if (optionsClass) {\n lines.push(' Options = options,');\n }\n if (hasBearerOverride && bearerParamName) {\n lines.push(` AccessToken = ${localName(bearerParamName)},`);\n }\n if (!isUrlBuilder) {\n lines.push(` RequestOptions = requestOptions,`);\n }\n lines.push(' };');\n\n if (isUrlBuilder) {\n lines.push(' return this.Client.BuildRequestUri(request).ToString();');\n } else if (returnType.startsWith('Task<')) {\n const innerType = returnType.slice(5, -1);\n lines.push(` return await this.Client.MakeAPIRequest<${innerType}>(request, cancellationToken);`);\n } else {\n lines.push(' await this.Client.MakeRawAPIRequest(request, cancellationToken);');\n }\n } else if (isDelete) {\n lines.push(` await this.DeleteAsync(${pathExpr}, ${optionsArg}, requestOptions, cancellationToken);`);\n } else if (returnType.startsWith('Task<')) {\n const innerType = returnType.slice(5, -1);\n const helper = httpMethodHelperName(op.httpMethod);\n lines.push(\n ` return await this.${helper}<${innerType}>(${pathExpr}, ${optionsArg}, requestOptions, cancellationToken);`,\n );\n } else {\n const helper = httpMethodHelperName(op.httpMethod);\n lines.push(\n ` await this.${helper}<object>(${pathExpr}, ${optionsArg}, requestOptions, cancellationToken);`,\n );\n }\n\n lines.push(' }');\n return lines.join('\\n');\n}\n\nfunction generateAutoPagingMethod(\n mountName: string,\n method: string,\n op: Operation,\n plan: OperationPlan,\n ctx: EmitterContext,\n resolvedOp?: ResolvedOperation,\n): string {\n const lines: string[] = [];\n const hidden = buildHiddenParams(resolvedOp);\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n\n let hasVisibleBodyFields = false;\n if (plan.hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) hasVisibleBodyFields = bodyModel.fields.some((f) => !hidden.has(f.name));\n }\n\n const hasParams = hasVisibleBodyFields || hasVisibleQueryParams;\n const optionsClass = hasParams ? optionsClassName(mountName, method) : null;\n\n const itemType = resolveListItemType(op.pagination!.itemType, ctx);\n\n // XML doc\n lines.push(\n ` /// <summary>Auto-paging variant of <see cref=\"${method}\"/>. Yields individual items across all pages.</summary>`,\n );\n for (const p of sortPathParamsByTemplateOrder(op)) {\n const paramDesc = p.description ? escapeXml(p.description) : `The ${humanize(p.name)}.`;\n lines.push(` /// <param name=\"${localName(p.name)}\">${paramDesc}</param>`);\n }\n if (optionsClass) {\n lines.push(` /// <param name=\"options\">Request options.</param>`);\n }\n lines.push(` /// <param name=\"requestOptions\">Per-request configuration overrides.</param>`);\n lines.push(` /// <param name=\"cancellationToken\">Cancellation token.</param>`);\n lines.push(` /// <returns>An async sequence of <see cref=\"${itemType}\"/> items.</returns>`);\n\n // Signature\n const params: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n params.push(`string ${localName(p.name)}`);\n }\n if (optionsClass) {\n params.push(`${optionsClass}? options = null`);\n }\n params.push('RequestOptions? requestOptions = null');\n params.push('CancellationToken cancellationToken = default');\n\n lines.push(` public virtual IAsyncEnumerable<${itemType}> ${method}AutoPagingAsync(${params.join(', ')})`);\n lines.push(' {');\n\n const pathExpr = buildPathExpr(op);\n const optionsArg = optionsClass ? 'options' : 'null';\n lines.push(\n ` return this.ListAutoPagingAsync<${itemType}>(${pathExpr}, ${optionsArg}, requestOptions, cancellationToken);`,\n );\n lines.push(' }');\n\n return lines.join('\\n');\n}\n\nfunction resolveCsMethodName(op: Operation, mountName: string, ctx: EmitterContext): string {\n return resolveMethodName(op, { name: mountName, operations: [op] }, ctx);\n}\n\nexport function optionsClassName(mountName: string, method: string): string {\n const prefix = className(mountName);\n if (method.startsWith(prefix)) return `${method}Options`;\n return `${prefix}${method}Options`;\n}\n\nfunction buildPathExpr(op: Operation): string {\n if (op.pathParams.length === 0) {\n return `\"${op.path}\"`;\n }\n // Build C# string interpolation\n let interpolated = op.path;\n for (const p of sortPathParamsByTemplateOrder(op)) {\n interpolated = interpolated.replace(`{${p.name}}`, `{${localName(p.name)}}`);\n }\n return `$\"${interpolated}\"`;\n}\n\nfunction resolveListItemType(itemType: import('@workos/oagen').TypeRef, ctx: EmitterContext): string {\n if (itemType.kind === 'model') {\n const model = ctx.spec.models.find((m) => m.name === itemType.name);\n if (model && isListWrapperModel(model)) {\n const dataField = model.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n return className(dataField.type.items.name);\n }\n }\n return className(itemType.name);\n }\n return mapTypeRef(itemType);\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { toPascalCase, toSnakeCase } from '@workos/oagen';\nimport { resolveResourceClassName } from './resources.js';\nimport { className, serviceTypeName, humanize } from './naming.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Generate the C# client file with service accessors.\n * Produces: WorkOSClient.Generated.cs (partial class with service properties).\n */\nexport function generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return [generateClientFile(spec, ctx)];\n}\n\n/**\n * Deduplicate services by mount target.\n */\nfunction deduplicateByMount(services: Service[], ctx: EmitterContext): Service[] {\n const byTarget = new Map<string, Service>();\n for (const s of services) {\n const target = getMountTarget(s, ctx);\n const existing = byTarget.get(target);\n if (!existing || toPascalCase(s.name) === target) {\n byTarget.set(target, s);\n }\n }\n return [...byTarget.values()];\n}\n\n/**\n * Build map of service name -> accessor property name.\n */\nexport function buildServiceAccessPaths(services: Service[], ctx: EmitterContext): Map<string, string> {\n const topLevel = deduplicateByMount(services, ctx);\n const paths = new Map<string, string>();\n\n for (const service of topLevel) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const prop = toSnakeCase(resolvedName);\n paths.set(service.name, prop);\n }\n\n // Also map mount targets\n for (const service of services) {\n const target = getMountTarget(service, ctx);\n if (!paths.has(target)) {\n const existing = paths.get(service.name);\n if (existing) paths.set(target, existing);\n }\n }\n\n return paths;\n}\n\nfunction generateClientFile(spec: ApiSpec, ctx: EmitterContext): GeneratedFile {\n const topLevel = deduplicateByMount(spec.services, ctx);\n const lines: string[] = [];\n\n lines.push(`namespace ${ctx.namespacePascal}`);\n lines.push('{');\n lines.push(' /// <summary>');\n lines.push(' /// Generated service accessors for WorkOSClient.');\n lines.push(' /// </summary>');\n lines.push(' public partial class WorkOSClient');\n lines.push(' {');\n\n // Service properties with lazy initialization\n for (const service of topLevel) {\n const resolvedName = resolveResourceClassName(service, ctx);\n const propName = className(resolvedName);\n const svcType = serviceTypeName(resolvedName);\n const backingField = propName.charAt(0).toLowerCase() + propName.slice(1);\n const human = humanize(resolvedName);\n lines.push(` private ${svcType} ${backingField};`);\n lines.push('');\n lines.push(` /// <summary>Gets the <see cref=\"${svcType}\"/> for ${human} API operations.</summary>`);\n lines.push(` public virtual ${svcType} ${propName} => this.${backingField} ??= new ${svcType}(this);`);\n lines.push('');\n }\n\n lines.push(' }');\n lines.push('}');\n\n return {\n path: 'Client/WorkOSClient.Generated.cs',\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n","import type { Model, TypeRef, Enum } from '@workos/oagen';\nimport { fixtureFileName, fieldName } from './naming.js';\nimport { isListMetadataModel, isListWrapperModel } from './models.js';\n\n/**\n * Prefix mapping for generating realistic ID fixture values.\n */\nexport const ID_PREFIXES: Record<string, string> = {\n Connection: 'conn_',\n Organization: 'org_',\n OrganizationMembership: 'om_',\n User: 'user_',\n Directory: 'directory_',\n DirectoryGroup: 'dir_grp_',\n DirectoryUser: 'dir_usr_',\n Invitation: 'inv_',\n Session: 'session_',\n AuthenticationFactor: 'auth_factor_',\n EmailVerification: 'email_verification_',\n MagicAuth: 'magic_auth_',\n PasswordReset: 'password_reset_',\n};\n\n/**\n * Generate JSON fixture files for test data.\n */\nexport function generateFixtures(spec: {\n models: Model[];\n enums: Enum[];\n services: any[];\n}): { path: string; content: string }[] {\n if (spec.models.length === 0) return [];\n\n const modelMap = new Map(spec.models.map((m) => [m.name, m]));\n const enumMap = new Map(spec.enums.map((e) => [e.name, e]));\n const files: { path: string; content: string }[] = [];\n\n for (const model of spec.models) {\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n\n const fixture = model.fields.length === 0 ? {} : generateModelFixture(model, modelMap, enumMap);\n\n files.push({\n path: `testdata/${fixtureFileName(model.name)}.json`,\n content: JSON.stringify(fixture, null, 2),\n });\n\n // Generate null-field variant for models with nullable/optional fields\n const hasNullableFields = model.fields.some((f) => !f.required || f.type.kind === 'nullable');\n if (hasNullableFields && model.fields.length > 0) {\n const nullFixture: Record<string, any> = {};\n for (const field of model.fields) {\n if (!field.required || field.type.kind === 'nullable') {\n nullFixture[field.name] = null;\n } else {\n nullFixture[field.name] = fixture[field.name] ?? null;\n }\n }\n files.push({\n path: `testdata/${fixtureFileName(model.name)}_nulls.json`,\n content: JSON.stringify(nullFixture, null, 2),\n });\n }\n }\n\n // Generate list fixtures for paginated responses\n for (const service of spec.services) {\n for (const op of service.operations) {\n if (op.pagination) {\n let itemModel = op.pagination.itemType.kind === 'model' ? modelMap.get(op.pagination.itemType.name) : null;\n if (itemModel) {\n const unwrapped = unwrapListModel(itemModel, modelMap);\n if (unwrapped) itemModel = unwrapped;\n if (itemModel.fields.length === 0) continue;\n const fixture = generateModelFixture(itemModel, modelMap, enumMap);\n const listFixture = {\n data: [fixture],\n list_metadata: {\n before: null,\n after: null,\n },\n };\n files.push({\n path: `testdata/list_${fixtureFileName(itemModel.name)}.json`,\n content: JSON.stringify(listFixture, null, 2),\n });\n }\n }\n }\n }\n\n // Generate empty list fixtures for paginated responses\n for (const service of spec.services) {\n for (const op of service.operations) {\n if (op.pagination) {\n let itemModel = op.pagination.itemType.kind === 'model' ? modelMap.get(op.pagination.itemType.name) : null;\n if (itemModel) {\n const unwrapped = unwrapListModel(itemModel, modelMap);\n if (unwrapped) itemModel = unwrapped;\n const emptyFixture = {\n data: [],\n list_metadata: {\n before: null,\n after: null,\n },\n };\n files.push({\n path: `testdata/list_empty_${fixtureFileName(itemModel.name)}.json`,\n content: JSON.stringify(emptyFixture, null, 2),\n });\n }\n }\n }\n }\n\n // Deduplicate fixtures by path (keep last-written for each path)\n const byPath = new Map<string, { path: string; content: string }>();\n for (const f of files) {\n byPath.set(f.path, f);\n }\n\n return [...byPath.values()];\n}\n\nfunction unwrapListModel(model: Model, modelMap: Map<string, Model>): Model | null {\n const dataField = model.fields.find((f) => f.name === 'data');\n const hasListMetadata = model.fields.some((f) => f.name === 'list_metadata' || f.name === 'listMetadata');\n if (dataField && hasListMetadata && dataField.type.kind === 'array') {\n const itemType = dataField.type.items;\n if (itemType.kind === 'model') {\n return modelMap.get(itemType.name) ?? null;\n }\n }\n return null;\n}\n\nexport function generateModelFixture(\n model: Model,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): Record<string, any> {\n const fixture: Record<string, any> = {};\n\n const seenFieldNames = new Set<string>();\n const deduplicatedFields = model.fields.filter((f) => {\n const csName = fieldName(f.name);\n if (seenFieldNames.has(csName)) return false;\n seenFieldNames.add(csName);\n return true;\n });\n\n for (const field of deduplicatedFields) {\n const wireName = field.name;\n if (field.example !== undefined) {\n fixture[wireName] = field.example;\n } else {\n fixture[wireName] = generateFieldValue(field.type, field.name, model.name, modelMap, enumMap);\n }\n }\n\n return fixture;\n}\n\nfunction generateFieldValue(\n ref: TypeRef,\n fName: string,\n modelName: string,\n modelMap: Map<string, Model>,\n enumMap: Map<string, Enum>,\n): any {\n switch (ref.kind) {\n case 'primitive':\n return generatePrimitiveValue(ref.type, ref.format, fName, modelName);\n case 'literal':\n return ref.value;\n case 'enum': {\n const e = enumMap.get(ref.name);\n return e?.values[0]?.value ?? 'unknown';\n }\n case 'model': {\n const nested = modelMap.get(ref.name);\n if (nested) return generateModelFixture(nested, modelMap, enumMap);\n return {};\n }\n case 'array': {\n if (ref.items.kind === 'enum') {\n const e = enumMap.get(ref.items.name);\n if (e && e.values.length > 0) {\n return e.values.map((v) => v.value);\n }\n }\n const item = generateFieldValue(ref.items, fName, modelName, modelMap, enumMap);\n return [item];\n }\n case 'nullable':\n return generateFieldValue(ref.inner, fName, modelName, modelMap, enumMap);\n case 'union':\n if (ref.variants.length > 0) {\n return generateFieldValue(ref.variants[0], fName, modelName, modelMap, enumMap);\n }\n return null;\n case 'map':\n return {\n key: generateFieldValue(ref.valueType, 'value', modelName, modelMap, enumMap),\n };\n }\n}\n\nfunction generatePrimitiveValue(type: string, format: string | undefined, name: string, modelName: string): any {\n switch (type) {\n case 'string':\n if (format === 'date-time') return '2023-01-01T00:00:00.000Z';\n if (format === 'date') return '2023-01-01';\n if (format === 'uuid') return '00000000-0000-0000-0000-000000000000';\n if (name === 'id') {\n const prefix = ID_PREFIXES[modelName] ?? '';\n return `${prefix}01234`;\n }\n if (name.includes('id')) return `${name}_01234`;\n if (name.includes('email')) return 'test@example.com';\n if (name.includes('url') || name.includes('uri')) return 'https://example.com';\n if (name.includes('name')) return 'Test';\n return `test_${name}`;\n case 'integer':\n return 1;\n case 'number':\n return 1.0;\n case 'boolean':\n return true;\n case 'unknown':\n return {};\n default:\n return null;\n }\n}\n","import type { ApiSpec, Service, Operation, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { planOperation } from '@workos/oagen';\nimport {\n className,\n fixtureFileName,\n fieldName as csFieldName,\n methodName as csMethodName,\n resolveMethodName,\n serviceTypeName,\n} from './naming.js';\nimport { resolveResourceClassName, sortPathParamsByTemplateOrder, optionsClassName } from './resources.js';\nimport { generateFixtures, generateModelFixture } from './fixtures.js';\nimport { isListWrapperModel } from './models.js';\nimport { groupByMount, buildResolvedLookup, lookupResolved, buildHiddenParams } from '../shared/resolved-ops.js';\n\n/**\n * Generate C# test files and JSON fixtures.\n */\nexport function generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n // Generate fixture JSON files\n const fixtures = generateFixtures(spec);\n for (const fixture of fixtures) {\n files.push({\n path: fixture.path,\n content: fixture.content,\n headerPlacement: 'skip',\n });\n }\n\n // Generate per-mount-target test files\n const mountGroups = groupByMount(ctx);\n const testEntries: Array<{ name: string; operations: Operation[] }> =\n mountGroups.size > 0\n ? [...mountGroups].map(([name, group]) => ({ name, operations: group.operations }))\n : spec.services.map((s) => ({\n name: resolveResourceClassName(s, ctx),\n operations: s.operations,\n }));\n\n for (const { name: mountName, operations } of testEntries) {\n if (operations.length === 0) continue;\n const mergedService: Service = { name: mountName, operations };\n const testFile = generateServiceTest(mergedService, spec, ctx);\n if (testFile) files.push(testFile);\n }\n\n return files;\n}\n\nfunction generateServiceTest(service: Service, spec: ApiSpec, ctx: EmitterContext): GeneratedFile | null {\n if (service.operations.length === 0) return null;\n\n const resolvedName = resolveResourceClassName(service, ctx);\n const svcType = serviceTypeName(resolvedName);\n const testClassName = `${svcType}Test`;\n const testFile = `Tests/${testClassName}.cs`;\n\n const lines: string[] = [];\n lines.push(`namespace ${ctx.namespacePascal}Tests`);\n lines.push('{');\n lines.push(' using System.Collections.Generic;');\n lines.push(' using System.Net;');\n lines.push(' using System.Net.Http;');\n lines.push(' using System.Threading.Tasks;');\n lines.push(` using ${ctx.namespacePascal};`);\n lines.push(' using Xunit;');\n lines.push('');\n lines.push(` public class ${testClassName}`);\n lines.push(' {');\n lines.push(' private readonly HttpMock httpMock;');\n lines.push(` private readonly ${svcType} service;`);\n lines.push('');\n lines.push(` public ${testClassName}()`);\n lines.push(' {');\n lines.push(' this.httpMock = new HttpMock();');\n lines.push(` var client = new WorkOSClient(new WorkOSOptions`);\n lines.push(' {');\n lines.push(' ApiKey = \"sk_test\",');\n lines.push(' ClientId = \"client_test\",');\n lines.push(' HttpClient = this.httpMock.HttpClient,');\n lines.push(' });');\n lines.push(` this.service = new ${svcType}(client);`);\n lines.push(' }');\n\n const emittedTestMethods = new Set<string>();\n const resolvedLookupForTests = buildResolvedLookup(ctx);\n\n for (const op of service.operations) {\n const plan = planOperation(op);\n const method = resolveCsMethodName(op, resolvedName, ctx);\n const isPaginated = plan.isPaginated;\n const isDelete = plan.isDelete;\n const resolvedOp = lookupResolved(op, resolvedLookupForTests);\n const isUrlBuilder = resolvedOp?.urlBuilder ?? false;\n const isUnionSplit = (resolvedOp?.wrappers?.length ?? 0) > 0;\n\n // Union-split operations (e.g. POST /user_management/authenticate) don't\n // expose the base method or options class — only the typed wrappers —\n // so skip the generic base test; the wrapper loop below emits tests for\n // each AuthenticateWith* / CreateOAuthApplication variant instead.\n if (isUnionSplit) continue;\n\n if (emittedTestMethods.has(method)) continue;\n emittedTestMethods.add(method);\n\n const testName = `Test${method}`;\n const expectedPath = buildExpectedPath(op);\n if (isUrlBuilder) {\n // URL-builder operations return a string synchronously without issuing\n // an HTTP request. Assert the URL structure instead of mocking HTTP.\n const callArgs = buildMethodCallArgs(op, plan, ctx, resolvedName);\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public void ${testName}()`);\n lines.push(' {');\n lines.push(` var url = this.service.${method}(${callArgs});`);\n lines.push(' Assert.NotNull(url);');\n lines.push(` Assert.Contains(\"${expectedPath}\", url);`);\n lines.push(' Assert.Empty(this.httpMock.CapturedRequests);');\n lines.push(' }');\n continue;\n }\n if (isPaginated && op.pagination) {\n // Paginated test\n let fixturePath: string | null = null;\n const paginationItemType = op.pagination.itemType;\n if (paginationItemType.kind === 'model') {\n const itemModel = spec.models.find((m) => m.name === paginationItemType.name);\n if (itemModel) {\n let resolved = itemModel;\n if (isListWrapperModel(itemModel)) {\n const dataField = itemModel.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n const inner = spec.models.find((m) => m.name === (dataField.type as any).items.name);\n if (inner) resolved = inner;\n }\n }\n fixturePath = `testdata/list_${fixtureFileName(resolved.name)}.json`;\n }\n }\n\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task ${testName}()`);\n lines.push(' {');\n if (fixturePath) {\n lines.push(` var fixture = System.IO.File.ReadAllText(\"${fixturePath}\");`);\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.Get, \"${expectedPath}\", HttpStatusCode.OK, fixture);`,\n );\n } else {\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.Get, \"${expectedPath}\", HttpStatusCode.OK, \"{\\\\\"data\\\\\":[],\\\\\"list_metadata\\\\\":{\\\\\"before\\\\\":null,\\\\\"after\\\\\":null}}\");`,\n );\n }\n const callArgs = buildMethodCallArgs(op, plan, ctx, resolvedName);\n lines.push(` var result = await this.service.${method}(${callArgs});`);\n lines.push(' Assert.NotNull(result);');\n if (fixturePath) {\n lines.push(' Assert.NotEmpty(result.Data);');\n }\n lines.push(` this.httpMock.AssertRequestWasMade(HttpMethod.Get, \"${expectedPath}\");`);\n lines.push(' }');\n\n // Empty list test\n const emptyTestName = `Test${method}Empty`;\n if (!emittedTestMethods.has(emptyTestName)) {\n emittedTestMethods.add(emptyTestName);\n const callArgsEmpty = buildMethodCallArgs(op, plan, ctx, resolvedName);\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task ${emptyTestName}()`);\n lines.push(' {');\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.Get, \"${expectedPath}\", HttpStatusCode.OK, \"{\\\\\"data\\\\\":[],\\\\\"list_metadata\\\\\":{\\\\\"before\\\\\":null,\\\\\"after\\\\\":null}}\");`,\n );\n lines.push(` var result = await this.service.${method}(${callArgsEmpty});`);\n lines.push(' Assert.NotNull(result);');\n lines.push(' Assert.Empty(result.Data);');\n lines.push(' }');\n }\n } else if (isDelete) {\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task ${testName}()`);\n lines.push(' {');\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.Delete, \"${expectedPath}\", HttpStatusCode.NoContent, \"\");`,\n );\n const callArgs = buildMethodCallArgs(op, plan, ctx, resolvedName);\n lines.push(` await this.service.${method}(${callArgs});`);\n lines.push(` this.httpMock.AssertRequestWasMade(HttpMethod.Delete, \"${expectedPath}\");`);\n lines.push(' }');\n } else if (plan.responseModelName) {\n const respModel = plan.responseModelName;\n const fixturePath = `testdata/${fixtureFileName(respModel)}.json`;\n const httpMethodCs = op.httpMethod.charAt(0).toUpperCase() + op.httpMethod.slice(1).toLowerCase();\n\n const isArrayResp = !isPaginated && op.response?.kind === 'array';\n const shapeSeed = buildRequestShapeSeed(op, plan, ctx, resolvedName);\n\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task ${testName}()`);\n lines.push(' {');\n lines.push(` var fixture = System.IO.File.ReadAllText(\"${fixturePath}\");`);\n if (isArrayResp) {\n // Wrap single-object fixture in array for List<T> deserialization\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.${httpMethodCs}, \"${expectedPath}\", HttpStatusCode.OK, \"[\" + fixture + \"]\");`,\n );\n } else {\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.${httpMethodCs}, \"${expectedPath}\", HttpStatusCode.OK, fixture);`,\n );\n }\n const callArgs = shapeSeed.seededCallArgs ?? buildMethodCallArgs(op, plan, ctx, resolvedName);\n if (shapeSeed.setupLines.length > 0) {\n for (const setupLine of shapeSeed.setupLines) {\n lines.push(` ${setupLine}`);\n }\n }\n lines.push(` var result = await this.service.${method}(${callArgs});`);\n lines.push(' Assert.NotNull(result);');\n if (!isArrayResp) {\n const respModelDef = spec.models.find((m) => m.name === respModel);\n if (respModelDef) {\n const assertions = buildFixtureAssertions(respModelDef, spec);\n for (const assertion of assertions) {\n lines.push(` ${assertion}`);\n }\n }\n }\n\n lines.push(` this.httpMock.AssertRequestWasMade(HttpMethod.${httpMethodCs}, \"${expectedPath}\");`);\n for (const assertLine of shapeSeed.assertLines) {\n lines.push(` ${assertLine}`);\n }\n lines.push(' }');\n } else {\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task ${testName}()`);\n lines.push(' {');\n const httpMethodCs = op.httpMethod.charAt(0).toUpperCase() + op.httpMethod.slice(1).toLowerCase();\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.${httpMethodCs}, \"${expectedPath}\", HttpStatusCode.OK, \"\");`,\n );\n const callArgs = buildMethodCallArgs(op, plan, ctx, resolvedName);\n lines.push(` await this.service.${method}(${callArgs});`);\n lines.push(` this.httpMock.AssertRequestWasMade(HttpMethod.${httpMethodCs}, \"${expectedPath}\");`);\n lines.push(' }');\n }\n }\n\n // Auto-paging tests (P0-5)\n const resolvedLookupForPaging = buildResolvedLookup(ctx);\n for (const op of service.operations) {\n const plan = planOperation(op);\n if (!plan.isPaginated || !op.pagination) continue;\n\n const method = resolveCsMethodName(op, resolvedName, ctx);\n const autoPagingTestName = `Test${method}AutoPagingAsync`;\n if (emittedTestMethods.has(autoPagingTestName)) continue;\n emittedTestMethods.add(autoPagingTestName);\n\n const expectedPath = buildExpectedPath(op);\n const paginationItemType = op.pagination.itemType;\n let itemTypeName: string | null = null;\n let fixtureName: string | null = null;\n\n if (paginationItemType.kind === 'model') {\n const itemModel = spec.models.find((m) => m.name === paginationItemType.name);\n if (itemModel) {\n let resolved = itemModel;\n if (isListWrapperModel(itemModel)) {\n const dataField = itemModel.fields.find((f) => f.name === 'data');\n if (dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model') {\n const inner = spec.models.find((m) => m.name === (dataField.type as any).items.name);\n if (inner) resolved = inner;\n }\n }\n itemTypeName = className(resolved.name);\n fixtureName = fixtureFileName(resolved.name);\n }\n }\n\n if (!itemTypeName || !fixtureName) continue;\n\n const callArgs = buildMethodCallArgs(op, plan, ctx, resolvedName);\n // Remove the trailing options arg since auto-paging uses the same options\n const autoPagingArgs = callArgs;\n\n // Test with two pages\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task ${autoPagingTestName}()`);\n lines.push(' {');\n lines.push(` var fixture = System.IO.File.ReadAllText(\"testdata/${fixtureName}.json\");`);\n lines.push(\n ` var page1 = \"{\\\\\"data\\\\\":[\" + fixture + \"],\\\\\"list_metadata\\\\\":{\\\\\"before\\\\\":null,\\\\\"after\\\\\":\\\\\"cursor_123\\\\\"}}\";`,\n );\n lines.push(\n ` var page2 = \"{\\\\\"data\\\\\":[\" + fixture + \"],\\\\\"list_metadata\\\\\":{\\\\\"before\\\\\":null,\\\\\"after\\\\\":null}}\";`,\n );\n lines.push(\n ` this.httpMock.MockSequentialResponses(HttpMethod.Get, \"${expectedPath}\", HttpStatusCode.OK, new[] { page1, page2 });`,\n );\n lines.push('');\n lines.push(` var items = new List<${itemTypeName}>();`);\n lines.push(` await foreach (var item in this.service.${method}AutoPagingAsync(${autoPagingArgs}))`);\n lines.push(' {');\n lines.push(' items.Add(item);');\n lines.push(' }');\n lines.push('');\n lines.push(' Assert.Equal(2, items.Count);');\n lines.push(' }');\n\n // Test with empty first page\n const emptyTestName = `Test${method}AutoPagingAsyncEmpty`;\n if (!emittedTestMethods.has(emptyTestName)) {\n emittedTestMethods.add(emptyTestName);\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task ${emptyTestName}()`);\n lines.push(' {');\n lines.push(` var empty = \"{\\\\\"data\\\\\":[],\\\\\"list_metadata\\\\\":{\\\\\"before\\\\\":null,\\\\\"after\\\\\":null}}\";`);\n lines.push(\n ` this.httpMock.MockSequentialResponses(HttpMethod.Get, \"${expectedPath}\", HttpStatusCode.OK, new[] { empty });`,\n );\n lines.push('');\n lines.push(` var items = new List<${itemTypeName}>();`);\n lines.push(` await foreach (var item in this.service.${method}AutoPagingAsync(${autoPagingArgs}))`);\n lines.push(' {');\n lines.push(' items.Add(item);');\n lines.push(' }');\n lines.push('');\n lines.push(' Assert.Empty(items);');\n lines.push(' }');\n }\n }\n\n // Wrapper/convenience method tests (P0-6)\n for (const op of service.operations) {\n const resolvedOp = lookupResolved(op, resolvedLookupForPaging);\n if (!resolvedOp?.wrappers || resolvedOp.wrappers.length === 0) continue;\n\n for (const wrapper of resolvedOp.wrappers) {\n const wrapperMethod = csMethodName(wrapper.name);\n const wrapperTestName = `Test${wrapperMethod}`;\n if (emittedTestMethods.has(wrapperTestName)) continue;\n emittedTestMethods.add(wrapperTestName);\n\n const expectedPath = buildExpectedPath(op);\n const httpMethodCs = op.httpMethod.charAt(0).toUpperCase() + op.httpMethod.slice(1).toLowerCase();\n const responseType = wrapper.responseModelName;\n\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task ${wrapperTestName}()`);\n lines.push(' {');\n\n if (responseType) {\n const fixturePath = `testdata/${fixtureFileName(responseType)}.json`;\n lines.push(` var fixture = System.IO.File.ReadAllText(\"${fixturePath}\");`);\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.${httpMethodCs}, \"${expectedPath}\", HttpStatusCode.OK, fixture);`,\n );\n } else {\n lines.push(\n ` this.httpMock.MockResponse(HttpMethod.${httpMethodCs}, \"${expectedPath}\", HttpStatusCode.OK, \"\");`,\n );\n }\n\n // Build wrapper call args\n const wrapperArgs: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n wrapperArgs.push(`\"test_${p.name}\"`);\n }\n wrapperArgs.push(`new ${wrapperMethod}Options()`);\n\n if (responseType) {\n lines.push(` var result = await this.service.${wrapperMethod}(${wrapperArgs.join(', ')});`);\n lines.push(' Assert.NotNull(result);');\n } else {\n lines.push(` await this.service.${wrapperMethod}(${wrapperArgs.join(', ')});`);\n }\n\n lines.push(` this.httpMock.AssertRequestWasMade(HttpMethod.${httpMethodCs}, \"${expectedPath}\");`);\n lines.push(' }');\n }\n }\n\n // Error tests — pick the first non-URL-builder operation so the error\n // assertions run against a real HTTP call.\n const sampleOp = service.operations.find((o) => !(lookupResolved(o, resolvedLookupForTests)?.urlBuilder ?? false));\n if (sampleOp) {\n const plan = planOperation(sampleOp);\n const method = resolveCsMethodName(sampleOp, resolvedName, ctx);\n const callArgs = buildMethodCallArgs(sampleOp, plan, ctx, resolvedName);\n\n // 401\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task TestError401()`);\n lines.push(' {');\n lines.push(\n ` this.httpMock.MockResponseForAnyRequest(HttpStatusCode.Unauthorized, \"{\\\\\"code\\\\\":\\\\\"unauthorized\\\\\",\\\\\"message\\\\\":\\\\\"Unauthorized\\\\\"}\");`,\n );\n if (plan.isPaginated || plan.isDelete || !plan.responseModelName) {\n lines.push(\n ` await Assert.ThrowsAsync<AuthenticationError>(() => this.service.${method}(${callArgs}));`,\n );\n } else {\n lines.push(\n ` await Assert.ThrowsAsync<AuthenticationError>(() => this.service.${method}(${callArgs}));`,\n );\n }\n lines.push(' }');\n\n // 404\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task TestError404()`);\n lines.push(' {');\n lines.push(\n ` this.httpMock.MockResponseForAnyRequest(HttpStatusCode.NotFound, \"{\\\\\"code\\\\\":\\\\\"not_found\\\\\",\\\\\"message\\\\\":\\\\\"Not Found\\\\\"}\");`,\n );\n lines.push(` await Assert.ThrowsAsync<NotFoundError>(() => this.service.${method}(${callArgs}));`);\n lines.push(' }');\n\n // 422\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task TestError422()`);\n lines.push(' {');\n lines.push(\n ` this.httpMock.MockResponseForAnyRequest((HttpStatusCode)422, \"{\\\\\"code\\\\\":\\\\\"unprocessable_entity\\\\\",\\\\\"message\\\\\":\\\\\"Unprocessable\\\\\"}\");`,\n );\n lines.push(\n ` await Assert.ThrowsAsync<UnprocessableEntityError>(() => this.service.${method}(${callArgs}));`,\n );\n lines.push(' }');\n\n // 429\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task TestError429()`);\n lines.push(' {');\n lines.push(\n ` this.httpMock.MockResponseForAnyRequest((HttpStatusCode)429, \"{\\\\\"code\\\\\":\\\\\"too_many_requests\\\\\",\\\\\"message\\\\\":\\\\\"Too Many Requests\\\\\"}\");`,\n );\n lines.push(\n ` await Assert.ThrowsAsync<RateLimitExceededError>(() => this.service.${method}(${callArgs}));`,\n );\n lines.push(' }');\n\n // 500\n lines.push('');\n lines.push(' [Fact]');\n lines.push(` public async Task TestError500()`);\n lines.push(' {');\n lines.push(\n ` this.httpMock.MockResponseForAnyRequest(HttpStatusCode.InternalServerError, \"{\\\\\"code\\\\\":\\\\\"server_error\\\\\",\\\\\"message\\\\\":\\\\\"Server Error\\\\\"}\");`,\n );\n lines.push(` await Assert.ThrowsAsync<ServerError>(() => this.service.${method}(${callArgs}));`);\n lines.push(' }');\n }\n\n lines.push(' }');\n lines.push('}');\n\n return {\n path: testFile,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction resolveCsMethodName(op: Operation, mountName: string, ctx: EmitterContext): string {\n return resolveMethodName(op, { name: mountName, operations: [op] }, ctx);\n}\n\nfunction buildMethodCallArgs(op: Operation, plan: any, ctx: EmitterContext, mountName: string): string {\n const args: string[] = [];\n\n // Path params\n for (const p of sortPathParamsByTemplateOrder(op)) {\n args.push(`\"test_${p.name}\"`);\n }\n\n // Bearer auth override param (e.g., SSO GetProfile uses access_token)\n const hasBearerOverride = op.security?.some((s: any) => s.schemeName !== 'bearerAuth') ?? false;\n if (hasBearerOverride) {\n const bearerParamName = op.security!.find((s: any) => s.schemeName !== 'bearerAuth')!.schemeName;\n args.push(`\"test_${bearerParamName}\"`);\n }\n\n // Options struct if needed\n const resolvedLookup = buildResolvedLookup(ctx);\n const resolvedOp = lookupResolved(op, resolvedLookup);\n const hidden = buildHiddenParams(resolvedOp);\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n const hasBody = plan.hasBody && op.requestBody;\n let hasVisibleBodyFields = false;\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) hasVisibleBodyFields = bodyModel.fields.some((f) => !hidden.has(f.name));\n } else if (hasBody) {\n hasVisibleBodyFields = true;\n }\n\n if (hasVisibleBodyFields || hasVisibleQueryParams) {\n const method = resolveCsMethodName(op, mountName, ctx);\n const optName = optionsClassName(mountName, method);\n args.push(`new ${optName}()`);\n }\n\n return args.join(', ');\n}\n\n/**\n * Seed required request fields on the generated options expression and\n * produce matching body/query assertions. Catches snake_case mapping\n * regressions and missing-required-field bugs without requiring\n * hand-written tests.\n */\ninterface RequestShapeSeed {\n setupLines: string[];\n seededCallArgs: string | null;\n assertLines: string[];\n}\n\nfunction buildRequestShapeSeed(op: Operation, plan: any, ctx: EmitterContext, mountName: string): RequestShapeSeed {\n const resolvedLookup = buildResolvedLookup(ctx);\n const resolvedOp = lookupResolved(op, resolvedLookup);\n const hidden = buildHiddenParams(resolvedOp);\n\n // Collect required simple fields that we can seed with a string literal.\n const bodySeeds: Array<{ wire: string; prop: string; value: string }> = [];\n const querySeeds: Array<{ wire: string; prop: string; value: string }> = [];\n\n const hasBody = plan.hasBody && op.requestBody;\n if (hasBody && op.requestBody?.kind === 'model') {\n const bodyModel = ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name);\n if (bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n if (!field.required) continue;\n if (!isSeedableStringRef(field.type)) continue;\n bodySeeds.push({\n wire: field.name,\n prop: csFieldName(field.name),\n value: `test_${field.name}`,\n });\n if (bodySeeds.length >= 2) break;\n }\n }\n }\n\n // Wire names already covered by body seeds. For operations that duplicate a\n // body field as a query param (e.g. POST /sso/token lists `code` in both),\n // the generated options class only exposes the field once and the service\n // call sends it via the body — so skip the query assertion to avoid a\n // false-failing `AssertQueryParam`.\n const bodyWireNames = new Set(bodySeeds.map((s) => s.wire));\n for (const param of op.queryParams) {\n if (hidden.has(param.name)) continue;\n if (!param.required) continue;\n if (!isSeedableStringRef(param.type)) continue;\n // Skip pagination fields — they're set by the caller or the autopaging loop\n if (['before', 'after', 'limit', 'order'].includes(param.name)) continue;\n if (bodyWireNames.has(param.name)) continue;\n querySeeds.push({\n wire: param.name,\n prop: csFieldName(param.name),\n value: `test_${param.name}`,\n });\n if (querySeeds.length >= 2) break;\n }\n\n if (bodySeeds.length === 0 && querySeeds.length === 0) {\n return { setupLines: [], seededCallArgs: null, assertLines: [] };\n }\n\n const method = resolveCsMethodName(op, mountName, ctx);\n const optName = optionsClassName(mountName, method);\n\n // Rebuild call args with a seeded options variable named `options`.\n const args: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n args.push(`\"test_${p.name}\"`);\n }\n const hasBearerOverride = op.security?.some((s: any) => s.schemeName !== 'bearerAuth') ?? false;\n if (hasBearerOverride) {\n const bearerParamName = op.security!.find((s: any) => s.schemeName !== 'bearerAuth')!.schemeName;\n args.push(`\"test_${bearerParamName}\"`);\n }\n args.push('options');\n\n const setupLines: string[] = [`var options = new ${optName}();`];\n for (const s of [...bodySeeds, ...querySeeds]) {\n setupLines.push(`options.${s.prop} = \"${s.value}\";`);\n }\n\n const assertLines: string[] = [];\n for (const s of bodySeeds) {\n assertLines.push(`await this.httpMock.AssertRequestBodyContainsAsync(\"${s.wire}\", \"${s.value}\");`);\n }\n for (const s of querySeeds) {\n assertLines.push(`this.httpMock.AssertQueryParam(\"${s.wire}\", \"${s.value}\");`);\n }\n\n return { setupLines, seededCallArgs: args.join(', '), assertLines };\n}\n\n/**\n * A TypeRef is seedable as a string literal in a generated test when it maps\n * to C# `string` (plain strings, formats like email/uuid, dates-as-strings).\n * Enums and numeric types need dedicated representations and are skipped here.\n */\nfunction isSeedableStringRef(ref: import('@workos/oagen').TypeRef): boolean {\n if (ref.kind !== 'primitive') return false;\n if (ref.type !== 'string') return false;\n // `binary` maps to byte[], not a string literal\n if (ref.format === 'binary') return false;\n return true;\n}\n\nfunction buildExpectedPath(op: Operation): string {\n let expected = op.path;\n for (const p of sortPathParamsByTemplateOrder(op)) {\n expected = expected.replace(`{${p.name}}`, `test_${p.name}`);\n }\n return expected;\n}\n\nfunction buildFixtureAssertions(model: import('@workos/oagen').Model, spec: ApiSpec): string[] {\n const assertions: string[] = [];\n\n // Compute the exact fixture payload the generator emits for this model so\n // we can assert against those values verbatim. Mapping regressions\n // (snake_case drift, nested field loss) fail deterministically instead of\n // silently passing NotEmpty checks.\n const modelMap = new Map(spec.models.map((m) => [m.name, m]));\n const enumMap = new Map(spec.enums.map((e) => [e.name, e]));\n let fixture: Record<string, unknown> = {};\n try {\n fixture = generateModelFixture(model, modelMap, enumMap);\n } catch {\n // Fall back to shape-only assertions if the fixture builder throws.\n }\n\n const idField = model.fields.find((f) => f.required && f.name === 'id');\n if (idField) {\n const idVal = fixture['id'];\n if (typeof idVal === 'string' && idVal.length > 0) {\n assertions.push(`Assert.Equal(${csStringLiteral(idVal)}, result.Id);`);\n } else {\n assertions.push(`Assert.NotEmpty(result.Id);`);\n }\n }\n\n // Assert up to 2 additional required simple fields using the exact fixture\n // value so snake_case mapping is verified. Skip date-time, binary, and\n // anything that doesn't come out of the fixture as a non-empty string.\n let extraCount = 0;\n for (const field of model.fields) {\n if (extraCount >= 2) break;\n if (field.name === 'id') continue;\n if (!field.required) continue;\n if (field.type.kind !== 'primitive' || field.type.type !== 'string') continue;\n if (field.type.format === 'date-time' || field.type.format === 'date') continue;\n if (field.type.format === 'binary') continue;\n const csField = csFieldName(field.name);\n const val = fixture[field.name];\n if (typeof val === 'string' && val.length > 0) {\n assertions.push(`Assert.Equal(${csStringLiteral(val)}, result.${csField});`);\n } else {\n assertions.push(`Assert.NotEmpty(result.${csField});`);\n }\n extraCount++;\n }\n\n return assertions;\n}\n\n/** Escape a JS string for use as a C# verbatim-friendly string literal. */\nfunction csStringLiteral(s: string): string {\n return `\"${s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r')}\"`;\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { resolveMethodName } from './naming.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Generate smoke test manifest mapping HTTP operations to SDK methods.\n */\nexport function generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const manifest: Record<string, { sdkMethod: string; service: string }> = {};\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n\n for (const service of spec.services) {\n let propName = accessPaths.get(service.name);\n if (!propName) {\n const mountTarget = getMountTarget(service, ctx);\n propName = accessPaths.get(mountTarget);\n }\n if (!propName) {\n throw new Error(`Missing public client access path for service ${service.name}`);\n }\n for (const op of service.operations) {\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const method = resolveMethodName(op, service, ctx);\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return [\n {\n path: 'smoke-manifest.json',\n content: JSON.stringify(manifest, null, 2),\n integrateTarget: false,\n },\n ];\n}\n","import type {\n Emitter,\n EmitterContext,\n FormatCommand,\n GeneratedFile,\n ApiSpec,\n Model,\n Enum,\n Service,\n} from '@workos/oagen';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { generateModels } from './models.js';\nimport { enrichModelsFromSpec, getSyntheticEnums } from '../shared/model-utils.js';\nimport { generateEnums, primeEnumAliases } from './enums.js';\nimport { generateResources } from './resources.js';\nimport { generateClient } from './client.js';\nimport { generateTests } from './tests.js';\nimport { generateManifest } from './manifest.js';\nimport { generateWrapperOptionsClasses } from './wrappers.js';\nimport { groupByMount } from '../shared/resolved-ops.js';\nimport { discriminatedUnions } from './type-map.js';\n\n/**\n * Fix the namespace for C#. The CLI passes `--namespace workos` which gives\n * namespacePascal = \"Workos\", but C# needs \"WorkOS\" (preserving the brand casing).\n */\nfunction fixNamespace(ctx: EmitterContext): EmitterContext {\n if (ctx.namespace === 'workos' || ctx.namespacePascal === 'Workos') {\n return { ...ctx, namespacePascal: 'WorkOS' };\n }\n return ctx;\n}\n\n/** Ensure every generated file's content ends with a trailing newline. */\nfunction ensureTrailingNewlines(files: GeneratedFile[]): GeneratedFile[] {\n for (const f of files) {\n if (f.content && !f.content.endsWith('\\n')) {\n f.content += '\\n';\n }\n }\n return files;\n}\n\n/** Prefix for source files so they land under the .csproj directory. */\nconst SRC_PREFIX = 'src/WorkOS.net/';\n/** Prefix for test files so they land under the test project directory. */\nconst TEST_PREFIX = 'test/WorkOSTests/';\n\n/** Prefix generated source file paths to match the .NET project layout. */\nfunction prefixSourcePaths(files: GeneratedFile[]): GeneratedFile[] {\n for (const f of files) {\n f.path = `${SRC_PREFIX}${f.path}`;\n }\n return files;\n}\n\n/** Prefix generated test/fixture paths to match the .NET test project layout. */\nfunction prefixTestPaths(files: GeneratedFile[]): GeneratedFile[] {\n for (const f of files) {\n f.path = `${TEST_PREFIX}${f.path}`;\n }\n return files;\n}\n\nexport const dotnetEmitter: Emitter = {\n language: 'dotnet',\n\n generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n const c = fixNamespace(ctx);\n primeEnumAliases(c.spec.enums);\n const enriched = enrichModelsFromSpec(models);\n // Re-prime after enrichment so synthetic enums from oneOf branches are\n // included in the alias map used by mapTypeRef during model emission.\n const synEnumsForModels = getSyntheticEnums();\n if (synEnumsForModels.length > 0) {\n primeEnumAliases([...c.spec.enums, ...synEnumsForModels]);\n }\n const files = generateModels(enriched, c);\n\n // Generate discriminator converters for oneOf unions with discriminator\n if (discriminatedUnions.size > 0) {\n for (const [baseName, disc] of discriminatedUnions) {\n const converterName = `${baseName}DiscriminatorConverter`;\n const lines: string[] = [];\n lines.push(`namespace ${c.namespacePascal}`);\n lines.push('{');\n lines.push(' using System;');\n lines.push(' using System.Text.Json;');\n lines.push(' using System.Text.Json.Serialization;');\n lines.push(' using Newtonsoft.Json;');\n lines.push(' using Newtonsoft.Json.Linq;');\n lines.push('');\n lines.push(` /// <summary>`);\n lines.push(` /// JSON converter that deserializes discriminated union variants`);\n lines.push(` /// based on the \"${disc.property}\" property.`);\n lines.push(` /// </summary>`);\n lines.push(` public class ${converterName} : Newtonsoft.Json.JsonConverter`);\n lines.push(' {');\n lines.push(' public override bool CanConvert(Type objectType) => objectType == typeof(object);');\n lines.push('');\n lines.push(\n ' public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)',\n );\n lines.push(' {');\n lines.push(' var jObject = JObject.Load(reader);');\n lines.push(` var discriminatorValue = jObject[\"${disc.property}\"]?.ToString();`);\n lines.push(' switch (discriminatorValue)');\n lines.push(' {');\n for (const [value, modelName] of Object.entries(disc.mapping)) {\n const csName = modelName.replace(/([a-z])([A-Z])/g, '$1$2');\n lines.push(` case \"${value}\": return jObject.ToObject<${csName}>(serializer);`);\n }\n lines.push(' default: return jObject.ToObject<object>(serializer);');\n lines.push(' }');\n lines.push(' }');\n lines.push('');\n lines.push(\n ' public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)',\n );\n lines.push(' {');\n lines.push(' serializer.Serialize(writer, value);');\n lines.push(' }');\n lines.push(' }');\n lines.push('}');\n\n files.push({\n path: `Client/Utilities/${converterName}.cs`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n }\n\n return prefixSourcePaths(ensureTrailingNewlines(files));\n },\n\n generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n const c = fixNamespace(ctx);\n // Ensure synthetic enums are populated regardless of method execution order.\n // enrichModelsFromSpec is idempotent (cached raw spec) and populates the\n // module-level synthetic-enum store consumed by getSyntheticEnums().\n enrichModelsFromSpec(c.spec.models);\n const syntheticEnums = getSyntheticEnums();\n const allEnums = syntheticEnums.length > 0 ? [...enums, ...syntheticEnums] : enums;\n return prefixSourcePaths(ensureTrailingNewlines(generateEnums(allEnums, c)));\n },\n\n generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n const c = fixNamespace(ctx);\n const synEnums = getSyntheticEnums();\n primeEnumAliases(synEnums.length > 0 ? [...c.spec.enums, ...synEnums] : c.spec.enums);\n const files = generateResources(services, c);\n\n // Also generate wrapper options classes\n const mountGroups = groupByMount(c);\n for (const [, group] of mountGroups) {\n for (const resolvedOp of group.resolvedOps) {\n if (resolvedOp.wrappers && resolvedOp.wrappers.length > 0) {\n const wrapperOptionsLines = generateWrapperOptionsClasses(resolvedOp, c);\n if (wrapperOptionsLines.length > 0) {\n const mountName = resolvedOp.mountOn;\n const optionsPath = `Services/${mountName}/_interfaces/${mountName}WrapperOptions.cs`;\n const content = [\n `namespace ${c.namespacePascal}`,\n '{',\n ' using System.Collections.Generic;',\n ' using Newtonsoft.Json;',\n ' using STJS = System.Text.Json.Serialization;',\n ...wrapperOptionsLines,\n '}',\n ].join('\\n');\n files.push({\n path: optionsPath,\n content,\n overwriteExisting: true,\n });\n }\n }\n }\n }\n\n return prefixSourcePaths(ensureTrailingNewlines(files));\n },\n\n generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const c = fixNamespace(ctx);\n return prefixSourcePaths(ensureTrailingNewlines(generateClient(spec, c)));\n },\n\n generateErrors(): GeneratedFile[] {\n return [];\n },\n\n generateTypeSignatures(): GeneratedFile[] {\n return [];\n },\n\n generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const c = fixNamespace(ctx);\n const synEnumsForTests = getSyntheticEnums();\n primeEnumAliases(synEnumsForTests.length > 0 ? [...spec.enums, ...synEnumsForTests] : spec.enums);\n return prefixTestPaths(ensureTrailingNewlines(generateTests(spec, c)));\n },\n\n generateManifest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateManifest(spec, fixNamespace(ctx)));\n },\n\n fileHeader(): string {\n return '// This file is auto-generated by oagen. Do not edit.';\n },\n\n formatCommand(targetDir: string): FormatCommand | null {\n // `dotnet format` applies both whitespace rules and analyzer code fixes\n // (StyleCop, etc.) to the generated files, matching the target project's\n // conventions. We prefer a .sln/.slnx/.csproj workspace so MSBuild loads\n // the analyzer ruleset correctly.\n const workspace = findDotnetWorkspace(targetDir);\n if (!workspace) return null;\n\n // `dotnet format` expects `--include` paths relative to the workspace\n // (or absolute). Our harness appends absolute paths, which is fine.\n // Run `--no-restore` so formatting doesn't trigger a package restore on\n // every codegen run.\n return {\n cmd: 'dotnet',\n args: ['format', workspace, '--no-restore', '--include'],\n // Keep batches small enough to stay under argv length limits while\n // still amortizing MSBuild startup across many files.\n batchSize: 50,\n };\n },\n};\n\n/** Locate a .sln/.slnx/.csproj file in the target directory for `dotnet format`. */\nfunction findDotnetWorkspace(targetDir: string): string | null {\n if (!fs.existsSync(targetDir)) return null;\n const entries = fs.readdirSync(targetDir);\n const sln = entries.find((e) => e.endsWith('.sln') || e.endsWith('.slnx'));\n if (sln) return path.join(targetDir, sln);\n const csproj = entries.find((e) => e.endsWith('.csproj'));\n if (csproj) return path.join(targetDir, csproj);\n return null;\n}\n"],"x_google_ignoreList":[4],"mappings":"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"}