@workos/oagen-emitters 0.6.6 → 0.6.7
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.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +8 -0
- package/dist/index.mjs +1 -1
- package/dist/{plugin-BgVrq-hM.mjs → plugin-Bk0xWTQC.mjs} +45 -10
- package/dist/plugin-Bk0xWTQC.mjs.map +1 -0
- package/dist/plugin.mjs +1 -1
- package/package.json +1 -1
- package/src/dotnet/index.ts +10 -3
- package/src/dotnet/models.ts +24 -0
- package/src/go/models.ts +18 -1
- package/src/go/tests.ts +8 -2
- package/test/dotnet/models.test.ts +77 -0
- package/dist/plugin-BgVrq-hM.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-Bk0xWTQC.mjs","names":["buildHiddenParams","articleFor","fileName","fieldName","servicePropertyName","resolveClassName","resolveServiceDir","resolveMethodName","mapTypeRef","irMapTypeRef","mapPrimitive","joinUnionVariants","isNothing_1","isObject_1","toArray_1","repeat_1","isNegativeZero_1","extend_1","loadAll_1","load_1","dump_1","yamlLoad","mapTypeRef","resolveServiceDir","resolveMethodName","fieldName","generateEnums","assignEnumsToServices","resolveServiceDir","fileName","deserializeExpression","tsMapTypeRef","fileName","fieldName","fileName","generateModels","collectFieldDependencies","assignEnumsToServices","fieldName","mapTypeRef","ID_PREFIXES","generateFixtures","assignModelsToServices","resolveServiceDir","fileName","generateModelFixture","resolveResourceClassName","unwrapListModel","generateFieldValue","generatePrimitiveValue","generateWrapperMethods","collectWrapperResponseModels","emitWrapperMethod","fieldName","mapTypeRef","tsLiteral","clientFieldExpression","buildPathStr","resolveResourceClassName","singularize","resolveServiceDir","resolveMethodName","fileName","fieldName","generateResources","unwrapListModel","collectWrapperResponseModels","assignEnumsToServices","renderMethod","generateWrapperMethods","mapTypeRef","clientFieldExpression","generateClient","generateWorkOSClient","resolveResourceClassName","resolveServiceDir","fileName","servicePropertyName","fileName","generateTests","generateFixtures","servicePropertyName","resolveResourceClassName","generateServiceTest","resolveServiceDir","fileName","resolveMethodName","unwrapListModel","fieldName","buildExpectedPath","ID_PREFIXES","assignModelsToServices","buildOperationsMap","servicePropertyName","resolveResourceClassName","resolveMethodName","ensureTrailingNewlines","generateEnums","generateResources","generateClient","generateTests","buildOperationsMap","fs","path","className","fileName","fieldName","moduleName","servicePropertyName","resolveMethodName","resolveClassName","buildMountDirMap","mapTypeRef","irMapTypeRef","mapPrimitive","className","joinUnionVariants","toPythonLiteral","generateEnums","buildMountDirMap","collectEnumAliasOf","fileName","className","generateModels","buildMountDirMap","buildRecursiveHashMap","className","fileName","fieldName","mapTypeRef","emitWrapperMethod","fieldName","className","clientFieldExpression","fieldName","resolveResourceClassName","resolveClassName","buildHiddenParamsShared","groupVariantClassName","className","isRedirectEndpoint","buildPathString","clientFieldExpression","generateResources","buildMountDirMap","moduleName","fileName","generateClient","deduplicateByMount","buildServiceAccessPaths","servicePropertyName","resolveResourceClassName","buildMountDirMap","className","ID_PREFIXES","generateFixtures","generateModelFixture","fileName","unwrapListModel","fieldName","generateFieldValue","generatePrimitiveValue","className","generateModelFixture","isRedirectEndpoint","generateTests","generateFixtures","buildServiceAccessPaths","resolveResourceClassName","generateServiceTest","buildMountDirMap","moduleName","buildHiddenParams","resolveMethodName","fileName","buildTestArgs","buildExpectedPath","generateTestValue","emitWrapperTests","fieldName","buildOperationsMap","buildServiceAccessPaths","resolveMethodName","ensureTrailingNewlines","generateModels","generateEnums","generateResources","generateClient","generateTests","buildOperationsMap","className","resolveEnumName","resolveMethodName","fieldName","servicePropertyName","mapTypeRef","irMapTypeRef","mapPrimitive","className","joinUnionVariants","generateModels","className","fieldName","mapTypeRef","generateEnums","resolveEnumName","className","generateWrapperMethods","emitWrapperMethod","fieldName","className","mapTypeRef","phpLiteral","isEnumType","clientFieldExpression","generateResources","className","collectImports","resolveMethodName","generateWrapperMethods","groupVariantClassName","deriveVariantFieldName","fieldName","mapTypeRef","generateMethod","clientFieldExpression","generateClient","deduplicateByMount","buildServiceAccessPaths","servicePropertyName","className","ID_PREFIXES","generateFixtures","generateModelFixture","unwrapListModel","generateFieldValue","generatePrimitiveValue","generateTests","className","generateFixtures","servicePropertyName","resolveMethodName","buildHiddenParams","buildExpectedPath","deriveVariantFieldName","buildOperationsMap","buildServiceAccessPaths","resolveMethodName","ensureTrailingNewlines","generateModels","generateEnums","generateResources","generateClient","generateTests","buildOperationsMap","fs","path","className","fileName","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","fieldName","buildHiddenParams","mapTypeRef","buildPathExpr","clientFieldExpression","singularizePascal","generateClient","deduplicateByMount","buildServiceAccessPaths","resolveResourceClassName","className","ID_PREFIXES","generateFixtures","generateModelFixture","fileName","unwrapListModel","fieldName","generateFieldValue","generatePrimitiveValue","generateTests","generateFixtures","buildServiceAccessPaths","resolveResourceClassName","generateServiceTest","buildHiddenParams","buildExpectedPath","sortPathParamsByTemplateOrder","fileName","buildMethodCallArgs","buildFixtureAssertions","goMethodName","resolveMethodName","goFieldName","ID_PREFIXES","buildOperationsMap","buildServiceAccessPaths","resolveMethodName","ensureTrailingNewlines","generateModels","generateEnums","generateResources","generateClient","generateTests","buildOperationsMap","className","methodName","fieldName","trimMountedResourceFromMethod","resolveClassName","resolveMethodName","splitPascalWords","singularize","wordsMatch","clientFieldExpression","escapeXml","humanize","mapTypeRef","irMapTypeRef","mapPrimitive","className","joinUnionVariants","discriminatedUnions","generateModels","fieldName","mapTypeRef","humanize","structuralHash","normalizeTypeForHash","generateEnums","collectEnumAliasOf","className","humanize","generateWrapperMethods","emitWrapperMethod","csMethodName","sortPathParamsByTemplateOrder","escapeXml","humanize","csFieldName","clientFieldExpression","mapTypeRef","sortPathParamsByTemplateOrder","resolveClassName","generateResources","className","fieldName","mapTypeRef","humanize","resolveCsMethodStem","resolveCsMethodName","generateWrapperMethods","methodName","buildHiddenParams","escapeXml","clientFieldExpression","buildPathExpr","resolveMethodName","generateClient","deduplicateByMount","className","humanize","fieldName","generateTests","csMethodName","sortPathParamsByTemplateOrder","resolveMethodName","buildHiddenParams","csFieldName","buildOperationsMap","resolveMethodName","ensureTrailingNewlines","TEST_PREFIX","generateModels","discriminatedUnions","generateEnums","generateResources","generateClient","generateTests","buildOperationsMap","fs","path","className","servicePropertyName","resolveMethodName","resolveClassName","KOTLIN_SRC_PREFIX","generateEnums","className","escapeKdoc","className","mapTypeRef","irMapTypeRef","mapPrimitive","KOTLIN_SRC_PREFIX","generateModels","className","mapTypeRef","escapeKdoc","generateWrapperMethods","emitWrapperMethod","className","escapeKdoc","mapTypeRef","KOTLIN_SRC_PREFIX","generateResources","className","generateWrapperMethods","resolveMethodName","findService","buildHiddenParams","resolveBodyModel","mapTypeRef","assignGroupParameterNames","sealedGroupName","reserveUniqueGroupParameterName","generateClient","servicePropertyName","generateTests","generateModelRoundTripTest","resolveMethodName","buildHiddenParams","resolveBodyModel","mapTypeRef","className","buildOperationsMap","servicePropertyName","resolveClassName","resolveMethodName","ensureTrailingNewlines","generateModels","generateEnums","generateResources","generateClient","generateTests","buildOperationsMap","irMapTypeRef","rubyStringLit","interpolateRubyPath","buildHiddenParams","buildHiddenParams","irMapTypeRef","buildHiddenParams","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","../src/kotlin/naming.ts","../src/kotlin/enums.ts","../src/kotlin/type-map.ts","../src/kotlin/models.ts","../src/kotlin/wrappers.ts","../src/kotlin/overrides.ts","../src/kotlin/resources.ts","../src/kotlin/client.ts","../src/kotlin/tests.ts","../src/kotlin/manifest.ts","../src/kotlin/index.ts","../src/ruby/naming.ts","../src/ruby/models.ts","../src/ruby/enums.ts","../src/ruby/type-map.ts","../src/ruby/wrappers.ts","../src/ruby/resources.ts","../src/ruby/client.ts","../src/ruby/tests.ts","../src/ruby/manifest.ts","../src/ruby/rbi.ts","../src/ruby/index.ts","../src/plugin.ts"],"sourcesContent":["import type { Operation, EmitterContext, Service, ResolvedOperation, Model, TypeRef } from '@workos/oagen';\nimport { toPascalCase } from '@workos/oagen';\n\n/**\n * Fail fast when two distinct paths in the same mount resolve to the same SDK\n * method name. Emitters can sometimes paper over this with per-language\n * deduplication, but manifests and cross-language parity become inconsistent.\n */\nexport function assertUniqueResolvedMethods(ctx: EmitterContext): void {\n const seen = new Map<string, { path: string; httpMethod: string }>();\n\n for (const resolved of ctx.resolvedOperations ?? []) {\n const key = `${resolved.mountOn}.${resolved.methodName}`;\n const current = {\n path: resolved.operation.path,\n httpMethod: resolved.operation.httpMethod.toUpperCase(),\n };\n const existing = seen.get(key);\n\n if (existing && existing.path !== current.path) {\n throw new Error(\n `Resolved operation name collision for ${key}: ` +\n `${existing.httpMethod} ${existing.path} conflicts with ${current.httpMethod} ${current.path}`,\n );\n }\n\n if (!existing) {\n seen.set(key, current);\n }\n }\n}\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 assertUniqueResolvedMethods(ctx);\n\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// ---------------------------------------------------------------------------\n// Parameter group helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Collect all parameter names that belong to any mutually-exclusive parameter group.\n * These params are serialized via group-level dispatch (e.g. applyToQuery, isinstance,\n * sealed-class when, etc.) instead of individual struct/class fields.\n */\nexport function collectGroupedParamNames(op: Operation): Set<string> {\n const names = new Set<string>();\n for (const group of op.parameterGroups ?? []) {\n for (const variant of group.variants) {\n for (const param of variant.parameters) {\n names.add(param.name);\n }\n }\n }\n return names;\n}\n\n/**\n * Build a fallback map from request-body wire field name to TypeRef.\n *\n * Some parameter-group variants lose array/object fidelity in the IR and fall\n * back to primitive strings. Cross-referencing the request body model restores\n * the actual field type when the grouped params belong to the body.\n */\nexport function collectBodyFieldTypes(op: Operation, models: Model[]): Map<string, TypeRef> {\n const fieldTypes = new Map<string, TypeRef>();\n const reqBody = op.requestBody;\n if (reqBody?.kind !== 'model') return fieldTypes;\n\n const bodyModel = models.find((model) => model.name === reqBody.name);\n if (!bodyModel) return fieldTypes;\n\n for (const field of bodyModel.fields) {\n fieldTypes.set(field.name, field.type);\n }\n\n return fieldTypes;\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 * Words beginning with a vowel letter but a consonant /j/ or /w/ sound —\n * take \"a\", not \"an\".\n */\nconst CONSONANT_SOUND_INITIAL_VOWEL = new Set([\n 'user',\n 'unit',\n 'unique',\n 'united',\n 'universal',\n 'university',\n 'european',\n 'one',\n 'once',\n 'useful',\n 'used',\n 'usable',\n 'ubiquitous',\n]);\n\n/**\n * Words beginning with a consonant letter but a vowel sound (silent h) —\n * take \"an\", not \"a\".\n */\nconst VOWEL_SOUND_INITIAL_CONSONANT = new Set(['hour', 'honest', 'honor', 'honorable', 'heir']);\n\n/**\n * Select the correct indefinite article (\"a\" or \"an\") for a word.\n *\n * Matches English phonetics, not orthography: \"a user\" (consonant /j/ sound\n * despite leading 'u'), \"an hour\" (vowel sound despite leading 'h'). Falls\n * back to a vowel-letter regex for words not in either exception set.\n */\nexport function articleFor(word: string): string {\n const firstWord = word\n .split(/\\s+/)[0]\n .toLowerCase()\n .replace(/[^a-z]/g, '');\n if (CONSONANT_SOUND_INITIAL_VOWEL.has(firstWord)) return 'a';\n if (VOWEL_SOUND_INITIAL_CONSONANT.has(firstWord)) return 'an';\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 /** 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.genericDefaults - When present, appends default type args to generic model refs.\n */\nexport function mapTypeRef(ref: TypeRef, opts?: MapTypeRefOpts): string {\n const genericDefaults = opts?.genericDefaults;\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\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 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 { toSnakeCase } 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) && !collector.usedNames.has(toSnakeCase(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) && !collector.usedNames.has(toSnakeCase(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// Implicit discriminator detection\n// ---------------------------------------------------------------------------\n\n/**\n * Find a property name that has a `const` value in ALL oneOf variants.\n * Returns null if no shared const property is found.\n */\nfunction findSharedConstProperty(oneOfSchemas: Record<string, any>[]): string | null {\n if (oneOfSchemas.length === 0) return null;\n\n const first = oneOfSchemas[0];\n if (!first.properties) return null;\n\n // Candidate properties from the first variant that have const values\n const candidates = Object.keys(first.properties).filter((name) => first.properties[name].const !== undefined);\n\n // Return the first candidate that has const values in ALL variants\n for (const candidate of candidates) {\n const allHaveConst = oneOfSchemas.every((variant) => variant.properties?.[candidate]?.const !== undefined);\n if (allHaveConst) return candidate;\n }\n\n return null;\n}\n\n/**\n * Build a discriminator mapping from const values to IR model names.\n * For each oneOf variant's const value on `discProperty`, find the IR model\n * whose field with the same name is a Literal type with that value.\n */\nfunction buildDiscriminatorMapping(\n discProperty: string,\n oneOfSchemas: Record<string, any>[],\n models: Model[],\n parentModelName: string,\n): Record<string, string> {\n const mapping: Record<string, string> = {};\n\n for (const variant of oneOfSchemas) {\n const constValue = variant.properties?.[discProperty]?.const;\n if (constValue === undefined) continue;\n\n const variantModel = models.find(\n (m) =>\n m.name !== parentModelName &&\n m.fields.some(\n (f) => f.name === discProperty && f.type.kind === 'literal' && (f.type as any).value === constValue,\n ),\n );\n if (variantModel) {\n mapping[String(constValue)] = variantModel.name;\n }\n }\n\n return mapping;\n}\n\n/**\n * Detect implicit discriminators on models without full oneOf flattening.\n * Returns a new array with discriminator annotations; models without\n * discriminators are returned as-is. Use this when you need discriminator\n * info but don't want the side-effects of full enrichment (synthetic\n * models/enums, field flattening).\n */\nexport function detectDiscriminators(models: Model[]): Model[] {\n const spec = loadRawSpec();\n if (!spec) return models;\n\n let changed = false;\n const result = models.map((model) => {\n if ((model as any).discriminator) return model;\n\n const rawSchema = lookupRawSchema(model.name);\n if (!rawSchema) return model;\n\n const oneOfContainer = rawSchema.allOf?.find((s: any) => s.oneOf);\n if (!oneOfContainer?.oneOf || oneOfContainer.oneOf.length === 0) return model;\n\n const discProperty = findSharedConstProperty(oneOfContainer.oneOf);\n if (!discProperty) return model;\n\n const mapping = buildDiscriminatorMapping(discProperty, oneOfContainer.oneOf, models, model.name);\n if (Object.keys(mapping).length === 0) return model;\n\n changed = true;\n return {\n ...model,\n fields: [],\n discriminator: { property: discProperty, mapping },\n };\n });\n\n return changed ? result : models;\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 (check both PascalCase and\n // snake_case to prevent synthetic models from shadowing existing ones when\n // they share a file name, e.g. FooBar vs Foo_bar -> foo_bar).\n for (const m of models) {\n collector.usedNames.add(m.name);\n collector.usedNames.add(toSnakeCase(m.name));\n }\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 explicit 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 // Detect implicit discriminators: allOf+oneOf where all variants share a\n // property with const values (e.g., EventSchema with event: const: \"user.created\").\n // When found, attach a discriminator mapping and clear fields so the emitter\n // generates a dispatcher class instead of a flat dataclass.\n const oneOfContainer = rawSchema.allOf?.find((s: any) => s.oneOf);\n if (oneOfContainer?.oneOf && oneOfContainer.oneOf.length > 0) {\n const discProperty = findSharedConstProperty(oneOfContainer.oneOf);\n if (discProperty) {\n const mapping = buildDiscriminatorMapping(discProperty, oneOfContainer.oneOf, models, model.name);\n if (Object.keys(mapping).length > 0) {\n return {\n ...model,\n fields: [],\n discriminator: { property: discProperty, mapping },\n };\n }\n }\n }\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, skipping those whose snake_case name collides\n // with an existing model (prevents broken TypeAlias self-imports).\n const existingSnakeNames = new Set(enriched2.map((m) => toSnakeCase(m.name)));\n const filteredSynthetic = collector.models.filter((m) => !existingSnakeNames.has(toSnakeCase(m.name)));\n return [...enriched2, ...filteredSynthetic];\n}\n","import type { Model, EmitterContext, Service, Operation, TypeRef } 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(\n models: Model[],\n ctx?: EmitterContext,\n reachable?: Set<string>,\n): Map<string, string> {\n const dedup = new Map<string, string>();\n\n // Pass 1: structural fingerprint dedup (exact match)\n // When a reachability set is provided, prefer reachable models as canonicals\n // so that aliases always point to models that will actually be generated.\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 // If the existing canonical is unreachable but this model is reachable,\n // swap: make this model the canonical and demote the old one to alias.\n if (reachable && !reachable.has(existing) && reachable.has(model.name)) {\n dedup.delete(existing); // remove stale alias if present\n dedup.set(existing, model.name);\n fingerprints.set(fp, model.name);\n } else {\n dedup.set(model.name, existing);\n }\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, preferring\n // reachable models when a reachability set is provided.\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: prefer reachable, then most fields, then alphabetically\n group.sort((a, b) => {\n if (reachable) {\n const aReach = reachable.has(a.name) ? 0 : 1;\n const bReach = reachable.has(b.name) ? 0 : 1;\n if (aReach !== bReach) return aReach - bReach;\n }\n return b.fields.length - a.fields.length || a.name.localeCompare(b.name);\n });\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 * Check whether an IR model has fields not present in the baseline interface.\n * Returns true if the model has new fields that need generation.\n * Returns true if no baseline exists (new model entirely).\n */\nexport function modelHasNewFields(model: Model, ctx: EmitterContext): boolean {\n if (!ctx.apiSurface?.interfaces) return true; // No surface = generate everything\n\n const domainName = resolveInterfaceName(model.name, ctx);\n const baseline = ctx.apiSurface.interfaces[domainName];\n if (!baseline?.fields) return true; // No baseline for this model = new model\n\n for (const field of model.fields) {\n const camelName = fieldName(field.name);\n if (!baseline.fields[camelName]) return true; // New field found\n }\n\n return false; // All fields exist in baseline\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\n/**\n * Compute the set of model names reachable from non-event service operations.\n * The Events service pulls in hundreds of webhook payload models that the\n * existing SDK handles via hand-written event types, so those models are\n * excluded from generation.\n *\n * Shared between model generation, barrel generation, dedup, and tests to\n * ensure consistency: every module agrees on which models will be generated.\n */\nexport function computeNonEventReachable(services: Service[], models: Model[]): Set<string> {\n const seeds = new Set<string>();\n for (const svc of services) {\n if (svc.name.toLowerCase() === 'events') continue;\n for (const op of svc.operations) {\n const collectFromRef = (t: TypeRef | undefined): void => {\n if (!t) return;\n if (t.kind === 'model') seeds.add(t.name);\n if (t.kind === 'array') collectFromRef(t.items);\n if (t.kind === 'nullable') collectFromRef(t.inner);\n if (t.kind === 'union') t.variants.forEach(collectFromRef);\n };\n collectFromRef(op.response);\n collectFromRef(op.requestBody);\n if (op.pagination?.itemType) collectFromRef(op.pagination.itemType);\n }\n }\n const modelMap = new Map(models.map((m) => [m.name, m]));\n const reachable = new Set<string>();\n const queue = [...seeds];\n while (queue.length > 0) {\n const name = queue.pop()!;\n if (reachable.has(name)) continue;\n reachable.add(name);\n const m = modelMap.get(name);\n if (!m) continue;\n for (const field of m.fields) {\n const walk = (t: TypeRef): void => {\n if (t.kind === 'model' && !reachable.has(t.name)) queue.push(t.name);\n if (t.kind === 'array') walk(t.items);\n if (t.kind === 'nullable') walk(t.inner);\n if (t.kind === 'union') t.variants.forEach(walk);\n };\n walk(field.type);\n }\n }\n return reachable;\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 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 // Check the canonical name for dedup'd models\n const canon = sctx.dedup.get(dep);\n const depSkipSerialize =\n sctx.skippedSerializeModels.has(dep) || (canon != null && sctx.skippedSerializeModels.has(canon));\n if (depSkipSerialize) {\n lines.push(`import { deserialize${depName} } from '${rel}';`);\n } else {\n lines.push(`import { deserialize${depName}, serialize${depName} } from '${rel}';`);\n }\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(model: Model, baselineDomain: BaselineInterface | undefined): Set<string> {\n const skipFormatFields = new Set<string>();\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 // Always convert date-time fields to Date regardless of baseline\n if (hasDateTimeConversion(field.type)) continue;\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 fs from 'node:fs';\nimport path from 'node:path';\nimport 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 buildKnownTypeNames,\n isBaselineGeneric,\n createServiceDirResolver,\n isListMetadataModel,\n isListWrapperModel,\n buildDeduplicationMap,\n relativeImport,\n modelHasNewFields,\n computeNonEventReachable,\n} from './utils.js';\nimport { assignEnumsToServices } from './enums.js';\nimport {\n renderSerializerTypeParams,\n buildSerializerImports,\n buildSkipFormatFields,\n shouldSkipSerializeForModel,\n emitSerializerBody,\n hasDateTimeConversion,\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 path matches\n // the generated path. If the file is generated in a new directory, it\n // won't have generics, so references 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 dedup: sharedDedup,\n genericDefaults: sharedDefaults,\n } = shared ?? buildSharedContext(models, ctx);\n const genericDefaults = sharedDefaults;\n const typeRefOpts = { genericDefaults };\n const wireTypeRefOpts = { genericDefaults };\n const files: GeneratedFile[] = [];\n const dedup = sharedDedup;\n\n // Only generate files for models reachable from non-event service operations.\n // Event operations (listEvents) pull in hundreds of webhook payload models\n // that the existing SDK handles via hand-written event types. Skip those.\n const reachableModels = computeNonEventReachable(ctx.spec.services, models);\n\n // Force-generate models that are dependencies of generated models but whose\n // baseline definitions are inline in another file. The merger will replace the\n // parent symbol, losing the inline definition, so a separate file is needed.\n const forceGenerate = new Set<string>();\n for (const model of models) {\n if (!reachableModels.has(model.name)) continue;\n if (!modelHasNewFields(model, ctx)) continue;\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n const parentPath = `src/${dirName}/interfaces/${fileName(model.name)}.interface.ts`;\n const deps = collectFieldDependencies(model);\n for (const dep of deps.models) {\n if (forceGenerate.has(dep)) continue;\n const depName = resolveInterfaceName(dep, ctx);\n const depBaseline = ctx.apiSurface?.interfaces?.[depName];\n const depSrc = (depBaseline as any)?.sourceFile as string | undefined;\n if (depSrc === parentPath) {\n // The dependency's baseline is inline in the parent's file — force-generate\n forceGenerate.add(dep);\n }\n }\n }\n\n for (const model of models) {\n if (!reachableModels.has(model.name)) continue;\n\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 // Skip models that are unchanged from baseline (no new fields),\n // unless they're force-generated (inline dependency of a regenerated model).\n if (!modelHasNewFields(model, ctx) && !forceGenerate.has(model.name)) 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 // still export its raw name, so the import names must match the raw\n // 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 overwriteExisting: 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 // Check baseline sourceFile — if the enum lives at a different path\n // than the generated one, import from the baseline location.\n const bEnum = ctx.apiSurface?.enums?.[irEnumName];\n const bAlias = ctx.apiSurface?.typeAliases?.[irEnumName];\n const bSrc = (bEnum as any)?.sourceFile ?? (bAlias as any)?.sourceFile;\n const gPath = `src/${eDir}/interfaces/${fileName(irEnumName)}.interface.ts`;\n const cPath = `src/${dirName}/interfaces/${fileName(model.name)}.interface.ts`;\n // If defined inline in the same file, just add to importable names\n if (bSrc === cPath) {\n importableNames.add(name);\n continue;\n }\n let relPath: string;\n if (bSrc && bSrc !== gPath) {\n relPath = relativeImport(cPath, bSrc).replace(/\\.ts$/, '');\n } else {\n relPath =\n eDir === dirName\n ? `./${fileName(irEnumName)}.interface`\n : `../../${eDir}/interfaces/${fileName(irEnumName)}.interface`;\n }\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 // Check if the enum has a baseline sourceFile — if it lives at a\n // different path than the generated one, import from the baseline\n // location since the enum file won't be regenerated there.\n const baselineEnum = ctx.apiSurface?.enums?.[dep];\n const baselineAlias = ctx.apiSurface?.typeAliases?.[dep];\n const baselineSrc = (baselineEnum as any)?.sourceFile ?? (baselineAlias as any)?.sourceFile;\n const depService = enumToService.get(dep);\n const depDir = resolveDir(depService);\n const generatedPath = `src/${depDir}/interfaces/${fileName(dep)}.interface.ts`;\n const currentFilePath = `src/${dirName}/interfaces/${fileName(model.name)}.interface.ts`;\n\n // If the baseline enum is defined in the SAME file we're generating,\n // skip the import — the merger will preserve the inline definition.\n if (baselineSrc === currentFilePath) {\n importableNames.add(dep);\n continue;\n }\n\n let relPath: string;\n if (baselineSrc && baselineSrc !== generatedPath) {\n // Baseline provides the enum from a different file — import from there.\n relPath = relativeImport(currentFilePath, baselineSrc).replace(/\\.ts$/, '');\n } else {\n relPath =\n depDir === dirName ? `./${fileName(dep)}.interface` : `../../${depDir}/interfaces/${fileName(dep)}.interface`;\n }\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 !hasDateTimeConversion(field.type) &&\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 // When overwriting an existing interface file, preserve inline types whose\n // sourceFile matches this file but which aren't generated as separate files.\n // Query the apiSurface rather than parsing the target file with regex.\n const filePath = `src/${dirName}/interfaces/${fileName(model.name)}.interface.ts`;\n if (ctx.apiSurface) {\n const generatedNames = new Set<string>();\n for (const line of lines) {\n const m = line.match(/^export\\s+(?:interface|type|enum|class|const|function)\\s+(\\w+)/);\n if (m) generatedNames.add(m[1]);\n }\n\n // Read the existing file to extract inline declarations verbatim\n if (ctx.targetDir) {\n try {\n const existingContent = fs.readFileSync(path.join(ctx.targetDir, filePath), 'utf-8');\n // Collect names of inline types from the apiSurface\n const inlineNames = new Set<string>();\n const checkSurface = (items: Record<string, any> | undefined) => {\n if (!items) return;\n for (const [name, item] of Object.entries(items)) {\n const src = (item as any).sourceFile as string | undefined;\n if (src !== filePath) continue;\n if (generatedNames.has(name)) continue;\n // Check that no separate file is generated for this type\n const sepPath = `src/${dirName}/interfaces/${fileName(name)}.interface.ts`;\n if (sepPath !== filePath && files.some((f) => f.path === sepPath)) continue;\n inlineNames.add(name);\n }\n };\n checkSurface(ctx.apiSurface.interfaces);\n checkSurface(ctx.apiSurface.typeAliases);\n checkSurface(ctx.apiSurface.enums);\n\n // Extract each inline type's verbatim declaration from the existing file\n if (inlineNames.size > 0) {\n const existingLines = existingContent.split('\\n');\n let ei = 0;\n while (ei < existingLines.length) {\n const eline = existingLines[ei];\n // Match exported or non-exported declarations\n const dm = eline.match(/^(export\\s+)?(?:interface|type|enum|class|const|function)\\s+(\\w+)/);\n if (!dm || !inlineNames.has(dm[2])) {\n ei++;\n continue;\n }\n\n // Collect the full declaration via brace tracking\n const block: string[] = [eline];\n let braces = (eline.match(/\\{/g) || []).length - (eline.match(/\\}/g) || []).length;\n if (braces === 0 && eline.includes(';')) {\n lines.push('');\n lines.push(block.join('\\n'));\n ei++;\n continue;\n }\n // Multi-line type alias (union with |)\n if (braces === 0) {\n ei++;\n while (ei < existingLines.length) {\n const nl = existingLines[ei];\n block.push(nl);\n ei++;\n if (\n nl.trimEnd().endsWith(';') ||\n (nl.trim() !== '' && !nl.trim().startsWith('|') && !nl.trim().startsWith('&'))\n )\n break;\n }\n lines.push('');\n lines.push(block.join('\\n'));\n continue;\n }\n // Brace-delimited\n ei++;\n while (ei < existingLines.length && braces > 0) {\n const nl = existingLines[ei];\n block.push(nl);\n braces += (nl.match(/\\{/g) || []).length - (nl.match(/\\}/g) || []).length;\n ei++;\n }\n lines.push('');\n lines.push(block.join('\\n'));\n }\n }\n } catch {\n // No existing file — nothing to preserve\n }\n }\n }\n\n files.push({\n path: filePath,\n content: pruneUnusedImports(lines).join('\\n'),\n overwriteExisting: 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 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 genericDefaults = buildGenericModelDefaults(ctx.spec.models);\n enrichGenericDefaultsFromBaseline(genericDefaults, models, ctx, resolveDir, modelToService);\n const nonEventReachable = computeNonEventReachable(ctx.spec.services, models);\n const dedup = buildDeduplicationMap(models, ctx, nonEventReachable);\n return { modelToService, resolveDir, 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, dedup } = shared ?? buildSharedContext(models, ctx);\n const files: GeneratedFile[] = [];\n const skippedSerializeModels = new Set<string>();\n\n // Reuse the same reachability set from generateModels to skip serializers\n // for unreachable models (e.g., event/webhook payload types).\n const serializerReachable = computeNonEventReachable(ctx.spec.services, models);\n\n // Pre-populate skippedSerializeModels for baseline models that won't be\n // regenerated. Their existing serializers may only export deserialize.\n if (ctx.targetDir) {\n for (const model of models) {\n if (!serializerReachable.has(model.name)) continue;\n if (modelHasNewFields(model, ctx)) continue; // will be regenerated\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n const domainName = resolveInterfaceName(model.name, ctx);\n const serializerFile = path.join(\n ctx.targetDir,\n 'src',\n dirName,\n 'serializers',\n `${fileName(model.name)}.serializer.ts`,\n );\n try {\n const content = fs.readFileSync(serializerFile, 'utf-8');\n if (!new RegExp(`\\\\bserialize${domainName}\\\\b`).test(content)) {\n skippedSerializeModels.add(model.name);\n }\n } catch {\n // Serializer doesn't exist — model may be new or generated differently\n }\n }\n }\n\n // Force-generate serializers for inline dependency models (same logic as interfaces).\n const forceGenerateSerializer = new Set<string>();\n for (const model of models) {\n if (!serializerReachable.has(model.name)) continue;\n if (!modelHasNewFields(model, ctx)) continue;\n const service = modelToService.get(model.name);\n const dirName = resolveDir(service);\n const parentPath = `src/${dirName}/interfaces/${fileName(model.name)}.interface.ts`;\n const deps = collectFieldDependencies(model);\n for (const dep of deps.models) {\n const depName = resolveInterfaceName(dep, ctx);\n const depBaseline = ctx.apiSurface?.interfaces?.[depName];\n const depSrc = (depBaseline as any)?.sourceFile as string | undefined;\n if (depSrc === parentPath) {\n forceGenerateSerializer.add(dep);\n }\n }\n }\n\n // --- Pass 1: pre-compute which models skip serialize (ordering-independent) ---\n // This must run BEFORE file generation so that buildSerializerImports can\n // check the fully-populated set and avoid importing non-existent serialize functions.\n const eligibleModels: Model[] = [];\n for (const model of models) {\n if (!serializerReachable.has(model.name)) continue;\n if (isListMetadataModel(model)) continue;\n if (isListWrapperModel(model)) continue;\n if (!modelHasNewFields(model, ctx) && !forceGenerateSerializer.has(model.name)) continue;\n eligibleModels.push(model);\n }\n\n // First pass: determine shouldSkipSerialize for every eligible model\n for (const model of eligibleModels) {\n if (dedup.has(model.name)) continue; // dedup aliases don't get their own serialize\n const domainName = resolveInterfaceName(model.name, ctx);\n const responseName = wireInterfaceName(domainName);\n const baselineResponse = ctx.apiSurface?.interfaces?.[responseName];\n const baselineDomain = ctx.apiSurface?.interfaces?.[domainName];\n const shouldSkip = shouldSkipSerializeForModel(\n model,\n baselineResponse,\n baselineDomain,\n dedup,\n skippedSerializeModels,\n ctx,\n );\n if (shouldSkip) {\n skippedSerializeModels.add(model.name);\n }\n }\n\n // --- Pass 2: generate serializer files using fully-populated skip set ---\n for (const model of eligibleModels) {\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 const canonSkipSerialize = skippedSerializeModels.has(canonicalName) || skippedSerializeModels.has(model.name);\n const reexportContent = canonSkipSerialize\n ? `export { deserialize${canonDomainName} as deserialize${domainName} } from '${rel}';`\n : `export { deserialize${canonDomainName} as deserialize${domainName}, serialize${canonDomainName} as serialize${domainName} } from '${rel}';`;\n files.push({\n path: serializerPath,\n content: reexportContent,\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, baselineDomain);\n const shouldSkipSerialize = skippedSerializeModels.has(model.name);\n\n const sctx = { modelToService, resolveDir, 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 overwriteExisting: true,\n });\n }\n\n // Stash the fully-computed skip set on the context so the test generator\n // can read it without duplicating the detection logic.\n (ctx as any)._skippedSerializeModels = skippedSerializeModels;\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 // Only generate fixtures for models reachable from non-event operations\n const fixtureSeeds = new Set<string>();\n for (const svc of spec.services) {\n if (svc.name.toLowerCase() === 'events') continue;\n for (const op of svc.operations) {\n const collectFromRef = (t: import('@workos/oagen').TypeRef | undefined): void => {\n if (!t) return;\n if (t.kind === 'model') fixtureSeeds.add(t.name);\n if (t.kind === 'array') collectFromRef(t.items);\n if (t.kind === 'nullable') collectFromRef(t.inner);\n if (t.kind === 'union') t.variants.forEach(collectFromRef);\n };\n collectFromRef(op.response);\n collectFromRef(op.requestBody);\n if (op.pagination?.itemType) collectFromRef(op.pagination.itemType);\n }\n }\n const fixtureModelMap = new Map(spec.models.map((m: Model) => [m.name, m]));\n const fixtureReachable = new Set<string>();\n const fixtureQueue = [...fixtureSeeds];\n while (fixtureQueue.length > 0) {\n const name = fixtureQueue.pop()!;\n if (fixtureReachable.has(name)) continue;\n fixtureReachable.add(name);\n const m = fixtureModelMap.get(name);\n if (!m) continue;\n for (const field of m.fields) {\n const walk = (t: import('@workos/oagen').TypeRef): void => {\n if (t.kind === 'model' && !fixtureReachable.has(t.name)) fixtureQueue.push(t.name);\n if (t.kind === 'array') walk(t.items);\n if (t.kind === 'nullable') walk(t.inner);\n if (t.kind === 'union') t.variants.forEach(walk);\n };\n walk(field.type);\n }\n }\n const seenFixturePaths = new Set<string>();\n for (const model of spec.models) {\n if (!fixtureReachable.has(model.name)) continue;\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)}.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)}.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 const docParts: string[] = [];\n docParts.push(formatWrapperDescription(wrapper.name) + '.');\n\n for (const p of op.pathParams) {\n if (p.description) {\n docParts.push(`@param ${fieldName(p.name)} - ${p.description}`);\n }\n }\n\n for (const { paramName, field } of wrapperParams) {\n const tsName = fieldName(paramName);\n if (field?.description) {\n docParts.push(`@param ${tsName} - ${field.description}`);\n }\n }\n\n if (responseTypeName) {\n docParts.push(`@returns {Promise<${returnType}>}`);\n }\n\n if (docParts.length === 1) {\n lines.push(` /** ${docParts[0]} */`);\n } else {\n lines.push(' /**');\n for (const part of docParts) {\n for (const line of part.split('\\n')) {\n lines.push(line === '' ? ' *' : ` * ${line}`);\n }\n }\n lines.push(' */');\n }\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 if (!hasMethodsAbsentFromBaseline(service, ctx)) {\n continue; // Fully covered, no new methods -- skip entirely\n }\n // Partially covered -- has new methods that need to be added.\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 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 if (isServiceCoveredByExisting(service, ctx) && !hasMethodsAbsentFromBaseline(service, ctx)) continue;\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 // Always collect param type refs for enums — inline options interfaces\n // are generated for all methods (including baseline ones), so their\n // type dependencies must always be imported.\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 // Skip response/request model imports for methods that already exist in\n // the baseline class. The merger keeps baseline method bodies, so their\n // imports are already present in the existing file.\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 }\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 { AutoPaginatable } from '../common/utils/pagination';\");\n lines.push(\"import { fetchAndDeserialize } 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 // When the overlay folds a path param into the options object,\n // document it as @param options.paramName instead of top-level.\n const folded = validParamNames && !validParamNames.has(paramName) && validParamNames.has('options');\n if (validParamNames && !validParamNames.has(paramName) && !folded) continue;\n const docName = folded ? `options.${paramName}` : paramName;\n const deprecatedPrefix = param.deprecated ? '(deprecated) ' : '';\n if (param.description) {\n docParts.push(`@param ${docName} - ${deprecatedPrefix}${param.description}`);\n } else if (param.deprecated) {\n docParts.push(`@param ${docName} - (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/body parameter when there is a request body.\n // Detect the actual param name from the overlay — the hand-written SDK may\n // fold the body into an 'options' param instead of the generated 'payload'.\n let bodyDocParamName: string | null = null;\n if (plan.hasBody) {\n let bodyParamName = 'payload';\n let overlayHadUnusableName = false;\n if (validParamNames && !validParamNames.has('payload') && overlayMethod) {\n const pathNames = new Set(op.pathParams.map((p) => fieldName(p.name)));\n const candidates = overlayMethod.params.filter((p) => !pathNames.has(p.name) && p.name !== 'requestOptions');\n // Filter out destructuring artifacts (e.g., __0) from extracted param names\n const isUsableName = (name: string) => !/^__\\d+$/.test(name);\n if (candidates.length === 1 && isUsableName(candidates[0].name)) {\n bodyParamName = candidates[0].name;\n } else if (candidates.length === 1 && !isUsableName(candidates[0].name)) {\n overlayHadUnusableName = true;\n } else if (candidates.length > 1) {\n // Multiple non-path params — match by type against the request body model\n const bodyInfo = extractRequestBodyType(op, ctx);\n if (bodyInfo?.kind === 'model') {\n const bodyTypeName = resolveInterfaceName(bodyInfo.name, ctx);\n const typeMatch = candidates.find((p) => p.type === bodyTypeName && isUsableName(p.name));\n if (typeMatch) {\n bodyParamName = typeMatch.name;\n } else {\n // Type names diverge (overlay vs spec). Fall back to matching\n // overlay param names against body model field names so each\n // extracted param gets documented individually.\n const bodyModel = ctx.spec.models.find((m) => m.name === bodyInfo.name);\n if (bodyModel) {\n const fieldMap = new Map(bodyModel.fields.map((f) => [fieldName(f.name), f]));\n for (const candidate of candidates) {\n const matchingField = fieldMap.get(candidate.name);\n if (matchingField?.description) {\n docParts.push(`@param ${candidate.name} - ${matchingField.description}`);\n if (matchingField.example !== undefined)\n docParts.push(`@example ${JSON.stringify(matchingField.example)}`);\n }\n }\n bodyDocParamName = '__multi__'; // prevent duplicate body doc below\n }\n }\n }\n }\n }\n\n // When the overlay had an unusable param name (e.g., destructured __0),\n // force documentation under 'payload' so the body isn't silently dropped.\n if (\n bodyDocParamName !== '__multi__' &&\n (overlayHadUnusableName || !validParamNames || validParamNames.has(bodyParamName))\n ) {\n bodyDocParamName = bodyParamName;\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 bodyDesc: string;\n if (bodyModel?.description) {\n bodyDesc = `@param ${bodyParamName} - ${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 bodyDesc =\n requiredFieldNames.length > 0\n ? `@param ${bodyParamName} - Object containing ${requiredFieldNames.join(', ')}.`\n : `@param ${bodyParamName} - The request body.`;\n } else {\n bodyDesc = `@param ${bodyParamName} - The request body.`;\n }\n docParts.push(bodyDesc);\n\n // When the body is folded into an options-style param (not 'payload'),\n // expand individual fields so IDEs surface per-field documentation.\n if (bodyParamName !== 'payload' && bodyModel) {\n for (const bField of bodyModel.fields) {\n const fName = `${bodyParamName}.${fieldName(bField.name)}`;\n const deprecatedPrefix = bField.deprecated ? '(deprecated) ' : '';\n if (bField.description) {\n docParts.push(`@param ${fName} - ${deprecatedPrefix}${bField.description}`);\n } else if (bField.deprecated) {\n docParts.push(`@param ${fName} - (deprecated)`);\n }\n if (bField.example !== undefined) docParts.push(`@example ${JSON.stringify(bField.example)}`);\n }\n }\n } else {\n docParts.push(`@param ${bodyParamName} - The request body.`);\n }\n }\n }\n // Document options parameter for paginated operations\n const hasOptionsSummary = () => docParts.some((p) => /^@param options(\\s|$)/.test(p));\n if (plan.isPaginated) {\n docParts.push('@param options - Pagination and filter options.');\n } else if (!hasOptionsSummary() && op.queryParams.filter((q) => !hiddenParams.has(q.name)).length > 0) {\n docParts.push('@param options - Additional query options.');\n }\n // Ensure an @param options summary exists when there are @param options.xxx\n // entries (from folded path/body params) or when the overlay exposes an\n // options param that wasn't otherwise documented.\n if (validParamNames?.has('options') && !hasOptionsSummary()) {\n const hasOptionsDotEntries = docParts.some((p) => p.startsWith('@param options.'));\n if (hasOptionsDotEntries || overlayMethod) {\n docParts.push('@param options - The request options.');\n }\n }\n // Reorder: ensure @param options summary comes before any @param options.xxx entries\n {\n const summaryIdx = docParts.findIndex((p) => /^@param options(\\s|$)/.test(p));\n const firstDotIdx = docParts.findIndex((p) => p.startsWith('@param options.'));\n if (summaryIdx > firstDotIdx && firstDotIdx >= 0) {\n const [summary] = docParts.splice(summaryIdx, 1);\n docParts.splice(firstDotIdx, 0, summary);\n }\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 const wireType = wireInterfaceName(itemType);\n const serializeCall = serializerArg ? `options ? serialize${optionsType}(options) : undefined` : 'options';\n\n lines.push(` async ${method}(${allParams}): Promise<AutoPaginatable<${itemType}, ${optionsType}>> {`);\n lines.push(` return new AutoPaginatable(`);\n lines.push(` await fetchAndDeserialize<${wireType}, ${itemType}>(`);\n lines.push(` this.workos,`);\n lines.push(` ${pathStr},`);\n lines.push(` deserialize${itemType},`);\n lines.push(` ${serializeCall},`);\n lines.push(` ),`);\n lines.push(` (params) =>`);\n lines.push(` fetchAndDeserialize<${wireType}, ${itemType}>(`);\n lines.push(` this.workos,`);\n lines.push(` ${pathStr},`);\n lines.push(` deserialize${itemType},`);\n lines.push(` params,`);\n lines.push(` ),`);\n lines.push(` options,`);\n lines.push(` );`);\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';\n\nimport { fileName, resolveServiceDir, servicePropertyName, resolveInterfaceName, wireInterfaceName } from './naming.js';\nimport {\n docComment,\n createServiceDirResolver,\n isServiceCoveredByExisting,\n isListMetadataModel,\n isListWrapperModel,\n computeNonEventReachable,\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 — use the same non-event reachability as model\n // generation so every barrel entry has a corresponding generated file.\n const barrelReachable = computeNonEventReachable(spec.services, spec.models);\n for (const model of spec.models) {\n if (isListMetadataModel(model) || isListWrapperModel(model)) continue;\n if (!barrelReachable.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 // Preserve existing barrel entries: read the current barrel from the\n // target directory and keep every `export * from './<stem>'` whose\n // corresponding file still exists on disk. This prevents dropping\n // hand-written types (e.g., Factor in multi-factor-auth) when a\n // generated model in the same file causes a symbol collision.\n if (ctx.targetDir) {\n const interfacesDir = path.join(ctx.targetDir, 'src', dirName, 'interfaces');\n try {\n const barrelPath = path.join(interfacesDir, 'index.ts');\n const barrelContent = fs.readFileSync(barrelPath, 'utf-8');\n for (const line of barrelContent.split('\\n')) {\n const match = line.match(/^export \\* from '\\.\\/(.*?)';?$/);\n if (!match) continue;\n const stem = match[1];\n const exportLine = `export * from './${stem}';`;\n if (exportSet.has(exportLine)) continue;\n // Verify the referenced file still exists\n const filePath = path.join(interfacesDir, `${stem}.ts`);\n try {\n fs.accessSync(filePath);\n exportSet.add(exportLine);\n } catch {\n // File no longer exists — don't preserve stale entry\n }\n }\n } catch {\n // No existing barrel — nothing to preserve\n }\n\n // Also scan for NEW interface files not in the existing barrel or\n // apiSurface (e.g., list wrappers, hand-written types added after\n // the last generation).\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 = computeNonEventReachable(spec.services, spec.models);\n const unassignedModels = spec.models.filter((m) => !modelToService.has(m.name) && reachable.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 modelHasNewFields,\n computeNonEventReachable,\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', skipIfExists: true });\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 // When integrating into an existing SDK, only generate tests for services\n // that have a registered property on the WorkOS class. The WorkOS client\n // file uses skipIfExists, so new service properties aren't added — tests\n // referencing workos.<service> would fail at compile time.\n const baselineWorkOSProps = new Set<string>();\n if (ctx.apiSurface?.classes?.['WorkOS']?.methods) {\n // The extractor stores property accessors as methods\n for (const name of Object.keys(ctx.apiSurface.classes['WorkOS'].methods)) {\n baselineWorkOSProps.add(name);\n }\n }\n if (ctx.apiSurface?.classes?.['WorkOS']?.properties) {\n for (const name of Object.keys(ctx.apiSurface.classes['WorkOS'].properties)) {\n baselineWorkOSProps.add(name);\n }\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 ops = uncoveredOperations(mergedService, ctx);\n if (ops.length === 0) continue;\n\n // Skip tests for services without a WorkOS property in the baseline\n const propName = mountAccessors.get(mountName) ?? servicePropertyName(mountName);\n if (ctx.apiSurface && baselineWorkOSProps.size > 0 && !baselineWorkOSProps.has(propName)) continue;\n\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)}.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)}.json`\n : `../${respDir}/fixtures/${fileName(plan.responseModelName)}.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'), overwriteExisting: 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 // Skip models unchanged from baseline (no new fields) since their serializers are not regenerated.\n // Skip models unreachable from non-event services (no model/serializer files generated).\n const nonEventReachable = computeNonEventReachable(spec.services, spec.models);\n const eligibleModels = spec.models.filter(\n (m) =>\n nonEventReachable.has(m.name) &&\n modelNeedsRoundTripTest(m) &&\n !isListMetadataModel(m) &&\n !isListWrapperModel(m) &&\n modelHasNewFields(m, ctx),\n );\n\n if (eligibleModels.length === 0) return files;\n\n // Use the skipped-serialize set computed by the serializer generator.\n // It's stashed on the context during generateSerializers.\n const serializeSkipped: Set<string> = (ctx as any)._skippedSerializeModels ?? new Set<string>();\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)}.json`;\n\n if (serializeSkipped.has(model.name)) {\n serializerImports.push(\n `import { deserialize${domainName} } from '${relativeImport(testPath, serializerPath)}';`,\n );\n } else {\n serializerImports.push(\n `import { deserialize${domainName}, serialize${domainName} } from '${relativeImport(testPath, serializerPath)}';`,\n );\n }\n const wireName = wireInterfaceName(domainName);\n interfaceImports.push(`import type { ${wireName} } from '${relativeImport(testPath, interfacePath)}';`);\n const camelName = toCamelCase(domainName);\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 fixtureName = `${toCamelCase(domainName)}Fixture`;\n const wireName = wireInterfaceName(domainName);\n\n if (serializeSkipped.has(model.name)) {\n // Deserialize-only test (no serialize function available)\n lines.push(`describe('${domainName}Serializer', () => {`);\n lines.push(\" it('deserializes correctly', () => {\");\n lines.push(` const fixture = ${fixtureName} as ${wireName};`);\n lines.push(` const deserialized = deserialize${domainName}(fixture);`);\n lines.push(' expect(deserialized).toBeDefined();');\n lines.push(' });');\n lines.push('});');\n } else {\n // Round-trip test\n lines.push(`describe('${domainName}Serializer', () => {`);\n lines.push(\" it('round-trips through serialize/deserialize', () => {\");\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 }\n lines.push('');\n }\n\n files.push({\n path: testPath,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n","import type { ApiSpec, EmitterContext, OperationsMap } from '@workos/oagen';\nimport { resolveMethodName, servicePropertyName } from './naming.js';\nimport { resolveResourceClassName } from './resources.js';\nimport { buildResolvedLookup, lookupResolved } from '../shared/resolved-ops.js';\n\nexport function buildOperationsMap(spec: ApiSpec, ctx: EmitterContext): OperationsMap {\n const manifest: OperationsMap = {};\n const resolvedLookup = buildResolvedLookup(ctx);\n\n for (const service of spec.services) {\n const serviceProp = 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\n // Use per-operation mountOn when it differs from the service default\n const resolved = lookupResolved(op, resolvedLookup);\n const propName = resolved ? servicePropertyName(resolved.mountOn) : serviceProp;\n\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return manifest;\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 { buildOperationsMap } 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 buildOperationsMap(spec: ApiSpec, ctx: EmitterContext) {\n return buildOperationsMap(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'\n ? `Literal[\"${r.value}\"]`\n : r.value === null\n ? 'None'\n : `Literal[${toPythonLiteral(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'\n ? `Literal[\"${r.value}\"]`\n : r.value === null\n ? 'None'\n : `Literal[${toPythonLiteral(r.value)}]`,\n map: (ref, value) => {\n void ref;\n return `Dict[str, ${value}]`;\n },\n });\n}\n\n/** Convert a JS value to a Python literal string (capitalizes booleans). */\nfunction toPythonLiteral(value: unknown): string {\n if (typeof value === 'boolean') return value ? 'True' : 'False';\n return String(value);\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 // Skip when alias and canonical produce the same file name (self-import)\n if (fileName(enumDef.name) === fileName(canonicalName)) continue;\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) =>\n typeof v.value === 'string'\n ? `\"${v.value}\"`\n : typeof v.value === 'boolean'\n ? v.value\n ? 'True'\n : 'False'\n : String(v.value),\n );\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 =\n typeof v.value === 'string'\n ? `\"${v.value}\"`\n : typeof v.value === 'boolean'\n ? v.value\n ? 'True'\n : 'False'\n : 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) =>\n typeof v.value === 'string'\n ? `\"${v.value}\"`\n : typeof v.value === 'boolean'\n ? v.value\n ? 'True'\n : 'False'\n : String(v.value),\n )\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 // Overrides fileName() for symbols that live in a differently-named file.\n // Used for variant type aliases (e.g. EventSchemaVariant → event_schema).\n const symbolToFile = 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 // Track emitted file paths to prevent duplicates when synthetic models from\n // oneOf enrichment collide with existing IR models in snake_case.\n const emittedFilePaths = new Set<string>();\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 // Skip models whose file path was already emitted (name collision after snake_case)\n const modelFilePath = `src/${ctx.namespace}/${dirName}/models/${fileName(model.name)}.py`;\n if (emittedFilePaths.has(modelFilePath)) continue;\n emittedFilePaths.add(modelFilePath);\n\n // If this model is a discriminated union dispatcher, generate a factory class\n // instead of a regular dataclass (e.g. EventSchema where each variant has\n // event: const: \"...\"). The dispatcher owns a Union type alias and a from_dict\n // method that routes to the correct concrete variant at runtime.\n if ((model as any).discriminator) {\n const disc = (model as any).discriminator as { property: string; mapping: Record<string, string> };\n const variantNames = Object.values(disc.mapping); // model names, e.g. [\"ActionAuthenticationDenied\", ...]\n const variantTypeName = `${modelClassName}Variant`; // e.g. \"EventSchemaVariant\"\n\n const dispLines: string[] = [];\n dispLines.push('from __future__ import annotations');\n dispLines.push('');\n dispLines.push('from dataclasses import dataclass');\n dispLines.push('from typing import Any, ClassVar, Dict, Union, cast');\n dispLines.push(`from ${ctx.namespace}._types import _raise_deserialize_error`);\n dispLines.push('');\n\n // Import each variant model from its resolved location\n const sortedVariants = [...new Set(variantNames)].sort();\n for (const variantModelName of sortedVariants) {\n const variantService = modelToService.get(variantModelName);\n const variantDir = resolveDir(variantService);\n if (variantDir === dirName) {\n dispLines.push(`from .${fileName(variantModelName)} import ${className(variantModelName)}`);\n } else {\n dispLines.push(\n `from ${ctx.namespace}.${dirToModule(variantDir)}.models.${fileName(variantModelName)} import ${className(variantModelName)}`,\n );\n }\n }\n\n // Unknown variant for forward-compatible unknown discriminator values\n const unknownClassName = `${modelClassName}Unknown`;\n dispLines.push('');\n dispLines.push('');\n dispLines.push('@dataclass(slots=True)');\n dispLines.push(`class ${unknownClassName}:`);\n dispLines.push(` \"\"\"Unknown variant of ${modelClassName} not yet recognized by this SDK version.\"\"\"`);\n dispLines.push('');\n dispLines.push(' raw_data: Dict[str, Any]');\n dispLines.push(' \"\"\"The raw payload, preserved so callers can still inspect the data.\"\"\"');\n dispLines.push('');\n dispLines.push(' @classmethod');\n dispLines.push(` def from_dict(cls, data: Dict[str, Any]) -> \"${unknownClassName}\":`);\n dispLines.push(' \"\"\"Wrap raw data in an unknown variant.\"\"\"');\n dispLines.push(' return cls(raw_data=data)');\n dispLines.push('');\n dispLines.push(' def to_dict(self) -> Dict[str, Any]:');\n dispLines.push(' \"\"\"Return the original raw data.\"\"\"');\n dispLines.push(' return dict(self.raw_data)');\n\n dispLines.push('');\n dispLines.push('');\n\n // Union type alias — includes unknown variant for forward compatibility\n dispLines.push(`${variantTypeName} = Union[`);\n for (const variantModelName of sortedVariants) {\n dispLines.push(` ${className(variantModelName)},`);\n }\n dispLines.push(` ${unknownClassName},`);\n dispLines.push(']');\n\n dispLines.push('');\n dispLines.push('');\n\n // Dispatcher class\n if (model.description) {\n dispLines.push(`class ${modelClassName}:`);\n dispLines.push(` \"\"\"${model.description}\"\"\"`);\n } else {\n dispLines.push(`class ${modelClassName}:`);\n dispLines.push(` \"\"\"Discriminated union dispatcher (discriminated by '${disc.property}').\"\"\"`);\n }\n dispLines.push('');\n dispLines.push(` _DISPATCH: ClassVar[Dict[str, type]] = {`);\n for (const [value, variantModelName] of Object.entries(disc.mapping).sort(([a], [b]) => a.localeCompare(b))) {\n dispLines.push(` \"${value}\": ${className(variantModelName)},`);\n }\n dispLines.push(' }');\n dispLines.push('');\n dispLines.push(' @classmethod');\n dispLines.push(` def from_dict(cls, data: Dict[str, Any]) -> \"${variantTypeName}\":`);\n dispLines.push(' \"\"\"Deserialize from a dictionary, dispatching to the correct variant.\"\"\"');\n dispLines.push(` if \"${disc.property}\" not in data:`);\n dispLines.push(\n ` _raise_deserialize_error(\"${modelClassName}\", ValueError(\"Missing required field '${disc.property}'\"))`,\n );\n dispLines.push(` disc_value = data[\"${disc.property}\"]`);\n dispLines.push(' if disc_value is None:');\n dispLines.push(\n ` _raise_deserialize_error(\"${modelClassName}\", ValueError(\"${disc.property} must not be None\"))`,\n );\n dispLines.push(' dispatch_cls = cls._DISPATCH.get(disc_value)');\n dispLines.push(' if dispatch_cls is not None:');\n dispLines.push(` return cast(\"${variantTypeName}\", dispatch_cls.from_dict(data))`);\n dispLines.push(` return ${unknownClassName}.from_dict(data)`);\n\n files.push({\n path: `src/${ctx.namespace}/${dirName}/models/${fileName(model.name)}.py`,\n content: dispLines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n\n if (!emittedModelSymbolsByDir.has(dirName)) emittedModelSymbolsByDir.set(dirName, []);\n emittedModelSymbolsByDir.get(dirName)!.push(model.name);\n // Also register the variant type alias and unknown variant in the barrel,\n // pointing to the same file as the dispatcher.\n emittedModelSymbolsByDir.get(dirName)!.push(variantTypeName);\n symbolToFile.set(variantTypeName, fileName(model.name));\n emittedModelSymbolsByDir.get(dirName)!.push(unknownClassName);\n symbolToFile.set(unknownClassName, fileName(model.name));\n continue;\n }\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 // Skip when alias and canonical produce the same file name (self-import).\n // This happens when synthetic models from oneOf enrichment collide with\n // existing IR models in snake_case (e.g., Foo_bar vs FooBar).\n if (fileName(model.name) === fileName(canonicalName)) {\n continue;\n }\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 let accessor: string;\n if (field.type.kind === 'literal' && isRequired) {\n // Required literal fields have a statically known value; use .get() with a default\n // so deserialization is resilient when the API omits the key.\n accessor = `data.get(\"${wireKey}\", ${pythonLiteralDefault(field.type.value)})`;\n } else {\n accessor = isRequired ? `data[\"${wireKey}\"]` : `data.get(\"${wireKey}\")`;\n }\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 const fileNameForSymbol = symbolToFile.get(name) ?? fileName(name);\n importLines.push(`from .${fileNameForSymbol} 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 when both models produce the same file name — the TypeAlias\n // file would import from itself (e.g., FooBar aliased to Foo_bar).\n if (fileName(canonical) === fileName(alias)) return false;\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\n/** Convert a LiteralType value to a Python default expression for use in data.get(). */\nfunction pythonLiteralDefault(value: string | number | boolean | null): string {\n if (value === null) return 'None';\n if (typeof value === 'boolean') return value ? 'True' : 'False';\n if (typeof value === 'string') return `\"${value}\"`;\n return String(value);\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 Model,\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 collectGroupedParamNames,\n collectBodyFieldTypes,\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// ─── Parameter group support ─────────────────────────────────────────\n\n/**\n * PascalCase variant class name for a parameter group variant.\n * E.g., group \"parent_resource\", variant \"by_id\" -> \"ParentResourceById\".\n */\nfunction groupVariantClassName(groupName: string, variantName: string): string {\n return className(`${groupName}_${variantName}`);\n}\n\n/**\n * Generate Python dataclass definitions for all parameter group variants\n * across a set of operations. Returns lines to insert near the top of the\n * resource file (after imports, before class definitions).\n */\nfunction generateParameterGroupDataclasses(\n operations: Operation[],\n specEnumNames: Set<string>,\n models: Model[],\n): string[] {\n const lines: string[] = [];\n const emitted = new Set<string>();\n\n for (const op of operations) {\n const bodyFieldTypes = collectBodyFieldTypes(op, models);\n for (const group of op.parameterGroups ?? []) {\n for (const variant of group.variants) {\n const variantClass = groupVariantClassName(group.name, variant.name);\n if (emitted.has(variantClass)) continue;\n emitted.add(variantClass);\n\n lines.push('');\n lines.push('@dataclass');\n lines.push(`class ${variantClass}:`);\n const readableGroup = group.name.replace(/_/g, ' ');\n const readableVariant = variant.name.replace(/_/g, ' ');\n lines.push(` \"\"\"Identify ${readableGroup} ${readableVariant}.\"\"\"`);\n for (const param of variant.parameters) {\n const pyField = fieldName(param.name);\n const effectiveType = bodyFieldTypes.get(param.name) ?? param.type;\n const pyType = mapTypeRefUnquoted(effectiveType, specEnumNames, true);\n lines.push(` ${pyField}: ${pyType}`);\n }\n }\n }\n }\n\n return lines;\n}\n\n/**\n * Check whether any operation has parameter groups.\n */\nfunction hasParameterGroups(operations: Operation[]): boolean {\n return operations.some((op) => (op.parameterGroups?.length ?? 0) > 0);\n}\n\n/**\n * Collect the PascalCase class names of all parameter group variants\n * across a set of operations. Used by client.ts to re-export these\n * dataclasses from the service __init__.py.\n */\nexport function collectParameterGroupClassNames(operations: Operation[]): string[] {\n const names: string[] = [];\n const seen = new Set<string>();\n for (const op of operations) {\n for (const group of op.parameterGroups ?? []) {\n for (const variant of group.variants) {\n const cls = groupVariantClassName(group.name, variant.name);\n if (!seen.has(cls)) {\n seen.add(cls);\n names.push(cls);\n }\n }\n }\n }\n return names;\n}\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 const groupedBodyParamNames = collectGroupedParamNames(op);\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(\n (f) => f.required && !hiddenParams.has(f.name) && !groupedBodyParamNames.has(f.name),\n );\n const optFields = bodyModel.fields.filter(\n (f) => !f.required && !hiddenParams.has(f.name) && !groupedBodyParamNames.has(f.name),\n );\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 const groupedParamNames = collectGroupedParamNames(op);\n if (plan.hasQueryParams && !isPaginated) {\n for (const param of op.queryParams) {\n if (hiddenParams.has(param.name)) continue;\n if (groupedParamNames.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}] = \"desc\",`);\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 if (groupedParamNames.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 // Parameter group union kwargs\n for (const group of op.parameterGroups ?? []) {\n const variantClasses = group.variants.map((v) => groupVariantClassName(group.name, v.name));\n const unionType = `Union[${variantClasses.join(', ')}]`;\n const paramName = fieldName(group.name);\n if (group.optional) {\n lines.push(` ${paramName}: Optional[${unionType}] = None,`);\n } else {\n lines.push(` ${paramName}: ${unionType},`);\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 const resolvedItemModel = ctx.spec.models.find((m) => m.name === resolvedItem);\n const itemTypeName = (resolvedItemModel as any)?.discriminator\n ? className(resolvedItem) + 'Variant'\n : className(resolvedItem);\n returnType = `${pageType}[${itemTypeName}]`;\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 const groupedDocBodyParams = collectGroupedParamNames(op);\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 if (groupedDocBodyParams.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 const groupedDocParams = collectGroupedParamNames(op);\n if (plan.hasQueryParams && !isPaginated) {\n for (const param of op.queryParams) {\n if (hiddenParams.has(param.name)) continue;\n if (groupedDocParams.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 if (groupedDocParams.has(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 parameter group docs\n for (const group of op.parameterGroups ?? []) {\n const variantClasses = group.variants.map((v) => groupVariantClassName(group.name, v.name));\n const readableGroup = group.name.replace(/_/g, ' ');\n const desc = `Identifies the ${readableGroup}. One of: ${variantClasses.join(', ')}.`;\n allParams.push({ name: fieldName(group.name), desc });\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 resolvedItemModel = ctx.spec.models.find((m) => m.name === resolvedItemName);\n const isDiscriminatorModel = !!(resolvedItemModel as any)?.discriminator;\n const variantTypeName = isDiscriminatorModel ? itemTypeClass + 'Variant' : null;\n const pageType = isAsync ? 'AsyncPage' : 'SyncPage';\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 const paginatedGroupedParams = collectGroupedParamNames(op);\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 if (paginatedGroupedParams.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 // isinstance dispatch for parameter groups\n emitGroupDispatch(lines, op);\n if (isDiscriminatorModel && variantTypeName) {\n // Dispatcher model: cast the page to the variant union type so callers get\n // rich type information when iterating events.\n lines.push(` return cast(`);\n lines.push(` ${pageType}[${variantTypeName}],`);\n lines.push(` ${awaitPrefix}self._client.request_page(`);\n lines.push(` method=\"${httpMethod}\",`);\n lines.push(` path=${pathStr},`);\n lines.push(\n ` model=${itemTypeClass}, # type: ignore[arg-type] # dispatcher; pagination only calls from_dict`,\n );\n lines.push(' params=params,');\n lines.push(' request_options=request_options,');\n lines.push(' )');\n lines.push(' )');\n } else {\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 }\n } else if (plan.isDelete) {\n // Build body dict if the DELETE has a request body\n const deleteGroupedParams = collectGroupedParamNames(op);\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(\n (f) => !hiddenParams.has(f.name) && !deleteGroupedParams.has(f.name),\n );\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 // isinstance dispatch for parameter groups into body\n emitGroupDispatch(lines, op, 'body', collectBodyFieldTypes(op, ctx.spec.models));\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 bodyGroupedParams = collectGroupedParamNames(op);\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) && !bodyGroupedParams.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 // isinstance dispatch for parameter groups into body\n emitGroupDispatch(lines, op, 'body', collectBodyFieldTypes(op, ctx.spec.models));\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 getGroupedParams = collectGroupedParamNames(op);\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const visibleQueryParams = op.queryParams.filter((p) => !hiddenParams.has(p.name) && !getGroupedParams.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 const needsParamsDict = hasVisibleQueryParams || hasInjections || hasGroups;\n if (needsParamsDict) {\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 or groups — 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 // isinstance dispatch for parameter groups\n emitGroupDispatch(lines, op);\n }\n const emittedParams = needsParamsDict;\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/**\n * Emit isinstance dispatch blocks for all parameter groups on an operation.\n * Each group produces a chain of if/elif branches that test the group kwarg\n * against each variant dataclass and serializes the variant's parameters\n * into the target dict using their wire names.\n *\n * @param target - The Python dict variable to write into (e.g., \"params\" or \"body\").\n */\nfunction emitGroupDispatch(\n lines: string[],\n op: Operation,\n target = 'params',\n bodyFieldTypes?: Map<string, TypeRef>,\n): void {\n for (const group of op.parameterGroups ?? []) {\n const groupParam = fieldName(group.name);\n if (group.optional) {\n lines.push(` if ${groupParam} is not None:`);\n }\n const indent = group.optional ? ' ' : '';\n let first = true;\n for (const variant of group.variants) {\n const variantClass = groupVariantClassName(group.name, variant.name);\n const keyword = first ? 'if' : 'elif';\n first = false;\n lines.push(` ${indent}${keyword} isinstance(${groupParam}, ${variantClass}):`);\n for (const param of variant.parameters) {\n const pyField = fieldName(param.name);\n const resolvedType = bodyFieldTypes?.get(param.name) ?? param.type;\n const effectiveType = resolvedType.kind === 'nullable' ? resolvedType.inner : resolvedType;\n const isEnum = effectiveType.kind === 'enum';\n const value = isEnum ? `enum_value(${groupParam}.${pyField})` : `${groupParam}.${pyField}`;\n lines.push(` ${indent}${target}[\"${param.name}\"] = ${value}`);\n }\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 const importGroupedParams = collectGroupedParamNames(op);\n for (const f of bodyModel.fields) {\n if (importGroupedParams.has(f.name)) continue;\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 // For discriminator (dispatcher) models also import the variant union type alias\n const paginationItemModel = ctx.spec.models.find((m) => m.name === paginationItemName);\n if ((paginationItemModel as any)?.discriminator) {\n modelImports.add(paginationItemName + 'Variant');\n }\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 // Discriminator variant type aliases (e.g. EventSchemaVariant) live in the same\n // service as their dispatcher model, so ensure they resolve to the same directory.\n for (const model of ctx.spec.models) {\n if ((model as any).discriminator) {\n const svc = modelToServiceMap.get(model.name);\n if (svc) modelToServiceMap.set(model.name + 'Variant', svc);\n }\n }\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 // dataclass import + group variant definitions\n const hasGroups = hasParameterGroups(allOperations);\n if (hasGroups) {\n lines.push('from dataclasses import dataclass');\n const dataclassLines = generateParameterGroupDataclasses(allOperations, specEnumNames, ctx.spec.models);\n lines.push(...dataclassLines);\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 * When true, the generated Client struct includes a cached field for this\n * service and a public accessor method — identical to spec-driven services.\n * The hand-written file must export the service type (e.g. PasswordlessService)\n * but should NOT define its own Client accessor (the generated code handles that).\n *\n * Defaults to false — most non-spec modules are standalone helpers, not\n * Client-mounted services.\n */\n hasClientAccessor?: boolean;\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 hasClientAccessor: true,\n },\n {\n id: 'vault',\n description: 'Vault KV storage, key operations, and client-side AES-GCM encrypt/decrypt.',\n hasClientAccessor: true,\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, collectParameterGroupClassNames } from './resources.js';\nimport { getMountTarget, groupByMount } 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 — emitted as plain imports (not wrapped in\n // ignore markers). The overwriteWithPreservedRegions() machinery in oagen\n // relocates top-level ignore blocks to EOF because they have no containing\n // class, stripping the markers from the imports while spliceExtraImports()\n // preserves the bare import lines. Emitting them directly avoids the\n // displacement entirely; spliceExtraImports() will preserve any additional\n // hand-added imports from the existing file on subsequent regenerations.\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('');\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 // Build a map from mount target -> operations so we can discover parameter\n // group dataclasses that need re-exporting from __init__.py.\n const mountGroups = groupByMount(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 // Collect parameter group class names from all operations in this mount group\n const mountTarget = getMountTarget(service, ctx);\n const ops = mountGroups.get(mountTarget)?.operations ?? service.operations;\n const groupClassNames = collectParameterGroupClassNames(ops);\n\n const resourceImports = [resolvedName, `Async${resolvedName}`, ...groupClassNames];\n lines.push(`from ._resource import ${resourceImports.join(', ')}`);\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 {\n className,\n fileName,\n fieldName,\n moduleName,\n resolveMethodName,\n buildMountDirMap,\n dirToModule,\n} 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 {\n groupByMount,\n buildResolvedLookup,\n lookupResolved,\n buildHiddenParams,\n collectGroupedParamNames,\n} from '../shared/resolved-ops.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\nimport { pythonLiteral } from './wrappers.js';\n\n/**\n * Resolve the Python class name to use for isinstance checks on paginated items.\n * For discriminated unions, generates the fixture and determines which variant\n * the discriminator value maps to. For regular models, returns the model class.\n */\nfunction resolvePaginatedItemClass(itemName: string | null, spec: ApiSpec): string | null {\n if (!itemName) return null;\n const itemModel = spec.models.find((m) => m.name === itemName);\n if (!itemModel) return className(itemName);\n\n const disc = (itemModel as any).discriminator as { property: string; mapping: Record<string, string> } | undefined;\n if (!disc) return className(itemName);\n\n // Generate the fixture to determine which discriminator value appears\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 fixture = generateModelFixture(itemModel, modelMap, enumMap);\n const discValue = fixture[disc.property];\n\n if (typeof discValue === 'string' && disc.mapping[discValue]) {\n return className(disc.mapping[discValue]);\n }\n\n // Fallback: first variant alphabetically\n const sortedEntries = Object.entries(disc.mapping).sort(([a], [b]) => a.localeCompare(b));\n if (sortedEntries.length > 0) return className(sortedEntries[0][1]);\n\n return className(itemName);\n}\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\nfunction buildDeleteSuccessResponseSetup(op: Operation): string {\n const statusCode = op.successResponses?.[0]?.statusCode ?? 204;\n if (statusCode === 204) {\n return 'httpx_mock.add_response(status_code=204)';\n }\n return `httpx_mock.add_response(status_code=${statusCode}, content=b\"\\\\n\")`;\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 // Unwrap list wrapper to find the inner item model (may be a discriminated union)\n let paginationItemName = op.pagination.itemType.name;\n const wrapperModel = spec.models.find((m) => m.name === paginationItemName);\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 paginationItemName = dataField.type.items.name;\n modelImports.add(paginationItemName);\n }\n }\n // For discriminated union pagination items, import the variant that the fixture resolves to\n const resolvedVariantClass = resolvePaginatedItemClass(paginationItemName, spec);\n if (resolvedVariantClass && resolvedVariantClass !== className(paginationItemName)) {\n // Find the model name from the class name — reverse-lookup through the discriminator mapping\n const paginationModel = spec.models.find((m) => m.name === paginationItemName);\n const disc =\n paginationModel &&\n ((paginationModel as any).discriminator as { property: string; mapping: Record<string, string> } | undefined);\n if (disc) {\n for (const variantName of Object.values(disc.mapping)) {\n if (className(variantName) === resolvedVariantClass) {\n modelImports.add(variantName);\n break;\n }\n }\n }\n }\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 const testGroupedParams = collectGroupedParamNames(op);\n for (const f of bodyModel.fields) {\n if (testGroupedParams.has(f.name)) continue;\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 // Import parameter group variant classes\n const groupVariantImports = new Set<string>();\n for (const op of service.operations) {\n for (const group of op.parameterGroups ?? []) {\n for (const variant of group.variants) {\n groupVariantImports.add(className(`${group.name}_${variant.name}`));\n }\n }\n }\n if (groupVariantImports.size > 0) {\n const mountDir = dirToModule(buildMountDirMap(ctx).get(service.name) ?? moduleName(service.name));\n lines.push(`from ${ctx.namespace}.${mountDir}._resource import ${[...groupVariantImports].join(', ')}`);\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 // Save the unwrapped name before nulling — needed for discriminator check below\n const unwrappedItemName = itemName;\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 // Determine the class name to use for isinstance checks on paginated items.\n // If the item model is a discriminated union (has a discriminator), the fixture\n // will deserialize to a concrete variant, so assert on that variant class.\n const paginatedItemClass = resolvePaginatedItemClass(itemName, spec);\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 len(page.data) == 1');\n lines.push(` assert isinstance(page.data[0], ${paginatedItemClass})`);\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\n lines.push(' assert isinstance(page, SyncPage)');\n lines.push(' assert page.data == []');\n } else {\n // Check if the unwrapped item is a discriminated union — test dispatch through pagination\n const discModel = unwrappedItemName ? spec.models.find((m) => m.name === unwrappedItemName) : null;\n const disc =\n discModel && (discModel as any).discriminator\n ? ((discModel as any).discriminator as { property: string; mapping: Record<string, string> })\n : null;\n const discEntries = disc ? Object.entries(disc.mapping).sort(([a], [b]) => a.localeCompare(b)) : [];\n if (disc && discEntries.length > 0) {\n const [, firstVariantName] = discEntries[0];\n const variantFixture = `${fileName(firstVariantName)}.json`;\n const variantClass = className(firstVariantName);\n lines.push(' httpx_mock.add_response(');\n lines.push(` json={\"data\": [load_fixture(\"${variantFixture}\")], \"list_metadata\": {}},`);\n lines.push(' )');\n lines.push(` page = workos.${propName}.${method}(${paginatedArgs})`);\n lines.push(' assert isinstance(page, SyncPage)');\n lines.push(' assert len(page.data) == 1');\n lines.push(` assert isinstance(page.data[0], ${variantClass})`);\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 }\n } else if (isDelete) {\n lines.push(` def test_${method}(self, workos, httpx_mock):`);\n lines.push(` ${buildDeleteSuccessResponseSetup(op)}`);\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 // Save the unwrapped name before nulling — needed for discriminator check below\n const unwrappedItemName = itemName;\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 asyncPaginatedItemClass = resolvePaginatedItemClass(itemName, spec);\n\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 len(page.data) == 1');\n lines.push(` assert isinstance(page.data[0], ${asyncPaginatedItemClass})`);\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 // Check if the unwrapped item is a discriminated union — test dispatch through pagination\n const discModel = unwrappedItemName ? spec.models.find((m) => m.name === unwrappedItemName) : null;\n const disc =\n discModel && (discModel as any).discriminator\n ? ((discModel as any).discriminator as { property: string; mapping: Record<string, string> })\n : null;\n const discEntries = disc ? Object.entries(disc.mapping).sort(([a], [b]) => a.localeCompare(b)) : [];\n if (disc && discEntries.length > 0) {\n const [, firstVariantName] = discEntries[0];\n const variantFixture = `${fileName(firstVariantName)}.json`;\n const variantClass = className(firstVariantName);\n lines.push(' httpx_mock.add_response(');\n lines.push(` json={\"data\": [load_fixture(\"${variantFixture}\")], \"list_metadata\": {}},`);\n lines.push(' )');\n lines.push(` page = await async_workos.${propName}.${method}(${asyncArgs})`);\n lines.push(' assert isinstance(page, AsyncPage)');\n lines.push(' assert len(page.data) == 1');\n lines.push(` assert isinstance(page.data[0], ${variantClass})`);\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 }\n } else if (isDelete) {\n const deletePath = buildExpectedPath(op);\n pushAsyncTestDef(lines, ` async def test_${method}(self, async_workos, httpx_mock):`);\n lines.push(` ${buildDeleteSuccessResponseSetup(op)}`);\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 // Parameter group args — emit first variant constructor\n const groupedParamNames = collectGroupedParamNames(op);\n for (const group of op.parameterGroups ?? []) {\n const variant = group.variants[0];\n const variantClass = className(`${group.name}_${variant.name}`);\n const variantArgs = variant.parameters.map((p) => `${fieldName(p.name)}=\"test_value\"`).join(', ');\n args.push(`${fieldName(group.name)}=${variantClass}(${variantArgs})`);\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 params that belong to parameter groups\n if (groupedParamNames.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 const groupedParamNames = collectGroupedParamNames(op);\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 const bodyArgGrouped = collectGroupedParamNames(op);\n for (const field of bodyModel?.fields.filter((f) => f.required && !bodyArgGrouped.has(f.name)) ?? []) {\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 // Parameter group args — emit first variant constructor\n for (const group of op.parameterGroups ?? []) {\n const variant = group.variants[0];\n const variantClass = className(`${group.name}_${variant.name}`);\n const variantArgs = variant.parameters\n .map((p) => `${fieldName(p.name)}=${generateQueryEncodingValue(p.type, p.name)}`)\n .join(', ');\n args.push(`${fieldName(group.name)}=${variantClass}(${variantArgs})`);\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 if (groupedParamNames.has(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 [buildDeleteSuccessResponseSetup(op)];\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 const groupedParamNames = collectGroupedParamNames(op);\n\n // Assert first variant's params from parameter groups\n for (const group of op.parameterGroups ?? []) {\n const variant = group.variants[0];\n for (const param of variant.parameters) {\n assertions.push(\n `assert request.url.params[\"${param.name}\"] == ${toPythonLiteral(expectedQueryEncodingValue(param.type, param.name))}`,\n );\n }\n }\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 if (groupedParamNames.has(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 // Add discriminator Unknown variant classes to imports for dispatch tests\n for (const model of models) {\n if (!(model as any).discriminator) continue;\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)}Unknown`);\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 or discriminated union dispatchers — these\n // don't have a to_dict() and their round-trip semantics differ.\n if (model.fields.length === 0) continue;\n if ((model as any).discriminator) 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 // Discriminator dispatch tests — targeted coverage for from_dict routing\n const discriminatorModels = models.filter((m) => (m as any).discriminator);\n if (discriminatorModels.length > 0) {\n lines.push('');\n lines.push('');\n lines.push('class TestDiscriminatorDispatch:');\n\n for (const model of discriminatorModels) {\n const disc = (model as any).discriminator as { property: string; mapping: Record<string, string> };\n const modelClass = className(model.name);\n const unknownClass = `${modelClass}Unknown`;\n\n // Pick the first variant (alphabetically by discriminator value) for tests\n const sortedEntries = Object.entries(disc.mapping).sort(([a], [b]) => a.localeCompare(b));\n if (sortedEntries.length === 0) continue;\n const [, firstVariantName] = sortedEntries[0];\n const firstVariantClass = className(firstVariantName);\n const firstVariantFixture = `${fileName(firstVariantName)}.json`;\n\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_dispatches_known_variant(self):`);\n lines.push(` data = load_fixture(\"${firstVariantFixture}\")`);\n lines.push(` result = ${modelClass}.from_dict(data)`);\n lines.push(` assert isinstance(result, ${firstVariantClass})`);\n\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_returns_unknown_for_unrecognized_type(self):`);\n lines.push(` data = load_fixture(\"${firstVariantFixture}\")`);\n lines.push(` data = {**data, \"${disc.property}\": \"future.unrecognized.type\"}`);\n lines.push(` result = ${modelClass}.from_dict(data)`);\n lines.push(` assert isinstance(result, ${unknownClass})`);\n lines.push(' assert result.raw_data == data');\n\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_raises_on_missing_discriminator(self):`);\n lines.push(` data = load_fixture(\"${firstVariantFixture}\")`);\n lines.push(` data = {k: v for k, v in data.items() if k != \"${disc.property}\"}`);\n lines.push(' with pytest.raises(Exception):');\n lines.push(` ${modelClass}.from_dict(data)`);\n\n lines.push('');\n lines.push(` def test_${fileName(model.name)}_raises_on_none_discriminator(self):`);\n lines.push(` data = load_fixture(\"${firstVariantFixture}\")`);\n lines.push(` data = {**data, \"${disc.property}\": None}`);\n lines.push(' with pytest.raises(Exception):');\n lines.push(` ${modelClass}.from_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, OperationsMap } from '@workos/oagen';\nimport { resolveMethodName } from './naming.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { buildResolvedLookup, lookupResolved, getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Build operation-to-SDK-method mapping for the manifest.\n */\nexport function buildOperationsMap(spec: ApiSpec, ctx: EmitterContext): OperationsMap {\n const manifest: OperationsMap = {};\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n const resolvedLookup = buildResolvedLookup(ctx);\n\n for (const service of spec.services) {\n // For mounted services, look up the mount target's access path\n let serviceProp = accessPaths.get(service.name);\n if (!serviceProp) {\n const mountTarget = getMountTarget(service, ctx);\n serviceProp = accessPaths.get(mountTarget);\n }\n if (!serviceProp) {\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\n // Use per-operation mountOn when it differs from the service default\n const resolved = lookupResolved(op, resolvedLookup);\n const propName = (resolved && accessPaths.get(resolved.mountOn)) ?? serviceProp;\n\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return manifest;\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 { detectDiscriminators } 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 { buildOperationsMap } 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\n/**\n * Annotate models with implicit discriminator info (without full oneOf\n * field flattening which can break existing model structures/fixtures).\n */\nfunction withDiscriminators(ctx: EmitterContext): EmitterContext {\n const annotated = detectDiscriminators(ctx.spec.models);\n if (annotated === ctx.spec.models) return ctx;\n const spec: ApiSpec = { ...ctx.spec, models: annotated };\n return { ...ctx, spec };\n}\n\nexport const pythonEmitter: Emitter = {\n language: 'python',\n\n generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n const annotated = detectDiscriminators(models);\n return ensureTrailingNewlines(generateModels(annotated, 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, withDiscriminators(ctx)));\n },\n\n generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateClient(spec, withDiscriminators(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 // Use original spec for model filtering (requestOnlyModelNames etc.) but\n // annotate discriminator models so dispatch tests are generated.\n const annotated = detectDiscriminators(spec.models);\n // Only replace discriminator-annotated models, keep the rest unchanged\n // so request-only filtering and field-based logic work correctly.\n const annotatedByName = new Map(annotated.filter((m: any) => m.discriminator).map((m) => [m.name, m]));\n const testModels = spec.models.map((m) => annotatedByName.get(m.name) ?? m);\n const testSpec: ApiSpec = { ...spec, models: testModels };\n return ensureTrailingNewlines(generateTests(testSpec, { ...ctx, spec: testSpec }));\n },\n\n buildOperationsMap(spec: ApiSpec, ctx: EmitterContext) {\n return buildOperationsMap(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 return {\n cmd: 'bash',\n args: [\n '-c',\n 'PY_FILES=$(printf \"%s\\\\n\" \"$@\" | grep \"\\\\.py$\" || true); if [ -n \"$PY_FILES\" ]; then echo \"$PY_FILES\" | xargs ruff check --fix --quiet 2>/dev/null; echo \"$PY_FILES\" | xargs ruff format --quiet; fi',\n '--',\n ],\n batchSize: 1000,\n };\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) =>\n typeof r.value === 'number'\n ? Number.isInteger(r.value)\n ? 'int'\n : 'float'\n : typeof r.value === 'boolean'\n ? 'bool'\n : '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) =>\n typeof r.value === 'string'\n ? 'string'\n : typeof r.value === 'number'\n ? 'int'\n : typeof r.value === 'boolean'\n ? 'bool'\n : '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 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 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 // Literal fields have a statically known value; use ?? with a default\n // so deserialization is resilient when the API omits the key.\n if (ref.kind === 'literal') {\n return `$data['${wireName}'] ?? ${phpLiteralDefault(ref.value)}`;\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/** Convert a LiteralType value to a PHP default expression for use with ??. */\nfunction phpLiteralDefault(value: string | number | boolean | null): string {\n if (value === null) return 'null';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'string') return `'${value}'`;\n return String(value);\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","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) : 'string';\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 if (isOptional) {\n optionalParamLines.push(` ?string $${phpName} = null,`);\n } else {\n requiredParams.push(` string $${phpName},`);\n }\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, toPascalCase } 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 collectGroupedParamNames,\n collectBodyFieldTypes,\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 // Generate variant class files for operations with parameter groups\n for (const op of operations) {\n if ((op.parameterGroups?.length ?? 0) > 0) {\n files.push(...generateParameterGroupFiles(op, ctx, modelMap));\n }\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\n// ---------------------------------------------------------------------------\n// Mutually-exclusive parameter group support\n// ---------------------------------------------------------------------------\n\n/** PHP class name for a parameter group variant (e.g. ParentResourceById). */\nfunction groupVariantClassName(groupName: string, variantName: string): string {\n return `${className(groupName)}${className(variantName)}`;\n}\n\n/**\n * Derive a short PHP property name for a parameter within a variant class.\n * Strips the group name prefix when present to avoid stuttering\n * (e.g. parent_resource_id in group parent_resource -> id -> camelCase).\n */\nexport function deriveVariantFieldName(paramName: string, groupName: string): string {\n const prefix = groupName + '_';\n const stripped = paramName.startsWith(prefix) ? paramName.slice(prefix.length) : paramName;\n return fieldName(stripped);\n}\n\n/**\n * Generate PHP variant class files for all parameter groups on an operation.\n * Each variant becomes a simple PHP class with readonly constructor properties.\n */\nfunction generateParameterGroupFiles(\n op: Operation,\n ctx: EmitterContext,\n modelMap: Map<string, Model>,\n): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const bodyFieldTypes = collectBodyFieldTypes(op, [...modelMap.values()]);\n\n for (const group of op.parameterGroups ?? []) {\n for (const variant of group.variants) {\n const variantClass = groupVariantClassName(group.name, variant.name);\n const lines: string[] = [];\n\n lines.push(`namespace ${ctx.namespacePascal}\\\\Service;`);\n lines.push('');\n lines.push(`class ${variantClass}`);\n lines.push('{');\n lines.push(' public function __construct(');\n for (let i = 0; i < variant.parameters.length; i++) {\n const param = variant.parameters[i];\n const effectiveType = bodyFieldTypes.get(param.name) ?? param.type;\n const phpType = mapTypeRef(effectiveType, { qualified: true });\n const phpName = deriveVariantFieldName(param.name, group.name);\n const comma = ',';\n lines.push(` public readonly ${phpType} $${phpName}${comma}`);\n }\n lines.push(' ) {');\n lines.push(' }');\n lines.push('}');\n\n files.push({\n path: `lib/Service/${variantClass}.php`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n }\n\n return files;\n}\n\n/**\n * Generate instanceof dispatch lines to serialize a grouped parameter\n * into a target array ($query or $body) using each variant's wire names.\n */\nfunction generateGroupDispatch(op: Operation, indent: string, target: '$query' | '$body' = '$query'): string[] {\n const lines: string[] = [];\n\n for (const group of op.parameterGroups ?? []) {\n const phpParamName = fieldName(group.name);\n\n for (let vi = 0; vi < group.variants.length; vi++) {\n const variant = group.variants[vi];\n const variantClass = groupVariantClassName(group.name, variant.name);\n const keyword = vi === 0 ? 'if' : 'elseif';\n\n lines.push(`${indent}${keyword} ($${phpParamName} instanceof ${variantClass}) {`);\n\n for (const param of variant.parameters) {\n const phpField = deriveVariantFieldName(param.name, group.name);\n lines.push(`${indent} ${target}['${param.name}'] = $${phpParamName}->${phpField};`);\n }\n\n lines.push(`${indent}}`);\n }\n }\n\n return lines;\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 const groupedParamNames = collectGroupedParamNames(op);\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 if (groupedParamNames.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 parameter groups (union-typed)\n for (const group of op.parameterGroups ?? []) {\n const phpName = fieldName(group.name);\n if (seenDocParams.has(phpName)) continue;\n seenDocParams.add(phpName);\n const variantTypes = group.variants.map((v) => groupVariantClassName(group.name, v.name));\n const unionDocType = variantTypes.join('|');\n const nullPrefix = group.optional ? 'null|' : '';\n docParts.push(`@param ${nullPrefix}${unionDocType} $${phpName}`);\n }\n\n // @param for query params (skip grouped params — they appear as group union params)\n for (const q of op.queryParams) {\n if (hiddenParams.has(q.name)) continue;\n if (groupedParamNames.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 // order params with enum defaults are non-nullable (they default to Desc, not null)\n const isNonNullableOrder = q.name === 'order' && q.type.kind === 'enum';\n const nullSuffix = !q.required && !isNonNullableOrder && !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 hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const needsQuery = queryLines.length > 0 || hasDefaults || hasInferred || hasGroups;\n\n if (needsQuery) {\n const groupedParams = collectGroupedParamNames(op);\n const hasOptionalQuery = op.queryParams.some(\n (q) => !q.required && !hiddenParams.has(q.name) && !groupedParams.has(q.name),\n );\n if (hasOptionalQuery) {\n lines.push(' $query = array_filter([');\n } else if (queryLines.length > 0) {\n lines.push(' $query = [');\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 // Inject parameter group dispatch (instanceof checks)\n lines.push(...generateGroupDispatch(op, ' '));\n lines.push(` return $this->client->buildUrl(path: ${path}, query: $query, options: $options);`);\n } else {\n lines.push(` return $this->client->buildUrl(path: ${path}, query: [], options: $options);`);\n }\n } else if (plan.isPaginated) {\n const queryLines = buildQueryArray(op);\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const needsQuery = queryLines.length > 0 || hasGroups;\n if (needsQuery) {\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 } else {\n lines.push(' $query = [];');\n }\n // Inject parameter group dispatch (instanceof checks)\n lines.push(...generateGroupDispatch(op, ' '));\n }\n lines.push(' return $this->client->requestPage(');\n lines.push(` method: '${httpMethod}',`);\n lines.push(` path: ${path},`);\n if (needsQuery) {\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 deleteGroupedParams = collectGroupedParamNames(op);\n const visibleFields =\n bodyModel?.fields.filter((f) => !hiddenParams.has(f.name) && !deleteGroupedParams.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 // Inject parameter group dispatch into body\n if ((op.parameterGroups?.length ?? 0) > 0) {\n lines.push(...generateGroupDispatch(op, ' ', '$body'));\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 bodyGroupedParams = collectGroupedParamNames(op);\n const visibleFields =\n bodyModel?.fields.filter((f) => !hiddenParams.has(f.name) && !bodyGroupedParams.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 // Inject parameter group dispatch into body so sensitive fields\n // (passwords, role slugs) never leak into the URL query string.\n if ((op.parameterGroups?.length ?? 0) > 0) {\n lines.push(...generateGroupDispatch(op, ' ', '$body'));\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 hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const needsQuery = queryLines.length > 0 || hasDefaults || hasInferred || hasGroups;\n\n if (needsQuery) {\n const groupedParams = collectGroupedParamNames(op);\n const hasOptionalQuery = op.queryParams.some(\n (q) => !q.required && !hiddenParams.has(q.name) && !groupedParams.has(q.name),\n );\n if (hasOptionalQuery) {\n lines.push(' $query = array_filter([');\n } else if (queryLines.length > 0) {\n lines.push(' $query = [');\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 // Inject parameter group dispatch (instanceof checks)\n lines.push(...generateGroupDispatch(op, ' '));\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 const groupedParams = collectGroupedParamNames(op);\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 if (groupedParams.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 // Parameter group union-typed params (before individual query params)\n for (const group of op.parameterGroups ?? []) {\n const phpName = fieldName(group.name);\n if (usedNames.has(phpName)) continue;\n usedNames.add(phpName);\n // PHP 8.0+ union syntax: VariantA|VariantB $paramName\n const variantTypes = group.variants.map((v) => groupVariantClassName(group.name, v.name));\n const unionType = variantTypes.join('|');\n if (group.optional) {\n optional.push(`null|${unionType} $${phpName} = null`);\n } else {\n required.push(`${unionType} $${phpName}`);\n }\n }\n\n // Query params (skip grouped params — they are serialized via group dispatch)\n for (const q of op.queryParams) {\n if (hidden.has(q.name)) continue;\n if (groupedParams.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 if (q.name === 'order') {\n // Hardcode order default to desc for pagination consistency\n if (q.type.kind === 'enum') {\n const enumType = mapTypeRef(q.type, { qualified: true });\n const caseName = toPascalCase('desc');\n optional.push(`${enumType} $${phpName} = ${enumType}::${caseName}`);\n } else {\n const nullableType = phpType.startsWith('?') ? phpType : `?${phpType}`;\n optional.push(`${nullableType} $${phpName} = 'desc'`);\n }\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 const groupedParams = collectGroupedParamNames(op);\n return op.queryParams\n .filter((q) => !hidden.has(q.name) && !groupedParams.has(q.name))\n .map((q) => {\n const phpName = fieldName(q.name);\n if (isEnumType(q.type)) {\n // order params with enum defaults are non-nullable (default to Desc, not null)\n const isNonNullableOrder = q.name === 'order' && q.type.kind === 'enum';\n const nullsafe = q.required || isNonNullableOrder ? '' : '?';\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 collectGroupedParamNames,\n} from '../shared/resolved-ops.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\nimport { isRedirectEndpoint, deriveVariantFieldName } 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 // Parameter group args (union-typed) — emit first variant constructor\n const groupedParamNames = collectGroupedParamNames(op);\n for (const group of op.parameterGroups ?? []) {\n if (!group.optional || includeOptional) {\n const variant = group.variants[0];\n const variantClass = `${className(group.name)}${className(variant.name)}`;\n const variantArgs = variant.parameters\n .map((p) => `${deriveVariantFieldName(p.name, group.name)}: 'test_value'`)\n .join(', ');\n args.push(`${toCamelCase(group.name)}: new \\\\${ctx.namespacePascal}\\\\Service\\\\${variantClass}(${variantArgs})`);\n }\n }\n\n // Query params (skip grouped params — they're handled above)\n for (const q of op.queryParams) {\n if (hidden.has(q.name)) continue;\n if (groupedParamNames.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 const groupedParams = collectGroupedParamNames(op);\n lines.push(' parse_str($request->getUri()->getQuery(), $query);');\n // Assert first variant's params from parameter groups\n for (const group of op.parameterGroups ?? []) {\n const variant = group.variants[0];\n for (const param of variant.parameters) {\n lines.push(` $this->assertSame('test_value', $query['${param.name}']);`);\n }\n }\n for (const q of op.queryParams) {\n if (hidden?.has(q.name)) continue;\n if (groupedParams.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, OperationsMap } from '@workos/oagen';\nimport { resolveMethodName } from './naming.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { buildResolvedLookup, lookupResolved, getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Build operation-to-SDK-method mapping for the manifest.\n */\nexport function buildOperationsMap(spec: ApiSpec, ctx: EmitterContext): OperationsMap {\n const manifest: OperationsMap = {};\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n const resolvedLookup = buildResolvedLookup(ctx);\n\n for (const service of spec.services) {\n let serviceProp = accessPaths.get(service.name);\n if (!serviceProp) {\n const mountTarget = getMountTarget(service, ctx);\n serviceProp = accessPaths.get(mountTarget);\n }\n if (!serviceProp) {\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\n // Use per-operation mountOn when it differs from the service default\n const resolved = lookupResolved(op, resolvedLookup);\n const propName = (resolved && accessPaths.get(resolved.mountOn)) ?? serviceProp;\n\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return manifest;\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 { buildOperationsMap } 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 buildOperationsMap(spec: ApiSpec, ctx: EmitterContext) {\n ensureNamingInitialized(ctx);\n return buildOperationsMap(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 // Slices, maps, and pointer types (models) don't get pointer-wrapped:\n // nil slice/map + omitempty already handles absence, and double-pointers\n // are confusing at the call site.\n if (inner.startsWith('*') || inner.startsWith('[]') || inner.startsWith('map[')) 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) => {\n if (inner.startsWith('*') || inner.startsWith('[]') || inner.startsWith('map[')) 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}\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 // Skip when different IR names map to the same Go type (e.g. synthetic\n // models from enrichModelsFromSpec whose underscore names collapse to the\n // same PascalCase as the original model).\n if (structName === canonicalStruct) continue;\n\n const hash = modelHashMap.get(model.name)!;\n const groupNames = hashGroups.get(hash) ?? [];\n const aliases = groupNames.filter((n) => aliasOf.has(n) && className(n) !== className(aliasOf.get(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 const fieldHash = model.fields\n .map((f) => `${f.name}:${JSON.stringify(f.type)}:${f.required}`)\n .sort()\n .join('|');\n // Include entity domain for CRUD-prefixed models to prevent cross-domain\n // aliasing (e.g. UpdateGroup vs UpdateAuthorizationPermission have identical\n // fields but belong to different API domains and should stay separate types).\n const domain = crudEntityDomain(model.name);\n return domain ? `${domain}::${fieldHash}` : fieldHash;\n}\n\nconst CRUD_PREFIXES = ['Create', 'Update', 'Delete', 'Get', 'List'];\n\n/** Strip CRUD verb prefix to get the entity name, or null if no prefix matches. */\nfunction crudEntityDomain(name: string): string | null {\n for (const prefix of CRUD_PREFIXES) {\n if (name.startsWith(prefix) && name.length > prefix.length) {\n return name.slice(prefix.length);\n }\n }\n return null;\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 // Skip when different IR names map to the same Go type (e.g. synthetic\n // enums from enrichModelsFromSpec whose underscore names collapse to the\n // same PascalCase as the original enum).\n if (aliasType === canonicalType) continue;\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, paramsStructName } 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 mountName: 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, mountName, wrapper, wrapperParams);\n lines.push('');\n emitWrapperBodyStruct(lines, wrapper, wrapperParams);\n lines.push('');\n emitWrapperMethod(lines, serviceType, mountName, resolvedOp, wrapper, wrapperParams);\n }\n\n return lines;\n}\n\n/** Unexported struct name used as the typed JSON body for a wrapper method. */\nfunction wrapperBodyStructName(wrapper: ResolvedWrapper): string {\n return `${unexportedName(goMethodName(wrapper.name))}Body`;\n}\n\n/**\n * Emit the private body struct used to serialize the JSON request for a\n * wrapper method. Fields come from: constant defaults, required exposed\n * params, client-inferred fields, and optional exposed params (in that\n * order to match how bodies are constructed at call sites).\n */\nfunction emitWrapperBodyStruct(lines: string[], wrapper: ResolvedWrapper, wrapperParams: ResolvedWrapperParam[]): void {\n const structName = wrapperBodyStructName(wrapper);\n lines.push(`// ${structName} is the JSON request body for ${goMethodName(wrapper.name)}.`);\n lines.push(`type ${structName} struct {`);\n\n // Constant defaults (always sent — no omitempty so the wire format is deterministic)\n for (const [key, value] of Object.entries(wrapper.defaults)) {\n const goField = goFieldName(key);\n const goType = typeof value === 'boolean' ? 'bool' : typeof value === 'number' ? 'int' : 'string';\n lines.push(`\\t${goField} ${goType} \\`json:\"${key}\"\\``);\n }\n\n // Required exposed params\n for (const { paramName, field, isOptional } of wrapperParams) {\n if (isOptional) continue;\n const goField = goFieldName(paramName);\n const goType = field ? resolveSimpleGoType(field.type) : 'string';\n lines.push(`\\t${goField} ${goType} \\`json:\"${paramName}\"\\``);\n }\n\n // Inferred fields (from client config) — omit when empty\n for (const inferred of wrapper.inferFromClient) {\n const goField = goFieldName(inferred);\n lines.push(`\\t${goField} string \\`json:\"${inferred},omitempty\"\\``);\n }\n\n // Optional exposed params\n for (const { paramName, field, isOptional } of wrapperParams) {\n if (!isOptional) continue;\n const goField = goFieldName(paramName);\n const baseType = field ? resolveSimpleGoType(field.type) : 'string';\n const optType = baseType.startsWith('*') || baseType.startsWith('[]') ? baseType : `*${baseType}`;\n lines.push(`\\t${goField} ${optType} \\`json:\"${paramName},omitempty\"\\``);\n }\n\n lines.push('}');\n}\n\nfunction emitWrapperParamsStruct(\n lines: string[],\n mountName: string,\n wrapper: ResolvedWrapper,\n wrapperParams: ResolvedWrapperParam[],\n): void {\n const structName = paramsStructName(mountName, goMethodName(wrapper.name));\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 mountName: 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 = paramsStructName(mountName, method);\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 typed body struct — defaults + required params set at literal,\n // inferred + optional fields assigned after (conditional on presence).\n const bodyType = wrapperBodyStructName(wrapper);\n lines.push(`\\tbody := ${bodyType}{`);\n\n // Constant defaults (e.g., grant_type)\n for (const [key, value] of Object.entries(wrapper.defaults)) {\n lines.push(`\\t\\t${goFieldName(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${goField}: params.${goField},`);\n }\n\n lines.push('\\t}');\n\n // Inferred fields from client config — omitempty handles the unset case\n for (const inferred of wrapper.inferFromClient) {\n const goField = goFieldName(inferred);\n lines.push(`\\tbody.${goField} = ${clientFieldExpression(inferred)}`);\n }\n\n // Optional exposed params copy through as pointers — encoding/json +\n // omitempty will drop nil fields on the wire.\n for (const { paramName, isOptional } of wrapperParams) {\n if (!isOptional) continue;\n const goField = goFieldName(paramName);\n lines.push(`\\tbody.${goField} = params.${goField}`);\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(`url.PathEscape(string(${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') {\n const inner = resolveSimpleGoType(ref.inner);\n // Slices, maps, and pointer types don't get pointer-wrapped (mirrors type-map.ts).\n if (inner.startsWith('*') || inner.startsWith('[]') || inner.startsWith('map[')) return inner;\n return `*${inner}`;\n }\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 collectGroupedParamNames,\n collectBodyFieldTypes,\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 if (op.pathParams.length > 0) return true;\n const resolved = lookupResolved(op, resolvedLookup);\n if (resolved?.urlBuilder) return true;\n if (resolved && hasHiddenParams(resolved) && op.httpMethod.toLowerCase() === 'get') return true;\n if ((op.parameterGroups?.length ?? 0) > 0) return true;\n return false;\n });\n const needsStrings = needsStringsImport(operations, resolvedLookup);\n const needsJson = operations.some((op) => hasBodyGroups(op));\n // context is needed only for methods that make HTTP calls. URL-builder ops\n // don't take ctx, so a file that contains *only* URL builders would have\n // an unused import.\n const needsContext = operations.some((op) => {\n const resolved = lookupResolved(op, resolvedLookup);\n return !resolved?.urlBuilder;\n });\n\n lines.push(`package ${ctx.namespace}`);\n lines.push('');\n lines.push('import (');\n if (needsContext) {\n lines.push('\\t\"context\"');\n }\n if (needsJson) {\n lines.push('\\t\"encoding/json\"');\n }\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 // Pre-collect all parameter groups across operations and emit deduplicated\n // type definitions. A group with the same name may appear in both query-param\n // and body-param contexts; the interface then carries both applyToQuery and\n // applyToBody methods.\n const groupTypes = collectFileGroups(mountName, operations);\n if (groupTypes.length > 0) {\n // Collect body field types from all operations so variant structs use the\n // correct IR types (the parser's group-level types can fall back to string).\n const mergedBodyFieldTypes = new Map<string, import('@workos/oagen').TypeRef>();\n for (const op of operations) {\n for (const [k, v] of collectBodyFieldTypes(op, ctx.spec.models)) {\n mergedBodyFieldTypes.set(k, v);\n }\n }\n lines.push(emitCollectedGroupTypes(mountName, groupTypes, mergedBodyFieldTypes));\n }\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 const hasWrappers = (resolvedOp?.wrappers?.length ?? 0) > 0;\n\n // When wrappers exist (union-body operations like Authenticate), only\n // the typed per-variant wrapper methods are emitted. The parent method\n // would otherwise carry `Body interface{}` and defeat type safety.\n if (!hasWrappers) {\n const paramsStruct = generateParamsStruct(mountName, method, op, plan, ctx, resolvedOp);\n if (paramsStruct) {\n lines.push(paramsStruct);\n lines.push('');\n }\n\n const methodCode = generateMethod(serviceType, mountName, method, op, plan, ctx, resolvedOp);\n lines.push(methodCode);\n lines.push('');\n }\n\n // Generate union split wrapper methods (e.g., AuthenticateWithPassword)\n if (hasWrappers && resolvedOp) {\n const wrapperLines = generateWrapperMethods(serviceType, mountName, 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\n/**\n * Unexported struct name used as the typed JSON body for a non-wrapper\n * operation that has hidden params (defaults / inferFromClient). Mirrors\n * the wrapper convention (`<methodLowerCamel>Body`).\n */\nfunction hiddenParamsBodyStructName(method: string): string {\n return `${unexportedName(method)}Body`;\n}\n\n// ---------------------------------------------------------------------------\n// Mutually-exclusive parameter group support\n// ---------------------------------------------------------------------------\n\n/** Check whether an operation has any body-level parameter groups. */\nfunction hasBodyGroups(op: Operation): boolean {\n return (op.parameterGroups ?? []).some((g) => isBodyGroup(g, op));\n}\n\n/**\n * Check whether a parameter group targets the request body (rather than query params).\n * Body groups' parameter names don't appear in op.queryParams — they come from\n * the body model's oneOf variants.\n */\nfunction isBodyGroup(group: import('@workos/oagen').ParameterGroup, op: Operation): boolean {\n const queryNames = new Set(op.queryParams.map((qp) => qp.name));\n // If none of the group's variant params appear in queryParams, it's a body group\n return group.variants.every((v) => v.parameters.every((p) => !queryNames.has(p.name)));\n}\n\n/** Interface type name for a parameter group (e.g. AuthorizationParentResource). */\nfunction groupInterfaceName(mountName: string, groupName: string): string {\n return `${className(mountName)}${fieldName(groupName)}`;\n}\n\n/** Variant struct type name (e.g. AuthorizationParentResourceRefByID). */\nfunction groupVariantTypeName(mountName: string, groupName: string, variantName: string): string {\n return `${groupInterfaceName(mountName, groupName)}${fieldName(variantName)}`;\n}\n\n/**\n * Derive a short field name for a parameter within a variant struct.\n * Strips the group name prefix when present to avoid stuttering\n * (e.g. parent_resource_id in group parent_resource -> ID).\n */\nfunction deriveVariantFieldName(paramName: string, groupName: string): string {\n const prefix = groupName + '_';\n const stripped = paramName.startsWith(prefix) ? paramName.slice(prefix.length) : paramName;\n return fieldName(stripped);\n}\n\n/** Collected group metadata, merged across all operations in a file. */\ninterface CollectedGroup {\n name: string;\n needsQuery: boolean;\n needsBody: boolean;\n /** Use the first variant set encountered (they should be identical). */\n variants: import('@workos/oagen').ParameterGroupVariant[];\n}\n\n/**\n * Pre-collect all parameter groups across operations in a mount group,\n * deduplicating by group name and merging query/body usage flags.\n */\nfunction collectFileGroups(mountName: string, operations: Operation[]): CollectedGroup[] {\n const byName = new Map<string, CollectedGroup>();\n\n for (const op of operations) {\n for (const group of op.parameterGroups ?? []) {\n const existing = byName.get(group.name);\n const isBody = isBodyGroup(group, op);\n if (existing) {\n if (isBody) existing.needsBody = true;\n else existing.needsQuery = true;\n } else {\n byName.set(group.name, {\n name: group.name,\n needsQuery: !isBody,\n needsBody: isBody,\n variants: group.variants,\n });\n }\n }\n }\n\n return [...byName.values()];\n}\n\n/**\n * Emit deduplicated Go interface and variant struct definitions for all\n * collected parameter groups in a file. Groups used in query contexts get\n * applyToQuery; body contexts get applyToBody; groups used in both get both.\n */\nfunction emitCollectedGroupTypes(\n mountName: string,\n groups: CollectedGroup[],\n bodyFieldTypes: Map<string, import('@workos/oagen').TypeRef>,\n): string {\n const lines: string[] = [];\n\n for (const group of groups) {\n const ifaceName = groupInterfaceName(mountName, group.name);\n const markerMethod = `is${ifaceName}`;\n\n const variantNames = group.variants.map((v) => groupVariantTypeName(mountName, group.name, v.name));\n lines.push(`// ${ifaceName} is one of:`);\n for (const vn of variantNames) {\n lines.push(`// - ${vn}`);\n }\n lines.push(`type ${ifaceName} interface {`);\n lines.push(`\\t${markerMethod}()`);\n if (group.needsQuery) {\n lines.push('\\tapplyToQuery(url.Values)');\n }\n if (group.needsBody) {\n lines.push('\\tapplyToBody(map[string]any)');\n }\n lines.push('}');\n lines.push('');\n\n for (const variant of group.variants) {\n const typeName = groupVariantTypeName(mountName, group.name, variant.name);\n\n lines.push(`type ${typeName} struct {`);\n for (const param of variant.parameters) {\n const goField = deriveVariantFieldName(param.name, group.name);\n const effectiveType = bodyFieldTypes.get(param.name) ?? param.type;\n const goType = mapTypeRefValue(effectiveType);\n lines.push(`\\t${goField} ${goType}`);\n }\n lines.push('}');\n lines.push('');\n\n lines.push(`func (p ${typeName}) ${markerMethod}() {}`);\n\n if (group.needsQuery) {\n lines.push(`func (p ${typeName}) applyToQuery(v url.Values) {`);\n for (const param of variant.parameters) {\n const goField = deriveVariantFieldName(param.name, group.name);\n lines.push(`\\tv.Set(\"${param.name}\", ${formatQueryValue(`p.${goField}`, param.type)})`);\n }\n lines.push('}');\n }\n\n if (group.needsBody) {\n lines.push(`func (p ${typeName}) applyToBody(m map[string]any) {`);\n for (const param of variant.parameters) {\n const goField = deriveVariantFieldName(param.name, group.name);\n lines.push(`\\tm[\"${param.name}\"] = p.${goField}`);\n }\n lines.push('}');\n }\n\n lines.push('');\n }\n }\n\n return lines.join('\\n');\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 const groupedParams = collectGroupedParamNames(op);\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n\n const hasQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name) && !groupedParams.has(qp.name)).length > 0;\n const hasBody = plan.hasBody && op.requestBody;\n\n // Check if body has any visible fields after filtering (excluding grouped fields)\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) && !groupedParams.has(f.name));\n }\n } else if (hasBody) {\n hasVisibleBodyFields = true; // non-model body always visible\n }\n\n if (!hasQueryParams && !hasVisibleBodyFields && !hasGroups) 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 if (groupedParams.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) && !groupedParams.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, grouped params, and pagination fields)\n for (const param of op.queryParams) {\n if (hidden.has(param.name)) continue;\n if (groupedParams.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 // Parameter group fields (sum-type interfaces, serialized via applyToQuery)\n for (const group of op.parameterGroups ?? []) {\n const goField = fieldName(group.name);\n const goType = groupInterfaceName(mountName, group.name);\n if (group.optional) {\n lines.push(`\\t// ${goField} optionally identifies the ${group.name.replace(/_/g, ' ')}.`);\n } else {\n lines.push(`\\t// ${goField} identifies the ${group.name.replace(/_/g, ' ')} (required).`);\n }\n lines.push(`\\t${goField} ${goType} \\`url:\"-\" json:\"-\"\\``);\n }\n\n lines.push('}');\n\n // Generate MarshalJSON for params structs that have body-level groups.\n // The method uses a type alias to marshal non-group fields, then merges\n // the active group variant's fields into the JSON map.\n const bodyGroupList = (op.parameterGroups ?? []).filter((g) => isBodyGroup(g, op));\n if (bodyGroupList.length > 0) {\n lines.push('');\n lines.push(`// MarshalJSON implements json.Marshaler for ${structName}.`);\n lines.push(`func (p ${structName}) MarshalJSON() ([]byte, error) {`);\n lines.push(`\\ttype Alias ${structName}`);\n lines.push('\\tdata, err := json.Marshal(Alias(p))');\n lines.push('\\tif err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n // Check if any group is non-nil; if not, return early\n const allNilCheck = bodyGroupList.map((g) => `p.${fieldName(g.name)} == nil`).join(' && ');\n lines.push(`\\tif ${allNilCheck} {`);\n lines.push('\\t\\treturn data, nil');\n lines.push('\\t}');\n lines.push('\\tvar m map[string]any');\n lines.push('\\tif err := json.Unmarshal(data, &m); err != nil {');\n lines.push('\\t\\treturn nil, err');\n lines.push('\\t}');\n for (const group of bodyGroupList) {\n const goField = fieldName(group.name);\n lines.push(`\\tif p.${goField} != nil {`);\n lines.push(`\\t\\tp.${goField}.applyToBody(m)`);\n lines.push('\\t}');\n }\n lines.push('\\treturn json.Marshal(m)');\n lines.push('}');\n }\n\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 hasGroups = (op.parameterGroups?.length ?? 0) > 0;\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 and grouped params\n const groupedParams = collectGroupedParamNames(op);\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) && !groupedParams.has(f.name));\n }\n } else if (hasBody) {\n hasVisibleBodyFields = true;\n }\n\n const hasParams = hasVisibleBodyFields || hasVisibleQueryParams || hasGroups;\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 const isUrlBuilder = resolvedOp?.urlBuilder ?? false;\n\n // Detect if response is a raw array (not paginated)\n const isArrayResponse = !isPaginated && op.response?.kind === 'array';\n\n // Emit a typed body struct *before* the method for non-GET ops with hidden\n // params (defaults / inferFromClient). The struct gives consumers a\n // deterministic wire format and avoids `map[string]interface{}` literals.\n if (hasHidden && !isGet && hasBody) {\n emitHiddenParamsBodyStruct(lines, method, op, _ctx, resolvedOp!);\n lines.push('');\n }\n\n // Return type\n let returnType: string;\n if (isUrlBuilder) {\n returnType = 'string';\n } else 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(`// ${godocSummary(method, 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 — URL builders don't take ctx (no I/O) and return a string.\n const params: string[] = isUrlBuilder ? [] : ['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 lines.push(`func (s *${serviceType}) ${method}(${params.join(', ')}) ${returnType} {`);\n\n // Build path\n const pathExpr = buildPathExpr(op);\n\n // URL-builder ops construct the URL client-side and return it without\n // performing any HTTP I/O.\n if (isUrlBuilder) {\n emitUrlBuilderMethod(lines, op, pathExpr, resolvedOp!, paramsType);\n lines.push('}');\n return lines.join('\\n');\n }\n\n // For GET operations with hidden params or parameter groups, build query\n // via url.Values so we can inject defaults, inferred values, and/or call\n // applyToQuery on grouped parameter variants.\n if ((hasHidden || hasGroups) && 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 typed body struct\n emitBodyWithHiddenParams(\n lines,\n op,\n pathExpr,\n plan,\n _ctx,\n resolvedOp!,\n paramsType,\n isPaginated,\n isDelete,\n isArrayResponse,\n method,\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, ${paginationDefaultsLiteral(op)})`,\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 (excluding grouped params\n // which are serialized via their variant's applyToQuery method)\n if (paramsType) {\n const groupedParamNames = collectGroupedParamNames(op);\n const visibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name) && !groupedParamNames.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 // Apply parameter group variants to the query via applyToQuery\n for (const group of op.parameterGroups ?? []) {\n const goField = fieldName(group.name);\n lines.push(`\\tif params.${goField} != nil {`);\n lines.push(`\\t\\tparams.${goField}.applyToQuery(query)`);\n lines.push('\\t}');\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, ${paginationDefaultsLiteral(op)})`,\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 URL-builder operations (OAuth redirect endpoints).\n * Builds a url.Values from defaults + inferred + user-provided params, then\n * returns `s.client.buildURL(path, query, opts)` without performing any I/O.\n */\nfunction emitUrlBuilderMethod(\n lines: string[],\n op: Operation,\n pathExpr: string,\n resolvedOp: ResolvedOperation,\n paramsType: string | null,\n): void {\n const hidden = buildHiddenParams(resolvedOp);\n\n lines.push('\\tquery := url.Values{}');\n\n // Inject constant defaults (e.g., response_type=code)\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 (e.g., client_id)\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 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 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 lines.push(`\\treturn s.client.buildURL(${pathExpr}, query, opts)`);\n}\n\n/**\n * Emit a private typed body struct for a non-GET operation that has hidden\n * params. Field order matches how `emitBodyWithHiddenParams` constructs the\n * body at the call site: defaults → required exposed → inferred → optional\n * exposed. Mirrors `emitWrapperBodyStruct` in `wrappers.ts`.\n */\nfunction emitHiddenParamsBodyStruct(\n lines: string[],\n method: string,\n op: Operation,\n ctx: EmitterContext,\n resolvedOp: ResolvedOperation,\n): void {\n const hidden = buildHiddenParams(resolvedOp);\n const structName = hiddenParamsBodyStructName(method);\n\n const bodyModel =\n op.requestBody?.kind === 'model'\n ? ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name)\n : undefined;\n\n lines.push(`// ${structName} is the JSON request body for ${method}.`);\n lines.push(`type ${structName} struct {`);\n\n // Constant defaults (always sent — no omitempty so the wire format is deterministic)\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n const goField = fieldName(key);\n const goType = typeof value === 'boolean' ? 'bool' : typeof value === 'number' ? 'int' : 'string';\n lines.push(`\\t${goField} ${goType} \\`json:\"${key}\"\\``);\n }\n\n // Required exposed body fields\n const groupedParamNames = collectGroupedParamNames(op);\n if (bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n if (groupedParamNames.has(field.name)) continue;\n if (!field.required) continue;\n const goField = fieldName(field.name);\n const goType = mapTypeRef(field.type);\n lines.push(`\\t${goField} ${goType} \\`json:\"${field.name}\"\\``);\n }\n }\n\n // Inferred fields from client config (omitempty drops empty strings)\n for (const inferred of getOpInferFromClient(resolvedOp)) {\n const goField = fieldName(inferred);\n lines.push(`\\t${goField} string \\`json:\"${inferred},omitempty\"\\``);\n }\n\n // Optional exposed body fields (pointer/slice/map + omitempty)\n if (bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n if (groupedParamNames.has(field.name)) continue;\n if (field.required) continue;\n const goField = fieldName(field.name);\n const goType = makeOptional(mapTypeRef(field.type));\n lines.push(`\\t${goField} ${goType} \\`json:\"${field.name},omitempty\"\\``);\n }\n }\n\n lines.push('}');\n}\n\n/**\n * Emit method body for non-GET operations that have hidden params (defaults\n * / inferFromClient). Builds a typed body struct (declared by\n * `emitHiddenParamsBodyStruct`) so the wire format is deterministic and\n * statically typed.\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 method: string,\n): void {\n const hidden = buildHiddenParams(resolvedOp);\n const bodyType = hiddenParamsBodyStructName(method);\n\n const bodyModel =\n op.requestBody?.kind === 'model'\n ? ctx.spec.models.find((m) => op.requestBody?.kind === 'model' && m.name === op.requestBody.name)\n : undefined;\n\n // Build typed body struct literal — defaults + required user fields first\n lines.push(`\\tbody := ${bodyType}{`);\n\n for (const [key, value] of Object.entries(getOpDefaults(resolvedOp))) {\n lines.push(`\\t\\t${fieldName(key)}: ${goLiteral(value as string | number | boolean)},`);\n }\n\n if (paramsType && bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n if (!field.required) continue;\n const goField = fieldName(field.name);\n lines.push(`\\t\\t${goField}: params.${goField},`);\n }\n }\n\n lines.push('\\t}');\n\n // Inferred fields from client config — omitempty drops empty values\n for (const inferred of getOpInferFromClient(resolvedOp)) {\n const goField = fieldName(inferred);\n lines.push(`\\tbody.${goField} = ${clientFieldExpression(inferred)}`);\n }\n\n // Optional exposed body fields — copy through; omitempty drops nil/empty\n if (paramsType && bodyModel) {\n for (const field of bodyModel.fields) {\n if (hidden.has(field.name)) continue;\n if (field.required) continue;\n const goField = fieldName(field.name);\n lines.push(`\\tbody.${goField} = params.${goField}`);\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 const varName = lowerFirst(fieldName(p.name));\n const needsCast = p.type.kind !== 'primitive' || p.type.type !== 'string';\n args.push(needsCast ? `url.PathEscape(string(${varName}))` : `url.PathEscape(${varName})`);\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\n/**\n * Build the Go literal for the pagination defaults map passed as the last\n * argument to newIterator. Collects `default` values from pagination-related\n * query params (limit, order) and returns either `nil` or\n * `map[string]string{\"limit\": \"10\", \"order\": \"desc\"}`.\n */\nfunction paginationDefaultsLiteral(op: Operation): string {\n const PAGINATION_DEFAULTS = ['limit', 'order'];\n const entries: string[] = [];\n for (const name of PAGINATION_DEFAULTS) {\n const param = op.queryParams.find((qp) => qp.name === name);\n if (param?.default != null) {\n entries.push(`\"${name}\": \"${param.default}\"`);\n }\n }\n if (entries.length === 0) return 'nil';\n return `map[string]string{${entries.join(', ')}}`;\n}\n\n/**\n * Build the godoc summary line for a method. When every PascalCase word\n * in the method name matches the leading words of the summary\n * (case-insensitive), those words are stripped to avoid stutter:\n *\n * godocSummary(\"Check\", \"Check authorization\") → \"Check authorization\"\n * godocSummary(\"Delete\", \"Delete an API key\") → \"Delete an API key\"\n * godocSummary(\"VerifyEmail\", \"Verify email\") → \"VerifyEmail\"\n * godocSummary(\"GetJWKS\", \"Get JWKS\") → \"GetJWKS\"\n *\n * When the summary words diverge from the method name, nothing is stripped:\n *\n * godocSummary(\"AssignRole\", \"Assign a role\")\n * → \"AssignRole assign a role\"\n * godocSummary(\"ListOrganizationMembershipResources\", \"List resources for organization membership\")\n * → \"ListOrganizationMembershipResources list resources for organization membership\"\n */\nfunction godocSummary(method: string, summary: string): string {\n const methodWords = method.match(/[A-Z]+(?:[a-z]+|(?=[A-Z]|$))|[A-Z]?[a-z]+|[0-9]+/g) ?? [method];\n const summaryWords = summary.split(/\\s+/);\n\n // Check whether all method words match the leading summary words.\n if (methodWords.length <= summaryWords.length) {\n const allMatch = methodWords.every((mw, i) => mw.toLowerCase() === summaryWords[i].toLowerCase());\n if (allMatch) {\n const rest = summaryWords.slice(methodWords.length).join(' ');\n if (rest) return `${method} ${lowerFirstDesc(rest)}`;\n return method;\n }\n }\n\n return `${method} ${lowerFirstDesc(summary)}`;\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 `${className(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 { className, unexportedName } from './naming.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\nimport { NON_SPEC_SERVICES } from '../shared/non-spec-services.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 * Non-spec services marked with `hasClientAccessor: true` (passwordless, vault)\n * are included in the generated Client struct, constructor, and accessor methods\n * — identical to spec-driven services. Their service type (e.g. PasswordlessService)\n * is defined in a hand-written @oagen-ignore-file, but the Client wiring is generated.\n *\n * Other non-spec modules (webhook_verification, actions, etc.) remain fully\n * self-contained in their @oagen-ignore-file files.\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('\\tlogger Logger');\n lines.push('\\tappInfo appInfo');\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 // Non-spec service fields (hand-written types, generated wiring)\n for (const ns of NON_SPEC_SERVICES.filter((s) => s.hasClientAccessor)) {\n const name = className(toPascalCase(ns.id));\n lines.push(`\\t${unexportedName(name)} *${serviceType(name)}`);\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 // Initialize non-spec services\n for (const ns of NON_SPEC_SERVICES.filter((s) => s.hasClientAccessor)) {\n const name = className(toPascalCase(ns.id));\n lines.push(`\\tc.${unexportedName(name)} = &${serviceType(name)}{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 // Non-spec service accessor methods\n for (const ns of NON_SPEC_SERVICES.filter((s) => s.hasClientAccessor)) {\n const name = className(toPascalCase(ns.id));\n const typeName = serviceType(name);\n lines.push(`// ${name} returns the ${name} service.`);\n lines.push(`func (c *Client) ${name}() *${typeName} {`);\n lines.push(`\\treturn c.${unexportedName(name)}`);\n lines.push('}');\n lines.push('');\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 `${className(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: { models: Model[]; enums: Enum[]; services: any[] }): {\n files: { path: string; content: string }[];\n pathRewrites: Map<string, string>;\n} {\n if (spec.models.length === 0) return { files: [], pathRewrites: new Map() };\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 { files: deduped, pathRewrites };\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 { files: fixtures, pathRewrites: fixtureRewrites } = 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, fixtureRewrites);\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 fixtureRewrites: 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 const resolvedLookupMain = buildResolvedLookup(ctx);\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 // Skip operations with wrapper splits — the parent method isn't emitted\n // (see src/go/resources.ts), only the typed wrappers are tested below.\n const resolvedMain = lookupResolved(op, resolvedLookupMain);\n if ((resolvedMain?.wrappers?.length ?? 0) > 0) continue;\n\n const testName = `Test${accessorName}_${method}`;\n const isUrlBuilder = resolvedMain?.urlBuilder ?? false;\n\n if (isUrlBuilder) {\n // URL-builder methods return a string synchronously without making\n // an HTTP request. Assert the URL contains the expected path.\n const expectedPath = buildExpectedPath(op);\n // Call args: no ctx, path params (if any), then params struct.\n const callArgs: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n callArgs.push(`\"test_${p.name}\"`);\n }\n const hidden = buildHiddenParams(resolvedMain);\n const hasVisibleQueryParams = op.queryParams.filter((qp) => !hidden.has(qp.name)).length > 0;\n if (hasVisibleQueryParams) {\n const pName = paramsStructName(resolvedName, method);\n callArgs.push(`&${ctx.namespace}.${pName}{}`);\n }\n lines.push(`func ${testName}(t *testing.T) {`);\n lines.push(`\\tclient := ${ctx.namespace}.NewClient(\"sk_test\", ${ctx.namespace}.WithClientID(\"client_test\"))`);\n lines.push(`\\turl := client.${accessorName}().${method}(${callArgs.join(', ')})`);\n lines.push('\\trequire.NotEmpty(t, url)');\n lines.push(`\\trequire.Contains(t, url, \"${expectedPath}\")`);\n lines.push('}');\n lines.push('');\n continue;\n }\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 // If this fixture was deduplicated, use the canonical path\n if (fixtureRewrites.has(fixturePath)) {\n fixturePath = fixtureRewrites.get(fixturePath)!;\n }\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 let fixturePath = `testdata/${fileName(respModel)}.json`;\n if (fixtureRewrites.has(fixturePath)) {\n fixturePath = fixtureRewrites.get(fixturePath)!;\n }\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 = paramsStructName(resolvedName, wrapperMethod);\n const responseType = wrapper.responseModelName;\n const testName = `Test${accessorName}_${wrapperMethod}`;\n let fixturePath = responseType ? `testdata/${fileName(responseType)}.json` : null;\n if (fixturePath && fixtureRewrites.has(fixturePath)) {\n fixturePath = fixtureRewrites.get(fixturePath)!;\n }\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). Skip wrapper-split ops (parent method\n // isn't emitted) and URL-builder ops (no HTTP call to error-test against).\n const sampleOp = service.operations.find((o) => {\n const r = lookupResolved(o, resolvedLookupMain);\n return (r?.wrappers?.length ?? 0) === 0 && !(r?.urlBuilder ?? false);\n });\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, OperationsMap } from '@workos/oagen';\nimport { resolveMethodName } from './naming.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { buildResolvedLookup, lookupResolved, getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Build operation-to-SDK-method mapping for the manifest.\n */\nexport function buildOperationsMap(spec: ApiSpec, ctx: EmitterContext): OperationsMap {\n const manifest: OperationsMap = {};\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n const resolvedLookup = buildResolvedLookup(ctx);\n\n for (const service of spec.services) {\n let serviceProp = accessPaths.get(service.name);\n if (!serviceProp) {\n const mountTarget = getMountTarget(service, ctx);\n serviceProp = accessPaths.get(mountTarget);\n }\n if (!serviceProp) {\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\n // Use per-operation mountOn when it differs from the service default\n const resolved = lookupResolved(op, resolvedLookup);\n const propName = (resolved && accessPaths.get(resolved.mountOn)) ?? serviceProp;\n\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return manifest;\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 { buildOperationsMap } 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 // Go has no sum types, so discriminated union base models (e.g. EventSchema)\n // need their base fields preserved. enrichModelsFromSpec clears fields for\n // discriminated models so dispatcher-capable languages can generate sealed\n // classes; restore the original fields here since Go just emits flat structs.\n const originalByName = new Map(models.map((m) => [m.name, m]));\n const goModels = enriched.map((m) => {\n if ((m as any).discriminator && m.fields.length === 0) {\n const original = originalByName.get(m.name);\n if (original && original.fields.length > 0) {\n return { ...m, fields: original.fields };\n }\n }\n return m;\n });\n return ensureTrailingNewlines(generateModels(goModels, 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 buildOperationsMap(spec: ApiSpec, ctx: EmitterContext) {\n return buildOperationsMap(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 // oagen appends all generated file paths (including .json fixtures) to the\n // format command. gofmt errors on non-.go files, so filter them out.\n // Same pattern as the Python emitter's ruff wrapper.\n return {\n cmd: 'bash',\n args: [\n '-c',\n 'GO_FILES=$(printf \"%s\\\\n\" \"$@\" | grep \"\\\\.go$\"); [ -n \"$GO_FILES\" ] && echo \"$GO_FILES\" | xargs gofmt -w',\n '--',\n ],\n batchSize: 999999,\n };\n },\n};\n","import type { Operation, Service, EmitterContext } from '@workos/oagen';\nimport { toPascalCase, toSnakeCase } from '@workos/oagen';\nimport { buildResolvedLookup, lookupMethodName, lookupResolved, 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/** Display name for a model type, including consumer-friendly aliases. */\nexport function modelClassName(name: string): string {\n switch (name) {\n case 'EmailChangeConfirmationUser':\n case 'UserlandUser':\n return 'User';\n default:\n return className(name);\n }\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\nfunction trimAsyncSuffix(name: string): string {\n return name.endsWith('Async') ? name.slice(0, -5) : name;\n}\n\n/** Append Async once for TAP-style method names. */\nexport function appendAsyncSuffix(name: string): string {\n return name.endsWith('Async') ? name : `${name}Async`;\n}\n\n/** Resolve the stable method stem for an operation (without any Async suffix). */\nexport function resolveMethodStem(op: Operation, _service: Service, ctx: EmitterContext): string {\n const lookup = buildResolvedLookup(ctx);\n const resolved = lookupMethodName(op, lookup);\n if (resolved) {\n return trimMountedResourceFromMethod(methodName(trimAsyncSuffix(resolved)), resolveClassName(_service, ctx));\n }\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup?.methodByOperation?.get(httpKey);\n if (existing) {\n return trimMountedResourceFromMethod(\n methodName(trimAsyncSuffix(existing.methodName)),\n resolveClassName(_service, ctx),\n );\n }\n return trimMountedResourceFromMethod(methodName(trimAsyncSuffix(op.name)), resolveClassName(_service, ctx));\n}\n\n/** Resolve the SDK method name for an operation. */\nexport function resolveMethodName(op: Operation, service: Service, ctx: EmitterContext): string {\n const stem = resolveMethodStem(op, service, ctx);\n const resolved = lookupResolved(op, buildResolvedLookup(ctx));\n if (resolved?.urlBuilder ?? false) {\n return stem;\n }\n\n return appendAsyncSuffix(stem);\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, '&').replace(/</g, '<').replace(/>/g, '>');\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, modelClassName } 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/**\n * Module-level alias map for structurally-identical models. Populated by\n * `setModelAliases` from model deduplication; consulted by `mapTypeRef` so\n * that every reference to a duplicate model resolves to the canonical name.\n */\nconst modelAliases = new Map<string, 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 current model-alias map. Safe to call more than once. */\nexport function setModelAliases(aliases: Map<string, string>): void {\n modelAliases.clear();\n for (const [k, v] of aliases) modelAliases.set(k, v);\n}\n\n/** Check if a model name is an alias (i.e., structurally identical to another model). */\nexport function isModelAlias(name: string): boolean {\n return modelAliases.has(name);\n}\n\n/** Resolve a model name to its canonical form (identity if not an alias). */\nexport function resolveModelName(name: string): string {\n return modelAliases.get(name) ?? name;\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) => modelClassName(modelAliases.get(r.name) ?? 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. Property name mapping is\n * handled by a global SnakeCaseLower / SnakeCaseNamingStrategy configuration\n * on both serializers, so per-property name attributes are not emitted.\n *\n * When `isRequiredEnum` is true, configure both serializers to skip the field\n * when its value equals the enum default (0 = Unknown sentinel). This converts\n * \"unset required enum\" from a silent `\"unknown\"` wire value into a clean\n * omission so the API returns a clear `missing required field` error instead\n * of a confusing 422.\n */\nexport function emitJsonPropertyAttributes(_wireName: string, options: { isRequiredEnum?: boolean } = {}): string[] {\n if (options.isRequiredEnum) {\n return [\n ` [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]`,\n ` [STJS.JsonIgnore(Condition = STJS.JsonIgnoreCondition.WhenWritingDefault)]`,\n ];\n }\n // Convention-based: SnakeCaseLower naming policy handles the name mapping.\n return [];\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 <= 9) return `OneOf.OneOf<${unique.join(', ')}>`;\n // OneOf supports arity 2-9. Higher-arity unions collapse to `object`,\n // losing type information. Warn so the author knows the spec outgrew the\n // runtime support instead of silently degrading.\n if (unique.length >= 10) {\n console.warn(\n `[oagen:dotnet] Union with ${unique.length} variants exceeds OneOf<T0..T8> 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 {\n mapTypeRef,\n isValueTypeRef,\n isEnumRef,\n emitJsonPropertyAttributes,\n setModelAliases,\n isModelAlias,\n} from './type-map.js';\nimport {\n articleFor,\n fieldName,\n humanize,\n emitXmlDoc,\n deprecationMessage,\n escapeCsAttributeString,\n modelClassName,\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 * Context for discriminated union inheritance in generated models.\n * When present, base models get a [JsonConverter] attribute and variant\n * models extend the base class, inheriting common fields.\n */\nexport interface DiscriminatorContext {\n /** Model names that are discriminated union bases. */\n discriminatorBases: Set<string>;\n /** Maps variant model name → base model name. */\n variantToBase: Map<string, string>;\n /** Maps base model name → wire name of the discriminator property. */\n discriminatorProperties?: Map<string, string>;\n}\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, discCtx?: DiscriminatorContext): 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 // Compute and publish model aliases so mapTypeRef rewrites references.\n primeModelAliases(models);\n\n // Build a lookup of base model field C# names → C# types for inheritance.\n // Variant models skip inherited fields and use `new` for type-divergent ones.\n const baseFieldLookup = new Map<string, Map<string, string>>();\n if (discCtx) {\n for (const model of models) {\n if (discCtx.discriminatorBases.has(model.name)) {\n const fieldMap = new Map<string, string>();\n for (const field of model.fields) {\n fieldMap.set(fieldName(field.name), mapTypeRef(field.type));\n }\n baseFieldLookup.set(model.name, fieldMap);\n }\n }\n }\n\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n\n const csClassName = modelClassName(model.name);\n\n // Skip alias models — all references are already rewritten to the\n // canonical type by mapTypeRef, so the alias class would be dead code.\n if (isModelAlias(model.name)) continue;\n\n const lines: string[] = [];\n const fieldTypes = model.fields.map((f) => mapTypeRef(f.type));\n const needsCollections = fieldTypes.some((t) => t.startsWith('List<') || t.startsWith('Dictionary<'));\n const needsSystem = fieldTypes.some((t) => t.includes('DateTimeOffset'));\n const needsJsonAttrs = model.fields.some((f) => f.required && isEnumRef(f.type));\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 if (needsJsonAttrs) {\n lines.push(' using Newtonsoft.Json;');\n lines.push(' using STJS = System.Text.Json.Serialization;');\n }\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 // Discriminated union base: add JsonConverter so the deserializer dispatches\n // to the correct variant subclass.\n const isDiscBase = discCtx?.discriminatorBases.has(model.name) ?? false;\n if (isDiscBase) {\n lines.push(` [Newtonsoft.Json.JsonConverter(typeof(${csClassName}DiscriminatorConverter))]`);\n }\n\n // Variant: extend the base class to inherit common fields.\n const baseName = discCtx?.variantToBase.get(model.name);\n const baseClassName = baseName ? modelClassName(baseName) : null;\n const baseFields = baseName ? baseFieldLookup.get(baseName) : undefined;\n\n if (baseClassName) {\n lines.push(` public class ${csClassName} : ${baseClassName}`);\n } else {\n lines.push(` public class ${csClassName}`);\n }\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 // Inheritance: if this variant extends a base class, check each field\n // against the base. Same C# type → skip (inherited). Different C# type\n // → emit with `new` keyword so the variant has its own typed property.\n let useNewModifier = false;\n if (baseFields) {\n const baseType = baseFields.get(csFieldName);\n if (baseType !== undefined) {\n const variantType = mapTypeRef(field.type);\n if (baseType === variantType) {\n continue; // Inherited from base — skip\n }\n useNewModifier = true;\n }\n }\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 // On a discriminated union base, the discriminator property (e.g. \"event\")\n // should be non-public-settable even though it lacks a single const value\n // (each variant has a different value). Consumers must never mutate it.\n const discProp = isDiscBase ? discCtx?.discriminatorProperties?.get(model.name) : undefined;\n const isDiscriminatorField = discProp !== undefined && field.name === discProp;\n\n if (constInit !== null && !isOptional) {\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 // Only for required fields — optional literal fields must be nullable\n // so absent keys round-trip correctly.\n csType = baseType;\n initializer = ` = ${constInit};`;\n setterModifier = 'internal ';\n } else if (isDiscriminatorField) {\n // Discriminator property on the base class: varies per variant but\n // should still be non-public-settable so consumers can't change it.\n csType = baseType;\n if (!isAlreadyNullable && !isValueTypeRef(field.type)) {\n initializer = ' = default!;';\n }\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 const newMod = useNewModifier ? 'new ' : '';\n lines.push(` public ${newMod}${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 if (isDiscBase) {\n lines.push(` /// <remarks>`);\n lines.push(` /// Variant subclasses provide strongly-typed <c>${dict.csName}</c> properties that`);\n lines.push(` /// shadow this dictionary. This accessor is intended for forward-compatible handling`);\n lines.push(` /// of types not yet known to this SDK version. For recognized types, cast to the`);\n lines.push(` /// specific subclass and access its typed <c>${dict.csName}</c> property directly.`);\n lines.push(` /// </remarks>`);\n }\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 * Compute and publish the model alias map. Safe to call multiple times\n * (idempotent for a given set of models). Must be invoked before any emitter\n * phase that calls `mapTypeRef` with model references.\n */\nexport function primeModelAliases(models: Model[]): void {\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 setModelAliases(aliasOf);\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, '&').replace(/</g, '<').replace(/>/g, '>');\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 fieldName as csFieldName,\n methodName as csMethodName,\n localName,\n csLiteral,\n clientFieldExpression,\n httpMethodHelperName,\n escapeXml,\n emitXmlDoc,\n humanize,\n appendAsyncSuffix,\n modelClassName,\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 methodStem = csMethodName(wrapper.name);\n const method = appendAsyncSuffix(methodStem);\n const optionsClass = `${methodStem}Options`;\n const responseType = wrapper.responseModelName ? modelClassName(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 const argNames: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n const name = localName(p.name);\n sigParams.push(`string ${name}`);\n argNames.push(name);\n }\n sigParams.push(`${optionsClass} options`);\n argNames.push('options');\n sigParams.push('RequestOptions? requestOptions = null');\n argNames.push('requestOptions');\n sigParams.push('CancellationToken cancellationToken = default');\n argNames.push('cancellationToken');\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}}`, `{Uri.EscapeDataString(${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 lines.push('');\n lines.push(` /// <summary>Compatibility wrapper for <see cref=\"${method}\"/>.</summary>`);\n lines.push(` public Task${responseType ? `<${responseType}>` : ''} ${methodStem}(${sigParams.join(', ')})`);\n lines.push(' {');\n lines.push(` return this.${method}(${argNames.join(', ')});`);\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(` 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(` 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 Model,\n TypeRef,\n} from '@workos/oagen';\nimport { planOperation } from '@workos/oagen';\nimport { isListWrapperModel } from './models.js';\nimport { mapTypeRef, isValueTypeRef, isEnumRef, emitJsonPropertyAttributes, resolveModelName } from './type-map.js';\nimport {\n appendAsyncSuffix,\n className,\n fieldName,\n methodName,\n resolveClassName,\n resolveMethodName,\n resolveMethodStem,\n serviceTypeName,\n localName,\n csLiteral,\n clientFieldExpression,\n httpMethodCs,\n httpMethodHelperName,\n escapeXml,\n emitXmlDoc,\n deprecationMessage,\n escapeCsAttributeString,\n humanize,\n modelClassName,\n} from './naming.js';\nimport {\n buildResolvedLookup,\n lookupResolved,\n groupByMount,\n getOpDefaults,\n getOpInferFromClient,\n buildHiddenParams,\n hasHiddenParams,\n collectGroupedParamNames,\n collectBodyFieldTypes,\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\n// ---------------------------------------------------------------------------\n// Mutually-exclusive parameter group support\n// ---------------------------------------------------------------------------\n\n/** Abstract base class name for a parameter group (e.g. UserManagementRole). */\nfunction groupBaseClassName(mountName: string, groupName: string): string {\n return `${className(mountName)}${className(groupName)}`;\n}\n\n/** Concrete variant class name (e.g. UserManagementRoleSingle). */\nfunction groupVariantClassName(mountName: string, groupName: string, variantName: string): string {\n return `${className(mountName)}${className(groupName)}${className(variantName)}`;\n}\n\n/**\n * Generate C# abstract base class + concrete subtypes for all parameter groups\n * on an operation. Each group becomes an abstract class with concrete subclasses\n * for each variant containing the variant's parameters as properties.\n */\nfunction generateParameterGroupTypes(\n mountName: string,\n op: Operation,\n models: Model[],\n emitted?: Set<string>,\n): string[] {\n const lines: string[] = [];\n const bodyFieldTypes = collectBodyFieldTypes(op, models);\n\n for (const group of op.parameterGroups ?? []) {\n const baseName = groupBaseClassName(mountName, group.name);\n if (emitted?.has(baseName)) continue;\n emitted?.add(baseName);\n\n lines.push('');\n lines.push(` public abstract class ${baseName} { }`);\n\n for (const variant of group.variants) {\n const variantName = groupVariantClassName(mountName, group.name, variant.name);\n lines.push('');\n lines.push(` public class ${variantName} : ${baseName}`);\n lines.push(' {');\n for (const param of variant.parameters) {\n const csField = fieldName(param.name);\n const effectiveType = bodyFieldTypes.get(param.name) ?? param.type;\n const csType = mapTypeRef(effectiveType);\n lines.push(` public ${csType} ${csField} { get; set; } = default!;`);\n lines.push('');\n }\n lines.push(' }');\n }\n }\n\n return lines;\n}\n\n/**\n * Emit manual serialization for parameter group variants in the service\n * method body. Each group field on the options class is pattern-matched via\n * `is` checks and its variant parameters are added to the appropriate target\n * (query string or request body).\n */\nfunction emitGroupSerialization(\n mountName: string,\n op: Operation,\n indent: string,\n models: Model[],\n target: 'query' | 'body',\n): string[] {\n const lines: string[] = [];\n const bodyFieldTypes = collectBodyFieldTypes(op, models);\n\n for (const group of op.parameterGroups ?? []) {\n const groupField = fieldName(group.name);\n let first = true;\n\n for (const variant of group.variants) {\n const variantName = groupVariantClassName(mountName, group.name, variant.name);\n // Use a short local variable derived from the variant name\n const localVar = localName(variant.name);\n const keyword = first ? 'if' : 'else if';\n first = false;\n\n lines.push(`${indent}${keyword} (options?.${groupField} is ${variantName} ${localVar})`);\n lines.push(`${indent}{`);\n let prevWasBlock = false;\n for (const param of variant.parameters) {\n const csField = fieldName(param.name);\n const effectiveType = bodyFieldTypes.get(param.name) ?? param.type;\n const accessor = `${localVar}.${csField}`;\n const paramLines = emitParamValue(param.name, accessor, effectiveType, indent + ' ', target);\n // SA1513: closing brace must be followed by a blank line before the next statement\n if (prevWasBlock) lines.push('');\n lines.push(...paramLines);\n prevWasBlock = paramLines.length > 1;\n }\n lines.push(`${indent}}`);\n }\n }\n\n return lines;\n}\n\n/**\n * Emit one or more lines to add a param to the query string or request body,\n * adapting to the parameter's IR type: enums use JsonConvert for wire-value\n * serialization, arrays are comma-joined, and reference types (string, List)\n * get a null guard.\n *\n * Reference types always get a null guard because variant classes are shared\n * across operations whose body models may disagree on nullability.\n */\nfunction emitParamValue(\n wireName: string,\n accessor: string,\n typeRef: TypeRef,\n indent: string,\n target: 'query' | 'body',\n): string[] {\n const method = target === 'body' ? 'AddBodyParam' : 'AddQueryParam';\n const isNullable = typeRef.kind === 'nullable';\n const inner: TypeRef = isNullable ? (typeRef as { kind: 'nullable'; inner: TypeRef }).inner : typeRef;\n\n // Reference types (arrays, strings, models) are always guarded for null\n // because the variant class property may be nullable even when the current\n // operation's body model says \"required\".\n const needsNullGuard = isNullable || !isValueTypeRef(inner);\n\n if (inner.kind === 'array') {\n // Body params pass the list directly so it serializes as a JSON array;\n // query params comma-join into a single string value.\n const valueExpr = target === 'body' ? accessor : `string.Join(\",\", ${accessor})`;\n if (needsNullGuard) {\n return [\n `${indent}if (${accessor} != null)`,\n `${indent}{`,\n `${indent} request.${method}(\"${wireName}\", ${valueExpr});`,\n `${indent}}`,\n ];\n }\n return [`${indent}request.${method}(\"${wireName}\", ${valueExpr});`];\n }\n\n if (inner.kind === 'enum') {\n const serExpr = `JsonConvert.SerializeObject(${accessor}).Trim('\"')`;\n if (isNullable) {\n return [\n `${indent}if (${accessor} != null)`,\n `${indent}{`,\n `${indent} request.${method}(\"${wireName}\", ${serExpr});`,\n `${indent}}`,\n ];\n }\n return [`${indent}request.${method}(\"${wireName}\", ${serExpr});`];\n }\n\n if (needsNullGuard) {\n return [\n `${indent}if (${accessor} != null)`,\n `${indent}{`,\n `${indent} request.${method}(\"${wireName}\", ${accessor});`,\n `${indent}}`,\n ];\n }\n\n return [`${indent}request.${method}(\"${wireName}\", ${accessor});`];\n}\n\n/** Check whether any parameter group variant contains an enum-typed parameter. */\nfunction groupsNeedJsonConvert(operations: Operation[], models: Model[]): boolean {\n for (const op of operations) {\n const bodyFieldTypes = collectBodyFieldTypes(op, models);\n for (const group of op.parameterGroups ?? []) {\n for (const variant of group.variants) {\n for (const param of variant.parameters) {\n const effectiveType = bodyFieldTypes.get(param.name) ?? param.type;\n const inner: TypeRef =\n effectiveType.kind === 'nullable'\n ? (effectiveType as { kind: 'nullable'; inner: TypeRef }).inner\n : effectiveType;\n if (inner.kind === 'enum') return true;\n }\n }\n }\n }\n return false;\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;');\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 if (groupsNeedJsonConvert(operations, ctx.spec.models)) {\n lines.push(' using Newtonsoft.Json;');\n }\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 methodStem = resolveCsMethodStem(op, mountName, ctx);\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, methodStem, op, plan, ctx, resolvedOp);\n lines.push(methodCode);\n\n if (!(resolvedOp?.urlBuilder ?? false) && method !== methodStem) {\n lines.push('');\n lines.push(generateCompatibilityMethod(mountName, method, methodStem, op, plan, ctx, resolvedOp));\n }\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, methodStem, 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(appendAsyncSuffix(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 const emittedGroupTypes = 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 groupedParams = collectGroupedParamNames(op);\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const hasVisibleQueryParams =\n op.queryParams.filter((qp) => !hidden.has(qp.name) && !groupedParams.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 && !hasGroups) 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 if (groupedParams.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 // and skip grouped params which get their own abstract class hierarchy)\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 (groupedParams.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(` 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(` internal string ${csField} { get; set; } = default!;`);\n optionsLines.push('');\n }\n\n // Parameter group properties (serialized manually in the service method, not by JSON)\n for (const group of op.parameterGroups ?? []) {\n const baseName = groupBaseClassName(mountName, group.name);\n const csField = fieldName(group.name);\n optionsLines.push(' [JsonIgnore]');\n optionsLines.push(' [STJS.JsonIgnore]');\n const initializer = group.optional ? '' : ' = default!;';\n const csType = group.optional ? `${baseName}?` : baseName;\n optionsLines.push(` public ${csType} ${csField} { get; set; }${initializer}`);\n optionsLines.push('');\n }\n\n optionsLines.push(' }');\n\n // Emit parameter group abstract base + concrete variant classes\n if (hasGroups) {\n optionsLines.push(...generateParameterGroupTypes(mountName, op, ctx.spec.models, emittedGroupTypes));\n }\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 methodStem: 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 groupedParams = collectGroupedParamNames(op);\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const hasVisibleQueryParams =\n op.queryParams.filter((qp) => !hidden.has(qp.name) && !groupedParams.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 || hasGroups;\n const optionsClass = hasParams ? optionsClassName(mountName, methodStem) : 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 = modelClassName(resolveModelName(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 = modelClassName(resolveModelName(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, bearer-override operations, and operations with parameter\n // groups keep the inlined WorkOSRequest form because the Service helpers\n // don't expose BuildRequestUri, AccessToken configuration, or manual\n // query param injection. Everything else uses the helper one-liners.\n const needsInlineRequest = isUrlBuilder || (hasBearerOverride && !!bearerParamName) || hasGroups;\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 // Serialize parameter group variants into query params (GET/DELETE)\n // or body params (POST/PUT/PATCH) so sensitive fields like passwords\n // never leak into the URL. DELETE is routed to query because the\n // dotnet HTTP client only sends body content for non-GET/DELETE methods.\n if (hasGroups) {\n const groupTarget = hasBody && !isDelete ? 'body' : 'query';\n lines.push('');\n lines.push(...emitGroupSerialization(mountName, op, ' ', ctx.spec.models, groupTarget));\n lines.push('');\n }\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 methodStem: 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 groupedParams = collectGroupedParamNames(op);\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const hasVisibleQueryParams =\n op.queryParams.filter((qp) => !hidden.has(qp.name) && !groupedParams.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 || hasGroups;\n const optionsClass = hasParams ? optionsClassName(mountName, methodStem) : 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}> ${methodStem}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 resolveCsMethodStem(op: Operation, mountName: string, ctx: EmitterContext): string {\n return resolveMethodStem(op, { name: mountName, operations: [op] }, ctx);\n}\n\nexport function optionsClassName(mountName: string, method: string): string {\n const methodStem = method.endsWith('Async') ? method.slice(0, -5) : method;\n const prefix = className(mountName);\n if (methodStem.startsWith(prefix)) return `${methodStem}Options`;\n return `${prefix}${methodStem}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}}`, `{Uri.EscapeDataString(${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 modelClassName(resolveModelName(dataField.type.items.name));\n }\n }\n return modelClassName(resolveModelName(itemType.name));\n }\n return mapTypeRef(itemType);\n}\n\nfunction generateCompatibilityMethod(\n mountName: string,\n asyncMethod: string,\n methodStem: 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 groupedParams = collectGroupedParamNames(op);\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const hasVisibleQueryParams =\n op.queryParams.filter((qp) => !hidden.has(qp.name) && !groupedParams.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 } else if (plan.hasBody && op.requestBody) {\n hasVisibleBodyFields = true;\n }\n\n const hasParams = hasVisibleBodyFields || hasVisibleQueryParams || hasGroups;\n const optionsClass = hasParams ? optionsClassName(mountName, methodStem) : null;\n\n let returnType = 'Task';\n if (plan.isPaginated && op.pagination) {\n const itemType = resolveListItemType(op.pagination.itemType, ctx);\n returnType = `Task<WorkOSList<${itemType}>>`;\n } else if (plan.responseModelName) {\n const respType = modelClassName(resolveModelName(plan.responseModelName));\n returnType = !plan.isPaginated && op.response?.kind === 'array' ? `Task<List<${respType}>>` : `Task<${respType}>`;\n }\n\n const params: string[] = [];\n const args: string[] = [];\n for (const p of sortPathParamsByTemplateOrder(op)) {\n const name = localName(p.name);\n params.push(`string ${name}`);\n args.push(name);\n }\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 const bearerLocal = localName(bearerParamName);\n params.push(`string ${bearerLocal}`);\n args.push(bearerLocal);\n }\n\n if (optionsClass) {\n const isRequired = hasVisibleBodyFields && !plan.isPaginated;\n params.push(isRequired ? `${optionsClass} options` : `${optionsClass}? options = null`);\n args.push('options');\n }\n\n params.push('RequestOptions? requestOptions = null');\n params.push('CancellationToken cancellationToken = default');\n args.push('requestOptions');\n args.push('cancellationToken');\n\n lines.push(` /// <summary>Compatibility wrapper for <see cref=\"${asyncMethod}\"/>.</summary>`);\n lines.push(` public virtual ${returnType} ${methodStem}(${params.join(', ')})`);\n lines.push(' {');\n lines.push(` return this.${asyncMethod}(${args.join(', ')});`);\n lines.push(' }');\n\n return lines.join('\\n');\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 fixtureFileName,\n fieldName as csFieldName,\n methodName as csMethodName,\n appendAsyncSuffix,\n modelClassName,\n resolveMethodName,\n resolveMethodStem,\n serviceTypeName,\n} from './naming.js';\nimport { resolveModelName } from './type-map.js';\nimport { resolveResourceClassName, sortPathParamsByTemplateOrder, optionsClassName } from './resources.js';\nimport { generateFixtures, generateModelFixture } from './fixtures.js';\nimport { isListWrapperModel } from './models.js';\nimport {\n groupByMount,\n buildResolvedLookup,\n lookupResolved,\n buildHiddenParams,\n collectGroupedParamNames,\n} 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 = resolveModelName(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 methodStem = resolveCsMethodStem(op, resolvedName, ctx);\n const autoPagingMethod = `${methodStem}AutoPagingAsync`;\n const autoPagingTestName = `Test${autoPagingMethod}`;\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 = modelClassName(resolveModelName(resolved.name));\n fixtureName = fixtureFileName(resolveModelName(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.${autoPagingMethod}(${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${autoPagingMethod}Empty`;\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.${autoPagingMethod}(${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 wrapperMethodStem = csMethodName(wrapper.name);\n const wrapperMethod = appendAsyncSuffix(wrapperMethodStem);\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(resolveModelName(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 ${wrapperMethodStem}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<AuthenticationException>(() => this.service.${method}(${callArgs}));`,\n );\n } else {\n lines.push(\n ` await Assert.ThrowsAsync<AuthenticationException>(() => 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<NotFoundException>(() => 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<UnprocessableEntityException>(() => 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<RateLimitExceededException>(() => 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<ServerException>(() => 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 resolveCsMethodStem(op: Operation, mountName: string, ctx: EmitterContext): string {\n return resolveMethodStem(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 groupedParams = collectGroupedParamNames(op);\n const hasVisibleQueryParams =\n op.queryParams.filter((qp) => !hidden.has(qp.name) && !groupedParams.has(qp.name)).length > 0 ||\n (op.parameterGroups?.length ?? 0) > 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 methodStem = resolveCsMethodStem(op, mountName, ctx);\n const optName = optionsClassName(mountName, methodStem);\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 const groupedParamNames = collectGroupedParamNames(op);\n for (const param of op.queryParams) {\n if (hidden.has(param.name)) continue;\n if (groupedParamNames.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 methodStem = resolveCsMethodStem(op, mountName, ctx);\n const optName = optionsClassName(mountName, methodStem);\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, OperationsMap } from '@workos/oagen';\nimport { resolveMethodName } from './naming.js';\nimport { buildServiceAccessPaths } from './client.js';\nimport { buildResolvedLookup, lookupResolved, getMountTarget } from '../shared/resolved-ops.js';\n\n/**\n * Build operation-to-SDK-method mapping for the manifest.\n */\nexport function buildOperationsMap(spec: ApiSpec, ctx: EmitterContext): OperationsMap {\n const manifest: OperationsMap = {};\n const accessPaths = buildServiceAccessPaths(spec.services, ctx);\n const resolvedLookup = buildResolvedLookup(ctx);\n\n for (const service of spec.services) {\n let serviceProp = accessPaths.get(service.name);\n if (!serviceProp) {\n const mountTarget = getMountTarget(service, ctx);\n serviceProp = accessPaths.get(mountTarget);\n }\n if (!serviceProp) {\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\n // Use per-operation mountOn when it differs from the service default\n const resolved = lookupResolved(op, resolvedLookup);\n const propName = (resolved && accessPaths.get(resolved.mountOn)) ?? serviceProp;\n\n manifest[httpKey] = { sdkMethod: method, service: propName };\n }\n }\n\n return manifest;\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, primeModelAliases, type DiscriminatorContext } 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 { buildOperationsMap } from './manifest.js';\nimport { generateWrapperOptionsClasses } from './wrappers.js';\nimport { groupByMount } from '../shared/resolved-ops.js';\nimport { discriminatedUnions } from './type-map.js';\nimport { modelClassName } from './naming.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\n // Restore fields on discriminated base models. enrichModelsFromSpec clears\n // fields for dispatcher-capable languages; C# uses inheritance instead:\n // the base class keeps its common fields and variant classes extend it.\n const originalByName = new Map(models.map((m) => [m.name, m]));\n const discriminatorBases = new Set<string>();\n const variantToBase = new Map<string, string>();\n const modelDiscriminators = new Map<string, { property: string; mapping: Record<string, string> }>();\n\n const dotnetModels = enriched.map((m) => {\n const disc = (m as any).discriminator;\n if (disc && m.fields.length === 0) {\n const original = originalByName.get(m.name);\n if (original && original.fields.length > 0) {\n discriminatorBases.add(m.name);\n modelDiscriminators.set(m.name, disc);\n for (const variantName of Object.values(disc.mapping) as string[]) {\n variantToBase.set(variantName, m.name);\n }\n return { ...m, fields: original.fields };\n }\n }\n return m;\n });\n\n // Build a map of base model name → discriminator wire-property name so the\n // model emitter can mark the discriminator field as internal-set.\n const discriminatorProperties = new Map<string, string>();\n for (const [baseName, disc] of modelDiscriminators) {\n discriminatorProperties.set(baseName, disc.property);\n }\n\n const discCtx: DiscriminatorContext = { discriminatorBases, variantToBase, discriminatorProperties };\n const files = generateModels(dotnetModels, c, discCtx);\n\n // Generate discriminator converters for oneOf unions with discriminator\n // (union-type references, e.g. a field typed as oneOf 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 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 = modelClassName(modelName);\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 // Generate converters for discriminated base models (model-level\n // discriminators detected by enrichModelsFromSpec, e.g. EventSchema).\n // ReadJson uses Populate (not Deserialize) to avoid infinite recursion\n // with the [JsonConverter] attribute applied to the base class.\n // CanWrite is false so serialization uses the default path and never\n // re-enters WriteJson.\n for (const [baseName, disc] of modelDiscriminators) {\n const baseClass = modelClassName(baseName);\n const converterName = `${baseClass}DiscriminatorConverter`;\n const lines: string[] = [];\n lines.push(`namespace ${c.namespacePascal}`);\n lines.push('{');\n lines.push(' using System;');\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 <see cref=\"${baseClass}\"/> into the`);\n lines.push(` /// correct variant subclass 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 CanWrite => false;');\n lines.push('');\n lines.push(\n ` public override bool CanConvert(Type objectType) => typeof(${baseClass}).IsAssignableFrom(objectType);`,\n );\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('');\n lines.push(' object target;');\n lines.push(' switch (discriminatorValue)');\n lines.push(' {');\n for (const [value, variantModelName] of Object.entries(disc.mapping)) {\n const csName = modelClassName(variantModelName);\n lines.push(` case \"${value}\": target = new ${csName}(); break;`);\n }\n lines.push(` default: target = new ${baseClass}(); break;`);\n lines.push(' }');\n lines.push('');\n lines.push(' serializer.Populate(jObject.CreateReader(), target);');\n lines.push(' return target;');\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(\n ' throw new NotImplementedException(\"Serialization is handled by the default serializer.\");',\n );\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 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 primeModelAliases(enrichModelsFromSpec(c.spec.models));\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 primeModelAliases(enrichModelsFromSpec(c.spec.models));\n return prefixTestPaths(ensureTrailingNewlines(generateTests(spec, c)));\n },\n\n buildOperationsMap(spec: ApiSpec, ctx: EmitterContext) {\n return buildOperationsMap(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: 500,\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.resolve(targetDir, sln);\n const csproj = entries.find((e) => e.endsWith('.csproj'));\n if (csproj) return path.resolve(targetDir, csproj);\n return null;\n}\n","import type { Operation, Service, EmitterContext } from '@workos/oagen';\nimport { toPascalCase, toCamelCase, 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 (matches the primary class). */\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/** camelCase method name. */\nexport function methodName(name: string): string {\n return toCamelCase(name);\n}\n\n/** camelCase Kotlin property / local variable name. */\nexport function propertyName(name: string): string {\n const camel = toCamelCase(name);\n // `object` is a Kotlin reserved word. Instead of backtick-escaping it\n // (forcing callers to write `event.\\`object\\``), rename to `objectType`\n // and rely on @JsonProperty(\"object\") for wire mapping.\n if (camel === 'object') return 'objectType';\n return escapeReserved(camel);\n}\n\n/** camelCase alias (kept for parity with other emitters). */\nexport const fieldName = propertyName;\nexport const localName = propertyName;\n\n/** PascalCase directory segment for a service / mount group. */\nexport function moduleName(name: string): string {\n return toPascalCase(name);\n}\n\n/** Lower-case Kotlin package segment for a service / mount group. */\nexport function packageSegment(name: string): string {\n // Kotlin package convention: all-lowercase, no separators.\n return toPascalCase(name).toLowerCase();\n}\n\n/** Kotlin service class name for a mount group (e.g., `Organizations`). */\nexport function apiClassName(name: string): string {\n if (className(name) === 'SSO') return 'Sso';\n return className(name);\n}\n\n/** Accessor property exposed on the WorkOS client (camelCase). */\nexport function servicePropertyName(name: string): string {\n return toCamelCase(name);\n}\n\n/** Resolve the effective service (mount target) name. */\nexport function resolveServiceName(service: Service, ctx: EmitterContext): string {\n return resolveClassName(service, ctx);\n}\n\n/** Build a map from IR service name -> resolved mount-target name (PascalCase). */\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 method name (camelCase) 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) {\n return trimMountedResourceFromMethod(methodName(resolved), resolveClassName(service, ctx));\n }\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const existing = ctx.overlayLookup?.methodByOperation?.get(httpKey);\n if (existing) {\n return trimMountedResourceFromMethod(methodName(existing.methodName), resolveClassName(service, ctx));\n }\n return trimMountedResourceFromMethod(methodName(op.name), resolveClassName(service, ctx));\n}\n\n/** Resolve the SDK class name (PascalCase) 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 -> mount-target directory (PascalCase). */\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\n/**\n * Trim the mount-target resource words from the start of a method name.\n * E.g. `listOrganizations` on OrganizationsApi becomes `list`.\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/** Kotlin hard/soft keywords that must be back-ticked when used as identifiers. */\nconst KOTLIN_RESERVED = new Set([\n 'as',\n 'break',\n 'class',\n 'continue',\n 'do',\n 'else',\n 'false',\n 'for',\n 'fun',\n 'if',\n 'in',\n 'interface',\n 'is',\n 'null',\n 'object',\n 'package',\n 'return',\n 'super',\n 'this',\n 'throw',\n 'true',\n 'try',\n 'typealias',\n 'typeof',\n 'val',\n 'var',\n 'when',\n 'while',\n]);\n\n/** Escape a Kotlin identifier if it collides with a reserved word. */\nexport function escapeReserved(name: string): string {\n return KOTLIN_RESERVED.has(name) ? `\\`${name}\\`` : name;\n}\n\n/** Escape a string literal for Kotlin source. */\nexport function ktStringLiteral(value: string): string {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r')}\"`;\n}\n\n/** Escape any scalar as a Kotlin literal expression. */\nexport function ktLiteral(value: string | number | boolean): string {\n if (typeof value === 'string') return ktStringLiteral(value);\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\n/**\n * Map a wire field name to the expression that reads it off a WorkOS client\n * instance (used for inferFromClient fields).\n */\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 propertyName(field);\n }\n}\n\n/** Convert snake_case / camelCase to a human-readable lowercase phrase for docs. */\nexport function humanize(name: string): string {\n return name\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase();\n}\n","import type { Enum, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { className, ktStringLiteral } from './naming.js';\n\nconst KOTLIN_SRC_PREFIX = 'src/main/kotlin/';\nconst ENUMS_PACKAGE = 'com.workos.types';\nconst ENUMS_DIR = 'com/workos/types';\n\n/**\n * Mapping from an IR enum name to its canonical enum name. When two enums\n * share identical sorted wire values the shorter-named one is canonical and\n * the others become `typealias` files. Downstream consumers (type-map,\n * resources) use this map to resolve references to the canonical class.\n */\nexport const enumCanonicalMap = new Map<string, string>();\n\n/**\n * Generate Kotlin `enum class` types from the IR enums. Each enum is emitted\n * to its own file under `com.workos.types`, annotated with Jackson\n * `@JsonValue` on the wire value. An `Unknown` sentinel is always the first\n * constant so that responses with new variants still deserialize instead of\n * throwing.\n *\n * Enums with identical sets of wire values are deduplicated: the one with the\n * shortest PascalCase name becomes canonical and the rest emit `typealias`\n * files pointing at the canonical class.\n */\nexport function generateEnums(enums: Enum[], _ctx: EmitterContext): GeneratedFile[] {\n if (enums.length === 0) return [];\n\n // Reset the canonical map on every generation run (guards against re-entry).\n enumCanonicalMap.clear();\n\n // --- Dedup: group enums by a hash of their sorted wire values. ---\n const hashGroups = new Map<string, Enum[]>();\n for (const enumDef of enums) {\n if (enumDef.values.length === 0) continue;\n const hash = enumWireHash(enumDef);\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(enumDef);\n }\n\n // Within each group, pick the shortest className as canonical.\n const aliasOf = new Map<string, string>(); // enum name → canonical enum name\n for (const [, group] of hashGroups) {\n if (group.length <= 1) continue;\n if (group.every(isSharedSortOrderEnum)) {\n const [canonical, ...rest] = [...group].sort((a, b) => a.name.localeCompare(b.name));\n enumCanonicalMap.set(canonical.name, canonical.name);\n for (const enumDef of rest) enumCanonicalMap.set(enumDef.name, 'SortOrder');\n continue;\n }\n const sorted = [...group].sort(\n (a, b) =>\n className(a.name).length - className(b.name).length || className(a.name).localeCompare(className(b.name)),\n );\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n aliasOf.set(sorted[i].name, canonical.name);\n enumCanonicalMap.set(sorted[i].name, canonical.name);\n }\n }\n\n const files: GeneratedFile[] = [];\n\n for (const enumDef of enums) {\n if (enumDef.values.length === 0) continue;\n\n const typeName = canonicalEnumTypeName(enumDef);\n\n // Non-canonical enum: emit a typealias instead of a full enum class.\n const sharedSortEmitter = isSharedSortOrderEnum(enumDef) && enumCanonicalMap.get(enumDef.name) === enumDef.name;\n const canonicalName = sharedSortEmitter\n ? undefined\n : (aliasOf.get(enumDef.name) ?? enumCanonicalMap.get(enumDef.name));\n if (canonicalName) {\n const canonicalType = className(canonicalName);\n // Skip when different IR names collapse to the same output name\n if (typeName === canonicalType) continue;\n const aliasLine = `typealias ${typeName} = ${canonicalType}`;\n // ktlint enforces a 140-char max line length. When the typealias\n // exceeds that, add a @file:Suppress to avoid an unfixable violation.\n const suppressLine = aliasLine.length > 140 ? `@file:Suppress(\"ktlint:standard:max-line-length\")\\n\\n` : '';\n const aliasContent = [\n `${suppressLine}package ${ENUMS_PACKAGE}`,\n '',\n `/** Alias for [${canonicalType}]. */`,\n aliasLine,\n '',\n ].join('\\n');\n files.push({\n path: `${KOTLIN_SRC_PREFIX}${ENUMS_DIR}/${typeName}.kt`,\n content: aliasContent,\n overwriteExisting: true,\n });\n continue;\n }\n\n const lines: string[] = [];\n lines.push(`package ${ENUMS_PACKAGE}`);\n lines.push('');\n lines.push('import com.fasterxml.jackson.annotation.JsonEnumDefaultValue');\n lines.push('import com.fasterxml.jackson.annotation.JsonValue');\n lines.push('');\n // Replace the tautological \"Foo enum.\" docstring with a slightly more\n // informative summary. `Unknown` is emitted as the forward-compatibility\n // sentinel for values the server introduces after this SDK was built.\n lines.push(`/** Enumeration of valid ${typeName} values returned or accepted by the API. */`);\n lines.push(`enum class ${typeName}(`);\n lines.push(' /** The wire value sent to and received from the API. */');\n lines.push(' @JsonValue val value: String');\n lines.push(') {');\n // `@JsonEnumDefaultValue` makes Jackson's\n // READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE feature map unrecognized\n // wire values onto `Unknown` instead of throwing — required for forward\n // compatibility when the API introduces new variants.\n lines.push(' @JsonEnumDefaultValue');\n lines.push(` Unknown(${ktStringLiteral('unknown')}),`);\n\n const seenNames = new Set<string>(['Unknown']);\n const seenWire = new Set<string>(['unknown']);\n const members: string[] = [];\n\n for (const v of enumDef.values) {\n const wire = String(v.value);\n if (seenWire.has(wire)) continue;\n seenWire.add(wire);\n\n let memberName = className(wire);\n if (!memberName || /^[0-9]/.test(memberName)) memberName = `Value${memberName || wire}`;\n if (memberName === typeName || seenNames.has(memberName)) {\n let suffix = 2;\n while (seenNames.has(`${memberName}${suffix}`)) suffix += 1;\n memberName = `${memberName}${suffix}`;\n }\n seenNames.add(memberName);\n\n if (v.description?.trim()) {\n members.push(` /** ${escapeKdoc(v.description.split('\\n')[0].trim())} */`);\n }\n if (v.deprecated) {\n members.push(' @Deprecated(\"Deprecated enum value\")');\n }\n members.push(` ${memberName}(${ktStringLiteral(wire)})`);\n }\n\n for (let i = 0; i < members.length; i++) {\n const isLast = i === members.length - 1;\n const line = members[i];\n const trimmedStart = line.trimStart();\n if (trimmedStart.startsWith('/**') || trimmedStart.startsWith('@')) {\n lines.push(line);\n continue;\n }\n lines.push(isLast ? line : `${line},`);\n }\n\n lines.push('}');\n lines.push('');\n\n files.push({\n path: `${KOTLIN_SRC_PREFIX}${ENUMS_DIR}/${typeName}.kt`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\nfunction canonicalEnumTypeName(enumDef: Enum): string {\n return isSharedSortOrderEnum(enumDef) ? 'SortOrder' : className(enumDef.name);\n}\n\nfunction isSharedSortOrderEnum(enumDef: Enum): boolean {\n const wireValues = [...new Set(enumDef.values.map((value) => String(value.value).toLowerCase()))].sort();\n return wireValues.length === 2 && wireValues[0] === 'asc' && wireValues[1] === 'desc';\n}\n\n/** Hash an enum by its sorted wire values so identical enums collide. */\nfunction enumWireHash(enumDef: Enum): string {\n return [...enumDef.values]\n .map((v) => String(v.value))\n .sort()\n .join('|');\n}\n\nfunction escapeKdoc(s: string): string {\n return s.replace(/\\*\\//g, '*\\u200b/');\n}\n","import type { TypeRef, PrimitiveType, UnionType } from '@workos/oagen';\nimport { mapTypeRef as irMapTypeRef } from '@workos/oagen';\nimport { className } from './naming.js';\nimport { enumCanonicalMap } from './enums.js';\n\n/** Resolve an enum name through the canonical map (identity when no alias). */\nfunction resolveEnumName(name: string): string {\n return className(enumCanonicalMap.get(name) ?? name);\n}\n\n/**\n * Map an IR TypeRef to a non-nullable Kotlin type expression.\n *\n * Kotlin's type system marks nullability at use-sites (`T?`). Optional fields\n * on generated models append `?` to the output of this function.\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) => resolveEnumName(r.name),\n union: (r, variants) => joinUnionVariants(r, variants),\n nullable: (_ref, inner) => (inner.endsWith('?') ? inner : `${inner}?`),\n literal: (r) => {\n if (r.value === null) return 'Any?';\n if (typeof r.value === 'string') return 'String';\n if (typeof r.value === 'number') return Number.isInteger(r.value) ? 'Long' : 'Double';\n if (typeof r.value === 'boolean') return 'Boolean';\n return 'Any';\n },\n map: (_ref, value) => `Map<String, ${value}>`,\n });\n}\n\n/**\n * Map an IR TypeRef to a nullable Kotlin type expression (always appends `?`).\n * Useful for optional fields on models / request options.\n */\nexport function mapTypeRefOptional(ref: TypeRef): string {\n const baseType = mapTypeRef(ref);\n return baseType.endsWith('?') ? baseType : `${baseType}?`;\n}\n\n/**\n * Is the given IR TypeRef a primitive value? Useful when deciding whether a\n * nullable field needs an explicit `= null` default.\n */\nexport function isValueTypeRef(ref: TypeRef): boolean {\n if (ref.kind === 'enum') return true;\n if (ref.kind === 'primitive') {\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\nfunction mapPrimitive(ref: PrimitiveType): string {\n if (ref.format === 'binary') return 'ByteArray';\n if (ref.format === 'int32') return 'Int';\n if (ref.format === 'int64') return 'Long';\n if (ref.format === 'date-time') return 'OffsetDateTime';\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 'Boolean';\n case 'unknown':\n return 'Any';\n }\n}\n\n/**\n * Track discriminated unions so the model generator can emit the appropriate\n * Jackson `@JsonTypeInfo` / `@JsonSubTypes` annotations on the sealed parent.\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] ?? 'Any';\n }\n const unique = [...new Set(variants)];\n if (unique.length === 1) return unique[0];\n\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 the base sealed type; Jackson @JsonTypeInfo handles variant selection.\n return baseName;\n }\n\n // Non-discriminated unions fall back to the Kotlin top type. A generic\n // AnyOf<> is planned for a future phase if emitter tests prove it necessary.\n return 'Any';\n}\n\n/** Kotlin imports implied by a given type expression. Caller collects into a set. */\nexport function implicitImportsFor(kotlinType: string): string[] {\n const imports: string[] = [];\n if (/\\bOffsetDateTime\\b/.test(kotlinType)) {\n imports.push('java.time.OffsetDateTime');\n }\n return imports;\n}\n","import type { Model, EmitterContext, GeneratedFile, TypeRef, Field } from '@workos/oagen';\nimport { mapTypeRef, discriminatedUnions } from './type-map.js';\nimport { className, propertyName, ktStringLiteral, humanize } from './naming.js';\nimport { enumCanonicalMap } from './enums.js';\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\n\nconst KOTLIN_SRC_PREFIX = 'src/main/kotlin/';\nconst MODELS_PACKAGE = 'com.workos.models';\nconst MODELS_DIR = 'com/workos/models';\n\n/**\n * Generate Kotlin `data class` models. Each model becomes a separate `.kt`\n * file under `com.workos.models`. Discriminated unions emit a sealed class\n * with Jackson `@JsonTypeInfo` / `@JsonSubTypes` annotations so the base type\n * picks the right variant at deserialization time.\n *\n * List wrappers (`{ data, list_metadata }`) and the shared `ListMetadata`\n * model are skipped — the hand-maintained runtime provides [Page]/[ListMetadata].\n */\nexport function generateModels(models: Model[], _ctx: EmitterContext): GeneratedFile[] {\n if (models.length === 0) return [];\n\n // First pass: call mapTypeRef on every model field so discriminator info is\n // registered before we start emitting parents.\n for (const model of models) {\n for (const field of model.fields) mapTypeRef(field.type);\n }\n\n const files: GeneratedFile[] = [];\n\n // Deduplication: identical structures become typealiases.\n // Pass 1: hash without nested-alias resolution.\n modelAliasMap = null;\n const hashGroupsPass1 = new Map<string, string[]>();\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n if (model.fields.length === 0 && discriminatedUnions.has(className(model.name))) continue;\n const hash = structuralHash(model);\n if (!hashGroupsPass1.has(hash)) hashGroupsPass1.set(hash, []);\n hashGroupsPass1.get(hash)!.push(model.name);\n }\n\n const aliasOf = new Map<string, string>();\n for (const [hash, names] of hashGroupsPass1) {\n if (names.length <= 1 || hash === '') continue;\n const sorted = [...names].sort(preferShorterCanonical);\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n if (hasRequestSuffix(sorted[i]) !== hasRequestSuffix(canonical)) continue;\n aliasOf.set(sorted[i], canonical);\n }\n }\n\n // Pass 2: re-hash with the alias map so models whose only difference was\n // referencing aliased vs canonical nested types now collide.\n modelAliasMap = aliasOf;\n const hashGroupsPass2 = new Map<string, string[]>();\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n if (model.fields.length === 0 && discriminatedUnions.has(className(model.name))) continue;\n if (aliasOf.has(model.name)) continue; // already aliased in pass 1\n const hash = structuralHash(model);\n if (!hashGroupsPass2.has(hash)) hashGroupsPass2.set(hash, []);\n hashGroupsPass2.get(hash)!.push(model.name);\n }\n for (const [hash, names] of hashGroupsPass2) {\n if (names.length <= 1 || hash === '') continue;\n const sorted = [...names].sort(preferShorterCanonical);\n const canonical = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n if (aliasOf.has(sorted[i])) continue;\n if (hasRequestSuffix(sorted[i]) !== hasRequestSuffix(canonical)) continue;\n aliasOf.set(sorted[i], canonical);\n }\n }\n\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n const typeName = className(model.name);\n\n // Parent of a discriminated union: emit a sealed class.\n if (model.fields.length === 0 && discriminatedUnions.has(typeName)) {\n files.push(emitSealedUnion(typeName, discriminatedUnions.get(typeName)!));\n continue;\n }\n\n const canonical = aliasOf.get(model.name);\n if (canonical) {\n const canonicalType = className(canonical);\n // Skip when different IR names collapse to the same output name\n if (typeName === canonicalType) continue;\n const aliasContent = [\n `package ${MODELS_PACKAGE}`,\n '',\n `/** Alias for [${canonicalType}]. */`,\n `typealias ${typeName} = ${canonicalType}`,\n '',\n ].join('\\n');\n files.push({\n path: `${KOTLIN_SRC_PREFIX}${MODELS_DIR}/${typeName}.kt`,\n content: aliasContent,\n overwriteExisting: true,\n });\n continue;\n }\n\n files.push(emitDataClass(model));\n }\n\n // Generate the sealed WorkOSEvent interface. Collect all event envelope\n // models that have a literal `event` field and build the @JsonSubTypes\n // mapping so Jackson can deserialize directly to the correct concrete type.\n const eventMapping: Array<{ wireValue: string; modelName: string }> = [];\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n if (aliasOf.has(model.name)) continue;\n if (!isEventEnvelopeModel(model)) continue;\n const eventField = model.fields.find((f) => f.name === 'event');\n if (eventField && eventField.type.kind === 'literal' && typeof eventField.type.value === 'string') {\n eventMapping.push({ wireValue: eventField.type.value, modelName: model.name });\n }\n }\n if (eventMapping.length > 0) {\n files.push(emitWorkOSEvent(eventMapping));\n }\n\n return files;\n}\n\n/**\n * Detect whether a model follows the webhook event envelope pattern:\n * has required `id`, `event`, `created_at` fields plus a `data` field.\n */\nfunction isEventEnvelopeModel(model: Model): boolean {\n const fieldNames = new Set(model.fields.map((f) => f.name));\n return fieldNames.has('id') && fieldNames.has('event') && fieldNames.has('created_at') && fieldNames.has('data');\n}\n\nfunction emitDataClass(model: Model): GeneratedFile {\n const typeName = className(model.name);\n const imports = collectImports(model.fields);\n const implementsEvent = isEventEnvelopeModel(model);\n // WorkOSEvent sealed interface is generated in the same package — no import needed.\n const lines: string[] = [];\n lines.push(`package ${MODELS_PACKAGE}`);\n lines.push('');\n for (const imp of [...imports].sort()) lines.push(`import ${imp}`);\n if (imports.size > 0) lines.push('');\n\n appendKdoc(lines, model.description ?? `${typeName} model.`, 0);\n\n if (model.fields.length === 0) {\n // Kotlin data classes require at least one primary constructor param.\n // Use a regular empty class instead.\n lines.push(`class ${typeName}`);\n lines.push('');\n } else {\n const implClause = implementsEvent ? ' : WorkOSEvent' : '';\n lines.push(`data class ${typeName}(`);\n\n // Emit non-defaulted params first, then defaulted — Kotlin requires\n // non-defaulted params before defaulted ones. Literal-typed fields always\n // receive a default, so they sort after plain required fields.\n const hasDefault = (f: Field): boolean => !f.required || f.type.kind === 'literal';\n const ordered = [...model.fields].sort((a, b) => {\n const aDef = hasDefault(a);\n const bDef = hasDefault(b);\n if (aDef === bDef) return 0;\n return aDef ? 1 : -1;\n });\n // When implementing WorkOSEvent, matching fields need `override`.\n const overrideFields = implementsEvent ? new Set(['id', 'event', 'createdAt']) : new Set<string>();\n const rendered = renderFields(ordered, overrideFields);\n for (let i = 0; i < rendered.length; i++) {\n const suffix = i === rendered.length - 1 ? '' : ',';\n lines.push(`${rendered[i]}${suffix}`);\n }\n\n lines.push(`)${implClause}`);\n lines.push('');\n }\n\n return {\n path: `${KOTLIN_SRC_PREFIX}${MODELS_DIR}/${typeName}.kt`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction emitSealedUnion(\n typeName: string,\n disc: { property: string; mapping: Record<string, string>; variantTypes: string[] },\n): GeneratedFile {\n const lines: string[] = [];\n lines.push(`package ${MODELS_PACKAGE}`);\n lines.push('');\n lines.push('import com.fasterxml.jackson.annotation.JsonSubTypes');\n lines.push('import com.fasterxml.jackson.annotation.JsonTypeInfo');\n lines.push('');\n appendKdoc(lines, `Discriminated union over ${typeName} variants. Selected by \\`${disc.property}\\`.`, 0);\n lines.push('@JsonTypeInfo(');\n lines.push(' use = JsonTypeInfo.Id.NAME,');\n lines.push(' include = JsonTypeInfo.As.EXISTING_PROPERTY,');\n lines.push(` property = ${ktStringLiteral(disc.property)},`);\n lines.push(' visible = true');\n lines.push(')');\n lines.push('@JsonSubTypes(');\n const entries = Object.entries(disc.mapping);\n for (let i = 0; i < entries.length; i++) {\n const [wireValue, modelName] = entries[i];\n const variantType = className(modelName);\n const suffix = i === entries.length - 1 ? '' : ',';\n lines.push(` JsonSubTypes.Type(value = ${variantType}::class, name = ${ktStringLiteral(wireValue)})${suffix}`);\n }\n lines.push(')');\n lines.push(`sealed class ${typeName}`);\n lines.push('');\n\n return {\n path: `${KOTLIN_SRC_PREFIX}${MODELS_DIR}/${typeName}.kt`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\n/**\n * Emit the sealed `WorkOSEvent` interface with Jackson discriminated\n * deserialization. Each concrete event model (UserCreated, DsyncUserUpdated,\n * etc.) already extends this interface. The `@JsonSubTypes` annotation lets\n * Jackson pick the right subclass when deserializing JSON with an `event`\n * discriminator field. `EventSchema` is the fallback for unknown event types.\n */\nfunction emitWorkOSEvent(eventMapping: Array<{ wireValue: string; modelName: string }>): GeneratedFile {\n const lines: string[] = [];\n lines.push(`package ${MODELS_PACKAGE}`);\n lines.push('');\n lines.push('import com.fasterxml.jackson.annotation.JsonSubTypes');\n lines.push('import com.fasterxml.jackson.annotation.JsonTypeInfo');\n lines.push('import java.time.OffsetDateTime');\n lines.push('');\n\n lines.push('/**');\n lines.push(' * Sealed interface for all webhook/event envelope models.');\n lines.push(' *');\n lines.push(' * Jackson deserializes incoming event JSON to the correct concrete type');\n lines.push(' * based on the `event` discriminator field. Unknown event types fall back');\n lines.push(' * to [EventSchema] with untyped `data: Map<String, Any>`.');\n lines.push(' *');\n lines.push(' * ```kotlin');\n lines.push(' * val event: WorkOSEvent = objectMapper.readValue(json, WorkOSEvent::class.java)');\n lines.push(' * when (event) {');\n lines.push(' * is UserCreated -> println(\"User created: ${event.data.id}\")');\n lines.push(' * is EventSchema -> println(\"Unknown event: ${event.event}\")');\n lines.push(' * }');\n lines.push(' * ```');\n lines.push(' */');\n\n lines.push('@JsonTypeInfo(');\n lines.push(' use = JsonTypeInfo.Id.NAME,');\n lines.push(' include = JsonTypeInfo.As.EXISTING_PROPERTY,');\n lines.push(' property = \"event\",');\n lines.push(' visible = true,');\n lines.push(' defaultImpl = EventSchema::class');\n lines.push(')');\n lines.push('@JsonSubTypes(');\n // Sort entries for stable output\n const sorted = [...eventMapping].sort((a, b) => a.wireValue.localeCompare(b.wireValue));\n for (let i = 0; i < sorted.length; i++) {\n const { wireValue, modelName } = sorted[i];\n const typeName = className(modelName);\n const suffix = i === sorted.length - 1 ? '' : ',';\n lines.push(` JsonSubTypes.Type(value = ${typeName}::class, name = ${ktStringLiteral(wireValue)})${suffix}`);\n }\n lines.push(')');\n lines.push('sealed interface WorkOSEvent {');\n lines.push(' /** Unique identifier for this event. */');\n lines.push(' val id: String');\n lines.push('');\n lines.push(' /** The event type identifier. */');\n lines.push(' val event: String');\n lines.push('');\n lines.push(' /** Timestamp when the event was created. */');\n lines.push(' val createdAt: OffsetDateTime');\n lines.push('}');\n lines.push('');\n\n return {\n path: `${KOTLIN_SRC_PREFIX}${MODELS_DIR}/WorkOSEvent.kt`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction renderFields(fields: Field[], overrideFields: Set<string> = new Set()): string[] {\n const seen = new Set<string>();\n const lines: string[] = [];\n\n for (const field of fields) {\n const kotlinName = propertyName(field.name);\n if (seen.has(kotlinName)) continue;\n seen.add(kotlinName);\n\n const baseType = mapTypeRef(field.type);\n let kotlinType: string;\n let defaultExpr: string | null = null;\n\n // Const literal fields: emit a hardcoded default matching the literal\n // value so callers don't have to pass it — but only when the field is\n // required. Optional literal fields must default to null so that absent\n // keys round-trip correctly.\n const literalDefault = literalDefaultExpr(field.type);\n\n if (literalDefault !== null && field.required) {\n kotlinType = baseType;\n defaultExpr = literalDefault;\n } else if (!field.required) {\n kotlinType = baseType.endsWith('?') ? baseType : `${baseType}?`;\n defaultExpr = 'null';\n } else if (baseType.endsWith('?')) {\n // Required field whose underlying type is already nullable.\n kotlinType = baseType;\n } else {\n kotlinType = baseType;\n }\n\n const isOverride = overrideFields.has(kotlinName);\n const annotations: string[] = [];\n // Omit @JvmField so Kotlin generates proper getter methods (getId(),\n // isEmailVerified(), etc.) for Java callers — matching the accessor\n // convention used by Stripe, AWS SDK v2, and Twilio.\n annotations.push(`@JsonProperty(${ktStringLiteral(field.name)})`);\n if (field.deprecated) annotations.push('@Deprecated(\"Deprecated field\")');\n\n const paramParts: string[] = [];\n if (field.description?.trim()) {\n const line = field.description.split('\\n').find((l) => l.trim()) ?? '';\n lines.push(` /** ${escapeKdoc(line.trim())} */`);\n } else if (literalDefault !== null) {\n lines.push(` /** Always \\`${literalDefault}\\`. */`);\n } else {\n lines.push(` /** The ${humanize(field.name)}. */`);\n }\n for (const anno of annotations) lines.push(` ${anno}`);\n\n const overridePrefix = isOverride ? 'override ' : '';\n const rendered = ` ${overridePrefix}val ${kotlinName}: ${kotlinType}`;\n paramParts.push(rendered);\n if (defaultExpr !== null) paramParts[0] = `${paramParts[0]} = ${defaultExpr}`;\n lines.push(paramParts[0]);\n }\n // Collapse annotation + val pairs into a list where each contiguous block\n // becomes one field entry, preserving order.\n return collapseFieldEntries(lines);\n}\n\nfunction collapseFieldEntries(rawLines: string[]): string[] {\n // `rawLines` intermixes kdoc comments, annotations, and `val` declarations.\n // Group them so each field is a single multi-line entry, so the caller can\n // append a trailing comma at the right spot.\n const entries: string[] = [];\n let current: string[] = [];\n for (const line of rawLines) {\n const trimmed = line.trimStart();\n const isDeclaration = trimmed.startsWith('val ') || trimmed.startsWith('override val ');\n current.push(line);\n if (isDeclaration) {\n entries.push(current.join('\\n'));\n current = [];\n }\n }\n if (current.length > 0) entries.push(current.join('\\n'));\n return entries;\n}\n\n/**\n * If the TypeRef is a literal (const) with a string, number, or boolean value,\n * return the Kotlin expression for that default. Otherwise return null.\n */\nfunction literalDefaultExpr(ref: TypeRef): string | null {\n if (ref.kind !== 'literal' || ref.value === null) return null;\n if (typeof ref.value === 'string') return ktStringLiteral(ref.value);\n if (typeof ref.value === 'number') return Number.isInteger(ref.value) ? `${ref.value}L` : String(ref.value);\n if (typeof ref.value === 'boolean') return ref.value ? 'true' : 'false';\n return null;\n}\n\nfunction collectImports(fields: Field[]): Set<string> {\n const imports = new Set<string>();\n if (fields.length === 0) return imports;\n imports.add('com.fasterxml.jackson.annotation.JsonProperty');\n for (const field of fields) {\n const mapped = mapTypeRef(field.type);\n if (/\\bOffsetDateTime\\b/.test(mapped)) imports.add('java.time.OffsetDateTime');\n for (const enumName of collectEnumNames(field.type)) {\n // Resolve through the canonical map so imports point at the actual\n // enum class, not an alias that may not have its own file.\n const canonical = enumCanonicalMap.get(enumName) ?? enumName;\n imports.add(`com.workos.types.${className(canonical)}`);\n }\n }\n return imports;\n}\n\nfunction collectEnumNames(ref: TypeRef, acc: Set<string> = new Set()): Set<string> {\n if (ref.kind === 'enum') acc.add(ref.name);\n else if (ref.kind === 'array') collectEnumNames(ref.items, acc);\n else if (ref.kind === 'map') collectEnumNames(ref.valueType, acc);\n else if (ref.kind === 'nullable') collectEnumNames(ref.inner, acc);\n else if (ref.kind === 'union') for (const v of ref.variants) collectEnumNames(v, acc);\n return acc;\n}\n\nfunction appendKdoc(lines: string[], text: string, indent: number): void {\n const pad = ' '.repeat(indent);\n const firstLine = text.split('\\n').find((l) => l.trim()) ?? '';\n lines.push(`${pad}/** ${escapeKdoc(firstLine.trim())} */`);\n}\n\nfunction escapeKdoc(s: string): string {\n return s.replace(/\\*\\//g, '*\\u200b/');\n}\n\n// Re-exported so downstream emitters (resources, tests) can filter wrapper models.\nexport { isListWrapperModel, isListMetadataModel };\n\n// --- Canonical name selection ---\n\n/**\n * When picking which model name should be the concrete class (canonical) vs.\n * a typealias, prefer shorter names first (they tend to be the public-facing\n * names like `User`, `Role`), then fall back to alphabetical order for\n * stability. This avoids situations where `User = EmailChangeConfirmationUser`\n * or `SlimRole = AddRolePermission`.\n */\nfunction preferShorterCanonical(a: string, b: string): number {\n const aName = className(a);\n const bName = className(b);\n if (aName.length !== bName.length) return aName.length - bName.length;\n return aName.localeCompare(bName);\n}\n\n// --- Unsafe typealias guard ---\n\n/** Suffixes that indicate a request / mutation DTO. */\nconst REQUEST_SUFFIXES = /(?:Dto|Request|Create|Update|Add|Remove|Set)$/i;\n\n/**\n * Returns true when [name] looks like a request DTO based on its suffix.\n * Used to prevent aliasing request DTOs to response models that happen to\n * share the same field shapes today.\n */\nfunction hasRequestSuffix(name: string): boolean {\n return REQUEST_SUFFIXES.test(className(name));\n}\n\n// --- Structural dedup ---\n\n/**\n * Resolve a model name through the alias map so that two models referencing\n * aliased nested types produce the same structural hash. Called after the\n * first alias pass to catch transitive matches.\n */\nlet modelAliasMap: Map<string, string> | null = null;\n\nfunction normalizeTypeForHash(ref: TypeRef): unknown {\n if (ref.kind === 'enum') {\n const vals = ref.values ? [...ref.values].sort() : [];\n return { kind: 'enum', values: vals };\n }\n if (ref.kind === 'model') {\n // Resolve through the alias map so `FooData` and `BarData` (aliased to\n // FooData) produce the same hash when referenced as nested types.\n const resolved = modelAliasMap?.get(ref.name) ?? ref.name;\n return { kind: 'model', name: resolved };\n }\n if (ref.kind === 'nullable') return { kind: 'nullable', inner: normalizeTypeForHash(ref.inner) };\n if (ref.kind === 'array') return { kind: 'array', items: normalizeTypeForHash(ref.items) };\n if (ref.kind === 'union') return { kind: 'union', variants: ref.variants.map(normalizeTypeForHash) };\n if (ref.kind === 'map') return { kind: 'map', valueType: normalizeTypeForHash(ref.valueType) };\n return ref;\n}\n\nfunction structuralHash(model: Model): string {\n return model.fields\n .map((f) => `${f.name}:${JSON.stringify(normalizeTypeForHash(f.type))}:${f.required}`)\n .sort()\n .join('|');\n}\n","import type { EmitterContext, ResolvedOperation, ResolvedWrapper, Parameter } from '@workos/oagen';\nimport { className, propertyName, ktLiteral, clientFieldExpression, escapeReserved } from './naming.js';\nimport { mapTypeRef, mapTypeRefOptional } from './type-map.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\nimport { sortPathParamsByTemplateOrder } from './resources.js';\n\n/**\n * Emit Kotlin wrapper methods for a union-split operation. Each wrapper\n * method takes only the fields it needs for its variant, fills in the\n * operation-level defaults and client-inferred values, and posts to the\n * underlying operation.\n *\n * Returns a list of lines (with leading indentation suitable for inclusion\n * inside the service class body).\n */\nexport function generateWrapperMethods(resolvedOp: ResolvedOperation, ctx: EmitterContext): string[] {\n if (!resolvedOp.wrappers || resolvedOp.wrappers.length === 0) return [];\n\n const out: string[] = [];\n for (const wrapper of resolvedOp.wrappers) {\n if (out.length > 0) out.push('');\n for (const line of emitWrapperMethod(resolvedOp, wrapper, ctx)) out.push(line);\n }\n return out;\n}\n\nfunction emitWrapperMethod(resolvedOp: ResolvedOperation, wrapper: ResolvedWrapper, ctx: EmitterContext): string[] {\n const op = resolvedOp.operation;\n const method = propertyName(wrapper.name);\n const resolvedParams = resolveWrapperParams(wrapper, ctx);\n const responseClass = wrapper.responseModelName ? className(wrapper.responseModelName) : null;\n\n const pathParams = sortPathParamsByTemplateOrder(op);\n\n const lines: string[] = [];\n\n // Build KDoc from operation description + @param docs for each wrapper param.\n const kdocLines: string[] = [];\n const opDesc = (op.description ?? '').trim();\n const wrapperHumanName = method.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n if (opDesc) {\n kdocLines.push(opDesc.split('\\n')[0]);\n } else {\n kdocLines.push(`${wrapperHumanName.charAt(0).toUpperCase()}${wrapperHumanName.slice(1)}.`);\n }\n const paramDocs: string[] = [];\n for (const pp of pathParams) {\n if (pp.description?.trim()) {\n paramDocs.push(`@param ${propertyName(pp.name)} ${escapeKdoc(pp.description.split('\\n')[0].trim())}`);\n }\n }\n for (const rp of resolvedParams) {\n const desc = rp.field?.description?.trim();\n if (desc) {\n paramDocs.push(`@param ${propertyName(rp.paramName)} ${escapeKdoc(desc.split('\\n')[0])}`);\n }\n }\n if (responseClass) {\n paramDocs.push(`@return the ${responseClass}`);\n }\n if (paramDocs.length > 0 || kdocLines.length > 0) {\n lines.push(' /**');\n for (const l of kdocLines) lines.push(` * ${escapeKdoc(l)}`);\n if (paramDocs.length > 0) {\n lines.push(' *');\n for (const p of paramDocs) lines.push(` * ${p}`);\n }\n lines.push(' */');\n }\n\n lines.push(' @JvmOverloads');\n\n // Build the method parameter list: path params, wrapper params, requestOptions\n const params: string[] = [];\n for (const pp of pathParams) params.push(` ${propertyName(pp.name)}: String`);\n for (const rp of resolvedParams) {\n const paramName = propertyName(rp.paramName);\n const kotlinType = rp.field\n ? rp.isOptional\n ? mapTypeRefOptional(rp.field.type)\n : mapTypeRef(rp.field.type)\n : rp.isOptional\n ? 'String?'\n : 'String';\n const trailer = rp.isOptional ? ' = null' : '';\n params.push(` ${paramName}: ${kotlinType}${trailer}`);\n }\n params.push(' requestOptions: RequestOptions? = null');\n\n const returnClause = responseClass ? `: ${responseClass}` : '';\n if (params.length === 1) {\n const single = params[0].replace(/^\\s+/, '');\n lines.push(` fun ${escapeReserved(method)}(${single})${returnClause} {`);\n } else {\n lines.push(` fun ${escapeReserved(method)}(`);\n for (let i = 0; i < params.length; i++) {\n const suffix = i === params.length - 1 ? '' : ',';\n lines.push(`${params[i]}${suffix}`);\n }\n lines.push(` )${returnClause} {`);\n }\n\n // Build body using bodyOf() — consistent with non-wrapper methods.\n // bodyOf() automatically drops null optional values.\n const bodyEntries: string[] = [];\n for (const rp of resolvedParams) {\n const paramName = propertyName(rp.paramName);\n bodyEntries.push(` ${ktLiteral(rp.paramName)} to ${paramName}`);\n }\n for (const [k, v] of Object.entries(wrapper.defaults ?? {})) {\n bodyEntries.push(` ${ktLiteral(k)} to ${ktLiteral(v)}`);\n }\n for (const k of wrapper.inferFromClient ?? []) {\n bodyEntries.push(` ${ktLiteral(k)} to workos.${clientFieldExpression(k)}`);\n }\n if (bodyEntries.length > 0) {\n lines.push(` val body =`);\n lines.push(` bodyOf(`);\n for (let i = 0; i < bodyEntries.length; i++) {\n const sep = i === bodyEntries.length - 1 ? '' : ',';\n lines.push(` ${bodyEntries[i]}${sep}`);\n }\n lines.push(` )`);\n } else {\n lines.push(` val body = linkedMapOf<String, Any?>()`);\n }\n\n const pathExpr = buildPathExpr(op.path, pathParams);\n const httpMethod = op.httpMethod.toUpperCase();\n\n lines.push(` val config =`);\n lines.push(` RequestConfig(`);\n lines.push(` method = ${ktLiteral(httpMethod)},`);\n lines.push(` path = ${pathExpr},`);\n lines.push(` body = body,`);\n if (op.requestBodyEncoding === 'form-urlencoded') {\n // Some ops (SSO token, User Management authenticate) are form-encoded.\n // Rewrite as formBody mapping string→string instead of JSON body.\n // Fallback: leave body as JSON — the API accepts JSON for these too.\n }\n lines.push(` requestOptions = requestOptions`);\n lines.push(` )`);\n\n if (responseClass) {\n lines.push(` return workos.baseClient.request(config, ${responseClass}::class.java)`);\n } else {\n lines.push(` workos.baseClient.requestVoid(config)`);\n }\n\n lines.push(' }');\n return lines;\n}\n\nfunction escapeKdoc(s: string): string {\n return s.replace(/\\*\\//g, '*\\u200b/');\n}\n\nfunction buildPathExpr(path: string, pathParams: Parameter[]): string {\n if (pathParams.length === 0) return ktLiteral(path);\n let result = path;\n for (const pp of pathParams) {\n const placeholder = `{${pp.name}}`;\n const propName = propertyName(pp.name);\n const replacement = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(propName) ? `\\$${propName}` : `\\${${propName}}`;\n result = result.replaceAll(placeholder, replacement);\n }\n return `\"${result.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n}\n","import type { Operation } from '@workos/oagen';\n\n/**\n * Operations whose generated implementation would be wrong (URL builders\n * served as HTTP calls). Hand-maintained code in `workos-kotlin` owns these\n * method names instead; the emitter must skip resources, tests, and the\n * smoke manifest for any operation in this set.\n *\n * Keys are `\"METHOD path\"` in the same form used by the smoke manifest.\n */\nexport const HANDWRITTEN_OVERRIDE_OPS: ReadonlySet<string> = new Set([\n // AuthKit authorization URL (H09 / H10 are hand-built).\n 'GET /user_management/authorize',\n // AuthKit logout URL (H17 — URL, not HTTP call).\n 'GET /user_management/sessions/logout',\n // SSO authorization URL (H14 / H15 are hand-built).\n 'GET /sso/authorize',\n // SSO logout URL (H17 — URL, not HTTP call).\n 'GET /sso/logout',\n]);\n\n/** True if the operation is owned by a hand-maintained override. */\nexport function isHandwrittenOverride(op: Operation): boolean {\n return HANDWRITTEN_OVERRIDE_OPS.has(`${op.httpMethod.toUpperCase()} ${op.path}`);\n}\n","import type {\n Service,\n Operation,\n Parameter,\n EmitterContext,\n GeneratedFile,\n ResolvedOperation,\n Model,\n TypeRef,\n Field,\n} from '@workos/oagen';\nimport { planOperation } from '@workos/oagen';\nimport { mapTypeRef, mapTypeRefOptional, implicitImportsFor } from './type-map.js';\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\nimport { enumCanonicalMap } from './enums.js';\nimport {\n className,\n propertyName,\n apiClassName,\n packageSegment,\n resolveMethodName,\n ktLiteral,\n clientFieldExpression,\n escapeReserved,\n humanize,\n} from './naming.js';\nimport {\n buildResolvedLookup,\n lookupResolved,\n groupByMount,\n buildHiddenParams,\n getOpDefaults,\n getOpInferFromClient,\n collectGroupedParamNames,\n collectBodyFieldTypes,\n} from '../shared/resolved-ops.js';\nimport { generateWrapperMethods } from './wrappers.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\nimport { isHandwrittenOverride } from './overrides.js';\n\nconst KOTLIN_SRC_PREFIX = 'src/main/kotlin/';\n\n/**\n * Generate one API class per mount group. Methods map 1:1 to IR operations.\n * Path params, query params, and body fields are flattened into the method\n * signature so callers never need to construct an intermediate options object.\n */\nexport function generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n if (services.length === 0) return [];\n\n const mountGroups = groupByMount(ctx);\n if (mountGroups.size === 0) return [];\n\n const files: GeneratedFile[] = [];\n const resolvedLookup = buildResolvedLookup(ctx);\n\n for (const [mountName, group] of mountGroups) {\n const classCode = generateApiClass(mountName, group.operations, ctx, resolvedLookup);\n if (!classCode) continue;\n const pkg = packageSegment(mountName);\n files.push({\n path: `${KOTLIN_SRC_PREFIX}com/workos/${pkg}/${apiClassName(mountName)}.kt`,\n content: classCode,\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\nfunction generateApiClass(\n mountName: string,\n operations: Operation[],\n ctx: EmitterContext,\n resolvedLookup: Map<string, ResolvedOperation>,\n): string | null {\n if (operations.length === 0) return null;\n const apiClass = apiClassName(mountName);\n const pkg = `com.workos.${packageSegment(mountName)}`;\n\n const imports = new Set<string>();\n imports.add('com.workos.WorkOS');\n imports.add('com.workos.common.http.Page');\n imports.add('com.workos.common.http.RequestConfig');\n imports.add('com.workos.common.http.RequestOptions');\n\n const body: string[] = [];\n const seenMethods = new Set<string>();\n const hasAuthenticateHelper = operations.some(\n (op) => op.path === '/user_management/authenticate' && op.httpMethod.toUpperCase() === 'POST',\n );\n\n if (hasAuthenticateHelper) {\n imports.add('com.workos.common.http.bodyOf');\n imports.add('com.workos.models.AuthenticateResponse');\n body.push(...generateAuthenticateHelper());\n }\n\n for (const op of operations) {\n if (isHandwrittenOverride(op)) continue;\n const resolvedOp = lookupResolved(op, resolvedLookup);\n if ((resolvedOp?.wrappers?.length ?? 0) > 0) {\n // Emit one method per wrapper instead of the raw union-split operation.\n for (const wrapper of resolvedOp!.wrappers!) {\n if (wrapper.responseModelName) {\n imports.add(`com.workos.models.${className(wrapper.responseModelName)}`);\n }\n // Register imports for wrapper param field types\n const resolvedParams = resolveWrapperParams(wrapper, ctx);\n for (const rp of resolvedParams) {\n if (rp.field) registerTypeImports(rp.field.type, imports, ctx);\n }\n }\n // Wrapper methods use bodyOf() for request body construction.\n imports.add('com.workos.common.http.bodyOf');\n const wrapperLines = generateWrapperMethods(resolvedOp!, ctx);\n if (body.length > 0) body.push('');\n for (const line of wrapperLines) body.push(line);\n continue;\n }\n\n const method = resolveMethodName(op, findService(ctx, op) ?? ({} as Service), ctx);\n if (seenMethods.has(method)) continue;\n seenMethods.add(method);\n\n const rendered = renderMethod(mountName, method, op, ctx, resolvedOp, imports);\n if (body.length > 0) body.push('');\n body.push(rendered);\n }\n\n if (body.length === 0) return null;\n\n // Emit sealed classes for parameter groups before the API class.\n // Parameter-group IR can lose body field type fidelity; prefer the request\n // body model's field type when available.\n const bodyFieldTypes = new Map<string, TypeRef>();\n for (const op of operations) {\n for (const [name, type] of collectBodyFieldTypes(op, ctx.spec.models)) {\n bodyFieldTypes.set(name, type);\n }\n }\n const sealedLines: string[] = [];\n const emittedSealedClasses = new Set<string>();\n for (const op of operations) {\n if ((op.parameterGroups?.length ?? 0) > 0) {\n for (const group of op.parameterGroups ?? []) {\n // Register imports for types used in parameter group sealed classes.\n // The body field type override may introduce enum/model types that\n // the original IR parameter didn't reference.\n for (const variant of group.variants) {\n for (const p of variant.parameters) {\n const effectiveType = bodyFieldTypes.get(p.name) ?? p.type;\n registerTypeImports(effectiveType, imports, ctx);\n }\n }\n if (emittedSealedClasses.has(group.name)) continue;\n emittedSealedClasses.add(group.name);\n for (const line of generateSealedClass(group, bodyFieldTypes)) sealedLines.push(line);\n }\n }\n }\n\n // Drop unused imports by peeking at the body text and sealed class text.\n const allText = body.join('\\n') + '\\n' + sealedLines.join('\\n');\n const filteredImports = [...imports].filter((imp) => {\n const simple = imp.slice(imp.lastIndexOf('.') + 1);\n // Skip the import if the class body never references the simple name.\n if (simple === 'WorkOS' || simple === 'RequestOptions') return true;\n return new RegExp(`\\\\b${simple}\\\\b`).test(allText);\n });\n\n const lines: string[] = [];\n lines.push(`package ${pkg}`);\n lines.push('');\n for (const imp of filteredImports.sort()) lines.push(`import ${imp}`);\n lines.push('');\n for (const line of sealedLines) lines.push(line);\n\n const serviceDescription = resolveServiceDescription(ctx, mountName, operations);\n if (serviceDescription) {\n const docLines = serviceDescription.trim().split('\\n');\n if (docLines.length === 1) {\n lines.push(`/** ${escapeKdoc(docLines[0].trim())} */`);\n } else {\n lines.push('/**');\n for (const l of docLines) lines.push(l ? ` * ${escapeKdoc(l)}` : ' *');\n lines.push(' */');\n }\n } else {\n lines.push(`/** API accessor for ${mountName}. */`);\n }\n // ktlint requires constructor-property parameters on their own line.\n // The property is `internal` so hand-maintained extension files in the\n // same module can reach the underlying [WorkOS] client (e.g. to build\n // URLs that are not HTTP calls).\n lines.push(`class ${apiClass}(`);\n lines.push(' internal val workos: WorkOS');\n lines.push(`) {`);\n for (const line of body) lines.push(line);\n lines.push('}');\n lines.push('');\n return lines.join('\\n');\n}\n\nfunction findService(ctx: EmitterContext, op: Operation): Service | undefined {\n for (const service of ctx.spec.services) {\n if (service.operations.includes(op)) return service;\n }\n return undefined;\n}\n\n/**\n * Resolve a human-friendly description for a generated API class. Walks the\n * operations in the mount group, picks the first service whose description\n * is populated, and falls back to `null` when nothing meaningful is\n * available (the caller uses a generic fallback).\n */\nfunction resolveServiceDescription(ctx: EmitterContext, _mountName: string, operations: Operation[]): string | null {\n for (const op of operations) {\n const svc = findService(ctx, op);\n if (svc?.description?.trim()) return svc.description;\n }\n return null;\n}\n\n/**\n * Render a single SDK method for an operation.\n */\nfunction renderMethod(\n _mountName: string,\n method: string,\n op: Operation,\n ctx: EmitterContext,\n resolvedOp: ResolvedOperation | undefined,\n imports: Set<string>,\n): string {\n const plan = planOperation(op);\n const hidden = buildHiddenParams(resolvedOp);\n const defaults = getOpDefaults(resolvedOp);\n const inferFromClient = getOpInferFromClient(resolvedOp);\n\n const httpMethod = op.httpMethod.toUpperCase();\n const pathParams = sortPathParamsByTemplateOrder(op);\n const groupedParamNames = collectGroupedParamNames(op);\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n const queryParams = op.queryParams.filter((p) => !hidden.has(p.name) && !groupedParamNames.has(p.name));\n const bodyModel = resolveBodyModel(op, ctx);\n const bodyFields = bodyModel\n ? bodyModel.fields.filter((f) => !hidden.has(f.name) && !groupedParamNames.has(f.name))\n : [];\n\n // Track imports we need\n for (const p of [...pathParams, ...queryParams]) registerTypeImports(p.type, imports, ctx);\n for (const f of bodyFields) registerTypeImports(f.type, imports, ctx);\n const paginatedItemName = resolvePaginatedItemName(plan.paginatedItemModelName, ctx);\n if (plan.responseModelName && !plan.isPaginated) {\n imports.add(`com.workos.models.${className(plan.responseModelName)}`);\n }\n if (paginatedItemName) {\n imports.add(`com.workos.models.${className(paginatedItemName)}`);\n imports.add('com.fasterxml.jackson.core.type.TypeReference');\n }\n\n // Deduplicate: path params take precedence; query params second; body last.\n // If a body field collides with a path/query param, rename the body field's\n // Kotlin parameter (e.g. `slug` → `bodySlug`) so callers can pass both\n // values. The wire name on the body map still uses the original field name.\n const paramNames = new Set<string>();\n for (const pp of pathParams) paramNames.add(propertyName(pp.name));\n const uniqueQuery = queryParams.filter((qp) => !paramNames.has(propertyName(qp.name)));\n for (const qp of uniqueQuery) paramNames.add(propertyName(qp.name));\n\n const sharedQueryBodyParams = new Set(\n uniqueQuery\n .filter((qp) => bodyFields.some((bf) => bf.name === qp.name && mapTypeRef(qp.type) === mapTypeRef(bf.type)))\n .map((qp) => qp.name),\n );\n\n // Map body field wire name → Kotlin parameter name. When the natural name\n // collides with a path/query, prefix with `body` (e.g. slug → bodySlug).\n const bodyParamNames = new Map<string, string>();\n for (const bf of bodyFields) {\n const natural = propertyName(bf.name);\n if (sharedQueryBodyParams.has(bf.name)) {\n bodyParamNames.set(bf.name, natural);\n continue;\n }\n if (paramNames.has(natural)) {\n const renamed = `body${natural.charAt(0).toUpperCase()}${natural.slice(1)}`;\n bodyParamNames.set(bf.name, renamed);\n paramNames.add(renamed);\n } else {\n bodyParamNames.set(bf.name, natural);\n paramNames.add(natural);\n }\n }\n\n const groupParamNames = assignGroupParameterNames(op, paramNames);\n\n const params: string[] = [];\n for (const pp of pathParams) params.push(` ${propertyName(pp.name)}: String`);\n\n const sortedQuery = [...uniqueQuery].sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1));\n for (const qp of sortedQuery) {\n params.push(renderParam(qp.name, qp.type, qp.required, method.startsWith('list') && qp.name === 'limit'));\n }\n\n // Parameter group params (sealed class types)\n for (const group of op.parameterGroups ?? []) {\n const sealedName = sealedGroupName(group.name);\n const prop = groupParamNames.get(group.name)!;\n if (group.optional) {\n params.push(` ${prop}: ${sealedName}? = null`);\n } else {\n params.push(` ${prop}: ${sealedName}`);\n }\n }\n\n // PATCH operations use PatchField<T> for optional body fields so callers\n // can distinguish \"omit\" (Absent) from \"clear\" (Present(null)).\n const isPatch = httpMethod === 'PATCH';\n\n const sortedBodyFields = [...bodyFields].sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1));\n for (const bf of sortedBodyFields) {\n if (sharedQueryBodyParams.has(bf.name)) continue;\n if (isPatch && !bf.required) {\n const baseType = mapTypeRef(bf.type);\n imports.add('com.workos.common.http.PatchField');\n params.push(` ${bodyParamNames.get(bf.name)!}: PatchField<${baseType}> = PatchField.Absent`);\n } else {\n params.push(renderParamNamed(bodyParamNames.get(bf.name)!, bf.type, bf.required));\n }\n }\n\n // Per-request options trailer (always optional)\n params.push(' requestOptions: RequestOptions? = null');\n\n const returnType = resolveReturnType(plan, imports, ctx);\n const isPaginated = plan.isPaginated && paginatedItemName !== null;\n\n const lines: string[] = [];\n const kdocLines = buildMethodKdoc(op, pathParams, sortedQuery, sortedBodyFields, bodyParamNames, plan);\n for (const ln of kdocLines) lines.push(ln);\n if (op.deprecated) lines.push(' @Deprecated(\"Deprecated operation\")');\n lines.push(' @JvmOverloads');\n // Omit explicit `: Unit` to keep ktlint happy.\n const returnClause = returnType === 'Unit' ? '' : `: ${returnType}`;\n if (params.length === 1) {\n // Single param fits on one line; ktlint enforces inline form.\n const singleParam = params[0].replace(/^\\s+/, '');\n lines.push(` fun ${escapeReserved(method)}(${singleParam})${returnClause} {`);\n } else {\n lines.push(` fun ${escapeReserved(method)}(`);\n for (let i = 0; i < params.length; i++) {\n const suffix = i === params.length - 1 ? '' : ',';\n lines.push(`${params[i]}${suffix}`);\n }\n lines.push(` )${returnClause} {`);\n }\n\n // Build body / query config\n //\n // POST/PUT/PATCH always need a request body — OkHttp rejects them otherwise.\n // DELETE and GET only emit a body when the spec explicitly declares one\n // (OpenAPI allows DELETE-with-body; GET-with-body is uncommon but legal).\n // GET never carries defaults/inferFromClient in the body — those fall back\n // to the query string for GET.\n const methodAlwaysHasBody = ['POST', 'PUT', 'PATCH'].includes(httpMethod);\n const specDeclaresBody = op.requestBody !== undefined;\n const hasBody =\n methodAlwaysHasBody ||\n (specDeclaresBody && httpMethod !== 'GET') ||\n ((httpMethod === 'PUT' || httpMethod === 'PATCH' || httpMethod === 'POST' || httpMethod === 'DELETE') &&\n (Object.keys(defaults).length > 0 || inferFromClient.length > 0) &&\n specDeclaresBody);\n const appendDefaultsAsQuery = !hasBody && (Object.keys(defaults).length > 0 || inferFromClient.length > 0);\n const pathExpr = buildPathExpression(op.path, pathParams);\n\n if (\n op.path === '/user_management/authenticate' &&\n httpMethod === 'POST' &&\n plan.responseModelName === 'AuthenticateResponse'\n ) {\n imports.add('com.workos.models.AuthenticateResponse');\n const grantType = defaults.grant_type ?? 'authorization_code';\n const entryLines = sortedBodyFields\n .filter((bf) => bf.name !== 'grant_type' && bf.name !== 'client_id' && bf.name !== 'client_secret')\n .map((bf) => ` ${ktLiteral(bf.name)} to ${bodyParamNames.get(bf.name)!}`);\n lines.push(` return authenticate(`);\n lines.push(` grantType = ${ktLiteral(grantType)},`);\n lines.push(` requestOptions = requestOptions,`);\n for (let i = 0; i < entryLines.length; i++) {\n const suffix = i === entryLines.length - 1 ? '' : ',';\n lines.push(`${entryLines[i]}${suffix}`);\n }\n lines.push(` )`);\n lines.push(' }');\n return lines.join('\\n');\n }\n\n if (isPaginated) {\n // Nested helper function + requestPage call; 'after' is owned by the\n // cursor logic so we skip it in the generic query loop.\n // 'after' and 'before' are owned by the cursor logic. 'before' is only\n // included on the first page — re-sending it on follow-up pages (where\n // afterCursor is set by the pagination engine) is nonsensical and can\n // cause empty or looping results from the server.\n imports.add('com.workos.common.http.addIfNotNull');\n imports.add('com.workos.common.http.addJoinedIfNotNull');\n imports.add('com.workos.common.http.addEach');\n const itemClass = className(paginatedItemName!);\n lines.push(` val itemType = object : TypeReference<${itemClass}>() {}`);\n lines.push(` return workos.baseClient.requestPage(`);\n lines.push(` method = ${ktLiteral(httpMethod)},`);\n lines.push(` path = ${pathExpr},`);\n lines.push(` itemType = itemType,`);\n lines.push(` requestOptions = requestOptions,`);\n lines.push(` before = ${pickNamedQueryParam(sortedQuery, 'before')},`);\n lines.push(` after = ${pickNamedQueryParam(sortedQuery, 'after')}`);\n lines.push(` ) {`);\n lines.push(` val params = this`);\n for (const qp of sortedQuery.filter((p) => p.name !== 'after' && p.name !== 'before')) {\n for (const ln of emitQueryParam(qp, ' ')) lines.push(ln);\n }\n for (const group of op.parameterGroups ?? []) {\n for (const ln of emitGroupQueryDispatch(group, groupParamNames.get(group.name)!, ' ')) lines.push(ln);\n }\n lines.push(` }`);\n } else {\n // Only emit the `params` local when the method actually contributes\n // query parameters (spec-declared query, or defaults/inferFromClient\n // for GET/DELETE without a body). `RequestConfig.queryParams` defaults\n // to `emptyList()` when omitted, so we avoid dead local declarations.\n // Groups go to the body for POST/PUT/PATCH (hasBody), query otherwise.\n const groupsGoToQuery = hasGroups && !hasBody;\n const emitsQueryParams = sortedQuery.length > 0 || appendDefaultsAsQuery || groupsGoToQuery;\n if (emitsQueryParams) {\n imports.add('com.workos.common.http.addIfNotNull');\n imports.add('com.workos.common.http.addJoinedIfNotNull');\n imports.add('com.workos.common.http.addEach');\n lines.push(` val params = mutableListOf<Pair<String, String>>()`);\n for (const qp of sortedQuery) for (const ln of emitQueryParam(qp, ' ')) lines.push(ln);\n if (groupsGoToQuery) {\n for (const group of op.parameterGroups ?? []) {\n for (const ln of emitGroupQueryDispatch(group, groupParamNames.get(group.name)!, ' ')) lines.push(ln);\n }\n }\n if (appendDefaultsAsQuery) {\n for (const [k, v] of Object.entries(defaults)) lines.push(` params += ${ktLiteral(k)} to ${ktLiteral(v)}`);\n // Client-inferred fields may be nullable (e.g. clientId). Skip when\n // null rather than serializing \"null\" into the URL.\n for (const k of inferFromClient) {\n lines.push(` workos.${clientFieldExpression(k)}?.let { params += ${ktLiteral(k)} to it }`);\n }\n }\n }\n\n if (hasBody) {\n // Use bodyOf() / patchBodyOf() helpers to build the request body in a\n // single expression. This drops null optional values automatically\n // instead of repeating `if (x != null) body[\"x\"] = x` per field.\n const helperFn = isPatch ? 'patchBodyOf' : 'bodyOf';\n imports.add(`com.workos.common.http.${helperFn}`);\n const bodyEntries: string[] = [];\n for (const bf of sortedBodyFields) {\n const prop = bodyParamNames.get(bf.name)!;\n bodyEntries.push(` ${ktLiteral(bf.name)} to ${prop}`);\n }\n for (const [k, v] of Object.entries(defaults)) {\n bodyEntries.push(` ${ktLiteral(k)} to ${ktLiteral(v)}`);\n }\n for (const k of inferFromClient) {\n bodyEntries.push(` ${ktLiteral(k)} to workos.${clientFieldExpression(k)}`);\n }\n if (bodyEntries.length > 0) {\n // ktlint: \"A multiline expression should start on a new line\"\n lines.push(` val body =`);\n lines.push(` ${helperFn}(`);\n for (let i = 0; i < bodyEntries.length; i++) {\n const sep = i === bodyEntries.length - 1 ? '' : ',';\n lines.push(` ${bodyEntries[i]}${sep}`);\n }\n lines.push(` )`);\n } else {\n // Empty body (POST/PUT/PATCH still require one for OkHttp).\n lines.push(` val body = linkedMapOf<String, Any?>()`);\n }\n // Parameter group values go into the body for POST/PUT/PATCH so\n // sensitive fields (passwords, role slugs) never leak into the URL.\n if (hasGroups) {\n for (const group of op.parameterGroups ?? []) {\n for (const ln of emitGroupBodyDispatch(group, groupParamNames.get(group.name)!, ' ')) {\n lines.push(ln);\n }\n }\n }\n lines.push(` val config =`);\n lines.push(` RequestConfig(`);\n lines.push(` method = ${ktLiteral(httpMethod)},`);\n lines.push(` path = ${pathExpr},`);\n if (emitsQueryParams) lines.push(` queryParams = params,`);\n lines.push(` body = body,`);\n lines.push(` requestOptions = requestOptions`);\n lines.push(` )`);\n } else {\n lines.push(` val config =`);\n lines.push(` RequestConfig(`);\n lines.push(` method = ${ktLiteral(httpMethod)},`);\n lines.push(` path = ${pathExpr},`);\n if (emitsQueryParams) lines.push(` queryParams = params,`);\n lines.push(` requestOptions = requestOptions`);\n lines.push(` )`);\n }\n\n if (plan.responseModelName && plan.isArrayResponse) {\n // `type: array` response — deserialize as List<T> via TypeReference.\n const itemClass = className(plan.responseModelName);\n imports.add('com.fasterxml.jackson.core.type.TypeReference');\n lines.push(` val responseType = object : TypeReference<List<${itemClass}>>() {}`);\n lines.push(` return workos.baseClient.request(config, responseType)`);\n } else if (plan.responseModelName) {\n const responseClass = className(plan.responseModelName);\n lines.push(` return workos.baseClient.request(config, ${responseClass}::class.java)`);\n } else if (plan.isDelete || !plan.isModelResponse) {\n lines.push(` workos.baseClient.requestVoid(config)`);\n } else {\n lines.push(` workos.baseClient.requestVoid(config)`);\n }\n }\n\n lines.push(' }');\n return lines.join('\\n');\n}\n\nfunction resolveReturnType(plan: ReturnType<typeof planOperation>, imports: Set<string>, ctx?: EmitterContext): string {\n const itemName = plan.isPaginated\n ? (resolvePaginatedItemName(plan.paginatedItemModelName, ctx) ?? plan.paginatedItemModelName)\n : null;\n if (plan.isPaginated && itemName) {\n const item = className(itemName);\n imports.add(`com.workos.models.${item}`);\n return `Page<${item}>`;\n }\n if (plan.responseModelName && plan.isArrayResponse) {\n const cls = className(plan.responseModelName);\n imports.add(`com.workos.models.${cls}`);\n return `List<${cls}>`;\n }\n if (plan.responseModelName) {\n const cls = className(plan.responseModelName);\n imports.add(`com.workos.models.${cls}`);\n return cls;\n }\n return 'Unit';\n}\n\n/**\n * If [paginatedItemModelName] points to a list wrapper (`{ data, list_metadata }`),\n * unwrap it and return the actual item model name. Otherwise return as-is.\n */\nfunction resolvePaginatedItemName(name: string | null, ctx?: EmitterContext): string | null {\n if (!name || !ctx) return name;\n const model = ctx.spec.models.find((m) => m.name === name);\n if (!model) return name;\n const dataField = model.fields.find((f) => f.name === 'data');\n if (!dataField || dataField.type.kind !== 'array') return name;\n const items = dataField.type.items;\n if (items.kind === 'model') return items.name;\n return name;\n}\n\nfunction renderParam(name: string, type: TypeRef, required: boolean, forceInt = false): string {\n return renderParamNamed(propertyName(name), type, required, forceInt);\n}\n\nfunction renderParamNamed(kotlinName: string, type: TypeRef, required: boolean, forceInt = false): string {\n const mapped = forceInt ? (required ? 'Int' : 'Int?') : required ? mapTypeRef(type) : mapTypeRefOptional(type);\n return required ? ` ${kotlinName}: ${mapped}` : ` ${kotlinName}: ${mapped} = null`;\n}\n\n/**\n * Build the KDoc block preceding an SDK method. Combines the operation's\n * summary/description with `@param` docs for every parameter that has a\n * description in the spec, `@return` when a response model is known, and\n * `@throws` for the standard error types.\n */\nfunction buildMethodKdoc(\n op: Operation,\n pathParams: Parameter[],\n queryParams: Parameter[],\n bodyFields: Field[],\n bodyParamNames: Map<string, string>,\n plan: ReturnType<typeof planOperation>,\n): string[] {\n // Use the operation's description as the KDoc body, split by newline.\n // Escape `*/` sequences to keep KDoc valid.\n const descriptionRaw = (op.description ?? '').trim();\n const textLines: string[] = [];\n if (descriptionRaw) {\n for (const l of descriptionRaw.split('\\n')) textLines.push(escapeKdoc(l));\n }\n\n // @param lines. Use the Kotlin-visible parameter name (body collisions get\n // renamed, e.g. slug → bodySlug). Deprecated parameters always get a\n // @param entry even without a description so the deprecation note is\n // surfaced in the docs.\n const paramDocs: string[] = [];\n const seenParamDocs = new Set<string>();\n const pushParamDoc = (name: string, description: string | undefined, deprecated?: boolean) => {\n if (seenParamDocs.has(name)) return;\n seenParamDocs.add(name);\n paramDocs.push(formatParamDoc(name, description, deprecated));\n };\n for (const pp of pathParams) {\n if (pp.description?.trim() || pp.deprecated) {\n pushParamDoc(propertyName(pp.name), pp.description, pp.deprecated);\n }\n }\n for (const qp of queryParams) {\n if (qp.description?.trim() || qp.deprecated) {\n pushParamDoc(propertyName(qp.name), qp.description, qp.deprecated);\n }\n }\n for (const bf of bodyFields) {\n if (bf.description?.trim() || bf.deprecated) {\n pushParamDoc(bodyParamNames.get(bf.name)!, bf.description, bf.deprecated);\n }\n }\n\n const returnDoc = plan.isPaginated\n ? '@return a [com.workos.common.http.Page] of results'\n : plan.responseModelName\n ? `@return the ${plan.isArrayResponse ? `list of ${className(plan.responseModelName)}` : className(plan.responseModelName)}`\n : null;\n\n const hasAnyContent = textLines.length > 0 || paramDocs.length > 0 || returnDoc !== null;\n if (!hasAnyContent) return [];\n\n const out: string[] = [' /**'];\n for (const l of textLines) out.push(l ? ` * ${l}` : ' *');\n const hasBodyText = textLines.length > 0;\n const needsSpacer = hasBodyText && (paramDocs.length > 0 || returnDoc !== null);\n if (needsSpacer) out.push(' *');\n for (const p of paramDocs) out.push(` * ${p}`);\n if (returnDoc) {\n if (paramDocs.length > 0) out.push(' *');\n out.push(` * ${returnDoc}`);\n }\n out.push(' */');\n return out;\n}\n\nfunction formatParamDoc(kotlinName: string, description: string | undefined, deprecated?: boolean): string {\n const firstLine = description?.split('\\n').find((l) => l.trim()) ?? '';\n const text = firstLine.trim();\n const deprecationNote = deprecated ? '**Deprecated.**' : '';\n const parts = [deprecationNote, text].filter(Boolean).join(' ');\n return `@param ${kotlinName}${parts ? ` ${escapeKdoc(parts)}` : ''}`;\n}\n\n/**\n * Unwrap a possibly-nullable type to check if the inner type is an array,\n * and return the array's item type for downstream serialization decisions.\n */\nfunction unwrapArray(t: TypeRef): TypeRef | null {\n if (t.kind === 'array') return t.items;\n if (t.kind === 'nullable' && t.inner.kind === 'array') return t.inner.items;\n return null;\n}\n\n/**\n * Serialize a single value expression for a query parameter. For enums we\n * use `.value` so the wire name is used; for strings the value is already\n * the right type; for everything else `.toString()`.\n */\nfunction valueExprForQuery(type: TypeRef): string {\n const inner = type.kind === 'nullable' ? type.inner : type;\n if (inner.kind === 'enum') return 'it.value';\n if (inner.kind === 'primitive' && inner.type === 'string') return 'it';\n return 'it.toString()';\n}\n\nfunction emitQueryParam(p: Parameter, indent: string): string[] {\n const prop = propertyName(p.name);\n const rendered = queryParamToString(p.type, prop);\n const inner = p.type.kind === 'nullable' ? p.type.inner : p.type;\n const arrayItem = unwrapArray(p.type);\n if (arrayItem) {\n // Honor `style: form, explode: false` → comma-joined. Default (explode:true\n // or unspecified for form) → repeated keys. `p.explode ?? true` matches\n // the OpenAPI default for query parameters when `style` is form.\n const explode = p.explode ?? true;\n const itemExpr = valueExprForQuery(arrayItem);\n if (!explode) {\n if (p.required) {\n return [`${indent}params.addJoinedIfNotNull(${ktLiteral(p.name)}, ${prop}.map { ${itemExpr} })`];\n }\n return [`${indent}params.addJoinedIfNotNull(${ktLiteral(p.name)}, ${prop}?.map { ${itemExpr} })`];\n }\n if (p.required) {\n return [`${indent}params.addEach(${ktLiteral(p.name)}, ${prop}.map { ${itemExpr} })`];\n }\n return [`${indent}${prop}?.let { params.addEach(${ktLiteral(p.name)}, it.map { ${itemExpr} }) }`];\n }\n if (p.required) return [`${indent}params += ${ktLiteral(p.name)} to ${rendered}`];\n if (inner.kind === 'primitive' && inner.type === 'string') {\n return [`${indent}params.addIfNotNull(${ktLiteral(p.name)}, ${prop})`];\n }\n return [`${indent}${prop}?.let { params += ${ktLiteral(p.name)} to ${queryParamToString(inner, 'it')} }`];\n}\n\nfunction queryParamToString(type: TypeRef, varName: string): string {\n if (type.kind === 'enum') return `${varName}.value`;\n if (type.kind === 'nullable') return queryParamToString(type.inner, varName);\n if (type.kind === 'primitive' && type.type === 'string') return varName;\n return `${varName}.toString()`;\n}\n\nfunction _emitBodyField(field: Field, kotlinParamName: string, isPatch: boolean): string[] {\n const prop = kotlinParamName;\n if (field.required) return [` body[${ktLiteral(field.name)}] = ${prop}`];\n // PATCH: PatchField<T> — serialize Present(value) including explicit null;\n // skip Absent entirely so the server preserves the field's current value.\n if (isPatch) {\n return [` if (${prop} is PatchField.Present) body[${ktLiteral(field.name)}] = ${prop}.value`];\n }\n return [` if (${prop} != null) body[${ktLiteral(field.name)}] = ${prop}`];\n}\n\nfunction buildPathExpression(path: string, pathParams: Parameter[]): string {\n if (pathParams.length === 0) return ktLiteral(path);\n let result = path;\n for (const pp of pathParams) {\n const placeholder = `{${pp.name}}`;\n const propName = propertyName(pp.name);\n // Use $propName for simple identifiers and ${propName} only when followed by\n // an ident-continuing char (to avoid false continuations). ktlint prefers the\n // unbraced form for bare identifiers.\n const replacement = isBareIdentifier(propName) ? `\\$${propName}` : `\\${${propName}}`;\n result = result.replaceAll(placeholder, replacement);\n }\n return `\"${result.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction isBareIdentifier(name: string): boolean {\n return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name);\n}\n\nfunction pickNamedQueryParam(sorted: Parameter[], name: string): string {\n const match = sorted.find((p) => p.name === name);\n return match ? propertyName(match.name) : 'null';\n}\n\nfunction generateAuthenticateHelper(): string[] {\n return [\n ' private fun authenticate(',\n ' grantType: String,',\n ' requestOptions: RequestOptions?,',\n ' vararg entries: Pair<String, Any?>',\n ' ): AuthenticateResponse {',\n ' val body =',\n ' bodyOf(',\n ' *entries,',\n ' \"grant_type\" to grantType,',\n ' \"client_id\" to workos.clientId,',\n ' \"client_secret\" to workos.apiKey',\n ' )',\n ' val config =',\n ' RequestConfig(',\n ' method = \"POST\",',\n ' path = \"/user_management/authenticate\",',\n ' body = body,',\n ' requestOptions = requestOptions',\n ' )',\n ' return workos.baseClient.request(config, AuthenticateResponse::class.java)',\n ' }',\n ];\n}\n\nfunction resolveBodyModel(op: Operation, ctx: EmitterContext): Model | null {\n const body = op.requestBody;\n if (!body) return null;\n if (body.kind !== 'model') return null;\n return ctx.spec.models.find((m) => m.name === body.name) ?? null;\n}\n\nfunction registerTypeImports(ref: TypeRef, imports: Set<string>, ctx: EmitterContext): void {\n const mapped = mapTypeRef(ref);\n for (const imp of implicitImportsFor(mapped)) imports.add(imp);\n\n walk(ref, (r) => {\n if (r.kind === 'enum') {\n // When an enum is aliased, import the canonical class instead of the alias.\n const canonicalName = enumCanonicalMap.get(r.name) ?? r.name;\n imports.add(`com.workos.types.${className(canonicalName)}`);\n }\n if (r.kind === 'model') {\n const referenced = ctx.spec.models.find((m) => m.name === r.name);\n if (referenced && (isListWrapperModel(referenced) || isListMetadataModel(referenced))) return;\n imports.add(`com.workos.models.${className(r.name)}`);\n }\n });\n}\n\nfunction walk(ref: TypeRef, fn: (r: TypeRef) => void): void {\n fn(ref);\n if (ref.kind === 'array') walk(ref.items, fn);\n else if (ref.kind === 'map') walk(ref.valueType, fn);\n else if (ref.kind === 'nullable') walk(ref.inner, fn);\n else if (ref.kind === 'union') for (const v of ref.variants) walk(v, fn);\n}\n\n/** Sort operation path parameters by their first appearance in the URL template. */\nexport function sortPathParamsByTemplateOrder(op: Operation): Parameter[] {\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\nfunction escapeKdoc(s: string): string {\n return s.replace(/\\*\\//g, '*\\u200b/');\n}\n\n// ---------------------------------------------------------------------------\n// Mutually-exclusive parameter group support\n// ---------------------------------------------------------------------------\n\n/**\n * Derive a short Kotlin property name for a parameter within a variant,\n * stripping the group name prefix to avoid stuttering.\n */\nfunction deriveShortPropertyName(paramName: string, groupName: string): string {\n const prefix = groupName + '_';\n const stripped = paramName.startsWith(prefix) ? paramName.slice(prefix.length) : paramName;\n return propertyName(stripped);\n}\n\n/**\n * Generate sealed class definitions for all parameter groups in an operation.\n *\n * [bodyFieldTypes] is a fallback map from wire field name → TypeRef built from\n * the body model. When the oagen core resolves parameter group variants it\n * sometimes loses array/object types, falling back to a primitive string.\n * Cross-referencing the body model corrects that.\n */\nfunction generateSealedClass(\n group: import('@workos/oagen').ParameterGroup,\n bodyFieldTypes?: Map<string, TypeRef>,\n): string[] {\n const lines: string[] = [];\n const sealedName = sealedGroupName(group.name);\n lines.push(`/** Mutually exclusive ${humanize(group.name)} parameter variants. */`);\n lines.push(`sealed class ${sealedName} {`);\n for (let vi = 0; vi < group.variants.length; vi++) {\n const variant = group.variants[vi];\n const variantName = className(variant.name);\n const fields = variant.parameters.map((p) => {\n const prop = deriveShortPropertyName(p.name, group.name);\n // Prefer the body model's field type when available — the IR parameter\n // group may have lost array/object type info for body fields.\n const effectiveType = bodyFieldTypes?.get(p.name) ?? p.type;\n return { decl: `val ${prop}: ${mapTypeRef(effectiveType)}`, name: p.name };\n });\n // ktlint requires blank line before each declaration inside a sealed class\n if (vi > 0) lines.push('');\n // ktlint class-signature rule requires multi-line constructors\n lines.push(` /** Variant: ${humanize(variant.name)}. */`);\n lines.push(` data class ${variantName}(`);\n for (let i = 0; i < fields.length; i++) {\n const comma = i < fields.length - 1 ? ',' : '';\n lines.push(` /** The ${humanize(fields[i].name)}. */`);\n lines.push(` ${fields[i].decl}${comma}`);\n }\n lines.push(` ) : ${sealedName}()`);\n }\n lines.push('}');\n lines.push('');\n return lines;\n}\n\n/** Emit `when` dispatch that serializes a parameter group into query params. */\nfunction emitGroupQueryDispatch(group: import('@workos/oagen').ParameterGroup, prop: string, indent: string): string[] {\n const sealedName = sealedGroupName(group.name);\n const lines: string[] = [];\n\n if (group.optional) {\n lines.push(`${indent}if (${prop} != null) {`);\n emitWhenBlock(lines, group, sealedName, prop, `${indent} `);\n lines.push(`${indent}}`);\n } else {\n emitWhenBlock(lines, group, sealedName, prop, indent);\n }\n return lines;\n}\n\nfunction assignGroupParameterNames(op: Operation, occupiedNames: Set<string>): Map<string, string> {\n const names = new Map<string, string>();\n for (const group of op.parameterGroups ?? []) {\n const natural = propertyName(sealedGroupName(group.name));\n const assigned = reserveUniqueGroupParameterName(natural, occupiedNames);\n names.set(group.name, assigned);\n }\n return names;\n}\n\nfunction reserveUniqueGroupParameterName(base: string, occupiedNames: Set<string>): string {\n if (!occupiedNames.has(base)) {\n occupiedNames.add(base);\n return base;\n }\n\n const capitalized = `${base.charAt(0).toUpperCase()}${base.slice(1)}`;\n const prefixed = `group${capitalized}`;\n if (!occupiedNames.has(prefixed)) {\n occupiedNames.add(prefixed);\n return prefixed;\n }\n\n let index = 2;\n while (occupiedNames.has(`${prefixed}${index}`)) index += 1;\n const fallback = `${prefixed}${index}`;\n occupiedNames.add(fallback);\n return fallback;\n}\n\nfunction emitWhenBlock(\n lines: string[],\n group: import('@workos/oagen').ParameterGroup,\n sealedName: string,\n prop: string,\n indent: string,\n): void {\n lines.push(`${indent}when (${prop}) {`);\n for (const variant of group.variants) {\n const variantName = className(variant.name);\n const entries = variant.parameters.map((p) => {\n const fieldProp = deriveShortPropertyName(p.name, group.name);\n return `params += ${ktLiteral(p.name)} to ${prop}.${fieldProp}`;\n });\n if (entries.length === 1) {\n lines.push(`${indent} is ${sealedName}.${variantName} -> ${entries[0]}`);\n } else {\n lines.push(`${indent} is ${sealedName}.${variantName} -> {`);\n for (const e of entries) lines.push(`${indent} ${e}`);\n lines.push(`${indent} }`);\n }\n }\n lines.push(`${indent}}`);\n}\n\n/** Emit `when` dispatch that serializes a parameter group into the request body map. */\nfunction emitGroupBodyDispatch(group: import('@workos/oagen').ParameterGroup, prop: string, indent: string): string[] {\n const sealedName = sealedGroupName(group.name);\n const lines: string[] = [];\n\n if (group.optional) {\n lines.push(`${indent}if (${prop} != null) {`);\n emitBodyWhenBlock(lines, group, sealedName, prop, `${indent} `);\n lines.push(`${indent}}`);\n } else {\n emitBodyWhenBlock(lines, group, sealedName, prop, indent);\n }\n return lines;\n}\n\nfunction sealedGroupName(name: string): string {\n const resolved = className(name);\n if (resolved === 'Password') return 'CreateUserPassword';\n if (resolved === 'Role') return 'CreateUserRole';\n return resolved;\n}\n\nfunction emitBodyWhenBlock(\n lines: string[],\n group: import('@workos/oagen').ParameterGroup,\n sealedName: string,\n prop: string,\n indent: string,\n): void {\n lines.push(`${indent}when (${prop}) {`);\n for (const variant of group.variants) {\n const variantName = className(variant.name);\n const entries = variant.parameters.map((p) => {\n const fieldProp = deriveShortPropertyName(p.name, group.name);\n return `body[${ktLiteral(p.name)}] = ${prop}.${fieldProp}`;\n });\n if (entries.length === 1) {\n lines.push(`${indent} is ${sealedName}.${variantName} -> ${entries[0]}`);\n } else {\n lines.push(`${indent} is ${sealedName}.${variantName} -> {`);\n for (const e of entries) lines.push(`${indent} ${e}`);\n lines.push(`${indent} }`);\n }\n }\n lines.push(`${indent}}`);\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile, Service } from '@workos/oagen';\nimport { apiClassName, packageSegment, servicePropertyName } from './naming.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\n\nconst KOTLIN_SRC_PREFIX = 'src/main/kotlin/';\n\n/**\n * Generate service accessor properties for the hand-maintained `WorkOS` class.\n *\n * Each accessor is a `val` property with a custom getter that delegates to\n * `WorkOS.service(...)` for lazy, cached construction. The generated file\n * contains a `WorkOS` class stub with only these properties — the oagen\n * merger deep-merges them into the existing hand-written `WorkOS.kt`.\n *\n * Accessors use fully-qualified type names so the merger doesn't need to\n * inject imports into the hand-written file.\n */\nexport function generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const targets = deduplicateByMount(spec.services, ctx);\n if (targets.length === 0) return [];\n\n const accessorLines: string[] = [];\n for (const mount of targets) {\n const apiCls = apiClassName(mount);\n const fqn = `com.workos.${packageSegment(mount)}.${apiCls}`;\n const prop = servicePropertyName(mount);\n accessorLines.push('');\n accessorLines.push(` /** Lazily-constructed [${fqn}] accessor for this [WorkOS] client. */`);\n accessorLines.push(` val ${prop}: ${fqn}`);\n accessorLines.push(' get() =');\n accessorLines.push(' service(');\n accessorLines.push(` ${fqn}::class`);\n accessorLines.push(' ) {');\n accessorLines.push(` ${fqn}(this)`);\n accessorLines.push(' }');\n }\n\n const lines: string[] = [];\n lines.push('package com.workos');\n lines.push('');\n lines.push('open class WorkOS {');\n for (const line of accessorLines) lines.push(line);\n lines.push('}');\n lines.push('');\n\n return [\n {\n path: `${KOTLIN_SRC_PREFIX}com/workos/WorkOS.kt`,\n content: lines.join('\\n'),\n },\n ];\n}\n\nfunction deduplicateByMount(services: Service[], ctx: EmitterContext): string[] {\n const targets = new Set<string>();\n for (const s of services) targets.add(getMountTarget(s, ctx));\n return [...targets].sort();\n}\n","import type {\n ApiSpec,\n EmitterContext,\n GeneratedFile,\n Operation,\n Service,\n Model,\n TypeRef,\n ResolvedOperation,\n ResolvedWrapper,\n} from '@workos/oagen';\nimport { planOperation } from '@workos/oagen';\nimport { apiClassName, packageSegment, resolveMethodName, ktStringLiteral, className, propertyName } from './naming.js';\nimport { mapTypeRef } from './type-map.js';\nimport {\n groupByMount,\n lookupResolved,\n buildResolvedLookup,\n buildHiddenParams,\n collectGroupedParamNames,\n} from '../shared/resolved-ops.js';\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\nimport { isHandwrittenOverride } from './overrides.js';\n\nconst TEST_PREFIX = 'src/test/kotlin/';\n\n/**\n * Generate one JUnit 5 + WireMock test class per API mount group, plus a\n * cross-cutting model round-trip test.\n *\n * Per mount group the emitter produces:\n * - A happy-path test for every operation whose required arguments can be\n * synthesized (primitives, enums, arrays, maps). Deserializes a minimal\n * JSON response and asserts a non-null result.\n * - 401/404/429/500 error-mapping tests against one representative operation\n * in the group.\n *\n * Operations with required arguments we can't synthesize (e.g. a required\n * model object in the request body) fall back to error-only coverage using\n * the representative operation.\n */\nexport function generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const mountGroups = groupByMount(ctx);\n const resolvedLookup = buildResolvedLookup(ctx);\n\n for (const [mountName, group] of mountGroups) {\n const content = generateServiceTestClass(mountName, group.operations, ctx, resolvedLookup);\n if (!content) continue;\n const pkg = packageSegment(mountName);\n files.push({\n path: `${TEST_PREFIX}com/workos/${pkg}/${apiClassName(mountName)}Test.kt`,\n content,\n overwriteExisting: true,\n });\n }\n\n const roundTripFile = generateModelRoundTripTest(spec, ctx);\n if (roundTripFile) files.push(roundTripFile);\n\n const forwardCompatFile = generateForwardCompatTest(spec, ctx);\n if (forwardCompatFile) files.push(forwardCompatFile);\n\n return files;\n}\n\ninterface OpTest {\n method: string;\n httpMethod: string; // lowercase for WireMock\n pathForWireMock: string;\n callArgs: string;\n responseClass: string | null;\n minimalResponseBody: string;\n canEmitHappyPath: boolean;\n imports: Set<string>;\n /** Wire field names required in the request body — asserted via matchingJsonPath. */\n requiredBodyPaths: string[];\n /** `name=value` pairs required on the query string — asserted via matchingRegex. */\n requiredQueryAssertions: { name: string; valueRegex: string }[];\n /** Wire field names that must NOT appear as query params (e.g. password on POST). */\n forbiddenQueryParams: string[];\n /** Assertions on response fields: { kotlinAccessor, expectedExpr }. */\n responseAssertions: { accessor: string; expectedExpr: string }[];\n}\n\nfunction generateServiceTestClass(\n mountName: string,\n operations: Operation[],\n ctx: EmitterContext,\n resolvedLookup: Map<string, ResolvedOperation>,\n): string | null {\n const imports = new Set<string>();\n // Base JUnit/exception imports — always present.\n imports.add('com.workos.common.exceptions.GenericServerException');\n imports.add('com.workos.common.exceptions.NotFoundException');\n imports.add('com.workos.common.exceptions.RateLimitException');\n imports.add('com.workos.common.exceptions.UnauthorizedException');\n imports.add('com.workos.test.TestBase');\n imports.add('org.junit.jupiter.api.Assertions.assertNotNull');\n imports.add('org.junit.jupiter.api.Assertions.assertThrows');\n imports.add('org.junit.jupiter.api.Test');\n\n const opTests: OpTest[] = [];\n\n for (const op of operations) {\n if (isHandwrittenOverride(op)) continue;\n const resolved = lookupResolved(op, resolvedLookup);\n const wrappers = resolved?.wrappers ?? [];\n if (wrappers.length > 0) {\n // Union-split operation — emit one test per wrapper.\n for (const wrapper of wrappers) {\n const test = buildWrapperTest(op, wrapper, ctx);\n if (test) opTests.push(test);\n }\n continue;\n }\n\n const test = buildOperationTest(op, resolved, ctx);\n if (test) opTests.push(test);\n }\n\n if (opTests.length === 0) return null;\n\n // Deduplicate by method name (split operations map to distinct methods;\n // non-wrapper operations already have unique names).\n const seen = new Set<string>();\n const uniqueTests = opTests.filter((t) => {\n if (seen.has(t.method)) return false;\n seen.add(t.method);\n return true;\n });\n\n // Pick a \"representative\" op for error-mapping tests. Prefer the first op\n // that has no path params (simplest URL to stub). Fall back to the first.\n const repOp = uniqueTests.find((t) => !t.pathForWireMock.includes('sample-arg')) ?? uniqueTests[0];\n\n // Only register per-op imports for tests that will actually emit a body.\n // Ops that can't synthesize a happy path don't contribute to the file, so\n // their imports (HTTP methods, payload types) would be unused.\n const httpMethodsUsed = new Set<string>();\n for (const t of uniqueTests) {\n if (!t.canEmitHappyPath) continue;\n t.imports.forEach((i) => imports.add(i));\n httpMethodsUsed.add(t.httpMethod);\n }\n // The representative op is used for error-mapping tests regardless of its\n // happy-path status, so its type imports are always needed.\n repOp.imports.forEach((i) => imports.add(i));\n httpMethodsUsed.add(repOp.httpMethod);\n\n // Register request-verification imports only for operations that actually\n // emit verify() calls (i.e., have body/query assertions). This avoids\n // unused `*RequestedFor` and `urlPathMatching` imports in test files where\n // no happy-path test has scalar required params.\n const verifyMethods = new Set<string>();\n for (const t of uniqueTests) {\n if (!t.canEmitHappyPath) continue;\n if (t.requiredBodyPaths.length > 0 || t.requiredQueryAssertions.length > 0 || t.forbiddenQueryParams.length > 0) {\n verifyMethods.add(t.httpMethod);\n }\n }\n if (verifyMethods.size > 0) {\n imports.add('com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching');\n for (const m of verifyMethods) {\n imports.add(`com.github.tomakehurst.wiremock.client.WireMock.${m}RequestedFor`);\n }\n }\n const anyBody = uniqueTests.some((t) => t.canEmitHappyPath && t.requiredBodyPaths.length > 0);\n const anyQuery = uniqueTests.some((t) => t.canEmitHappyPath && t.requiredQueryAssertions.length > 0);\n const anyForbidden = uniqueTests.some((t) => t.canEmitHappyPath && t.forbiddenQueryParams.length > 0);\n if (anyBody) imports.add('com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath');\n if (anyQuery) imports.add('com.github.tomakehurst.wiremock.client.WireMock.matching');\n if (anyForbidden) imports.add('com.github.tomakehurst.wiremock.client.WireMock.absent');\n // assertEquals is needed when any test has response field assertions.\n if (uniqueTests.some((t) => t.canEmitHappyPath && t.responseAssertions.length > 0)) {\n imports.add('org.junit.jupiter.api.Assertions.assertEquals');\n }\n\n const pkg = packageSegment(mountName);\n const apiCls = apiClassName(mountName);\n\n // If any operation would emit a disabled placeholder test, preregister\n // the `Disabled` import before we serialize the header.\n if (uniqueTests.some((t) => !t.canEmitHappyPath)) {\n imports.add('org.junit.jupiter.api.Disabled');\n }\n\n const lines: string[] = [];\n lines.push(`package com.workos.${pkg}`);\n lines.push('');\n for (const imp of [...imports].sort()) {\n lines.push(`import ${imp}`);\n }\n lines.push('');\n lines.push(`class ${apiCls}Test : TestBase() {`);\n lines.push(` private fun api() = ${apiCls}(createWorkOSClient())`);\n\n for (const t of uniqueTests) {\n if (t.canEmitHappyPath) {\n emitHappyPathTest(lines, t);\n } else {\n // Previously these were silently dropped. Emitting a disabled test\n // keeps the method visible in test reports so contributors know there\n // is intentionally no synthesized coverage, rather than being surprised\n // that the method has zero tests.\n emitDisabledHappyPathTest(lines, t);\n }\n }\n\n emitErrorTest(lines, '401', 'UnauthorizedException', repOp);\n emitErrorTest(lines, '404', 'NotFoundException', repOp);\n emitErrorTest(lines, '429', 'RateLimitException', repOp);\n emitErrorTest(lines, '500', 'GenericServerException', repOp);\n\n lines.push('}');\n lines.push('');\n return lines.join('\\n');\n}\n\nfunction buildOperationTest(\n op: Operation,\n resolved: ResolvedOperation | undefined,\n ctx: EmitterContext,\n): OpTest | null {\n const svc = findService(ctx, op);\n if (!svc) return null;\n const method = resolveMethodName(op, svc, ctx);\n const plan = planOperation(op);\n const mountPackage = packageSegment(resolved?.mountOn ?? svc.name);\n\n const hidden = buildHiddenParams(resolved);\n\n // Build call args in the order expected by the generated method signature:\n // pathParams ++ requiredQuery ++ requiredBodyFields\n const imports = new Set<string>();\n const argParts: string[] = [];\n const requiredBodyPaths: string[] = [];\n const requiredQueryAssertions: { name: string; valueRegex: string }[] = [];\n\n for (const _pp of op.pathParams) argParts.push(ktStringLiteral('sample-arg'));\n\n const groupedParamNames = collectGroupedParamNames(op);\n\n const queryFields = op.queryParams.filter((p) => !hidden.has(p.name) && !groupedParamNames.has(p.name));\n const sortedQuery = [...queryFields].sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1));\n const sharedQueryBodyParams = new Set<string>();\n const bodyModel = resolveBodyModel(op, ctx);\n for (const qp of queryFields) {\n const matchingBodyField = bodyModel?.fields.find((field) => field.name === qp.name);\n if (matchingBodyField && mapTypeRef(qp.type) === mapTypeRef(matchingBodyField.type)) {\n sharedQueryBodyParams.add(qp.name);\n }\n }\n for (const qp of sortedQuery) {\n if (!qp.required) break;\n const val = synthValue(qp.type, ctx, imports);\n if (val === null) return null;\n argParts.push(val);\n // Best-effort wire assertion: for primitives/strings we know the synthesized\n // value so we can assert equality; otherwise just assert presence.\n const regex = queryValueRegexFor(qp.type);\n if (regex !== null) requiredQueryAssertions.push({ name: qp.name, valueRegex: regex });\n }\n\n // Parameter group args — emit as named args (they appear after optionals in the signature)\n const groupParamNames = assignGroupParameterNames(op, hidden, queryFields, bodyModel, groupedParamNames);\n for (const group of op.parameterGroups ?? []) {\n const variant = group.variants[0];\n const sealedName = sealedGroupName(group.name);\n const variantName = className(variant.name);\n const variantArgs = variant.parameters.map((_p) => ktStringLiteral('sample-arg')).join(', ');\n imports.add(`com.workos.${mountPackage}.${sealedName}`);\n argParts.push(`${groupParamNames.get(group.name)!} = ${sealedName}.${variantName}(${variantArgs})`);\n }\n\n if (bodyModel) {\n // Body fields always pass; colliding names are renamed (e.g. slug →\n // bodySlug) by the resources emitter, so every required body field still\n // needs a test argument here.\n const bodyFields = bodyModel.fields.filter((f) => !hidden.has(f.name) && !groupedParamNames.has(f.name));\n const sortedBody = [...bodyFields].sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1));\n for (const bf of sortedBody) {\n if (sharedQueryBodyParams.has(bf.name)) continue;\n if (!bf.required) break;\n const val = synthValue(bf.type, ctx, imports);\n if (val === null) return null;\n argParts.push(val);\n // matchingJsonPath on an array/map body field fails on empty\n // synthesized collections because JsonPath returns an empty result\n // set. Scalar fields always materialize with a concrete value, so\n // we only assert those paths.\n if (isScalarBodyField(bf.type)) requiredBodyPaths.push(bf.name);\n }\n }\n\n const plan2 = plan;\n const responseClass = plan2.isPaginated\n ? 'Page'\n : plan2.responseModelName\n ? className(plan2.responseModelName)\n : null;\n\n const minimalBody = buildResponseBody(plan2, ctx);\n\n // Void/delete methods don't need a response class or body — they succeed\n // when the call completes without throwing. We can emit a happy-path test\n // as long as we were able to synthesize all required arguments.\n const isVoidMethod = responseClass === null;\n const canEmitHappyPath = isVoidMethod || (responseClass !== null && minimalBody !== null);\n\n // Build response field assertions for non-paginated, non-array model responses.\n // Array responses return List<T>, so `result.field` doesn't compile.\n const responseAssertions =\n !plan2.isPaginated && !plan2.isArrayResponse && plan2.responseModelName\n ? buildResponseAssertions(plan2.responseModelName, ctx)\n : [];\n\n // For POST/PUT/PATCH with parameter groups, collect all wire field names\n // from the groups — these must NOT appear as query parameters.\n const forbiddenQueryParams: string[] = [];\n const httpUpper = op.httpMethod.toUpperCase();\n if (['POST', 'PUT', 'PATCH'].includes(httpUpper) && (op.parameterGroups?.length ?? 0) > 0) {\n for (const group of op.parameterGroups!) {\n for (const variant of group.variants) {\n for (const p of variant.parameters) {\n if (!forbiddenQueryParams.includes(p.name)) forbiddenQueryParams.push(p.name);\n }\n }\n }\n }\n\n return {\n method,\n httpMethod: op.httpMethod.toLowerCase(),\n pathForWireMock: op.path.replace(/\\{[^}]+\\}/g, 'sample-arg'),\n callArgs: argParts.join(', '),\n responseClass,\n minimalResponseBody: minimalBody ?? '{}',\n canEmitHappyPath,\n imports,\n requiredBodyPaths,\n requiredQueryAssertions,\n forbiddenQueryParams,\n responseAssertions,\n };\n}\n\nfunction assignGroupParameterNames(\n op: Operation,\n hidden: Set<string>,\n queryFields: Operation['queryParams'],\n bodyModel: Model | null,\n groupedParamNames: Set<string> = new Set(),\n): Map<string, string> {\n const occupiedNames = new Set<string>();\n\n for (const pp of op.pathParams) occupiedNames.add(propertyName(pp.name));\n for (const qp of queryFields) occupiedNames.add(propertyName(qp.name));\n\n for (const bf of bodyModel?.fields ?? []) {\n if (hidden.has(bf.name) || groupedParamNames.has(bf.name)) continue;\n const natural = propertyName(bf.name);\n if (occupiedNames.has(natural)) {\n occupiedNames.add(`body${natural.charAt(0).toUpperCase()}${natural.slice(1)}`);\n } else {\n occupiedNames.add(natural);\n }\n }\n\n const names = new Map<string, string>();\n for (const group of op.parameterGroups ?? []) {\n const natural = propertyName(sealedGroupName(group.name));\n const assigned = reserveUniqueGroupParameterName(natural, occupiedNames);\n names.set(group.name, assigned);\n }\n return names;\n}\n\nfunction sealedGroupName(name: string): string {\n const resolved = className(name);\n if (resolved === 'Password') return 'CreateUserPassword';\n if (resolved === 'Role') return 'CreateUserRole';\n return resolved;\n}\n\nfunction reserveUniqueGroupParameterName(base: string, occupiedNames: Set<string>): string {\n if (!occupiedNames.has(base)) {\n occupiedNames.add(base);\n return base;\n }\n\n const capitalized = `${base.charAt(0).toUpperCase()}${base.slice(1)}`;\n const prefixed = `group${capitalized}`;\n if (!occupiedNames.has(prefixed)) {\n occupiedNames.add(prefixed);\n return prefixed;\n }\n\n let index = 2;\n while (occupiedNames.has(`${prefixed}${index}`)) index += 1;\n const fallback = `${prefixed}${index}`;\n occupiedNames.add(fallback);\n return fallback;\n}\n\n/** True if the synthesized body value serializes to a concrete JSON scalar. */\nfunction isScalarBodyField(type: TypeRef): boolean {\n const inner = type.kind === 'nullable' ? type.inner : type;\n if (inner.kind === 'primitive') return inner.format !== 'binary';\n if (inner.kind === 'enum') return true;\n if (inner.kind === 'literal') return true;\n return false;\n}\n\n/**\n * When we can recognize the synthesized test value for a query param,\n * return a regex that matches the expected serialized form. Returns null\n * when the value is too complex to assert (e.g. arrays, models).\n */\nfunction queryValueRegexFor(type: TypeRef): string | null {\n const inner = type.kind === 'nullable' ? type.inner : type;\n if (inner.kind === 'primitive') {\n if (inner.format === 'date-time') return null; // OffsetDateTime.now() — not reproducible\n switch (inner.type) {\n case 'string':\n return 'sample-arg';\n case 'integer':\n return '0';\n case 'number':\n return '0\\\\.0';\n case 'boolean':\n return 'false';\n }\n return null;\n }\n return null;\n}\n\nfunction buildResponseBody(plan: ReturnType<typeof planOperation>, ctx: EmitterContext): string | null {\n if (plan.isPaginated) {\n return `{\"data\": [], \"list_metadata\": {\"before\": null, \"after\": null}}`;\n }\n if (!plan.responseModelName) return null;\n const itemJson = synthJsonForModelName(plan.responseModelName, ctx, new Set());\n if (itemJson === null) return null;\n // For `type: array` responses, the Kotlin method returns `List<T>` and\n // Jackson expects a JSON array on the wire, not a single object.\n if (plan.isArrayResponse) return `[${itemJson}]`;\n return itemJson;\n}\n\nfunction buildWrapperTest(op: Operation, wrapper: ResolvedWrapper, ctx: EmitterContext): OpTest | null {\n const method = propertyName(wrapper.name);\n const imports = new Set<string>();\n const argParts: string[] = [];\n\n for (const _pp of op.pathParams) argParts.push(ktStringLiteral('sample-arg'));\n\n const resolved = resolveWrapperParams(wrapper, ctx);\n for (const rp of resolved) {\n if (rp.isOptional) continue;\n if (!rp.field) {\n argParts.push(ktStringLiteral('sample-arg'));\n continue;\n }\n const val = synthValue(rp.field.type, ctx, imports);\n if (val === null) return null;\n argParts.push(val);\n }\n\n const responseClass = wrapper.responseModelName ? className(wrapper.responseModelName) : null;\n const minimalBody = wrapper.responseModelName\n ? synthJsonForModelName(wrapper.responseModelName, ctx, new Set())\n : null;\n const isVoidMethod = responseClass === null;\n const canEmitHappyPath = isVoidMethod || (responseClass !== null && minimalBody !== null);\n const responseAssertions = wrapper.responseModelName ? buildResponseAssertions(wrapper.responseModelName, ctx) : [];\n\n return {\n method,\n httpMethod: op.httpMethod.toLowerCase(),\n pathForWireMock: op.path.replace(/\\{[^}]+\\}/g, 'sample-arg'),\n callArgs: argParts.join(', '),\n responseClass,\n minimalResponseBody: minimalBody ?? '{}',\n canEmitHappyPath,\n imports,\n requiredBodyPaths: [],\n requiredQueryAssertions: [],\n forbiddenQueryParams: [],\n responseAssertions,\n };\n}\n\n/** Synthesize a Kotlin expression for a typed value. Returns null if we cannot. */\nfunction synthValue(type: TypeRef, ctx: EmitterContext, imports: Set<string>): string | null {\n if (type.kind === 'nullable') {\n return 'null';\n }\n if (type.kind === 'primitive') {\n if (type.format === 'binary') return 'ByteArray(0)';\n if (type.format === 'date-time') {\n imports.add('java.time.OffsetDateTime');\n return 'OffsetDateTime.now()';\n }\n switch (type.type) {\n case 'string':\n return '\"sample-arg\"';\n case 'integer':\n if (type.format === 'int64') return '0L';\n return '0';\n case 'number':\n return '0.0';\n case 'boolean':\n return 'false';\n }\n return null;\n }\n if (type.kind === 'enum') {\n const cls = className(type.name);\n imports.add(`com.workos.types.${cls}`);\n // Skip `Unknown` (index 0) — serializing the Unknown sentinel throws\n // because it exists only for forward-compat deserialization. Pick the\n // first concrete variant instead.\n return `${cls}.values().first { it != ${cls}.Unknown }`;\n }\n if (type.kind === 'array') {\n // Empty list of the right item type. Kotlin's List<T> is invariant.\n const itemType = renderTypeForSynthesis(type.items, ctx, imports);\n if (itemType === null) return null;\n return `emptyList<${itemType}>()`;\n }\n if (type.kind === 'map') {\n const valueType = renderTypeForSynthesis(type.valueType, ctx, imports);\n if (valueType === null) return null;\n return `emptyMap<String, ${valueType}>()`;\n }\n if (type.kind === 'literal') {\n if (typeof type.value === 'string') return ktStringLiteral(type.value);\n if (typeof type.value === 'number') return String(type.value);\n if (typeof type.value === 'boolean') return String(type.value);\n return 'null';\n }\n // model / union — too complex to synthesize generically.\n return null;\n}\n\n/**\n * Render a Kotlin type string for use as a generic type parameter in a\n * synthesized empty collection. Registers any required imports (enums,\n * models). Returns null when the type can't be reduced to a concrete\n * Kotlin class.\n */\nfunction renderTypeForSynthesis(type: TypeRef, ctx: EmitterContext, imports: Set<string>): string | null {\n if (type.kind === 'model') {\n const cls = className(type.name);\n imports.add(`com.workos.models.${cls}`);\n return cls;\n }\n if (type.kind === 'enum') {\n const cls = className(type.name);\n imports.add(`com.workos.types.${cls}`);\n return cls;\n }\n if (type.kind === 'union') {\n // Unions render as Any; an empty list is still valid.\n return 'Any';\n }\n // For everything else (primitives, arrays, maps, literals) the IR mapping\n // produces a self-contained Kotlin type expression.\n return mapTypeRef(type);\n}\n\nfunction resolveBodyModel(op: Operation, ctx: EmitterContext): Model | null {\n const body = op.requestBody;\n if (!body) return null;\n if (body.kind !== 'model') return null;\n return ctx.spec.models.find((m) => m.name === body.name) ?? null;\n}\n\n/**\n * Build a minimal JSON string whose required fields satisfy the model's\n * contract. Nested model references are resolved recursively. Returns null\n * if a required field has a type we can't synthesize (e.g. open union).\n */\nfunction synthJsonForModelName(name: string, ctx: EmitterContext, visited: Set<string>): string | null {\n if (visited.has(name)) return null;\n visited.add(name);\n const model = ctx.spec.models.find((m) => m.name === name);\n if (!model) return null;\n\n const entries: string[] = [];\n for (const field of model.fields) {\n if (!field.required) continue;\n const val = synthJsonValue(field.type, ctx, visited);\n if (val === null) {\n visited.delete(name);\n return null;\n }\n entries.push(`${JSON.stringify(field.name)}: ${val}`);\n }\n visited.delete(name);\n return `{${entries.join(', ')}}`;\n}\n\n/** Produce a JSON literal (string) for a given IR TypeRef, or null. */\nfunction synthJsonValue(type: TypeRef, ctx: EmitterContext, visited: Set<string>): string | null {\n if (type.kind === 'nullable') return 'null';\n if (type.kind === 'primitive') {\n if (type.format === 'binary') return '\"\"';\n if (type.format === 'date-time') return '\"2024-01-01T00:00:00Z\"';\n if (type.format === 'date') return '\"2024-01-01\"';\n switch (type.type) {\n case 'string':\n return '\"sample\"';\n case 'integer':\n case 'number':\n return '0';\n case 'boolean':\n return 'false';\n }\n return null;\n }\n if (type.kind === 'enum') {\n const em = ctx.spec.enums.find((e) => e.name === type.name);\n if (em && em.values.length > 0) {\n return JSON.stringify(String(em.values[0].value));\n }\n return '\"unknown\"';\n }\n if (type.kind === 'array') return '[]';\n if (type.kind === 'map') return '{}';\n if (type.kind === 'literal') {\n if (typeof type.value === 'string') return JSON.stringify(type.value);\n if (typeof type.value === 'number') return String(type.value);\n if (typeof type.value === 'boolean') return String(type.value);\n return 'null';\n }\n if (type.kind === 'model') {\n return synthJsonForModelName(type.name, ctx, visited);\n }\n if (type.kind === 'union') {\n // Try to pick a synthesizable variant.\n for (const v of type.variants) {\n const syn = synthJsonValue(v, ctx, visited);\n if (syn !== null) return syn;\n }\n return null;\n }\n return null;\n}\n\n/**\n * Build assertEquals assertions for required scalar fields on a response model.\n * Returns `{ accessor, expectedExpr }` pairs for fields whose JSON value we\n * synthesize and whose Kotlin type we can assert against.\n *\n * Only asserts fields present on ALL structurally-identical models in the\n * dedup group. This avoids broken assertions when the Kotlin class is a\n * typealias pointing at a canonical model with a different field set.\n * As a practical heuristic we restrict to fields that appear on the\n * response model itself (models that get deduplicated share the same fields).\n */\nconst MAX_RESPONSE_ASSERTIONS = 5;\n\nfunction buildResponseAssertions(\n responseModelName: string | null,\n ctx: EmitterContext,\n): { accessor: string; expectedExpr: string }[] {\n if (!responseModelName) return [];\n const model = ctx.spec.models.find((m) => m.name === responseModelName);\n if (!model) return [];\n\n const assertions: { accessor: string; expectedExpr: string }[] = [];\n for (const field of model.fields) {\n if (!field.required) continue;\n if (assertions.length >= MAX_RESPONSE_ASSERTIONS) break;\n const ktProp = propertyName(field.name);\n const type = field.type;\n if (type.kind === 'primitive') {\n if (type.format === 'date-time') continue;\n switch (type.type) {\n case 'string':\n assertions.push({ accessor: ktProp, expectedExpr: '\"sample\"' });\n break;\n case 'integer':\n assertions.push({ accessor: ktProp, expectedExpr: type.format === 'int32' ? '0' : '0L' });\n break;\n case 'number':\n assertions.push({ accessor: ktProp, expectedExpr: '0.0' });\n break;\n case 'boolean':\n assertions.push({ accessor: ktProp, expectedExpr: 'false' });\n break;\n }\n } else if (type.kind === 'literal') {\n if (typeof type.value === 'string') {\n assertions.push({ accessor: ktProp, expectedExpr: ktStringLiteral(type.value) });\n } else if (typeof type.value === 'number') {\n assertions.push({ accessor: ktProp, expectedExpr: String(type.value) });\n } else if (typeof type.value === 'boolean') {\n assertions.push({ accessor: ktProp, expectedExpr: String(type.value) });\n }\n }\n }\n return assertions;\n}\n\nfunction emitHappyPathTest(lines: string[], t: OpTest): void {\n lines.push('');\n lines.push(` @Test`);\n const isVoid = t.responseClass === null;\n const testLabel = isVoid ? `${t.method} completes without throwing` : `${t.method} returns a typed response`;\n lines.push(` fun \\`${testLabel}\\`() {`);\n\n // Void/delete methods don't return a body — stub with 200 and empty body.\n const statusCode = isVoid ? (t.httpMethod === 'delete' ? 204 : 200) : 200;\n if (isVoid) {\n lines.push(\n ` stubResponse(${ktStringLiteral(t.httpMethod.toUpperCase())}, ${ktStringLiteral(t.pathForWireMock)}, ${statusCode})`,\n );\n } else {\n const bodyString = ktStringLiteral(t.minimalResponseBody);\n const stubLine = ` stubResponse(${ktStringLiteral(t.httpMethod.toUpperCase())}, ${ktStringLiteral(t.pathForWireMock)}, ${statusCode}, ${bodyString})`;\n if (stubLine.length <= KTLINT_MAX_LINE_LENGTH) {\n lines.push(stubLine);\n } else {\n lines.push(' stubResponse(');\n lines.push(` ${ktStringLiteral(t.httpMethod.toUpperCase())},`);\n lines.push(` ${ktStringLiteral(t.pathForWireMock)},`);\n lines.push(` ${statusCode},`);\n emitStubResponseBody(lines, ' ', t.minimalResponseBody);\n lines.push(' )');\n }\n }\n\n if (isVoid) {\n emitCall(lines, ' ', `api().${t.method}`, t.callArgs);\n } else {\n emitCall(lines, ' ', `val result = api().${t.method}`, t.callArgs);\n lines.push(' assertNotNull(result)');\n // Emit exact-value assertions for required scalar fields in the response.\n for (const a of t.responseAssertions) {\n lines.push(` assertEquals(${a.expectedExpr}, result.${a.accessor})`);\n }\n }\n\n // Verify the outbound request shape. Body fields and query assertions\n // live on the `OpTest` and are only emitted when we know the synthesized\n // arguments produce a deterministic wire representation.\n if (t.requiredBodyPaths.length > 0 || t.requiredQueryAssertions.length > 0 || t.forbiddenQueryParams.length > 0) {\n lines.push(' wireMockRule.verify(');\n lines.push(` ${t.httpMethod}RequestedFor(urlPathMatching(${ktStringLiteral(t.pathForWireMock)}))`);\n for (const path of t.requiredBodyPaths) {\n lines.push(` .withRequestBody(matchingJsonPath(${ktStringLiteral(`$.${path}`)}))`);\n }\n for (const qa of t.requiredQueryAssertions) {\n lines.push(` .withQueryParam(${ktStringLiteral(qa.name)}, matching(${ktStringLiteral(qa.valueRegex)}))`);\n }\n // Assert sensitive fields from parameter groups never leak into the URL.\n for (const name of t.forbiddenQueryParams) {\n lines.push(` .withQueryParam(${ktStringLiteral(name)}, absent())`);\n }\n lines.push(' )');\n }\n lines.push(' }');\n}\n\n/**\n * Emit a `@Disabled` placeholder for operations whose happy-path arguments\n * could not be synthesized (for example, a required body union that the\n * test generator cannot construct). The disabled test keeps the method in\n * the test report so CI surfaces the coverage gap.\n */\nfunction emitDisabledHappyPathTest(lines: string[], t: OpTest): void {\n lines.push('');\n lines.push(` @Test`);\n lines.push(` @Disabled(\"generator: could not synthesize required arguments for ${t.method}\")`);\n lines.push(` fun \\`${t.method} returns a typed response\\`() {`);\n lines.push(` // Intentionally empty: the generator could not synthesize required arguments.`);\n lines.push(' }');\n}\n\nfunction emitErrorTest(lines: string[], status: string, exceptionName: string, t: OpTest): void {\n lines.push('');\n lines.push(` @Test`);\n lines.push(` fun \\`${t.method} translates ${status} to ${exceptionName}\\`() {`);\n lines.push(\n ` stubResponse(${ktStringLiteral(t.httpMethod.toUpperCase())}, ${ktStringLiteral(t.pathForWireMock)}, ${status})`,\n );\n lines.push(` assertThrows(${exceptionName}::class.java) {`);\n emitCall(lines, ' ', `api().${t.method}`, t.callArgs);\n lines.push(' }');\n lines.push(' }');\n}\n\n/**\n * Emit `val json = \"...\"` on a single line when it fits within KTLINT_MAX_LINE_LENGTH,\n * otherwise split the string literal across lines joined with `+`.\n */\nfunction emitJsonVal(lines: string[], indent: string, rawJson: string): void {\n const encoded = ktStringLiteral(rawJson);\n const singleLine = `${indent}val json = ${encoded}`;\n if (singleLine.length <= KTLINT_MAX_LINE_LENGTH) {\n lines.push(singleLine);\n return;\n }\n // ktlint: \"A multiline expression should start on a new line\"\n lines.push(`${indent}val json =`);\n // ktlint indent rules (with indent_size=2, continuation_indent=2):\n // first continuation after `=`: indent + 2 (e.g. 6 spaces)\n // subsequent `+` continuations: indent + 4 (e.g. 8 spaces)\n const firstIndent = `${indent} `;\n const restIndent = `${indent} `;\n // Budget for the widest indent so every chunk fits.\n const maxChunkLineLen = KTLINT_MAX_LINE_LENGTH - restIndent.length - 2; // 2 for \" +\"\n const chunks = splitEscapedStringLiteral(encoded, maxChunkLineLen);\n for (let i = 0; i < chunks.length; i++) {\n const suffix = i === chunks.length - 1 ? '' : ' +';\n const lineIndent = i === 0 ? firstIndent : restIndent;\n lines.push(`${lineIndent}${chunks[i]}${suffix}`);\n }\n}\n\n/**\n * Emit the body argument for a multi-line `stubResponse(...)` call. When the\n * encoded literal fits on one line it is emitted directly; otherwise it is\n * broken into string-plus-string chunks joined with `+`.\n */\nfunction emitStubResponseBody(lines: string[], indent: string, body: string): void {\n const encoded = ktStringLiteral(body);\n if (`${indent}${encoded}`.length <= KTLINT_MAX_LINE_LENGTH) {\n lines.push(`${indent}${encoded}`);\n return;\n }\n const continuationIndent = indent.length + 2;\n const maxChunkLineLen = KTLINT_MAX_LINE_LENGTH - continuationIndent - 2;\n const chunks = splitEscapedStringLiteral(encoded, maxChunkLineLen);\n for (let i = 0; i < chunks.length; i++) {\n const suffix = i === chunks.length - 1 ? '' : ' +';\n const prefix = i === 0 ? '' : ' ';\n lines.push(`${indent}${prefix}${chunks[i]}${suffix}`);\n }\n}\n\n/**\n * Split a Kotlin string literal (including its wrapping quotes) into\n * smaller literals such that each one is <= [maxChunkLen] characters. Splits\n * preferentially after commas or spaces, and never inside a `\\X` escape\n * sequence.\n */\nfunction splitEscapedStringLiteral(literal: string, maxChunkLen: number): string[] {\n // Strip the outer wrapping quotes.\n const inner = literal.slice(1, -1);\n const chunks: string[] = [];\n // Reserve 2 chars for the wrapping quotes of each output chunk.\n const target = Math.max(20, maxChunkLen - 2);\n let i = 0;\n while (i < inner.length) {\n if (inner.length - i <= target) {\n chunks.push(`\"${inner.slice(i)}\"`);\n break;\n }\n // Prefer a split right after a comma or space within the window. The\n // window is `[i, i + target - 1]` so `safeEnd = j + 1 <= i + target`,\n // keeping the emitted chunk content <= `target` characters long.\n const windowEnd = i + target - 1;\n let safeEnd = -1;\n for (let j = windowEnd; j > i; j--) {\n const ch = inner[j];\n if ((ch === ',' || ch === ' ') && !endsWithOddBackslash(inner, i, j)) {\n safeEnd = j + 1;\n break;\n }\n }\n if (safeEnd === -1) {\n // No comma/space — back up over any trailing backslash pair.\n let end = i + target;\n while (end > i && endsWithOddBackslash(inner, i, end)) end--;\n safeEnd = end;\n }\n chunks.push(`\"${inner.slice(i, safeEnd)}\"`);\n i = safeEnd;\n }\n return chunks;\n}\n\n/** True if the number of trailing `\\` chars in `inner[start..pos-1]` is odd. */\nfunction endsWithOddBackslash(inner: string, start: number, pos: number): boolean {\n let count = 0;\n for (let k = pos - 1; k >= start && inner[k] === '\\\\'; k--) count++;\n return count % 2 === 1;\n}\n\n/**\n * Emit `<prefix>(<args>)` either on a single line or, if that would exceed\n * ktlint's 140-char limit, broken across multiple lines with one argument\n * per line. [indent] is the leading whitespace on the expression line.\n *\n * When splitting a `val name = call.expr(...)` form, the assignment's RHS is\n * moved to its own line (ktlint: \"A multiline expression should start on a\n * new line\").\n */\nfunction emitCall(lines: string[], indent: string, prefix: string, args: string): void {\n const single = `${indent}${prefix}(${args})`;\n if (single.length <= KTLINT_MAX_LINE_LENGTH) {\n lines.push(single);\n return;\n }\n // If the prefix is an assignment (`val x = expr.call`), split the assignment\n // so the expression starts on its own line with an extra indent level.\n const assignMatch = /^((?:val|var) [^=]+=)\\s*(.+)$/.exec(prefix);\n const exprPrefix = assignMatch ? assignMatch[2] : prefix;\n const exprIndent = assignMatch ? `${indent} ` : indent;\n if (assignMatch) lines.push(`${indent}${assignMatch[1]}`);\n lines.push(`${exprIndent}${exprPrefix}(`);\n const argIndent = `${exprIndent} `;\n const parts = splitTopLevelArgs(args);\n for (let i = 0; i < parts.length; i++) {\n const suffix = i === parts.length - 1 ? '' : ',';\n lines.push(`${argIndent}${parts[i]}${suffix}`);\n }\n lines.push(`${exprIndent})`);\n}\n\nconst KTLINT_MAX_LINE_LENGTH = 140;\n\n/** Split a call-argument string on top-level commas (ignoring nested parens/quotes). */\nfunction splitTopLevelArgs(args: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let inString = false;\n let buf = '';\n for (let i = 0; i < args.length; i++) {\n const ch = args[i];\n if (inString) {\n buf += ch;\n if (ch === '\\\\' && i + 1 < args.length) {\n buf += args[++i];\n } else if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n if (ch === '\"') {\n inString = true;\n buf += ch;\n continue;\n }\n if (ch === '(' || ch === '<' || ch === '[' || ch === '{') depth++;\n else if (ch === ')' || ch === '>' || ch === ']' || ch === '}') depth--;\n if (ch === ',' && depth === 0) {\n out.push(buf.trim());\n buf = '';\n continue;\n }\n buf += ch;\n }\n if (buf.trim()) out.push(buf.trim());\n return out;\n}\n\n/**\n * True when a TypeRef is safe for JSON round-trip testing: primitives,\n * nullable wrappers around primitives, literals, and empty arrays/maps.\n * Nested model and enum references are excluded because Jackson\n * reserializes them with additional optional-field defaults that weren't\n * in the original fixture JSON.\n */\nfunction isRoundTripSafeType(ref: TypeRef): boolean {\n if (ref.kind === 'primitive') return true;\n if (ref.kind === 'literal') return true;\n if (ref.kind === 'nullable') return isRoundTripSafeType(ref.inner);\n if (ref.kind === 'array') return isRoundTripSafeType(ref.items);\n if (ref.kind === 'map') return isRoundTripSafeType(ref.valueType);\n return false;\n}\n\nfunction generateModelRoundTripTest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile | null {\n // Collect round-trippable models: non-list-wrapper data classes for which\n // we can synthesize a complete JSON fixture (required fields only).\n // Uses synthJsonForModelName which handles primitives, enums, nested\n // models, arrays, maps, and literals — much broader than the old\n // primitives-only filter.\n const targets: { model: Model; json: string }[] = [];\n const seenModelClassNames = new Set<string>();\n for (const m of spec.models) {\n if (isListWrapperModel(m) || isListMetadataModel(m)) continue;\n if (m.fields.length === 0) continue;\n const cls = className(m.name);\n if (seenModelClassNames.has(cls)) continue;\n seenModelClassNames.add(cls);\n // Only include models where ALL fields are required AND all types are\n // round-trip safe (primitives, nullable, literals, simple arrays/maps).\n // Nested model/enum references break round-trip because Jackson\n // reserializes with additional default fields not in the original JSON.\n if (!m.fields.every((f) => f.required && isRoundTripSafeType(f.type))) continue;\n const json = synthJsonForModelName(m.name, ctx, new Set());\n if (json !== null) targets.push({ model: m, json });\n }\n if (targets.length === 0) return null;\n\n const lines: string[] = [\n 'package com.workos.models',\n '',\n 'import com.workos.common.json.ObjectMapperFactory',\n 'import org.junit.jupiter.api.Assertions.assertEquals',\n 'import org.junit.jupiter.api.Test',\n '',\n 'class GeneratedModelRoundTripTest {',\n ' private val mapper = ObjectMapperFactory.create()',\n ];\n\n for (const { model, json } of targets) {\n const cls = className(model.name);\n lines.push('', ' @Test', ` fun \\`${cls} round-trips through Jackson\\`() {`);\n emitJsonVal(lines, ' ', json);\n lines.push(\n ` val parsed = mapper.readValue(json, ${cls}::class.java)`,\n ' val reserialized = mapper.writeValueAsString(parsed)',\n ' val tree1 = mapper.readTree(json)',\n ' val tree2 = mapper.readTree(reserialized)',\n ' assertEquals(tree1, tree2)',\n ' }',\n );\n }\n\n lines.push('}', '');\n\n return {\n path: `${TEST_PREFIX}com/workos/models/GeneratedModelRoundTripTest.kt`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\n/**\n * Emit a forward-compatibility suite that proves:\n * - unrecognized enum wire values map to the `Unknown` sentinel rather\n * than throwing (covers the Jackson @JsonEnumDefaultValue wiring);\n * - unknown top-level JSON fields on a model do not fail deserialization\n * (FAIL_ON_UNKNOWN_PROPERTIES=false);\n * - ISO-8601 timestamps round-trip through `OffsetDateTime` without\n * precision loss.\n *\n * Tests a representative set of enums (up to MAX_ENUM_FORWARD_COMPAT) and\n * the first synthesizable model.\n */\nconst MAX_ENUM_FORWARD_COMPAT = 15;\n\nfunction generateForwardCompatTest(spec: ApiSpec, ctx: EmitterContext): GeneratedFile | null {\n // Select multiple enums for forward-compat testing, not just the first.\n const enumTargets = spec.enums.filter((e) => e.values.length > 0).slice(0, MAX_ENUM_FORWARD_COMPAT);\n const modelTarget = spec.models.find((m) => {\n if (isListWrapperModel(m) || isListMetadataModel(m)) return false;\n if (m.fields.length === 0) return false;\n return synthJsonForModelName(m.name, ctx, new Set()) !== null;\n });\n if (enumTargets.length === 0 && !modelTarget) return null;\n\n const enumImports = new Set<string>();\n for (const e of enumTargets) enumImports.add(`com.workos.types.${className(e.name)}`);\n\n const lines: string[] = [\n 'package com.workos.models',\n '',\n 'import com.fasterxml.jackson.core.type.TypeReference',\n 'import com.workos.common.json.ObjectMapperFactory',\n ];\n for (const imp of [...enumImports].sort()) lines.push(`import ${imp}`);\n lines.push(\n 'import org.junit.jupiter.api.Assertions.assertEquals',\n 'import org.junit.jupiter.api.Assertions.assertNotNull',\n 'import org.junit.jupiter.api.Test',\n '',\n 'class GeneratedForwardCompatTest {',\n ' private val mapper = ObjectMapperFactory.create()',\n );\n\n for (const enumTarget of enumTargets) {\n const enumCls = className(enumTarget.name);\n lines.push(\n '',\n ` @Test`,\n ` fun \\`unknown ${enumCls} wire values deserialize to Unknown\\`() {`,\n ' // Simulates a future server release that introduces a new enum variant.',\n ` val parsed = mapper.readValue(${ktStringLiteral('\"__oagen_new_variant__\"')}, ${enumCls}::class.java)`,\n ` assertEquals(${enumCls}.Unknown, parsed)`,\n ' }',\n );\n }\n\n if (modelTarget) {\n const modelCls = className(modelTarget.name);\n const jsonLiteral = synthJsonForModelName(modelTarget.name, ctx, new Set())!;\n const jsonWithExtra = jsonLiteral.replace('{', '{\"__oagen_future_field__\": \"ignored\", ');\n lines.push('', ` @Test`, ` fun \\`${modelCls} ignores unknown JSON fields\\`() {`);\n emitJsonVal(lines, ' ', jsonWithExtra);\n lines.push(` val parsed = mapper.readValue(json, ${modelCls}::class.java)`, ' assertNotNull(parsed)', ' }');\n }\n\n lines.push(\n '',\n ' @Test',\n ' fun `OffsetDateTime round-trips through the configured mapper`() {',\n ' val jsonIn = \"\\\\\"2024-01-15T12:34:56.789Z\\\\\"\"',\n ' val parsed = mapper.readValue(jsonIn, object : TypeReference<java.time.OffsetDateTime>() {})',\n ' val reserialized = mapper.writeValueAsString(parsed)',\n ' // Jackson serializes OffsetDateTime as an ISO-8601 string when',\n ' // WRITE_DATES_AS_TIMESTAMPS is disabled. The wire form may choose a',\n ' // different offset representation (e.g. \"+00:00\" vs \"Z\") so compare',\n ' // logical equality of the parsed value rather than the raw string.',\n ' val reparsed = mapper.readValue(reserialized, object : TypeReference<java.time.OffsetDateTime>() {})',\n ' assertEquals(parsed.toInstant(), reparsed.toInstant())',\n ' }',\n '}',\n '',\n );\n\n return {\n path: `${TEST_PREFIX}com/workos/models/GeneratedForwardCompatTest.kt`,\n content: lines.join('\\n'),\n overwriteExisting: true,\n };\n}\n\nfunction findService(ctx: EmitterContext, op: Operation): Service | undefined {\n for (const service of ctx.spec.services) {\n if (service.operations.includes(op)) return service;\n }\n return undefined;\n}\n","import type { ApiSpec, EmitterContext, OperationsMap } from '@workos/oagen';\nimport { resolveMethodName, servicePropertyName, resolveClassName } from './naming.js';\nimport { buildResolvedLookup, lookupResolved, getMountTarget } from '../shared/resolved-ops.js';\nimport { propertyName } from './naming.js';\nimport { isHandwrittenOverride } from './overrides.js';\n\n/**\n * Build the operation-to-SDK-method mapping for the manifest.\n *\n * The `service` is the camelCase accessor property on the main `WorkOS`\n * client (e.g., `organizations`).\n *\n * For polymorphic/split operations (e.g., authenticate -> 8 methods), the\n * manifest emits an array of methods so each variant is addressable.\n */\nexport function buildOperationsMap(spec: ApiSpec, ctx: EmitterContext): OperationsMap {\n const manifest: OperationsMap = {};\n const resolvedLookup = buildResolvedLookup(ctx);\n\n for (const service of spec.services) {\n const mountTarget = getMountTarget(service, ctx);\n const prop = servicePropertyName(resolveClassName(service, ctx) || mountTarget);\n for (const op of service.operations) {\n if (isHandwrittenOverride(op)) continue;\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n\n // Check if this operation is split into wrapper methods\n const resolved = lookupResolved(op, resolvedLookup);\n const wrappers = resolved?.wrappers ?? [];\n\n // Use the resolved mount target for correct service attribution\n const resolvedProp = resolved ? servicePropertyName(resolved.mountOn) : prop;\n\n if (wrappers.length > 0) {\n // Polymorphic operation: emit an array of methods\n const methods = wrappers.map((w) => ({\n sdkMethod: propertyName(w.name),\n service: resolvedProp,\n }));\n manifest[httpKey] = methods;\n } else {\n const method = resolveMethodName(op, service, ctx);\n manifest[httpKey] = { sdkMethod: method, service: resolvedProp };\n }\n }\n }\n\n return manifest;\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 fs from 'node:fs';\nimport 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 { buildOperationsMap } from './manifest.js';\nimport { enrichModelsFromSpec, getSyntheticEnums } from '../shared/model-utils.js';\n\n/** Ensure every generated file 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 kotlinEmitter: Emitter = {\n language: 'kotlin',\n\n generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n const enriched = enrichModelsFromSpec(models);\n // Kotlin uses sealed interfaces (WorkOSEvent) for event dispatch rather\n // than class inheritance, so discriminated base models like EventSchema\n // need their fields restored to be emitted as proper data classes.\n // enrichModelsFromSpec clears fields for dispatcher-capable languages;\n // restore the originals here so Kotlin emits a full data class.\n const originalByName = new Map(models.map((m) => [m.name, m]));\n const kotlinModels = enriched.map((m) => {\n if ((m as any).discriminator && m.fields.length === 0) {\n const original = originalByName.get(m.name);\n if (original && original.fields.length > 0) {\n return { ...m, fields: original.fields };\n }\n }\n return m;\n });\n return ensureTrailingNewlines(generateModels(kotlinModels, 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 enum class files.\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(_ctx: EmitterContext): GeneratedFile[] {\n // Exception hierarchy is hand-maintained in workos-kotlin (see Phase 2).\n return [];\n },\n\n generateTypeSignatures(): GeneratedFile[] {\n return [];\n },\n\n generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n // Pass enriched models so round-trip tests see the full field set\n // (including optional oneOf-enriched fields) and can filter accurately.\n const enrichedModels = enrichModelsFromSpec(spec.models);\n const enrichedSpec: ApiSpec = { ...spec, models: enrichedModels };\n return ensureTrailingNewlines(generateTests(enrichedSpec, { ...ctx, spec: enrichedSpec }));\n },\n\n buildOperationsMap(spec: ApiSpec, ctx: EmitterContext) {\n return buildOperationsMap(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 // ktlint enforces a 140-char max line length that cannot be auto-corrected\n // by the Gradle plugin alone, but `./gradlew ktlintFormat` fixes most\n // violations (trailing whitespace, import ordering, etc.) across all\n // generated files. The file list appended by oagen is ignored — Gradle\n // reformats the whole source set.\n if (!fs.existsSync(path.join(targetDir, 'gradlew'))) return null;\n return {\n cmd: 'bash',\n args: ['-c', `cd ${JSON.stringify(targetDir)} && ./gradlew ktlintFormat --quiet 2>/dev/null; true`, '--'],\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, applyAcronymFixes } from '../shared/naming-utils.js';\n\n/**\n * Ruby class names that collide with core classes. When a model name resolves\n * to one of these, suffix with \"Model\".\n */\nconst RUBY_RESERVED_CLASS_NAMES = new Set([\n 'Array',\n 'Hash',\n 'String',\n 'Integer',\n 'Float',\n 'Object',\n 'Module',\n 'Class',\n 'Comparable',\n 'Enumerable',\n 'Range',\n 'Proc',\n 'Method',\n 'Regexp',\n 'Symbol',\n 'File',\n 'Dir',\n 'IO',\n 'Data',\n]);\n\n/** PascalCase class name with acronym preservation. */\nexport function className(name: string): string {\n let result = applyAcronymFixes(toPascalCase(stripUrnPrefix(name)));\n if (RUBY_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 * Ruby reserved words that cannot be used as parameter names.\n * When a path/query param name collides, suffix with underscore.\n */\nconst RUBY_RESERVED_WORDS = new Set([\n 'BEGIN',\n 'END',\n 'alias',\n 'and',\n 'begin',\n 'break',\n 'case',\n 'class',\n 'def',\n 'defined?',\n 'do',\n 'else',\n 'elsif',\n 'end',\n 'ensure',\n 'false',\n 'for',\n 'if',\n 'in',\n 'module',\n 'next',\n 'nil',\n 'not',\n 'or',\n 'redo',\n 'rescue',\n 'retry',\n 'return',\n 'self',\n 'super',\n 'then',\n 'true',\n 'undef',\n 'unless',\n 'until',\n 'when',\n 'while',\n 'yield',\n // Common methods on Object/Kernel that shouldn't be shadowed\n 'hash',\n 'send',\n 'class',\n 'method',\n 'tap',\n]);\n\n/**\n * Safe parameter name for path/query params that avoids shadowing Ruby reserved words.\n */\nexport function safeParamName(name: string): string {\n const snake = toSnakeCase(name);\n return RUBY_RESERVED_WORDS.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/** 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 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 for (const r of ctx.resolvedOperations ?? []) {\n if (r.service.name === service.name) return 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 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 */\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","import type { Model, EmitterContext, GeneratedFile, TypeRef, Field } from '@workos/oagen';\nimport { walkTypeRef, assignModelsToServices } from '@workos/oagen';\nimport { className, fieldName, fileName, buildMountDirMap } from './naming.js';\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\n\n/** Folder under lib/workos/ for models not owned by any service. */\nexport const SHARED_MODEL_DIR = 'shared';\n\n/**\n * Prefix → mount-target-dir map for models that `assignModelsToServices` can't\n * place (mostly webhook event payloads whose types aren't directly returned by\n * any API operation). The prefix is the PascalCase model-name prefix.\n *\n * Order matters: longest prefix wins (checked first). Prefixes not in this map\n * land in `shared/`.\n */\nexport const EVENT_MODEL_DIR_BY_PREFIX: ReadonlyArray<readonly [string, string]> = [\n // Longer prefixes first — prefix matching is first-hit wins.\n ['ApiKey', 'api_keys'],\n ['OrganizationDomain', 'organization_domains'],\n ['Organization', 'organizations'],\n ['Authentication', 'user_management'],\n ['Invitation', 'user_management'],\n ['MagicAuth', 'user_management'],\n ['Magic', 'user_management'],\n ['Password', 'user_management'],\n ['Email', 'user_management'],\n ['Session', 'user_management'],\n ['Action', 'user_management'],\n ['User', 'user_management'],\n ['Connection', 'sso'],\n ['Dsync', 'directory_sync'],\n ['Directory', 'directory_sync'],\n ['Flag', 'feature_flags'],\n ['Role', 'authorization'],\n ['Permission', 'authorization'],\n // Vault has no generated resource class (service is hand-maintained in the\n // Ruby SDK), but the webhook payload models ship from the spec — group them\n // under vault/ so the folder tree matches the hand-written client.\n ['Vault', 'vault'],\n];\n\n/** Pick a subfolder for a model not assigned to any service. */\nexport function classifyUnassignedModel(modelName: string): string {\n for (const [prefix, dir] of EVENT_MODEL_DIR_BY_PREFIX) {\n if (modelName.startsWith(prefix)) return dir;\n }\n return SHARED_MODEL_DIR;\n}\n\n/**\n * Generate Ruby model classes from IR Model definitions.\n *\n * Each model becomes a file at `lib/workos/{snake_name}.rb` containing\n * a class under `WorkOS::` with:\n * - attr_accessor for all fields\n * - initialize(json) that parses JSON\n * - to_json(*) that returns a hash\n */\nexport function generateModels(models: Model[], ctx: EmitterContext): GeneratedFile[] {\n if (models.length === 0) return [];\n\n // Enum name set — used to detect enum-typed fields (treated as plain strings in Ruby).\n const enumNames = new Set(ctx.spec.enums.map((e) => e.name));\n const modelNames = new Set(models.map((m) => m.name));\n\n // Model → mount target directory. Each model is assigned to the first service\n // that references it (transitively). Orphans land in `shared/`. Zeitwerk is\n // told to collapse each subfolder (in client.ts) so the namespace stays flat.\n const modelToService = assignModelsToServices(models, ctx.spec.services);\n const mountDirMap = buildMountDirMap(ctx);\n const dirFor = (modelName: string): string => {\n const service = modelToService.get(modelName);\n if (!service) return classifyUnassignedModel(modelName);\n return mountDirMap.get(service) ?? classifyUnassignedModel(modelName);\n };\n\n const files: GeneratedFile[] = [];\n\n // Dedup identical models (by recursive structural hash).\n const recursiveHashes = buildRecursiveHashMap(models, enumNames);\n const hashGroups = new Map<string, string[]>();\n for (const m of models) {\n if (isListWrapperModel(m) || isListMetadataModel(m)) continue;\n const h = recursiveHashes.get(m.name) ?? '';\n if (!hashGroups.has(h)) hashGroups.set(h, []);\n hashGroups.get(h)!.push(m.name);\n }\n const aliasOf = new Map<string, string>();\n for (const names of hashGroups.values()) {\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++) aliasOf.set(sorted[i], canonical);\n }\n\n for (const model of models) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n\n const cls = className(model.name);\n const file = fileName(model.name);\n\n // Ruby constant alias for duplicate models. Zeitwerk resolves the\n // canonical on reference; the alias file just assigns the constant.\n const canonical = aliasOf.get(model.name);\n if (canonical) {\n const canonCls = className(canonical);\n const lines: string[] = [];\n lines.push('module WorkOS');\n lines.push(` ${cls} = ${canonCls}`);\n lines.push('end');\n files.push({\n path: `lib/workos/${dirFor(model.name)}/${file}.rb`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n continue;\n }\n\n // Deduplicate field names that collide after snake_case.\n const seenFieldNames = new Set<string>();\n const fields = model.fields.filter((f) => {\n const n = fieldName(f.name);\n if (seenFieldNames.has(n)) return false;\n seenFieldNames.add(n);\n return true;\n });\n\n const lines: string[] = [];\n lines.push('module WorkOS');\n lines.push(` class ${cls} < WorkOS::Types::BaseModel`);\n lines.push('');\n\n // Split fields into non-deprecated (attr_accessor) and deprecated (explicit accessors with warn).\n const accessorFields = fields.filter((f) => !f.deprecated);\n const deprecatedFields = fields.filter((f) => f.deprecated);\n\n // HASH_ATTRS maps wire names (symbols) to Ruby attribute names (symbols).\n // HashProvider uses this for to_h, to_json, and inspect.\n lines.push(' HASH_ATTRS = {');\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const fname = fieldName(field.name);\n const sep = i === fields.length - 1 ? '' : ',';\n lines.push(` ${rubyHashLiteralKey(field.name)} :${fname}${sep}`);\n }\n lines.push(' }.freeze');\n lines.push('');\n\n // Emit @deprecated YARD tags for any deprecated fields before the accessor block.\n if (deprecatedFields.length > 0) {\n for (const f of deprecatedFields) {\n const desc = f.description ? ` ${f.description.split('\\n')[0].trim()}` : '';\n lines.push(` # @!attribute ${fieldName(f.name)}`);\n lines.push(` # @deprecated${desc}`);\n }\n lines.push('');\n }\n\n if (accessorFields.length > 0) {\n const attrs = accessorFields.map((f) => `:${fieldName(f.name)}`);\n if (attrs.length === 1) {\n lines.push(` attr_accessor ${attrs[0]}`);\n } else {\n lines.push(` attr_accessor \\\\`);\n for (let i = 0; i < attrs.length; i++) {\n const sep = i === attrs.length - 1 ? '' : ',';\n lines.push(` ${attrs[i]}${sep}`);\n }\n }\n lines.push('');\n }\n\n // Emit deprecated field accessors with runtime warnings.\n for (const f of deprecatedFields) {\n const fname = fieldName(f.name);\n lines.push(` def ${fname}`);\n lines.push(\n ` warn \"[DEPRECATION] \\\\\\`${fname}\\\\\\` is deprecated and will be removed in a future version.\", uplevel: 1`,\n );\n lines.push(` @${fname}`);\n lines.push(' end');\n lines.push('');\n lines.push(` def ${fname}=(value)`);\n lines.push(` @${fname} = value`);\n lines.push(' end');\n lines.push('');\n }\n\n // initialize(json)\n lines.push(' def initialize(json)');\n lines.push(' hash = self.class.normalize(json)');\n for (const field of fields) {\n const fname = fieldName(field.name);\n const rawKey = field.name;\n lines.push(` ${deserializeAssignment(fname, rawKey, field.type, field.required, enumNames, modelNames)}`);\n }\n lines.push(' end');\n\n lines.push(' end');\n lines.push('end');\n\n files.push({\n path: `lib/workos/${dirFor(model.name)}/${file}.rb`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\n/**\n * Produce a Ruby assignment line like `@foo = hash[:foo]` or the appropriate\n * nested-model construction for the field's type.\n */\nfunction deserializeAssignment(\n rubyFieldName: string,\n rawKey: string,\n ref: TypeRef,\n required: boolean,\n enumNames: Set<string>,\n modelNames: Set<string>,\n): string {\n const accessor = rubyHashAccessor('hash', rawKey);\n const expr = deserializeExpression(accessor, ref, required, enumNames, modelNames);\n return `@${rubyFieldName} = ${expr}`;\n}\n\n/** Build an expression that deserializes a TypeRef from the given accessor. */\nfunction deserializeExpression(\n accessor: string,\n ref: TypeRef,\n required: boolean,\n enumNames: Set<string>,\n modelNames: Set<string>,\n): string {\n void enumNames;\n // Unwrap nullable — nullable behaves like optional at the value level.\n if (ref.kind === 'nullable') {\n return deserializeExpression(accessor, ref.inner, false, enumNames, modelNames);\n }\n\n if (ref.kind === 'array') {\n const inner = ref.items;\n const itemDeser = deserializeExpression('item', inner, true, enumNames, modelNames);\n if (itemDeser === 'item') {\n return `(${accessor} || [])`;\n }\n return `(${accessor} || []).map { |item| ${itemDeser} }`;\n }\n\n if (ref.kind === 'map') {\n return `${accessor} || {}`;\n }\n\n if (ref.kind === 'model' && modelNames.has(ref.name)) {\n const cls = `WorkOS::${className(ref.name)}`;\n if (required) {\n return `${accessor} ? ${cls}.new(${accessor}) : nil`;\n }\n return `${accessor} ? ${cls}.new(${accessor}) : nil`;\n }\n\n if (ref.kind === 'enum' && enumNames.has(ref.name)) {\n return accessor; // enums are plain strings in Ruby (values match server)\n }\n\n if (ref.kind === 'union') {\n // Unions: if all variants are models, try each; otherwise return raw value.\n const modelVariants = ref.variants.filter((v) => v.kind === 'model' && modelNames.has(v.name));\n if (modelVariants.length > 0 && modelVariants.length === ref.variants.length) {\n // Multiple model variants — default to first successful parse or raw value.\n return accessor; // simplification: return raw, let user inspect\n }\n return accessor;\n }\n\n if (ref.kind === 'literal') {\n return accessor;\n }\n\n // primitive\n return accessor;\n}\n\n/** Produce a Ruby accessor expression `hash[:foo]` or `hash[:\"weird#name\"]` for a raw field name. */\nfunction rubyHashAccessor(accessor: string, name: string): string {\n if (/^[a-z_][a-zA-Z0-9_]*$/.test(name)) {\n return `${accessor}[:${name}]`;\n }\n // Non-simple identifier: quoted symbol literal.\n return `${accessor}[:\"${name.replace(/\"/g, '\\\\\"')}\"]`;\n}\n\n/** Produce a Ruby hash key literal (e.g., `foo:` shorthand or `\"foo#bar\" =>`).\n * Simple identifiers (including camelCase) use symbol shorthand; names with\n * special characters fall back to string-key `=>` syntax. */\nfunction rubyHashLiteralKey(name: string): string {\n if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n return `${name}:`;\n }\n return `\"${name.replace(/\"/g, '\\\\\"')}\" =>`;\n}\n\n/** Build a recursive structural hash map for model deduplication. */\nfunction buildRecursiveHashMap(models: Model[], enumNames: Set<string>): Map<string, string> {\n const modelByName = new Map(models.map((m) => [m.name, m]));\n const memo = new Map<string, string>();\n\n const hashTypeRef = (ref: TypeRef, visiting: Set<string>): string => {\n switch (ref.kind) {\n case 'primitive':\n return `P:${ref.type}${ref.format ?? ''}`;\n case 'array':\n return `A[${hashTypeRef(ref.items, visiting)}]`;\n case 'nullable':\n return `N[${hashTypeRef(ref.inner, visiting)}]`;\n case 'map':\n return `M[${hashTypeRef(ref.valueType, visiting)}]`;\n case 'literal':\n return `L:${String(ref.value)}`;\n case 'enum':\n return `E:${ref.name}`;\n case 'model': {\n if (visiting.has(ref.name)) return `R:${ref.name}`; // cycle\n return `Ref[${hashModel(ref.name, visiting)}]`;\n }\n case 'union':\n return `U[${ref.variants.map((v) => hashTypeRef(v, visiting)).join(',')}]`;\n }\n return 'unknown';\n };\n\n const hashField = (f: Field, visiting: Set<string>): string => {\n return `${f.name}:${f.required ? 'R' : 'O'}:${hashTypeRef(f.type, visiting)}`;\n };\n\n const hashModel = (name: string, visiting: Set<string>): string => {\n if (memo.has(name)) return memo.get(name)!;\n const m = modelByName.get(name);\n if (!m) return `?:${name}`;\n visiting.add(name);\n const fieldsSorted = [...m.fields].sort((a, b) => a.name.localeCompare(b.name));\n const h = fieldsSorted.map((f) => hashField(f, visiting)).join('|');\n visiting.delete(name);\n memo.set(name, h);\n return h;\n };\n\n void enumNames;\n void walkTypeRef;\n const out = new Map<string, string>();\n for (const m of models) {\n out.set(m.name, hashModel(m.name, new Set()));\n }\n return out;\n}\n","import type { Enum, EmitterContext, GeneratedFile } from '@workos/oagen';\nimport { toUpperSnakeCase } from '@workos/oagen';\nimport { className, fileName } from './naming.js';\n\n/**\n * Generate Ruby enum class files.\n *\n * Each enum becomes a class under `WorkOS::Types::` with uppercase constants\n * and a frozen `ALL` array of all values.\n */\nexport function generateEnums(enums: Enum[], ctx: EmitterContext): GeneratedFile[] {\n void ctx;\n if (enums.length === 0) return [];\n\n const files: GeneratedFile[] = [];\n const aliasOf = collectEnumAliasOf(enums);\n\n for (const enumDef of enums) {\n const cls = className(enumDef.name);\n\n // If this enum duplicates another (by value set), emit a Ruby constant\n // alias. Zeitwerk autoloads the canonical when the alias is first\n // referenced.\n const canonicalName = aliasOf.get(enumDef.name);\n if (canonicalName) {\n const canonicalCls = className(canonicalName);\n const lines: string[] = [];\n lines.push('module WorkOS');\n lines.push(' module Types');\n lines.push(` ${cls} = ${canonicalCls}`);\n lines.push(' end');\n lines.push('end');\n files.push({\n path: `lib/workos/types/${fileName(enumDef.name)}.rb`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n continue;\n }\n\n // Deduplicate repeated string values.\n const seen = new Set<string>();\n const uniqueValues: typeof enumDef.values = [];\n for (const v of enumDef.values) {\n const str = String(v.value);\n if (!seen.has(str)) {\n seen.add(str);\n uniqueValues.push({ ...v, value: str });\n }\n }\n\n if (uniqueValues.length === 0) {\n // No values — emit a placeholder string-alias class.\n const lines: string[] = [];\n lines.push('module WorkOS');\n lines.push(' module Types');\n lines.push(` class ${cls}`);\n lines.push(' ALL = [].freeze');\n lines.push(' end');\n lines.push(' end');\n lines.push('end');\n files.push({\n path: `lib/workos/types/${fileName(enumDef.name)}.rb`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n continue;\n }\n\n // Determine string vs integer enum.\n const allIntegers = uniqueValues.every((v) => typeof v.value === 'number' && Number.isInteger(v.value));\n\n // Reserve ALL for the frozen list constant at the bottom; any enum value\n // whose upper-snake form collides gets a VALUE_ prefix.\n const RESERVED_MEMBER_NAMES = new Set(['ALL']);\n const usedNames = new Set<string>();\n const memberLines: string[] = [];\n const allEntries: string[] = [];\n\n for (const v of uniqueValues) {\n let member = toUpperSnakeCase(String(v.value));\n // Ruby constants must start with an uppercase letter.\n if (!/^[A-Z]/.test(member)) member = `VALUE_${member}`;\n if (RESERVED_MEMBER_NAMES.has(member)) member = `VALUE_${member}`;\n if (usedNames.has(member)) {\n let suffix = 2;\n while (usedNames.has(`${member}_${suffix}`)) suffix++;\n member = `${member}_${suffix}`;\n }\n usedNames.add(member);\n const valueLit = allIntegers ? String(v.value) : `'${String(v.value).replace(/'/g, \"\\\\'\")}'`;\n if (v.deprecated) {\n memberLines.push(` # @deprecated`);\n }\n memberLines.push(` ${member} = ${valueLit}`);\n allEntries.push(member);\n }\n\n const lines: string[] = [];\n lines.push('module WorkOS');\n lines.push(' module Types');\n lines.push(` class ${cls}`);\n lines.push(...memberLines);\n lines.push(` ALL = [${allEntries.join(', ')}].freeze`);\n lines.push(' end');\n lines.push(' end');\n lines.push('end');\n\n files.push({\n path: `lib/workos/types/${fileName(enumDef.name)}.rb`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\n/**\n * Detect when two or more enums have the same value set — pick the lexicographically\n * first as canonical and return a map of aliasName -> canonicalName for the rest.\n */\nfunction collectEnumAliasOf(enums: Enum[]): Map<string, string> {\n const hashGroups = new Map<string, string[]>();\n for (const e of enums) {\n const hash = [...e.values]\n .map((v) => String(v.value))\n .sort()\n .join('|');\n if (!hashGroups.has(hash)) hashGroups.set(hash, []);\n hashGroups.get(hash)!.push(e.name);\n }\n const aliasOf = new Map<string, string>();\n for (const names of hashGroups.values()) {\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++) aliasOf.set(sorted[i], canonical);\n }\n return aliasOf;\n}\n\n/** Collect the set of enum names that were emitted. */\nexport function collectEnumSymbols(enums: Enum[]): string[] {\n return enums.map((e) => e.name);\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 Ruby YARD doc type string.\n * Ruby is dynamically typed, so these are used only in YARD comments.\n */\nexport function mapTypeRef(ref: TypeRef): string {\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\n array: (ref, items) => {\n void ref;\n return `Array<${items}>`;\n },\n model: (r) => `WorkOS::${className(r.name)}`,\n enum: (r) => `WorkOS::Types::${className(r.name)}`,\n union: (r, variants) => joinUnionVariants(r, variants),\n nullable: (ref, inner) => {\n void ref;\n return inner;\n },\n literal: (r) => (typeof r.value === 'string' ? 'String' : r.value === null ? 'nil' : typeof r.value),\n map: (ref, value) => {\n void ref;\n return `Hash{String => ${value}}`;\n },\n });\n}\n\n/**\n * Map an IR TypeRef to a more verbose Ruby-compatible type string for documentation.\n * Includes `nil` for nullable types (YARD convention: `[Foo, nil]`).\n */\nexport function mapTypeRefForYard(ref: TypeRef): string {\n return irMapTypeRef<string>(ref, {\n primitive: mapPrimitive,\n array: (ref, items) => {\n void ref;\n return `Array<${items}>`;\n },\n model: (r) => `WorkOS::${className(r.name)}`,\n enum: (r) => `WorkOS::Types::${className(r.name)}`,\n union: (r, variants) => joinUnionVariantsYard(r, variants),\n nullable: (ref, inner) => {\n void ref;\n // Avoid duplicate nil when inner already contains nil (e.g. from a union with a null literal).\n const parts = inner.split(', ');\n if (parts.includes('nil')) return inner;\n return `${inner}, nil`;\n },\n literal: (r) => (typeof r.value === 'string' ? 'String' : r.value === null ? 'nil' : typeof r.value),\n map: (ref, value) => {\n void ref;\n return `Hash{String => ${value}}`;\n },\n });\n}\n\nfunction mapPrimitive(ref: PrimitiveType): string {\n if (ref.format) {\n switch (ref.format) {\n case 'binary':\n return 'String';\n }\n }\n switch (ref.type) {\n case 'string':\n return 'String';\n case 'integer':\n return 'Integer';\n case 'number':\n return 'Float';\n case 'boolean':\n return 'Boolean';\n case 'unknown':\n return 'Object';\n }\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 return unique.join(', ');\n}\n\nfunction joinUnionVariantsYard(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 return unique.join(', ');\n}\n","import type { EmitterContext, Operation, ResolvedOperation, ResolvedWrapper } from '@workos/oagen';\nimport { className, fieldName, safeParamName } from './naming.js';\nimport { resolveWrapperParams, formatWrapperDescription } from '../shared/wrapper-utils.js';\nimport { mapTypeRefForYard } from './type-map.js';\n\n/**\n * Generate Ruby wrapper method lines for union split operations.\n *\n * Each wrapper is a typed convenience method that:\n * - Accepts only the exposed params (keyword args)\n * - Injects constant defaults (e.g., grant_type)\n * - Reads inferred fields from client config (e.g., client_id)\n * - Delegates to the same HTTP runtime as the main method\n */\nexport function generateWrapperMethods(\n resolvedOp: ResolvedOperation,\n ctx: EmitterContext,\n modelNames: Set<string>,\n requires: Set<string>,\n): string[] {\n if (!resolvedOp.wrappers || resolvedOp.wrappers.length === 0) return [];\n const out: string[] = [];\n for (const wrapper of resolvedOp.wrappers) {\n const body = emitWrapperMethod(resolvedOp.operation, wrapper, ctx, modelNames, requires);\n out.push(body);\n }\n return out;\n}\n\n/** Collect response model filenames needed for wrapper imports. */\nexport function collectWrapperResponseModels(resolvedOp: ResolvedOperation): Set<string> {\n const models = new Set<string>();\n for (const w of resolvedOp.wrappers ?? []) {\n if (w.responseModelName) models.add(w.responseModelName);\n }\n return models;\n}\n\nfunction emitWrapperMethod(\n op: Operation,\n wrapper: ResolvedWrapper,\n ctx: EmitterContext,\n modelNames: Set<string>,\n requires: Set<string>,\n): string {\n void requires;\n const method = wrapper.name; // already snake_case\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n const lines: string[] = [];\n\n // YARD doc\n lines.push(` # ${formatWrapperDescription(wrapper.name)}.`);\n for (const p of op.pathParams ?? []) {\n const pyType = mapTypeRefForYard(p.type);\n lines.push(` # @param ${safeParamName(p.name)} [${pyType}]`);\n }\n for (const wp of wrapperParams) {\n const type = wp.field ? mapTypeRefForYard(wp.field.type) : 'String';\n const alreadyNilable = type.split(', ').includes('nil');\n const suffix = wp.isOptional && !alreadyNilable ? ', nil' : '';\n lines.push(` # @param ${fieldName(wp.paramName)} [${type}${suffix}]`);\n }\n lines.push(` # @param request_options [Hash] Per-request overrides.`);\n if (wrapper.responseModelName) {\n lines.push(` # @return [WorkOS::${className(wrapper.responseModelName)}]`);\n } else {\n lines.push(` # @return [nil]`);\n }\n\n // Signature\n const sigParts: string[] = [];\n const seen = new Set<string>();\n for (const p of op.pathParams ?? []) {\n const n = safeParamName(p.name);\n if (seen.has(n)) continue;\n seen.add(n);\n sigParts.push(`${n}:`);\n }\n // Required first, then optional\n for (const wp of wrapperParams) {\n if (wp.isOptional) continue;\n const n = fieldName(wp.paramName);\n if (seen.has(n)) continue;\n seen.add(n);\n sigParts.push(`${n}:`);\n }\n for (const wp of wrapperParams) {\n if (!wp.isOptional) continue;\n const n = fieldName(wp.paramName);\n if (seen.has(n)) continue;\n seen.add(n);\n sigParts.push(`${n}: nil`);\n }\n sigParts.push('request_options: {}');\n\n if (sigParts.length === 1 && sigParts[0].length < 60) {\n lines.push(` def ${method}(${sigParts[0]})`);\n } else {\n lines.push(` def ${method}(`);\n for (let i = 0; i < sigParts.length; i++) {\n const sep = i === sigParts.length - 1 ? '' : ',';\n lines.push(` ${sigParts[i]}${sep}`);\n }\n lines.push(' )');\n }\n\n // Body hash\n const bodyEntries: string[] = [];\n for (const [k, v] of Object.entries(wrapper.defaults)) {\n const lit = typeof v === 'string' ? rubyStringLit(v) : String(v);\n bodyEntries.push(`${rubyStringLit(k)} => ${lit}`);\n }\n for (const fc of wrapper.inferFromClient) {\n const clientProp = fc === 'client_secret' ? 'api_key' : fc;\n bodyEntries.push(`${rubyStringLit(fc)} => @client.${clientProp}`);\n }\n for (const wp of wrapperParams) {\n bodyEntries.push(`${rubyStringLit(wp.paramName)} => ${fieldName(wp.paramName)}`);\n }\n lines.push(' body = {');\n for (let i = 0; i < bodyEntries.length; i++) {\n const sep = i === bodyEntries.length - 1 ? '' : ',';\n lines.push(` ${bodyEntries[i]}${sep}`);\n }\n lines.push(' }.compact');\n\n // Path string — use the unified @client.request helper.\n const rubyPath = interpolateRubyPath(op.path, op.pathParams ?? []);\n const verbSym = op.httpMethod.toLowerCase();\n lines.push(' response = @client.request(');\n lines.push(` method: :${verbSym},`);\n lines.push(` path: ${rubyPath},`);\n lines.push(' auth: true,');\n lines.push(' body: body,');\n lines.push(' request_options: request_options');\n lines.push(' )');\n\n // Response handling\n if (wrapper.responseModelName && modelNames.has(wrapper.responseModelName)) {\n lines.push(` WorkOS::${className(wrapper.responseModelName)}.new(response.body)`);\n } else {\n lines.push(' JSON.parse(response.body)');\n }\n\n lines.push(' end');\n\n return lines.join('\\n');\n}\n\nfunction interpolateRubyPath(path: string, pathParams: Operation['pathParams']): string {\n if (!pathParams || pathParams.length === 0) return `'${path}'`;\n let result = path;\n for (const p of pathParams) {\n result = result.split(`{${p.name}}`).join(`#{WorkOS::Util.encode_path(${safeParamName(p.name)})}`);\n }\n return `\"${result}\"`;\n}\n\nfunction rubyStringLit(s: string): string {\n return `'${s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n}\n","import type { Service, EmitterContext, GeneratedFile, Operation, TypeRef, Parameter, Model } from '@workos/oagen';\nimport { planOperation } from '@workos/oagen';\nimport { className, fieldName, fileName, methodName, safeParamName, resolveMethodName } from './naming.js';\nimport { mapTypeRefForYard } from './type-map.js';\nimport {\n buildResolvedLookup,\n lookupResolved,\n groupByMount,\n getOpDefaults,\n getOpInferFromClient,\n buildHiddenParams,\n collectGroupedParamNames,\n} from '../shared/resolved-ops.js';\nimport { isListWrapperModel } from '../shared/model-utils.js';\nimport { generateWrapperMethods, collectWrapperResponseModels } from './wrappers.js';\n\n/**\n * Generate Ruby resource (service) classes from IR services.\n *\n * Produces one `.rb` file per mount target under `lib/workos/`.\n */\nexport function generateResources(services: Service[], ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n const groups = groupByMount(ctx);\n const lookup = buildResolvedLookup(ctx);\n const modelNames = new Set(ctx.spec.models.map((m) => m.name));\n const enumNames = new Set(ctx.spec.enums.map((e) => e.name));\n const modelByName = new Map<string, Model>();\n for (const m of ctx.spec.models as Model[]) modelByName.set(m.name, m);\n\n // Build a map of model.name -> isListWrapper to detect pagination.\n const listWrapperModels = new Map<string, Model>();\n for (const m of ctx.spec.models as Model[]) {\n if (isListWrapperModel(m)) listWrapperModels.set(m.name, m);\n }\n\n for (const [mountTarget, group] of groups) {\n const cls = className(mountTarget);\n const file = fileName(mountTarget);\n\n const operations = group.operations;\n if (operations.length === 0) continue;\n\n const requires = new Set<string>();\n requires.add('json');\n\n const lines: string[] = [];\n const methodBodies: string[] = [];\n\n const emittedMethodNames = new Set<string>();\n\n // We look for each operation's \"home\" service within this group.\n for (const op of operations) {\n // Find the service that owns this op (via resolvedOps -> service mapping).\n const ownerService =\n group.resolvedOps.find((r) => r.operation === op)?.service ??\n services.find((s) => s.operations.includes(op)) ??\n services[0];\n const method = resolveMethodName(op, ownerService, ctx);\n if (emittedMethodNames.has(method)) continue;\n\n const resolved = lookupResolved(op, lookup);\n // Skip url-builder operations: these are spec-marked client-side URL\n // constructors (no HTTP), and the Ruby SDK provides them via\n // hand-maintained inline @oagen-ignore extensions on the relevant\n // service class instead of generating an HTTP wrapper that would\n // incorrectly hit the API.\n if (resolved?.urlBuilder) {\n emittedMethodNames.add(method);\n continue;\n }\n\n emittedMethodNames.add(method);\n\n const defaults = getOpDefaults(resolved);\n const inferFromClient = new Set(getOpInferFromClient(resolved));\n const hiddenParams = buildHiddenParams(resolved);\n\n const body = emitMethod({\n op,\n method,\n defaults,\n inferFromClient,\n hiddenParams,\n enumNames,\n modelNames,\n modelByName,\n listWrapperModels,\n requires,\n });\n methodBodies.push(body);\n\n // Emit union split wrapper methods (e.g., authenticate_with_password).\n if (resolved?.wrappers && resolved.wrappers.length > 0) {\n const wrapperBodies = generateWrapperMethods(resolved, ctx, modelNames, requires);\n for (let i = 0; i < resolved.wrappers.length; i++) {\n const w = resolved.wrappers[i];\n if (emittedMethodNames.has(w.name)) continue;\n emittedMethodNames.add(w.name);\n methodBodies.push(wrapperBodies[i]);\n if (\n w.responseModelName &&\n modelNames.has(w.responseModelName) &&\n !listWrapperModels.has(w.responseModelName)\n ) {\n requires.add(fileName(w.responseModelName));\n }\n }\n // Also ensure any additional response models are added to requires set.\n for (const m of collectWrapperResponseModels(resolved)) {\n if (modelNames.has(m) && !listWrapperModels.has(m)) requires.add(fileName(m));\n }\n }\n }\n\n // Zeitwerk autoloads every WorkOS::* constant; only stdlib requires.\n if (requires.has('json')) {\n lines.push(`require 'json'`);\n lines.push('');\n }\n lines.push('module WorkOS');\n lines.push(` class ${cls}`);\n lines.push(' def initialize(client)');\n lines.push(' @client = client');\n lines.push(' end');\n for (const body of methodBodies) {\n lines.push('');\n lines.push(body);\n }\n lines.push(' end');\n lines.push('end');\n\n files.push({\n path: `lib/workos/${file}.rb`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\n/** Build a single Ruby method from an Operation. */\nfunction emitMethod(args: {\n op: Operation;\n method: string;\n defaults: Record<string, string | number | boolean>;\n inferFromClient: Set<string>;\n hiddenParams: Set<string>;\n enumNames: Set<string>;\n modelNames: Set<string>;\n modelByName: Map<string, Model>;\n listWrapperModels: Map<string, Model>;\n requires: Set<string>;\n}): string {\n const {\n op,\n method,\n defaults,\n inferFromClient,\n hiddenParams,\n enumNames,\n modelNames,\n modelByName,\n listWrapperModels,\n requires,\n } = args;\n void enumNames;\n\n const plan = planOperation(op);\n const lines: string[] = [];\n\n // Collect params: path params positional, others keyword.\n const pathParams = op.pathParams ?? [];\n const groupedParamNames = collectGroupedParamNames(op);\n const queryParams = (op.queryParams ?? []).filter((q) => !groupedParamNames.has(q.name));\n\n // Request body params: if body is a model, expand its fields.\n const bodyFields = getRequestBodyFields(op, hiddenParams, modelByName);\n\n // Detect path/body name collisions and build a rename map for body fields.\n // When a body field's snake_case name matches a path param, prefix with \"body_\"\n // so the Ruby method exposes distinct keyword args.\n const pathParamNames = new Set(pathParams.map((p) => safeParamName(p.name)));\n const bodyFieldRenames = new Map<string, string>();\n for (const f of bodyFields) {\n if (hiddenParams.has(f.name)) continue;\n const n = fieldName(f.name);\n if (pathParamNames.has(n)) {\n bodyFieldRenames.set(f.name, `body_${n}`);\n }\n }\n\n /** Resolve the Ruby kwarg name for a body field, applying renames if needed. */\n const bodyKwargName = (wireName: string): string => {\n return bodyFieldRenames.get(wireName) ?? fieldName(wireName);\n };\n\n // Method signature. Deduplicate param names across path/body/query.\n const sigParts: string[] = [];\n const seenParamNames = new Set<string>();\n\n // Path params: always required, snake_case.\n for (const p of pathParams) {\n const n = safeParamName(p.name);\n if (seenParamNames.has(n)) continue;\n seenParamNames.add(n);\n sigParts.push(`${n}:`);\n }\n\n // Required body/query params next.\n for (const f of bodyFields) {\n if (hiddenParams.has(f.name)) continue;\n if (!f.required) continue;\n const n = bodyKwargName(f.name);\n if (seenParamNames.has(n)) continue;\n seenParamNames.add(n);\n sigParts.push(`${n}:`);\n }\n for (const q of queryParams) {\n if (hiddenParams.has(q.name)) continue;\n if (!q.required) continue;\n const n = safeParamName(q.name);\n if (seenParamNames.has(n)) continue;\n seenParamNames.add(n);\n sigParts.push(`${n}:`);\n }\n\n // Required parameter group kwargs.\n for (const group of op.parameterGroups ?? []) {\n if (group.optional) continue;\n const n = fieldName(group.name);\n if (seenParamNames.has(n)) continue;\n seenParamNames.add(n);\n sigParts.push(`${n}:`);\n }\n\n // Optional body/query params.\n for (const f of bodyFields) {\n if (hiddenParams.has(f.name)) continue;\n if (f.required) continue;\n const n = bodyKwargName(f.name);\n if (seenParamNames.has(n)) continue;\n seenParamNames.add(n);\n sigParts.push(`${n}: nil`);\n }\n for (const q of queryParams) {\n if (hiddenParams.has(q.name)) continue;\n if (q.required) continue;\n const n = safeParamName(q.name);\n if (seenParamNames.has(n)) continue;\n seenParamNames.add(n);\n const defaultVal = q.name === 'order' ? rubyStringLit('desc') : 'nil';\n sigParts.push(`${n}: ${defaultVal}`);\n }\n\n // Optional parameter group kwargs.\n for (const group of op.parameterGroups ?? []) {\n if (!group.optional) continue;\n const n = fieldName(group.name);\n if (seenParamNames.has(n)) continue;\n seenParamNames.add(n);\n sigParts.push(`${n}: nil`);\n }\n\n // Always accept request_options.\n sigParts.push('request_options: {}');\n\n // YARD docs.\n const doc = buildYardDoc(op, pathParams, queryParams, bodyFields, hiddenParams, bodyFieldRenames, listWrapperModels);\n for (const line of doc) lines.push(` ${line}`);\n\n // Signature.\n if (sigParts.length === 0) {\n lines.push(` def ${method}`);\n } else if (sigParts.length === 1 && sigParts[0].length < 60) {\n lines.push(` def ${method}(${sigParts[0]})`);\n } else {\n lines.push(` def ${method}(`);\n for (let i = 0; i < sigParts.length; i++) {\n const sep = i === sigParts.length - 1 ? '' : ',';\n lines.push(` ${sigParts[i]}${sep}`);\n }\n lines.push(' )');\n }\n\n // Emit deprecation warning for deprecated operations.\n if (op.deprecated) {\n lines.push(` warn \"[DEPRECATION] \\\\\\`${method}\\\\\\` is deprecated.\", uplevel: 1`);\n }\n\n // Body: construct params / body / path\n const rubyPath = interpolateRubyPath(op.path, pathParams);\n\n // Query params hash.\n // For methods with a request body (POST/PUT/PATCH), exclude query params\n // that also appear as body fields — they belong in the body only.\n const method_http = op.httpMethod.toLowerCase();\n const hasBodyMethod = !['get', 'head', 'delete'].includes(method_http);\n const bodyFieldNameSet = new Set(bodyFields.map((f) => f.name));\n const qEntries = queryParams.filter(\n (q) => !hiddenParams.has(q.name) && !(hasBodyMethod && bodyFieldNameSet.has(q.name)),\n );\n const hasGroups = (op.parameterGroups?.length ?? 0) > 0;\n // Groups go to query only for operations without a request body (GET/DELETE).\n // For POST/PUT/PATCH, groups are dispatched into the body below.\n const groupsGoToQuery = hasGroups && !hasBodyMethod;\n const hasQuery = qEntries.length > 0 || groupsGoToQuery;\n if (hasQuery) {\n lines.push(' params = {');\n for (let i = 0; i < qEntries.length; i++) {\n const q = qEntries[i];\n const sep = i === qEntries.length - 1 && !groupsGoToQuery ? '' : ',';\n lines.push(` ${rubyStringLit(q.name)} => ${safeParamName(q.name)}${sep}`);\n }\n lines.push(' }.compact');\n\n if (groupsGoToQuery) {\n // Parameter group dispatch: merge grouped params into the query hash\n for (const group of op.parameterGroups ?? []) {\n const prop = fieldName(group.name);\n if (group.optional) {\n lines.push(` if ${prop}`);\n lines.push(` case ${prop}[:type]`);\n } else {\n lines.push(` case ${prop}[:type]`);\n }\n for (const variant of group.variants) {\n lines.push(` when ${rubyStringLit(variant.name)}`);\n for (const p of variant.parameters) {\n lines.push(` params[${rubyStringLit(p.name)}] = ${prop}[:${fieldName(p.name)}]`);\n }\n }\n lines.push(' end');\n if (group.optional) {\n lines.push(' end');\n }\n }\n }\n }\n\n // Request body\n const hasBody = bodyFields.length > 0 && !['get', 'head'].includes(method_http);\n\n if (hasBody) {\n const bodyEntries: string[] = [];\n for (const [k, v] of Object.entries(defaults)) {\n const lit = typeof v === 'string' ? rubyStringLit(v) : String(v);\n bodyEntries.push(`${rubyStringLit(k)} => ${lit}`);\n }\n for (const fc of inferFromClient) {\n const clientProp = fc === 'client_secret' ? 'api_key' : fc;\n const optKey = fc === 'client_secret' ? 'api_key' : fc;\n bodyEntries.push(`${rubyStringLit(fc)} => (request_options[:${optKey}] || @client.${clientProp})`);\n }\n for (const f of bodyFields) {\n if (hiddenParams.has(f.name)) continue;\n bodyEntries.push(`${rubyStringLit(f.name)} => ${bodyKwargName(f.name)}`);\n }\n lines.push(' body = {');\n for (let i = 0; i < bodyEntries.length; i++) {\n const sep = i === bodyEntries.length - 1 ? '' : ',';\n lines.push(` ${bodyEntries[i]}${sep}`);\n }\n lines.push(' }.compact');\n\n // Parameter group dispatch into body for POST/PUT/PATCH so sensitive\n // fields (passwords, role slugs) never leak into the URL query string.\n // DELETE groups are already handled via query above (groupsGoToQuery).\n if (hasGroups && hasBodyMethod) {\n for (const group of op.parameterGroups ?? []) {\n const prop = fieldName(group.name);\n if (group.optional) {\n lines.push(` if ${prop}`);\n lines.push(` case ${prop}[:type]`);\n } else {\n lines.push(` case ${prop}[:type]`);\n }\n for (const variant of group.variants) {\n lines.push(` when ${rubyStringLit(variant.name)}`);\n for (const p of variant.parameters) {\n lines.push(` body[${rubyStringLit(p.name)}] = ${prop}[:${fieldName(p.name)}]`);\n }\n }\n lines.push(' end');\n if (group.optional) {\n lines.push(' end');\n }\n }\n }\n }\n\n // Make the request via the unified @client.request helper.\n const requestArgs: string[] = [];\n requestArgs.push(`method: :${method_http}`);\n requestArgs.push(`path: ${rubyPath}`);\n requestArgs.push('auth: true');\n if (hasQuery) requestArgs.push('params: params');\n if (hasBody) requestArgs.push('body: body');\n requestArgs.push('request_options: request_options');\n\n lines.push(' response = @client.request(');\n for (let i = 0; i < requestArgs.length; i++) {\n const sep = i === requestArgs.length - 1 ? '' : ',';\n lines.push(` ${requestArgs[i]}${sep}`);\n }\n lines.push(' )');\n\n // Response handling\n void plan;\n // Build the list of local kwarg names that should be forwarded when the\n // method recursively calls itself for the next page (excluding the cursor\n // param, which is overridden).\n const forwardableParams: string[] = [];\n const bodyNames = new Set(bodyFields.map((f) => bodyKwargName(f.name)));\n for (const p of pathParams) forwardableParams.push(safeParamName(p.name));\n for (const f of bodyFields) {\n if (hiddenParams.has(f.name)) continue;\n forwardableParams.push(bodyKwargName(f.name));\n }\n for (const q of queryParams) {\n if (hiddenParams.has(q.name)) continue;\n const name = safeParamName(q.name);\n if (bodyNames.has(name) || forwardableParams.includes(name)) continue;\n forwardableParams.push(name);\n }\n // Include parameter group kwargs so they are forwarded in pagination fetch_next.\n for (const group of op.parameterGroups ?? []) {\n const name = fieldName(group.name);\n if (!forwardableParams.includes(name)) {\n forwardableParams.push(name);\n }\n }\n const responseLines = emitResponseHandling(op, listWrapperModels, modelNames, method, forwardableParams);\n for (const line of responseLines) lines.push(` ${line}`);\n\n lines.push(' end');\n\n // Ensure we require the response model file if needed.\n // Skip list-wrapper models (they are not emitted as files).\n const respModel = findPrimaryResponseModel(op.response);\n if (respModel && modelNames.has(respModel) && !listWrapperModels.has(respModel)) {\n requires.add(fileName(respModel));\n }\n\n return lines.join('\\n');\n}\n\n/** Build the response parsing expression(s). */\nfunction emitResponseHandling(\n op: Operation,\n listWrapperModels: Map<string, Model>,\n modelNames: Set<string>,\n currentMethod: string,\n forwardableParams: string[],\n): string[] {\n const ref = op.response;\n\n // Build a filters hash from the forwarded params (excluding cursor).\n const filterEntries = forwardableParams\n .filter((p) => p !== 'after' && p !== 'request_options')\n .map((p) => `${p}: ${p}`)\n .join(', ');\n const _filtersArg = filterEntries ? `, filters: { ${filterEntries} }` : '';\n\n // Pagination / list wrapper: use ListStruct.from_response with auto-paging wired.\n if (ref.kind === 'model' && listWrapperModels.has(ref.name)) {\n const wrapper = listWrapperModels.get(ref.name)!;\n const dataField = wrapper.fields.find((f) => f.name === 'data');\n const itemCls =\n dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model'\n ? `WorkOS::${className(dataField.type.items.name)}`\n : null;\n\n const cursorLocal = safeParamName('after');\n const hasCursorInSignature = forwardableParams.includes(cursorLocal);\n\n const out: string[] = [];\n\n if (hasCursorInSignature) {\n // Build a fetch_next lambda that accepts a cursor string and replays\n // the current call with the new cursor.\n out.push(`fetch_next = ->(cursor) {`);\n out.push(` ${currentMethod}(`);\n const allForwards = [...forwardableParams, 'request_options'];\n for (let i = 0; i < allForwards.length; i++) {\n const param = allForwards[i];\n const sep = i === allForwards.length - 1 ? '' : ',';\n const value = param === cursorLocal ? 'cursor' : param;\n out.push(` ${param}: ${value}${sep}`);\n }\n out.push(` )`);\n out.push(`}`);\n }\n\n const fromArgs: string[] = [];\n fromArgs.push('response');\n if (itemCls) fromArgs.push(`model: ${itemCls}`);\n if (filterEntries) fromArgs.push(`filters: { ${filterEntries} }`);\n if (hasCursorInSignature) fromArgs.push('fetch_next: fetch_next');\n\n if (fromArgs.length <= 2) {\n out.push(`WorkOS::Types::ListStruct.from_response(${fromArgs.join(', ')})`);\n } else {\n out.push(`WorkOS::Types::ListStruct.from_response(`);\n for (let i = 0; i < fromArgs.length; i++) {\n const sep = i === fromArgs.length - 1 ? '' : ',';\n out.push(` ${fromArgs[i]}${sep}`);\n }\n out.push(`)`);\n }\n return out;\n }\n\n if (ref.kind === 'model' && modelNames.has(ref.name)) {\n const cls = `WorkOS::${className(ref.name)}`;\n return [\n `result = ${cls}.new(response.body)`,\n `result.last_response = WorkOS::Types::ApiResponse.new(http_status: response.code.to_i, http_headers: response.each_header.to_h, request_id: response[\"x-request-id\"])`,\n `result`,\n ];\n }\n\n // Paginated endpoint whose IR response is typed as array (the IR lost the\n // wrapper envelope). When op.pagination exists, the real HTTP response is\n // { data: [...], list_metadata: {...} } — generate ListStruct handling.\n if (ref.kind === 'array' && op.pagination) {\n const itemCls =\n ref.items.kind === 'model' && modelNames.has(ref.items.name) ? `WorkOS::${className(ref.items.name)}` : null;\n\n const cursorLocal = safeParamName('after');\n const hasCursorInSignature = forwardableParams.includes(cursorLocal);\n\n const out: string[] = [];\n\n if (hasCursorInSignature) {\n out.push(`fetch_next = ->(cursor) {`);\n out.push(` ${currentMethod}(`);\n const allForwards = [...forwardableParams, 'request_options'];\n for (let i = 0; i < allForwards.length; i++) {\n const param = allForwards[i];\n const sep = i === allForwards.length - 1 ? '' : ',';\n const value = param === cursorLocal ? 'cursor' : param;\n out.push(` ${param}: ${value}${sep}`);\n }\n out.push(` )`);\n out.push(`}`);\n }\n\n const fromArgs: string[] = [];\n fromArgs.push('response');\n if (itemCls) fromArgs.push(`model: ${itemCls}`);\n if (filterEntries) fromArgs.push(`filters: { ${filterEntries} }`);\n if (hasCursorInSignature) fromArgs.push('fetch_next: fetch_next');\n\n if (fromArgs.length <= 2) {\n out.push(`WorkOS::Types::ListStruct.from_response(${fromArgs.join(', ')})`);\n } else {\n out.push(`WorkOS::Types::ListStruct.from_response(`);\n for (let i = 0; i < fromArgs.length; i++) {\n const sep = i === fromArgs.length - 1 ? '' : ',';\n out.push(` ${fromArgs[i]}${sep}`);\n }\n out.push(`)`);\n }\n return out;\n }\n\n if (ref.kind === 'array' && ref.items.kind === 'model' && modelNames.has(ref.items.name)) {\n const itemCls = `WorkOS::${className(ref.items.name)}`;\n return [`parsed = JSON.parse(response.body)`, `(parsed || []).map { |item| ${itemCls}.new(item) }`];\n }\n\n if (ref.kind === 'nullable') {\n return emitResponseHandling(\n { ...op, response: ref.inner },\n listWrapperModels,\n modelNames,\n currentMethod,\n forwardableParams,\n );\n }\n\n // Unknown/void response — return nil\n if (ref.kind === 'primitive' && ref.type === 'unknown') {\n return ['nil'];\n }\n\n // Default: return parsed JSON\n return [`JSON.parse(response.body)`];\n}\n\n/** Find the primary model name (if any) in a response TypeRef. */\nfunction findPrimaryResponseModel(ref: TypeRef): string | null {\n switch (ref.kind) {\n case 'model':\n return ref.name;\n case 'nullable':\n return findPrimaryResponseModel(ref.inner);\n case 'array':\n return findPrimaryResponseModel(ref.items);\n case 'union': {\n for (const v of ref.variants) {\n const n = findPrimaryResponseModel(v);\n if (n) return n;\n }\n return null;\n }\n default:\n return null;\n }\n}\n\n/** Get the body fields, expanded from model refs. Handles nested/model refs and unions. */\nfunction getRequestBodyFields(\n op: Operation,\n hiddenParams: Set<string>,\n modelByName: Map<string, Model>,\n): { name: string; required: boolean; type: TypeRef; description?: string; deprecated?: boolean }[] {\n void hiddenParams;\n const ref = op.requestBody;\n if (!ref) return [];\n\n if (ref.kind === 'model') {\n const model = modelByName.get(ref.name);\n if (!model) return [];\n return model.fields.map((f) => ({\n name: f.name,\n required: f.required,\n type: f.type,\n description: f.description,\n deprecated: f.deprecated,\n }));\n }\n if (ref.kind === 'nullable') {\n return getRequestBodyFields({ ...op, requestBody: ref.inner }, hiddenParams, modelByName);\n }\n // Unions: merge fields from ALL model variants so every possible body param\n // is exposed. Fields that appear in every variant keep their original\n // requiredness; fields that appear in only some variants become optional.\n if (ref.kind === 'union') {\n const variantFieldSets: Map<\n string,\n { name: string; required: boolean; type: TypeRef; description?: string; deprecated?: boolean }\n >[] = [];\n for (const v of ref.variants) {\n if (v.kind === 'model') {\n const model = modelByName.get(v.name);\n if (model) {\n const fieldMap = new Map<\n string,\n { name: string; required: boolean; type: TypeRef; description?: string; deprecated?: boolean }\n >();\n for (const f of model.fields) {\n fieldMap.set(f.name, {\n name: f.name,\n required: f.required,\n type: f.type,\n description: f.description,\n deprecated: f.deprecated,\n });\n }\n variantFieldSets.push(fieldMap);\n }\n }\n }\n if (variantFieldSets.length === 0) return [];\n\n // Collect all field names in order (preserving first-seen order).\n const allFieldNames: string[] = [];\n const seen = new Set<string>();\n for (const fieldMap of variantFieldSets) {\n for (const name of fieldMap.keys()) {\n if (!seen.has(name)) {\n seen.add(name);\n allFieldNames.push(name);\n }\n }\n }\n\n return allFieldNames.map((name) => {\n // Use the first variant that has this field as the canonical source.\n const canonical = variantFieldSets.find((fm) => fm.has(name))!.get(name)!;\n // A field is required only if it appears and is required in EVERY variant.\n const requiredInAll = variantFieldSets.every((fm) => {\n const f = fm.get(name);\n return f && f.required;\n });\n return { ...canonical, required: requiredInAll };\n });\n }\n return [];\n}\n\n/** Convert an OpenAPI path like /orgs/{id}/users/{uid} to a Ruby interpolated string. */\nfunction interpolateRubyPath(path: string, pathParams: Parameter[]): string {\n if (pathParams.length === 0) {\n return `'${path}'`;\n }\n let result = path;\n for (const p of pathParams) {\n const placeholder = `{${p.name}}`;\n result = result.split(placeholder).join(`#{WorkOS::Util.encode_path(${safeParamName(p.name)})}`);\n }\n return `\"${result}\"`;\n}\n\n/** Collapse multi-line description text into a single YARD-safe line. */\nfunction oneLine(desc: string | undefined): string {\n if (!desc) return '';\n return desc.replace(/\\r/g, ' ').replace(/\\n+/g, ' ').replace(/\\s+/g, ' ').trim();\n}\n\nfunction buildYardDoc(\n op: Operation,\n pathParams: Parameter[],\n queryParams: Parameter[],\n bodyFields: { name: string; required: boolean; type: TypeRef; description?: string; deprecated?: boolean }[],\n hiddenParams: Set<string>,\n bodyFieldRenames?: Map<string, string>,\n listWrapperModels?: Map<string, Model>,\n): string[] {\n const lines: string[] = [];\n const summary = op.description ?? `${op.httpMethod.toUpperCase()} ${op.path}`;\n const firstLine = summary.split('\\n')[0] ?? '';\n lines.push(`# ${firstLine}`);\n if (op.deprecated) {\n lines.push('# @deprecated');\n }\n\n // Track emitted param names to avoid duplicates (e.g. code in both body and query).\n const emittedParamNames = new Set<string>();\n\n for (const p of pathParams) {\n const n = safeParamName(p.name);\n if (emittedParamNames.has(n)) continue;\n emittedParamNames.add(n);\n const type = mapTypeRefForYard(p.type);\n const deprecatedPrefix = p.deprecated ? '(deprecated) ' : '';\n lines.push(`# @param ${n} [${type}] ${deprecatedPrefix}${oneLine(p.description)}`.trim());\n }\n for (const f of bodyFields) {\n if (hiddenParams.has(f.name)) continue;\n const paramName = bodyFieldRenames?.get(f.name) ?? fieldName(f.name);\n if (emittedParamNames.has(paramName)) continue;\n emittedParamNames.add(paramName);\n const type = mapTypeRefForYard(f.type);\n // Only append nil suffix for optional params whose type doesn't already include nil.\n const alreadyNilable = type.split(', ').includes('nil');\n const suffix = f.required || alreadyNilable ? '' : ', nil';\n const deprecatedPrefix = f.deprecated ? '(deprecated) ' : '';\n lines.push(`# @param ${paramName} [${type}${suffix}] ${deprecatedPrefix}${oneLine(f.description)}`.trim());\n }\n for (const q of queryParams) {\n if (hiddenParams.has(q.name)) continue;\n const n = safeParamName(q.name);\n if (emittedParamNames.has(n)) continue;\n emittedParamNames.add(n);\n const type = mapTypeRefForYard(q.type);\n const alreadyNilable = type.split(', ').includes('nil');\n const suffix = q.required || alreadyNilable ? '' : ', nil';\n const deprecatedPrefix = q.deprecated ? '(deprecated) ' : '';\n lines.push(`# @param ${n} [${type}${suffix}] ${deprecatedPrefix}${oneLine(q.description)}`.trim());\n }\n lines.push(`# @param request_options [Hash] (see WorkOS::Types::RequestOptions)`);\n\n // Return type: void for unknown-primitive, ListStruct for list wrappers and\n // paginated array endpoints (with element type annotation).\n const ref = op.response;\n if (ref.kind === 'primitive' && ref.type === 'unknown') {\n lines.push(`# @return [void]`);\n } else if (ref.kind === 'model' && listWrapperModels?.has(ref.name)) {\n const wrapper = listWrapperModels.get(ref.name)!;\n const dataField = wrapper.fields.find((f: { name: string; type: TypeRef }) => f.name === 'data');\n const elementType =\n dataField && dataField.type.kind === 'array' && dataField.type.items.kind === 'model'\n ? `WorkOS::${className(dataField.type.items.name)}`\n : null;\n const suffix = elementType ? `<${elementType}>` : '';\n lines.push(`# @return [WorkOS::Types::ListStruct${suffix}]`);\n } else if (ref.kind === 'array' && op.pagination) {\n const elementType = ref.items.kind === 'model' ? `WorkOS::${className(ref.items.name)}` : null;\n const suffix = elementType ? `<${elementType}>` : '';\n lines.push(`# @return [WorkOS::Types::ListStruct${suffix}]`);\n } else {\n const retType = mapTypeRefForYard(ref);\n lines.push(`# @return [${retType}]`);\n }\n return lines;\n}\n\nvoid methodName;\n\n/** Render a Ruby single-quoted string literal, escaping embedded quotes and backslashes. */\nfunction rubyStringLit(s: string): string {\n return `'${s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile, Service, Model, Enum } from '@workos/oagen';\nimport { assignModelsToServices } from '@workos/oagen';\nimport { servicePropertyName, resolveClassName, className, fileName, buildMountDirMap } from './naming.js';\nimport { classifyUnassignedModel } from './models.js';\nimport { getMountTarget } from '../shared/resolved-ops.js';\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\nimport { NON_SPEC_SERVICES } from '../shared/non-spec-services.js';\n\n/**\n * Ruby `Client#accessor` wiring for each non-spec service id.\n *\n * Entries omitted from this map (e.g. `webhook_verification`) extend an\n * already-generated service class via `@oagen-ignore` blocks and need no\n * dedicated accessor.\n *\n * `ctorArg = 'self'` means the helper takes the client (`Foo.new(self)`).\n * `ctorArg = ''` means the accessor returns the constant directly (modules\n * with module-level functions, e.g. `WorkOS::PKCE`).\n */\nconst NON_SPEC_ACCESSORS: Record<string, { prop: string; className: string; ctorArg: 'self' | '' }> = {\n passwordless: { prop: 'passwordless', className: 'Passwordless', ctorArg: 'self' },\n vault: { prop: 'vault', className: 'Vault', ctorArg: 'self' },\n actions: { prop: 'actions', className: 'Actions', ctorArg: 'self' },\n session_manager: { prop: 'session_manager', className: 'SessionManager', ctorArg: 'self' },\n pkce: { prop: 'pkce', className: 'PKCE', ctorArg: '' },\n};\n\n/**\n * Hand-maintained class names whose file basename does NOT camelCase to the\n * expected Ruby class name under Zeitwerk's default inflector. Each entry\n * adds an `inflect(\"file\" => \"Class\")` override so the autoloader can\n * resolve `WorkOS::PKCE` (rather than the default `WorkOS::Pkce`).\n */\nconst NON_SPEC_INFLECTIONS: ReadonlyArray<readonly [string, string]> = [['pkce', 'PKCE']];\n\n/**\n * Generate:\n * - lib/workos.rb — sets up a Zeitwerk loader for the gem\n * - lib/workos/client.rb — client class with service accessors\n *\n * The HTTP runtime (request execution, retries, error mapping, pagination)\n * lives in hand-maintained files flagged with `@oagen-ignore-file`:\n * - lib/workos/base_client.rb\n * - lib/workos/errors.rb\n * - lib/workos/configuration.rb\n * - lib/workos/hash_provider.rb\n * - lib/workos/types/list_struct.rb\n */\nexport function generateClient(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n files.push(generateInflectionsFile(spec, ctx));\n files.push(generateMainEntryFile(spec, ctx));\n files.push(generateClientClass(spec, ctx));\n return files;\n}\n\n/** Build map: top-level service -> resolved class name (deduplicated by mount target). */\nexport function buildTopLevelServices(spec: ApiSpec, ctx: EmitterContext): Service[] {\n const seen = new Set<string>();\n const out: Service[] = [];\n for (const service of spec.services) {\n const target = getMountTarget(service, ctx) || resolveClassName(service, ctx);\n if (seen.has(target)) continue;\n seen.add(target);\n const canonical =\n spec.services.find((s) => (getMountTarget(s, ctx) || resolveClassName(s, ctx)) === target && s.name === target) ??\n service;\n out.push(canonical);\n }\n return out;\n}\n\n/**\n * Simulate Zeitwerk::Inflector's default inflection so we can emit the minimal\n * set of overrides. Zeitwerk camelizes `foo_bar` -> `FooBar`; we only add\n * inflector entries when the emitter's canonical className disagrees.\n */\nfunction rubyCamelize(basename: string): string {\n return basename\n .split('_')\n .filter((p) => p.length > 0)\n .map((p) => p.charAt(0).toUpperCase() + p.slice(1))\n .join('');\n}\n\n/** Build the inflection map: file basename -> class name for all generated constants. */\nfunction buildInflectionMap(spec: ApiSpec, ctx: EmitterContext): Map<string, string> {\n const inflections = new Map<string, string>();\n\n inflections.set('workos', 'WorkOS');\n\n for (const service of buildTopLevelServices(spec, ctx)) {\n const target = getMountTarget(service, ctx) || resolveClassName(service, ctx);\n const cls = className(target);\n const file = fileName(target);\n if (rubyCamelize(file) !== cls) inflections.set(file, cls);\n }\n\n const seenClasses = new Set<string>();\n for (const model of spec.models as Model[]) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n const cls = className(model.name);\n if (seenClasses.has(cls)) continue;\n seenClasses.add(cls);\n const file = fileName(model.name);\n if (rubyCamelize(file) !== cls) inflections.set(file, cls);\n }\n\n const seenEnums = new Set<string>();\n for (const enumDef of spec.enums as Enum[]) {\n const cls = className(enumDef.name);\n if (seenEnums.has(cls)) continue;\n seenEnums.add(cls);\n const file = fileName(enumDef.name);\n if (rubyCamelize(file) !== cls) inflections.set(file, cls);\n }\n\n for (const [file, cls] of NON_SPEC_INFLECTIONS) inflections.set(file, cls);\n\n return inflections;\n}\n\n/** Generate lib/workos/inflections.rb — Zeitwerk inflection overrides (T40/C5). */\nfunction generateInflectionsFile(spec: ApiSpec, ctx: EmitterContext): GeneratedFile {\n const inflections = buildInflectionMap(spec, ctx);\n const inflectEntries = [...inflections.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([fileBase, cls]) => ` \"${fileBase}\" => \"${cls}\"`)\n .join(',\\n');\n\n const lines: string[] = [];\n lines.push('# Zeitwerk inflection overrides for the WorkOS gem.');\n lines.push('# Maps file basenames to class/module names where the default');\n lines.push('# CamelCase inference disagrees with the canonical class name.');\n lines.push('WORKOS_INFLECTIONS = {');\n lines.push(inflectEntries);\n lines.push('}.freeze');\n\n return {\n path: 'lib/workos/inflections.rb',\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n };\n}\n\n/** Generate lib/workos.rb — Zeitwerk bootstrap for the gem. */\nfunction generateMainEntryFile(spec: ApiSpec, ctx: EmitterContext): GeneratedFile {\n const modelSubdirs = collectModelSubdirs(spec, ctx);\n\n const lines: string[] = [];\n lines.push(`require 'zeitwerk'`);\n lines.push('');\n lines.push('module WorkOS');\n lines.push('end');\n lines.push('');\n lines.push('loader = Zeitwerk::Loader.for_gem');\n lines.push(`require_relative 'workos/inflections'`);\n lines.push('loader.inflector.inflect(WORKOS_INFLECTIONS)');\n for (const dir of modelSubdirs) {\n lines.push(`loader.collapse(\"#{__dir__}/workos/${dir}\")`);\n }\n lines.push(`loader.ignore(\"#{__dir__}/workos/errors.rb\")`);\n lines.push(`loader.ignore(\"#{__dir__}/workos/inflections.rb\")`);\n lines.push(`loader.ignore(\"#{__dir__}/workos/configuration.rb\")`);\n lines.push('loader.setup');\n lines.push('');\n lines.push(`require 'workos/errors'`);\n lines.push(`require 'workos/configuration'`);\n\n return {\n path: 'lib/workos.rb',\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n };\n}\n\n/**\n * Collect the set of mount-target subfolders that models.ts will populate.\n * Used by the Zeitwerk bootstrap to emit `loader.collapse` directives, which\n * keep the generated namespace flat while the filesystem is grouped.\n */\nfunction collectModelSubdirs(spec: ApiSpec, ctx: EmitterContext): string[] {\n const modelToService = assignModelsToServices(spec.models as Model[], spec.services);\n const mountDirMap = buildMountDirMap(ctx);\n const subdirs = new Set<string>();\n for (const model of spec.models as Model[]) {\n if (isListWrapperModel(model) || isListMetadataModel(model)) continue;\n const service = modelToService.get(model.name);\n const dir = service\n ? (mountDirMap.get(service) ?? classifyUnassignedModel(model.name))\n : classifyUnassignedModel(model.name);\n subdirs.add(dir);\n }\n return [...subdirs].sort();\n}\n\n/** Generate lib/workos/client.rb — thin service-wiring client. */\nfunction generateClientClass(spec: ApiSpec, ctx: EmitterContext): GeneratedFile {\n const lines: string[] = [];\n lines.push('module WorkOS');\n lines.push(' class Client < BaseClient');\n\n const topLevelServices = buildTopLevelServices(spec, ctx);\n for (const service of topLevelServices) {\n const target = getMountTarget(service, ctx) || resolveClassName(service, ctx);\n const cls = className(target);\n const prop = servicePropertyName(target);\n lines.push('');\n lines.push(` def ${prop}`);\n lines.push(` @${prop} ||= WorkOS::${cls}.new(self)`);\n lines.push(' end');\n }\n\n // Non-spec service accessors. Emitted inside @oagen-ignore so user edits\n // (added/removed accessors, renames) survive subsequent regenerations.\n lines.push('');\n lines.push(' # @oagen-ignore-start — non-spec service accessors (hand-maintained)');\n for (const { id } of NON_SPEC_SERVICES) {\n const wiring = NON_SPEC_ACCESSORS[id];\n if (!wiring) continue;\n const init = wiring.ctorArg ? `.new(${wiring.ctorArg})` : '';\n lines.push('');\n lines.push(` def ${wiring.prop}`);\n lines.push(` @${wiring.prop} ||= WorkOS::${wiring.className}${init}`);\n lines.push(' end');\n }\n lines.push(' # @oagen-ignore-end');\n\n lines.push(' end');\n lines.push('end');\n\n return {\n path: 'lib/workos/client.rb',\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n };\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile, Model, Operation, ResolvedWrapper, TypeRef } from '@workos/oagen';\nimport { className, fileName, fieldName, safeParamName, servicePropertyName, resolveMethodName } from './naming.js';\nimport { buildResolvedLookup, groupByMount, lookupResolved, buildHiddenParams } from '../shared/resolved-ops.js';\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\nimport { resolveWrapperParams } from '../shared/wrapper-utils.js';\n\n/**\n * Generate Ruby Minitest test files for each service and per-method.\n * Tests use WebMock to stub HTTP and fixtures from test/fixtures/*.fixture.json.\n *\n * For MVP, we produce:\n * - test/test_helper.rb (if not present, via hand-maintained runtime)\n * - test/workos/{service}_test.rb — per-service test class with basic assertions\n * - test/fixtures/{op}.fixture.json — sample fixture for each operation\n */\nexport function generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n const groups = groupByMount(ctx);\n const modelByName = new Map<string, Model>();\n for (const m of spec.models as Model[]) modelByName.set(m.name, m);\n\n const lookup = buildResolvedLookup(ctx);\n\n for (const [mountTarget, group] of groups) {\n const cls = className(mountTarget);\n const prop = servicePropertyName(mountTarget);\n const file = fileName(mountTarget);\n\n const lines: string[] = [];\n lines.push(`require 'test_helper'`);\n lines.push('');\n lines.push(`class ${cls}Test < Minitest::Test`);\n lines.push(' include FixtureHelper');\n lines.push('');\n lines.push(' def setup');\n lines.push(' @client = WorkOS::Client.new(api_key: \"sk_test_123\")');\n lines.push(' end');\n\n const emittedTestMethods = new Set<string>();\n const authMethodManifest: { method: string; httpMethodSym: string; stubUrl: string; callArgs: string }[] = [];\n\n for (const op of group.operations) {\n const ownerService = group.resolvedOps.find((r) => r.operation === op)?.service;\n if (!ownerService) continue;\n const method = resolveMethodName(op, ownerService, ctx);\n // Skip url-builder ops: their generated wrappers are suppressed (handled\n // in resources.ts) and their hand-maintained replacements live inside\n // @oagen-ignore blocks with bespoke tests.\n if (lookupResolved(op, lookup)?.urlBuilder) continue;\n // Skip duplicate method names (two ops may resolve to the same name).\n if (emittedTestMethods.has(method)) continue;\n emittedTestMethods.add(method);\n lines.push('');\n\n // Build the exact stub URL with path params substituted.\n const stubUrl = buildStubUrl(op);\n\n const isList =\n (op.response.kind === 'model' &&\n modelByName.get(op.response.name) &&\n (isListWrapperModel(modelByName.get(op.response.name)!) || false)) ||\n // Also detect paginated endpoints whose IR response is typed as array\n (op.response.kind === 'array' && !!op.pagination);\n\n const _isDelete = op.httpMethod.toLowerCase() === 'delete';\n const httpMethodSym = `:${op.httpMethod.toLowerCase()}`;\n\n const resolved = lookupResolved(op, lookup);\n const hiddenParams = buildHiddenParams(resolved);\n const callArgs = buildCallArgsStub(op, modelByName, hiddenParams);\n\n // Collect method info for the parameterized 401 test (T20).\n authMethodManifest.push({ method, httpMethodSym, stubUrl, callArgs });\n\n const stubRegex = stubUrlRegex(stubUrl);\n lines.push(` def test_${method}_returns_expected_result`);\n if (isList) {\n lines.push(` stub_request(${httpMethodSym}, ${stubRegex})`);\n lines.push(` .to_return(body: '{\"data\": [], \"list_metadata\": {}}', status: 200)`);\n lines.push(` result = @client.${prop}.${method}(${callArgs})`);\n lines.push(' assert_kind_of WorkOS::Types::ListStruct, result');\n } else if (op.response.kind === 'primitive') {\n lines.push(` stub_request(${httpMethodSym}, ${stubRegex})`);\n lines.push(` .to_return(body: \"{}\", status: 200)`);\n lines.push(` result = @client.${prop}.${method}(${callArgs})`);\n lines.push(' assert_nil result');\n } else {\n lines.push(` stub_request(${httpMethodSym}, ${stubRegex})`);\n lines.push(` .to_return(body: \"{}\", status: 200)`);\n lines.push(` result = @client.${prop}.${method}(${callArgs})`);\n lines.push(' refute_nil result');\n }\n lines.push(' end');\n\n // Wrapper tests (union split variants).\n if (resolved?.wrappers && resolved.wrappers.length > 0) {\n for (const wrapper of resolved.wrappers) {\n emitWrapperTests({\n lines,\n wrapper,\n op,\n prop,\n stubUrl,\n httpMethodSym,\n ctx,\n });\n }\n }\n }\n\n // T20: parameterized 401 test — one define_method per endpoint.\n if (authMethodManifest.length > 0) {\n lines.push('');\n lines.push(' # Parameterized authentication error tests (one per endpoint).');\n lines.push(' [');\n for (const entry of authMethodManifest) {\n const argsLit = entry.callArgs ? `, args: { ${entry.callArgs} }` : '';\n lines.push(\n ` { name: :${entry.method}, verb: ${entry.httpMethodSym}, url: ${stubUrlRegex(entry.stubUrl)}${argsLit} },`,\n );\n }\n lines.push(' ].each do |spec|');\n lines.push(` define_method(\"test_#{spec[:name]}_raises_authentication_error_on_401\") do`);\n lines.push(` stub_request(spec[:verb], spec[:url])`);\n lines.push(` .to_return(body: '{\"message\": \"Unauthorized\"}', status: 401)`);\n lines.push(` assert_raises(WorkOS::AuthenticationError) do`);\n lines.push(` @client.${prop}.send(spec[:name], **(spec[:args] || {}))`);\n lines.push(' end');\n lines.push(' end');\n lines.push(' end');\n }\n\n lines.push('end');\n\n files.push({\n path: `test/workos/test_${file}.rb`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n files.push(generateModelRoundTripTest(spec));\n\n return files;\n}\n\n/**\n * Emit test/workos/model_round_trip_test.rb that round-trips every non-wrapper\n * model through `.new(json)` and `.to_json`, asserting the result is a Hash and\n * that required fields appear with the seeded values.\n */\nfunction generateModelRoundTripTest(spec: ApiSpec): GeneratedFile {\n const lines: string[] = [];\n lines.push(`require 'test_helper'`);\n lines.push('');\n lines.push('class ModelRoundTripTest < Minitest::Test');\n\n const models = (spec.models as Model[]).filter((m) => !isListWrapperModel(m) && !isListMetadataModel(m));\n const enumNames = new Set(spec.enums.map((e) => e.name));\n const emitted = new Set<string>();\n\n for (const model of models) {\n // Avoid duplicate test names when two IR model names collapse to the same\n // snake_case file name (we use the file name as the test suffix).\n const fileBase = fileName(model.name);\n if (emitted.has(fileBase)) continue;\n emitted.add(fileBase);\n\n // Build a fixture hash with string keys and stub values for every field.\n const fixtureEntries: string[] = [];\n const assertions: string[] = [];\n const dedupFields = new Set<string>();\n for (const f of model.fields) {\n const wireName = f.name;\n const rubyFieldName = fieldName(f.name);\n if (dedupFields.has(rubyFieldName)) continue;\n dedupFields.add(rubyFieldName);\n const stub = roundTripStub(f.type, enumNames);\n fixtureEntries.push(` ${stringKeyLiteral(wireName)} => ${stub},`);\n // For primitive required fields we can assert the value round-trips.\n // The model's to_json uses `<wireName>:` shorthand (symbol keys) for\n // valid Ruby identifiers and `\"wire#name\" =>` (string keys) otherwise.\n // Note: the symbol key uses the original wire name, not the snake_cased\n // Ruby field name.\n void rubyFieldName;\n if (f.required && isPrimitiveLike(f.type)) {\n const accessorKey = /^[A-Za-z_][A-Za-z0-9_]*$/.test(wireName) ? `:${wireName}` : stringKeyLiteral(wireName);\n const actualExpr = `json[${accessorKey}]`;\n // Minitest 6 removed the `assert_equal nil, x` form — emit the\n // correct assertion based on the stub the emitter chose above.\n if (stub === 'nil') {\n assertions.push(` assert_nil ${actualExpr}`);\n } else {\n assertions.push(` assert_equal fixture[${stringKeyLiteral(wireName)}], ${actualExpr}`);\n }\n }\n }\n\n lines.push('');\n lines.push(` def test_${fileBase}_round_trip`);\n if (fixtureEntries.length === 0) {\n lines.push(` model = WorkOS::${className(model.name)}.new('{}')`);\n lines.push(' json = model.to_h');\n lines.push(' assert_kind_of Hash, json');\n } else {\n lines.push(' fixture = {');\n for (const line of fixtureEntries) lines.push(line);\n lines.push(' }');\n lines.push(` model = WorkOS::${className(model.name)}.new(fixture.to_json)`);\n lines.push(' json = model.to_h');\n lines.push(' assert_kind_of Hash, json');\n for (const a of assertions) lines.push(a);\n // T23: Assert every fixture key round-trips into to_h (handles both symbol and string keys).\n lines.push(\n ' fixture.each_key { |k| assert json.key?(k.to_sym) || json.key?(k), \"Expected to_h to include key #{k}\" }',\n );\n }\n lines.push(' end');\n }\n\n lines.push('end');\n\n return {\n path: 'test/workos/test_model_round_trip.rb',\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n };\n}\n\n/** Produce a Ruby string literal for a raw (possibly non-identifier) key. */\nfunction stringKeyLiteral(name: string): string {\n return `\"${name.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction isPrimitiveLike(ref: TypeRef): boolean {\n if (ref.kind === 'primitive') return true;\n if (ref.kind === 'nullable') return isPrimitiveLike(ref.inner);\n return false;\n}\n\n/** Produce a Ruby literal value for seeding a model fixture. */\nfunction roundTripStub(ref: TypeRef, enumNames: Set<string>): string {\n switch (ref.kind) {\n case 'primitive':\n switch (ref.type) {\n case 'string':\n return `\"stub\"`;\n case 'integer':\n return `1`;\n case 'number':\n return `1.0`;\n case 'boolean':\n return `true`;\n default:\n return `nil`;\n }\n case 'array':\n return `[]`;\n case 'map':\n return `{}`;\n case 'enum':\n return enumNames.has(ref.name) ? `\"stub\"` : `\"stub\"`;\n case 'literal':\n if (typeof ref.value === 'string') return `\"${ref.value}\"`;\n if (ref.value === null) return `nil`;\n return String(ref.value);\n case 'nullable':\n return `nil`;\n case 'model':\n return `{}`;\n case 'union':\n return ref.variants.length > 0 ? roundTripStub(ref.variants[0], enumNames) : `nil`;\n default:\n return `nil`;\n }\n}\n\n/** Build minimal placeholder arguments for calling the SDK method from a test. */\nfunction buildCallArgsStub(op: Operation, modelByName: Map<string, Model>, hiddenParams: Set<string>): string {\n const parts: string[] = [];\n const seen = new Set<string>();\n\n // Path params (required).\n const pathParamNames = new Set<string>();\n for (const p of op.pathParams ?? []) {\n const name = safeParamName(p.name);\n pathParamNames.add(name);\n if (seen.has(name)) continue;\n seen.add(name);\n parts.push(`${name}: ${stubValueFor(p.type)}`);\n }\n\n // Required body fields — expand from model if present.\n // Apply path/body collision rename (body_ prefix) matching resources.ts.\n const body = op.requestBody;\n if (body) {\n const bodyModel = resolveBodyModel(body, modelByName);\n if (bodyModel) {\n for (const f of bodyModel.fields) {\n if (!f.required) continue;\n if (hiddenParams.has(f.name)) continue;\n let name = fieldName(f.name);\n if (pathParamNames.has(name)) {\n name = `body_${name}`;\n }\n if (seen.has(name)) continue;\n seen.add(name);\n parts.push(`${name}: ${stubValueFor(f.type)}`);\n }\n }\n }\n\n // Required query params.\n for (const q of op.queryParams ?? []) {\n if (!q.required) continue;\n if (hiddenParams.has(q.name)) continue;\n const name = safeParamName(q.name);\n if (seen.has(name)) continue;\n seen.add(name);\n parts.push(`${name}: ${stubValueFor(q.type)}`);\n }\n\n // Required parameter group kwargs.\n for (const group of op.parameterGroups ?? []) {\n if (group.optional) continue;\n const name = fieldName(group.name);\n if (seen.has(name)) continue;\n seen.add(name);\n // Stub as a hash with the first variant's type discriminant.\n const firstVariant = group.variants[0];\n if (firstVariant) {\n parts.push(`${name}: { type: \"${firstVariant.name}\" }`);\n } else {\n parts.push(`${name}: {}`);\n }\n }\n\n return parts.join(', ');\n}\n\nfunction resolveBodyModel(ref: TypeRef, modelByName: Map<string, Model>): Model | null {\n if (ref.kind === 'model') return modelByName.get(ref.name) ?? null;\n if (ref.kind === 'nullable') return resolveBodyModel(ref.inner, modelByName);\n if (ref.kind === 'union') {\n for (const v of ref.variants) {\n if (v.kind === 'model') return modelByName.get(v.name) ?? null;\n }\n }\n return null;\n}\n\nfunction emitWrapperTests(args: {\n lines: string[];\n wrapper: ResolvedWrapper;\n op: Operation;\n prop: string;\n stubUrl: string;\n httpMethodSym: string;\n ctx: EmitterContext;\n}): void {\n const { lines, wrapper, op, prop, stubUrl, httpMethodSym, ctx } = args;\n const wrapperParams = resolveWrapperParams(wrapper, ctx);\n\n // Build call args: path params + required exposed params only.\n const parts: string[] = [];\n const seen = new Set<string>();\n for (const p of op.pathParams ?? []) {\n const n = safeParamName(p.name);\n if (seen.has(n)) continue;\n seen.add(n);\n parts.push(`${n}: ${stubValueFor(p.type)}`);\n }\n for (const wp of wrapperParams) {\n if (wp.isOptional) continue;\n const n = fieldName(wp.paramName);\n if (seen.has(n)) continue;\n seen.add(n);\n parts.push(`${n}: ${wp.field ? stubValueFor(wp.field.type) : '\"stub\"'}`);\n }\n const callArgs = parts.join(', ');\n\n const wrapperRegex = stubUrlRegex(stubUrl);\n lines.push('');\n lines.push(` def test_${wrapper.name}_returns_expected_result`);\n lines.push(` stub_request(${httpMethodSym}, ${wrapperRegex})`);\n lines.push(` .to_return(body: \"{}\", status: 200)`);\n lines.push(` result = @client.${prop}.${wrapper.name}(${callArgs})`);\n lines.push(' refute_nil result');\n lines.push(' end');\n\n lines.push('');\n lines.push(` def test_${wrapper.name}_raises_authentication_error_on_401`);\n lines.push(` stub_request(${httpMethodSym}, ${wrapperRegex})`);\n lines.push(` .to_return(body: '{\"message\": \"Unauthorized\"}', status: 401)`);\n lines.push(` assert_raises(WorkOS::AuthenticationError) do`);\n lines.push(` @client.${prop}.${wrapper.name}(${callArgs})`);\n lines.push(' end');\n lines.push(' end');\n}\n\nfunction stubValueFor(ref: TypeRef): string {\n switch (ref.kind) {\n case 'primitive':\n switch (ref.type) {\n case 'string':\n return `\"stub\"`;\n case 'integer':\n return `1`;\n case 'number':\n return `1.0`;\n case 'boolean':\n return `true`;\n default:\n return `nil`;\n }\n case 'array':\n return `[]`;\n case 'map':\n return `{}`;\n case 'enum':\n return `\"stub\"`;\n case 'literal':\n if (typeof ref.value === 'string') return `\"${ref.value}\"`;\n if (ref.value === null) return `nil`;\n return String(ref.value);\n case 'nullable':\n return stubValueFor(ref.inner);\n case 'model':\n return `{}`;\n case 'union':\n return ref.variants.length > 0 ? stubValueFor(ref.variants[0]) : `nil`;\n default:\n return `nil`;\n }\n}\n\n/**\n * Build a WebMock-compatible regex string that matches the exact API path\n * (with stub path params) plus an optional query string.\n *\n * Returns a Ruby Regexp literal like: %r{\\Ahttps://api\\.workos\\.com/organizations(\\?|\\z)}\n */\nfunction buildStubUrl(op: Operation): string {\n let path = op.path;\n for (const p of op.pathParams ?? []) {\n path = path.replace(`{${p.name}}`, 'stub');\n }\n // Escape regex special chars in the URL path (dots, slashes, etc.)\n const escaped = `https://api.workos.com${path}`.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return escaped;\n}\n\n/** Format the stub URL as a Ruby regex literal for WebMock. */\nfunction stubUrlRegex(escaped: string): string {\n return `%r{\\\\A${escaped}(\\\\?|\\\\z)}`;\n}\n","import type { ApiSpec, EmitterContext, OperationsMap } from '@workos/oagen';\nimport { servicePropertyName } from './naming.js';\n\n/**\n * Build operation-to-SDK-method mapping for the manifest.\n *\n * Uses each resolved operation's actual mountOn (not the service default) so\n * operations remounted via operationHints land on the correct service prop.\n * Split operations emit one entry per wrapper (keyed by wrapper name + variant).\n */\nexport function buildOperationsMap(spec: ApiSpec, ctx: EmitterContext): OperationsMap {\n void spec;\n const manifest: OperationsMap = {};\n\n for (const r of ctx.resolvedOperations ?? []) {\n const op = r.operation;\n const httpKey = `${op.httpMethod.toUpperCase()} ${op.path}`;\n const propName = servicePropertyName(r.mountOn);\n manifest[httpKey] = { sdkMethod: r.methodName, service: propName };\n if (r.wrappers && r.wrappers.length > 0) {\n for (const w of r.wrappers) {\n manifest[`${httpKey}#${w.targetVariant}`] = { sdkMethod: w.name, service: propName };\n }\n }\n }\n\n return manifest;\n}\n","import type { ApiSpec, EmitterContext, GeneratedFile, TypeRef, Model } from '@workos/oagen';\nimport { mapTypeRef as irMapTypeRef } from '@workos/oagen';\nimport { className, fieldName, fileName, safeParamName, resolveMethodName } from './naming.js';\nimport {\n buildResolvedLookup,\n groupByMount,\n lookupResolved,\n buildHiddenParams,\n collectGroupedParamNames,\n} from '../shared/resolved-ops.js';\nimport { isListWrapperModel, isListMetadataModel } from '../shared/model-utils.js';\n\n/**\n * Map an IR TypeRef to a Sorbet type string for RBI files.\n */\nfunction mapSorbetType(ref: TypeRef): string {\n return irMapTypeRef<string>(ref, {\n primitive: (r) => {\n switch (r.type) {\n case 'string':\n return 'String';\n case 'integer':\n return 'Integer';\n case 'number':\n return 'Float';\n case 'boolean':\n return 'T::Boolean';\n case 'unknown':\n return 'T.untyped';\n }\n },\n array: (_ref, items) => `T::Array[${items}]`,\n model: (r) => `WorkOS::${className(r.name)}`,\n enum: () => 'String',\n union: (r, variants) => {\n if (r.compositionKind === 'allOf') return variants[0] ?? 'T.untyped';\n const unique = [...new Set(variants)];\n if (unique.length === 1) return unique[0];\n return `T.any(${unique.join(', ')})`;\n },\n nullable: (_ref, inner) => `T.nilable(${inner})`,\n literal: (r) =>\n typeof r.value === 'string'\n ? 'String'\n : r.value === null\n ? 'NilClass'\n : typeof r.value === 'number'\n ? Number.isInteger(r.value)\n ? 'Integer'\n : 'Float'\n : 'T::Boolean',\n map: (_ref, value) => `T::Hash[String, ${value}]`,\n });\n}\n\n/**\n * Generate .rbi files for Sorbet type checking.\n */\nexport function generateRbiFiles(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n const modelNames = new Set(spec.models.map((m) => m.name));\n const _enumNames = new Set(spec.enums.map((e) => e.name));\n\n // 1. Generate model RBI files\n const models = (spec.models as Model[]).filter((m) => !isListWrapperModel(m) && !isListMetadataModel(m));\n\n for (const model of models) {\n const cls = className(model.name);\n const lines: string[] = [];\n lines.push('# typed: strong');\n lines.push('');\n lines.push('module WorkOS');\n lines.push(` class ${cls}`);\n\n // Constructor\n lines.push(' sig { params(json: T.any(String, T::Hash[Symbol, T.untyped])).void }');\n lines.push(' def initialize(json); end');\n lines.push('');\n\n // Field accessors\n const seenFieldNames = new Set<string>();\n for (const f of model.fields) {\n const fname = fieldName(f.name);\n if (seenFieldNames.has(fname)) continue;\n seenFieldNames.add(fname);\n const sorbetType = f.required ? mapSorbetType(f.type) : `T.nilable(${unwrapNilable(mapSorbetType(f.type))})`;\n lines.push(` sig { returns(${sorbetType}) }`);\n lines.push(` def ${fname}; end`);\n lines.push('');\n lines.push(` sig { params(value: ${sorbetType}).returns(${sorbetType}) }`);\n lines.push(` def ${fname}=(value); end`);\n lines.push('');\n }\n\n // to_h and to_json\n lines.push(' sig { returns(T::Hash[Symbol, T.untyped]) }');\n lines.push(' def to_h; end');\n lines.push('');\n lines.push(' sig { params(args: T.untyped).returns(String) }');\n lines.push(' def to_json(*args); end');\n\n lines.push(' end');\n lines.push('end');\n\n files.push({\n path: `rbi/workos/${fileName(model.name)}.rbi`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n // 2. Generate service RBI files\n const groups = groupByMount(ctx);\n const lookup = buildResolvedLookup(ctx);\n const modelByName = new Map<string, Model>();\n for (const m of spec.models as Model[]) modelByName.set(m.name, m);\n const listWrapperModels = new Map<string, Model>();\n for (const m of spec.models as Model[]) {\n if (isListWrapperModel(m)) listWrapperModels.set(m.name, m);\n }\n\n for (const [mountTarget, group] of groups) {\n const cls = className(mountTarget);\n const lines: string[] = [];\n lines.push('# typed: strong');\n lines.push('');\n lines.push('module WorkOS');\n lines.push(` class ${cls}`);\n\n lines.push(' sig { params(client: WorkOS::BaseClient).void }');\n lines.push(' def initialize(client); end');\n lines.push('');\n\n const emittedMethods = new Set<string>();\n\n for (const op of group.operations) {\n const ownerService =\n group.resolvedOps.find((r) => r.operation === op)?.service ??\n spec.services.find((s) => s.operations.includes(op)) ??\n spec.services[0];\n const method = resolveMethodName(op, ownerService, ctx);\n if (emittedMethods.has(method)) continue;\n\n const resolved = lookupResolved(op, lookup);\n if (resolved?.urlBuilder) {\n emittedMethods.add(method);\n continue;\n }\n emittedMethods.add(method);\n\n const hiddenParams = buildHiddenParams(resolved);\n const groupedParamNames = collectGroupedParamNames(op);\n const queryParams = (op.queryParams ?? []).filter((q) => !groupedParamNames.has(q.name));\n const bodyFields = getRequestBodyFieldsFlat(op, hiddenParams, modelByName);\n\n // Build parameter list for sig\n const sigParams: string[] = [];\n const seen = new Set<string>();\n\n for (const p of op.pathParams ?? []) {\n const n = safeParamName(p.name);\n if (seen.has(n)) continue;\n seen.add(n);\n sigParams.push(`${n}: ${mapSorbetType(p.type)}`);\n }\n for (const f of bodyFields) {\n if (hiddenParams.has(f.name)) continue;\n if (!f.required) continue;\n const n = fieldName(f.name);\n if (seen.has(n)) continue;\n seen.add(n);\n sigParams.push(`${n}: ${mapSorbetType(f.type)}`);\n }\n for (const q of queryParams) {\n if (hiddenParams.has(q.name)) continue;\n if (!q.required) continue;\n const n = safeParamName(q.name);\n if (seen.has(n)) continue;\n seen.add(n);\n sigParams.push(`${n}: ${mapSorbetType(q.type)}`);\n }\n for (const f of bodyFields) {\n if (hiddenParams.has(f.name)) continue;\n if (f.required) continue;\n const n = fieldName(f.name);\n if (seen.has(n)) continue;\n seen.add(n);\n sigParams.push(`${n}: T.nilable(${unwrapNilable(mapSorbetType(f.type))})`);\n }\n for (const q of queryParams) {\n if (hiddenParams.has(q.name)) continue;\n if (q.required) continue;\n const n = safeParamName(q.name);\n if (seen.has(n)) continue;\n seen.add(n);\n sigParams.push(`${n}: T.nilable(${unwrapNilable(mapSorbetType(q.type))})`);\n }\n sigParams.push('request_options: T::Hash[Symbol, T.untyped]');\n\n // Return type\n const retType = mapSorbetReturnType(op.response, listWrapperModels, modelNames);\n\n lines.push(' sig do');\n lines.push(' params(');\n for (let i = 0; i < sigParams.length; i++) {\n const sep = i === sigParams.length - 1 ? '' : ',';\n lines.push(` ${sigParams[i]}${sep}`);\n }\n lines.push(` ).returns(${retType})`);\n lines.push(' end');\n lines.push(` def ${method}(${sigParams.map((p) => p.split(':')[0].trim() + ':').join(', ')}); end`);\n lines.push('');\n }\n\n lines.push(' end');\n lines.push('end');\n\n files.push({\n path: `rbi/workos/${fileName(mountTarget)}.rbi`,\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n // 3. Generate client RBI file\n {\n const lines: string[] = [];\n lines.push('# typed: strong');\n lines.push('');\n lines.push('module WorkOS');\n lines.push(' class Client < BaseClient');\n\n for (const [mountTarget] of groups) {\n const cls = className(mountTarget);\n const prop = mountTarget\n .replace(/-/g, '_')\n .replace(/[A-Z]/g, (ch) => `_${ch.toLowerCase()}`)\n .replace(/^_/, '');\n lines.push(` sig { returns(WorkOS::${cls}) }`);\n lines.push(` def ${prop}; end`);\n lines.push('');\n }\n\n lines.push(' end');\n lines.push('end');\n\n files.push({\n path: 'rbi/workos/client.rbi',\n content: lines.join('\\n'),\n integrateTarget: true,\n overwriteExisting: true,\n });\n }\n\n return files;\n}\n\n/** Unwrap T.nilable(...) if already wrapped, to avoid double-wrapping. */\nfunction unwrapNilable(type: string): string {\n const match = type.match(/^T\\.nilable\\((.+)\\)$/);\n return match ? match[1] : type;\n}\n\n/** Map a response TypeRef to a Sorbet return type. */\nfunction mapSorbetReturnType(ref: TypeRef, listWrapperModels: Map<string, Model>, modelNames: Set<string>): string {\n if (ref.kind === 'model' && listWrapperModels.has(ref.name)) {\n return 'WorkOS::Types::ListStruct';\n }\n if (ref.kind === 'model' && modelNames.has(ref.name)) {\n return `WorkOS::${className(ref.name)}`;\n }\n if (ref.kind === 'array' && ref.items.kind === 'model' && modelNames.has(ref.items.name)) {\n return `T::Array[WorkOS::${className(ref.items.name)}]`;\n }\n if (ref.kind === 'nullable') {\n return `T.nilable(${mapSorbetReturnType(ref.inner, listWrapperModels, modelNames)})`;\n }\n if (ref.kind === 'primitive' && ref.type === 'unknown') {\n return 'NilClass';\n }\n return mapSorbetType(ref);\n}\n\n/** Get body fields (flat) for RBI sig generation. */\nfunction getRequestBodyFieldsFlat(\n op: { requestBody?: TypeRef },\n hiddenParams: Set<string>,\n modelByName: Map<string, Model>,\n): { name: string; required: boolean; type: TypeRef }[] {\n void hiddenParams;\n const ref = op.requestBody;\n if (!ref) return [];\n if (ref.kind === 'model') {\n const model = modelByName.get(ref.name);\n if (!model) return [];\n return model.fields.map((f) => ({ name: f.name, required: f.required, type: f.type }));\n }\n if (ref.kind === 'nullable') {\n return getRequestBodyFieldsFlat({ requestBody: ref.inner }, hiddenParams, modelByName);\n }\n if (ref.kind === 'union') {\n for (const v of ref.variants) {\n if (v.kind === 'model') {\n const model = modelByName.get(v.name);\n if (model) return model.fields.map((f) => ({ name: f.name, required: f.required, type: f.type }));\n }\n }\n }\n return [];\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 { 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 { buildOperationsMap } from './manifest.js';\nimport { generateRbiFiles } from './rbi.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 rubyEmitter: Emitter = {\n language: 'ruby',\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 // Hand-maintained in the target SDK — base_client.rb, errors.rb,\n // configuration.rb, hash_provider.rb, types/list_struct.rb,\n // test/test_helper.rb, and version.rb all carry `@oagen-ignore-file`\n // and are not regenerated.\n return [];\n },\n\n generateTypeSignatures(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateRbiFiles(spec, ctx));\n },\n\n generateTests(spec: ApiSpec, ctx: EmitterContext): GeneratedFile[] {\n return ensureTrailingNewlines(generateTests(spec, ctx));\n },\n\n buildOperationsMap(spec: ApiSpec, ctx: EmitterContext) {\n return buildOperationsMap(spec, ctx);\n },\n\n fileHeader(): string {\n return `# frozen_string_literal: true\\n\\n# This file is auto-generated by oagen. Do not edit.`;\n },\n\n formatCommand(targetDir: string): FormatCommand | null {\n void targetDir;\n // The WorkOS Ruby SDK uses standardrb. oagen appends the list of written\n // files as positional args after `args`; we filter to .rb files and pipe\n // them to `bundle exec standardrb --fix`. cwd is set to targetDir by the\n // harness so bundler picks up the SDK's Gemfile.\n //\n // Note: errors are NOT swallowed here — if standardrb fails (missing\n // bundle, syntax error, etc.) the engine surfaces it. Silence only hides\n // the fact that formatting never happened.\n return {\n cmd: 'bash',\n args: [\n '-c',\n 'RB_FILES=$(for f in \"$@\"; do case \"$f\" in *.rb) echo \"$f\";; esac; done); ' +\n 'if [ -n \"$RB_FILES\" ]; then printf \"%s\\\\n\" \"$RB_FILES\" | xargs bundle exec standardrb --fix --format quiet; fi',\n '--',\n ],\n batchSize: 1000,\n };\n },\n};\n","import { fileURLToPath } from 'node:url';\nimport * as path from 'node:path';\nimport type { OagenConfig } from '@workos/oagen';\nimport { nodeEmitter } from './node/index.js';\nimport { pythonEmitter } from './python/index.js';\nimport { phpEmitter } from './php/index.js';\nimport { goEmitter } from './go/index.js';\nimport { dotnetEmitter } from './dotnet/index.js';\nimport { kotlinEmitter } from './kotlin/index.js';\nimport { rubyEmitter } from './ruby/index.js';\nimport { nodeExtractor } from './compat/extractors/node.js';\nimport { rubyExtractor } from './compat/extractors/ruby.js';\nimport { pythonExtractor } from './compat/extractors/python.js';\nimport { phpExtractor } from './compat/extractors/php.js';\nimport { goExtractor } from './compat/extractors/go.js';\nimport { rustExtractor } from './compat/extractors/rust.js';\nimport { kotlinExtractor } from './compat/extractors/kotlin.js';\nimport { dotnetExtractor } from './compat/extractors/dotnet.js';\nimport { elixirExtractor } from './compat/extractors/elixir.js';\n\n// Resolve smoke runner paths relative to the package root so they work\n// regardless of which project loads the config (CWD-independent).\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst smokeDir = path.resolve(__dirname, '..', 'smoke');\n\nexport const workosEmittersPlugin: Pick<OagenConfig, 'emitters' | 'extractors' | 'smokeRunners'> = {\n emitters: [nodeEmitter, pythonEmitter, phpEmitter, goEmitter, dotnetEmitter, kotlinEmitter, rubyEmitter],\n extractors: [\n nodeExtractor,\n rubyExtractor,\n pythonExtractor,\n phpExtractor,\n goExtractor,\n rustExtractor,\n kotlinExtractor,\n dotnetExtractor,\n elixirExtractor,\n ],\n smokeRunners: {\n node: path.join(smokeDir, 'sdk-node.ts'),\n ruby: path.join(smokeDir, 'sdk-ruby.ts'),\n python: path.join(smokeDir, 'sdk-python.ts'),\n php: path.join(smokeDir, 'sdk-php.ts'),\n go: path.join(smokeDir, 'sdk-go.ts'),\n rust: path.join(smokeDir, 'sdk-rust.ts'),\n elixir: path.join(smokeDir, 'sdk-elixir.ts'),\n kotlin: path.join(smokeDir, 'sdk-kotlin.ts'),\n dotnet: path.join(smokeDir, 'sdk-dotnet.ts'),\n },\n};\n"],"x_google_ignoreList":[4],"mappings":"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"}
|