@stackwright-pro/openapi 0.3.0-alpha.6 → 0.3.0-alpha.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/parser/OpenAPIParser.ts","../src/parser/SchemaResolver.ts","../src/compiler/ZodSchemaGenerator.ts","../src/compiler/TypeGenerator.ts","../src/compiler/CollectionProviderGenerator.ts","../src/compiler/ActionGenerator.ts","../src/compiler/ClientGenerator.ts","../src/utils/EndpointFilter.ts","../src/utils/ApprovedSpecsValidator.ts","../src/prebuild/OpenAPIPlugin.ts","../src/sources/openapi.ts"],"names":["path","isSafe","fs","URL","isIP"],"mappings":"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","file":"index.mjs","sourcesContent":["import SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIDocument } from '../types';\n\nexport interface ParseOptions {\n /** Whether to dereference $ref (default: true) */\n dereference?: boolean;\n\n /** Whether to validate the spec (default: true) */\n validate?: boolean;\n}\n\nexport interface ParseResult {\n /** Parsed and normalized OpenAPI document */\n document: OpenAPIDocument;\n\n /** OpenAPI version (3.0.x or 3.1.x) */\n version: string;\n\n /** Whether the spec was dereferenced */\n dereferenced: boolean;\n}\n\n/**\n * OpenAPI spec parser and validator\n *\n * Handles both OpenAPI 3.0 and 3.1 specs.\n * Can parse from URL or local file path.\n */\nexport class OpenAPIParser {\n /**\n * Parse an OpenAPI specification from URL or file path\n *\n * @param specPath - URL or local file path to OpenAPI spec\n * @param options - Parsing options\n * @returns Parsed and validated OpenAPI document\n *\n * @example\n * ```typescript\n * const parser = new OpenAPIParser();\n * const result = await parser.parse('https://api.example.com/openapi.json');\n * console.log(`Parsed OpenAPI ${result.version}`);\n * ```\n */\n async parse(specPath: string, options: ParseOptions = {}): Promise<ParseResult> {\n const { dereference = true, validate = true } = options;\n\n try {\n // Parse and optionally dereference the spec\n const api = await SwaggerParser.parse(specPath);\n\n // Validate the spec structure\n if (validate) {\n await SwaggerParser.validate(api);\n }\n\n // Dereference $ref pointers if requested\n let document: OpenAPIDocument;\n let dereferenced = false;\n if (dereference) {\n try {\n document = (await SwaggerParser.dereference(api)) as OpenAPIDocument;\n dereferenced = true;\n } catch {\n console.warn(\n `[OpenAPIParser] Warning: Could not fully dereference \"${specPath}\" (dangling $ref or circular ref). Proceeding without full dereferencing — some schema references may not resolve.`\n );\n document = api as OpenAPIDocument;\n dereferenced = false;\n }\n } else {\n document = api as OpenAPIDocument;\n }\n\n // Detect version\n const version = this.detectVersion(document);\n\n return {\n document,\n version,\n dereferenced,\n };\n } catch (error) {\n throw this.enhanceError(error, specPath);\n }\n }\n\n /**\n * Detect OpenAPI version from document\n */\n private detectVersion(document: OpenAPIDocument): string {\n // Access the openapi property - it's always present in valid OpenAPI 3.x documents\n // The 'openapi' field is a required string in OpenAPI 3.x specifications\n const openapiVersion =\n 'openapi' in document ? (document as unknown as { openapi: string }).openapi : undefined;\n if (openapiVersion !== undefined) {\n return openapiVersion;\n }\n throw new Error('Invalid OpenAPI document: missing openapi version field');\n }\n\n /**\n * Enhance error messages with context\n */\n private enhanceError(error: unknown, specPath: string): Error {\n if (error instanceof Error) {\n const message = `Failed to parse OpenAPI spec from \"${specPath}\": ${error.message}`;\n const enhancedError = new Error(message);\n // Preserve original stack trace if available\n if (error.stack !== undefined) {\n enhancedError.stack = error.stack;\n }\n return enhancedError;\n }\n return new Error(`Failed to parse OpenAPI spec from \"${specPath}\": ${String(error)}`);\n }\n\n /**\n * Check if a spec path is a URL\n */\n static isURL(specPath: string): boolean {\n try {\n new URL(specPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Validate that a document is OpenAPI 3.x (not Swagger 2.x)\n */\n static isOpenAPI3(document: unknown): document is OpenAPIDocument {\n return (\n typeof document === 'object' &&\n document !== null &&\n 'openapi' in document &&\n typeof (document as any).openapi === 'string' &&\n (document as any).openapi.startsWith('3.')\n );\n }\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\n\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\n\n// TODO: extend SUPPORTED_CONTENT_TYPES as new API patterns emerge\nconst SUPPORTED_CONTENT_TYPES = [\n 'application/json',\n 'application/geo+json', // GeoJSON (ORS, mapping APIs)\n 'application/vnd.api+json', // JSON:API\n 'application/ld+json', // JSON-LD\n 'application/problem+json', // RFC 7807 problem details\n '*/*', // wildcard fallback\n] as const;\n\n/**\n * Resolves schemas from OpenAPI documents\n *\n * Handles extracting and normalizing schemas for code generation.\n */\nexport class SchemaResolver {\n /**\n * @param document - Fully dereferenced OpenAPI document. Pass the result of\n * SwaggerParser.dereference() or OpenAPIParser.parse(). Passing a document\n * with unresolved $ref objects will produce console warnings and undefined\n * returns from schema extraction methods.\n */\n constructor(private document: OpenAPIV3.Document | OpenAPIV3_1.Document) {}\n\n /**\n * Get schema for a specific path and method.\n *\n * Tries `preferredResponseCode` first (default `'200'`). If that code is\n * absent or has no JSON schema, falls back through other 2xx codes in\n * priority order so that REST-correct `201 Created` responses are resolved\n * automatically.\n *\n * @param path - API path (e.g., '/equipment')\n * @param method - HTTP method (e.g., 'get')\n * @param preferredResponseCode - Response code to try first (default: '200')\n * @returns Schema object or undefined\n */\n getResponseSchema(\n path: string,\n method: string,\n preferredResponseCode: string = '200'\n ): SchemaObject | undefined {\n const pathItem = this.document.paths?.[path];\n if (!pathItem) return undefined;\n\n const operation = pathItem[method.toLowerCase() as keyof typeof pathItem] as\n | OpenAPIV3.OperationObject\n | OpenAPIV3_1.OperationObject\n | undefined;\n\n const responses = operation?.responses;\n if (!responses) return undefined;\n\n // Helper: extract JSON schema from a response object, trying each supported\n // content type in priority order so specs that use geo+json, JSON:API, etc.\n // are handled without special-casing at the call site.\n const extractSchema = (responseCode: string): SchemaObject | undefined => {\n const response = responses[responseCode] as\n | OpenAPIV3.ResponseObject\n | OpenAPIV3_1.ResponseObject\n | undefined;\n if (!response) return undefined;\n\n for (const contentType of SUPPORTED_CONTENT_TYPES) {\n const content = response.content?.[contentType];\n if (!content?.schema) continue;\n const schema = content.schema;\n if ('$ref' in schema) {\n // Warn but return the $ref as-is — callers that need a resolved schema\n // should use a dereferenced document. Silently dropping it here loses\n // valid schema references from the generator pipeline.\n console.warn(\n `[SchemaResolver] Unresolved $ref in schema for ${path}. ` +\n `Ensure the document is fully dereferenced before passing to SchemaResolver.`\n );\n return schema as SchemaObject;\n }\n return schema as SchemaObject;\n }\n\n return undefined;\n };\n\n // Try the preferred code first (preserves existing behaviour for 200-based specs)\n const preferred = extractSchema(preferredResponseCode);\n if (preferred) return preferred;\n\n // Cascade through remaining 2xx codes in priority order\n const fallbackCodes = ['200', '201', '202', '204', '2XX', '2xx'];\n for (const code of fallbackCodes) {\n if (code === preferredResponseCode) continue; // already tried\n const schema = extractSchema(code);\n if (schema) return schema;\n }\n\n return undefined;\n }\n\n /**\n * Get the request body schema for a specific path and method.\n *\n * Extracts the application/json schema from the operation's requestBody.\n * Returns undefined if the operation has no requestBody or no JSON content.\n *\n * @param path - API path (e.g., '/supplies/request')\n * @param method - HTTP method (e.g., 'post')\n * @returns Schema object or undefined\n */\n getRequestBodySchema(path: string, method: string): SchemaObject | undefined {\n const pathItem = this.document.paths?.[path];\n if (!pathItem) return undefined;\n\n const operation = pathItem[method.toLowerCase() as keyof typeof pathItem] as\n | OpenAPIV3.OperationObject\n | OpenAPIV3_1.OperationObject\n | undefined;\n\n if (!operation) return undefined;\n\n const rawRequestBody = operation.requestBody;\n if (!rawRequestBody) return undefined;\n\n // Guard: $refs must be resolved before reaching SchemaResolver.\n // This package uses @apidevtools/swagger-parser for dereferencing — if a\n // ReferenceObject appears here, the caller passed a non-dereferenced document.\n if ('$ref' in rawRequestBody) {\n console.warn(\n `[SchemaResolver] Unresolved $ref in requestBody for ${method.toUpperCase()} ${path}. ` +\n `Ensure the document is fully dereferenced before passing to SchemaResolver.`\n );\n return undefined;\n }\n\n const requestBody = rawRequestBody as\n | OpenAPIV3.RequestBodyObject\n | OpenAPIV3_1.RequestBodyObject;\n\n const content = requestBody.content?.['application/json'];\n const schema = content?.schema;\n if (!schema) return undefined;\n if ('$ref' in schema) {\n console.warn(\n `[SchemaResolver] Unresolved $ref in schema for ${path}. ` +\n `Ensure the document is fully dereferenced before passing to SchemaResolver.`\n );\n return undefined;\n }\n return schema as SchemaObject;\n }\n\n /**\n * Get all schemas defined in components\n */\n getAllSchemas(): Record<string, SchemaObject> {\n return (this.document.components?.schemas || {}) as Record<string, SchemaObject>;\n }\n\n /**\n * Get a specific component schema by name\n */\n getComponentSchema(name: string): SchemaObject | undefined {\n return this.document.components?.schemas?.[name] as SchemaObject | undefined;\n }\n\n /**\n * Extract all endpoints from the OpenAPI document\n */\n getAllEndpoints(): Array<{\n path: string;\n method: string;\n operationId?: string;\n summary?: string;\n description?: string;\n }> {\n const endpoints: ReturnType<typeof this.getAllEndpoints> = [];\n\n for (const [path, pathItem] of Object.entries(this.document.paths || {})) {\n if (!pathItem) continue;\n\n const methods = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'] as const;\n\n for (const method of methods) {\n const operation = pathItem[method] as\n | OpenAPIV3.OperationObject\n | OpenAPIV3_1.OperationObject\n | undefined;\n\n if (operation) {\n endpoints.push({\n path,\n method,\n ...(operation.operationId !== undefined && { operationId: operation.operationId }),\n ...(operation.summary !== undefined && { summary: operation.summary }),\n ...(operation.description !== undefined && { description: operation.description }),\n });\n }\n }\n }\n\n return endpoints;\n }\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport { z } from 'zod';\nimport isSafe from 'safe-regex';\n\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\n\nexport interface ZodGenerationOptions {\n /** Whether to make all fields optional by default */\n optionalByDefault?: boolean;\n\n /** Custom name for the generated schema */\n schemaName?: string;\n\n /** If true, emit only the schema + type — no import statements */\n bare?: boolean;\n}\n\n/**\n * Generates Zod schemas from OpenAPI schema objects\n *\n * This is the CORE of the \"mathematically proven code\" value proposition.\n * OpenAPI schemas → Zod validation = runtime safety guarantees.\n */\nexport class ZodSchemaGenerator {\n /**\n * Generate a Zod schema from an OpenAPI schema object\n *\n * @param schema - OpenAPI schema object\n * @param options - Generation options\n * @returns Zod schema code as string\n */\n generate(schema: SchemaObject, options: ZodGenerationOptions = {}): string {\n const { schemaName = 'GeneratedSchema', bare = false } = options;\n\n const zodSchemaCode = this.schemaToZod(schema);\n\n const body = `export const ${schemaName} = ${zodSchemaCode};\n\nexport type ${schemaName}Type = z.infer<typeof ${schemaName}>;\n`;\n\n if (bare) {\n return body;\n }\n\n return `import { z } from 'zod';\nimport isSafe from 'safe-regex';\n\n${body}`;\n }\n\n /**\n * Convert OpenAPI schema to Zod schema code\n */\n private schemaToZod(schema: SchemaObject, depth = 0): string {\n // Gracefully handle unresolved $ref encountered during recursion\n if ('$ref' in schema && (schema as any).$ref) {\n const refPath = (schema as any).$ref;\n console.warn(\n `\\u26a0\\ufe0f Unresolved $ref encountered: ${refPath} \\u2014 generating z.unknown()`\n );\n return `z.unknown() /* unresolved $ref: ${refPath} */`;\n }\n\n // Handle nullable (OpenAPI 3.0 nullable, OpenAPI 3.1 type array with null)\n const isNullable = 'nullable' in schema && schema.nullable === true;\n\n // Base schema generation\n let baseSchema = this.schemaTypeToZod(schema);\n\n // Add description if present\n if (schema.description) {\n const escapedDesc = schema.description.replace(/'/g, \"\\\\'\");\n baseSchema += `.describe('${escapedDesc}')`;\n }\n\n // Handle nullable\n if (isNullable) {\n baseSchema += '.nullable()';\n }\n\n // Handle optional (not in required array)\n // Note: This is handled at the object level, not here\n\n return baseSchema;\n }\n\n /**\n * Map OpenAPI type to Zod schema\n */\n private schemaTypeToZod(schema: SchemaObject): string {\n // Handle $ref (shouldn't happen after dereferencing, but just in case)\n if ('$ref' in schema) {\n throw new Error('$ref found in schema - ensure spec is dereferenced');\n }\n\n // Handle allOf, anyOf, oneOf\n if ('allOf' in schema && schema.allOf) {\n return this.handleComposition(schema.allOf, 'intersection');\n }\n if ('anyOf' in schema && schema.anyOf) {\n return this.handleComposition(schema.anyOf, 'union');\n }\n if ('oneOf' in schema && schema.oneOf) {\n return this.handleComposition(schema.oneOf, 'discriminatedUnion');\n }\n\n // Handle type-based schemas\n const type = schema.type;\n\n // Infer type: object when properties are present (common in real-world specs)\n // OpenAPI spec says: if \"properties\" is defined, the schema describes an object\n if (!type && schema.properties) {\n return this.objectToZod(schema as OpenAPIV3.NonArraySchemaObject);\n }\n\n // Also infer object if additionalProperties is set but no type\n if (!type && schema.additionalProperties !== undefined) {\n return this.objectToZod(schema as OpenAPIV3.NonArraySchemaObject);\n }\n\n switch (type) {\n case 'string':\n return this.stringToZod(schema);\n case 'number':\n case 'integer':\n return this.numberToZod(schema);\n case 'boolean':\n return 'z.boolean()';\n case 'array':\n return this.arrayToZod(schema as OpenAPIV3.ArraySchemaObject);\n case 'object':\n return this.objectToZod(schema as OpenAPIV3.NonArraySchemaObject);\n case 'null':\n return 'z.null()';\n default:\n // No type specified - allow any\n return 'z.unknown()';\n }\n }\n\n /**\n * Handle string schemas with formats and enums\n */\n private stringToZod(schema: SchemaObject): string {\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n const values = schema.enum.map((v: unknown) => `'${v}'`).join(', ');\n return `z.enum([${values}])`;\n }\n\n let base = 'z.string()';\n\n // Handle string formats\n if ('format' in schema && schema.format) {\n switch (schema.format) {\n case 'email':\n base += '.email()';\n break;\n case 'uri':\n case 'url':\n base += '.url()';\n break;\n case 'uuid':\n base += '.uuid()';\n break;\n case 'date-time':\n base += '.datetime()';\n break;\n case 'date':\n base += '.date()';\n break;\n // Add more formats as needed\n }\n }\n\n // Handle string constraints\n if ('minLength' in schema && typeof schema.minLength === 'number') {\n base += `.min(${schema.minLength})`;\n }\n if ('maxLength' in schema && typeof schema.maxLength === 'number') {\n base += `.max(${schema.maxLength})`;\n }\n if ('pattern' in schema && schema.pattern) {\n // ✅ SECURITY FIX: Validate regex safety to prevent ReDoS\n if (!isSafe(schema.pattern)) {\n console.warn(`⚠️ Unsafe regex pattern detected: ${schema.pattern}`);\n console.warn(' Skipping pattern validation to prevent ReDoS');\n // Skip the unsafe pattern - better safe than DoS\n } else {\n const escapedPattern = schema.pattern.replace(/\\\\/g, '\\\\\\\\');\n base += `.regex(/${escapedPattern}/)`;\n }\n }\n\n return base;\n }\n\n /**\n * Handle number/integer schemas\n */\n private numberToZod(schema: SchemaObject): string {\n let base = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n\n if ('minimum' in schema && typeof schema.minimum === 'number') {\n base += `.min(${schema.minimum})`;\n }\n if ('maximum' in schema && typeof schema.maximum === 'number') {\n base += `.max(${schema.maximum})`;\n }\n if ('exclusiveMinimum' in schema && typeof schema.exclusiveMinimum === 'number') {\n base += `.gt(${schema.exclusiveMinimum})`;\n }\n if ('exclusiveMaximum' in schema && typeof schema.exclusiveMaximum === 'number') {\n base += `.lt(${schema.exclusiveMaximum})`;\n }\n\n return base;\n }\n\n /**\n * Handle array schemas\n */\n private arrayToZod(schema: OpenAPIV3.ArraySchemaObject): string {\n if (!schema.items) {\n return 'z.array(z.unknown())';\n }\n\n const itemSchema = this.schemaToZod(schema.items as SchemaObject);\n let base = `z.array(${itemSchema})`;\n\n if ('minItems' in schema && typeof schema.minItems === 'number') {\n base += `.min(${schema.minItems})`;\n }\n if ('maxItems' in schema && typeof schema.maxItems === 'number') {\n base += `.max(${schema.maxItems})`;\n }\n\n return base;\n }\n\n /**\n * Handle object schemas\n */\n private objectToZod(schema: OpenAPIV3.NonArraySchemaObject): string {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n // Empty object or record type\n if (schema.additionalProperties) {\n const valueSchema =\n typeof schema.additionalProperties === 'object'\n ? this.schemaToZod(schema.additionalProperties as SchemaObject)\n : 'z.unknown()';\n return `z.record(${valueSchema})`;\n }\n return 'z.object({})';\n }\n\n const properties = schema.properties;\n const required = schema.required || [];\n\n const fields = Object.entries(properties)\n .map(([key, propSchema]) => {\n const isRequired = required.includes(key);\n let fieldSchema = this.schemaToZod(propSchema as SchemaObject);\n\n if (!isRequired) {\n fieldSchema += '.optional()';\n }\n\n // Escape key if needed (e.g., if it has special characters)\n const safeKey = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key) ? key : `'${key}'`;\n\n return ` ${safeKey}: ${fieldSchema}`;\n })\n .join(',\\n');\n\n let result = `z.object({\\n${fields}\\n})`;\n\n // Handle additional properties\n if (schema.additionalProperties === false) {\n result += '.strict()';\n } else if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\n const valueSchema = this.schemaToZod(schema.additionalProperties as SchemaObject);\n result += `.catchall(${valueSchema})`;\n }\n\n return result;\n }\n\n /**\n * Handle allOf, anyOf, oneOf composition\n */\n private handleComposition(\n schemas: Array<SchemaObject | OpenAPIV3.ReferenceObject>,\n type: 'intersection' | 'union' | 'discriminatedUnion'\n ): string {\n const zodSchemas = schemas\n .filter((s): s is SchemaObject => !('$ref' in s))\n .map((s) => this.schemaToZod(s));\n\n if (zodSchemas.length === 0) {\n return 'z.unknown()';\n }\n\n switch (type) {\n case 'intersection':\n // allOf - all schemas must match\n return zodSchemas.reduce((acc, curr) => `${acc}.and(${curr})`);\n case 'union':\n // anyOf - at least one schema must match\n return `z.union([${zodSchemas.join(', ')}])`;\n case 'discriminatedUnion':\n // oneOf - exactly one schema must match\n // For now, treat as union (full discriminated union support is complex)\n return `z.union([${zodSchemas.join(', ')}])`;\n default:\n return 'z.unknown()';\n }\n }\n}\n","import { printNode, zodToTs, createAuxiliaryTypeStore } from 'zod-to-ts';\nimport { z } from 'zod';\n\nexport interface TypeGenerationOptions {\n /** Name for the generated type */\n typeName?: string;\n\n /** Whether to include JSDoc comments */\n includeJsDoc?: boolean;\n}\n\n/**\n * Generates TypeScript types from Zod schemas\n *\n * Converts runtime-validatable Zod schemas into compile-time TypeScript types.\n */\nexport class TypeGenerator {\n /**\n * Generate TypeScript type definition from a Zod schema\n *\n * @param zodSchema - Zod schema object\n * @param options - Generation options\n * @returns TypeScript type definition as string\n *\n * @example\n * ```typescript\n * const schema = z.object({ name: z.string(), age: z.number() });\n * const generator = new TypeGenerator();\n * const typeCode = generator.generate(schema, { typeName: 'User' });\n * // export type User = { name: string; age: number; };\n * ```\n */\n generate(zodSchema: z.ZodTypeAny, options: TypeGenerationOptions = {}): string {\n const { typeName = 'GeneratedType', includeJsDoc = true } = options;\n\n try {\n // Create auxiliary type store for recursive types (required in zod-to-ts v2+)\n const auxiliaryTypeStore = createAuxiliaryTypeStore();\n\n // Use zod-to-ts to convert Zod schema to TypeScript AST\n const { node } = zodToTs(zodSchema, { auxiliaryTypeStore });\n\n // Convert AST to TypeScript code\n const typeCode = printNode(node);\n\n // Build the complete type definition\n let result = '';\n\n if (includeJsDoc && zodSchema.description) {\n result += `/**\\n * ${zodSchema.description}\\n */\\n`;\n }\n\n result += `export type ${typeName} = ${typeCode};\\n`;\n\n return result;\n } catch (error) {\n throw new Error(\n `Failed to generate TypeScript type for ${typeName}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Generate type from Zod schema code string\n *\n * This is used when we have the schema as code (from ZodSchemaGenerator)\n * rather than as a runtime Zod object.\n *\n * @param zodSchemaCode - Zod schema as TypeScript code string\n * @param typeName - Name for the generated type\n * @returns TypeScript type definition\n */\n generateFromCode(zodSchemaCode: string, typeName: string): string {\n // For code-based generation, we rely on z.infer<>\n // The ZodSchemaGenerator already includes this\n return `export type ${typeName} = z.infer<typeof ${typeName}Schema>;\\n`;\n }\n\n /**\n * Generate multiple types from a map of Zod schemas\n *\n * @param schemas - Map of schema names to Zod schemas\n * @returns Object with type definitions for each schema\n */\n generateMultiple(\n schemas: Record<string, z.ZodTypeAny>,\n options: Omit<TypeGenerationOptions, 'typeName'> = {}\n ): Record<string, string> {\n const results: Record<string, string> = {};\n\n for (const [name, schema] of Object.entries(schemas)) {\n results[name] = this.generate(schema, { ...options, typeName: name });\n }\n\n return results;\n }\n\n /**\n * Combine multiple type definitions into a single TypeScript module\n *\n * @param types - Map of type names to type code\n * @param imports - Additional imports to include\n * @returns Complete TypeScript module code\n */\n createModule(types: Record<string, string>, imports: string[] = []): string {\n let module = '';\n\n // Add imports\n if (imports.length > 0) {\n module += imports.join('\\n') + '\\n\\n';\n }\n\n // Add type definitions\n module += Object.values(types).join('\\n');\n\n return module;\n }\n}\n","import type { OpenAPIDocument } from '../types';\nimport { SchemaResolver } from '../parser/SchemaResolver';\n\nexport interface CollectionConfig {\n /** API endpoint path */\n endpoint: string;\n\n /** Field to use as slug/ID */\n slugField: string;\n\n /** HTTP method (default: 'get') */\n method?: string;\n\n /** Collection name (defaults to sanitized endpoint) */\n name?: string;\n}\n\nexport interface ProviderGenerationOptions {\n /** Name for the provider class */\n providerName?: string;\n\n /** Base URL for the API */\n baseUrl?: string;\n\n /** Auth configuration */\n auth?: {\n type: 'bearer' | 'apiKey';\n headerName?: string;\n };\n\n /** If true, emit only the class code without import statements */\n bare?: boolean;\n}\n\n/**\n * Generates CollectionProvider implementations from OpenAPI specs\n *\n * This is the bridge between OpenAPI APIs and Stackwright's content system.\n */\nexport class CollectionProviderGenerator {\n constructor(private document: OpenAPIDocument) {}\n\n /**\n * Generate a CollectionProvider implementation for a specific endpoint\n *\n * @param config - Collection configuration\n * @param options - Generation options\n * @returns TypeScript code for the provider\n */\n generate(config: CollectionConfig, options: ProviderGenerationOptions = {}): string {\n const {\n providerName = this.generateProviderName(config),\n baseUrl = this.getBaseUrl(),\n auth,\n bare = false,\n } = options;\n\n const { endpoint, slugField, method: rawMethod = 'get', name } = config;\n const method = rawMethod.toLowerCase();\n const collectionName = name || this.sanitizePath(endpoint);\n\n const resolver = new SchemaResolver(this.document);\n const schema = resolver.getResponseSchema(endpoint, method);\n\n if (!schema) {\n console.warn(\n ` > No response schema found for ${method.toUpperCase()} ${endpoint} — falling back to z.unknown()`\n );\n }\n\n // Determine if response is an array or object\n const isArray = schema != null ? schema.type === 'array' : false;\n const unknownFallback = schema == null;\n\n const schemaName = `${this.capitalize(collectionName)}Schema`;\n\n // Build params object, conditionally including auth\n const params: {\n providerName: string;\n collectionName: string;\n endpoint: string;\n slugField: string;\n method: string;\n baseUrl: string;\n schemaName: string;\n isArray: boolean;\n unknownFallback: boolean;\n bare: boolean;\n auth?: { type: string; headerName?: string };\n } = {\n providerName,\n collectionName,\n endpoint,\n slugField,\n method,\n baseUrl,\n schemaName,\n isArray,\n unknownFallback,\n bare,\n };\n\n // Only include auth if it's defined (exactOptionalPropertyTypes)\n if (auth !== undefined) {\n params.auth = auth;\n }\n\n return this.generateProviderCode(params);\n }\n\n /**\n * Generate the complete provider code\n */\n private generateProviderCode(params: {\n providerName: string;\n collectionName: string;\n endpoint: string;\n slugField: string;\n method: string;\n baseUrl: string;\n auth?: { type: string; headerName?: string };\n schemaName: string;\n isArray: boolean;\n unknownFallback: boolean;\n bare: boolean;\n }): string {\n const {\n providerName,\n collectionName,\n endpoint,\n slugField,\n method,\n baseUrl,\n auth,\n schemaName,\n isArray,\n unknownFallback,\n bare,\n } = params;\n\n const authHeader = this.generateAuthHeader(auth);\n // Use the array schema for list endpoints\n const arraySchemaName = `${schemaName.replace(/Schema$/, '')}ArraySchema`;\n // When no schema was found, fall back to z.unknown() so the provider still compiles\n const validationSchema = unknownFallback\n ? 'z.unknown()'\n : isArray\n ? arraySchemaName\n : schemaName;\n\n const imports = bare\n ? ''\n : unknownFallback\n ? `import type { CollectionProvider, CollectionItem } from '@stackwright/collections';\nimport { z } from 'zod';\n\n`\n : `import type { CollectionProvider, CollectionItem } from '@stackwright/collections';\nimport { ${isArray ? arraySchemaName : schemaName} } from './schemas';\n\n`;\n\n return `${imports}/**\n * CollectionProvider for ${collectionName}\n *\n * Generated from OpenAPI endpoint: ${method.toUpperCase()} ${endpoint}\n */\nexport class ${providerName} implements CollectionProvider {\n private baseUrl: string;\n private authToken?: string;\n\n constructor(config?: { baseUrl?: string; authToken?: string }) {\n this.baseUrl = config?.baseUrl || '${baseUrl}';\n this.authToken = config?.authToken;\n }\n\n /**\n * Get collection name\n */\n getName(): string {\n return '${collectionName}';\n }\n\n /**\n * List all items in the collection\n */\n async list(options?: {\n limit?: number;\n offset?: number;\n filters?: Record<string, unknown>;\n }): Promise<CollectionItem[]> {\n const url = new URL(\\`\\${this.baseUrl}${endpoint}\\`);\n\n // Add pagination/filter params if supported\n if (options?.limit) {\n url.searchParams.set('limit', String(options.limit));\n }\n if (options?.offset) {\n url.searchParams.set('offset', String(options.offset));\n }\n\n const response = await fetch(url.toString(), {\n method: '${method.toUpperCase()}',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(\\`Failed to fetch ${collectionName}: \\${response.statusText}\\`);\n }\n\n const data = await response.json();\n \n // Validate response with Zod schema\n const validated = ${validationSchema}.parse(data);\n \n // Convert to CollectionItem format\n return ${isArray ? 'validated' : '[validated]'}.map((item: any) => this.toCollectionItem(item));\n }\n\n /**\n * Get a single item by slug\n */\n async get(slug: string): Promise<CollectionItem | null> {\n ${this.generateGetMethod(endpoint, slugField, isArray, collectionName, schemaName, unknownFallback)}\n }\n\n /**\n * Convert API response to CollectionItem\n */\n private toCollectionItem(item: any): CollectionItem {\n return {\n slug: String(item.${slugField}),\n title: item.${this.guessTitle(slugField)},\n data: item,\n metadata: {\n source: '${collectionName}',\n _raw: item,\n },\n };\n }\n\n /**\n * Get request headers including auth\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n ${authHeader}\n\n return headers;\n }\n}\n`;\n }\n\n /**\n * Generate get method implementation\n */\n private generateGetMethod(\n endpoint: string,\n slugField: string,\n isArray: boolean,\n collectionName: string,\n schemaName: string,\n unknownFallback: boolean = false\n ): string {\n const validationExpr = unknownFallback ? 'z.unknown()' : schemaName;\n if (endpoint.includes('{id}') || endpoint.includes(':id')) {\n // Detail endpoint exists\n const detailEndpoint = endpoint.replace('{id}', '${slug}').replace(':id', '${slug}');\n return `const url = \\`\\${this.baseUrl}${detailEndpoint}\\`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(\\`Failed to fetch ${collectionName} item: \\${response.statusText}\\`);\n }\n\n const data = await response.json();\n const validated = ${validationExpr}.parse(data);\n \n return this.toCollectionItem(validated);`;\n } else {\n // No detail endpoint - list all and filter\n return `const items = await this.list();\n return items.find((item) => item.slug === slug) || null;`;\n }\n }\n\n /**\n * Generate auth header code\n */\n private generateAuthHeader(auth?: { type: string; headerName?: string }): string {\n if (!auth) {\n return '// No authentication configured';\n }\n\n if (auth.type === 'bearer') {\n return `if (this.authToken) {\n headers['Authorization'] = \\`Bearer \\${this.authToken}\\`;\n }`;\n }\n\n if (auth.type === 'apiKey') {\n const headerName = auth.headerName || 'X-API-Key';\n return `if (this.authToken) {\n headers['${headerName}'] = this.authToken;\n }`;\n }\n\n return '// Unknown auth type';\n }\n\n /**\n * Get base URL from OpenAPI spec\n */\n private getBaseUrl(): string {\n if ('servers' in this.document && this.document.servers && this.document.servers.length > 0) {\n const firstServer = this.document.servers[0];\n if (firstServer !== undefined) {\n return firstServer.url;\n }\n }\n return 'http://localhost:3000';\n }\n\n /**\n * Generate provider class name from config\n */\n private generateProviderName(config: CollectionConfig): string {\n const name = config.name || this.sanitizePath(config.endpoint);\n return `${this.capitalize(name)}Provider`;\n }\n\n /**\n * Sanitize path to valid identifier\n */\n private sanitizePath(path: string): string {\n return path.replace(/^\\//, '').replace(/\\//g, '-').replace(/[{}:]/g, '').replace(/-+/g, '-');\n }\n\n /**\n * Capitalize string\n */\n private capitalize(str: string): string {\n return str\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n }\n\n /**\n * Guess which field might be a good title\n */\n private guessTitle(slugField: string): string {\n // Common title field names\n const titleFields = ['title', 'name', 'label', 'displayName'];\n const firstField = titleFields[0];\n\n // Use slugField as fallback\n return firstField !== undefined ? firstField : `item.${slugField}`;\n }\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport type { OpenAPIDocument, ActionConfig } from '../types';\nimport { SchemaResolver } from '../parser/SchemaResolver';\nimport { ZodSchemaGenerator } from './ZodSchemaGenerator';\n\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\n\ninterface ProcessedAction {\n config: ActionConfig;\n camelName: string; // e.g. createSupplyRequest\n pascalName: string; // e.g. CreateSupplyRequest\n inputSchemaName: string; // e.g. CreateSupplyRequestInputSchema\n outputSchemaName: string; // e.g. CreateSupplyRequestOutputSchema\n inputSchema: SchemaObject | undefined;\n outputSchema: SchemaObject | undefined;\n}\n\n/**\n * ActionGenerator\n *\n * Generates typed CollectionAction implementations from OpenAPI action configs.\n * Each configured action endpoint becomes a named export satisfying the\n * CollectionAction<TInput, TOutput> interface from @stackwright-pro/workflow.\n *\n * The generated actions.ts is the bridge between:\n * - stackwright.yml actions: config (what to generate)\n * - workflow YAML service: refs (how it's addressed at runtime)\n * - useWorkflow actions registry (where it executes)\n *\n * IoC note: This generator emits `import type { CollectionAction } from\n * '@stackwright-pro/workflow'` as a string. The generator package itself has\n * no dependency on @stackwright-pro/workflow — only the generated files do.\n */\nexport class ActionGenerator {\n private resolver: SchemaResolver;\n private zodGenerator: ZodSchemaGenerator;\n\n constructor(private document: OpenAPIDocument) {\n this.resolver = new SchemaResolver(document);\n this.zodGenerator = new ZodSchemaGenerator();\n }\n\n /**\n * Generate the complete actions.ts file content.\n *\n * @param actions - Action configs from stackwright.yml\n * @param integrationName - Used in the file header comment\n * @param clientClassName - Name of the generated API client class to import\n * @returns Complete TypeScript source for actions.ts\n */\n generate(actions: ActionConfig[], integrationName: string, clientClassName: string): string {\n if (actions.length === 0) {\n return this.generateEmptyFile(integrationName);\n }\n\n const processedActions = actions.map((config) => this.processAction(config));\n\n let code = this.generateHeader(integrationName);\n code += this.generateImports(clientClassName);\n code += '\\n';\n code += this.generateInlineSchemas(processedActions);\n code += '\\n';\n code += this.generateActionExports(processedActions);\n code += '\\n';\n code += this.generateRegistry(processedActions, integrationName);\n\n return code;\n }\n\n private processAction(config: ActionConfig): ProcessedAction {\n const method = config.method.toLowerCase();\n const inputSchema = this.resolver.getRequestBodySchema(config.endpoint, method);\n const outputSchema = this.resolver.getResponseSchema(config.endpoint, method);\n\n const camelName = this.toCamelCase(config.name);\n const pascalName = this.toPascalCase(config.name);\n\n return {\n config,\n camelName,\n pascalName,\n inputSchemaName: `${pascalName}InputSchema`,\n outputSchemaName: `${pascalName}OutputSchema`,\n inputSchema,\n outputSchema,\n };\n }\n\n private generateHeader(integrationName: string): string {\n return `/**\n * Generated CollectionAction implementations\n * Integration: ${integrationName}\n *\n * DO NOT EDIT — This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n *\n * Each export satisfies the CollectionAction interface from @stackwright-pro/workflow.\n * Wire actions into useWorkflow via the \\`actions\\` option:\n *\n * import { actions } from '@/generated/${integrationName}/actions';\n * <WorkflowPage workflow={definition} actions={actions} />\n */\\n\\n`;\n }\n\n private generateImports(clientClassName: string): string {\n return `import { z } from 'zod';\nimport type { CollectionAction, CollectionActionRegistry } from '@stackwright-pro/workflow';\nimport { ${clientClassName} } from './client';\n\nconst _client = new ${clientClassName}();\\n`;\n }\n\n private generateInlineSchemas(actions: ProcessedAction[]): string {\n const lines: string[] = [\n '// ─── Inline Schemas ─────────────────────────────────────────────────────────',\n ];\n\n for (const action of actions) {\n const { inputSchemaName, outputSchemaName, inputSchema, outputSchema, config } = action;\n\n // Input schema\n if (inputSchema) {\n try {\n const zodCode = this.zodGenerator.generate(inputSchema, {\n schemaName: inputSchemaName,\n bare: true,\n });\n lines.push(zodCode);\n } catch {\n lines.push(`// WARNING: Could not generate input schema for ${config.endpoint}`);\n lines.push(`const ${inputSchemaName} = z.unknown();\\n`);\n }\n } else {\n lines.push(`// No requestBody defined for ${config.method} ${config.endpoint}`);\n lines.push(`const ${inputSchemaName} = z.unknown();\\n`);\n }\n\n // Output schema\n if (outputSchema) {\n try {\n const zodCode = this.zodGenerator.generate(outputSchema, {\n schemaName: outputSchemaName,\n bare: true,\n });\n lines.push(zodCode);\n } catch {\n lines.push(`// WARNING: Could not generate output schema for ${config.endpoint}`);\n lines.push(`const ${outputSchemaName} = z.unknown();\\n`);\n }\n } else {\n lines.push(`// No 2xx response schema defined for ${config.method} ${config.endpoint}`);\n lines.push(`const ${outputSchemaName} = z.unknown();\\n`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n }\n\n private generateActionExports(actions: ProcessedAction[]): string {\n const lines: string[] = [\n '// ─── Action Exports ─────────────────────────────────────────────────────────',\n ];\n\n for (const action of actions) {\n const { config, camelName, inputSchemaName, outputSchemaName } = action;\n const safeName = config.name.replace(/'/g, \"\\\\'\");\n const safeDesc = config.description?.replace(/\\*\\//g, '* /');\n const methodName = this.endpointToClientMethod(config.endpoint, config.method);\n const jsDoc = safeDesc\n ? `/**\\n * ${safeDesc}\\n * Resolves service:${safeName} in workflow YAML.\\n */\\n`\n : `/** Resolves service:${safeName} in workflow YAML. */\\n`;\n\n lines.push(\n jsDoc +\n `export const ${camelName}: CollectionAction<\\n` +\n ` z.infer<typeof ${inputSchemaName}>,\\n` +\n ` z.infer<typeof ${outputSchemaName}>\\n` +\n `> = {\\n` +\n ` name: '${safeName}',\\n` +\n ` inputSchema: ${inputSchemaName},\\n` +\n ` outputSchema: ${outputSchemaName},\\n` +\n ` async execute(data) {\\n` +\n ` const validated = ${inputSchemaName}.parse(data);\\n` +\n ` const result = await _client.${methodName}({ body: validated });\\n` +\n ` return ${outputSchemaName}.parse(result);\\n` +\n ` },\\n` +\n `};\\n`\n );\n }\n\n return lines.join('\\n') + '\\n';\n }\n\n private generateRegistry(actions: ProcessedAction[], integrationName: string): string {\n const entries = actions\n .map((a) => {\n const safeName = a.config.name.replace(/'/g, \"\\\\'\");\n return ` '${safeName}': ${a.camelName},`;\n })\n .join('\\n');\n\n return (\n `// ─── Registry ────────────────────────────────────────────────────────────────\\n` +\n `/**\\n` +\n ` * Complete action registry for this integration.\\n` +\n ` * Pass directly to useWorkflow or WorkflowPage:\\n` +\n ` *\\n` +\n ` * import { actions } from '@/generated/${integrationName}/actions';\\n` +\n ` * const { send } = useWorkflow(definition, { actions });\\n` +\n ` */\\n` +\n `export const actions: CollectionActionRegistry = {\\n` +\n `${entries}\\n` +\n `};\\n`\n );\n }\n\n private generateEmptyFile(integrationName: string): string {\n return (\n `/**\\n` +\n ` * Generated CollectionAction implementations\\n` +\n ` * Integration: ${integrationName}\\n` +\n ` *\\n` +\n ` * DO NOT EDIT — This file is auto-generated by @stackwright-pro/openapi\\n` +\n ` *\\n` +\n ` * No actions configured for this integration.\\n` +\n ` * Add an actions: key to this integration in stackwright.yml to generate actions.\\n` +\n ` */\\n` +\n `\\n` +\n `import type { CollectionActionRegistry } from '@stackwright-pro/workflow';\\n` +\n `\\n` +\n `export const actions: CollectionActionRegistry = {};\\n`\n );\n }\n\n /** Derives the client method name from endpoint + method (best-effort) */\n private endpointToClientMethod(endpoint: string, method: string): string {\n // e.g. POST /supplies/request → postSuppliesRequest\n const parts = endpoint\n .split('/')\n .filter(Boolean)\n .filter((p) => !p.startsWith('{')) // strip path params\n .map((p) => p.replace(/-/g, '_'));\n\n const prefix = method.toLowerCase();\n const suffix = parts.map((p) => this.capitalize(p)).join('');\n return `${prefix}${suffix}`;\n }\n\n private toCamelCase(str: string): string {\n const parts = str.split(/[-_]/);\n return parts.map((p, i) => (i === 0 ? p.toLowerCase() : this.capitalize(p))).join('');\n }\n\n private toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((p) => this.capitalize(p))\n .join('');\n }\n\n private capitalize(str: string): string {\n return str.length > 0 ? str[0]!.toUpperCase() + str.slice(1) : '';\n }\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport type { OpenAPIDocument } from '../types';\nimport { SchemaResolver } from '../parser/SchemaResolver';\nimport isSafe from 'safe-regex';\n\ntype OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;\ntype ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\ntype RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;\n\n/**\n * Mapping of operationId to schema names\n */\nexport interface SchemaMapping {\n [operationId: string]: {\n /** Schema name for request validation (null if no params) */\n requestSchema: string | null;\n /** Schema name for response validation */\n responseSchema: string;\n };\n}\n\n/**\n * Options for client generation\n */\nexport interface ClientGenerationOptions {\n /** Name of the client class */\n className?: string;\n\n /** Whether to include JSDoc comments (default: true) */\n includeJsDoc?: boolean;\n\n /** Base URL for the API */\n baseUrl?: string;\n\n /** Whether to validate responses with Zod (default: true) */\n validateResponses?: boolean;\n\n /** Use strict validation - throw on parse errors vs safe parse (default: false) */\n strictValidation?: boolean;\n\n /** Mapping of operationId to schema names for Zod validation */\n schemaMapping?: SchemaMapping;\n}\n\ninterface EndpointInfo {\n path: string;\n method: string;\n operationId?: string;\n summary?: string;\n description?: string;\n operation: OperationObject;\n}\n\n/**\n * ClientGenerator\n *\n * Generates fully typed API client functions from OpenAPI operations.\n * Each endpoint becomes a type-safe function with runtime Zod validation.\n *\n * **Refactored to use Zod schemas as single source of truth:**\n * - Types inferred from Zod schemas (no more manual type generation)\n * - Request validation before API calls\n * - Response validation after API calls\n * - Optional strict validation mode\n */\nexport class ClientGenerator {\n private resolver: SchemaResolver;\n private schemaMapping?: SchemaMapping;\n private requiredSchemas: Set<string>;\n private generatedRequestSchemas: Set<string>;\n\n constructor(\n private document: OpenAPIDocument,\n schemaMapping?: SchemaMapping\n ) {\n this.resolver = new SchemaResolver(document);\n if (schemaMapping !== undefined) {\n this.schemaMapping = schemaMapping;\n }\n this.requiredSchemas = new Set();\n this.generatedRequestSchemas = new Set();\n }\n\n /**\n * Generate typed API client code from OpenAPI document\n */\n generate(options: ClientGenerationOptions = {}): string {\n const {\n className = 'APIClient',\n includeJsDoc = true,\n baseUrl = this.getDefaultBaseUrl(),\n validateResponses = true,\n strictValidation = false,\n schemaMapping = this.schemaMapping,\n } = options;\n\n const endpoints = this.getAllEndpoints();\n\n if (endpoints.length === 0) {\n throw new Error('No endpoints found in OpenAPI document');\n }\n\n // Reset required schemas tracking\n this.requiredSchemas.clear();\n this.generatedRequestSchemas.clear();\n\n // Generate imports (including Zod and schema imports)\n let code = this.generateImports(!!schemaMapping, validateResponses);\n code += '\\n';\n\n // Generate request schemas (NEW - Zod schemas for validation)\n if (schemaMapping) {\n code += this.generateRequestSchemas(endpoints);\n code += '\\n';\n }\n\n // Generate types (using z.infer if schemaMapping provided)\n code += this.generateTypes(endpoints, schemaMapping);\n code += '\\n';\n\n // Generate error classes (including ValidationError)\n code += this.generateErrorClasses();\n code += '\\n';\n\n // Generate client class with validation\n code += this.generateClientClass(\n className,\n baseUrl,\n endpoints,\n includeJsDoc,\n validateResponses,\n strictValidation,\n schemaMapping\n );\n\n return code;\n }\n\n // ============================================================================\n // Import Generation\n // ============================================================================\n\n /**\n * Generate import statements including Zod and schemas\n */\n private generateImports(useSchemas: boolean, validateResponses: boolean): string {\n let code = `/**\n * Auto-generated API client from OpenAPI spec\n * \n * DO NOT EDIT - This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n */\\n\\n`;\n\n if (useSchemas && validateResponses) {\n code += `import { z } from 'zod';\\n`;\n code += `import * as schemas from './schemas';\\n`;\n }\n\n return code;\n }\n\n /**\n * Track which schemas are used for imports\n */\n private addRequiredSchema(schemaName: string): void {\n this.requiredSchemas.add(schemaName);\n }\n\n // ============================================================================\n // Request Schema Generation (NEW - Zod Schemas)\n // ============================================================================\n\n /**\n * Generate Zod schemas for request parameters\n *\n * This generates schemas like:\n * export const ListEquipmentRequestSchema = z.object({\n * query: z.object({ ... }).optional(),\n * });\n */\n private generateRequestSchemas(endpoints: EndpointInfo[]): string {\n let code = '// ============================================================================\\n';\n code += '// Request Schemas (Zod Validation)\\n';\n code += '// ============================================================================\\n\\n';\n\n for (const endpoint of endpoints) {\n const operationId = endpoint.operationId || this.getMethodName(endpoint);\n const typeName = this.getOperationTypeName(endpoint);\n const schemaName = `${typeName}RequestSchema`;\n\n const schemaCode = this.generateRequestSchemaForEndpoint(endpoint);\n\n // Only generate if there are parameters\n if (schemaCode) {\n code += `export const ${schemaName} = ${schemaCode};\\n\\n`;\n this.generatedRequestSchemas.add(schemaName);\n }\n }\n\n return code;\n }\n\n /**\n * Generate request schema for a single endpoint\n */\n private generateRequestSchemaForEndpoint(endpoint: EndpointInfo): string | null {\n const { operation } = endpoint;\n const params = this.getOperationParameters(operation);\n const hasBody = this.hasRequestBody(operation);\n\n const pathParams = params.filter((p) => p.in === 'path');\n const queryParams = params.filter((p) => p.in === 'query');\n const headerParams = params.filter((p) => p.in === 'header');\n\n // If no parameters at all, return null\n if (\n pathParams.length === 0 &&\n queryParams.length === 0 &&\n headerParams.length === 0 &&\n !hasBody\n ) {\n return null;\n }\n\n const parts: string[] = [];\n\n // Path parameters\n if (pathParams.length > 0) {\n const pathSchema = this.generatePathParamsSchema(pathParams);\n parts.push(` path: ${pathSchema}`);\n }\n\n // Query parameters\n if (queryParams.length > 0) {\n const querySchema = this.generateQueryParamsSchema(queryParams);\n parts.push(` query: ${querySchema}`);\n }\n\n // Header parameters\n if (headerParams.length > 0) {\n const headerSchema = this.generateHeaderParamsSchema(headerParams);\n parts.push(` headers: ${headerSchema}`);\n }\n\n // Request body\n if (hasBody) {\n const bodySchema = this.generateRequestBodySchema(operation);\n const isRequired = this.isRequestBodyRequired(operation);\n parts.push(` body: ${bodySchema}${isRequired ? '' : '.optional()'}`);\n }\n\n return `z.object({\\n${parts.join(',\\n')}\\n})`;\n }\n\n /**\n * Generate Zod schema for path parameters\n */\n private generatePathParamsSchema(params: ParameterObject[]): string {\n const paramSchemas: string[] = [];\n\n for (const param of params) {\n const zodSchema = this.parameterSchemaToZod(param);\n const desc = param.description ? `.describe('${this.escapeString(param.description)}')` : '';\n paramSchemas.push(` ${param.name}: ${zodSchema}${desc}`);\n }\n\n return `z.object({\\n${paramSchemas.join(',\\n')}\\n })`;\n }\n\n /**\n * Generate Zod schema for query parameters\n */\n private generateQueryParamsSchema(params: ParameterObject[]): string {\n const paramSchemas: string[] = [];\n\n for (const param of params) {\n let zodSchema = this.parameterSchemaToZod(param);\n\n // Add description\n if (param.description) {\n zodSchema += `.describe('${this.escapeString(param.description)}')`;\n }\n\n // Query params are optional unless explicitly required\n if (!param.required) {\n zodSchema += '.optional()';\n }\n\n paramSchemas.push(` ${param.name}: ${zodSchema}`);\n }\n\n return `z.object({\\n${paramSchemas.join(',\\n')}\\n }).optional()`;\n }\n\n /**\n * Generate Zod schema for header parameters\n */\n private generateHeaderParamsSchema(params: ParameterObject[]): string {\n // Filter out common headers that are handled by the client\n const customParams = params.filter((p) => !this.isCommonHeader(p.name));\n\n if (customParams.length === 0) {\n return 'z.object({}).optional()';\n }\n\n const paramSchemas: string[] = [];\n\n for (const param of customParams) {\n let zodSchema = this.parameterSchemaToZod(param);\n\n if (param.description) {\n zodSchema += `.describe('${this.escapeString(param.description)}')`;\n }\n\n if (!param.required) {\n zodSchema += '.optional()';\n }\n\n paramSchemas.push(` '${param.name}': ${zodSchema}`);\n }\n\n return `z.object({\\n${paramSchemas.join(',\\n')}\\n }).optional()`;\n }\n\n /**\n * Generate Zod schema for request body\n */\n private generateRequestBodySchema(operation: OperationObject): string {\n const requestBody = operation.requestBody as RequestBodyObject | undefined;\n if (!requestBody) return 'z.unknown()';\n\n const content = requestBody.content?.['application/json'];\n if (!content?.schema) return 'z.unknown()';\n\n const schema = content.schema as SchemaObject;\n\n // Check if it's a $ref to component schema\n if ('$ref' in schema && schema.$ref) {\n const componentName = this.extractComponentName(schema.$ref as string);\n return `schemas.${componentName}Schema`;\n }\n\n // Inline schema - convert to Zod\n return this.schemaObjectToZod(schema);\n }\n\n /**\n * Convert parameter schema to Zod schema string\n */\n private parameterSchemaToZod(param: ParameterObject): string {\n const schema = param.schema as SchemaObject | undefined;\n if (!schema) return 'z.string()';\n\n return this.schemaObjectToZod(schema);\n }\n\n /**\n * Convert OpenAPI schema object to Zod schema string\n *\n * This is a simplified version for parameter schemas.\n * Reuses logic similar to ZodSchemaGenerator but outputs inline.\n */\n private schemaObjectToZod(schema: SchemaObject): string {\n // Handle arrays\n if (schema.type === 'array') {\n const items = schema.items as SchemaObject | undefined;\n const itemSchema = items ? this.schemaObjectToZod(items) : 'z.unknown()';\n let arraySchema = `z.array(${itemSchema})`;\n\n if ('minItems' in schema && typeof schema.minItems === 'number') {\n arraySchema += `.min(${schema.minItems})`;\n }\n if ('maxItems' in schema && typeof schema.maxItems === 'number') {\n arraySchema += `.max(${schema.maxItems})`;\n }\n\n return arraySchema;\n }\n\n // Handle objects\n if (schema.type === 'object') {\n if (!schema.properties) {\n return 'z.record(z.unknown())';\n }\n\n const props: string[] = [];\n const required = schema.required || [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const isRequired = required.includes(key);\n let propZod = this.schemaObjectToZod(propSchema as SchemaObject);\n\n if (!isRequired) {\n propZod += '.optional()';\n }\n\n props.push(`${key}: ${propZod}`);\n }\n\n return `z.object({ ${props.join(', ')} })`;\n }\n\n // Handle enums\n if (schema.enum && schema.enum.length > 0) {\n const values = schema.enum.map((v: unknown) => `'${v}'`).join(', ');\n return `z.enum([${values}])`;\n }\n\n // Handle type-based schemas\n switch (schema.type) {\n case 'string':\n return this.stringSchemaToZod(schema);\n case 'number':\n case 'integer':\n return this.numberSchemaToZod(schema);\n case 'boolean':\n return 'z.boolean()';\n case 'null':\n return 'z.null()';\n default:\n return 'z.unknown()';\n }\n }\n\n /**\n * Convert string schema to Zod\n */\n private stringSchemaToZod(schema: SchemaObject): string {\n let base = 'z.string()';\n\n // Handle formats\n if ('format' in schema && schema.format) {\n switch (schema.format) {\n case 'email':\n base += '.email()';\n break;\n case 'uri':\n case 'url':\n base += '.url()';\n break;\n case 'uuid':\n base += '.uuid()';\n break;\n case 'date-time':\n base += '.datetime()';\n break;\n case 'date':\n base += '.date()';\n break;\n }\n }\n\n // Handle constraints\n if ('minLength' in schema && typeof schema.minLength === 'number') {\n base += `.min(${schema.minLength})`;\n }\n if ('maxLength' in schema && typeof schema.maxLength === 'number') {\n base += `.max(${schema.maxLength})`;\n }\n if ('pattern' in schema && schema.pattern) {\n // ✅ SECURITY FIX: Validate regex safety to prevent ReDoS\n if (!isSafe(schema.pattern)) {\n console.warn(`⚠️ Unsafe regex pattern detected: ${schema.pattern}`);\n console.warn(' Skipping pattern validation to prevent ReDoS');\n // Skip the unsafe pattern - better safe than DoS\n } else {\n const escapedPattern = schema.pattern.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n base += `.regex(/${escapedPattern}/)`;\n }\n }\n\n // Handle default\n if ('default' in schema && schema.default !== undefined) {\n const defaultValue =\n typeof schema.default === 'string' ? `'${schema.default}'` : schema.default;\n base += `.default(${defaultValue})`;\n }\n\n return base;\n }\n\n /**\n * Convert number schema to Zod\n */\n private numberSchemaToZod(schema: SchemaObject): string {\n let base = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n\n if ('minimum' in schema && typeof schema.minimum === 'number') {\n base += `.min(${schema.minimum})`;\n }\n if ('maximum' in schema && typeof schema.maximum === 'number') {\n base += `.max(${schema.maximum})`;\n }\n if ('exclusiveMinimum' in schema && typeof schema.exclusiveMinimum === 'number') {\n base += `.gt(${schema.exclusiveMinimum})`;\n }\n if ('exclusiveMaximum' in schema && typeof schema.exclusiveMaximum === 'number') {\n base += `.lt(${schema.exclusiveMaximum})`;\n }\n\n // Handle default\n if ('default' in schema && schema.default !== undefined) {\n base += `.default(${schema.default})`;\n }\n\n return base;\n }\n\n /**\n * Check if header is a common header handled by fetch\n */\n private isCommonHeader(name: string): boolean {\n const commonHeaders = [\n 'authorization',\n 'content-type',\n 'accept',\n 'user-agent',\n 'content-length',\n ];\n return commonHeaders.includes(name.toLowerCase());\n }\n\n /**\n * Extract component name from $ref\n */\n private extractComponentName(ref: string): string {\n // #/components/schemas/Equipment → Equipment\n const parts = ref.split('/');\n const lastPart = parts[parts.length - 1];\n return lastPart ?? ref;\n }\n\n /**\n * Escape string for use in Zod .describe()\n */\n private escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\n/g, ' ');\n }\n\n /**\n * Get list of all required schema names\n */\n private getRequiredSchemas(): string[] {\n return Array.from(this.requiredSchemas).sort();\n }\n\n // ============================================================================\n // Type Generation (Zod Inference)\n // ============================================================================\n\n /**\n * Generate TypeScript types for request/response\n *\n * If schemaMapping is provided, use z.infer<> to get types from Zod schemas.\n * Otherwise, fall back to legacy manual type generation.\n */\n private generateTypes(endpoints: EndpointInfo[], schemaMapping?: SchemaMapping): string {\n let code = '// ============================================================================\\n';\n code += '// Request/Response Types\\n';\n code += '// ============================================================================\\n\\n';\n\n if (schemaMapping) {\n // NEW: Use Zod inference\n code += this.generateTypesFromZod(endpoints, schemaMapping);\n } else {\n // LEGACY: Manual type generation (backward compatible)\n code += this.generateTypesLegacy(endpoints);\n }\n\n return code;\n }\n\n /**\n * Generate types using Zod inference (NEW)\n */\n /**\n * Generate types using Zod inference (NEW)\n *\n * Request types infer from request schemas (defined in this file).\n * Response types infer from response schemas (imported from ./schemas).\n */\n private generateTypesFromZod(endpoints: EndpointInfo[], schemaMapping: SchemaMapping): string {\n let code = '';\n\n for (const endpoint of endpoints) {\n const operationId = endpoint.operationId || this.getMethodName(endpoint);\n const mapping = schemaMapping[operationId];\n\n if (!mapping) {\n // No schema mapping - skip or use legacy\n continue;\n }\n\n const typeName = this.getOperationTypeName(endpoint);\n\n // Request type - infer from request schema (defined locally in this file)\n // Build the schema name using the same logic as generateRequestSchemas\n const requestSchemaName = mapping.requestSchema || typeName + 'RequestSchema';\n // Always generate request type if the schema was generated (i.e., endpoint has parameters)\n if (this.generatedRequestSchemas.has(requestSchemaName)) {\n this.addRequiredSchema(requestSchemaName);\n code +=\n 'export type ' + typeName + 'Request = z.infer<typeof ' + requestSchemaName + '>;\\n';\n }\n\n // Response type - infer from response schema (imported from ./schemas)\n this.addRequiredSchema(mapping.responseSchema);\n code += `export type ${typeName}Response = z.infer<typeof schemas.${mapping.responseSchema}>;\\n\\n`;\n }\n\n return code;\n }\n\n /**\n * Generate types using manual conversion (LEGACY - backward compatible)\n */\n private generateTypesLegacy(endpoints: EndpointInfo[]): string {\n let code = '';\n\n for (const endpoint of endpoints) {\n const typeName = this.getOperationTypeName(endpoint);\n\n // Generate request type\n code += this.generateRequestTypeLegacy(endpoint, typeName);\n\n // Generate response type\n code += this.generateResponseTypeLegacy(endpoint, typeName);\n }\n\n return code;\n }\n\n /**\n * Generate request type for an operation (LEGACY)\n */\n private generateRequestTypeLegacy(endpoint: EndpointInfo, typeName: string): string {\n const { operation } = endpoint;\n const params = this.getOperationParameters(operation);\n const hasBody = this.hasRequestBody(operation);\n\n let code = '';\n\n // Check if we need a request type at all\n const pathParams = params.filter((p) => p.in === 'path');\n const queryParams = params.filter((p) => p.in === 'query');\n const headerParams = params.filter((p) => p.in === 'header');\n\n if (\n pathParams.length === 0 &&\n queryParams.length === 0 &&\n headerParams.length === 0 &&\n !hasBody\n ) {\n // No request parameters needed\n return code;\n }\n\n code += `export interface ${typeName}Request {\\n`;\n\n // Path parameters\n if (pathParams.length > 0) {\n code += ' /** Path parameters */\\n';\n code += ' path: {\\n';\n for (const param of pathParams) {\n const required = param.required ? '' : '?';\n const type = this.getTypeFromSchemaLegacy(param.schema as SchemaObject);\n const desc = param.description ? ` /** ${param.description} */\\n` : '';\n code += desc;\n code += ` ${param.name}${required}: ${type};\\n`;\n }\n code += ' };\\n';\n }\n\n // Query parameters\n if (queryParams.length > 0) {\n code += ' /** Query parameters */\\n';\n code += ' query?: {\\n';\n for (const param of queryParams) {\n const required = param.required ? '' : '?';\n const type = this.getTypeFromSchemaLegacy(param.schema as SchemaObject);\n const desc = param.description ? ` /** ${param.description} */\\n` : '';\n code += desc;\n code += ` ${param.name}${required}: ${type};\\n`;\n }\n code += ' };\\n';\n }\n\n // Header parameters\n if (headerParams.length > 0) {\n code += ' /** Custom headers */\\n';\n code += ' headers?: {\\n';\n for (const param of headerParams) {\n const required = param.required ? '' : '?';\n const type = this.getTypeFromSchemaLegacy(param.schema as SchemaObject);\n const desc = param.description ? ` /** ${param.description} */\\n` : '';\n code += desc;\n code += ` ${param.name}${required}: ${type};\\n`;\n }\n code += ' };\\n';\n }\n\n // Request body\n if (hasBody) {\n const bodyType = this.getRequestBodyTypeLegacy(operation);\n code += ' /** Request body */\\n';\n code += ` body${this.isRequestBodyRequired(operation) ? '' : '?'}: ${bodyType};\\n`;\n }\n\n code += '}\\n\\n';\n\n return code;\n }\n\n /**\n * Generate response type for an operation (LEGACY)\n */\n private generateResponseTypeLegacy(endpoint: EndpointInfo, typeName: string): string {\n const schema = this.resolver.getResponseSchema(endpoint.path, endpoint.method, '200');\n\n if (!schema) {\n return `export type ${typeName}Response = unknown;\\n\\n`;\n }\n\n const type = this.getTypeFromSchemaLegacy(schema);\n return `export type ${typeName}Response = ${type};\\n\\n`;\n }\n\n /**\n * Get request body type (LEGACY)\n */\n private getRequestBodyTypeLegacy(operation: OperationObject): string {\n const requestBody = operation.requestBody as RequestBodyObject | undefined;\n if (!requestBody) return 'unknown';\n\n const content = requestBody.content?.['application/json'];\n if (!content?.schema) return 'unknown';\n\n return this.getTypeFromSchemaLegacy(content.schema as SchemaObject);\n }\n\n /**\n * Convert OpenAPI schema to TypeScript type (LEGACY)\n *\n * NOTE: This method is kept for backward compatibility but should be\n * replaced with Zod inference in new code.\n */\n private getTypeFromSchemaLegacy(schema: SchemaObject | undefined): string {\n if (!schema) return 'unknown';\n\n // Handle arrays\n if (schema.type === 'array') {\n const itemType = this.getTypeFromSchemaLegacy(schema.items as SchemaObject);\n return `${itemType}[]`;\n }\n\n // Handle objects\n if (schema.type === 'object') {\n if (!schema.properties) return 'Record<string, unknown>';\n\n const props: string[] = [];\n const required = schema.required || [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const isRequired = required.includes(key);\n const propType = this.getTypeFromSchemaLegacy(propSchema as SchemaObject);\n props.push(`${key}${isRequired ? '' : '?'}: ${propType}`);\n }\n\n return `{ ${props.join('; ')} }`;\n }\n\n // Handle enums\n if (schema.enum) {\n return schema.enum.map((v) => `'${v}'`).join(' | ');\n }\n\n // Handle primitives\n switch (schema.type) {\n case 'string':\n return 'string';\n case 'number':\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'null':\n return 'null';\n default:\n return 'unknown';\n }\n }\n\n // ============================================================================\n // Error Class Generation\n // ============================================================================\n\n /**\n * Generate error classes for API errors and validation errors\n */\n /**\n * Generate error classes (APIError and ValidationError)\n */\n private generateErrorClasses(): string {\n let code = '// ============================================================================\\n';\n code += '// Error Handling\\n';\n code += '// ============================================================================\\n\\n';\n\n // APIError class\n code += '/**\\n';\n code += ' * HTTP API Error\\n';\n code += ' * \\n';\n code += ' * Thrown when an HTTP request fails (4xx, 5xx status codes)\\n';\n code += ' */\\n';\n code += 'export class APIError extends Error {\\n';\n code += ' constructor(\\n';\n code += ' message: string,\\n';\n code += ' public readonly status: number,\\n';\n code += ' public readonly response?: unknown\\n';\n code += ' ) {\\n';\n code += ' super(message);\\n';\n code += \" this.name = 'APIError';\\n\";\n code += ' }\\n';\n code += '}\\n\\n';\n\n // ValidationError class\n code += '/**\\n';\n code += ' * Validation Error\\n';\n code += ' * \\n';\n code += ' * Thrown when Zod schema validation fails for request or response data.\\n';\n code += ' * Contains detailed information about what failed validation.\\n';\n code += ' */\\n';\n code += 'export class ValidationError extends Error {\\n';\n code += ' constructor(\\n';\n code += ' message: string,\\n';\n code += ' public readonly issues: z.ZodIssue[]\\n';\n code += ' ) {\\n';\n code += ' super(message);\\n';\n code += \" this.name = 'ValidationError';\\n\";\n code += ' }\\n\\n';\n\n // getFormattedErrors method\n code += ' /**\\n';\n code += ' * Get formatted error messages for debugging\\n';\n code += ' * \\n';\n code += ' * @returns Array of human-readable error messages\\n';\n code += ' * \\n';\n code += ' * @example\\n';\n code += ' * ```typescript\\n';\n code += ' * try {\\n';\n code += \" * await client.createEquipment({ body: { invalid: 'data' } });\\n\";\n code += ' * } catch (error) {\\n';\n code += ' * if (error instanceof ValidationError) {\\n';\n code += ' * console.error(error.getFormattedErrors());\\n';\n code += \" * // Output: ['body.name: Required', 'body.type: Required']\\n\";\n code += ' * }\\n';\n code += ' * }\\n';\n code += ' * ```\\n';\n code += ' */\\n';\n code += ' getFormattedErrors(): string[] {\\n';\n code += ' return this.issues.map(issue => {\\n';\n code += \" const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\\n\";\n code += ' return `${path}: ${issue.message}`;\\n';\n code += ' });\\n';\n code += ' }\\n\\n';\n\n // getDetailedMessage method\n code += ' /**\\n';\n code += ' * Get a single formatted error message with all issues\\n';\n code += ' * \\n';\n code += ' * @returns Multi-line error message\\n';\n code += ' */\\n';\n code += ' getDetailedMessage(): string {\\n';\n code += ' const errors = this.getFormattedErrors();\\n';\n code += \" return `${this.message}\\\\n - ${errors.join('\\\\n - ')}`;\\n\";\n code += ' }\\n\\n';\n\n // toJSON method\n code += ' /**\\n';\n code += ' * Convert to JSON for logging/serialization\\n';\n code += ' * \\n';\n code += ' * @returns Plain object representation\\n';\n code += ' */\\n';\n code += ' toJSON() {\\n';\n code += ' return {\\n';\n code += ' name: this.name,\\n';\n code += ' message: this.message,\\n';\n code += ' issues: this.issues.map(issue => ({\\n';\n code += ' path: issue.path,\\n';\n code += ' message: issue.message,\\n';\n code += ' code: issue.code,\\n';\n code += ' })),\\n';\n code += ' };\\n';\n code += ' }\\n';\n code += '}\\n';\n\n return code;\n }\n // ============================================================================\n // Client Class Generation\n // ============================================================================\n\n /**\n * Generate the main client class\n */\n private generateClientClass(\n className: string,\n baseUrl: string,\n endpoints: EndpointInfo[],\n includeJsDoc: boolean,\n validateResponses: boolean,\n strictValidation: boolean,\n schemaMapping?: SchemaMapping\n ): string {\n let code = '// ============================================================================\\n';\n code += '// API Client\\n';\n code += '// ============================================================================\\n\\n';\n\n if (includeJsDoc) {\n code += `/**\\n * ${this.getAPITitle()}\\n`;\n if (this.getAPIDescription()) {\n code += ` * \\n * ${this.getAPIDescription()}\\n`;\n }\n if (validateResponses && schemaMapping) {\n code += ` * \\n * This client includes runtime validation using Zod schemas.\\n`;\n }\n code += ` */\\n`;\n }\n\n code += `export class ${className} {\\n`;\n code += ` private baseUrl: string;\\n`;\n code += ` private headers: Record<string, string>;\\n`;\n\n if (validateResponses && schemaMapping) {\n code += ` private validateResponses: boolean;\\n`;\n code += ` private strictValidation: boolean;\\n`;\n }\n\n code += `\\n`;\n\n // Constructor\n code += this.generateConstructor(baseUrl, validateResponses, strictValidation, schemaMapping);\n\n // Generate method for each endpoint\n for (const endpoint of endpoints) {\n if (schemaMapping) {\n code += this.generateMethodWithValidation(endpoint, includeJsDoc, schemaMapping);\n } else {\n code += this.generateMethodLegacy(endpoint, includeJsDoc);\n }\n }\n\n // Helper methods\n code += this.generateRequestHelper(validateResponses, strictValidation, !!schemaMapping);\n\n code += '}\\n';\n\n return code;\n }\n\n /**\n * Generate constructor\n */\n private generateConstructor(\n baseUrl: string,\n validateResponses: boolean,\n strictValidation: boolean,\n schemaMapping?: SchemaMapping\n ): string {\n let code = ` constructor(config?: {\\n`;\n code += ` baseUrl?: string;\\n`;\n code += ` headers?: Record<string, string>;\\n`;\n\n if (validateResponses && schemaMapping) {\n code += ` validateResponses?: boolean;\\n`;\n code += ` strictValidation?: boolean;\\n`;\n }\n\n code += ` }) {\\n`;\n code += ` this.baseUrl = config?.baseUrl || '${baseUrl}';\\n`;\n code += ` this.headers = config?.headers || {};\\n`;\n\n if (validateResponses && schemaMapping) {\n code += ` this.validateResponses = config?.validateResponses ?? ${validateResponses};\\n`;\n code += ` this.strictValidation = config?.strictValidation ?? ${strictValidation};\\n`;\n }\n\n code += ` }\\n\\n`;\n\n return code;\n }\n\n /**\n * Generate a method for an endpoint with Zod validation (NEW)\n */\n /**\n * Generate a method for an endpoint with Zod validation (NEW)\n */\n private generateMethodWithValidation(\n endpoint: EndpointInfo,\n includeJsDoc: boolean,\n schemaMapping: SchemaMapping\n ): string {\n const { operation, path, method } = endpoint;\n const methodName = this.getMethodName(endpoint);\n const typeName = this.getOperationTypeName(endpoint);\n const operationId = endpoint.operationId || methodName;\n\n const mapping = schemaMapping[operationId];\n if (!mapping) {\n // No schema mapping for this endpoint - fall back to legacy\n return this.generateMethodLegacy(endpoint, includeJsDoc);\n }\n\n const params = this.getOperationParameters(operation);\n const hasBody = this.hasRequestBody(operation);\n const pathParams = params.filter((p) => p.in === 'path');\n const queryParams = params.filter((p) => p.in === 'query');\n const headerParams = params.filter((p) => p.in === 'header');\n const hasAnyParams =\n pathParams.length > 0 || queryParams.length > 0 || headerParams.length > 0 || hasBody;\n\n let code = '';\n\n // JSDoc comment\n if (includeJsDoc) {\n code += ' /**\\n';\n if (operation.summary) {\n code += ` * ${operation.summary}\\n`;\n }\n if (operation.description) {\n code += ` * \\n * ${operation.description.split('\\n').join('\\n * ')}\\n`;\n }\n if (hasAnyParams) {\n code += ` * \\n * @param request - Request parameters\\n`;\n }\n code += ` * @returns Promise with the response data\\n`;\n code += ` * @throws {APIError} When the request fails\\n`;\n code += ` * @throws {ValidationError} When validation fails (if enabled)\\n`;\n code += ' */\\n';\n }\n\n // Method signature - request param defaults to empty object if optional\n let requestParam = '';\n if (hasAnyParams) {\n // If only query params (all optional), make request optional with default\n const onlyOptionalParams =\n pathParams.length === 0 && !hasBody && queryParams.every((p) => !p.required);\n requestParam = onlyOptionalParams\n ? `request: ${typeName}Request = {}`\n : `request: ${typeName}Request`;\n }\n\n code += ` async ${methodName}(${requestParam}): Promise<${typeName}Response> {\\n`;\n\n // Request validation (optional)\n if (mapping.requestSchema && hasAnyParams) {\n code += ` // Validate request parameters\\n`;\n code += ` if (this.validateResponses) {\\n`;\n code += ` ${mapping.requestSchema}.parse(request);\\n`;\n code += ` }\\n\\n`;\n }\n\n // Build URL with path parameters\n if (pathParams.length > 0) {\n code += ` // Build URL with path parameters\\n`;\n code += ` let url = this.baseUrl + '${path}'\\n`;\n for (const param of pathParams) {\n code += ` .replace('{${param.name}}', encodeURIComponent(String(request.path.${param.name})))\\n`;\n }\n code += `;\\n\\n`;\n } else {\n code += ` const url = this.baseUrl + '${path}';\\n\\n`;\n }\n\n // Add query parameters\n if (queryParams.length > 0) {\n code += ` // Add query parameters\\n`;\n code += ` const searchParams = new URLSearchParams();\\n`;\n code += ` if (request.query) {\\n`;\n for (const param of queryParams) {\n code += ` if (request.query.${param.name} != null) {\\n`;\n code += ` searchParams.append('${param.name}', String(request.query.${param.name}));\\n`;\n code += ` }\\n`;\n }\n code += ` }\\n`;\n code += ` const queryString = searchParams.toString();\\n`;\n code += ` const fullUrl = queryString ? \\`\\${url}?\\${queryString}\\` : url;\\n\\n`;\n } else {\n code += ` const fullUrl = url;\\n\\n`;\n }\n\n // Make request with validation\n code += ` // Make request\\n`;\n code += ` const rawResponse = await this.request(fullUrl, {\\n`;\n code += ` method: '${method.toUpperCase()}',\\n`;\n\n if (hasBody) {\n code += ` body: request.body ? JSON.stringify(request.body) : null,\\n`;\n }\n\n if (headerParams.length > 0) {\n code += ` headers: request.headers,\\n`;\n }\n\n code += ` });\\n\\n`;\n\n // Response validation\n code += ` // Validate response\\n`;\n code += ` if (this.validateResponses) {\\n`;\n code += ` if (this.strictValidation) {\\n`;\n code += ` // Strict mode - throw on validation error\\n`;\n code += ` return schemas.${mapping.responseSchema}.parse(rawResponse) as ${typeName}Response;\\n`;\n code += ` } else {\\n`;\n code += ` // Safe mode - catch validation errors and throw ValidationError\\n`;\n code += ` const result = schemas.${mapping.responseSchema}.safeParse(rawResponse);\\n`;\n code += ` if (!result.success) {\\n`;\n code += ` throw new ValidationError(\\n`;\n code += ` 'Response validation failed: ' + result.error.message,\\n`;\n code += ` result.error.issues\\n`;\n code += ` );\\n`;\n code += ` }\\n`;\n code += ` return result.data as ${typeName}Response;\\n`;\n code += ` }\\n`;\n code += ` }\\n\\n`;\n\n code += ` // Return unvalidated response (validation disabled)\\n`;\n code += ` return rawResponse as ${typeName}Response;\\n`;\n code += ` }\\n\\n`;\n\n return code;\n }\n /**\n * Generate a method for an endpoint (LEGACY)\n */\n private generateMethodLegacy(endpoint: EndpointInfo, includeJsDoc: boolean): string {\n const { operation, path, method } = endpoint;\n const methodName = this.getMethodName(endpoint);\n const typeName = this.getOperationTypeName(endpoint);\n\n const params = this.getOperationParameters(operation);\n const hasBody = this.hasRequestBody(operation);\n const pathParams = params.filter((p) => p.in === 'path');\n const hasAnyParams = pathParams.length > 0 || params.some((p) => p.in === 'query') || hasBody;\n\n let code = '';\n\n // JSDoc comment\n if (includeJsDoc) {\n code += ' /**\\n';\n if (operation.summary) {\n code += ` * ${operation.summary}\\n`;\n }\n if (operation.description) {\n code += ` * \\n * ${operation.description.split('\\n').join('\\n * ')}\\n`;\n }\n if (hasAnyParams) {\n code += ` * \\n * @param request - Request parameters\\n`;\n }\n code += ` * @returns Promise with the response data\\n`;\n code += ` * @throws {APIError} When the request fails\\n`;\n code += ' */\\n';\n }\n\n // Method signature\n const requestParam = hasAnyParams ? `request: ${typeName}Request` : '';\n code += ` async ${methodName}(${requestParam}): Promise<${typeName}Response> {\\n`;\n\n // Build URL with path parameters\n if (pathParams.length > 0) {\n code += ` // Build URL with path parameters\\n`;\n code += ` let url = this.baseUrl + '${path}'\\n`;\n for (const param of pathParams) {\n code += ` .replace('{${param.name}}', encodeURIComponent(String(request.path.${param.name})))\\n`;\n }\n code += `;\\n\\n`;\n } else {\n code += ` const url = this.baseUrl + '${path}';\\n\\n`;\n }\n\n // Add query parameters\n const queryParams = params.filter((p) => p.in === 'query');\n if (queryParams.length > 0) {\n code += ` // Add query parameters\\n`;\n code += ` const searchParams = new URLSearchParams();\\n`;\n code += ` if (request.query) {\\n`;\n for (const param of queryParams) {\n code += ` if (request.query.${param.name} != null) {\\n`;\n code += ` searchParams.append('${param.name}', String(request.query.${param.name}));\\n`;\n code += ` }\\n`;\n }\n code += ` }\\n`;\n code += ` const queryString = searchParams.toString();\\n`;\n code += ` const fullUrl = queryString ? \\`\\${url}?\\${queryString}\\` : url;\\n\\n`;\n } else {\n code += ` const fullUrl = url;\\n\\n`;\n }\n\n // Build request options\n code += ` return this.request<${typeName}Response>(fullUrl, {\\n`;\n code += ` method: '${method.toUpperCase()}',\\n`;\n\n if (hasBody) {\n code += ` body: request.body ? JSON.stringify(request.body) : null,\\n`;\n }\n\n const headerParams = params.filter((p) => p.in === 'header');\n if (headerParams.length > 0) {\n code += ` headers: request.headers,\\n`;\n }\n\n code += ` });\\n`;\n code += ` }\\n\\n`;\n\n return code;\n }\n\n /**\n * Generate the request helper method\n */\n private generateRequestHelper(\n validateResponses: boolean,\n strictValidation: boolean,\n useSchemas: boolean\n ): string {\n // TODO: Implement validation in Task 2.4\n // For now, return legacy implementation\n return ` /**\n * Make an HTTP request\n * @private\n */\n private async request<T>(\n url: string,\n options: {\n method: string;\n body?: string;\n headers?: Record<string, string>;\n }\n ): Promise<T> {\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...options.headers,\n };\n\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body,\n });\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => null);\n \n // ✅ SECURITY FIX: Safe JSON parsing with fallback\n let parsedError: unknown;\n if (errorBody) {\n try {\n parsedError = JSON.parse(errorBody);\n } catch (parseError) {\n // Non-JSON error response - store as object with raw text\n parsedError = { \n raw: errorBody,\n contentType: response.headers.get('content-type') \n };\n }\n }\n \n throw new APIError(\n \\`HTTP \\${response.status}: \\${response.statusText}\\`,\n response.status,\n parsedError\n );\n }\n\n // Handle empty responses (204 No Content, etc.)\n if (response.status === 204 || response.headers.get('content-length') === '0') {\n return null as unknown as T;\n }\n\n // ✅ SECURITY FIX: Validate Content-Type before parsing JSON\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n const body = await response.text();\n throw new APIError(\n \\`Unexpected content type: \\${contentType}. Expected application/json\\`,\n response.status,\n { contentType, body }\n );\n }\n\n return response.json();\n }\n`;\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n /**\n * Get all endpoints from the document\n */\n private getAllEndpoints(): EndpointInfo[] {\n const endpoints: EndpointInfo[] = [];\n\n for (const [path, pathItem] of Object.entries(this.document.paths || {})) {\n if (!pathItem) continue;\n\n const methods = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'] as const;\n\n for (const method of methods) {\n const operation = pathItem[method] as OperationObject | undefined;\n\n if (operation) {\n endpoints.push({\n path,\n method,\n ...(operation.operationId !== undefined && { operationId: operation.operationId }),\n ...(operation.summary !== undefined && { summary: operation.summary }),\n ...(operation.description !== undefined && { description: operation.description }),\n operation,\n });\n }\n }\n }\n\n return this.deduplicateOperationIds(endpoints);\n }\n\n /**\n * Deduplicate colliding operationIds by appending a path-based suffix.\n *\n * Real-world specs (e.g. SAM.gov) reuse the same operationId across\n * versioned paths. We make each one unique so the generated client\n * has no duplicate method names.\n */\n private deduplicateOperationIds(endpoints: EndpointInfo[]): EndpointInfo[] {\n const seen = new Map<string, number>();\n\n return endpoints.map((ep) => {\n if (!ep.operationId) return ep;\n\n const count = seen.get(ep.operationId) ?? 0;\n seen.set(ep.operationId, count + 1);\n\n if (count === 0) return ep;\n\n // Build a deterministic suffix from the path\n const suffix = this.sanitizePath(ep.path);\n return { ...ep, operationId: `${ep.operationId}_${suffix}` };\n });\n }\n\n /**\n * Turn an API path into a valid, readable identifier suffix.\n * e.g. '/entity-information/v4/download-entities' -> 'entityInformationV4DownloadEntities'\n */\n private sanitizePath(path: string): string {\n return path\n .split('/')\n .filter((seg) => seg && !seg.startsWith('{'))\n .join('-')\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())\n .replace(/^[A-Z]/, (chr) => chr.toLowerCase());\n }\n\n /**\n * Get parameters for an operation\n */\n private getOperationParameters(operation: OperationObject): ParameterObject[] {\n if (!operation.parameters) return [];\n return operation.parameters as ParameterObject[];\n }\n\n /**\n * Check if operation has request body\n */\n private hasRequestBody(operation: OperationObject): boolean {\n return !!operation.requestBody;\n }\n\n /**\n * Check if request body is required\n */\n private isRequestBodyRequired(operation: OperationObject): boolean {\n const requestBody = operation.requestBody as RequestBodyObject | undefined;\n return requestBody?.required || false;\n }\n\n /**\n * Get method name from endpoint\n */\n private getMethodName(endpoint: EndpointInfo): string {\n // Use operationId if available\n if (endpoint.operationId) {\n return this.camelCase(endpoint.operationId);\n }\n\n // Generate from method + path\n const pathParts = endpoint.path\n .split('/')\n .filter((p) => p && !p.startsWith('{'))\n .join('-');\n\n return this.camelCase(`${endpoint.method}-${pathParts}`);\n }\n\n /**\n * Get type name for operation\n */\n private getOperationTypeName(endpoint: EndpointInfo): string {\n const methodName = this.getMethodName(endpoint);\n return this.pascalCase(methodName);\n }\n\n /**\n * Convert to camelCase\n */\n private camelCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())\n .replace(/^[A-Z]/, (chr) => chr.toLowerCase());\n }\n\n /**\n * Convert to PascalCase\n */\n private pascalCase(str: string): string {\n const camel = this.camelCase(str);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n }\n\n /**\n * Get default base URL from servers\n */\n private getDefaultBaseUrl(): string {\n if ('servers' in this.document && this.document.servers && this.document.servers.length > 0) {\n const firstServer = this.document.servers[0];\n return firstServer ? firstServer.url : 'http://localhost:3000';\n }\n return 'http://localhost:3000';\n }\n\n /**\n * Get API title\n */\n private getAPITitle(): string {\n return this.document.info?.title || 'API Client';\n }\n\n /**\n * Get API description\n */\n private getAPIDescription(): string {\n return this.document.info?.description || '';\n }\n}\n","import type { EndpointFilter as IEndpointFilter } from '../types';\n\n/**\n * Filters endpoints based on include/exclude patterns.\n *\n * Supports:\n * - Exact match: /equipment\n * - Path prefix (includes subpaths): /equipment matches /equipment and /equipment/123\n * - Path with params: /equipment/{id}\n * - Single wildcard: /admin/* matches /admin/users (not /admin itself)\n * - Double wildcard: /admin/** matches /admin/users and /admin/nested/deep\n * - Root path: / matches all paths\n */\nexport class EndpointFilter {\n private include: string[];\n private exclude: string[];\n\n constructor(filter?: IEndpointFilter) {\n // Default: include all paths (only if not explicitly set to empty)\n if (filter?.include !== undefined && filter.include.length > 0) {\n this.include = filter.include;\n } else {\n this.include = ['/**'];\n }\n this.exclude = filter?.exclude ?? [];\n }\n\n /**\n * Check if a path should be included in code generation.\n *\n * Logic:\n * 1. If path matches any exclude pattern → excluded\n * 2. If path matches any include pattern → included\n * 3. Otherwise → excluded (default deny)\n */\n matches(path: string): boolean {\n // Ensure path starts with /\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n // Check exclude patterns first (deny takes precedence)\n for (const pattern of this.exclude) {\n if (this.matchPattern(normalizedPath, pattern)) {\n return false;\n }\n }\n\n // Check include patterns\n for (const pattern of this.include) {\n if (this.matchPattern(normalizedPath, pattern)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Match path against a pattern.\n */\n private matchPattern(path: string, pattern: string): boolean {\n // Normalize pattern\n const normalizedPattern = pattern.startsWith('/') ? pattern : `/${pattern}`;\n\n // Special case: pattern \"/\" matches all paths\n if (normalizedPattern === '/') {\n return true;\n }\n\n // Convert glob pattern to regex\n const regex = this.globToRegex(normalizedPattern);\n\n // First try exact match\n if (regex.test(path)) {\n return true;\n }\n\n // For include patterns without trailing wildcards,\n // check if path starts with pattern (subpath matching)\n if (!normalizedPattern.endsWith('*')) {\n // Check if path is a subpath of the pattern\n // e.g., /equipment matches /equipment/123\n const patternSegments = normalizedPattern.split('/');\n const pathSegments = path.split('/');\n\n // Must have same prefix and path must have more or equal segments\n if (pathSegments.length >= patternSegments.length) {\n let matches = true;\n for (let i = 0; i < patternSegments.length; i++) {\n const pSeg = patternSegments[i];\n // With noUncheckedIndexedAccess, patternSegments[i] could be undefined\n if (pSeg === undefined) {\n matches = false;\n break;\n }\n // Skip wildcard checks here since globToRegex handles those\n if (pSeg === '*' || pSeg === '**') {\n continue;\n }\n // Handle {param}\n if (pSeg.startsWith('{') && pSeg.endsWith('}')) {\n continue;\n }\n // With noUncheckedIndexedAccess, we need to check if pathSegment exists\n const pathSeg = pathSegments[i];\n if (pSeg !== pathSeg) {\n matches = false;\n break;\n }\n }\n if (matches) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Convert a glob-like pattern to a RegExp.\n *\n * Pattern semantics:\n * - `*` = single path segment (no slashes), minimum 1 character\n * - `**` = multiple path segments (includes slashes), zero or more segments\n * - `{param}` = single path segment parameter\n * - Exact match segments are literal strings\n */\n private globToRegex(pattern: string): RegExp {\n // Escape regex special chars first (except * and {})\n let result = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Handle ** first (before *) to avoid replacement order issues\n result = result.replace(/\\*\\*/g, '⟪DOUBLESTAR⟫');\n\n // Handle * (matches ONE segment: one or more non-slash chars)\n result = result.replace(/\\*/g, '⟪STAR⟫');\n\n // Replace ** with regex based on position:\n // - ** at START of pattern (e.g., /**) → .* (matches everything)\n // - ** after / (e.g., /admin/**) → (?:\\/.*)? with / removed\n // - ** in MIDDLE (e.g., /api/**/users) → (?:/.*)?\n if (result.startsWith('⟪DOUBLESTAR⟫')) {\n // Pattern starts with **\n result = '.*' + result.slice('⟪DOUBLESTAR⟫'.length);\n } else if (result.endsWith('⟪DOUBLESTAR⟫') && result.endsWith('/⟪DOUBLESTAR⟫')) {\n // Pattern ends with /**\n // Remove the / before ** and replace with optional group\n result = result.slice(0, -'⟪DOUBLESTAR⟫'.length - 1) + '(?:/.*)?';\n } else {\n // ** in middle or ends with bare **\n result = result.replace(/⟪DOUBLESTAR⟫/g, '(?:/.*)?');\n }\n\n result = result.replace(/⟪STAR⟫/g, '[^/]+'); // * matches one segment (no /)\n\n // Handle {param} - matches a single segment\n result = result.replace(/\\{[^}]+\\}/g, '[^/]+');\n\n return new RegExp(`^${result}$`);\n }\n}\n","import crypto from 'crypto';\nimport fs from 'fs';\nimport https from 'https';\nimport http from 'http';\nimport { URL } from 'url';\nimport path from 'path';\nimport { realpathSync } from 'fs';\nimport { isIP } from 'net';\nimport type { ApprovedSpec, PrebuildSecurityConfig, ValidationResult } from '../types';\n\n/**\n * Validates that OpenAPI specs are on the approved list\n * and haven't been modified since approval.\n *\n * @example\n * ```typescript\n * const config: PrebuildSecurityConfig = {\n * enabled: true,\n * allowlist: [\n * {\n * name: 'Government Logistics API',\n * url: 'https://api.gov.mil/logistics/v1/openapi.yaml',\n * sha256: 'a1b2c3d4e5f6...'\n * }\n * ]\n * };\n *\n * const validator = new ApprovedSpecsValidator(config);\n * const result = await validator.validate('https://api.gov.mil/logistics/v1/openapi.yaml');\n *\n * if (!result.valid) {\n * console.error('Security rejection:', result.error);\n * process.exit(1);\n * }\n * ```\n */\nexport class ApprovedSpecsValidator {\n private allowlist: ApprovedSpec[];\n private cache: Map<string, { content: string; hash: string }> = new Map();\n private skipHashVerification: boolean;\n private readonly ALLOWED_DIRS: string[];\n private readonly MAX_RESPONSE_SIZE = 10 * 1024 * 1024; // 10MB - prevents memory exhaustion attacks\n\n /**\n * Create a new ApprovedSpecsValidator\n *\n * @param config - Security configuration from stackwright.yml\n * @param skipHashVerification - Skip hash check (for testing/development)\n */\n constructor(config: PrebuildSecurityConfig, skipHashVerification = false) {\n this.allowlist = config.allowlist || [];\n this.skipHashVerification = skipHashVerification;\n this.ALLOWED_DIRS = this.buildAllowedDirs();\n }\n\n /**\n * Build list of allowed directories for path traversal prevention.\n * Defaults to cwd, specs subdir, and .stackwright cache dir.\n */\n private buildAllowedDirs(): string[] {\n const cwd = process.cwd();\n return [cwd, path.join(cwd, 'specs'), path.join(cwd, '.stackwright')];\n }\n\n /**\n * Validate that a file path is within allowed directories (path traversal prevention).\n * Uses realpathSync to resolve symlinks and prevent symlink traversal attacks.\n *\n * @param filePath - File path to validate\n * @returns true if path is allowed, false otherwise\n */\n private isPathAllowed(filePath: string): boolean {\n try {\n // Resolve symlinks to prevent symlink traversal attacks\n const realPath = realpathSync(filePath);\n return this.ALLOWED_DIRS.some((dir) => {\n const realDir = realpathSync(dir);\n return realPath.startsWith(realDir + path.sep) || realPath === realDir;\n });\n } catch {\n return false;\n }\n }\n\n /**\n * Check if a URL/path is a path traversal attempt.\n * This is checked BEFORE the allowlist to prevent bypassing path security.\n *\n * @param specUrl - URL or path to check\n * @returns true if this is a path traversal attempt\n */\n private isPathTraversalAttempt(specUrl: string): boolean {\n // Check for file:// protocol (potential SSRF/path traversal)\n if (specUrl.startsWith('file://')) {\n return true;\n }\n\n // If it's a local file path, check if it's within allowed directories\n if (fs.existsSync(specUrl)) {\n return !this.isPathAllowed(specUrl);\n }\n\n // For URLs, check for malicious patterns\n // (protocol validation happens in download(), but we block known bad patterns here)\n if (!specUrl.startsWith('http://') && !specUrl.startsWith('https://')) {\n // Contains path traversal patterns but not a valid URL\n if (specUrl.includes('../') || specUrl.includes('..\\\\')) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Validate that a hex string is a valid SHA-256 hash (64 hex characters).\n *\n * @param hash - String to validate\n * @returns true if valid SHA-256 hex format\n */\n private isValidHex(hash: string): boolean {\n return /^[a-fA-F0-9]{64}$/.test(hash);\n }\n\n /**\n * Validate that a redirect URL is safe (SSRF protection).\n * Blocks:\n * - HTTPS → HTTP downgrades\n * - Private IP ranges (10.x.x.x, 172.16-31.x.x, 192.168.x.x, 127.x.x.x)\n * - Localhost and loopback addresses\n * - Cloud metadata endpoints\n * - IPv6 private/link-local addresses\n *\n * @param location - Redirect location URL\n * @param originalProtocol - Protocol of the original request\n * @returns true if redirect is safe, false if it should be blocked\n */\n private isRedirectSafe(location: string, originalProtocol: string): boolean {\n try {\n // Parse the redirect location\n const redirectUrl = new URL(location);\n\n // Block HTTPS → HTTP downgrade (protocol downgrade attack)\n if (redirectUrl.protocol === 'http:' && originalProtocol === 'https:') {\n return false;\n }\n\n // Block private IPs and localhost patterns\n const blockedPatterns = [\n 'localhost',\n '127.0.0.1',\n '::1',\n '0.0.0.0',\n '169.254.169.254', // AWS/GCP/Azure metadata\n '.metadata.google.internal', // GCP metadata\n 'metadata.google.internal',\n 'metadata.internal',\n ];\n\n for (const pattern of blockedPatterns) {\n if (redirectUrl.hostname.includes(pattern)) {\n return false;\n }\n }\n\n // Check for private IP ranges using regex\n const ipv4Match = redirectUrl.hostname.match(/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/);\n if (ipv4Match && ipv4Match.length >= 5) {\n const octets = ipv4Match.slice(1, 5).map(Number);\n const first = octets[0];\n const second = octets[1];\n\n // 10.0.0.0/8 (private network)\n if (first !== undefined && first === 10) {\n return false;\n }\n // 172.16.0.0/12 (private network)\n if (\n first !== undefined &&\n second !== undefined &&\n first === 172 &&\n second >= 16 &&\n second <= 31\n ) {\n return false;\n }\n // 192.168.0.0/16 (private network)\n if (first !== undefined && second !== undefined && first === 192 && second === 168) {\n return false;\n }\n // 127.0.0.0/8 (loopback)\n if (first !== undefined && first === 127) {\n return false;\n }\n }\n\n // Use isIP for proper IPv6 detection and blocking\n const ipVersion = isIP(redirectUrl.hostname);\n if (ipVersion === 6) {\n // Block IPv6 private/link-local addresses\n const blockedPrefixes = [\n '::1', // Loopback\n 'fe80:', // Link-local\n 'fc00:', // Unique local\n 'fd', // Unique local (short form)\n '::ffff:', // IPv4-mapped\n ];\n if (blockedPrefixes.some((p) => redirectUrl.hostname.startsWith(p))) {\n return false;\n }\n }\n\n return true;\n } catch {\n // Invalid URL - block it\n return false;\n }\n }\n\n /**\n * Atomically check if path is allowed and read content if so.\n * Prevents TOCTOU race conditions by combining existence check,\n * symlink resolution, path validation, and file read in a single operation.\n *\n * @param filePath - File path to check and read\n * @returns Object with content if successful, or error message\n */\n private readAllowedFile(filePath: string): { content?: string; error?: string } {\n try {\n // Use lstatSync to NOT follow symlinks during check\n fs.lstatSync(filePath);\n\n // If it's a symlink, resolve where it actually points\n // realpathSync handles symlink resolution\n const realPath = fs.realpathSync(filePath);\n\n // Now check if the real path is allowed\n if (!this.isPathAllowed(realPath)) {\n return { error: 'File path outside allowed directories (path traversal blocked)' };\n }\n\n // Read the file - this is now atomic with the path check\n return { content: fs.readFileSync(filePath, 'utf8') };\n } catch (e) {\n const err = e as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return { error: 'File not found' };\n }\n return { error: String(e) };\n }\n }\n\n /**\n * Check if security enforcement is enabled\n */\n isEnabled(): boolean {\n return this.allowlist.length > 0;\n }\n\n /**\n * Get the allowlist count\n */\n getAllowlistCount(): number {\n return this.allowlist.length;\n }\n\n /**\n * Validate that a spec is on the approved list and matches expected hash.\n *\n * @param specUrl - URL or file path to the spec to validate\n * @returns ValidationResult indicating if the spec is approved\n */\n async validate(specUrl: string): Promise<ValidationResult> {\n // CRITICAL: Check for path traversal BEFORE allowlist check\n // This prevents bypassing path security with skipHashVerification\n if (this.isPathTraversalAttempt(specUrl)) {\n return {\n valid: false,\n errorCode: 'DOWNLOAD_FAILED',\n specUrl,\n error: 'File path outside allowed directories (path traversal blocked)',\n };\n }\n\n // Find matching approved spec\n const approved = this.allowlist.find((a) => this.urlsMatch(a.url, specUrl));\n\n if (!approved) {\n return {\n valid: false,\n errorCode: 'SPEC_NOT_ON_ALLOWLIST',\n specUrl,\n error: this.formatAllowlistError(specUrl),\n };\n }\n\n // Skip hash verification if requested (dev mode)\n if (this.skipHashVerification) {\n return { valid: true, specUrl };\n }\n\n // Download/load and hash the spec\n const hashResult = await this.getHash(specUrl);\n\n if (hashResult.error) {\n return {\n valid: false,\n errorCode: 'DOWNLOAD_FAILED',\n specUrl,\n error: `Failed to fetch spec '${specUrl}': ${hashResult.error}`,\n };\n }\n\n // Validate hash formats before comparison (defense in depth)\n if (!this.isValidHex(hashResult.hash!)) {\n return {\n valid: false,\n errorCode: 'DOWNLOAD_FAILED',\n specUrl,\n error: 'Invalid hash format returned from download',\n };\n }\n\n if (!this.isValidHex(approved.sha256)) {\n return {\n valid: false,\n errorCode: 'DOWNLOAD_FAILED',\n specUrl,\n error: 'Invalid hash format in approved spec configuration',\n };\n }\n\n // Use timing-safe comparison to prevent timing attacks\n if (\n !crypto.timingSafeEqual(\n Buffer.from(hashResult.hash!, 'hex'),\n Buffer.from(approved.sha256, 'hex')\n )\n ) {\n return {\n valid: false,\n errorCode: 'SPEC_MODIFIED',\n specUrl,\n error: this.formatHashMismatchError(approved, hashResult.hash!),\n };\n }\n\n return { valid: true, specUrl };\n }\n\n /**\n * Validate multiple specs at once (batch validation).\n * Fails fast on first error.\n *\n * @param specUrls - Array of URLs/paths to validate\n * @returns Map of URL to ValidationResult\n */\n async validateAll(specUrls: string[]): Promise<Map<string, ValidationResult>> {\n const results = new Map<string, ValidationResult>();\n\n for (const url of specUrls) {\n const result = await this.validate(url);\n results.set(url, result);\n\n if (!result.valid) {\n // Fail fast - stop on first error\n return results;\n }\n }\n\n return results;\n }\n\n /**\n * Validate all specs and return all results (non-fail-fast).\n *\n * @param specUrls - Array of URLs/paths to validate\n * @returns Map of URL to ValidationResult\n */\n async validateAllComplete(specUrls: string[]): Promise<Map<string, ValidationResult>> {\n const results = new Map<string, ValidationResult>();\n\n for (const url of specUrls) {\n const result = await this.validate(url);\n results.set(url, result);\n }\n\n return results;\n }\n\n /**\n * Get content hash from cache or download.\n */\n private async getHash(url: string): Promise<{ hash?: string; error?: string }> {\n // Check cache\n const cached = this.cache.get(url);\n if (cached) {\n return { hash: cached.hash };\n }\n\n // Download content\n const contentResult = await this.download(url);\n if (contentResult.error) {\n return { error: contentResult.error };\n }\n\n const content = contentResult.content!;\n const hash = crypto.createHash('sha256').update(content).digest('hex');\n\n // Cache\n this.cache.set(url, { content, hash });\n\n return { hash };\n }\n\n /**\n * Download content from URL or file.\n * Includes path traversal and SSRF protection.\n */\n private async download(\n url: string,\n originalProtocol = ''\n ): Promise<{ content?: string; error?: string }> {\n // Check if it's a file path - use atomic method to prevent TOCTOU race conditions\n if (fs.existsSync(url)) {\n return this.readAllowedFile(url);\n }\n\n // Validate URL protocol\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n return { error: `Invalid URL protocol. Expected http:// or https://, got: ${url}` };\n }\n\n // Store original protocol for SSRF check on redirects\n const parsed = new URL(url);\n const requestProtocol = originalProtocol || parsed.protocol;\n\n // Download from URL\n return new Promise((resolve) => {\n const client = url.startsWith('https') ? https : http;\n\n const req = client.get(url, { timeout: 30000 }, (res) => {\n // Handle redirects with SSRF protection\n if (\n res.statusCode &&\n res.statusCode >= 300 &&\n res.statusCode < 400 &&\n res.headers.location\n ) {\n const location = res.headers.location;\n\n // Validate redirect is safe (SSRF protection)\n if (!this.isRedirectSafe(location, requestProtocol)) {\n resolve({ error: `Unsafe redirect target blocked: ${location}` });\n return;\n }\n\n // Follow redirect\n this.download(location, requestProtocol).then(resolve);\n return;\n }\n\n if (res.statusCode !== 200) {\n resolve({ error: `HTTP ${res.statusCode}` });\n return;\n }\n\n // Memory exhaustion protection - limit response size\n let data = '';\n let size = 0;\n res.on('data', (chunk: Buffer) => {\n size += chunk.length;\n if (size > this.MAX_RESPONSE_SIZE) {\n req.destroy();\n resolve({ error: `Response too large (>${this.MAX_RESPONSE_SIZE / 1024 / 1024}MB)` });\n return;\n }\n data += chunk;\n });\n res.on('end', () => resolve({ content: data }));\n res.on('error', (e) => resolve({ error: String(e) }));\n });\n\n req.on('error', (e) => resolve({ error: String(e) }));\n req.on('timeout', () => {\n req.destroy();\n resolve({ error: 'Request timeout (30s)' });\n });\n });\n }\n\n /**\n * Check if two URLs match (handles trailing slashes, case sensitivity, etc.).\n * Strips credentials and hash to prevent bypass via @ symbol.\n */\n private urlsMatch(url1: string, url2: string): boolean {\n const normalize = (u: string) => {\n try {\n const parsed = new URL(u);\n // Strip credentials and hash to prevent bypass via @ symbol\n const normalized = `${parsed.protocol}//${parsed.hostname}${parsed.pathname}`;\n return normalized.replace(/\\/$/, '').toLowerCase();\n } catch {\n // Not a URL, treat as file path - normalize separators and trailing slash\n return u.replace(/\\/$/, '').replace(/\\\\/g, '/').toLowerCase();\n }\n };\n\n return normalize(url1) === normalize(url2);\n }\n\n /**\n * Format error message for spec not on allowlist\n */\n private formatAllowlistError(specUrl: string): string {\n const lines = [`Spec '${specUrl}' is not on the approved list.`];\n\n if (this.allowlist.length === 0) {\n lines.push('');\n lines.push('No approved specs are configured.');\n lines.push('Add approved specs to stackwright.yml under prebuild.security.allowlist');\n } else {\n lines.push('');\n lines.push('Allowed specs:');\n for (const spec of this.allowlist) {\n lines.push(` • ${spec.name}`);\n lines.push(` ${spec.url}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format error message for hash mismatch\n */\n private formatHashMismatchError(approved: ApprovedSpec, actualHash: string): string {\n const lines = [\n `Spec '${approved.url}' has been modified since approval.`,\n '',\n 'Expected hash (approved): ' + approved.sha256,\n 'Actual hash (current): ' + actualHash,\n '',\n 'This may indicate:',\n ' • The spec has been updated on the server',\n ' • Network corruption during download',\n ' • A man-in-the-middle attack',\n '',\n 'If this is expected, update the sha256 in stackwright.yml.',\n ];\n\n return lines.join('\\n');\n }\n\n /**\n * Clear the download cache.\n * Useful for long-running processes.\n */\n clearCache(): void {\n this.cache.clear();\n }\n}\n","/**\n * Prebuild plugin types\n * TODO: Move to @stackwright/types package when created\n */\nexport interface PrebuildPluginContext {\n /** Parsed site configuration from stackwright.yml */\n siteConfig: Record<string, any>;\n /** Project root directory */\n projectRoot: string;\n}\n\nexport interface PrebuildPlugin {\n /** Plugin name */\n name: string;\n /** Called before build starts */\n beforeBuild?(context: PrebuildPluginContext): Promise<void>;\n /** Called after build completes */\n afterBuild?(context: PrebuildPluginContext): Promise<void>;\n}\n\nimport fs from 'fs';\nimport path from 'path';\nimport { OpenAPIParser } from '../parser/OpenAPIParser';\nimport { ZodSchemaGenerator } from '../compiler/ZodSchemaGenerator';\nimport { TypeGenerator } from '../compiler/TypeGenerator';\nimport { ActionGenerator } from '../compiler/ActionGenerator';\nimport { ClientGenerator, type SchemaMapping } from '../compiler/ClientGenerator';\nimport {\n CollectionProviderGenerator,\n type ProviderGenerationOptions,\n} from '../compiler/CollectionProviderGenerator';\nimport { SchemaResolver } from '../parser/SchemaResolver';\nimport { EndpointFilter } from '../utils/EndpointFilter';\nimport { ApprovedSpecsValidator } from '../utils/ApprovedSpecsValidator';\nimport type { OpenAPIConfig, PrebuildSecurityConfig } from '../types';\n\n/**\n * Prebuild plugin for OpenAPI integration\n *\n * Reads OpenAPI configuration from stackwright.yml and generates:\n * - Zod validation schemas\n * - TypeScript type definitions\n * - CollectionProvider implementations\n * - Typed API client functions\n *\n * All generated code is written to src/generated/{integrationName}/\n *\n * === Phase 2: Approved-Specs Enforcement ===\n *\n * Enterprise customers can enable security enforcement via stackwright.yml:\n *\n * ```yaml\n * prebuild:\n * security:\n * enabled: true\n * allowlist:\n * - name: logistics-api\n * url: https://api.gov.mil/logistics/v1/openapi.yaml\n * sha256: a1b2c3d4e5f6...\n * ```\n *\n * This ensures only approved API specs can generate code.\n */\nexport class OpenAPIPlugin implements PrebuildPlugin {\n name = '@stackwright-pro/openapi';\n\n async beforeBuild(context: PrebuildPluginContext): Promise<void> {\n const { siteConfig, projectRoot } = context;\n\n // Check for prebuild security config\n const prebuildConfig = (siteConfig.prebuild || {}) as Record<string, any>;\n const securityConfig = prebuildConfig.security as PrebuildSecurityConfig | undefined;\n\n let validator: ApprovedSpecsValidator | null = null;\n\n if (securityConfig?.enabled) {\n // Check for skip flag (development mode)\n const skipApprovedSpecs = process.argv.includes('--skip-approved-specs');\n\n if (skipApprovedSpecs) {\n // SECURITY: Block this flag in production/CI environments\n const isProductionBuild =\n process.env.NODE_ENV === 'production' || process.env.CI === 'true';\n\n if (isProductionBuild) {\n console.error('\\n❌ FATAL: --skip-approved-specs not allowed in production/CI builds\\n');\n throw new Error(\n 'SECURITY_CONFIG_VIOLATION: Cannot use --skip-approved-specs in production or CI environments'\n );\n }\n\n console.log(\n '\\n[@stackwright-pro/openapi] ⚠️ Approved-specs enforcement DISABLED (--skip-approved-specs)\\n'\n );\n console.log(' This is ONLY allowed in development mode.\\n');\n } else {\n validator = new ApprovedSpecsValidator(securityConfig);\n console.log('\\n[@stackwright-pro/openapi] 🔒 Approved-specs enforcement ENABLED');\n console.log(` Approved specs: ${validator.getAllowlistCount()}`);\n }\n }\n\n // Look for integrations config in site config\n const integrations = siteConfig.integrations as unknown[] | undefined;\n\n if (!integrations || !Array.isArray(integrations)) {\n // No integrations configured - silently skip\n return;\n }\n\n // Filter for OpenAPI integrations\n const openAPIIntegrations = integrations.filter(\n (int): int is OpenAPIConfig =>\n typeof int === 'object' && int !== null && 'name' in int && 'spec' in int\n );\n\n if (openAPIIntegrations.length === 0) {\n return;\n }\n\n // Batch validate all specs upfront if validator is enabled\n if (validator) {\n const specUrls = openAPIIntegrations.map((i) => i.spec);\n const results = await validator.validateAll(specUrls);\n\n for (const [url, result] of results) {\n if (!result.valid) {\n // Security rejection - fail hard\n this.printSecurityRejection(result);\n throw new Error(`SPEC_NOT_APPROVED: ${result.error}`);\n }\n\n console.log(` ✓ Approved: ${url}`);\n }\n }\n\n console.log(\n `\\n[@stackwright-pro/openapi] Processing ${openAPIIntegrations.length} integration(s)...`\n );\n\n // Process each OpenAPI integration\n for (const config of openAPIIntegrations) {\n await this.processIntegration(config, projectRoot);\n }\n\n console.log('[@stackwright-pro/openapi] Generation complete\\n');\n }\n\n /**\n * Print a security rejection error in a formatted box\n */\n private printSecurityRejection(result: { errorCode?: string; error?: string }): void {\n const lines: string[] = [];\n\n lines.push(\n '\\n╔══════════════════════════════════════════════════════════════════════════════╗'\n );\n lines.push(\n '║ 🔒 SECURITY REJECTED ║'\n );\n lines.push('╠══════════════════════════════════════════════════════════════════════════════╣');\n lines.push(`║ Error: ${(result.errorCode || 'UNKNOWN').padEnd(73)} ║`);\n lines.push('╠══════════════════════════════════════════════════════════════════════════════╣');\n\n // Print error message with proper wrapping\n const errorLines = (result.error || 'Unknown error').split('\\n');\n const maxLen = 76;\n\n for (const line of errorLines) {\n // Wrap long lines\n if (line.length <= maxLen) {\n lines.push(`║ ${line.padEnd(maxLen)} ║`);\n } else {\n // Split long lines\n let remaining = line;\n while (remaining.length > 0) {\n lines.push(`║ ${remaining.substring(0, maxLen).padEnd(maxLen)} ║`);\n remaining = remaining.substring(maxLen);\n }\n }\n }\n\n lines.push(\n '╚══════════════════════════════════════════════════════════════════════════════╝\\n'\n );\n\n for (const line of lines) {\n console.error(line);\n }\n }\n\n private async processIntegration(config: OpenAPIConfig, projectRoot: string): Promise<void> {\n const { name, spec, auth, mockUrl, collections, endpoints, actions } = config;\n\n console.log(` - Processing integration: ${name}`);\n\n // Filter out WebSocket collections — not yet supported by the prebuild pipeline\n const httpCollections = (collections || []).filter((c) => {\n if (c.transport === 'websocket') {\n console.warn(\n ` > Skipping collection \"${c.endpoint}\" (transport: websocket — not yet supported)`\n );\n return false;\n }\n return true;\n });\n\n // Nothing to do if this integration is WebSocket-only (no HTTP endpoints, no REST collections, no actions)\n const hasEndpoints = endpoints && (endpoints.include?.length || endpoints.exclude?.length);\n const hasActions = actions && actions.length > 0;\n if (httpCollections.length === 0 && !hasEndpoints && !hasActions) {\n console.log(\n ' > No HTTP endpoints or REST collections found — skipping (WebSocket-only integration not yet supported)'\n );\n return;\n }\n\n // Resolve spec path (can be URL or local file)\n const specPath = spec.startsWith('http') ? spec : path.resolve(projectRoot, spec);\n\n // Parse OpenAPI spec\n const parser = new OpenAPIParser();\n const { document } = await parser.parse(specPath);\n\n // Override servers array with mock URL if configured\n // This ensures generated client uses the Prism mock server\n if (mockUrl) {\n const originalServer = document.servers?.[0]?.url || 'unknown';\n document.servers = [{ url: mockUrl }];\n console.log(` > Using mock URL: ${mockUrl} (was: ${originalServer})`);\n }\n\n // Create endpoint filter\n const endpointFilter = new EndpointFilter(endpoints);\n\n // Log filter info if configured\n if (endpoints && (endpoints.include?.length || endpoints.exclude?.length)) {\n const includeStr = endpoints.include?.join(', ') || '/**';\n const excludeStr = endpoints.exclude?.length\n ? ` (exclude: ${endpoints.exclude.join(', ')})`\n : '';\n console.log(` > Filter: include [${includeStr}]${excludeStr}`);\n }\n\n // Create output directory\n const outputDir = path.join(projectRoot, 'src', 'generated', name);\n fs.mkdirSync(outputDir, { recursive: true });\n\n // Generate Zod schemas for all collections\n const schemaMapping = await this.generateSchemas(\n document,\n httpCollections,\n outputDir,\n name,\n endpointFilter\n );\n\n // Generate TypeScript types\n await this.generateTypes(document, httpCollections, outputDir, name);\n\n // Generate CollectionProvider\n if (httpCollections.length > 0) {\n await this.generateProvider(document, config, outputDir, name);\n }\n\n // Generate API client\n await this.generateClient(document, outputDir, name, schemaMapping, endpointFilter);\n\n // Generate CollectionAction implementations\n await this.generateActions(document, config, outputDir, name);\n\n console.log(` > Generated code in src/generated/${name}/`);\n }\n\n private async generateSchemas(\n document: any,\n collections: OpenAPIConfig['collections'],\n outputDir: string,\n integrationName: string,\n endpointFilter: EndpointFilter\n ): Promise<SchemaMapping> {\n const resolver = new SchemaResolver(document);\n const zodGenerator = new ZodSchemaGenerator();\n\n // Single import at top — all schemas use bare: true to avoid duplicates\n let schemasCode = `/**\n * Generated Zod schemas from OpenAPI spec\n * Integration: ${integrationName}\n * \n * DO NOT EDIT - This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n */\n\nimport { z } from 'zod';\n\n`;\n\n // Generate schema for each collection\n if (collections) {\n for (const collection of collections) {\n const { endpoint } = collection;\n // Use configured method, defaulting to GET\n const method = collection.method?.toLowerCase() ?? 'get';\n const schema = resolver.getResponseSchema(endpoint, method);\n\n if (!schema) {\n console.warn(` > No schema found for ${method.toUpperCase()} ${endpoint}`);\n continue;\n }\n\n const collectionName = this.sanitizeName(endpoint);\n const schemaName = `${this.capitalize(collectionName)}Schema`;\n\n // Check if response is array\n const isArray = schema.type === 'array';\n const itemSchema = isArray ? (schema as any).items : schema;\n\n // Generate Zod schema (bare = no duplicate imports)\n const zodCode = zodGenerator.generate(itemSchema, { schemaName, bare: true });\n\n schemasCode += zodCode + '\\n';\n\n // If response is array, create array schema too\n if (isArray) {\n schemasCode += `export const ${this.capitalize(collectionName)}ArraySchema = z.array(${schemaName});\\n\\n`;\n }\n }\n }\n\n // ========================================================================\n // Generate response schemas for filtered endpoints\n // ========================================================================\n schemasCode += '\\n// Response schemas for filtered endpoints\\n';\n\n // Track which schemas we've already generated\n const generatedSchemas = new Set<string>();\n let filteredCount = 0;\n\n const paths = document.paths || {};\n for (const [pathStr, pathItem] of Object.entries(paths) as [string, any][]) {\n // SKIP paths that don't match the filter\n if (!endpointFilter.matches(pathStr)) {\n filteredCount++;\n continue;\n }\n\n const methods = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const opId = operation.operationId || this.generateOperationId(pathStr, method);\n const responseSchemaName = `${this.getOperationTypeName(opId)}ResponseSchema`;\n\n // Skip if already generated\n if (generatedSchemas.has(responseSchemaName)) {\n continue;\n }\n\n // Get the response schema from OpenAPI spec\n const responseSchema = resolver.getResponseSchema(pathStr, method);\n if (!responseSchema) {\n console.warn(` > No response schema for ${method.toUpperCase()} ${pathStr}`);\n continue;\n }\n\n // Check if it's an array response\n const isArray = responseSchema.type === 'array';\n\n if (isArray && (responseSchema as any).items?.$ref) {\n // Array of component schema reference\n const componentName = this.extractComponentName((responseSchema as any).items.$ref);\n schemasCode += `export const ${responseSchemaName} = z.array(${componentName}Schema);\\n`;\n generatedSchemas.add(responseSchemaName);\n } else if ('$ref' in responseSchema && responseSchema.$ref) {\n // Direct component schema reference\n const componentName = this.extractComponentName(responseSchema.$ref as string);\n schemasCode += `export const ${responseSchemaName} = ${componentName}Schema;\\n`;\n generatedSchemas.add(responseSchemaName);\n } else if (isArray) {\n // Inline array schema (bare = no duplicate imports)\n const zodCode = zodGenerator.generate(responseSchema, {\n schemaName: responseSchemaName,\n bare: true,\n });\n schemasCode += zodCode + '\\n';\n generatedSchemas.add(responseSchemaName);\n } else {\n // Inline object schema (bare = no duplicate imports)\n const zodCode = zodGenerator.generate(responseSchema, {\n schemaName: responseSchemaName,\n bare: true,\n });\n schemasCode += zodCode + '\\n';\n generatedSchemas.add(responseSchemaName);\n }\n }\n }\n\n if (filteredCount > 0) {\n console.log(` > Skipped ${filteredCount} paths (filtered)`);\n }\n\n // Build schema mapping for ClientGenerator (only for filtered endpoints)\n const schemaMapping: SchemaMapping = {};\n\n for (const [pathStr, pathItem] of Object.entries(paths) as [string, any][]) {\n // Only include filtered paths\n if (!endpointFilter.matches(pathStr)) {\n continue;\n }\n\n const methods = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const opId = operation.operationId || this.generateOperationId(pathStr, method);\n const responseSchemaName = `${this.getOperationTypeName(opId)}ResponseSchema`;\n\n schemaMapping[opId] = {\n requestSchema: null, // ClientGenerator handles request schema generation + type inference\n responseSchema: responseSchemaName,\n };\n }\n }\n\n // Write schemas file\n fs.writeFileSync(path.join(outputDir, 'schemas.ts'), schemasCode);\n\n return schemaMapping;\n }\n\n private async generateTypes(\n document: any,\n collections: OpenAPIConfig['collections'],\n outputDir: string,\n integrationName: string\n ): Promise<void> {\n let typesCode = `/**\n * Generated TypeScript types from OpenAPI spec\n * Integration: ${integrationName}\n * \n * DO NOT EDIT - This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n */\n\nimport type { z } from 'zod';\nimport type * as schemas from './schemas';\n\n`;\n\n // Infer types from schemas\n if (collections) {\n for (const collection of collections) {\n const collectionName = this.sanitizeName(collection.endpoint);\n const typeName = this.capitalize(collectionName);\n const schemaName = `${typeName}Schema`;\n\n typesCode += `export type ${typeName} = z.infer<typeof schemas.${schemaName}>;\\n`;\n }\n }\n\n // Write types file\n fs.writeFileSync(path.join(outputDir, 'types.ts'), typesCode);\n }\n\n private async generateProvider(\n document: any,\n config: OpenAPIConfig,\n outputDir: string,\n integrationName: string\n ): Promise<void> {\n const generator = new CollectionProviderGenerator(document);\n const { collections, auth } = config;\n\n if (!collections || collections.length === 0) {\n return;\n }\n\n // Collect all schema imports needed\n const schemaImports = new Set<string>();\n\n // Generate each provider class with bare=true (no imports)\n const classBlocks: string[] = [];\n\n for (const collection of collections) {\n const collectionConfig = {\n endpoint: collection.endpoint,\n slugField: collection.slug_field,\n ...(collection.method !== undefined && { method: collection.method }),\n filters: collection.filters,\n };\n\n const providerOptions: ProviderGenerationOptions = { bare: true };\n\n if (auth) {\n if (auth.type === 'bearer' || auth.type === 'apiKey') {\n providerOptions.auth = {\n type: auth.type,\n ...(auth.type === 'apiKey' && { headerName: 'X-API-Key' }),\n };\n } else if (auth.type === 'oauth2') {\n console.warn(\n ` > OAuth2 auth not yet supported for ${collection.endpoint} (coming soon)`\n );\n }\n }\n\n const code = generator.generate(collectionConfig, providerOptions);\n classBlocks.push(code);\n\n // Track needed schema imports\n const collectionName = this.sanitizeName(collection.endpoint);\n const resolver = new SchemaResolver(document);\n const schema = resolver.getResponseSchema(\n collection.endpoint,\n collection.method?.toLowerCase() ?? 'get'\n );\n const isArray = schema?.type === 'array';\n if (isArray) {\n schemaImports.add(`${this.capitalize(collectionName)}ArraySchema`);\n } else {\n schemaImports.add(`${this.capitalize(collectionName)}Schema`);\n }\n }\n\n // Assemble the file with a single import block\n let providerCode = `/**\n * Generated CollectionProvider from OpenAPI spec\n * Integration: ${integrationName}\n * \n * DO NOT EDIT - This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n */\n\nimport type { CollectionProvider, CollectionItem } from '@stackwright/collections';\nimport { ${Array.from(schemaImports).join(', ')} } from './schemas';\n\n`;\n\n providerCode += classBlocks.join('\\n');\n\n // Write provider file\n fs.writeFileSync(path.join(outputDir, 'provider.ts'), providerCode);\n }\n\n private async generateActions(\n document: any,\n config: OpenAPIConfig,\n outputDir: string,\n integrationName: string\n ): Promise<void> {\n const { actions } = config;\n\n if (!actions || actions.length === 0) {\n return;\n }\n\n // Derive client class name — same logic as generateClient() to stay DRY\n const clientClassName = `${this.capitalize(integrationName)}Client`;\n\n const generator = new ActionGenerator(document);\n const code = generator.generate(actions, integrationName, clientClassName);\n\n fs.writeFileSync(path.join(outputDir, 'actions.ts'), code);\n console.log(\n ` > Generated actions.ts (${actions.length} action${actions.length === 1 ? '' : 's'})`\n );\n }\n\n private async generateClient(\n document: any,\n outputDir: string,\n integrationName: string,\n schemaMapping: SchemaMapping,\n endpointFilter: EndpointFilter\n ): Promise<void> {\n // Count endpoints that will be filtered\n const paths = document.paths || {};\n let filteredEndpoints = 0;\n for (const pathStr of Object.keys(paths)) {\n if (!endpointFilter.matches(pathStr)) {\n filteredEndpoints++;\n }\n }\n\n if (filteredEndpoints > 0) {\n console.log(\n ` > Generating client for ${Object.keys(paths).length - filteredEndpoints} endpoints (${filteredEndpoints} filtered)`\n );\n }\n\n const generator = new ClientGenerator(document);\n // Generate the client with custom class name\n const className = `${this.capitalize(integrationName)}Client`;\n const clientCode = generator.generate({\n className,\n includeJsDoc: true,\n schemaMapping,\n validateResponses: true,\n strictValidation: false,\n });\n\n // Write client file\n fs.writeFileSync(path.join(outputDir, 'client.ts'), clientCode);\n }\n\n private extractComponentName(ref: string): string {\n // Extract component name from $ref\n // Example: #/components/schemas/Equipment -> Equipment\n const parts = ref.split('/');\n const lastPart = parts[parts.length - 1];\n return lastPart ?? ref;\n }\n\n private getOperationTypeName(operationId: string): string {\n // Convert operationId to PascalCase for type names\n // Example: listEquipment -> ListEquipment\n return operationId.charAt(0).toUpperCase() + operationId.slice(1);\n }\n\n private generateOperationId(pathStr: string, method: string): string {\n const sanitized = this.sanitizeName(pathStr);\n return `${method}${this.capitalize(sanitized)}`;\n }\n\n private getResponseSchemaName(pathStr: string, method: string): string {\n const sanitized = this.sanitizeName(pathStr);\n const baseName = this.capitalize(sanitized);\n\n // GET /equipment -> ListEquipmentResponseSchema / EquipmentArraySchema\n if (method === 'get' && !pathStr.includes('{')) {\n return `${baseName}ArraySchema`;\n }\n\n // GET /equipment/{id} -> EquipmentSchema (single item)\n return `${baseName}Schema`;\n }\n\n private sanitizeName(pathStr: string): string {\n return pathStr.replace(/^\\//, '').replace(/\\//g, '-').replace(/[{}:]/g, '').replace(/-+/g, '-');\n }\n\n private capitalize(str: string): string {\n return str\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n }\n}\n\n/**\n * Factory function to create the plugin instance\n *\n * Usage in user's prebuild script:\n * ```typescript\n * const { createOpenAPIPlugin } = require('@stackwright-pro/openapi/prebuild');\n * runPrebuild({ plugins: [createOpenAPIPlugin()] });\n * ```\n */\nexport function createOpenAPIPlugin(): PrebuildPlugin {\n return new OpenAPIPlugin();\n}\n","import { isIP } from 'net';\nimport type { ZodSchema } from 'zod';\n\n/**\n * Blocked host patterns for SSRF prevention\n */\nconst BLOCKED_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\./, // Loopback (127.0.0.0/8)\n /^10\\./, // Class A private (10.0.0.0/8)\n /^172\\.(1[6-9]|2[0-9]|3[0-1])\\./, // Class B private (172.16.0.0/12)\n /^192\\.168\\./, // Class C private (192.168.0.0/16)\n /^169\\.254\\./, // Link-local (169.254.0.0/16) - AWS/GCP metadata\n /^0\\./, // Current network (0.0.0.0/8)\n /^::1$/, // IPv6 loopback (no brackets)\n /^\\[::1\\]$/i, // IPv6 loopback (with brackets)\n /^[fF][cCdD][0-9a-fA-F]{2}:/, // IPv6 private (fc00::/7)\n /^169\\.254\\.169\\.254$/i, // AWS metadata endpoint\n /^metadata\\.googleapis\\.com$/i, // GCP metadata endpoint\n /^metadata\\.azure\\.com$/i, // Azure metadata endpoint\n /^imds\\.azure\\.com$/i, // Azure IMDS endpoint\n /^100\\.100\\.100\\.200$/, // Alibaba Cloud metadata\n];\n\n/**\n * Blocked IPv6 prefixes for SSRF prevention\n * Extracted as a named constant for explicit auditability\n */\nconst BLOCKED_IPV6_PREFIXES = [\n '::1', // Loopback\n 'fe80:', // Link-local\n 'fc', // Unique local (fc00::/7 — covers fc00:: through fcff::)\n 'fd', // Unique local (short form)\n];\n\n/**\n * Allowed protocols for outbound requests\n */\nconst ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\n/**\n * NOTE: Validates the URL structure and hostname at call time.\n * Does NOT re-validate after DNS resolution (DNS rebinding).\n * This is acceptable for build-time prebuild use.\n * DO NOT reuse this function for runtime server-side request proxying\n * without adding post-resolution IP validation.\n */\n\n/**\n * Validates that a URL is safe to fetch (SSRF prevention).\n * Exported for use by external consumers and tests.\n *\n * @throws Error if URL targets internal networks or disallowed protocols\n */\nexport function validateUrlSafe(baseUrl: string): URL {\n let url: URL;\n\n try {\n url = new URL(baseUrl);\n } catch {\n throw new Error('SECURITY: baseUrl must be a valid absolute URL');\n }\n\n // Protocol validation\n if (!ALLOWED_PROTOCOLS.includes(url.protocol)) {\n throw new Error('SECURITY: Only HTTP and HTTPS protocols are allowed, got ' + url.protocol);\n }\n\n // Host validation against known-bad patterns\n const hostname = url.hostname.toLowerCase();\n\n for (const pattern of BLOCKED_HOST_PATTERNS) {\n if (pattern.test(hostname)) {\n throw new Error('SECURITY: Blocked internal network address: ' + hostname);\n }\n }\n\n // Deep IPv4 CIDR check for private ranges\n const ip = url.hostname;\n if (/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(ip)) {\n const octets = ip.split('.').map(Number);\n\n // With noUncheckedIndexedAccess, we need to check array bounds\n const first = octets[0];\n const second = octets[1];\n\n // 127.x.x.x\n if (first !== undefined && first === 127) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 10.x.x.x\n if (first !== undefined && first === 10) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 172.16.x.x - 172.31.x.x\n if (\n first !== undefined &&\n second !== undefined &&\n first === 172 &&\n second >= 16 &&\n second <= 31\n ) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 192.168.x.x (RFC 1918 private)\n if (first !== undefined && second !== undefined && first === 192 && second === 168) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 169.254.x.x (link-local)\n if (first !== undefined && second !== undefined && first === 169 && second === 254) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 0.x.x.x (current network)\n if (first !== undefined && first === 0) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n }\n\n // Strip brackets for IPv6 addresses (e.g., [::1] -> ::1)\n // This is required for isIP() to work correctly\n const cleanHostname = hostname.replace(/^\\[|\\]$/g, '');\n\n // Deep IPv6 check via isIP from 'net'\n const ipVersion = isIP(cleanHostname);\n if (ipVersion === 6) {\n // Check against explicit auditable prefix list\n for (const prefix of BLOCKED_IPV6_PREFIXES) {\n if (cleanHostname.startsWith(prefix)) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n }\n\n // Check IPv4-mapped addresses (::ffff:x.x.x.x) — tunneled private IPs\n if (cleanHostname.startsWith('::ffff:')) {\n const mapped = cleanHostname.slice('::ffff:'.length); // e.g. \"c0a8:101\" or \"192.168.1.1\"\n\n let octets: number[] | null = null;\n\n // Case 1: decimal dotted notation (defense-in-depth; URL parser normalizes this away)\n const decMatch = mapped.match(/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/);\n if (decMatch) {\n octets = decMatch.slice(1, 5).map(Number);\n }\n\n // Case 2: hex group notation — the form URL constructor actually produces\n // e.g. \"c0a8:101\" => 192.168.1.1, \"a9fe:a9fe\" => 169.254.169.254\n const hexMatch = mapped.match(/^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);\n if (!octets && hexMatch && hexMatch[1] !== undefined && hexMatch[2] !== undefined) {\n const high = parseInt(hexMatch[1], 16);\n const low = parseInt(hexMatch[2], 16);\n octets = [(high >> 8) & 0xff, high & 0xff, (low >> 8) & 0xff, low & 0xff];\n }\n\n if (octets !== null) {\n const o0 = octets[0];\n const o1 = octets[1];\n if (\n o0 === 127 || // 127.0.0.0/8 loopback\n o0 === 10 || // 10.0.0.0/8 private\n o0 === 0 || // 0.0.0.0/8 current network\n (o0 === 172 && o1 !== undefined && o1 >= 16 && o1 <= 31) || // 172.16/12 private\n (o0 === 192 && o1 === 168) || // 192.168/16 private\n (o0 === 169 && o1 === 254) // 169.254/16 link-local / IMDS\n ) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n // Allow public IPv4-mapped addresses (e.g., ::ffff:8.8.8.8 → ::ffff:808:808)\n } else {\n // Unrecognised ::ffff: format — fail closed\n throw new Error('SECURITY: Base URL resolves to unrecognisable IPv4-mapped address');\n }\n }\n }\n\n return url;\n}\n\n/**\n * Alias for validateUrlSafe — backward compatibility export\n */\nexport const isUrlSafe = validateUrlSafe;\n\n/**\n * Validates endpoint for path traversal\n */\nfunction validateEndpoint(endpoint: string): void {\n if (endpoint.includes('..')) {\n throw new Error('SECURITY: Path traversal detected in endpoint');\n }\n\n if (endpoint.includes('\\\\')) {\n throw new Error('SECURITY: Backslash detected in endpoint');\n }\n}\n\n/**\n * Configuration for OpenAPI source adapter\n */\nexport interface OpenAPISourceConfig<T = unknown> {\n /** Base URL of the API */\n baseUrl: string;\n\n /** API endpoint path */\n endpoint: string;\n\n /** HTTP method (default: 'get') */\n method?: 'get' | 'post' | 'put' | 'patch' | 'delete';\n\n /** Optional query parameters */\n params?: Record<string, string | number | boolean>;\n\n /** Optional request body */\n body?: unknown;\n\n /** Optional headers */\n headers?: Record<string, string>;\n\n /** Optional Zod schema for validation */\n schema?: ZodSchema<T>;\n\n /** Authentication config */\n auth?: {\n type: 'bearer' | 'apiKey';\n token?: string;\n apiKey?: string;\n headerName?: string;\n };\n}\n\n/**\n * Creates a fetcher function from OpenAPI configuration\n *\n * @example\n * ```typescript\n * const fetcher = createOpenAPIFetcher({\n * baseUrl: 'https://api.example.com',\n * endpoint: '/equipment',\n * auth: { type: 'bearer', token: process.env.API_TOKEN }\n * });\n *\n * // Use with Pulse\n * <Pulse fetcher={fetcher} interval={5000} />\n * ```\n */\nexport function createOpenAPIFetcher<T = unknown>(\n config: OpenAPISourceConfig<T>\n): () => Promise<T> {\n const { baseUrl, endpoint, method = 'get', params, body, headers = {}, auth, schema } = config;\n\n // Validate URLs (SSRF prevention)\n const validatedBaseUrl = validateUrlSafe(baseUrl);\n validateEndpoint(endpoint);\n\n return async (): Promise<T> => {\n // Build URL with query params\n const url = new URL(endpoint, validatedBaseUrl.toString());\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n url.searchParams.append(key, String(value));\n });\n }\n\n // Build headers\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...headers,\n };\n\n // Add auth\n if (auth) {\n if (auth.type === 'bearer' && auth.token) {\n requestHeaders['Authorization'] = `Bearer ${auth.token}`;\n } else if (auth.type === 'apiKey' && auth.apiKey) {\n requestHeaders[auth.headerName ?? 'X-API-Key'] = auth.apiKey;\n }\n }\n\n // Make request (only include body for methods that support it)\n const supportsBody = ['post', 'put', 'patch', 'delete'].includes(method);\n const response = await fetch(url.toString(), {\n method: method.toUpperCase(),\n headers: requestHeaders,\n body: supportsBody && body ? JSON.stringify(body) : null,\n redirect: 'error', // Prevent SSRF via 301/302 redirect to internal addresses\n });\n\n // Sanitize error message (don't expose server details)\n if (!response.ok) {\n const safeStatus = response.status;\n throw new Error('API error: ' + safeStatus);\n }\n\n const result = await response.json();\n\n // Validate with schema if provided\n if (schema) {\n return schema.parse(result) as T;\n }\n\n return result as T;\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/parser/OpenAPIParser.ts","../src/parser/SchemaResolver.ts","../src/compiler/ZodSchemaGenerator.ts","../src/compiler/TypeGenerator.ts","../src/compiler/CollectionProviderGenerator.ts","../src/compiler/ActionGenerator.ts","../src/compiler/ClientGenerator.ts","../src/utils/EndpointFilter.ts","../src/utils/ApprovedSpecsValidator.ts","../src/prebuild/OpenAPIPlugin.ts","../src/sources/openapi.ts"],"names":["path","isSafe","typeName","requestSchemaName","fs","URL","isIP"],"mappings":"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","file":"index.mjs","sourcesContent":["import SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIDocument } from '../types';\n\nexport interface ParseOptions {\n /** Whether to dereference $ref (default: true) */\n dereference?: boolean;\n\n /** Whether to validate the spec (default: true) */\n validate?: boolean;\n}\n\nexport interface ParseResult {\n /** Parsed and normalized OpenAPI document */\n document: OpenAPIDocument;\n\n /** OpenAPI version (3.0.x or 3.1.x) */\n version: string;\n\n /** Whether the spec was dereferenced */\n dereferenced: boolean;\n}\n\n/**\n * OpenAPI spec parser and validator\n *\n * Handles both OpenAPI 3.0 and 3.1 specs.\n * Can parse from URL or local file path.\n */\nexport class OpenAPIParser {\n /**\n * Parse an OpenAPI specification from URL or file path\n *\n * @param specPath - URL or local file path to OpenAPI spec\n * @param options - Parsing options\n * @returns Parsed and validated OpenAPI document\n *\n * @example\n * ```typescript\n * const parser = new OpenAPIParser();\n * const result = await parser.parse('https://api.example.com/openapi.json');\n * console.log(`Parsed OpenAPI ${result.version}`);\n * ```\n */\n async parse(specPath: string, options: ParseOptions = {}): Promise<ParseResult> {\n const { dereference = true, validate = true } = options;\n\n try {\n // Parse and optionally dereference the spec\n const api = await SwaggerParser.parse(specPath);\n\n // Validate the spec structure\n if (validate) {\n await SwaggerParser.validate(api);\n }\n\n // Dereference $ref pointers if requested\n let document: OpenAPIDocument;\n let dereferenced = false;\n if (dereference) {\n try {\n document = (await SwaggerParser.dereference(api)) as OpenAPIDocument;\n dereferenced = true;\n } catch {\n console.warn(\n `[OpenAPIParser] Warning: Could not fully dereference \"${specPath}\" (dangling $ref or circular ref). Proceeding without full dereferencing — some schema references may not resolve.`\n );\n document = api as OpenAPIDocument;\n dereferenced = false;\n }\n } else {\n document = api as OpenAPIDocument;\n }\n\n // Detect version\n const version = this.detectVersion(document);\n\n return {\n document,\n version,\n dereferenced,\n };\n } catch (error) {\n throw this.enhanceError(error, specPath);\n }\n }\n\n /**\n * Detect OpenAPI version from document\n */\n private detectVersion(document: OpenAPIDocument): string {\n // Access the openapi property - it's always present in valid OpenAPI 3.x documents\n // The 'openapi' field is a required string in OpenAPI 3.x specifications\n const openapiVersion =\n 'openapi' in document ? (document as unknown as { openapi: string }).openapi : undefined;\n if (openapiVersion !== undefined) {\n return openapiVersion;\n }\n throw new Error('Invalid OpenAPI document: missing openapi version field');\n }\n\n /**\n * Enhance error messages with context\n */\n private enhanceError(error: unknown, specPath: string): Error {\n if (error instanceof Error) {\n const message = `Failed to parse OpenAPI spec from \"${specPath}\": ${error.message}`;\n const enhancedError = new Error(message);\n // Preserve original stack trace if available\n if (error.stack !== undefined) {\n enhancedError.stack = error.stack;\n }\n return enhancedError;\n }\n return new Error(`Failed to parse OpenAPI spec from \"${specPath}\": ${String(error)}`);\n }\n\n /**\n * Check if a spec path is a URL\n */\n static isURL(specPath: string): boolean {\n try {\n new URL(specPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Validate that a document is OpenAPI 3.x (not Swagger 2.x)\n */\n static isOpenAPI3(document: unknown): document is OpenAPIDocument {\n return (\n typeof document === 'object' &&\n document !== null &&\n 'openapi' in document &&\n typeof (document as any).openapi === 'string' &&\n (document as any).openapi.startsWith('3.')\n );\n }\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\n\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\n\n// TODO: extend SUPPORTED_CONTENT_TYPES as new API patterns emerge\nconst SUPPORTED_CONTENT_TYPES = [\n 'application/json',\n 'application/geo+json', // GeoJSON (ORS, mapping APIs)\n 'application/vnd.api+json', // JSON:API\n 'application/ld+json', // JSON-LD\n 'application/problem+json', // RFC 7807 problem details\n '*/*', // wildcard fallback\n] as const;\n\n/**\n * Resolves schemas from OpenAPI documents\n *\n * Handles extracting and normalizing schemas for code generation.\n */\nexport class SchemaResolver {\n /**\n * @param document - Fully dereferenced OpenAPI document. Pass the result of\n * SwaggerParser.dereference() or OpenAPIParser.parse(). Passing a document\n * with unresolved $ref objects will produce console warnings and undefined\n * returns from schema extraction methods.\n */\n constructor(private document: OpenAPIV3.Document | OpenAPIV3_1.Document) {}\n\n /**\n * Get schema for a specific path and method.\n *\n * Tries `preferredResponseCode` first (default `'200'`). If that code is\n * absent or has no JSON schema, falls back through other 2xx codes in\n * priority order so that REST-correct `201 Created` responses are resolved\n * automatically.\n *\n * @param path - API path (e.g., '/equipment')\n * @param method - HTTP method (e.g., 'get')\n * @param preferredResponseCode - Response code to try first (default: '200')\n * @returns Schema object or undefined\n */\n getResponseSchema(\n path: string,\n method: string,\n preferredResponseCode: string = '200'\n ): SchemaObject | undefined {\n const pathItem = this.document.paths?.[path];\n if (!pathItem) return undefined;\n\n const operation = pathItem[method.toLowerCase() as keyof typeof pathItem] as\n | OpenAPIV3.OperationObject\n | OpenAPIV3_1.OperationObject\n | undefined;\n\n const responses = operation?.responses;\n if (!responses) return undefined;\n\n // Helper: extract JSON schema from a response object, trying each supported\n // content type in priority order so specs that use geo+json, JSON:API, etc.\n // are handled without special-casing at the call site.\n const extractSchema = (responseCode: string): SchemaObject | undefined => {\n const response = responses[responseCode] as\n | OpenAPIV3.ResponseObject\n | OpenAPIV3_1.ResponseObject\n | undefined;\n if (!response) return undefined;\n\n for (const contentType of SUPPORTED_CONTENT_TYPES) {\n const responseContent = response.content;\n if (!responseContent) continue;\n\n // Try exact match first, then a normalized match to handle variants like\n // 'application/json;charset=UTF-8' that should still resolve as 'application/json'.\n const exactContent = responseContent[contentType];\n // Also match variants like 'application/json;charset=UTF-8' → 'application/json'\n const normalizedEntry = exactContent\n ? undefined\n : Object.entries(responseContent).find(\n ([k]) => k === contentType || k.startsWith(`${contentType};`)\n );\n const content = exactContent ?? normalizedEntry?.[1];\n if (!content || !content.schema) continue;\n const schema = content.schema;\n if ('$ref' in schema) {\n // Warn but return the $ref as-is — callers that need a resolved schema\n // should use a dereferenced document. Silently dropping it here loses\n // valid schema references from the generator pipeline.\n console.warn(\n `[SchemaResolver] Unresolved $ref in schema for ${path}. ` +\n `Ensure the document is fully dereferenced before passing to SchemaResolver.`\n );\n return schema as SchemaObject;\n }\n return schema as SchemaObject;\n }\n\n return undefined;\n };\n\n // Try the preferred code first (preserves existing behaviour for 200-based specs)\n const preferred = extractSchema(preferredResponseCode);\n if (preferred) return preferred;\n\n // Cascade through remaining 2xx codes in priority order\n const fallbackCodes = ['200', '201', '202', '204', '2XX', '2xx'];\n for (const code of fallbackCodes) {\n if (code === preferredResponseCode) continue; // already tried\n const schema = extractSchema(code);\n if (schema) return schema;\n }\n\n return undefined;\n }\n\n /**\n * Get the request body schema for a specific path and method.\n *\n * Extracts the application/json schema from the operation's requestBody.\n * Returns undefined if the operation has no requestBody or no JSON content.\n *\n * @param path - API path (e.g., '/supplies/request')\n * @param method - HTTP method (e.g., 'post')\n * @returns Schema object or undefined\n */\n getRequestBodySchema(path: string, method: string): SchemaObject | undefined {\n const pathItem = this.document.paths?.[path];\n if (!pathItem) return undefined;\n\n const operation = pathItem[method.toLowerCase() as keyof typeof pathItem] as\n | OpenAPIV3.OperationObject\n | OpenAPIV3_1.OperationObject\n | undefined;\n\n if (!operation) return undefined;\n\n const rawRequestBody = operation.requestBody;\n if (!rawRequestBody) return undefined;\n\n // Guard: $refs must be resolved before reaching SchemaResolver.\n // This package uses @apidevtools/swagger-parser for dereferencing — if a\n // ReferenceObject appears here, the caller passed a non-dereferenced document.\n if ('$ref' in rawRequestBody) {\n console.warn(\n `[SchemaResolver] Unresolved $ref in requestBody for ${method.toUpperCase()} ${path}. ` +\n `Ensure the document is fully dereferenced before passing to SchemaResolver.`\n );\n return undefined;\n }\n\n const requestBody = rawRequestBody as\n | OpenAPIV3.RequestBodyObject\n | OpenAPIV3_1.RequestBodyObject;\n\n const content = requestBody.content?.['application/json'];\n const schema = content?.schema;\n if (!schema) return undefined;\n if ('$ref' in schema) {\n console.warn(\n `[SchemaResolver] Unresolved $ref in schema for ${path}. ` +\n `Ensure the document is fully dereferenced before passing to SchemaResolver.`\n );\n return undefined;\n }\n return schema as SchemaObject;\n }\n\n /**\n * Get all schemas defined in components\n */\n getAllSchemas(): Record<string, SchemaObject> {\n return (this.document.components?.schemas || {}) as Record<string, SchemaObject>;\n }\n\n /**\n * Get a specific component schema by name\n */\n getComponentSchema(name: string): SchemaObject | undefined {\n return this.document.components?.schemas?.[name] as SchemaObject | undefined;\n }\n\n /**\n * Extract all endpoints from the OpenAPI document\n */\n getAllEndpoints(): Array<{\n path: string;\n method: string;\n operationId?: string;\n summary?: string;\n description?: string;\n }> {\n const endpoints: ReturnType<typeof this.getAllEndpoints> = [];\n\n for (const [path, pathItem] of Object.entries(this.document.paths || {})) {\n if (!pathItem) continue;\n\n const methods = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'] as const;\n\n for (const method of methods) {\n const operation = pathItem[method] as\n | OpenAPIV3.OperationObject\n | OpenAPIV3_1.OperationObject\n | undefined;\n\n if (operation) {\n endpoints.push({\n path,\n method,\n ...(operation.operationId !== undefined && { operationId: operation.operationId }),\n ...(operation.summary !== undefined && { summary: operation.summary }),\n ...(operation.description !== undefined && { description: operation.description }),\n });\n }\n }\n }\n\n return endpoints;\n }\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport { z } from 'zod';\nimport isSafe from 'safe-regex';\n\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\n\nexport interface ZodGenerationOptions {\n /** Whether to make all fields optional by default */\n optionalByDefault?: boolean;\n\n /** Custom name for the generated schema */\n schemaName?: string;\n\n /** If true, emit only the schema + type — no import statements */\n bare?: boolean;\n}\n\n/**\n * Generates Zod schemas from OpenAPI schema objects\n *\n * This is the CORE of the \"mathematically proven code\" value proposition.\n * OpenAPI schemas → Zod validation = runtime safety guarantees.\n */\nexport class ZodSchemaGenerator {\n /**\n * Generate a Zod schema from an OpenAPI schema object\n *\n * @param schema - OpenAPI schema object\n * @param options - Generation options\n * @returns Zod schema code as string\n */\n generate(schema: SchemaObject, options: ZodGenerationOptions = {}): string {\n const { schemaName = 'GeneratedSchema', bare = false } = options;\n\n const zodSchemaCode = this.schemaToZod(schema);\n\n const body = `export const ${schemaName} = ${zodSchemaCode};\n\nexport type ${schemaName}Type = z.infer<typeof ${schemaName}>;\n`;\n\n if (bare) {\n return body;\n }\n\n return `import { z } from 'zod';\nimport isSafe from 'safe-regex';\n\n${body}`;\n }\n\n /**\n * Convert OpenAPI schema to Zod schema code\n */\n private schemaToZod(schema: SchemaObject, depth = 0): string {\n // Gracefully handle unresolved $ref encountered during recursion\n if ('$ref' in schema && (schema as any).$ref) {\n const refPath = (schema as any).$ref;\n console.warn(\n `\\u26a0\\ufe0f Unresolved $ref encountered: ${refPath} \\u2014 generating z.unknown()`\n );\n return `z.unknown() /* unresolved $ref: ${refPath} */`;\n }\n\n // Handle nullable (OpenAPI 3.0 nullable, OpenAPI 3.1 type array with null)\n const isNullable = 'nullable' in schema && schema.nullable === true;\n\n // Base schema generation\n let baseSchema = this.schemaTypeToZod(schema);\n\n // Add description if present\n if (schema.description) {\n const escapedDesc = schema.description.replace(/'/g, \"\\\\'\").replace(/\\r?\\n/g, ' ');\n baseSchema += `.describe('${escapedDesc}')`;\n }\n\n // Handle nullable\n if (isNullable) {\n baseSchema += '.nullable()';\n }\n\n // Handle optional (not in required array)\n // Note: This is handled at the object level, not here\n\n return baseSchema;\n }\n\n /**\n * Map OpenAPI type to Zod schema\n */\n private schemaTypeToZod(schema: SchemaObject): string {\n // Handle $ref (shouldn't happen after dereferencing, but just in case)\n if ('$ref' in schema) {\n throw new Error('$ref found in schema - ensure spec is dereferenced');\n }\n\n // Handle allOf, anyOf, oneOf\n if ('allOf' in schema && schema.allOf) {\n return this.handleComposition(schema.allOf, 'intersection');\n }\n if ('anyOf' in schema && schema.anyOf) {\n return this.handleComposition(schema.anyOf, 'union');\n }\n if ('oneOf' in schema && schema.oneOf) {\n return this.handleComposition(schema.oneOf, 'discriminatedUnion');\n }\n\n // Handle type-based schemas\n const type = schema.type;\n\n // Infer type: object when properties are present (common in real-world specs)\n // OpenAPI spec says: if \"properties\" is defined, the schema describes an object\n if (!type && schema.properties) {\n return this.objectToZod(schema as OpenAPIV3.NonArraySchemaObject);\n }\n\n // Also infer object if additionalProperties is set but no type\n if (!type && schema.additionalProperties !== undefined) {\n return this.objectToZod(schema as OpenAPIV3.NonArraySchemaObject);\n }\n\n switch (type) {\n case 'string':\n return this.stringToZod(schema);\n case 'number':\n case 'integer':\n return this.numberToZod(schema);\n case 'boolean':\n return 'z.boolean()';\n case 'array':\n return this.arrayToZod(schema as OpenAPIV3.ArraySchemaObject);\n case 'object':\n return this.objectToZod(schema as OpenAPIV3.NonArraySchemaObject);\n case 'null':\n return 'z.null()';\n default:\n // No type specified - allow any\n return 'z.unknown()';\n }\n }\n\n /**\n * Handle string schemas with formats and enums\n */\n private stringToZod(schema: SchemaObject): string {\n // Handle enum\n if (schema.enum && schema.enum.length > 0) {\n const values = schema.enum.map((v: unknown) => `'${v}'`).join(', ');\n return `z.enum([${values}])`;\n }\n\n let base = 'z.string()';\n\n // Handle string formats\n if ('format' in schema && schema.format) {\n switch (schema.format) {\n case 'email':\n base += '.email()';\n break;\n case 'uri':\n case 'url':\n base += '.url()';\n break;\n case 'uuid':\n base += '.uuid()';\n break;\n case 'date-time':\n base += '.datetime()';\n break;\n case 'date':\n base += '.date()';\n break;\n // Add more formats as needed\n }\n }\n\n // Handle string constraints\n if ('minLength' in schema && typeof schema.minLength === 'number') {\n base += `.min(${schema.minLength})`;\n }\n if ('maxLength' in schema && typeof schema.maxLength === 'number') {\n base += `.max(${schema.maxLength})`;\n }\n if ('pattern' in schema && schema.pattern) {\n // ✅ SECURITY FIX: Validate regex safety to prevent ReDoS\n if (!isSafe(schema.pattern)) {\n console.warn(`⚠️ Unsafe regex pattern detected: ${schema.pattern}`);\n console.warn(' Skipping pattern validation to prevent ReDoS');\n // Skip the unsafe pattern - better safe than DoS\n } else {\n const escapedPattern = schema.pattern.replace(/\\\\/g, '\\\\\\\\');\n base += `.regex(/${escapedPattern}/)`;\n }\n }\n\n return base;\n }\n\n /**\n * Handle number/integer schemas\n */\n private numberToZod(schema: SchemaObject): string {\n let base = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n\n if ('minimum' in schema && typeof schema.minimum === 'number') {\n base += `.min(${schema.minimum})`;\n }\n if ('maximum' in schema && typeof schema.maximum === 'number') {\n base += `.max(${schema.maximum})`;\n }\n if ('exclusiveMinimum' in schema && typeof schema.exclusiveMinimum === 'number') {\n base += `.gt(${schema.exclusiveMinimum})`;\n }\n if ('exclusiveMaximum' in schema && typeof schema.exclusiveMaximum === 'number') {\n base += `.lt(${schema.exclusiveMaximum})`;\n }\n\n return base;\n }\n\n /**\n * Handle array schemas\n */\n private arrayToZod(schema: OpenAPIV3.ArraySchemaObject): string {\n if (!schema.items) {\n return 'z.array(z.unknown())';\n }\n\n const itemSchema = this.schemaToZod(schema.items as SchemaObject);\n let base = `z.array(${itemSchema})`;\n\n if ('minItems' in schema && typeof schema.minItems === 'number') {\n base += `.min(${schema.minItems})`;\n }\n if ('maxItems' in schema && typeof schema.maxItems === 'number') {\n base += `.max(${schema.maxItems})`;\n }\n\n return base;\n }\n\n /**\n * Handle object schemas\n */\n private objectToZod(schema: OpenAPIV3.NonArraySchemaObject): string {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n // Empty object or record type\n if (schema.additionalProperties) {\n const valueSchema =\n typeof schema.additionalProperties === 'object'\n ? this.schemaToZod(schema.additionalProperties as SchemaObject)\n : 'z.unknown()';\n return `z.record(z.string(), ${valueSchema})`;\n }\n return 'z.object({})';\n }\n\n const properties = schema.properties;\n const required = schema.required || [];\n\n const fields = Object.entries(properties)\n .map(([key, propSchema]) => {\n const isRequired = required.includes(key);\n let fieldSchema = this.schemaToZod(propSchema as SchemaObject);\n\n if (!isRequired) {\n fieldSchema += '.optional()';\n }\n\n // Escape key if needed (e.g., if it has special characters)\n const safeKey = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key) ? key : `'${key}'`;\n\n return ` ${safeKey}: ${fieldSchema}`;\n })\n .join(',\\n');\n\n let result = `z.object({\\n${fields}\\n})`;\n\n // Handle additional properties\n if (schema.additionalProperties === false) {\n result += '.strict()';\n } else if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\n const valueSchema = this.schemaToZod(schema.additionalProperties as SchemaObject);\n result += `.catchall(${valueSchema})`;\n }\n\n return result;\n }\n\n /**\n * Handle allOf, anyOf, oneOf composition\n */\n private handleComposition(\n schemas: Array<SchemaObject | OpenAPIV3.ReferenceObject>,\n type: 'intersection' | 'union' | 'discriminatedUnion'\n ): string {\n const zodSchemas = schemas\n .filter((s): s is SchemaObject => !('$ref' in s))\n .map((s) => this.schemaToZod(s));\n\n if (zodSchemas.length === 0) {\n return 'z.unknown()';\n }\n\n switch (type) {\n case 'intersection':\n // allOf - all schemas must match\n return zodSchemas.reduce((acc, curr) => `${acc}.and(${curr})`);\n case 'union':\n // anyOf - at least one schema must match\n return `z.union([${zodSchemas.join(', ')}])`;\n case 'discriminatedUnion':\n // oneOf - exactly one schema must match\n // For now, treat as union (full discriminated union support is complex)\n return `z.union([${zodSchemas.join(', ')}])`;\n default:\n return 'z.unknown()';\n }\n }\n}\n","import { printNode, zodToTs, createAuxiliaryTypeStore } from 'zod-to-ts';\nimport { z } from 'zod';\n\nexport interface TypeGenerationOptions {\n /** Name for the generated type */\n typeName?: string;\n\n /** Whether to include JSDoc comments */\n includeJsDoc?: boolean;\n}\n\n/**\n * Generates TypeScript types from Zod schemas\n *\n * Converts runtime-validatable Zod schemas into compile-time TypeScript types.\n */\nexport class TypeGenerator {\n /**\n * Generate TypeScript type definition from a Zod schema\n *\n * @param zodSchema - Zod schema object\n * @param options - Generation options\n * @returns TypeScript type definition as string\n *\n * @example\n * ```typescript\n * const schema = z.object({ name: z.string(), age: z.number() });\n * const generator = new TypeGenerator();\n * const typeCode = generator.generate(schema, { typeName: 'User' });\n * // export type User = { name: string; age: number; };\n * ```\n */\n generate(zodSchema: z.ZodTypeAny, options: TypeGenerationOptions = {}): string {\n const { typeName = 'GeneratedType', includeJsDoc = true } = options;\n\n try {\n // Create auxiliary type store for recursive types (required in zod-to-ts v2+)\n const auxiliaryTypeStore = createAuxiliaryTypeStore();\n\n // Use zod-to-ts to convert Zod schema to TypeScript AST\n const { node } = zodToTs(zodSchema, { auxiliaryTypeStore });\n\n // Convert AST to TypeScript code\n const typeCode = printNode(node);\n\n // Build the complete type definition\n let result = '';\n\n if (includeJsDoc && zodSchema.description) {\n result += `/**\\n * ${zodSchema.description}\\n */\\n`;\n }\n\n result += `export type ${typeName} = ${typeCode};\\n`;\n\n return result;\n } catch (error) {\n throw new Error(\n `Failed to generate TypeScript type for ${typeName}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Generate type from Zod schema code string\n *\n * This is used when we have the schema as code (from ZodSchemaGenerator)\n * rather than as a runtime Zod object.\n *\n * @param zodSchemaCode - Zod schema as TypeScript code string\n * @param typeName - Name for the generated type\n * @returns TypeScript type definition\n */\n generateFromCode(zodSchemaCode: string, typeName: string): string {\n // For code-based generation, we rely on z.infer<>\n // The ZodSchemaGenerator already includes this\n return `export type ${typeName} = z.infer<typeof ${typeName}Schema>;\\n`;\n }\n\n /**\n * Generate multiple types from a map of Zod schemas\n *\n * @param schemas - Map of schema names to Zod schemas\n * @returns Object with type definitions for each schema\n */\n generateMultiple(\n schemas: Record<string, z.ZodTypeAny>,\n options: Omit<TypeGenerationOptions, 'typeName'> = {}\n ): Record<string, string> {\n const results: Record<string, string> = {};\n\n for (const [name, schema] of Object.entries(schemas)) {\n results[name] = this.generate(schema, { ...options, typeName: name });\n }\n\n return results;\n }\n\n /**\n * Combine multiple type definitions into a single TypeScript module\n *\n * @param types - Map of type names to type code\n * @param imports - Additional imports to include\n * @returns Complete TypeScript module code\n */\n createModule(types: Record<string, string>, imports: string[] = []): string {\n let module = '';\n\n // Add imports\n if (imports.length > 0) {\n module += imports.join('\\n') + '\\n\\n';\n }\n\n // Add type definitions\n module += Object.values(types).join('\\n');\n\n return module;\n }\n}\n","import type { OpenAPIDocument } from '../types';\nimport { SchemaResolver } from '../parser/SchemaResolver';\n\nexport interface CollectionConfig {\n /** API endpoint path */\n endpoint: string;\n\n /** Field to use as slug/ID */\n slugField: string;\n\n /** HTTP method (default: 'get') */\n method?: string;\n\n /** Collection name (defaults to sanitized endpoint) */\n name?: string;\n}\n\nexport interface ProviderGenerationOptions {\n /** Name for the provider class */\n providerName?: string;\n\n /** Base URL for the API */\n baseUrl?: string;\n\n /** Auth configuration */\n auth?: {\n type: 'bearer' | 'apiKey';\n headerName?: string;\n };\n\n /** If true, emit only the class code without import statements */\n bare?: boolean;\n}\n\n/**\n * Generates CollectionProvider implementations from OpenAPI specs\n *\n * This is the bridge between OpenAPI APIs and Stackwright's content system.\n */\nexport class CollectionProviderGenerator {\n constructor(private document: OpenAPIDocument) {}\n\n /**\n * Generate a CollectionProvider implementation for a specific endpoint\n *\n * @param config - Collection configuration\n * @param options - Generation options\n * @returns TypeScript code for the provider\n */\n generate(config: CollectionConfig, options: ProviderGenerationOptions = {}): string {\n const {\n providerName = this.generateProviderName(config),\n baseUrl = this.getBaseUrl(),\n auth,\n bare = false,\n } = options;\n\n const { endpoint, slugField, method: rawMethod = 'get', name } = config;\n const method = rawMethod.toLowerCase();\n const collectionName = name || this.sanitizePath(endpoint);\n\n const resolver = new SchemaResolver(this.document);\n const schema = resolver.getResponseSchema(endpoint, method);\n\n if (!schema) {\n console.warn(\n ` > No response schema found for ${method.toUpperCase()} ${endpoint} — falling back to z.unknown()`\n );\n }\n\n // Determine if response is an array or object\n const isArray = schema != null ? schema.type === 'array' : false;\n const unknownFallback = schema == null;\n\n const schemaName = `${this.capitalize(collectionName)}Schema`;\n\n // Build params object, conditionally including auth\n const params: {\n providerName: string;\n collectionName: string;\n endpoint: string;\n slugField: string;\n method: string;\n baseUrl: string;\n schemaName: string;\n isArray: boolean;\n unknownFallback: boolean;\n bare: boolean;\n auth?: { type: string; headerName?: string };\n } = {\n providerName,\n collectionName,\n endpoint,\n slugField,\n method,\n baseUrl,\n schemaName,\n isArray,\n unknownFallback,\n bare,\n };\n\n // Only include auth if it's defined (exactOptionalPropertyTypes)\n if (auth !== undefined) {\n params.auth = auth;\n }\n\n return this.generateProviderCode(params);\n }\n\n /**\n * Generate the complete provider code\n */\n private generateProviderCode(params: {\n providerName: string;\n collectionName: string;\n endpoint: string;\n slugField: string;\n method: string;\n baseUrl: string;\n auth?: { type: string; headerName?: string };\n schemaName: string;\n isArray: boolean;\n unknownFallback: boolean;\n bare: boolean;\n }): string {\n const {\n providerName,\n collectionName,\n endpoint,\n slugField,\n method,\n baseUrl,\n auth,\n schemaName,\n isArray,\n unknownFallback,\n bare,\n } = params;\n\n const authHeader = this.generateAuthHeader(auth);\n // Use the array schema for list endpoints\n const arraySchemaName = `${schemaName.replace(/Schema$/, '')}ArraySchema`;\n // When no schema was found, fall back to z.unknown() so the provider still compiles\n const validationSchema = unknownFallback\n ? 'z.unknown()'\n : isArray\n ? arraySchemaName\n : schemaName;\n\n const imports = bare\n ? ''\n : unknownFallback\n ? `import type { CollectionProvider, CollectionEntry, CollectionListOptions, CollectionListResult } from '@stackwright/collections';\nimport { z } from 'zod';\n\n`\n : `import type { CollectionProvider, CollectionEntry, CollectionListOptions, CollectionListResult } from '@stackwright/collections';\nimport { ${isArray ? arraySchemaName : schemaName} } from './schemas';\n\n`;\n\n return `${imports}/**\n * CollectionProvider for ${collectionName}\n *\n * Generated from OpenAPI endpoint: ${method.toUpperCase()} ${endpoint}\n */\nexport class ${providerName} implements CollectionProvider {\n private baseUrl: string;\n private authToken?: string;\n\n constructor(config?: { baseUrl?: string; authToken?: string }) {\n this.baseUrl = config?.baseUrl || '${baseUrl}';\n this.authToken = config?.authToken;\n }\n\n /**\n * List available collection names.\n */\n async collections(): Promise<string[]> {\n return ['${collectionName}'];\n }\n\n /**\n * List all items in the collection\n */\n async list(_collection: string, opts?: CollectionListOptions): Promise<CollectionListResult> {\n const url = new URL(\\`\\${this.baseUrl}${endpoint}\\`);\n\n if (opts?.limit) url.searchParams.set('limit', String(opts.limit));\n if (opts?.offset) url.searchParams.set('offset', String(opts.offset));\n\n const response = await fetch(url.toString(), {\n method: '${method.toUpperCase()}',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(\\`Failed to fetch ${collectionName}: \\${response.statusText}\\`);\n }\n\n const data = await response.json();\n \n // Validate response with Zod schema\n const validated = ${validationSchema}.parse(data);\n \n const entries = ${isArray ? 'validated' : '[validated]'}.map((item: any) => this.toCollectionEntry(item));\n return { entries, total: entries.length };\n }\n\n /**\n * Get a single item by slug\n */\n async get(_collection: string, slug: string): Promise<CollectionEntry | null> {\n ${this.generateGetMethod(endpoint, slugField, isArray, collectionName, schemaName, unknownFallback)}\n }\n\n /**\n * Convert API response to CollectionEntry\n */\n private toCollectionEntry(item: any): CollectionEntry {\n return {\n slug: String(item.${slugField}),\n ...item,\n };\n }\n\n /**\n * Get request headers including auth\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n ${authHeader}\n\n return headers;\n }\n}\n`;\n }\n\n /**\n * Generate get method implementation\n */\n private generateGetMethod(\n endpoint: string,\n slugField: string,\n isArray: boolean,\n collectionName: string,\n schemaName: string,\n unknownFallback: boolean = false\n ): string {\n const validationExpr = unknownFallback ? 'z.unknown()' : schemaName;\n if (endpoint.includes('{id}') || endpoint.includes(':id')) {\n // Detail endpoint exists\n const detailEndpoint = endpoint.replace('{id}', '${slug}').replace(':id', '${slug}');\n return `const url = \\`\\${this.baseUrl}${detailEndpoint}\\`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(\\`Failed to fetch ${collectionName} item: \\${response.statusText}\\`);\n }\n\n const data = await response.json();\n const validated = ${validationExpr}.parse(data);\n \n return this.toCollectionEntry(validated);`;\n } else {\n // No detail endpoint - list all and filter\n return `const result = await this.list(_collection);\n return result.entries.find((item) => item.slug === slug) ?? null;`;\n }\n }\n\n /**\n * Generate auth header code\n */\n private generateAuthHeader(auth?: { type: string; headerName?: string }): string {\n if (!auth) {\n return '// No authentication configured';\n }\n\n if (auth.type === 'bearer') {\n return `if (this.authToken) {\n headers['Authorization'] = \\`Bearer \\${this.authToken}\\`;\n }`;\n }\n\n if (auth.type === 'apiKey') {\n const headerName = auth.headerName || 'X-API-Key';\n return `if (this.authToken) {\n headers['${headerName}'] = this.authToken;\n }`;\n }\n\n return '// Unknown auth type';\n }\n\n /**\n * Get base URL from OpenAPI spec\n */\n private getBaseUrl(): string {\n if ('servers' in this.document && this.document.servers && this.document.servers.length > 0) {\n const firstServer = this.document.servers[0];\n if (firstServer !== undefined) {\n return firstServer.url;\n }\n }\n return 'http://localhost:3000';\n }\n\n /**\n * Generate provider class name from config\n */\n private generateProviderName(config: CollectionConfig): string {\n const name = config.name || this.sanitizePath(config.endpoint);\n return `${this.capitalize(name)}Provider`;\n }\n\n /**\n * Sanitize path to valid identifier\n */\n private sanitizePath(path: string): string {\n return path.replace(/^\\//, '').replace(/\\//g, '-').replace(/[{}:]/g, '').replace(/-+/g, '-');\n }\n\n /**\n * Capitalize string\n */\n private capitalize(str: string): string {\n return str\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n }\n\n /**\n * Guess which field might be a good title\n */\n private guessTitle(slugField: string): string {\n // Common title field names\n const titleFields = ['title', 'name', 'label', 'displayName'];\n const firstField = titleFields[0];\n\n // Use slugField as fallback\n return firstField !== undefined ? firstField : `item.${slugField}`;\n }\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport type { OpenAPIDocument, ActionConfig } from '../types';\nimport { SchemaResolver } from '../parser/SchemaResolver';\nimport { ZodSchemaGenerator } from './ZodSchemaGenerator';\n\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\n\ninterface ProcessedAction {\n config: ActionConfig;\n camelName: string; // e.g. createSupplyRequest\n pascalName: string; // e.g. CreateSupplyRequest\n inputSchemaName: string; // e.g. CreateSupplyRequestInputSchema\n outputSchemaName: string; // e.g. CreateSupplyRequestOutputSchema\n inputSchema: SchemaObject | undefined;\n outputSchema: SchemaObject | undefined;\n}\n\n/**\n * ActionGenerator\n *\n * Generates typed CollectionAction implementations from OpenAPI action configs.\n * Each configured action endpoint becomes a named export satisfying the\n * CollectionAction<TInput, TOutput> interface from @stackwright-pro/workflow.\n *\n * The generated actions.ts is the bridge between:\n * - stackwright.yml actions: config (what to generate)\n * - workflow YAML service: refs (how it's addressed at runtime)\n * - useWorkflow actions registry (where it executes)\n *\n * IoC note: This generator emits `import type { CollectionAction } from\n * '@stackwright-pro/workflow'` as a string. The generator package itself has\n * no dependency on @stackwright-pro/workflow — only the generated files do.\n */\nexport class ActionGenerator {\n private resolver: SchemaResolver;\n private zodGenerator: ZodSchemaGenerator;\n\n constructor(private document: OpenAPIDocument) {\n this.resolver = new SchemaResolver(document);\n this.zodGenerator = new ZodSchemaGenerator();\n }\n\n /**\n * Generate the complete actions.ts file content.\n *\n * @param actions - Action configs from stackwright.yml\n * @param integrationName - Used in the file header comment\n * @param clientClassName - Name of the generated API client class to import\n * @returns Complete TypeScript source for actions.ts\n */\n generate(actions: ActionConfig[], integrationName: string, clientClassName: string): string {\n if (actions.length === 0) {\n return this.generateEmptyFile(integrationName);\n }\n\n const processedActions = actions.map((config) => this.processAction(config));\n\n let code = this.generateHeader(integrationName);\n code += this.generateImports(clientClassName);\n code += '\\n';\n code += this.generateInlineSchemas(processedActions);\n code += '\\n';\n code += this.generateActionExports(processedActions);\n code += '\\n';\n code += this.generateRegistry(processedActions, integrationName);\n\n return code;\n }\n\n private processAction(config: ActionConfig): ProcessedAction {\n const method = config.method.toLowerCase();\n const inputSchema = this.resolver.getRequestBodySchema(config.endpoint, method);\n const outputSchema = this.resolver.getResponseSchema(config.endpoint, method);\n\n const camelName = this.toCamelCase(config.name);\n const pascalName = this.toPascalCase(config.name);\n\n return {\n config,\n camelName,\n pascalName,\n inputSchemaName: `${pascalName}InputSchema`,\n outputSchemaName: `${pascalName}OutputSchema`,\n inputSchema,\n outputSchema,\n };\n }\n\n private generateHeader(integrationName: string): string {\n return `/**\n * Generated CollectionAction implementations\n * Integration: ${integrationName}\n *\n * DO NOT EDIT — This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n *\n * Each export satisfies the CollectionAction interface from @stackwright-pro/workflow.\n * Wire actions into useWorkflow via the \\`actions\\` option:\n *\n * import { actions } from '@/generated/${integrationName}/actions';\n * <WorkflowPage workflow={definition} actions={actions} />\n */\\n\\n`;\n }\n\n private generateImports(clientClassName: string): string {\n return `import { z } from 'zod';\nimport type { CollectionAction, CollectionActionRegistry } from '@stackwright-pro/workflow';\nimport { ${clientClassName} } from './client';\n\nconst _client = new ${clientClassName}();\\n`;\n }\n\n private generateInlineSchemas(actions: ProcessedAction[]): string {\n const lines: string[] = [\n '// ─── Inline Schemas ─────────────────────────────────────────────────────────',\n ];\n\n for (const action of actions) {\n const { inputSchemaName, outputSchemaName, inputSchema, outputSchema, config } = action;\n\n // Input schema\n if (inputSchema) {\n try {\n const zodCode = this.zodGenerator.generate(inputSchema, {\n schemaName: inputSchemaName,\n bare: true,\n });\n lines.push(zodCode);\n } catch {\n lines.push(`// WARNING: Could not generate input schema for ${config.endpoint}`);\n lines.push(`const ${inputSchemaName} = z.unknown();\\n`);\n }\n } else {\n lines.push(`// No requestBody defined for ${config.method} ${config.endpoint}`);\n lines.push(`const ${inputSchemaName} = z.unknown();\\n`);\n }\n\n // Output schema\n if (outputSchema) {\n try {\n const zodCode = this.zodGenerator.generate(outputSchema, {\n schemaName: outputSchemaName,\n bare: true,\n });\n lines.push(zodCode);\n } catch {\n lines.push(`// WARNING: Could not generate output schema for ${config.endpoint}`);\n lines.push(`const ${outputSchemaName} = z.unknown();\\n`);\n }\n } else {\n lines.push(`// No 2xx response schema defined for ${config.method} ${config.endpoint}`);\n lines.push(`const ${outputSchemaName} = z.unknown();\\n`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n }\n\n private generateActionExports(actions: ProcessedAction[]): string {\n const lines: string[] = [\n '// ─── Action Exports ─────────────────────────────────────────────────────────',\n ];\n\n for (const action of actions) {\n const { config, camelName, inputSchemaName, outputSchemaName } = action;\n const safeName = config.name.replace(/'/g, \"\\\\'\");\n const safeDesc = config.description?.replace(/\\*\\//g, '* /');\n const methodName = this.endpointToClientMethod(config.endpoint, config.method);\n const jsDoc = safeDesc\n ? `/**\\n * ${safeDesc}\\n * Resolves service:${safeName} in workflow YAML.\\n */\\n`\n : `/** Resolves service:${safeName} in workflow YAML. */\\n`;\n\n lines.push(\n jsDoc +\n `export const ${camelName}: CollectionAction<\\n` +\n ` z.infer<typeof ${inputSchemaName}>,\\n` +\n ` z.infer<typeof ${outputSchemaName}>\\n` +\n `> = {\\n` +\n ` name: '${safeName}',\\n` +\n ` inputSchema: ${inputSchemaName},\\n` +\n ` outputSchema: ${outputSchemaName},\\n` +\n ` async execute(data) {\\n` +\n ` const validated = ${inputSchemaName}.parse(data);\\n` +\n ` const result = await _client.${methodName}({ body: validated });\\n` +\n ` return ${outputSchemaName}.parse(result);\\n` +\n ` },\\n` +\n `};\\n`\n );\n }\n\n return lines.join('\\n') + '\\n';\n }\n\n private generateRegistry(actions: ProcessedAction[], integrationName: string): string {\n const entries = actions\n .map((a) => {\n const safeName = a.config.name.replace(/'/g, \"\\\\'\");\n return ` '${safeName}': ${a.camelName},`;\n })\n .join('\\n');\n\n return (\n `// ─── Registry ────────────────────────────────────────────────────────────────\\n` +\n `/**\\n` +\n ` * Complete action registry for this integration.\\n` +\n ` * Pass directly to useWorkflow or WorkflowPage:\\n` +\n ` *\\n` +\n ` * import { actions } from '@/generated/${integrationName}/actions';\\n` +\n ` * const { send } = useWorkflow(definition, { actions });\\n` +\n ` */\\n` +\n `export const actions: CollectionActionRegistry = {\\n` +\n `${entries}\\n` +\n `};\\n`\n );\n }\n\n private generateEmptyFile(integrationName: string): string {\n return (\n `/**\\n` +\n ` * Generated CollectionAction implementations\\n` +\n ` * Integration: ${integrationName}\\n` +\n ` *\\n` +\n ` * DO NOT EDIT — This file is auto-generated by @stackwright-pro/openapi\\n` +\n ` *\\n` +\n ` * No actions configured for this integration.\\n` +\n ` * Add an actions: key to this integration in stackwright.yml to generate actions.\\n` +\n ` */\\n` +\n `\\n` +\n `import type { CollectionActionRegistry } from '@stackwright-pro/workflow';\\n` +\n `\\n` +\n `export const actions: CollectionActionRegistry = {};\\n`\n );\n }\n\n /** Derives the client method name from endpoint + method.\n * Prefers operationId (matching ClientGenerator.getMethodName()), falls back\n * to path+method derivation for specs that omit operationIds. */\n private endpointToClientMethod(endpoint: string, method: string): string {\n // Prefer operationId — this is what ClientGenerator.getMethodName() uses,\n // so the generated _client.xxx() call must match what the client declares.\n const pathItem = this.document.paths?.[endpoint] as Record<string, unknown> | undefined;\n const operation = pathItem?.[method.toLowerCase()] as { operationId?: string } | undefined;\n if (operation?.operationId) {\n return this.camelCase(operation.operationId);\n }\n\n // Fallback: derive from HTTP method + path segments (no operationId in spec)\n const parts = endpoint\n .split('/')\n .filter(Boolean)\n .filter((p) => !p.startsWith('{')) // strip path params\n .map((p) => p.replace(/-/g, '_'));\n\n const prefix = method.toLowerCase();\n const suffix = parts.map((p) => this.capitalize(p)).join('');\n return `${prefix}${suffix}`;\n }\n\n /** Convert any string to camelCase — handles operationId values like\n * createOrder, list_items, get-by-id, etc. */\n private camelCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr: string) => chr.toUpperCase())\n .replace(/^[A-Z]/, (chr: string) => chr.toLowerCase());\n }\n\n private toCamelCase(str: string): string {\n const parts = str.split(/[-_]/);\n return parts.map((p, i) => (i === 0 ? p.toLowerCase() : this.capitalize(p))).join('');\n }\n\n private toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((p) => this.capitalize(p))\n .join('');\n }\n\n private capitalize(str: string): string {\n return str.length > 0 ? str[0]!.toUpperCase() + str.slice(1) : '';\n }\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport type { OpenAPIDocument } from '../types';\nimport { SchemaResolver } from '../parser/SchemaResolver';\nimport isSafe from 'safe-regex';\n\ntype OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;\ntype ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\ntype SchemaObject = OpenAPIV3.SchemaObject | OpenAPIV3_1.SchemaObject;\ntype RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;\n\n/**\n * Mapping of operationId to schema names\n */\nexport interface SchemaMapping {\n [operationId: string]: {\n /** Schema name for request validation (null if no params) */\n requestSchema: string | null;\n /** Schema name for response validation */\n responseSchema: string;\n };\n}\n\n/**\n * Options for client generation\n */\nexport interface ClientGenerationOptions {\n /** Name of the client class */\n className?: string;\n\n /** Whether to include JSDoc comments (default: true) */\n includeJsDoc?: boolean;\n\n /** Base URL for the API */\n baseUrl?: string;\n\n /** Whether to validate responses with Zod (default: true) */\n validateResponses?: boolean;\n\n /** Use strict validation - throw on parse errors vs safe parse (default: false) */\n strictValidation?: boolean;\n\n /** Mapping of operationId to schema names for Zod validation */\n schemaMapping?: SchemaMapping;\n}\n\ninterface EndpointInfo {\n path: string;\n method: string;\n operationId?: string;\n summary?: string;\n description?: string;\n operation: OperationObject;\n}\n\n/**\n * ClientGenerator\n *\n * Generates fully typed API client functions from OpenAPI operations.\n * Each endpoint becomes a type-safe function with runtime Zod validation.\n *\n * **Refactored to use Zod schemas as single source of truth:**\n * - Types inferred from Zod schemas (no more manual type generation)\n * - Request validation before API calls\n * - Response validation after API calls\n * - Optional strict validation mode\n */\nexport class ClientGenerator {\n private resolver: SchemaResolver;\n private schemaMapping?: SchemaMapping;\n private requiredSchemas: Set<string>;\n private generatedRequestSchemas: Set<string>;\n private generatedRequestTypes: Set<string>;\n\n constructor(\n private document: OpenAPIDocument,\n schemaMapping?: SchemaMapping\n ) {\n this.resolver = new SchemaResolver(document);\n if (schemaMapping !== undefined) {\n this.schemaMapping = schemaMapping;\n }\n this.requiredSchemas = new Set();\n this.generatedRequestSchemas = new Set();\n this.generatedRequestTypes = new Set();\n }\n\n /**\n * Generate typed API client code from OpenAPI document\n */\n generate(options: ClientGenerationOptions = {}): string {\n const {\n className = 'APIClient',\n includeJsDoc = true,\n baseUrl = this.getDefaultBaseUrl(),\n validateResponses = true,\n strictValidation = false,\n schemaMapping = this.schemaMapping,\n } = options;\n\n const endpoints = this.getAllEndpoints();\n\n if (endpoints.length === 0) {\n throw new Error('No endpoints found in OpenAPI document');\n }\n\n // Reset required schemas tracking\n this.requiredSchemas.clear();\n this.generatedRequestSchemas.clear();\n this.generatedRequestTypes.clear();\n\n // Generate imports (including Zod and schema imports)\n let code = this.generateImports(!!schemaMapping, validateResponses);\n code += '\\n';\n\n // Generate request schemas (always — Zod is used for inline request validation)\n code += this.generateRequestSchemas(endpoints);\n code += '\\n';\n\n // Generate types (using z.infer if schemaMapping provided)\n code += this.generateTypes(endpoints, schemaMapping);\n code += '\\n';\n\n // Generate error classes (including ValidationError)\n code += this.generateErrorClasses();\n code += '\\n';\n\n // Generate client class with validation\n code += this.generateClientClass(\n className,\n baseUrl,\n endpoints,\n includeJsDoc,\n validateResponses,\n strictValidation,\n schemaMapping\n );\n\n return code;\n }\n\n // ============================================================================\n // Import Generation\n // ============================================================================\n\n /**\n * Generate import statements including Zod and schemas\n */\n private generateImports(useSchemas: boolean, validateResponses: boolean): string {\n let code = `/**\n * Auto-generated API client from OpenAPI spec\n * \n * DO NOT EDIT - This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n */\\n\\n`;\n\n // z is always needed for inline request schema generation\n code += `import { z } from 'zod';\\n`;\n if (useSchemas && validateResponses) {\n code += `import * as schemas from './schemas';\\n`;\n }\n\n return code;\n }\n\n /**\n * Track which schemas are used for imports\n */\n private addRequiredSchema(schemaName: string): void {\n this.requiredSchemas.add(schemaName);\n }\n\n // ============================================================================\n // Request Schema Generation (NEW - Zod Schemas)\n // ============================================================================\n\n /**\n * Generate Zod schemas for request parameters\n *\n * This generates schemas like:\n * export const ListEquipmentRequestSchema = z.object({\n * query: z.object({ ... }).optional(),\n * });\n */\n private generateRequestSchemas(endpoints: EndpointInfo[]): string {\n let code = '// ============================================================================\\n';\n code += '// Request Schemas (Zod Validation)\\n';\n code += '// ============================================================================\\n\\n';\n\n for (const endpoint of endpoints) {\n const operationId = endpoint.operationId || this.getMethodName(endpoint);\n const typeName = this.getOperationTypeName(endpoint);\n const schemaName = `${typeName}RequestSchema`;\n\n const schemaCode = this.generateRequestSchemaForEndpoint(endpoint);\n\n // Only generate if there are parameters\n if (schemaCode) {\n // Skip if already emitted (dedup guard — prevents TS2451 redeclaration errors)\n if (this.generatedRequestSchemas.has(schemaName)) {\n continue;\n }\n code += `export const ${schemaName} = ${schemaCode};\\n\\n`;\n this.generatedRequestSchemas.add(schemaName);\n }\n }\n\n return code;\n }\n\n /**\n * Generate request schema for a single endpoint\n */\n private generateRequestSchemaForEndpoint(endpoint: EndpointInfo): string | null {\n const { operation } = endpoint;\n const params = this.getOperationParameters(operation);\n const hasBody = this.hasRequestBody(operation);\n\n const pathParams = params.filter((p) => p.in === 'path');\n const queryParams = params.filter((p) => p.in === 'query');\n const headerParams = params.filter((p) => p.in === 'header');\n\n // If no parameters at all, return null\n if (\n pathParams.length === 0 &&\n queryParams.length === 0 &&\n headerParams.length === 0 &&\n !hasBody\n ) {\n return null;\n }\n\n const parts: string[] = [];\n\n // Path parameters\n if (pathParams.length > 0) {\n const pathSchema = this.generatePathParamsSchema(pathParams);\n parts.push(` path: ${pathSchema}`);\n }\n\n // Query parameters\n if (queryParams.length > 0) {\n const querySchema = this.generateQueryParamsSchema(queryParams);\n parts.push(` query: ${querySchema}`);\n }\n\n // Header parameters\n if (headerParams.length > 0) {\n const headerSchema = this.generateHeaderParamsSchema(headerParams);\n parts.push(` headers: ${headerSchema}`);\n }\n\n // Request body\n if (hasBody) {\n const bodySchema = this.generateRequestBodySchema(operation);\n const isRequired = this.isRequestBodyRequired(operation);\n parts.push(` body: ${bodySchema}${isRequired ? '' : '.optional()'}`);\n }\n\n return `z.object({\\n${parts.join(',\\n')}\\n})`;\n }\n\n /**\n * Generate Zod schema for path parameters\n */\n private generatePathParamsSchema(params: ParameterObject[]): string {\n const paramSchemas: string[] = [];\n\n for (const param of params) {\n const zodSchema = this.parameterSchemaToZod(param);\n const desc = param.description ? `.describe('${this.escapeString(param.description)}')` : '';\n const safeParamKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param.name)\n ? param.name\n : `'${param.name}'`;\n paramSchemas.push(` ${safeParamKey}: ${zodSchema}${desc}`);\n }\n\n return `z.object({\\n${paramSchemas.join(',\\n')}\\n })`;\n }\n\n /**\n * Generate Zod schema for query parameters\n */\n private generateQueryParamsSchema(params: ParameterObject[]): string {\n const paramSchemas: string[] = [];\n\n for (const param of params) {\n let zodSchema = this.parameterSchemaToZod(param);\n\n // Add description\n if (param.description) {\n zodSchema += `.describe('${this.escapeString(param.description)}')`;\n }\n\n // Query params are optional unless explicitly required\n if (!param.required) {\n zodSchema += '.optional()';\n }\n\n const safeParamKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param.name)\n ? param.name\n : `'${param.name}'`;\n paramSchemas.push(` ${safeParamKey}: ${zodSchema}`);\n }\n\n return `z.object({\\n${paramSchemas.join(',\\n')}\\n }).optional()`;\n }\n\n /**\n * Generate Zod schema for header parameters\n */\n private generateHeaderParamsSchema(params: ParameterObject[]): string {\n // Filter out common headers that are handled by the client\n const customParams = params.filter((p) => !this.isCommonHeader(p.name));\n\n if (customParams.length === 0) {\n return 'z.object({}).optional()';\n }\n\n const paramSchemas: string[] = [];\n\n for (const param of customParams) {\n let zodSchema = this.parameterSchemaToZod(param);\n\n if (param.description) {\n zodSchema += `.describe('${this.escapeString(param.description)}')`;\n }\n\n if (!param.required) {\n zodSchema += '.optional()';\n }\n\n paramSchemas.push(` '${param.name}': ${zodSchema}`);\n }\n\n return `z.object({\\n${paramSchemas.join(',\\n')}\\n }).optional()`;\n }\n\n /**\n * Generate Zod schema for request body\n */\n private generateRequestBodySchema(operation: OperationObject): string {\n const requestBody = operation.requestBody as RequestBodyObject | undefined;\n if (!requestBody) return 'z.unknown()';\n\n const content = requestBody.content?.['application/json'];\n if (!content?.schema) return 'z.unknown()';\n\n const schema = content.schema as SchemaObject;\n\n // Check if it's a $ref to component schema\n if ('$ref' in schema && schema.$ref) {\n const componentName = this.extractComponentName(schema.$ref as string);\n return `schemas.${componentName}Schema`;\n }\n\n // Inline schema - convert to Zod\n return this.schemaObjectToZod(schema);\n }\n\n /**\n * Convert parameter schema to Zod schema string\n */\n private parameterSchemaToZod(param: ParameterObject): string {\n const schema = param.schema as SchemaObject | undefined;\n if (!schema) return 'z.string()';\n\n return this.schemaObjectToZod(schema);\n }\n\n /**\n * Convert OpenAPI schema object to Zod schema string\n *\n * This is a simplified version for parameter schemas.\n * Reuses logic similar to ZodSchemaGenerator but outputs inline.\n */\n private schemaObjectToZod(schema: SchemaObject): string {\n // Handle arrays\n if (schema.type === 'array') {\n const items = schema.items as SchemaObject | undefined;\n const itemSchema = items ? this.schemaObjectToZod(items) : 'z.unknown()';\n let arraySchema = `z.array(${itemSchema})`;\n\n if ('minItems' in schema && typeof schema.minItems === 'number') {\n arraySchema += `.min(${schema.minItems})`;\n }\n if ('maxItems' in schema && typeof schema.maxItems === 'number') {\n arraySchema += `.max(${schema.maxItems})`;\n }\n\n return arraySchema;\n }\n\n // Handle objects\n if (schema.type === 'object') {\n if (!schema.properties) {\n return 'z.record(z.string(), z.unknown())';\n }\n\n const props: string[] = [];\n const required = schema.required || [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const isRequired = required.includes(key);\n let propZod = this.schemaObjectToZod(propSchema as SchemaObject);\n\n if (!isRequired) {\n propZod += '.optional()';\n }\n\n const safeKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) ? key : `'${key}'`;\n props.push(`${safeKey}: ${propZod}`);\n }\n\n return `z.object({ ${props.join(', ')} })`;\n }\n\n // Handle enums\n if (schema.enum && schema.enum.length > 0) {\n const values = schema.enum.map((v: unknown) => `'${v}'`).join(', ');\n return `z.enum([${values}])`;\n }\n\n // Handle type-based schemas\n switch (schema.type) {\n case 'string':\n return this.stringSchemaToZod(schema);\n case 'number':\n case 'integer':\n return this.numberSchemaToZod(schema);\n case 'boolean':\n return 'z.boolean()';\n case 'null':\n return 'z.null()';\n default:\n return 'z.unknown()';\n }\n }\n\n /**\n * Convert string schema to Zod\n */\n private stringSchemaToZod(schema: SchemaObject): string {\n let base = 'z.string()';\n\n // Handle formats\n if ('format' in schema && schema.format) {\n switch (schema.format) {\n case 'email':\n base += '.email()';\n break;\n case 'uri':\n case 'url':\n base += '.url()';\n break;\n case 'uuid':\n base += '.uuid()';\n break;\n case 'date-time':\n base += '.datetime()';\n break;\n case 'date':\n base += '.date()';\n break;\n }\n }\n\n // Handle constraints\n if ('minLength' in schema && typeof schema.minLength === 'number') {\n base += `.min(${schema.minLength})`;\n }\n if ('maxLength' in schema && typeof schema.maxLength === 'number') {\n base += `.max(${schema.maxLength})`;\n }\n if ('pattern' in schema && schema.pattern) {\n // ✅ SECURITY FIX: Validate regex safety to prevent ReDoS\n if (!isSafe(schema.pattern)) {\n console.warn(`⚠️ Unsafe regex pattern detected: ${schema.pattern}`);\n console.warn(' Skipping pattern validation to prevent ReDoS');\n // Skip the unsafe pattern - better safe than DoS\n } else {\n const escapedPattern = schema.pattern.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n base += `.regex(/${escapedPattern}/)`;\n }\n }\n\n // Handle default\n if ('default' in schema && schema.default !== undefined) {\n const defaultValue =\n typeof schema.default === 'string' ? `'${schema.default}'` : schema.default;\n base += `.default(${defaultValue})`;\n }\n\n return base;\n }\n\n /**\n * Convert number schema to Zod\n */\n private numberSchemaToZod(schema: SchemaObject): string {\n let base = schema.type === 'integer' ? 'z.number().int()' : 'z.number()';\n\n if ('minimum' in schema && typeof schema.minimum === 'number') {\n base += `.min(${schema.minimum})`;\n }\n if ('maximum' in schema && typeof schema.maximum === 'number') {\n base += `.max(${schema.maximum})`;\n }\n if ('exclusiveMinimum' in schema && typeof schema.exclusiveMinimum === 'number') {\n base += `.gt(${schema.exclusiveMinimum})`;\n }\n if ('exclusiveMaximum' in schema && typeof schema.exclusiveMaximum === 'number') {\n base += `.lt(${schema.exclusiveMaximum})`;\n }\n\n // Handle default\n if ('default' in schema && schema.default !== undefined) {\n base += `.default(${schema.default})`;\n }\n\n return base;\n }\n\n /**\n * Check if header is a common header handled by fetch\n */\n private isCommonHeader(name: string): boolean {\n const commonHeaders = [\n 'authorization',\n 'content-type',\n 'accept',\n 'user-agent',\n 'content-length',\n ];\n return commonHeaders.includes(name.toLowerCase());\n }\n\n /**\n * Extract component name from $ref\n */\n private extractComponentName(ref: string): string {\n // #/components/schemas/Equipment → Equipment\n const parts = ref.split('/');\n const lastPart = parts[parts.length - 1];\n return lastPart ?? ref;\n }\n\n /**\n * Escape string for use in Zod .describe()\n */\n private escapeString(str: string): string {\n return str.replace(/'/g, \"\\\\'\").replace(/\\n/g, ' ');\n }\n\n /**\n * Get list of all required schema names\n */\n private getRequiredSchemas(): string[] {\n return Array.from(this.requiredSchemas).sort();\n }\n\n // ============================================================================\n // Type Generation (Zod Inference)\n // ============================================================================\n\n /**\n * Generate TypeScript types for request/response\n *\n * If schemaMapping is provided, use z.infer<> to get types from Zod schemas.\n * Otherwise, fall back to legacy manual type generation.\n */\n private generateTypes(endpoints: EndpointInfo[], schemaMapping?: SchemaMapping): string {\n let code = '// ============================================================================\\n';\n code += '// Request/Response Types\\n';\n code += '// ============================================================================\\n\\n';\n\n if (schemaMapping) {\n // NEW: Use Zod inference\n code += this.generateTypesFromZod(endpoints, schemaMapping);\n } else {\n // LEGACY: Manual type generation (backward compatible)\n code += this.generateTypesLegacy(endpoints);\n }\n\n return code;\n }\n\n /**\n * Generate types using Zod inference (NEW)\n */\n /**\n * Generate types using Zod inference (NEW)\n *\n * Request types infer from request schemas (defined in this file).\n * Response types infer from response schemas (imported from ./schemas).\n */\n private generateTypesFromZod(endpoints: EndpointInfo[], schemaMapping: SchemaMapping): string {\n let code = '';\n\n for (const endpoint of endpoints) {\n const operationId = endpoint.operationId || this.getMethodName(endpoint);\n const mapping = schemaMapping[operationId];\n\n if (!mapping) {\n // No schema mapping — emit request type (if params exist) and fallback Response type.\n // This handles both filtered-out endpoints and endpoints with unsupported response types.\n const typeName = this.getOperationTypeName(endpoint);\n const requestSchemaName = `${typeName}RequestSchema`;\n if (\n this.generatedRequestSchemas.has(requestSchemaName) &&\n !this.generatedRequestTypes.has(requestSchemaName)\n ) {\n code += `export type ${typeName}Request = z.infer<typeof ${requestSchemaName}>;\\n`;\n this.generatedRequestTypes.add(requestSchemaName);\n }\n // Always emit a fallback response type so generateMethodLegacy compiles cleanly\n code += `export type ${typeName}Response = unknown;\\n\\n`;\n continue;\n }\n\n const typeName = this.getOperationTypeName(endpoint);\n\n // Request type - infer from request schema (defined locally in this file)\n // Build the schema name using the same logic as generateRequestSchemas\n const requestSchemaName = mapping.requestSchema || typeName + 'RequestSchema';\n // Always generate request type if the schema was generated (i.e., endpoint has parameters)\n if (\n this.generatedRequestSchemas.has(requestSchemaName) &&\n !this.generatedRequestTypes.has(requestSchemaName)\n ) {\n this.addRequiredSchema(requestSchemaName);\n code +=\n 'export type ' + typeName + 'Request = z.infer<typeof ' + requestSchemaName + '>;\\n';\n this.generatedRequestTypes.add(requestSchemaName);\n }\n\n // Response type - infer from response schema (imported from ./schemas)\n this.addRequiredSchema(mapping.responseSchema);\n code += `export type ${typeName}Response = z.infer<typeof schemas.${mapping.responseSchema}>;\\n\\n`;\n }\n return code;\n }\n\n /**\n * Generate types using manual conversion (LEGACY - backward compatible)\n */\n private generateTypesLegacy(endpoints: EndpointInfo[]): string {\n let code = '';\n\n for (const endpoint of endpoints) {\n const typeName = this.getOperationTypeName(endpoint);\n\n // Generate request type\n code += this.generateRequestTypeLegacy(endpoint, typeName);\n\n // Generate response type\n code += this.generateResponseTypeLegacy(endpoint, typeName);\n }\n\n return code;\n }\n\n /**\n * Generate request type for an operation (LEGACY)\n */\n private generateRequestTypeLegacy(endpoint: EndpointInfo, typeName: string): string {\n const { operation } = endpoint;\n const params = this.getOperationParameters(operation);\n const hasBody = this.hasRequestBody(operation);\n\n let code = '';\n\n // Check if we need a request type at all\n const pathParams = params.filter((p) => p.in === 'path');\n const queryParams = params.filter((p) => p.in === 'query');\n const headerParams = params.filter((p) => p.in === 'header');\n\n if (\n pathParams.length === 0 &&\n queryParams.length === 0 &&\n headerParams.length === 0 &&\n !hasBody\n ) {\n // No request parameters needed\n return code;\n }\n\n code += `export interface ${typeName}Request {\\n`;\n\n // Path parameters\n if (pathParams.length > 0) {\n code += ' /** Path parameters */\\n';\n code += ' path: {\\n';\n for (const param of pathParams) {\n const required = param.required ? '' : '?';\n const type = this.getTypeFromSchemaLegacy(param.schema as SchemaObject);\n const desc = param.description ? ` /** ${param.description} */\\n` : '';\n const safeParamKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param.name)\n ? param.name\n : `'${param.name}'`;\n code += desc;\n code += ` ${safeParamKey}${required}: ${type};\\n`;\n }\n code += ' };\\n';\n }\n\n // Query parameters\n if (queryParams.length > 0) {\n code += ' /** Query parameters */\\n';\n code += ' query?: {\\n';\n for (const param of queryParams) {\n const required = param.required ? '' : '?';\n const type = this.getTypeFromSchemaLegacy(param.schema as SchemaObject);\n const desc = param.description ? ` /** ${param.description} */\\n` : '';\n const safeParamKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param.name)\n ? param.name\n : `'${param.name}'`;\n code += desc;\n code += ` ${safeParamKey}${required}: ${type};\\n`;\n }\n code += ' };\\n';\n }\n\n // Header parameters\n if (headerParams.length > 0) {\n code += ' /** Custom headers */\\n';\n code += ' headers?: {\\n';\n for (const param of headerParams) {\n const required = param.required ? '' : '?';\n const type = this.getTypeFromSchemaLegacy(param.schema as SchemaObject);\n const desc = param.description ? ` /** ${param.description} */\\n` : '';\n const safeParamKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param.name)\n ? param.name\n : `'${param.name}'`;\n code += desc;\n code += ` ${safeParamKey}${required}: ${type};\\n`;\n }\n code += ' };\\n';\n }\n\n // Request body\n if (hasBody) {\n const bodyType = this.getRequestBodyTypeLegacy(operation);\n code += ' /** Request body */\\n';\n code += ` body${this.isRequestBodyRequired(operation) ? '' : '?'}: ${bodyType};\\n`;\n }\n\n code += '}\\n\\n';\n\n return code;\n }\n\n /**\n * Generate response type for an operation (LEGACY)\n */\n private generateResponseTypeLegacy(endpoint: EndpointInfo, typeName: string): string {\n const schema = this.resolver.getResponseSchema(endpoint.path, endpoint.method, '200');\n\n if (!schema) {\n return `export type ${typeName}Response = unknown;\\n\\n`;\n }\n\n const type = this.getTypeFromSchemaLegacy(schema);\n return `export type ${typeName}Response = ${type};\\n\\n`;\n }\n\n /**\n * Get request body type (LEGACY)\n */\n private getRequestBodyTypeLegacy(operation: OperationObject): string {\n const requestBody = operation.requestBody as RequestBodyObject | undefined;\n if (!requestBody) return 'unknown';\n\n const content = requestBody.content?.['application/json'];\n if (!content?.schema) return 'unknown';\n\n return this.getTypeFromSchemaLegacy(content.schema as SchemaObject);\n }\n\n /**\n * Convert OpenAPI schema to TypeScript type (LEGACY)\n *\n * NOTE: This method is kept for backward compatibility but should be\n * replaced with Zod inference in new code.\n */\n private getTypeFromSchemaLegacy(schema: SchemaObject | undefined): string {\n if (!schema) return 'unknown';\n\n // Handle arrays\n if (schema.type === 'array') {\n const itemType = this.getTypeFromSchemaLegacy(schema.items as SchemaObject);\n return `${itemType}[]`;\n }\n\n // Handle objects\n if (schema.type === 'object') {\n if (!schema.properties) return 'Record<string, unknown>';\n\n const props: string[] = [];\n const required = schema.required || [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const isRequired = required.includes(key);\n const propType = this.getTypeFromSchemaLegacy(propSchema as SchemaObject);\n props.push(`${key}${isRequired ? '' : '?'}: ${propType}`);\n }\n\n return `{ ${props.join('; ')} }`;\n }\n\n // Handle enums\n if (schema.enum) {\n return schema.enum.map((v) => `'${v}'`).join(' | ');\n }\n\n // Handle primitives\n switch (schema.type) {\n case 'string':\n return 'string';\n case 'number':\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'null':\n return 'null';\n default:\n return 'unknown';\n }\n }\n\n // ============================================================================\n // Error Class Generation\n // ============================================================================\n\n /**\n * Generate error classes for API errors and validation errors\n */\n /**\n * Generate error classes (APIError and ValidationError)\n */\n private generateErrorClasses(): string {\n let code = '// ============================================================================\\n';\n code += '// Error Handling\\n';\n code += '// ============================================================================\\n\\n';\n\n // APIError class\n code += '/**\\n';\n code += ' * HTTP API Error\\n';\n code += ' * \\n';\n code += ' * Thrown when an HTTP request fails (4xx, 5xx status codes)\\n';\n code += ' */\\n';\n code += 'export class APIError extends Error {\\n';\n code += ' constructor(\\n';\n code += ' message: string,\\n';\n code += ' public readonly status: number,\\n';\n code += ' public readonly response?: unknown\\n';\n code += ' ) {\\n';\n code += ' super(message);\\n';\n code += \" this.name = 'APIError';\\n\";\n code += ' }\\n';\n code += '}\\n\\n';\n\n // ValidationError class\n code += '/**\\n';\n code += ' * Validation Error\\n';\n code += ' * \\n';\n code += ' * Thrown when Zod schema validation fails for request or response data.\\n';\n code += ' * Contains detailed information about what failed validation.\\n';\n code += ' */\\n';\n code += 'export class ValidationError extends Error {\\n';\n code += ' constructor(\\n';\n code += ' message: string,\\n';\n code += ' public readonly issues: z.ZodIssue[]\\n';\n code += ' ) {\\n';\n code += ' super(message);\\n';\n code += \" this.name = 'ValidationError';\\n\";\n code += ' }\\n\\n';\n\n // getFormattedErrors method\n code += ' /**\\n';\n code += ' * Get formatted error messages for debugging\\n';\n code += ' * \\n';\n code += ' * @returns Array of human-readable error messages\\n';\n code += ' * \\n';\n code += ' * @example\\n';\n code += ' * ```typescript\\n';\n code += ' * try {\\n';\n code += \" * await client.createEquipment({ body: { invalid: 'data' } });\\n\";\n code += ' * } catch (error) {\\n';\n code += ' * if (error instanceof ValidationError) {\\n';\n code += ' * console.error(error.getFormattedErrors());\\n';\n code += \" * // Output: ['body.name: Required', 'body.type: Required']\\n\";\n code += ' * }\\n';\n code += ' * }\\n';\n code += ' * ```\\n';\n code += ' */\\n';\n code += ' getFormattedErrors(): string[] {\\n';\n code += ' return this.issues.map(issue => {\\n';\n code += \" const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\\n\";\n code += ' return `${path}: ${issue.message}`;\\n';\n code += ' });\\n';\n code += ' }\\n\\n';\n\n // getDetailedMessage method\n code += ' /**\\n';\n code += ' * Get a single formatted error message with all issues\\n';\n code += ' * \\n';\n code += ' * @returns Multi-line error message\\n';\n code += ' */\\n';\n code += ' getDetailedMessage(): string {\\n';\n code += ' const errors = this.getFormattedErrors();\\n';\n code += \" return `${this.message}\\\\n - ${errors.join('\\\\n - ')}`;\\n\";\n code += ' }\\n\\n';\n\n // toJSON method\n code += ' /**\\n';\n code += ' * Convert to JSON for logging/serialization\\n';\n code += ' * \\n';\n code += ' * @returns Plain object representation\\n';\n code += ' */\\n';\n code += ' toJSON() {\\n';\n code += ' return {\\n';\n code += ' name: this.name,\\n';\n code += ' message: this.message,\\n';\n code += ' issues: this.issues.map(issue => ({\\n';\n code += ' path: issue.path,\\n';\n code += ' message: issue.message,\\n';\n code += ' code: issue.code,\\n';\n code += ' })),\\n';\n code += ' };\\n';\n code += ' }\\n';\n code += '}\\n';\n\n return code;\n }\n // ============================================================================\n // Client Class Generation\n // ============================================================================\n\n /**\n * Generate the main client class\n */\n private generateClientClass(\n className: string,\n baseUrl: string,\n endpoints: EndpointInfo[],\n includeJsDoc: boolean,\n validateResponses: boolean,\n strictValidation: boolean,\n schemaMapping?: SchemaMapping\n ): string {\n let code = '// ============================================================================\\n';\n code += '// API Client\\n';\n code += '// ============================================================================\\n\\n';\n\n if (includeJsDoc) {\n code += `/**\\n * ${this.getAPITitle()}\\n`;\n if (this.getAPIDescription()) {\n code += ` * \\n * ${this.getAPIDescription()}\\n`;\n }\n if (validateResponses && schemaMapping) {\n code += ` * \\n * This client includes runtime validation using Zod schemas.\\n`;\n }\n code += ` */\\n`;\n }\n\n code += `export class ${className} {\\n`;\n code += ` private baseUrl: string;\\n`;\n code += ` private headers: Record<string, string>;\\n`;\n\n if (validateResponses && schemaMapping) {\n code += ` private validateResponses: boolean;\\n`;\n code += ` private strictValidation: boolean;\\n`;\n }\n\n code += `\\n`;\n\n // Constructor\n code += this.generateConstructor(baseUrl, validateResponses, strictValidation, schemaMapping);\n\n // Generate method for each endpoint\n for (const endpoint of endpoints) {\n if (schemaMapping) {\n code += this.generateMethodWithValidation(endpoint, includeJsDoc, schemaMapping);\n } else {\n code += this.generateMethodLegacy(endpoint, includeJsDoc);\n }\n }\n\n // Helper methods\n code += this.generateRequestHelper(validateResponses, strictValidation, !!schemaMapping);\n\n code += '}\\n';\n\n return code;\n }\n\n /**\n * Generate constructor\n */\n private generateConstructor(\n baseUrl: string,\n validateResponses: boolean,\n strictValidation: boolean,\n schemaMapping?: SchemaMapping\n ): string {\n let code = ` constructor(config?: {\\n`;\n code += ` baseUrl?: string;\\n`;\n code += ` headers?: Record<string, string>;\\n`;\n\n if (validateResponses && schemaMapping) {\n code += ` validateResponses?: boolean;\\n`;\n code += ` strictValidation?: boolean;\\n`;\n }\n\n code += ` }) {\\n`;\n code += ` this.baseUrl = config?.baseUrl || '${baseUrl}';\\n`;\n code += ` this.headers = config?.headers || {};\\n`;\n\n if (validateResponses && schemaMapping) {\n code += ` this.validateResponses = config?.validateResponses ?? ${validateResponses};\\n`;\n code += ` this.strictValidation = config?.strictValidation ?? ${strictValidation};\\n`;\n }\n\n code += ` }\\n\\n`;\n\n return code;\n }\n\n /**\n * Generate a method for an endpoint with Zod validation (NEW)\n */\n /**\n * Generate a method for an endpoint with Zod validation (NEW)\n */\n private generateMethodWithValidation(\n endpoint: EndpointInfo,\n includeJsDoc: boolean,\n schemaMapping: SchemaMapping\n ): string {\n const { operation, path, method } = endpoint;\n const methodName = this.getMethodName(endpoint);\n const typeName = this.getOperationTypeName(endpoint);\n const operationId = endpoint.operationId || methodName;\n\n const mapping = schemaMapping[operationId];\n if (!mapping) {\n // No schema mapping for this endpoint - fall back to legacy\n return this.generateMethodLegacy(endpoint, includeJsDoc);\n }\n\n const params = this.getOperationParameters(operation);\n const hasBody = this.hasRequestBody(operation);\n const pathParams = params.filter((p) => p.in === 'path');\n const queryParams = params.filter((p) => p.in === 'query');\n const headerParams = params.filter((p) => p.in === 'header');\n const hasAnyParams =\n pathParams.length > 0 || queryParams.length > 0 || headerParams.length > 0 || hasBody;\n\n let code = '';\n\n // JSDoc comment\n if (includeJsDoc) {\n code += ' /**\\n';\n if (operation.summary) {\n code += ` * ${operation.summary}\\n`;\n }\n if (operation.description) {\n code += ` * \\n * ${operation.description.split('\\n').join('\\n * ')}\\n`;\n }\n if (hasAnyParams) {\n code += ` * \\n * @param request - Request parameters\\n`;\n }\n code += ` * @returns Promise with the response data\\n`;\n code += ` * @throws {APIError} When the request fails\\n`;\n code += ` * @throws {ValidationError} When validation fails (if enabled)\\n`;\n code += ' */\\n';\n }\n\n // Method signature - request param defaults to empty object if optional\n let requestParam = '';\n if (hasAnyParams) {\n // If only query params (all optional), make request optional with default\n const onlyOptionalParams =\n pathParams.length === 0 && !hasBody && queryParams.every((p) => !p.required);\n requestParam = onlyOptionalParams\n ? `request: ${typeName}Request = {}`\n : `request: ${typeName}Request`;\n }\n\n code += ` async ${methodName}(${requestParam}): Promise<${typeName}Response> {\\n`;\n\n // Request validation (optional)\n if (mapping.requestSchema && hasAnyParams) {\n code += ` // Validate request parameters\\n`;\n code += ` if (this.validateResponses) {\\n`;\n code += ` ${mapping.requestSchema}.parse(request);\\n`;\n code += ` }\\n\\n`;\n }\n\n // Build URL with path parameters\n if (pathParams.length > 0) {\n code += ` // Build URL with path parameters\\n`;\n code += ` let url = this.baseUrl + '${path}'\\n`;\n for (const param of pathParams) {\n code += ` .replace('{${param.name}}', encodeURIComponent(String(request.path.${param.name})))\\n`;\n }\n code += `;\\n\\n`;\n } else {\n code += ` const url = this.baseUrl + '${path}';\\n\\n`;\n }\n\n // Add query parameters\n if (queryParams.length > 0) {\n code += ` // Add query parameters\\n`;\n code += ` const searchParams = new URLSearchParams();\\n`;\n code += ` if (request.query) {\\n`;\n for (const param of queryParams) {\n // Use bracket notation for param names that aren't valid identifiers (e.g. 'focus.point.lon')\n const safeAccess = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param.name)\n ? `.${param.name}`\n : `['${param.name}']`;\n code += ` if (request.query${safeAccess} != null) {\\n`;\n code += ` searchParams.append('${param.name}', String(request.query${safeAccess}));\\n`;\n code += ` }\\n`;\n }\n code += ` }\\n`;\n code += ` const queryString = searchParams.toString();\\n`;\n code += ` const fullUrl = queryString ? \\`\\${url}?\\${queryString}\\` : url;\\n\\n`;\n } else {\n code += ` const fullUrl = url;\\n\\n`;\n }\n\n // Make request with validation\n code += ` // Make request\\n`;\n code += ` const rawResponse = await this.request(fullUrl, {\\n`;\n code += ` method: '${method.toUpperCase()}',\\n`;\n\n if (hasBody) {\n code += ` body: request.body ? JSON.stringify(request.body) : undefined,\\n`;\n }\n\n if (headerParams.length > 0) {\n code += ` headers: request.headers,\\n`;\n }\n\n code += ` });\\n\\n`;\n\n // Response validation\n code += ` // Validate response\\n`;\n code += ` if (this.validateResponses) {\\n`;\n code += ` if (this.strictValidation) {\\n`;\n code += ` // Strict mode - throw on validation error\\n`;\n code += ` return schemas.${mapping.responseSchema}.parse(rawResponse) as ${typeName}Response;\\n`;\n code += ` } else {\\n`;\n code += ` // Safe mode - catch validation errors and throw ValidationError\\n`;\n code += ` const result = schemas.${mapping.responseSchema}.safeParse(rawResponse);\\n`;\n code += ` if (!result.success) {\\n`;\n code += ` throw new ValidationError(\\n`;\n code += ` 'Response validation failed: ' + result.error.message,\\n`;\n code += ` result.error.issues\\n`;\n code += ` );\\n`;\n code += ` }\\n`;\n code += ` return result.data as ${typeName}Response;\\n`;\n code += ` }\\n`;\n code += ` }\\n\\n`;\n\n code += ` // Return unvalidated response (validation disabled)\\n`;\n code += ` return rawResponse as ${typeName}Response;\\n`;\n code += ` }\\n\\n`;\n\n return code;\n }\n /**\n * Generate a method for an endpoint (LEGACY)\n */\n private generateMethodLegacy(endpoint: EndpointInfo, includeJsDoc: boolean): string {\n const { operation, path, method } = endpoint;\n const methodName = this.getMethodName(endpoint);\n const typeName = this.getOperationTypeName(endpoint);\n\n const params = this.getOperationParameters(operation);\n const hasBody = this.hasRequestBody(operation);\n const pathParams = params.filter((p) => p.in === 'path');\n const hasAnyParams = pathParams.length > 0 || params.some((p) => p.in === 'query') || hasBody;\n\n let code = '';\n\n // JSDoc comment\n if (includeJsDoc) {\n code += ' /**\\n';\n if (operation.summary) {\n code += ` * ${operation.summary}\\n`;\n }\n if (operation.description) {\n code += ` * \\n * ${operation.description.split('\\n').join('\\n * ')}\\n`;\n }\n if (hasAnyParams) {\n code += ` * \\n * @param request - Request parameters\\n`;\n }\n code += ` * @returns Promise with the response data\\n`;\n code += ` * @throws {APIError} When the request fails\\n`;\n code += ' */\\n';\n }\n\n // Method signature\n const requestParam = hasAnyParams ? `request: ${typeName}Request` : '';\n code += ` async ${methodName}(${requestParam}): Promise<${typeName}Response> {\\n`;\n\n // Build URL with path parameters\n if (pathParams.length > 0) {\n code += ` // Build URL with path parameters\\n`;\n code += ` let url = this.baseUrl + '${path}'\\n`;\n for (const param of pathParams) {\n code += ` .replace('{${param.name}}', encodeURIComponent(String(request.path.${param.name})))\\n`;\n }\n code += `;\\n\\n`;\n } else {\n code += ` const url = this.baseUrl + '${path}';\\n\\n`;\n }\n\n // Add query parameters\n const queryParams = params.filter((p) => p.in === 'query');\n if (queryParams.length > 0) {\n code += ` // Add query parameters\\n`;\n code += ` const searchParams = new URLSearchParams();\\n`;\n code += ` if (request.query) {\\n`;\n for (const param of queryParams) {\n const safeAccess = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param.name)\n ? `.${param.name}`\n : `['${param.name}']`;\n code += ` if (request.query${safeAccess} != null) {\\n`;\n code += ` searchParams.append('${param.name}', String(request.query${safeAccess}));\\n`;\n code += ` }\\n`;\n }\n code += ` }\\n`;\n code += ` const queryString = searchParams.toString();\\n`;\n code += ` const fullUrl = queryString ? \\`\\${url}?\\${queryString}\\` : url;\\n\\n`;\n } else {\n code += ` const fullUrl = url;\\n\\n`;\n }\n\n // Build request options\n code += ` return this.request<${typeName}Response>(fullUrl, {\\n`;\n code += ` method: '${method.toUpperCase()}',\\n`;\n\n if (hasBody) {\n code += ` body: request.body ? JSON.stringify(request.body) : undefined,\\n`;\n }\n\n const headerParams = params.filter((p) => p.in === 'header');\n if (headerParams.length > 0) {\n code += ` headers: request.headers,\\n`;\n }\n\n code += ` });\\n`;\n code += ` }\\n\\n`;\n\n return code;\n }\n\n /**\n * Generate the request helper method\n */\n private generateRequestHelper(\n validateResponses: boolean,\n strictValidation: boolean,\n useSchemas: boolean\n ): string {\n // TODO: Implement validation in Task 2.4\n // For now, return legacy implementation\n return ` /**\n * Make an HTTP request\n * @private\n */\n private async request<T>(\n url: string,\n options: {\n method: string;\n body?: string;\n headers?: Record<string, string>;\n }\n ): Promise<T> {\n const headers = {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...options.headers,\n };\n\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body,\n });\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => null);\n \n // ✅ SECURITY FIX: Safe JSON parsing with fallback\n let parsedError: unknown;\n if (errorBody) {\n try {\n parsedError = JSON.parse(errorBody);\n } catch (parseError) {\n // Non-JSON error response - store as object with raw text\n parsedError = { \n raw: errorBody,\n contentType: response.headers.get('content-type') \n };\n }\n }\n \n throw new APIError(\n \\`HTTP \\${response.status}: \\${response.statusText}\\`,\n response.status,\n parsedError\n );\n }\n\n // Handle empty responses (204 No Content, etc.)\n if (response.status === 204 || response.headers.get('content-length') === '0') {\n return null as unknown as T;\n }\n\n // ✅ SECURITY FIX: Validate Content-Type before parsing JSON\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n const body = await response.text();\n throw new APIError(\n \\`Unexpected content type: \\${contentType}. Expected application/json\\`,\n response.status,\n { contentType, body }\n );\n }\n\n return response.json();\n }\n`;\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n /**\n * Get all endpoints from the document\n */\n private getAllEndpoints(): EndpointInfo[] {\n const endpoints: EndpointInfo[] = [];\n\n for (const [path, pathItem] of Object.entries(this.document.paths || {})) {\n if (!pathItem) continue;\n\n const methods = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'] as const;\n\n for (const method of methods) {\n const operation = pathItem[method] as OperationObject | undefined;\n\n if (operation) {\n endpoints.push({\n path,\n method,\n ...(operation.operationId !== undefined && { operationId: operation.operationId }),\n ...(operation.summary !== undefined && { summary: operation.summary }),\n ...(operation.description !== undefined && { description: operation.description }),\n operation,\n });\n }\n }\n }\n\n return this.deduplicateOperationIds(endpoints);\n }\n\n /**\n * Deduplicate colliding operationIds by appending a path-based suffix.\n *\n * Real-world specs (e.g. SAM.gov) reuse the same operationId across\n * versioned paths. We make each one unique so the generated client\n * has no duplicate method names.\n */\n private deduplicateOperationIds(endpoints: EndpointInfo[]): EndpointInfo[] {\n const seen = new Map<string, number>();\n\n return endpoints.map((ep) => {\n if (!ep.operationId) return ep;\n\n const count = seen.get(ep.operationId) ?? 0;\n seen.set(ep.operationId, count + 1);\n\n if (count === 0) return ep;\n\n // Build a deterministic suffix from the path\n const suffix = this.sanitizePath(ep.path);\n return { ...ep, operationId: `${ep.operationId}_${suffix}` };\n });\n }\n\n /**\n * Turn an API path into a valid, readable identifier suffix.\n * e.g. '/entity-information/v4/download-entities' -> 'entityInformationV4DownloadEntities'\n */\n private sanitizePath(path: string): string {\n return path\n .split('/')\n .filter((seg) => seg && !seg.startsWith('{'))\n .join('-')\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())\n .replace(/^[A-Z]/, (chr) => chr.toLowerCase());\n }\n\n /**\n * Get parameters for an operation\n */\n private getOperationParameters(operation: OperationObject): ParameterObject[] {\n if (!operation.parameters) return [];\n return operation.parameters as ParameterObject[];\n }\n\n /**\n * Check if operation has request body\n */\n private hasRequestBody(operation: OperationObject): boolean {\n return !!operation.requestBody;\n }\n\n /**\n * Check if request body is required\n */\n private isRequestBodyRequired(operation: OperationObject): boolean {\n const requestBody = operation.requestBody as RequestBodyObject | undefined;\n return requestBody?.required || false;\n }\n\n /**\n * Get method name from endpoint\n */\n private getMethodName(endpoint: EndpointInfo): string {\n // Use operationId if available\n if (endpoint.operationId) {\n return this.camelCase(endpoint.operationId);\n }\n\n // Generate from method + path — include path param names (without braces) to avoid\n // duplicate method names for endpoints that differ only by having a path param.\n // e.g. GET /equipment vs GET /equipment/{serialNumber} → getEquipment vs getEquipmentSerialNumber\n const pathParts = endpoint.path\n .split('/')\n .filter((p) => p)\n .map((p) => (p.startsWith('{') && p.endsWith('}') ? p.slice(1, -1) : p))\n .join('-');\n\n return this.camelCase(`${endpoint.method}-${pathParts}`);\n }\n\n /**\n * Get type name for operation\n */\n private getOperationTypeName(endpoint: EndpointInfo): string {\n const methodName = this.getMethodName(endpoint);\n return this.pascalCase(methodName);\n }\n\n /**\n * Convert to camelCase\n */\n private camelCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())\n .replace(/^[A-Z]/, (chr) => chr.toLowerCase());\n }\n\n /**\n * Convert to PascalCase\n */\n private pascalCase(str: string): string {\n const camel = this.camelCase(str);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n }\n\n /**\n * Get default base URL from servers\n */\n private getDefaultBaseUrl(): string {\n if ('servers' in this.document && this.document.servers && this.document.servers.length > 0) {\n const firstServer = this.document.servers[0];\n return firstServer ? firstServer.url : 'http://localhost:3000';\n }\n return 'http://localhost:3000';\n }\n\n /**\n * Get API title\n */\n private getAPITitle(): string {\n return this.document.info?.title || 'API Client';\n }\n\n /**\n * Get API description\n */\n private getAPIDescription(): string {\n return this.document.info?.description || '';\n }\n}\n","import type { EndpointFilter as IEndpointFilter } from '../types';\n\n/**\n * Filters endpoints based on include/exclude patterns.\n *\n * Supports:\n * - Exact match: /equipment\n * - Path prefix (includes subpaths): /equipment matches /equipment and /equipment/123\n * - Path with params: /equipment/{id}\n * - Single wildcard: /admin/* matches /admin/users (not /admin itself)\n * - Double wildcard: /admin/** matches /admin/users and /admin/nested/deep\n * - Root path: / matches all paths\n */\nexport class EndpointFilter {\n private include: string[];\n private exclude: string[];\n\n constructor(filter?: IEndpointFilter) {\n // Default: include all paths (only if not explicitly set to empty)\n if (filter?.include !== undefined && filter.include.length > 0) {\n this.include = filter.include;\n } else {\n this.include = ['/**'];\n }\n this.exclude = filter?.exclude ?? [];\n }\n\n /**\n * Check if a path should be included in code generation.\n *\n * Logic:\n * 1. If path matches any exclude pattern → excluded\n * 2. If path matches any include pattern → included\n * 3. Otherwise → excluded (default deny)\n */\n matches(path: string): boolean {\n // Ensure path starts with /\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n // Check exclude patterns first (deny takes precedence)\n for (const pattern of this.exclude) {\n if (this.matchPattern(normalizedPath, pattern)) {\n return false;\n }\n }\n\n // Check include patterns\n for (const pattern of this.include) {\n if (this.matchPattern(normalizedPath, pattern)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Match path against a pattern.\n */\n private matchPattern(path: string, pattern: string): boolean {\n // Normalize pattern\n const normalizedPattern = pattern.startsWith('/') ? pattern : `/${pattern}`;\n\n // Special case: pattern \"/\" matches all paths\n if (normalizedPattern === '/') {\n return true;\n }\n\n // Convert glob pattern to regex\n const regex = this.globToRegex(normalizedPattern);\n\n // First try exact match\n if (regex.test(path)) {\n return true;\n }\n\n // For include patterns without trailing wildcards,\n // check if path starts with pattern (subpath matching)\n if (!normalizedPattern.endsWith('*')) {\n // Check if path is a subpath of the pattern\n // e.g., /equipment matches /equipment/123\n const patternSegments = normalizedPattern.split('/');\n const pathSegments = path.split('/');\n\n // Must have same prefix and path must have more or equal segments\n if (pathSegments.length >= patternSegments.length) {\n let matches = true;\n for (let i = 0; i < patternSegments.length; i++) {\n const pSeg = patternSegments[i];\n // With noUncheckedIndexedAccess, patternSegments[i] could be undefined\n if (pSeg === undefined) {\n matches = false;\n break;\n }\n // Skip wildcard checks here since globToRegex handles those\n if (pSeg === '*' || pSeg === '**') {\n continue;\n }\n // Handle {param}\n if (pSeg.startsWith('{') && pSeg.endsWith('}')) {\n continue;\n }\n // With noUncheckedIndexedAccess, we need to check if pathSegment exists\n const pathSeg = pathSegments[i];\n if (pSeg !== pathSeg) {\n matches = false;\n break;\n }\n }\n if (matches) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Convert a glob-like pattern to a RegExp.\n *\n * Pattern semantics:\n * - `*` = single path segment (no slashes), minimum 1 character\n * - `**` = multiple path segments (includes slashes), zero or more segments\n * - `{param}` = single path segment parameter\n * - Exact match segments are literal strings\n */\n private globToRegex(pattern: string): RegExp {\n // Escape regex special chars first (except * and {})\n let result = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Handle ** first (before *) to avoid replacement order issues\n result = result.replace(/\\*\\*/g, '⟪DOUBLESTAR⟫');\n\n // Handle * (matches ONE segment: one or more non-slash chars)\n result = result.replace(/\\*/g, '⟪STAR⟫');\n\n // Replace ** with regex based on position:\n // - ** at START of pattern (e.g., /**) → .* (matches everything)\n // - ** after / (e.g., /admin/**) → (?:\\/.*)? with / removed\n // - ** in MIDDLE (e.g., /api/**/users) → (?:/.*)?\n if (result.startsWith('⟪DOUBLESTAR⟫')) {\n // Pattern starts with **\n result = '.*' + result.slice('⟪DOUBLESTAR⟫'.length);\n } else if (result.endsWith('⟪DOUBLESTAR⟫') && result.endsWith('/⟪DOUBLESTAR⟫')) {\n // Pattern ends with /**\n // Remove the / before ** and replace with optional group\n result = result.slice(0, -'⟪DOUBLESTAR⟫'.length - 1) + '(?:/.*)?';\n } else {\n // ** in middle or ends with bare **\n result = result.replace(/⟪DOUBLESTAR⟫/g, '(?:/.*)?');\n }\n\n result = result.replace(/⟪STAR⟫/g, '[^/]+'); // * matches one segment (no /)\n\n // Handle {param} - matches a single segment\n result = result.replace(/\\{[^}]+\\}/g, '[^/]+');\n\n return new RegExp(`^${result}$`);\n }\n}\n","import crypto from 'crypto';\nimport fs from 'fs';\nimport https from 'https';\nimport http from 'http';\nimport { URL } from 'url';\nimport path from 'path';\nimport { realpathSync } from 'fs';\nimport { isIP } from 'net';\nimport type { ApprovedSpec, PrebuildSecurityConfig, ValidationResult } from '../types';\n\n/**\n * Validates that OpenAPI specs are on the approved list\n * and haven't been modified since approval.\n *\n * @example\n * ```typescript\n * const config: PrebuildSecurityConfig = {\n * enabled: true,\n * allowlist: [\n * {\n * name: 'Government Logistics API',\n * url: 'https://api.gov.mil/logistics/v1/openapi.yaml',\n * sha256: 'a1b2c3d4e5f6...'\n * }\n * ]\n * };\n *\n * const validator = new ApprovedSpecsValidator(config);\n * const result = await validator.validate('https://api.gov.mil/logistics/v1/openapi.yaml');\n *\n * if (!result.valid) {\n * console.error('Security rejection:', result.error);\n * process.exit(1);\n * }\n * ```\n */\nexport class ApprovedSpecsValidator {\n private allowlist: ApprovedSpec[];\n private cache: Map<string, { content: string; hash: string }> = new Map();\n private skipHashVerification: boolean;\n private readonly ALLOWED_DIRS: string[];\n private readonly MAX_RESPONSE_SIZE = 10 * 1024 * 1024; // 10MB - prevents memory exhaustion attacks\n\n /**\n * Create a new ApprovedSpecsValidator\n *\n * @param config - Security configuration from stackwright.yml\n * @param skipHashVerification - Skip hash check (for testing/development)\n */\n constructor(config: PrebuildSecurityConfig, skipHashVerification = false) {\n this.allowlist = config.allowlist || [];\n this.skipHashVerification = skipHashVerification;\n this.ALLOWED_DIRS = this.buildAllowedDirs();\n }\n\n /**\n * Build list of allowed directories for path traversal prevention.\n * Defaults to cwd, specs subdir, and .stackwright cache dir.\n */\n private buildAllowedDirs(): string[] {\n const cwd = process.cwd();\n return [cwd, path.join(cwd, 'specs'), path.join(cwd, '.stackwright')];\n }\n\n /**\n * Validate that a file path is within allowed directories (path traversal prevention).\n * Uses realpathSync to resolve symlinks and prevent symlink traversal attacks.\n *\n * @param filePath - File path to validate\n * @returns true if path is allowed, false otherwise\n */\n private isPathAllowed(filePath: string): boolean {\n try {\n // Resolve symlinks to prevent symlink traversal attacks\n const realPath = realpathSync(filePath);\n return this.ALLOWED_DIRS.some((dir) => {\n const realDir = realpathSync(dir);\n return realPath.startsWith(realDir + path.sep) || realPath === realDir;\n });\n } catch {\n return false;\n }\n }\n\n /**\n * Check if a URL/path is a path traversal attempt.\n * This is checked BEFORE the allowlist to prevent bypassing path security.\n *\n * @param specUrl - URL or path to check\n * @returns true if this is a path traversal attempt\n */\n private isPathTraversalAttempt(specUrl: string): boolean {\n // Check for file:// protocol (potential SSRF/path traversal)\n if (specUrl.startsWith('file://')) {\n return true;\n }\n\n // If it's a local file path, check if it's within allowed directories\n if (fs.existsSync(specUrl)) {\n return !this.isPathAllowed(specUrl);\n }\n\n // For URLs, check for malicious patterns\n // (protocol validation happens in download(), but we block known bad patterns here)\n if (!specUrl.startsWith('http://') && !specUrl.startsWith('https://')) {\n // Contains path traversal patterns but not a valid URL\n if (specUrl.includes('../') || specUrl.includes('..\\\\')) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Validate that a hex string is a valid SHA-256 hash (64 hex characters).\n *\n * @param hash - String to validate\n * @returns true if valid SHA-256 hex format\n */\n private isValidHex(hash: string): boolean {\n return /^[a-fA-F0-9]{64}$/.test(hash);\n }\n\n /**\n * Validate that a redirect URL is safe (SSRF protection).\n * Blocks:\n * - HTTPS → HTTP downgrades\n * - Private IP ranges (10.x.x.x, 172.16-31.x.x, 192.168.x.x, 127.x.x.x)\n * - Localhost and loopback addresses\n * - Cloud metadata endpoints\n * - IPv6 private/link-local addresses\n *\n * @param location - Redirect location URL\n * @param originalProtocol - Protocol of the original request\n * @returns true if redirect is safe, false if it should be blocked\n */\n private isRedirectSafe(location: string, originalProtocol: string): boolean {\n try {\n // Parse the redirect location\n const redirectUrl = new URL(location);\n\n // Block HTTPS → HTTP downgrade (protocol downgrade attack)\n if (redirectUrl.protocol === 'http:' && originalProtocol === 'https:') {\n return false;\n }\n\n // Block private IPs and localhost patterns\n const blockedPatterns = [\n 'localhost',\n '127.0.0.1',\n '::1',\n '0.0.0.0',\n '169.254.169.254', // AWS/GCP/Azure metadata\n '.metadata.google.internal', // GCP metadata\n 'metadata.google.internal',\n 'metadata.internal',\n ];\n\n for (const pattern of blockedPatterns) {\n if (redirectUrl.hostname.includes(pattern)) {\n return false;\n }\n }\n\n // Check for private IP ranges using regex\n const ipv4Match = redirectUrl.hostname.match(/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/);\n if (ipv4Match && ipv4Match.length >= 5) {\n const octets = ipv4Match.slice(1, 5).map(Number);\n const first = octets[0];\n const second = octets[1];\n\n // 10.0.0.0/8 (private network)\n if (first !== undefined && first === 10) {\n return false;\n }\n // 172.16.0.0/12 (private network)\n if (\n first !== undefined &&\n second !== undefined &&\n first === 172 &&\n second >= 16 &&\n second <= 31\n ) {\n return false;\n }\n // 192.168.0.0/16 (private network)\n if (first !== undefined && second !== undefined && first === 192 && second === 168) {\n return false;\n }\n // 127.0.0.0/8 (loopback)\n if (first !== undefined && first === 127) {\n return false;\n }\n }\n\n // Use isIP for proper IPv6 detection and blocking\n const ipVersion = isIP(redirectUrl.hostname);\n if (ipVersion === 6) {\n // Block IPv6 private/link-local addresses\n const blockedPrefixes = [\n '::1', // Loopback\n 'fe80:', // Link-local\n 'fc00:', // Unique local\n 'fd', // Unique local (short form)\n '::ffff:', // IPv4-mapped\n ];\n if (blockedPrefixes.some((p) => redirectUrl.hostname.startsWith(p))) {\n return false;\n }\n }\n\n return true;\n } catch {\n // Invalid URL - block it\n return false;\n }\n }\n\n /**\n * Atomically check if path is allowed and read content if so.\n * Prevents TOCTOU race conditions by combining existence check,\n * symlink resolution, path validation, and file read in a single operation.\n *\n * @param filePath - File path to check and read\n * @returns Object with content if successful, or error message\n */\n private readAllowedFile(filePath: string): { content?: string; error?: string } {\n try {\n // Use lstatSync to NOT follow symlinks during check\n fs.lstatSync(filePath);\n\n // If it's a symlink, resolve where it actually points\n // realpathSync handles symlink resolution\n const realPath = fs.realpathSync(filePath);\n\n // Now check if the real path is allowed\n if (!this.isPathAllowed(realPath)) {\n return { error: 'File path outside allowed directories (path traversal blocked)' };\n }\n\n // Read the file - this is now atomic with the path check\n return { content: fs.readFileSync(filePath, 'utf8') };\n } catch (e) {\n const err = e as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n return { error: 'File not found' };\n }\n return { error: String(e) };\n }\n }\n\n /**\n * Check if security enforcement is enabled\n */\n isEnabled(): boolean {\n return this.allowlist.length > 0;\n }\n\n /**\n * Get the allowlist count\n */\n getAllowlistCount(): number {\n return this.allowlist.length;\n }\n\n /**\n * Validate that a spec is on the approved list and matches expected hash.\n *\n * @param specUrl - URL or file path to the spec to validate\n * @returns ValidationResult indicating if the spec is approved\n */\n async validate(specUrl: string): Promise<ValidationResult> {\n // CRITICAL: Check for path traversal BEFORE allowlist check\n // This prevents bypassing path security with skipHashVerification\n if (this.isPathTraversalAttempt(specUrl)) {\n return {\n valid: false,\n errorCode: 'DOWNLOAD_FAILED',\n specUrl,\n error: 'File path outside allowed directories (path traversal blocked)',\n };\n }\n\n // Find matching approved spec\n const approved = this.allowlist.find((a) => this.urlsMatch(a.url, specUrl));\n\n if (!approved) {\n return {\n valid: false,\n errorCode: 'SPEC_NOT_ON_ALLOWLIST',\n specUrl,\n error: this.formatAllowlistError(specUrl),\n };\n }\n\n // Skip hash verification if requested (dev mode)\n if (this.skipHashVerification) {\n return { valid: true, specUrl };\n }\n\n // Download/load and hash the spec\n const hashResult = await this.getHash(specUrl);\n\n if (hashResult.error) {\n return {\n valid: false,\n errorCode: 'DOWNLOAD_FAILED',\n specUrl,\n error: `Failed to fetch spec '${specUrl}': ${hashResult.error}`,\n };\n }\n\n // Validate hash formats before comparison (defense in depth)\n if (!this.isValidHex(hashResult.hash!)) {\n return {\n valid: false,\n errorCode: 'DOWNLOAD_FAILED',\n specUrl,\n error: 'Invalid hash format returned from download',\n };\n }\n\n if (!this.isValidHex(approved.sha256)) {\n return {\n valid: false,\n errorCode: 'DOWNLOAD_FAILED',\n specUrl,\n error: 'Invalid hash format in approved spec configuration',\n };\n }\n\n // Use timing-safe comparison to prevent timing attacks\n if (\n !crypto.timingSafeEqual(\n Buffer.from(hashResult.hash!, 'hex'),\n Buffer.from(approved.sha256, 'hex')\n )\n ) {\n return {\n valid: false,\n errorCode: 'SPEC_MODIFIED',\n specUrl,\n error: this.formatHashMismatchError(approved, hashResult.hash!),\n };\n }\n\n return { valid: true, specUrl };\n }\n\n /**\n * Validate multiple specs at once (batch validation).\n * Fails fast on first error.\n *\n * @param specUrls - Array of URLs/paths to validate\n * @returns Map of URL to ValidationResult\n */\n async validateAll(specUrls: string[]): Promise<Map<string, ValidationResult>> {\n const results = new Map<string, ValidationResult>();\n\n for (const url of specUrls) {\n const result = await this.validate(url);\n results.set(url, result);\n\n if (!result.valid) {\n // Fail fast - stop on first error\n return results;\n }\n }\n\n return results;\n }\n\n /**\n * Validate all specs and return all results (non-fail-fast).\n *\n * @param specUrls - Array of URLs/paths to validate\n * @returns Map of URL to ValidationResult\n */\n async validateAllComplete(specUrls: string[]): Promise<Map<string, ValidationResult>> {\n const results = new Map<string, ValidationResult>();\n\n for (const url of specUrls) {\n const result = await this.validate(url);\n results.set(url, result);\n }\n\n return results;\n }\n\n /**\n * Get content hash from cache or download.\n */\n private async getHash(url: string): Promise<{ hash?: string; error?: string }> {\n // Check cache\n const cached = this.cache.get(url);\n if (cached) {\n return { hash: cached.hash };\n }\n\n // Download content\n const contentResult = await this.download(url);\n if (contentResult.error) {\n return { error: contentResult.error };\n }\n\n const content = contentResult.content!;\n const hash = crypto.createHash('sha256').update(content).digest('hex');\n\n // Cache\n this.cache.set(url, { content, hash });\n\n return { hash };\n }\n\n /**\n * Download content from URL or file.\n * Includes path traversal and SSRF protection.\n */\n private async download(\n url: string,\n originalProtocol = ''\n ): Promise<{ content?: string; error?: string }> {\n // Check if it's a file path - use atomic method to prevent TOCTOU race conditions\n if (fs.existsSync(url)) {\n return this.readAllowedFile(url);\n }\n\n // Validate URL protocol\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n return { error: `Invalid URL protocol. Expected http:// or https://, got: ${url}` };\n }\n\n // Store original protocol for SSRF check on redirects\n const parsed = new URL(url);\n const requestProtocol = originalProtocol || parsed.protocol;\n\n // Download from URL\n return new Promise((resolve) => {\n const client = url.startsWith('https') ? https : http;\n\n const req = client.get(url, { timeout: 30000 }, (res) => {\n // Handle redirects with SSRF protection\n if (\n res.statusCode &&\n res.statusCode >= 300 &&\n res.statusCode < 400 &&\n res.headers.location\n ) {\n const location = res.headers.location;\n\n // Validate redirect is safe (SSRF protection)\n if (!this.isRedirectSafe(location, requestProtocol)) {\n resolve({ error: `Unsafe redirect target blocked: ${location}` });\n return;\n }\n\n // Follow redirect\n this.download(location, requestProtocol).then(resolve);\n return;\n }\n\n if (res.statusCode !== 200) {\n resolve({ error: `HTTP ${res.statusCode}` });\n return;\n }\n\n // Memory exhaustion protection - limit response size\n let data = '';\n let size = 0;\n res.on('data', (chunk: Buffer) => {\n size += chunk.length;\n if (size > this.MAX_RESPONSE_SIZE) {\n req.destroy();\n resolve({ error: `Response too large (>${this.MAX_RESPONSE_SIZE / 1024 / 1024}MB)` });\n return;\n }\n data += chunk;\n });\n res.on('end', () => resolve({ content: data }));\n res.on('error', (e) => resolve({ error: String(e) }));\n });\n\n req.on('error', (e) => resolve({ error: String(e) }));\n req.on('timeout', () => {\n req.destroy();\n resolve({ error: 'Request timeout (30s)' });\n });\n });\n }\n\n /**\n * Check if two URLs match (handles trailing slashes, case sensitivity, etc.).\n * Strips credentials and hash to prevent bypass via @ symbol.\n */\n private urlsMatch(url1: string, url2: string): boolean {\n const normalize = (u: string) => {\n try {\n const parsed = new URL(u);\n // Strip credentials and hash to prevent bypass via @ symbol\n const normalized = `${parsed.protocol}//${parsed.hostname}${parsed.pathname}`;\n return normalized.replace(/\\/$/, '').toLowerCase();\n } catch {\n // Not a URL, treat as file path - normalize separators and trailing slash\n return u.replace(/\\/$/, '').replace(/\\\\/g, '/').toLowerCase();\n }\n };\n\n return normalize(url1) === normalize(url2);\n }\n\n /**\n * Format error message for spec not on allowlist\n */\n private formatAllowlistError(specUrl: string): string {\n const lines = [`Spec '${specUrl}' is not on the approved list.`];\n\n if (this.allowlist.length === 0) {\n lines.push('');\n lines.push('No approved specs are configured.');\n lines.push('Add approved specs to stackwright.yml under prebuild.security.allowlist');\n } else {\n lines.push('');\n lines.push('Allowed specs:');\n for (const spec of this.allowlist) {\n lines.push(` • ${spec.name}`);\n lines.push(` ${spec.url}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format error message for hash mismatch\n */\n private formatHashMismatchError(approved: ApprovedSpec, actualHash: string): string {\n const lines = [\n `Spec '${approved.url}' has been modified since approval.`,\n '',\n 'Expected hash (approved): ' + approved.sha256,\n 'Actual hash (current): ' + actualHash,\n '',\n 'This may indicate:',\n ' • The spec has been updated on the server',\n ' • Network corruption during download',\n ' • A man-in-the-middle attack',\n '',\n 'If this is expected, update the sha256 in stackwright.yml.',\n ];\n\n return lines.join('\\n');\n }\n\n /**\n * Clear the download cache.\n * Useful for long-running processes.\n */\n clearCache(): void {\n this.cache.clear();\n }\n}\n","/**\n * Prebuild plugin types\n * TODO: Move to @stackwright/types package when created\n */\nexport interface PrebuildPluginContext {\n /** Parsed site configuration from stackwright.yml */\n siteConfig: Record<string, any>;\n /** Project root directory */\n projectRoot: string;\n}\n\nexport interface PrebuildPlugin {\n /** Plugin name */\n name: string;\n /** Called before build starts */\n beforeBuild?(context: PrebuildPluginContext): Promise<void>;\n /** Called after build completes */\n afterBuild?(context: PrebuildPluginContext): Promise<void>;\n}\n\nimport fs from 'fs';\nimport path from 'path';\nimport { OpenAPIParser } from '../parser/OpenAPIParser';\nimport { ZodSchemaGenerator } from '../compiler/ZodSchemaGenerator';\nimport { TypeGenerator } from '../compiler/TypeGenerator';\nimport { ActionGenerator } from '../compiler/ActionGenerator';\nimport { ClientGenerator, type SchemaMapping } from '../compiler/ClientGenerator';\nimport {\n CollectionProviderGenerator,\n type ProviderGenerationOptions,\n} from '../compiler/CollectionProviderGenerator';\nimport { SchemaResolver } from '../parser/SchemaResolver';\nimport { EndpointFilter } from '../utils/EndpointFilter';\nimport { ApprovedSpecsValidator } from '../utils/ApprovedSpecsValidator';\nimport type { OpenAPIConfig, PrebuildSecurityConfig } from '../types';\n\n/**\n * Prebuild plugin for OpenAPI integration\n *\n * Reads OpenAPI configuration from stackwright.yml and generates:\n * - Zod validation schemas\n * - TypeScript type definitions\n * - CollectionProvider implementations\n * - Typed API client functions\n *\n * All generated code is written to src/generated/{integrationName}/\n *\n * === Phase 2: Approved-Specs Enforcement ===\n *\n * Enterprise customers can enable security enforcement via stackwright.yml:\n *\n * ```yaml\n * prebuild:\n * security:\n * enabled: true\n * allowlist:\n * - name: logistics-api\n * url: https://api.gov.mil/logistics/v1/openapi.yaml\n * sha256: a1b2c3d4e5f6...\n * ```\n *\n * This ensures only approved API specs can generate code.\n */\nexport class OpenAPIPlugin implements PrebuildPlugin {\n name = '@stackwright-pro/openapi';\n\n async beforeBuild(context: PrebuildPluginContext): Promise<void> {\n const { siteConfig, projectRoot } = context;\n\n // Check for prebuild security config\n const prebuildConfig = (siteConfig.prebuild || {}) as Record<string, any>;\n const securityConfig = prebuildConfig.security as PrebuildSecurityConfig | undefined;\n\n let validator: ApprovedSpecsValidator | null = null;\n\n if (securityConfig?.enabled) {\n // Check for skip flag (development mode)\n const skipApprovedSpecs = process.argv.includes('--skip-approved-specs');\n\n if (skipApprovedSpecs) {\n // SECURITY: Block this flag in production/CI environments\n const isProductionBuild =\n process.env.NODE_ENV === 'production' || process.env.CI === 'true';\n\n if (isProductionBuild) {\n console.error('\\n❌ FATAL: --skip-approved-specs not allowed in production/CI builds\\n');\n throw new Error(\n 'SECURITY_CONFIG_VIOLATION: Cannot use --skip-approved-specs in production or CI environments'\n );\n }\n\n console.log(\n '\\n[@stackwright-pro/openapi] ⚠️ Approved-specs enforcement DISABLED (--skip-approved-specs)\\n'\n );\n console.log(' This is ONLY allowed in development mode.\\n');\n } else {\n validator = new ApprovedSpecsValidator(securityConfig);\n console.log('\\n[@stackwright-pro/openapi] 🔒 Approved-specs enforcement ENABLED');\n console.log(` Approved specs: ${validator.getAllowlistCount()}`);\n }\n }\n\n // Look for integrations config in site config\n const integrations = siteConfig.integrations as unknown[] | undefined;\n\n if (!integrations || !Array.isArray(integrations)) {\n // No integrations configured - silently skip\n return;\n }\n\n // Filter for OpenAPI integrations\n const openAPIIntegrations = integrations.filter(\n (int): int is OpenAPIConfig =>\n typeof int === 'object' && int !== null && 'name' in int && 'spec' in int\n );\n\n if (openAPIIntegrations.length === 0) {\n return;\n }\n\n // Batch validate all specs upfront if validator is enabled\n if (validator) {\n const specUrls = openAPIIntegrations.map((i) => i.spec);\n const results = await validator.validateAll(specUrls);\n\n for (const [url, result] of results) {\n if (!result.valid) {\n // Security rejection - fail hard\n this.printSecurityRejection(result);\n throw new Error(`SPEC_NOT_APPROVED: ${result.error}`);\n }\n\n console.log(` ✓ Approved: ${url}`);\n }\n }\n\n console.log(\n `\\n[@stackwright-pro/openapi] Processing ${openAPIIntegrations.length} integration(s)...`\n );\n\n // Process each OpenAPI integration\n for (const config of openAPIIntegrations) {\n await this.processIntegration(config, projectRoot);\n }\n\n console.log('[@stackwright-pro/openapi] Generation complete\\n');\n }\n\n /**\n * Print a security rejection error in a formatted box\n */\n private printSecurityRejection(result: { errorCode?: string; error?: string }): void {\n const lines: string[] = [];\n\n lines.push(\n '\\n╔══════════════════════════════════════════════════════════════════════════════╗'\n );\n lines.push(\n '║ 🔒 SECURITY REJECTED ║'\n );\n lines.push('╠══════════════════════════════════════════════════════════════════════════════╣');\n lines.push(`║ Error: ${(result.errorCode || 'UNKNOWN').padEnd(73)} ║`);\n lines.push('╠══════════════════════════════════════════════════════════════════════════════╣');\n\n // Print error message with proper wrapping\n const errorLines = (result.error || 'Unknown error').split('\\n');\n const maxLen = 76;\n\n for (const line of errorLines) {\n // Wrap long lines\n if (line.length <= maxLen) {\n lines.push(`║ ${line.padEnd(maxLen)} ║`);\n } else {\n // Split long lines\n let remaining = line;\n while (remaining.length > 0) {\n lines.push(`║ ${remaining.substring(0, maxLen).padEnd(maxLen)} ║`);\n remaining = remaining.substring(maxLen);\n }\n }\n }\n\n lines.push(\n '╚══════════════════════════════════════════════════════════════════════════════╝\\n'\n );\n\n for (const line of lines) {\n console.error(line);\n }\n }\n\n private async processIntegration(config: OpenAPIConfig, projectRoot: string): Promise<void> {\n const { name, spec, auth, mockUrl, collections, endpoints, actions } = config;\n\n console.log(` - Processing integration: ${name}`);\n\n // Filter out WebSocket collections — not yet supported by the prebuild pipeline\n const httpCollections = (collections || []).filter((c) => {\n if (c.transport === 'websocket') {\n console.warn(\n ` > Skipping collection \"${c.endpoint}\" (transport: websocket — not yet supported)`\n );\n return false;\n }\n return true;\n });\n\n // Nothing to do if this integration is WebSocket-only (no HTTP endpoints, no REST collections, no actions)\n const hasEndpoints = endpoints && (endpoints.include?.length || endpoints.exclude?.length);\n const hasActions = actions && actions.length > 0;\n if (httpCollections.length === 0 && !hasEndpoints && !hasActions) {\n console.log(\n ' > No HTTP endpoints or REST collections found — skipping (WebSocket-only integration not yet supported)'\n );\n return;\n }\n\n // Resolve spec path (can be URL or local file)\n const specPath = spec.startsWith('http') ? spec : path.resolve(projectRoot, spec);\n\n // Parse OpenAPI spec\n const parser = new OpenAPIParser();\n const { document } = await parser.parse(specPath);\n\n // Override servers array with mock URL if configured\n // This ensures generated client uses the Prism mock server\n if (mockUrl) {\n const originalServer = document.servers?.[0]?.url || 'unknown';\n document.servers = [{ url: mockUrl }];\n console.log(` > Using mock URL: ${mockUrl} (was: ${originalServer})`);\n }\n\n // Create endpoint filter\n const endpointFilter = new EndpointFilter(endpoints);\n\n // Log filter info if configured\n if (endpoints && (endpoints.include?.length || endpoints.exclude?.length)) {\n const includeStr = endpoints.include?.join(', ') || '/**';\n const excludeStr = endpoints.exclude?.length\n ? ` (exclude: ${endpoints.exclude.join(', ')})`\n : '';\n console.log(` > Filter: include [${includeStr}]${excludeStr}`);\n }\n\n // Create output directory\n const outputDir = path.join(projectRoot, 'src', 'generated', name);\n fs.mkdirSync(outputDir, { recursive: true });\n\n // Generate Zod schemas for all collections\n const schemaMapping = await this.generateSchemas(\n document,\n httpCollections,\n outputDir,\n name,\n endpointFilter\n );\n\n // Generate TypeScript types\n await this.generateTypes(document, httpCollections, outputDir, name);\n\n // Generate CollectionProvider\n if (httpCollections.length > 0) {\n await this.generateProvider(document, config, outputDir, name);\n }\n\n // Generate API client\n await this.generateClient(document, outputDir, name, schemaMapping, endpointFilter);\n\n // Generate CollectionAction implementations\n await this.generateActions(document, config, outputDir, name);\n\n console.log(` > Generated code in src/generated/${name}/`);\n }\n\n private async generateSchemas(\n document: any,\n collections: OpenAPIConfig['collections'],\n outputDir: string,\n integrationName: string,\n endpointFilter: EndpointFilter\n ): Promise<SchemaMapping> {\n const resolver = new SchemaResolver(document);\n const zodGenerator = new ZodSchemaGenerator();\n\n // Single import at top — all schemas use bare: true to avoid duplicates\n let schemasCode = `/**\n * Generated Zod schemas from OpenAPI spec\n * Integration: ${integrationName}\n * \n * DO NOT EDIT - This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n */\n\nimport { z } from 'zod';\n\n`;\n\n // Generate schema for each collection\n if (collections) {\n for (const collection of collections) {\n const { endpoint } = collection;\n // Use configured method, defaulting to GET\n const method = collection.method?.toLowerCase() ?? 'get';\n const schema = resolver.getResponseSchema(endpoint, method);\n\n if (!schema) {\n console.warn(` > No schema found for ${method.toUpperCase()} ${endpoint}`);\n continue;\n }\n\n const collectionName = this.sanitizeName(endpoint);\n const schemaName = `${this.capitalize(collectionName)}Schema`;\n\n // Check if response is array\n const isArray = schema.type === 'array';\n const itemSchema = isArray ? (schema as any).items : schema;\n\n // Generate Zod schema (bare = no duplicate imports)\n const zodCode = zodGenerator.generate(itemSchema, { schemaName, bare: true });\n\n schemasCode += zodCode + '\\n';\n\n // If response is array, create array schema too\n if (isArray) {\n schemasCode += `export const ${this.capitalize(collectionName)}ArraySchema = z.array(${schemaName});\\n\\n`;\n }\n }\n }\n\n // ========================================================================\n // Generate response schemas for filtered endpoints\n // ========================================================================\n schemasCode += '\\n// Response schemas for filtered endpoints\\n';\n\n // Track which schemas we've already generated\n const generatedSchemas = new Set<string>();\n let filteredCount = 0;\n\n const paths = document.paths || {};\n for (const [pathStr, pathItem] of Object.entries(paths) as [string, any][]) {\n // SKIP paths that don't match the filter\n if (!endpointFilter.matches(pathStr)) {\n filteredCount++;\n continue;\n }\n\n const methods = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const opId = operation.operationId || this.generateOperationId(pathStr, method);\n const responseSchemaName = `${this.getOperationTypeName(opId)}ResponseSchema`;\n\n // Skip if already generated\n if (generatedSchemas.has(responseSchemaName)) {\n continue;\n }\n\n // Get the response schema from OpenAPI spec\n const responseSchema = resolver.getResponseSchema(pathStr, method);\n if (!responseSchema) {\n console.warn(` > No response schema for ${method.toUpperCase()} ${pathStr}`);\n continue;\n }\n\n // Check if it's an array response\n const isArray = responseSchema.type === 'array';\n\n if (isArray && (responseSchema as any).items?.$ref) {\n // Array of component schema reference\n const componentName = this.extractComponentName((responseSchema as any).items.$ref);\n schemasCode += `export const ${responseSchemaName} = z.array(${componentName}Schema);\\n`;\n generatedSchemas.add(responseSchemaName);\n } else if ('$ref' in responseSchema && responseSchema.$ref) {\n // Direct component schema reference\n const componentName = this.extractComponentName(responseSchema.$ref as string);\n schemasCode += `export const ${responseSchemaName} = ${componentName}Schema;\\n`;\n generatedSchemas.add(responseSchemaName);\n } else if (isArray) {\n // Inline array schema (bare = no duplicate imports)\n const zodCode = zodGenerator.generate(responseSchema, {\n schemaName: responseSchemaName,\n bare: true,\n });\n schemasCode += zodCode + '\\n';\n generatedSchemas.add(responseSchemaName);\n } else {\n // Inline object schema (bare = no duplicate imports)\n const zodCode = zodGenerator.generate(responseSchema, {\n schemaName: responseSchemaName,\n bare: true,\n });\n schemasCode += zodCode + '\\n';\n generatedSchemas.add(responseSchemaName);\n }\n }\n }\n\n if (filteredCount > 0) {\n console.log(` > Skipped ${filteredCount} paths (filtered)`);\n }\n\n // Build schema mapping for ClientGenerator (only for filtered endpoints WITH generated schemas)\n const schemaMapping: SchemaMapping = {};\n\n for (const [pathStr, pathItem] of Object.entries(paths) as [string, any][]) {\n // Only include filtered paths\n if (!endpointFilter.matches(pathStr)) {\n continue;\n }\n\n const methods = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\n for (const method of methods) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const opId = operation.operationId || this.generateOperationId(pathStr, method);\n const responseSchemaName = `${this.getOperationTypeName(opId)}ResponseSchema`;\n\n // Only map if the schema was actually generated (avoids referencing missing schemas)\n if (!generatedSchemas.has(responseSchemaName)) continue;\n\n schemaMapping[opId] = {\n requestSchema: null, // ClientGenerator handles request schema generation + type inference\n responseSchema: responseSchemaName,\n };\n }\n }\n\n // Write schemas file\n fs.writeFileSync(path.join(outputDir, 'schemas.ts'), schemasCode);\n\n return schemaMapping;\n }\n\n private async generateTypes(\n document: any,\n collections: OpenAPIConfig['collections'],\n outputDir: string,\n integrationName: string\n ): Promise<void> {\n let typesCode = `/**\n * Generated TypeScript types from OpenAPI spec\n * Integration: ${integrationName}\n * \n * DO NOT EDIT - This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n */\n\nimport type { z } from 'zod';\nimport type * as schemas from './schemas';\n\n`;\n\n // Infer types from schemas — only for collections that have a generated response schema\n if (collections) {\n const resolver = new SchemaResolver(document);\n for (const collection of collections) {\n const schema = resolver.getResponseSchema(\n collection.endpoint,\n collection.method?.toLowerCase() ?? 'get'\n );\n if (!schema) continue; // No schema generated, skip type\n\n const collectionName = this.sanitizeName(collection.endpoint);\n const typeName = this.capitalize(collectionName);\n const schemaName = `${typeName}Schema`;\n\n typesCode += `export type ${typeName} = z.infer<typeof schemas.${schemaName}>;\\n`;\n }\n }\n\n // Write types file\n fs.writeFileSync(path.join(outputDir, 'types.ts'), typesCode);\n }\n\n private async generateProvider(\n document: any,\n config: OpenAPIConfig,\n outputDir: string,\n integrationName: string\n ): Promise<void> {\n const generator = new CollectionProviderGenerator(document);\n const { collections, auth } = config;\n\n if (!collections || collections.length === 0) {\n return;\n }\n\n // Collect all schema imports needed\n const schemaImports = new Set<string>();\n\n // Generate each provider class with bare=true (no imports)\n const classBlocks: string[] = [];\n\n for (const collection of collections) {\n const collectionConfig = {\n endpoint: collection.endpoint,\n slugField: collection.slug_field,\n ...(collection.method !== undefined && { method: collection.method }),\n filters: collection.filters,\n };\n\n const providerOptions: ProviderGenerationOptions = { bare: true };\n\n if (auth) {\n if (auth.type === 'bearer' || auth.type === 'apiKey') {\n providerOptions.auth = {\n type: auth.type,\n ...(auth.type === 'apiKey' && { headerName: 'X-API-Key' }),\n };\n } else if (auth.type === 'oauth2') {\n console.warn(\n ` > OAuth2 auth not yet supported for ${collection.endpoint} (coming soon)`\n );\n }\n }\n\n const code = generator.generate(collectionConfig, providerOptions);\n classBlocks.push(code);\n\n // Track needed schema imports — only when a response schema was found\n const collectionName = this.sanitizeName(collection.endpoint);\n const resolver = new SchemaResolver(document);\n const schema = resolver.getResponseSchema(\n collection.endpoint,\n collection.method?.toLowerCase() ?? 'get'\n );\n if (schema) {\n const isArray = schema.type === 'array';\n if (isArray) {\n schemaImports.add(`${this.capitalize(collectionName)}ArraySchema`);\n } else {\n schemaImports.add(`${this.capitalize(collectionName)}Schema`);\n }\n }\n }\n\n // Determine if any collection needs z (unknownFallback — no response schema)\n const needsZodImport = classBlocks.some((block) => block.includes('z.unknown()'));\n\n // Assemble the file with a single import block\n const zodImportLine = needsZodImport\n ? `import { z } from 'zod';\n`\n : '';\n const schemaImportLine =\n schemaImports.size > 0\n ? `import { ${Array.from(schemaImports).join(', ')} } from './schemas';\n`\n : '';\n\n let providerCode = `/**\n * Generated CollectionProvider from OpenAPI spec\n * Integration: ${integrationName}\n * \n * DO NOT EDIT - This file is auto-generated by @stackwright-pro/openapi\n * Regenerate by running: pnpm prebuild\n */\n\nimport type { CollectionProvider, CollectionEntry, CollectionListOptions, CollectionListResult } from '@stackwright/collections';\n${zodImportLine}${schemaImportLine}\n`;\n\n providerCode += classBlocks.join('\\n');\n\n // Write provider file\n fs.writeFileSync(path.join(outputDir, 'provider.ts'), providerCode);\n }\n\n private async generateActions(\n document: any,\n config: OpenAPIConfig,\n outputDir: string,\n integrationName: string\n ): Promise<void> {\n const { actions } = config;\n\n if (!actions || actions.length === 0) {\n return;\n }\n\n // Derive client class name — same logic as generateClient() to stay DRY\n const clientClassName = `${this.capitalize(integrationName)}Client`;\n\n const generator = new ActionGenerator(document);\n const code = generator.generate(actions, integrationName, clientClassName);\n\n fs.writeFileSync(path.join(outputDir, 'actions.ts'), code);\n console.log(\n ` > Generated actions.ts (${actions.length} action${actions.length === 1 ? '' : 's'})`\n );\n }\n\n private async generateClient(\n document: any,\n outputDir: string,\n integrationName: string,\n schemaMapping: SchemaMapping,\n endpointFilter: EndpointFilter\n ): Promise<void> {\n // Count endpoints that will be filtered\n const paths = document.paths || {};\n let filteredEndpoints = 0;\n for (const pathStr of Object.keys(paths)) {\n if (!endpointFilter.matches(pathStr)) {\n filteredEndpoints++;\n }\n }\n\n if (filteredEndpoints > 0) {\n console.log(\n ` > Generating client for ${Object.keys(paths).length - filteredEndpoints} endpoints (${filteredEndpoints} filtered)`\n );\n }\n\n const generator = new ClientGenerator(document);\n // Generate the client with custom class name\n const className = `${this.capitalize(integrationName)}Client`;\n const clientCode = generator.generate({\n className,\n includeJsDoc: true,\n schemaMapping,\n validateResponses: true,\n strictValidation: false,\n });\n\n // Write client file\n fs.writeFileSync(path.join(outputDir, 'client.ts'), clientCode);\n }\n\n private extractComponentName(ref: string): string {\n // Extract component name from $ref\n // Example: #/components/schemas/Equipment -> Equipment\n const parts = ref.split('/');\n const lastPart = parts[parts.length - 1];\n return lastPart ?? ref;\n }\n\n private getOperationTypeName(operationId: string): string {\n // Convert operationId to PascalCase for type names\n // Example: listEquipment -> ListEquipment\n return operationId.charAt(0).toUpperCase() + operationId.slice(1);\n }\n\n private generateOperationId(pathStr: string, method: string): string {\n const sanitized = this.sanitizeName(pathStr);\n return `${method}${this.capitalize(sanitized)}`;\n }\n\n private getResponseSchemaName(pathStr: string, method: string): string {\n const sanitized = this.sanitizeName(pathStr);\n const baseName = this.capitalize(sanitized);\n\n // GET /equipment -> ListEquipmentResponseSchema / EquipmentArraySchema\n if (method === 'get' && !pathStr.includes('{')) {\n return `${baseName}ArraySchema`;\n }\n\n // GET /equipment/{id} -> EquipmentSchema (single item)\n return `${baseName}Schema`;\n }\n\n private sanitizeName(pathStr: string): string {\n return pathStr.replace(/^\\//, '').replace(/\\//g, '-').replace(/[{}:]/g, '').replace(/-+/g, '-');\n }\n\n private capitalize(str: string): string {\n return str\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n }\n}\n\n/**\n * Factory function to create the plugin instance\n *\n * Usage in user's prebuild script:\n * ```typescript\n * const { createOpenAPIPlugin } = require('@stackwright-pro/openapi/prebuild');\n * runPrebuild({ plugins: [createOpenAPIPlugin()] });\n * ```\n */\nexport function createOpenAPIPlugin(): PrebuildPlugin {\n return new OpenAPIPlugin();\n}\n","import { isIP } from 'net';\nimport type { ZodSchema } from 'zod';\n\n/**\n * Blocked host patterns for SSRF prevention\n */\nconst BLOCKED_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\./, // Loopback (127.0.0.0/8)\n /^10\\./, // Class A private (10.0.0.0/8)\n /^172\\.(1[6-9]|2[0-9]|3[0-1])\\./, // Class B private (172.16.0.0/12)\n /^192\\.168\\./, // Class C private (192.168.0.0/16)\n /^169\\.254\\./, // Link-local (169.254.0.0/16) - AWS/GCP metadata\n /^0\\./, // Current network (0.0.0.0/8)\n /^::1$/, // IPv6 loopback (no brackets)\n /^\\[::1\\]$/i, // IPv6 loopback (with brackets)\n /^[fF][cCdD][0-9a-fA-F]{2}:/, // IPv6 private (fc00::/7)\n /^169\\.254\\.169\\.254$/i, // AWS metadata endpoint\n /^metadata\\.googleapis\\.com$/i, // GCP metadata endpoint\n /^metadata\\.azure\\.com$/i, // Azure metadata endpoint\n /^imds\\.azure\\.com$/i, // Azure IMDS endpoint\n /^100\\.100\\.100\\.200$/, // Alibaba Cloud metadata\n];\n\n/**\n * Blocked IPv6 prefixes for SSRF prevention\n * Extracted as a named constant for explicit auditability\n */\nconst BLOCKED_IPV6_PREFIXES = [\n '::1', // Loopback\n 'fe80:', // Link-local\n 'fc', // Unique local (fc00::/7 — covers fc00:: through fcff::)\n 'fd', // Unique local (short form)\n];\n\n/**\n * Allowed protocols for outbound requests\n */\nconst ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\n/**\n * NOTE: Validates the URL structure and hostname at call time.\n * Does NOT re-validate after DNS resolution (DNS rebinding).\n * This is acceptable for build-time prebuild use.\n * DO NOT reuse this function for runtime server-side request proxying\n * without adding post-resolution IP validation.\n */\n\n/**\n * Validates that a URL is safe to fetch (SSRF prevention).\n * Exported for use by external consumers and tests.\n *\n * @throws Error if URL targets internal networks or disallowed protocols\n */\nexport function validateUrlSafe(baseUrl: string): URL {\n let url: URL;\n\n try {\n url = new URL(baseUrl);\n } catch {\n throw new Error('SECURITY: baseUrl must be a valid absolute URL');\n }\n\n // Protocol validation\n if (!ALLOWED_PROTOCOLS.includes(url.protocol)) {\n throw new Error('SECURITY: Only HTTP and HTTPS protocols are allowed, got ' + url.protocol);\n }\n\n // Host validation against known-bad patterns\n const hostname = url.hostname.toLowerCase();\n\n for (const pattern of BLOCKED_HOST_PATTERNS) {\n if (pattern.test(hostname)) {\n throw new Error('SECURITY: Blocked internal network address: ' + hostname);\n }\n }\n\n // Deep IPv4 CIDR check for private ranges\n const ip = url.hostname;\n if (/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(ip)) {\n const octets = ip.split('.').map(Number);\n\n // With noUncheckedIndexedAccess, we need to check array bounds\n const first = octets[0];\n const second = octets[1];\n\n // 127.x.x.x\n if (first !== undefined && first === 127) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 10.x.x.x\n if (first !== undefined && first === 10) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 172.16.x.x - 172.31.x.x\n if (\n first !== undefined &&\n second !== undefined &&\n first === 172 &&\n second >= 16 &&\n second <= 31\n ) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 192.168.x.x (RFC 1918 private)\n if (first !== undefined && second !== undefined && first === 192 && second === 168) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 169.254.x.x (link-local)\n if (first !== undefined && second !== undefined && first === 169 && second === 254) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n\n // 0.x.x.x (current network)\n if (first !== undefined && first === 0) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n }\n\n // Strip brackets for IPv6 addresses (e.g., [::1] -> ::1)\n // This is required for isIP() to work correctly\n const cleanHostname = hostname.replace(/^\\[|\\]$/g, '');\n\n // Deep IPv6 check via isIP from 'net'\n const ipVersion = isIP(cleanHostname);\n if (ipVersion === 6) {\n // Check against explicit auditable prefix list\n for (const prefix of BLOCKED_IPV6_PREFIXES) {\n if (cleanHostname.startsWith(prefix)) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n }\n\n // Check IPv4-mapped addresses (::ffff:x.x.x.x) — tunneled private IPs\n if (cleanHostname.startsWith('::ffff:')) {\n const mapped = cleanHostname.slice('::ffff:'.length); // e.g. \"c0a8:101\" or \"192.168.1.1\"\n\n let octets: number[] | null = null;\n\n // Case 1: decimal dotted notation (defense-in-depth; URL parser normalizes this away)\n const decMatch = mapped.match(/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/);\n if (decMatch) {\n octets = decMatch.slice(1, 5).map(Number);\n }\n\n // Case 2: hex group notation — the form URL constructor actually produces\n // e.g. \"c0a8:101\" => 192.168.1.1, \"a9fe:a9fe\" => 169.254.169.254\n const hexMatch = mapped.match(/^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);\n if (!octets && hexMatch && hexMatch[1] !== undefined && hexMatch[2] !== undefined) {\n const high = parseInt(hexMatch[1], 16);\n const low = parseInt(hexMatch[2], 16);\n octets = [(high >> 8) & 0xff, high & 0xff, (low >> 8) & 0xff, low & 0xff];\n }\n\n if (octets !== null) {\n const o0 = octets[0];\n const o1 = octets[1];\n if (\n o0 === 127 || // 127.0.0.0/8 loopback\n o0 === 10 || // 10.0.0.0/8 private\n o0 === 0 || // 0.0.0.0/8 current network\n (o0 === 172 && o1 !== undefined && o1 >= 16 && o1 <= 31) || // 172.16/12 private\n (o0 === 192 && o1 === 168) || // 192.168/16 private\n (o0 === 169 && o1 === 254) // 169.254/16 link-local / IMDS\n ) {\n throw new Error('SECURITY: Base URL resolves to private IP');\n }\n // Allow public IPv4-mapped addresses (e.g., ::ffff:8.8.8.8 → ::ffff:808:808)\n } else {\n // Unrecognised ::ffff: format — fail closed\n throw new Error('SECURITY: Base URL resolves to unrecognisable IPv4-mapped address');\n }\n }\n }\n\n return url;\n}\n\n/**\n * Alias for validateUrlSafe — backward compatibility export\n */\nexport const isUrlSafe = validateUrlSafe;\n\n/**\n * Validates endpoint for path traversal\n */\nfunction validateEndpoint(endpoint: string): void {\n if (endpoint.includes('..')) {\n throw new Error('SECURITY: Path traversal detected in endpoint');\n }\n\n if (endpoint.includes('\\\\')) {\n throw new Error('SECURITY: Backslash detected in endpoint');\n }\n}\n\n/**\n * Configuration for OpenAPI source adapter\n */\nexport interface OpenAPISourceConfig<T = unknown> {\n /** Base URL of the API */\n baseUrl: string;\n\n /** API endpoint path */\n endpoint: string;\n\n /** HTTP method (default: 'get') */\n method?: 'get' | 'post' | 'put' | 'patch' | 'delete';\n\n /** Optional query parameters */\n params?: Record<string, string | number | boolean>;\n\n /** Optional request body */\n body?: unknown;\n\n /** Optional headers */\n headers?: Record<string, string>;\n\n /** Optional Zod schema for validation */\n schema?: ZodSchema<T>;\n\n /** Authentication config */\n auth?: {\n type: 'bearer' | 'apiKey';\n token?: string;\n apiKey?: string;\n headerName?: string;\n };\n}\n\n/**\n * Creates a fetcher function from OpenAPI configuration\n *\n * @example\n * ```typescript\n * const fetcher = createOpenAPIFetcher({\n * baseUrl: 'https://api.example.com',\n * endpoint: '/equipment',\n * auth: { type: 'bearer', token: process.env.API_TOKEN }\n * });\n *\n * // Use with Pulse\n * <Pulse fetcher={fetcher} interval={5000} />\n * ```\n */\nexport function createOpenAPIFetcher<T = unknown>(\n config: OpenAPISourceConfig<T>\n): () => Promise<T> {\n const { baseUrl, endpoint, method = 'get', params, body, headers = {}, auth, schema } = config;\n\n // Validate URLs (SSRF prevention)\n const validatedBaseUrl = validateUrlSafe(baseUrl);\n validateEndpoint(endpoint);\n\n return async (): Promise<T> => {\n // Build URL with query params\n const url = new URL(endpoint, validatedBaseUrl.toString());\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n url.searchParams.append(key, String(value));\n });\n }\n\n // Build headers\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...headers,\n };\n\n // Add auth\n if (auth) {\n if (auth.type === 'bearer' && auth.token) {\n requestHeaders['Authorization'] = `Bearer ${auth.token}`;\n } else if (auth.type === 'apiKey' && auth.apiKey) {\n requestHeaders[auth.headerName ?? 'X-API-Key'] = auth.apiKey;\n }\n }\n\n // Make request (only include body for methods that support it)\n const supportsBody = ['post', 'put', 'patch', 'delete'].includes(method);\n const response = await fetch(url.toString(), {\n method: method.toUpperCase(),\n headers: requestHeaders,\n body: supportsBody && body ? JSON.stringify(body) : null,\n redirect: 'error', // Prevent SSRF via 301/302 redirect to internal addresses\n });\n\n // Sanitize error message (don't expose server details)\n if (!response.ok) {\n const safeStatus = response.status;\n throw new Error('API error: ' + safeStatus);\n }\n\n const result = await response.json();\n\n // Validate with schema if provided\n if (schema) {\n return schema.parse(result) as T;\n }\n\n return result as T;\n };\n}\n"]}