schemock 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +82 -0
- package/dist/adapters/index.d.mts +1364 -0
- package/dist/adapters/index.d.ts +1364 -0
- package/dist/adapters/index.js +36988 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +36972 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/cli/index.d.mts +831 -0
- package/dist/cli/index.d.ts +831 -0
- package/dist/cli/index.js +4425 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +4401 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/cli.js +6776 -0
- package/dist/index.d.mts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +39439 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +39367 -0
- package/dist/index.mjs.map +1 -0
- package/dist/middleware/index.d.mts +688 -0
- package/dist/middleware/index.d.ts +688 -0
- package/dist/middleware/index.js +921 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/index.mjs +899 -0
- package/dist/middleware/index.mjs.map +1 -0
- package/dist/react/index.d.mts +316 -0
- package/dist/react/index.d.ts +316 -0
- package/dist/react/index.js +466 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +456 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/runtime/index.d.mts +814 -0
- package/dist/runtime/index.d.ts +814 -0
- package/dist/runtime/index.js +1270 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/index.mjs +1246 -0
- package/dist/runtime/index.mjs.map +1 -0
- package/dist/schema/index.d.mts +838 -0
- package/dist/schema/index.d.ts +838 -0
- package/dist/schema/index.js +696 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +681 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/types-C1MiZh1d.d.ts +96 -0
- package/dist/types-C2bd2vgy.d.mts +773 -0
- package/dist/types-C2bd2vgy.d.ts +773 -0
- package/dist/types-C9VMgu3E.d.mts +289 -0
- package/dist/types-DV2DS7wj.d.mts +96 -0
- package/dist/types-c2AN3vky.d.ts +289 -0
- package/package.json +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/types.ts","../../src/cli/config.ts","../../src/schema/types.ts","../../src/cli/discover.ts","../../src/cli/utils/pluralize.ts","../../src/cli/utils/faker-mapping.ts","../../src/cli/utils/type-mapping.ts","../../src/cli/analyze.ts","../../src/cli/analyze-endpoints.ts","../../src/cli/utils/code-builder.ts","../../src/cli/generators/types.ts","../../src/cli/generators/mock/db.ts","../../src/cli/generators/shared/rls.ts","../../src/cli/generators/mock/handlers.ts","../../src/cli/generators/mock/client.ts","../../src/cli/generators/mock/seed.ts","../../src/cli/generators/mock/routes.ts","../../src/cli/generators/mock/endpoints.ts","../../src/cli/generators/supabase/client.ts","../../src/cli/generators/firebase/client.ts","../../src/cli/generators/fetch/client.ts","../../src/cli/generators/pglite/db.ts","../../src/cli/generators/pglite/client.ts","../../src/cli/generators/pglite/seed.ts","../../src/cli/generators/hooks.ts","../../src/cli/commands/generate.ts"],"names":["z","resolve","existsSync","spawnSync","readdir","stat","relative","toPascalCase","analyzeField","fieldToTsType","generateEntityApi","generateRelationLoad","generateCreateMethod","mkdir","join","writeFile"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * CLI type definitions for Schemock code generation\n *\n * @module cli/types\n * @category CLI\n */\n\nimport type { EntitySchema, RLSConfig, RLSFilter, RLSContext, RLSScopeMapping, RLSBypass, IndexConfig, RPCConfig, RPCArgument } from '../schema/types';\n\n// Re-export types for generators\nexport type { RLSConfig, RLSFilter, RLSContext, RLSScopeMapping, RLSBypass, IndexConfig, RPCConfig, RPCArgument } from '../schema/types';\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Faker mapping configuration for custom data generation\n */\nexport interface FakerMapping {\n /** Match field.hint */\n hint?: string;\n /** Match field.type */\n type?: string;\n /** Match field name with regex */\n fieldName?: RegExp;\n /** Faker call to generate */\n call: string;\n}\n\n/**\n * Mock adapter configuration\n */\nexport interface MockAdapterConfig {\n /** Default seed counts per entity */\n seed?: Record<string, number>;\n /** Simulated network delay (ms) */\n delay?: number;\n /** Faker seed for reproducible data */\n fakerSeed?: number;\n /** Enable localStorage persistence (default: true) */\n persist?: boolean;\n /** localStorage key prefix (default: 'schemock') */\n storageKey?: string;\n}\n\n/**\n * Supabase adapter configuration\n */\nexport interface SupabaseAdapterConfig {\n /** Schema name -> table name mapping */\n tableMap?: Record<string, string>;\n /** Environment variable prefix */\n envPrefix?: string;\n}\n\n/**\n * Firebase adapter configuration\n */\nexport interface FirebaseAdapterConfig {\n /** Schema name -> collection name mapping */\n collectionMap?: Record<string, string>;\n}\n\n/**\n * Fetch adapter configuration\n */\nexport interface FetchAdapterConfig {\n /** API base URL */\n baseUrl?: string;\n /** Pattern for endpoints */\n endpointPattern?: string;\n}\n\n/**\n * GraphQL adapter configuration\n */\nexport interface GraphQLAdapterConfig {\n /** Operation name patterns */\n operations?: {\n findOne?: string;\n findMany?: string;\n create?: string;\n update?: string;\n delete?: string;\n };\n}\n\n/**\n * PGlite adapter configuration\n */\nexport interface PGliteAdapterConfig {\n /** Persistence mode */\n persistence?: 'memory' | 'indexeddb' | 'opfs';\n /** Data directory (for IndexedDB: 'idb://name', for OPFS: 'opfs://name') */\n dataDir?: string;\n /** Faker seed for reproducible data */\n fakerSeed?: number;\n /** Default seed counts per entity */\n seed?: Record<string, number>;\n}\n\n/**\n * Pluralization configuration\n */\nexport interface PluralizeConfig {\n /** Custom pluralization overrides */\n custom?: Record<string, string>;\n}\n\n/**\n * Main Schemock configuration\n */\nexport interface SchemockConfig {\n /** Schema discovery glob pattern */\n schemas: string;\n /** Output directory */\n output: string;\n /** Default adapter type */\n adapter: 'mock' | 'supabase' | 'firebase' | 'fetch' | 'graphql' | 'pglite';\n /** API prefix */\n apiPrefix: string;\n /** Pluralization overrides */\n pluralization?: PluralizeConfig;\n /** Custom faker mappings (extend defaults) */\n fakerMappings?: FakerMapping[];\n /** Adapter-specific configuration */\n adapters?: {\n mock?: MockAdapterConfig;\n supabase?: SupabaseAdapterConfig;\n firebase?: FirebaseAdapterConfig;\n fetch?: FetchAdapterConfig;\n graphql?: GraphQLAdapterConfig;\n pglite?: PGliteAdapterConfig;\n };\n}\n\n// ============================================================================\n// Analysis Types\n// ============================================================================\n\n/**\n * Analyzed field with all computed properties\n */\nexport interface AnalyzedField {\n name: string;\n /** Original type */\n type: string;\n /** TypeScript type */\n tsType: string;\n /** Faker.js call for mock generation */\n fakerCall: string;\n\n // Flags\n nullable: boolean;\n unique: boolean;\n readOnly: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n\n // Reference info\n isRef: boolean;\n refTarget?: string;\n\n // Enum info\n isEnum: boolean;\n enumValues?: string[];\n\n // Array/Object info\n isArray: boolean;\n isObject: boolean;\n itemType?: AnalyzedField;\n shape?: Record<string, AnalyzedField>;\n\n // Computed field flag\n isComputed?: boolean;\n\n // Constraints\n min?: number;\n max?: number;\n pattern?: string;\n}\n\n/**\n * Analyzed relation with computed properties\n */\nexport interface AnalyzedRelation {\n name: string;\n type: 'hasOne' | 'hasMany' | 'belongsTo' | 'manyToMany';\n target: string;\n targetPascal: string;\n foreignKey: string;\n\n /** For belongsTo - FK is on this entity */\n localField?: string;\n\n /** For manyToMany - junction table */\n through?: string;\n /** For manyToMany - other FK */\n otherKey?: string;\n\n /** Always load */\n eager: boolean;\n\n /** True if FK was inferred (not explicitly specified or using default fallback) */\n inferred?: boolean;\n}\n\n/**\n * Analyzed computed field\n */\nexport interface AnalyzedComputed {\n name: string;\n type: string;\n tsType: string;\n}\n\n/**\n * Analyzed RLS configuration for code generation\n */\nexport interface AnalyzedRLS {\n /** Has any RLS policies defined */\n enabled: boolean;\n /** Has select policy */\n hasSelect: boolean;\n /** Has insert policy */\n hasInsert: boolean;\n /** Has update policy */\n hasUpdate: boolean;\n /** Has delete policy */\n hasDelete: boolean;\n /** Scope mappings (row field -> context key) */\n scope: RLSScopeMapping[];\n /** Bypass conditions */\n bypass: RLSBypass[];\n /** Serialized function source for select policy */\n selectSource?: string;\n /** Serialized function source for insert policy */\n insertSource?: string;\n /** Serialized function source for update policy */\n updateSource?: string;\n /** Serialized function source for delete policy */\n deleteSource?: string;\n /** Raw SQL policies (for PostgreSQL) */\n sql?: {\n select?: string;\n insert?: string;\n update?: string;\n delete?: string;\n };\n /** Original RLS config reference */\n original?: RLSConfig;\n}\n\n/**\n * Analyzed database index with computed properties\n */\nexport interface AnalyzedIndex {\n /** Index name (auto-generated or user-defined) */\n name: string;\n /** Table name this index belongs to */\n tableName: string;\n /** Column names in the index */\n fields: string[];\n /** Index type */\n type: 'btree' | 'hash' | 'gin' | 'gist' | 'brin';\n /** Is unique index */\n unique: boolean;\n /** Custom expression for functional indexes */\n using?: string;\n /** Partial index condition (WHERE clause) */\n where?: string;\n /** Use CONCURRENTLY */\n concurrently: boolean;\n /** Auto-generated (FK, unique field) vs user-defined */\n autoGenerated: boolean;\n}\n\n/**\n * Analyzed RPC/stored procedure function\n */\nexport interface AnalyzedRPC {\n /** Function name */\n name: string;\n /** Related entity name */\n entityName: string;\n /** Table name for SQL */\n tableName: string;\n /** Function arguments with PostgreSQL types */\n args: Array<{\n name: string;\n type: string;\n pgType: string;\n default?: string;\n }>;\n /** Return type (entity name, 'void', or PostgreSQL type) */\n returns: string;\n /** PostgreSQL return type for SQL */\n pgReturns: string;\n /** Is array return (SETOF) */\n returnsArray: boolean;\n /** SQL function body */\n sql: string;\n /** Function language */\n language: 'sql' | 'plpgsql';\n /** Volatility marker */\n volatility: 'volatile' | 'stable' | 'immutable';\n /** Security context */\n security: 'invoker' | 'definer';\n /** Function description */\n description?: string;\n}\n\n/**\n * Fully analyzed schema with all computed properties\n */\nexport interface AnalyzedSchema {\n // Names\n /** Original name (as defined in schema) */\n name: string;\n /** Singularized name (user, post) */\n singularName: string;\n /** Pluralized name (users, posts) */\n pluralName: string;\n /** PascalCase singular name (User, Post) */\n pascalName: string;\n /** PascalCase singular name (alias for pascalName) */\n pascalSingularName: string;\n /** PascalCase plural name (Users, Posts) */\n pascalPluralName: string;\n /** DB table name */\n tableName: string;\n /** API endpoint */\n endpoint: string;\n\n // Structure\n fields: AnalyzedField[];\n relations: AnalyzedRelation[];\n computed: AnalyzedComputed[];\n\n // Dependencies (for topological sort)\n dependsOn: string[];\n\n // Flags\n hasTimestamps: boolean;\n /** Only refs + maybe enum (junction table) */\n isJunctionTable: boolean;\n\n // Row-Level Security\n rls: AnalyzedRLS;\n\n // Database indexes\n indexes: AnalyzedIndex[];\n\n // RPC/Stored procedures\n rpc: AnalyzedRPC[];\n\n // Original schema reference\n original: EntitySchema;\n}\n\n// ============================================================================\n// Analyzed Endpoint Types\n// ============================================================================\n\n/**\n * Analyzed field for endpoint params/body/response\n */\nexport interface AnalyzedEndpointField {\n /** Field name */\n name: string;\n /** Original type */\n type: string;\n /** TypeScript type */\n tsType: string;\n /** Is required (no default) */\n required: boolean;\n /** Has default value */\n hasDefault: boolean;\n /** Default value */\n default?: unknown;\n /** Is array type */\n isArray: boolean;\n /** Is object type */\n isObject: boolean;\n /** Nested fields for objects */\n shape?: AnalyzedEndpointField[];\n /** Item type for arrays */\n itemType?: AnalyzedEndpointField;\n /** Enum values if enum type */\n enumValues?: string[];\n}\n\n/**\n * Fully analyzed endpoint with all computed properties\n */\nexport interface AnalyzedEndpoint {\n /** Original URL path */\n path: string;\n /** HTTP method */\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Endpoint name (derived from path) */\n name: string;\n /** PascalCase name for types */\n pascalName: string;\n /** Path parameters extracted from path (e.g., :id -> ['id']) */\n pathParams: string[];\n /** Analyzed query/path parameters */\n params: AnalyzedEndpointField[];\n /** Analyzed body fields */\n body: AnalyzedEndpointField[];\n /** Analyzed response fields */\n response: AnalyzedEndpointField[];\n /** Serialized mock resolver function source */\n mockResolverSource: string;\n /** Description */\n description?: string;\n}\n\n// ============================================================================\n// Generate Command Types\n// ============================================================================\n\n/**\n * Options for the generate command\n */\nexport interface GenerateOptions {\n /** Adapter type to generate */\n adapter?: string;\n /** Output directory */\n output?: string;\n /** Config file path */\n config?: string;\n /** Watch mode */\n watch?: boolean;\n /** Show what would be generated without writing */\n dryRun?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\n/**\n * Options for the generate:sql command\n */\nexport interface GenerateSQLOptions {\n /** Output directory for SQL files */\n output?: string;\n /** Generate combined single file vs separate files */\n combined?: boolean;\n /** Target platform */\n target?: 'postgres' | 'supabase' | 'pglite';\n /** Generate only specific sections */\n only?: ('tables' | 'foreign-keys' | 'indexes' | 'rls' | 'functions' | 'triggers')[];\n /** Include README documentation */\n readme?: boolean;\n /** Show what would be generated without writing */\n dryRun?: boolean;\n /** Verbose output */\n verbose?: boolean;\n /** Config file path */\n config?: string;\n}\n\n/**\n * SQL generator result\n */\nexport interface SQLGeneratorResult {\n /** Combined SQL (if mode=combined) */\n combined?: string;\n /** Separate files (if mode=separate) */\n files?: {\n tables: string;\n foreignKeys: string;\n indexes: string;\n rls: string;\n functions: string;\n triggers: string;\n };\n /** Summary counts for README */\n summary: {\n tables: number;\n foreignKeys: number;\n indexes: number;\n rlsPolicies: number;\n functions: number;\n triggers: number;\n };\n}\n\n/**\n * Helper function for type-safe config\n */\nexport function defineConfig(config: Partial<SchemockConfig>): SchemockConfig {\n return {\n schemas: './src/schemas/**/*.ts',\n output: './src/generated',\n adapter: 'mock',\n apiPrefix: '/api',\n ...config,\n };\n}\n","/**\n * Configuration loader for Schemock CLI\n *\n * @module cli/config\n * @category CLI\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { z } from 'zod';\nimport type { SchemockConfig } from './types';\n\n// ============================================================================\n// Zod Schema for Config Validation\n// ============================================================================\n\n/**\n * Zod schema for FakerMapping validation\n */\nconst FakerMappingSchema = z.object({\n hint: z.string().optional(),\n type: z.string().optional(),\n fieldName: z.instanceof(RegExp).optional(),\n call: z.string(),\n});\n\n/**\n * Zod schema for MockAdapterConfig validation\n */\nconst MockAdapterConfigSchema = z.object({\n seed: z.record(z.string(), z.number()).optional(),\n delay: z.number().min(0).optional(),\n fakerSeed: z.number().optional(),\n persist: z.boolean().optional(),\n storageKey: z.string().optional(),\n}).strict();\n\n/**\n * Zod schema for SupabaseAdapterConfig validation\n */\nconst SupabaseAdapterConfigSchema = z.object({\n tableMap: z.record(z.string(), z.string()).optional(),\n envPrefix: z.string().optional(),\n}).strict();\n\n/**\n * Zod schema for FirebaseAdapterConfig validation\n */\nconst FirebaseAdapterConfigSchema = z.object({\n collectionMap: z.record(z.string(), z.string()).optional(),\n}).strict();\n\n/**\n * Zod schema for FetchAdapterConfig validation\n */\nconst FetchAdapterConfigSchema = z.object({\n baseUrl: z.string().url().optional(),\n endpointPattern: z.string().optional(),\n}).strict();\n\n/**\n * Zod schema for GraphQLAdapterConfig validation\n */\nconst GraphQLAdapterConfigSchema = z.object({\n operations: z.object({\n findOne: z.string().optional(),\n findMany: z.string().optional(),\n create: z.string().optional(),\n update: z.string().optional(),\n delete: z.string().optional(),\n }).optional(),\n}).strict();\n\n/**\n * Zod schema for PGliteAdapterConfig validation\n */\nconst PGliteAdapterConfigSchema = z.object({\n persistence: z.enum(['memory', 'indexeddb', 'opfs']).optional(),\n dataDir: z.string().optional(),\n fakerSeed: z.number().optional(),\n seed: z.record(z.string(), z.number()).optional(),\n}).strict();\n\n/**\n * Zod schema for PluralizeConfig validation\n */\nconst PluralizeConfigSchema = z.object({\n custom: z.record(z.string(), z.string()).optional(),\n}).strict();\n\n/**\n * Zod schema for complete SchemockConfig validation\n *\n * Uses .strict() on nested objects to catch typos in config keys\n */\nconst SchemockConfigSchema = z.object({\n schemas: z.string().min(1, 'schemas path is required'),\n output: z.string().min(1, 'output path is required'),\n adapter: z.enum(['mock', 'supabase', 'firebase', 'fetch', 'graphql', 'pglite']),\n apiPrefix: z.string(),\n pluralization: PluralizeConfigSchema.optional(),\n fakerMappings: z.array(FakerMappingSchema).optional(),\n adapters: z.object({\n mock: MockAdapterConfigSchema.optional(),\n supabase: SupabaseAdapterConfigSchema.optional(),\n firebase: FirebaseAdapterConfigSchema.optional(),\n fetch: FetchAdapterConfigSchema.optional(),\n graphql: GraphQLAdapterConfigSchema.optional(),\n pglite: PGliteAdapterConfigSchema.optional(),\n }).optional(),\n}).strict();\n\n/**\n * Validate configuration object and return typed result\n *\n * @param config - Raw config object to validate\n * @param filePath - Path to config file (for error messages)\n * @returns Validated SchemockConfig\n * @throws Error if validation fails with detailed message\n */\nfunction validateConfig(config: unknown, filePath: string): SchemockConfig {\n const result = SchemockConfigSchema.safeParse(config);\n\n if (!result.success) {\n const errors = result.error.errors.map((err) => {\n const path = err.path.join('.');\n return ` - ${path ? `${path}: ` : ''}${err.message}`;\n }).join('\\n');\n\n throw new Error(\n `Invalid configuration in ${filePath}:\\n${errors}\\n\\n` +\n `Common issues:\\n` +\n ` - Typos in config keys (e.g., 'scemas' instead of 'schemas')\\n` +\n ` - Unknown adapter types\\n` +\n ` - Invalid adapter-specific options`\n );\n }\n\n return result.data as SchemockConfig;\n}\n\n/**\n * Config file names to search for (in order of priority)\n */\nconst CONFIG_FILES = ['schemock.config.ts', 'schemock.config.js', 'schemock.config.mjs'];\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: SchemockConfig = {\n schemas: './src/schemas/**/*.ts',\n output: './src/generated',\n adapter: 'mock',\n apiPrefix: '/api',\n};\n\n/**\n * Load Schemock configuration from file or return defaults\n *\n * @param configPath - Optional explicit path to config file\n * @returns Loaded configuration merged with defaults\n *\n * @example\n * ```typescript\n * // Load from default location\n * const config = await loadConfig();\n *\n * // Load from specific path\n * const config = await loadConfig('./my-config.ts');\n * ```\n */\nexport async function loadConfig(configPath?: string): Promise<SchemockConfig> {\n // If explicit path provided, use it\n if (configPath) {\n const fullPath = resolve(configPath);\n if (!existsSync(fullPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n return await loadConfigFile(fullPath);\n }\n\n // Search for config file in current directory\n for (const filename of CONFIG_FILES) {\n const fullPath = resolve(filename);\n if (existsSync(fullPath)) {\n return await loadConfigFile(fullPath);\n }\n }\n\n // Return defaults if no config file found\n return { ...DEFAULT_CONFIG };\n}\n\n/**\n * Load and parse a config file\n */\nasync function loadConfigFile(fullPath: string): Promise<SchemockConfig> {\n let rawConfig: unknown;\n\n try {\n // For TypeScript files, we need to use tsx or ts-node\n // For now, we'll try dynamic import which works for JS/MJS\n // and compiled TS files\n const module = await import(fullPath);\n rawConfig = module.default || module;\n } catch (error) {\n // If import fails, it might be a TS file that needs compilation\n // Try using tsx if available\n try {\n rawConfig = loadConfigViaTsx(fullPath);\n } catch (tsxError) {\n throw new Error(\n `Failed to load config file: ${fullPath}\\n` +\n `Original error: ${error}\\n` +\n `tsx fallback error: ${tsxError}\\n\\n` +\n `Suggestions:\\n` +\n ` 1. Ensure the config file has valid syntax\\n` +\n ` 2. Install tsx globally: npm install -g tsx\\n` +\n ` 3. Or compile TypeScript config to JavaScript first`\n );\n }\n }\n\n // Merge with defaults first\n const mergedConfig = {\n ...DEFAULT_CONFIG,\n ...rawConfig as Record<string, unknown>,\n };\n\n // Validate the merged config using Zod schema\n return validateConfig(mergedConfig, fullPath);\n}\n\n/**\n * Load config file via tsx (TypeScript executor)\n * Uses spawnSync with array arguments to prevent shell injection\n *\n * @param fullPath - Absolute path to the config file\n * @returns Parsed config object\n */\nfunction loadConfigViaTsx(fullPath: string): SchemockConfig {\n // Build the inline script to execute\n // Note: We pass the path as a separate argument and read it via process.argv\n // This prevents any shell injection as the path is never interpolated into a shell command\n const inlineScript = `\n const path = process.argv[2];\n const c = require(path);\n console.log(JSON.stringify(c.default || c));\n `;\n\n // Use spawnSync with array arguments - this bypasses the shell entirely\n // and passes arguments directly to the process, preventing injection\n const result = spawnSync('npx', ['tsx', '-e', inlineScript, fullPath], {\n encoding: 'utf-8',\n // Don't use shell - pass args directly to avoid injection\n shell: false,\n // Set reasonable timeout to prevent hanging\n timeout: 30000,\n });\n\n if (result.error) {\n throw new Error(`Failed to execute tsx: ${result.error.message}`);\n }\n\n if (result.status !== 0) {\n const stderr = result.stderr?.trim() || 'Unknown error';\n throw new Error(`tsx exited with code ${result.status}: ${stderr}`);\n }\n\n const output = result.stdout?.trim();\n if (!output) {\n throw new Error('tsx produced no output');\n }\n\n try {\n return JSON.parse(output) as SchemockConfig;\n } catch (parseError) {\n throw new Error(`Failed to parse config output as JSON: ${output}`);\n }\n}\n\n/**\n * Get default configuration\n */\nexport function getDefaultConfig(): SchemockConfig {\n return { ...DEFAULT_CONFIG };\n}\n","/**\n * Core type definitions for the Schemock Schema DSL\n *\n * @module schema/types\n * @category Schema\n */\n\n// ============================================================================\n// Field Types\n// ============================================================================\n\n/**\n * Constraint configuration for fields\n */\nexport interface FieldConstraints {\n /** Minimum value (for numbers) or minimum length (for strings/arrays) */\n min?: number;\n /** Maximum value (for numbers) or maximum length (for strings/arrays) */\n max?: number;\n /** Regular expression pattern for string validation */\n pattern?: RegExp;\n /** Custom validation message */\n message?: string;\n}\n\n/**\n * Base interface for all field definitions in the schema DSL.\n * Fields define the structure and behavior of entity properties.\n *\n * @example\n * ```typescript\n * const emailField: FieldDefinition<string> = {\n * type: 'email',\n * hint: 'internet.email',\n * nullable: false,\n * unique: true,\n * };\n * ```\n */\nexport interface FieldDefinition<T = unknown> {\n /** The primitive type of the field (string, number, boolean, date, array, object, ref) */\n type: string;\n /** Faker.js hint for generating mock data (e.g., 'person.fullName', 'internet.email') */\n hint?: string;\n /** Whether the field can be null */\n nullable?: boolean;\n /** Whether the field must be unique across all entities */\n unique?: boolean;\n /** Whether the field is read-only (excluded from create/update operations) */\n readOnly?: boolean;\n /** Default value when not provided */\n default?: T;\n /** Validation constraints */\n constraints?: FieldConstraints;\n /** For array fields: the type of items */\n items?: FieldDefinition;\n /** For object fields: the shape of nested properties */\n shape?: Record<string, FieldDefinition>;\n /** For ref fields: the target entity name */\n target?: string;\n /** For enum fields: the allowed values */\n values?: readonly T[];\n /** Internal type marker for TypeScript inference */\n readonly _type?: T;\n}\n\n/**\n * Builder interface for creating field definitions with chainable methods.\n * All field builder methods return a new builder instance to support method chaining.\n *\n * @example\n * ```typescript\n * const field = createFieldBuilder('string')\n * .min(1)\n * .max(100)\n * .nullable()\n * .default('');\n * ```\n */\nexport interface FieldBuilder<T> {\n /** The primitive type of the field */\n type: string;\n /** Faker.js hint for generating mock data */\n hint?: string;\n /** Whether the field can be null - use nullable() method to set */\n isNullable?: boolean;\n /** Whether the field must be unique */\n isUnique?: boolean;\n /** Whether the field is read-only */\n isReadOnly?: boolean;\n /** Default value */\n defaultValue?: T;\n /** Validation constraints */\n constraints?: FieldConstraints;\n /** For array fields */\n items?: FieldDefinition;\n /** For object fields */\n shape?: Record<string, FieldDefinition>;\n /** For ref fields */\n target?: string;\n /** For enum fields */\n values?: readonly T[];\n /** Internal type marker */\n readonly _type?: T;\n\n /** Mark the field as nullable */\n nullable(): FieldBuilder<T | null>;\n /** Mark the field as unique */\n unique(message?: string): FieldBuilder<T>;\n /** Mark the field as read-only */\n readOnly(): FieldBuilder<T>;\n /** Set a default value */\n default(value: T): FieldBuilder<T>;\n /** Set minimum constraint */\n min(value: number, message?: string): FieldBuilder<T>;\n /** Set maximum constraint */\n max(value: number, message?: string): FieldBuilder<T>;\n /** Set regex pattern constraint */\n pattern(regex: RegExp, message?: string): FieldBuilder<T>;\n}\n\n/**\n * Extended builder for string fields with additional string-specific options\n */\nexport interface StringFieldBuilder extends FieldBuilder<string> {\n /** Set minimum length */\n min(length: number, message?: string): StringFieldBuilder;\n /** Set maximum length */\n max(length: number, message?: string): StringFieldBuilder;\n /** Set regex pattern */\n pattern(regex: RegExp, message?: string): StringFieldBuilder;\n}\n\n/**\n * Extended builder for number fields with numeric-specific options\n */\nexport interface NumberFieldBuilder extends FieldBuilder<number> {\n /** Set minimum value */\n min(value: number, message?: string): NumberFieldBuilder;\n /** Set maximum value */\n max(value: number, message?: string): NumberFieldBuilder;\n /** Constrain to integer values */\n int(): NumberFieldBuilder;\n}\n\n/**\n * Extended builder for date fields with date-specific options\n */\nexport interface DateFieldBuilder extends FieldBuilder<Date> {\n /** Constrain to past dates */\n past(): DateFieldBuilder;\n /** Constrain to future dates */\n future(): DateFieldBuilder;\n /** Constrain to recent dates */\n recent(): DateFieldBuilder;\n /** Constrain between specific dates */\n between(options: { from: string | Date; to: string | Date }): DateFieldBuilder;\n}\n\n/**\n * Extended builder for enum fields with type-safe values\n */\nexport interface EnumFieldBuilder<T extends string> extends FieldBuilder<T> {\n /** Set default enum value */\n default(value: T): EnumFieldBuilder<T>;\n}\n\n/**\n * Extended builder for reference fields pointing to other entities\n */\nexport interface RefFieldBuilder extends FieldBuilder<string> {\n /** The target entity name */\n readonly target: string;\n}\n\n/**\n * Extended builder for array fields\n */\nexport interface ArrayFieldBuilder<T> extends FieldBuilder<T[]> {\n /** Set minimum array length */\n min(length: number): ArrayFieldBuilder<T>;\n /** Set maximum array length */\n max(length: number): ArrayFieldBuilder<T>;\n /** Set exact array length */\n length(count: number): ArrayFieldBuilder<T>;\n}\n\n/**\n * Extended builder for object fields with nested shape\n */\nexport interface ObjectFieldBuilder<T> extends FieldBuilder<T> {\n /** The shape definition of nested properties */\n readonly shape: Record<string, FieldDefinition>;\n}\n\n// ============================================================================\n// Relation Types\n// ============================================================================\n\n/**\n * Defines a relationship between entities.\n * Supports one-to-one, one-to-many, and many-to-many relationships.\n *\n * @example\n * ```typescript\n * const userPostsRelation: RelationDefinition = {\n * type: 'hasMany',\n * target: 'post',\n * foreignKey: 'authorId',\n * orderBy: { createdAt: 'desc' },\n * };\n * ```\n */\nexport interface RelationDefinition {\n /** The type of relationship */\n type: 'hasMany' | 'belongsTo' | 'hasOne';\n /** The target entity name */\n target: string;\n /** The foreign key field name (on the related entity for hasMany/hasOne, on this entity for belongsTo) */\n foreignKey?: string;\n /** Whether to eagerly load the relation by default */\n eager?: boolean;\n /** Default ordering for hasMany relations */\n orderBy?: Record<string, 'asc' | 'desc'>;\n /** Default limit for hasMany relations */\n limit?: number;\n /** For many-to-many: the junction table name */\n through?: string;\n /** For many-to-many: the other foreign key on the junction table */\n otherKey?: string;\n}\n\n// ============================================================================\n// Computed Field Types\n// ============================================================================\n\n/**\n * Configuration for computed fields that derive their value from other data.\n *\n * @example\n * ```typescript\n * const fullNameComputed: ComputedFieldDefinition<string> = {\n * resolve: (entity) => `${entity.firstName} ${entity.lastName}`,\n * dependsOn: ['firstName', 'lastName'],\n * };\n * ```\n */\nexport interface ComputedFieldDefinition<T = unknown> {\n /** Function to generate mock data for this computed field */\n mock?: () => T;\n /** Function to resolve the actual value from entity data */\n resolve: (entity: Record<string, unknown>, db: unknown, ctx: unknown) => T | Promise<T>;\n /** Fields this computed field depends on (for ordering resolution) */\n dependsOn?: string[];\n /** Internal type marker */\n readonly _computed: true;\n readonly _type?: T;\n}\n\n/**\n * Type guard to check if a field definition is a computed field\n */\nexport function isComputedField(field: unknown): field is ComputedFieldDefinition {\n return (\n typeof field === 'object' &&\n field !== null &&\n '_computed' in field &&\n (field as ComputedFieldDefinition)._computed === true\n );\n}\n\n/**\n * Type guard to check if a field definition is a relation\n */\nexport function isRelation(field: unknown): field is RelationDefinition {\n return (\n typeof field === 'object' &&\n field !== null &&\n 'type' in field &&\n ['hasMany', 'belongsTo', 'hasOne'].includes((field as RelationDefinition).type)\n );\n}\n\n// ============================================================================\n// Entity Schema Types\n// ============================================================================\n\n/**\n * API configuration for an entity\n */\nexport interface EntityApiConfig {\n /** Base path for REST endpoints (e.g., '/api/users') */\n basePath: string;\n /** Enable/disable specific CRUD operations */\n operations?: {\n list?: boolean;\n get?: boolean;\n create?: boolean;\n update?: boolean;\n delete?: boolean;\n [key: string]: boolean | { method: string; path: string; params?: string[] } | undefined;\n };\n /** Pagination configuration */\n pagination?: {\n style: 'offset' | 'cursor';\n defaultLimit?: number;\n maxLimit?: number;\n };\n /** Relationship endpoint configuration */\n relationships?: Record<\n string,\n {\n endpoint?: boolean;\n operations?: Array<'list' | 'create' | 'update' | 'delete'>;\n }\n >;\n}\n\n// ============================================================================\n// Index Configuration Types\n// ============================================================================\n\n/**\n * Index configuration for database optimization.\n *\n * @example Simple index\n * ```typescript\n * { fields: ['authorId'] }\n * ```\n *\n * @example Composite unique index\n * ```typescript\n * { fields: ['email', 'tenantId'], unique: true }\n * ```\n *\n * @example Full-text search index\n * ```typescript\n * {\n * fields: ['title'],\n * type: 'gin',\n * using: \"to_tsvector('english', title)\",\n * }\n * ```\n *\n * @example Partial index\n * ```typescript\n * {\n * fields: ['createdAt'],\n * where: \"status = 'active'\",\n * }\n * ```\n */\nexport interface IndexConfig {\n /** Column names to index */\n fields: string[];\n /** Custom index name (auto-generated if not provided) */\n name?: string;\n /** Index type (default: btree) */\n type?: 'btree' | 'hash' | 'gin' | 'gist' | 'brin';\n /** Custom expression for functional indexes (e.g., \"to_tsvector('english', title)\") */\n using?: string;\n /** Create unique index */\n unique?: boolean;\n /** Partial index condition (WHERE clause) */\n where?: string;\n /** Use CONCURRENTLY for production migrations (avoids locking) */\n concurrently?: boolean;\n}\n\n// ============================================================================\n// RPC/Stored Procedure Configuration Types\n// ============================================================================\n\n/**\n * RPC/Stored procedure argument definition.\n *\n * @example\n * ```typescript\n * { name: 'user_id', type: 'uuid' }\n * { name: 'limit', type: 'integer', default: '20' }\n * ```\n */\nexport interface RPCArgument {\n /** Argument name */\n name: string;\n /** PostgreSQL type (uuid, text, integer, boolean, jsonb, etc.) */\n type: string;\n /** Default value as SQL expression (optional) */\n default?: string;\n}\n\n/**\n * RPC/Stored procedure configuration.\n *\n * @example Simple query function\n * ```typescript\n * {\n * args: [{ name: 'user_id', type: 'uuid' }],\n * returns: 'post[]',\n * sql: \"SELECT * FROM posts WHERE author_id = $1\",\n * volatility: 'stable',\n * }\n * ```\n *\n * @example Mutation function\n * ```typescript\n * {\n * args: [{ name: 'post_id', type: 'uuid' }],\n * returns: 'post',\n * sql: \"UPDATE posts SET status = 'published' WHERE id = $1 RETURNING *\",\n * volatility: 'volatile',\n * }\n * ```\n *\n * @example PL/pgSQL function\n * ```typescript\n * {\n * args: [{ name: 'user_id', type: 'uuid' }],\n * returns: 'integer',\n * language: 'plpgsql',\n * sql: `\n * DECLARE\n * v_count integer;\n * BEGIN\n * SELECT COUNT(*) INTO v_count FROM posts WHERE author_id = user_id;\n * RETURN v_count;\n * END;\n * `,\n * }\n * ```\n */\nexport interface RPCConfig {\n /** Function arguments */\n args?: RPCArgument[];\n /** Return type: 'void', entity name (e.g., 'post'), array (e.g., 'post[]'), or PostgreSQL type */\n returns: string;\n /** SQL function body */\n sql: string;\n /** Function language (default: sql) */\n language?: 'sql' | 'plpgsql';\n /** Volatility marker for query optimization (default: volatile) */\n volatility?: 'volatile' | 'stable' | 'immutable';\n /** Security context (default: invoker) */\n security?: 'invoker' | 'definer';\n /** Function description for documentation */\n description?: string;\n}\n\n// ============================================================================\n// Entity Options\n// ============================================================================\n\n/**\n * Options for entity schema configuration\n */\nexport interface EntityOptions<T = unknown> {\n /** API endpoint configuration */\n api?: EntityApiConfig;\n /** Whether to automatically add timestamp fields (createdAt, updatedAt) */\n timestamps?: boolean;\n /** Row-level security configuration */\n rls?: RLSConfig<T>;\n /** Database indexes for query optimization */\n indexes?: IndexConfig[];\n /** RPC/Stored procedures related to this entity */\n rpc?: Record<string, RPCConfig>;\n}\n\n/**\n * Complete schema definition for an entity.\n * This is the primary output of the defineData function.\n *\n * @example\n * ```typescript\n * const userSchema: EntitySchema = {\n * name: 'user',\n * fields: { id: field.uuid(), name: field.string() },\n * relations: { posts: hasMany('post') },\n * computed: { postCount: field.computed({...}) },\n * };\n * ```\n */\n/**\n * Generic context for RLS evaluation.\n * Can represent users, API keys, services, tenants, or any other context.\n *\n * @example\n * ```typescript\n * // User-based context\n * const userCtx: RLSContext = { userId: 'user-123', role: 'admin', orgId: 'org-456' };\n *\n * // API key context (no user)\n * const apiKeyCtx: RLSContext = { tenantId: 'tenant-789', scope: 'read' };\n *\n * // Service-to-service context\n * const serviceCtx: RLSContext = { serviceId: 'payment-service', environment: 'prod' };\n * ```\n */\nexport interface RLSContext {\n [key: string]: unknown;\n}\n\n/**\n * Row-level security policy filter function.\n * Receives the row data and current context (can be null if no context set).\n */\nexport type RLSFilter<T = unknown> = (row: T, context: RLSContext | null) => boolean;\n\n/**\n * Scope mapping: maps a row field to a context key.\n * Used for automatic policy generation.\n *\n * @example\n * ```typescript\n * // Row field 'authorId' must match context key 'userId'\n * { field: 'authorId', contextKey: 'userId' }\n *\n * // Row field 'tenantId' must match context key 'tenantId'\n * { field: 'tenantId', contextKey: 'tenantId' }\n * ```\n */\nexport interface RLSScopeMapping {\n /** The field name on the row/entity */\n field: string;\n /** The key in the RLS context to compare against */\n contextKey: string;\n}\n\n/**\n * Bypass condition for RLS.\n * When the context matches this condition, RLS is bypassed.\n */\nexport interface RLSBypass {\n /** Context key to check */\n contextKey: string;\n /** Values that trigger bypass (e.g., ['admin', 'superuser']) */\n values: string[];\n}\n\n/**\n * Row-level security configuration for an entity.\n * Works with any context - users, API keys, services, tenants, etc.\n *\n * @example Simple scope-based (works without users)\n * ```typescript\n * const Post = defineData('post', { ... }, {\n * rls: {\n * // Rows filtered by tenantId from context\n * scope: [{ field: 'tenantId', contextKey: 'tenantId' }],\n * },\n * });\n * ```\n *\n * @example User-based with owner field\n * ```typescript\n * const Post = defineData('post', { ... }, {\n * rls: {\n * scope: [{ field: 'authorId', contextKey: 'userId' }],\n * bypass: [{ contextKey: 'role', values: ['admin'] }],\n * },\n * });\n * ```\n *\n * @example Custom filter functions\n * ```typescript\n * const Post = defineData('post', { ... }, {\n * rls: {\n * select: (row, ctx) => row.isPublic || row.authorId === ctx?.userId,\n * insert: (row, ctx) => row.authorId === ctx?.userId,\n * },\n * });\n * ```\n */\nexport interface RLSConfig<T = unknown> {\n /**\n * Scope mappings for automatic policy generation.\n * Each mapping requires row[field] === context[contextKey].\n */\n scope?: RLSScopeMapping[];\n\n /**\n * Conditions that bypass RLS entirely.\n * If any bypass condition matches, all operations are allowed.\n */\n bypass?: RLSBypass[];\n\n /** Custom filter for SELECT/read operations */\n select?: RLSFilter<T>;\n /** Custom filter for INSERT operations */\n insert?: RLSFilter<T>;\n /** Custom filter for UPDATE operations */\n update?: RLSFilter<T>;\n /** Custom filter for DELETE operations */\n delete?: RLSFilter<T>;\n\n /**\n * PostgreSQL-compatible policy SQL for PGlite/Supabase.\n * Use current_setting('app.{contextKey}') to reference context values.\n */\n sql?: {\n select?: string;\n insert?: string;\n update?: string;\n delete?: string;\n };\n}\n\nexport interface EntitySchema<T = unknown> {\n /** The unique name of this entity */\n name: string;\n /** Field definitions */\n fields: Record<string, FieldDefinition>;\n /** Relation definitions */\n relations?: Record<string, RelationDefinition>;\n /** Computed field definitions */\n computed?: Record<string, ComputedFieldDefinition>;\n /** Whether to include timestamp fields */\n timestamps?: boolean;\n /** API configuration */\n api?: EntityApiConfig;\n /** Row-level security configuration */\n rls?: RLSConfig<T>;\n /** Database indexes for query optimization */\n indexes?: IndexConfig[];\n /** RPC/Stored procedures related to this entity */\n rpc?: Record<string, RPCConfig>;\n /** Internal type marker */\n readonly _entity?: T;\n}\n\n// ============================================================================\n// View Schema Types\n// ============================================================================\n\n/**\n * Embed configuration for including related data in views\n */\nexport interface EmbedConfig {\n /** Maximum number of items to include */\n limit?: number;\n /** Ordering for embedded items */\n orderBy?: Record<string, 'asc' | 'desc'>;\n /** Fields to include (defaults to all) */\n select?: string[];\n}\n\n/**\n * View field value type - supports fields, computed, embeds, and nested objects\n */\nexport type ViewFieldValue =\n | FieldDefinition\n | ComputedFieldDefinition\n | { _embed: true; entity: EntitySchema; config?: EmbedConfig }\n | Record<string, FieldDefinition | ComputedFieldDefinition>;\n\n/**\n * View field definitions (subset of entity fields + embedded relations)\n */\nexport type ViewFields = Record<string, ViewFieldValue>;\n\n/**\n * Options for view schema configuration\n */\nexport interface ViewOptions {\n /** The API endpoint for this view */\n endpoint: string;\n /** URL parameters required for this view */\n params: string[];\n}\n\n/**\n * Schema definition for a computed view over entities.\n *\n * @example\n * ```typescript\n * const userFullView: ViewSchema = {\n * name: 'user-full',\n * fields: { id: field.uuid(), name: field.string() },\n * endpoint: '/api/users/:id/full',\n * params: ['id'],\n * };\n * ```\n */\nexport interface ViewSchema {\n /** The unique name of this view */\n name: string;\n /** Field definitions for the view output */\n fields: ViewFields;\n /** The API endpoint */\n endpoint: string;\n /** Required URL parameters */\n params: string[];\n}\n\n// ============================================================================\n// Custom Endpoint Types\n// ============================================================================\n\n/**\n * HTTP methods supported for custom endpoints\n */\nexport type EndpointMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\n/**\n * Context passed to mock resolver functions.\n * Provides access to request data and the mock database.\n *\n * @example\n * ```typescript\n * mockResolver: async ({ params, body, db }) => {\n * const users = db.user.findMany({ where: { name: { contains: params.q } } });\n * return { results: users, total: users.length };\n * }\n * ```\n */\nexport interface MockResolverContext<TParams = Record<string, unknown>, TBody = Record<string, unknown>> {\n /** Parsed query/path parameters */\n params: TParams;\n /** Parsed request body (for POST/PUT/PATCH) */\n body: TBody;\n /** Access to mock database */\n db: unknown;\n /** Request headers */\n headers: Record<string, string>;\n}\n\n/**\n * Configuration for defining a custom endpoint.\n *\n * @example\n * ```typescript\n * const config: EndpointConfig = {\n * method: 'GET',\n * params: { q: field.string(), limit: field.number.int().default(20) },\n * response: { results: field.array(field.object({...})), total: field.number.int() },\n * mockResolver: async ({ params, db }) => ({ results: [], total: 0 }),\n * };\n * ```\n */\nexport interface EndpointConfig<\n TParams = Record<string, unknown>,\n TBody = Record<string, unknown>,\n TResponse = unknown,\n> {\n /** HTTP method */\n method: EndpointMethod;\n /** Query/path parameter definitions */\n params?: Record<string, FieldBuilder<unknown> | FieldDefinition>;\n /** Request body definition (for POST/PUT/PATCH) */\n body?: Record<string, FieldBuilder<unknown> | FieldDefinition>;\n /** Response schema definition */\n response: Record<string, FieldBuilder<unknown> | FieldDefinition>;\n /** Mock resolver function that generates fake responses */\n mockResolver: (ctx: MockResolverContext<TParams, TBody>) => TResponse | Promise<TResponse>;\n /** Optional description for documentation */\n description?: string;\n}\n\n/**\n * Complete endpoint schema definition.\n * This is the output of the defineEndpoint function.\n *\n * @example\n * ```typescript\n * const SearchEndpoint = defineEndpoint('/api/search', {\n * method: 'GET',\n * params: { q: field.string() },\n * response: { results: field.array(field.string()) },\n * mockResolver: async ({ params, db }) => ({ results: [] }),\n * });\n * ```\n */\nexport interface EndpointSchema<\n TParams = Record<string, unknown>,\n TBody = Record<string, unknown>,\n TResponse = unknown,\n> {\n /** Endpoint path (e.g., '/api/search', '/api/orders/:id') */\n path: string;\n /** HTTP method */\n method: EndpointMethod;\n /** Parameter definitions (normalized to FieldDefinition) */\n params: Record<string, FieldDefinition>;\n /** Body definitions (normalized to FieldDefinition) */\n body: Record<string, FieldDefinition>;\n /** Response definitions (normalized to FieldDefinition) */\n response: Record<string, FieldDefinition>;\n /** Mock resolver function */\n mockResolver: (ctx: MockResolverContext<TParams, TBody>) => TResponse | Promise<TResponse>;\n /** Description for documentation */\n description?: string;\n /** Internal marker for type identification */\n readonly _endpoint: true;\n}\n\n/**\n * Type guard to check if a value is an EndpointSchema\n */\nexport function isEndpointSchema(value: unknown): value is EndpointSchema {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_endpoint' in value &&\n (value as EndpointSchema)._endpoint === true\n );\n}\n\n// ============================================================================\n// Type Inference Utilities\n// ============================================================================\n\n/**\n * Maps field types to their TypeScript equivalents\n */\ntype FieldTypeMap = {\n string: string;\n uuid: string;\n email: string;\n url: string;\n number: number;\n int: number;\n float: number;\n boolean: boolean;\n date: Date;\n array: unknown[];\n object: Record<string, unknown>;\n ref: string;\n enum: string;\n};\n\n/**\n * Infer the TypeScript type from a FieldDefinition\n */\nexport type InferFieldType<F extends FieldDefinition> = F['nullable'] extends true\n ? (F extends { _type: infer T } ? T : FieldTypeMap[F['type'] & keyof FieldTypeMap]) | null\n : F extends { _type: infer T }\n ? T\n : FieldTypeMap[F['type'] & keyof FieldTypeMap];\n\n/**\n * Infer the complete entity type from an EntitySchema\n *\n * @example\n * ```typescript\n * const User = defineData('user', { id: field.uuid(), name: field.string() });\n * type UserType = InferEntity<typeof User>;\n * // { id: string; name: string; }\n * ```\n */\nexport type InferEntity<S extends EntitySchema> = {\n [K in keyof S['fields']]: InferFieldType<S['fields'][K]>;\n} & (S['relations'] extends Record<string, RelationDefinition>\n ? {\n [K in keyof S['relations']]?: S['relations'][K]['type'] extends 'hasMany' ? unknown[] : unknown;\n }\n : object) &\n (S['computed'] extends Record<string, ComputedFieldDefinition>\n ? { [K in keyof S['computed']]: S['computed'][K]['_type'] }\n : object);\n\n/**\n * Infer the type for creating a new entity (excludes id, readOnly, computed fields)\n *\n * @example\n * ```typescript\n * type UserCreate = InferCreate<typeof User>;\n * // { name: string; email: string; } (without id, createdAt, etc.)\n * ```\n */\nexport type InferCreate<S extends EntitySchema> = {\n [K in keyof S['fields'] as S['fields'][K]['readOnly'] extends true\n ? never\n : K extends 'id'\n ? never\n : K]: S['fields'][K]['default'] extends undefined\n ? InferFieldType<S['fields'][K]>\n : InferFieldType<S['fields'][K]> | undefined;\n};\n\n/**\n * Infer the type for updating an entity (all fields optional, excludes readOnly)\n *\n * @example\n * ```typescript\n * type UserUpdate = InferUpdate<typeof User>;\n * // { name?: string; email?: string; }\n * ```\n */\nexport type InferUpdate<S extends EntitySchema> = Partial<InferCreate<S>>;\n","/**\n * Schema discovery for Schemock CLI\n *\n * @module cli/discover\n * @category CLI\n */\n\nimport { resolve, relative } from 'node:path';\nimport { readdir, stat } from 'node:fs/promises';\nimport type { EntitySchema, EndpointSchema } from '../schema/types';\nimport { isEndpointSchema } from '../schema/types';\n\n/**\n * Result of schema discovery\n */\nexport interface DiscoveryResult {\n /** Discovered entity schemas */\n schemas: EntitySchema[];\n /** Discovered custom endpoints */\n endpoints: EndpointSchema[];\n /** File paths where schemas were found */\n files: string[];\n}\n\n/**\n * Parse a glob pattern to extract base directory and pattern parts\n */\nfunction parseGlobPattern(pattern: string): { baseDir: string; patterns: string[] } {\n // Find the first part with glob characters\n const parts = pattern.split('/');\n const baseParts: string[] = [];\n const patternParts: string[] = [];\n\n let foundGlob = false;\n for (const part of parts) {\n if (foundGlob || part.includes('*') || part.includes('?') || part.includes('[')) {\n foundGlob = true;\n patternParts.push(part);\n } else {\n baseParts.push(part);\n }\n }\n\n return {\n baseDir: baseParts.join('/') || '.',\n patterns: patternParts,\n };\n}\n\n/**\n * Check if a file path matches a simple glob pattern\n */\nfunction matchesPattern(filePath: string, patterns: string[]): boolean {\n const parts = filePath.split('/');\n\n if (patterns.length === 0) return true;\n\n // Handle ** pattern (match any depth including zero)\n const patternStr = patterns.join('/');\n if (patternStr.includes('**')) {\n // Convert glob to regex\n // Order is critical: handle glob patterns before escaping regex metacharacters\n let regexStr = patternStr\n .replace(/\\*\\*\\//g, '<<<GLOBSTAR_SLASH>>>') // **/ -> placeholder (before * and . handling)\n .replace(/\\*\\*/g, '<<<GLOBSTAR>>>') // ** -> placeholder\n .replace(/\\?/g, '<<<QUESTION>>>') // ? -> placeholder\n .replace(/\\*/g, '<<<STAR>>>') // * -> placeholder\n .replace(/\\./g, '\\\\.') // . -> literal dot (escape regex metachar)\n .replace(/<<<GLOBSTAR_SLASH>>>/g, '(?:.*/)?') // **/ -> optional any path\n .replace(/<<<GLOBSTAR>>>/g, '.*') // ** -> any chars\n .replace(/<<<STAR>>>/g, '[^/]*') // * -> any chars except /\n .replace(/<<<QUESTION>>>/g, '.'); // ? -> single char\n const regex = new RegExp(`^${regexStr}$`);\n return regex.test(filePath);\n }\n\n // Simple pattern matching\n if (parts.length !== patterns.length) return false;\n\n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const part = parts[i];\n\n if (pattern === '*') continue;\n if (pattern.includes('*')) {\n const regexStr = pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.');\n const regex = new RegExp(`^${regexStr}$`);\n if (!regex.test(part)) return false;\n } else if (pattern !== part) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Recursively find all files matching a pattern\n */\nasync function findFiles(baseDir: string, patterns: string[], currentPath: string = ''): Promise<string[]> {\n const fullPath = resolve(baseDir, currentPath);\n const files: string[] = [];\n\n try {\n const entries = await readdir(fullPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = currentPath ? `${currentPath}/${entry.name}` : entry.name;\n\n // Skip node_modules and hidden directories\n if (entry.name === 'node_modules' || entry.name.startsWith('.')) {\n continue;\n }\n\n if (entry.isDirectory()) {\n const subFiles = await findFiles(baseDir, patterns, entryPath);\n files.push(...subFiles);\n } else if (entry.isFile()) {\n // Check if file matches pattern\n if (matchesPattern(entryPath, patterns)) {\n // Skip .d.ts, .test.ts, .spec.ts files\n if (\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.test.ts') &&\n !entry.name.endsWith('.spec.ts')\n ) {\n files.push(resolve(baseDir, entryPath));\n }\n }\n }\n }\n } catch (error) {\n // Directory doesn't exist or can't be read\n console.warn(`Warning: Could not read directory ${fullPath}`);\n }\n\n return files;\n}\n\n/**\n * Check if a value is an EntitySchema\n */\nfunction isEntitySchema(value: unknown): value is EntitySchema {\n if (typeof value !== 'object' || value === null) return false;\n\n const obj = value as Record<string, unknown>;\n return typeof obj.name === 'string' && typeof obj.fields === 'object' && obj.fields !== null;\n}\n\n/**\n * Discover schemas from files matching a glob pattern or direct file path\n *\n * @param pattern - Glob pattern or direct file path to schema files\n * @returns Discovery result with schemas and file paths\n */\nexport async function discoverSchemas(pattern: string): Promise<DiscoveryResult> {\n let files: string[];\n\n // Check if pattern is a direct file path (no glob characters)\n const isGlobPattern = pattern.includes('*') || pattern.includes('?') || pattern.includes('[');\n\n if (!isGlobPattern) {\n // Direct file path - check if it exists\n const resolvedPath = resolve(pattern);\n try {\n const fileStat = await stat(resolvedPath);\n if (fileStat.isFile()) {\n files = [resolvedPath];\n } else {\n throw new Error(`Path is not a file: ${pattern}`);\n }\n } catch (error) {\n throw new Error(`Schema file not found: ${pattern}`);\n }\n } else {\n // Glob pattern - find matching files\n const { baseDir, patterns } = parseGlobPattern(pattern);\n const resolvedBaseDir = resolve(baseDir);\n files = await findFiles(resolvedBaseDir, patterns);\n\n if (files.length === 0) {\n throw new Error(`No schema files found matching: ${pattern}`);\n }\n }\n\n const schemas: EntitySchema[] = [];\n const endpoints: EndpointSchema[] = [];\n const loadedFiles: string[] = [];\n\n for (const file of files) {\n try {\n // Import the module\n const module = await import(file);\n\n // Find all exports that are EntitySchema or EndpointSchema\n let foundSchema = false;\n for (const [_exportName, value] of Object.entries(module)) {\n if (isEntitySchema(value)) {\n schemas.push(value);\n foundSchema = true;\n } else if (isEndpointSchema(value)) {\n endpoints.push(value);\n foundSchema = true;\n }\n }\n\n if (foundSchema) {\n loadedFiles.push(file);\n }\n } catch (error) {\n console.warn(`Warning: Could not import ${file}: ${error}`);\n }\n }\n\n if (schemas.length === 0 && endpoints.length === 0) {\n throw new Error('No schemas found. Make sure your schema files export defineData() or defineEndpoint() results.');\n }\n\n return { schemas, endpoints, files: loadedFiles };\n}\n\n/**\n * Get relative path from current working directory\n */\nexport function getRelativePath(absolutePath: string): string {\n return relative(process.cwd(), absolutePath);\n}\n","/**\n * Pluralization utility for entity names\n *\n * @module cli/utils/pluralize\n * @category CLI\n */\n\nimport type { PluralizeConfig } from '../types';\n\n/**\n * Irregular plural forms (singular -> plural)\n */\nconst irregulars: Record<string, string> = {\n person: 'people',\n child: 'children',\n man: 'men',\n woman: 'women',\n tooth: 'teeth',\n foot: 'feet',\n mouse: 'mice',\n goose: 'geese',\n ox: 'oxen',\n leaf: 'leaves',\n life: 'lives',\n knife: 'knives',\n wife: 'wives',\n self: 'selves',\n elf: 'elves',\n loaf: 'loaves',\n potato: 'potatoes',\n tomato: 'tomatoes',\n cactus: 'cacti',\n focus: 'foci',\n fungus: 'fungi',\n nucleus: 'nuclei',\n syllabus: 'syllabi',\n analysis: 'analyses',\n diagnosis: 'diagnoses',\n thesis: 'theses',\n crisis: 'crises',\n phenomenon: 'phenomena',\n criterion: 'criteria',\n datum: 'data',\n};\n\n/**\n * Reverse irregular forms (plural -> singular)\n */\nconst irregularsReverse: Record<string, string> = Object.fromEntries(\n Object.entries(irregulars).map(([k, v]) => [v, k])\n);\n\n/**\n * Words that don't change in plural form\n */\nconst uncountables = new Set([\n 'sheep',\n 'fish',\n 'deer',\n 'species',\n 'series',\n 'news',\n 'money',\n 'rice',\n 'information',\n 'equipment',\n]);\n\n/**\n * Check if character is a vowel\n */\nfunction isVowel(char: string): boolean {\n return 'aeiou'.includes(char?.toLowerCase() ?? '');\n}\n\n/**\n * Convert a plural word to its singular form\n *\n * @example\n * ```typescript\n * singularize('users') // 'user'\n * singularize('categories') // 'category'\n * singularize('people') // 'person'\n * singularize('user') // 'user' (already singular)\n * ```\n */\nexport function singularize(word: string): string {\n const lower = word.toLowerCase();\n\n // Check reverse irregulars\n if (irregularsReverse[lower]) {\n return irregularsReverse[lower];\n }\n\n // Check uncountables\n if (uncountables.has(lower)) {\n return lower;\n }\n\n // Check if it's a known singular (in irregulars map)\n if (irregulars[lower]) {\n return lower; // Already singular\n }\n\n // Reverse plural rules (order matters - most specific first)\n\n // -ies -> -y (categories -> category)\n if (lower.endsWith('ies') && lower.length > 3) {\n const base = lower.slice(0, -3);\n // Verify the base + y wouldn't be a vowel+y (which doesn't pluralize to -ies)\n if (base.length > 0 && !isVowel(base[base.length - 1])) {\n return base + 'y';\n }\n }\n\n // -ves -> -f or -fe (leaves -> leaf, knives -> knife)\n if (lower.endsWith('ves') && lower.length > 3) {\n const base = lower.slice(0, -3);\n // Common -ves words that become -fe\n const feWords = ['kni', 'wi', 'li']; // knife, wife, life\n if (feWords.some((w) => base.endsWith(w))) {\n return base + 'fe';\n }\n return base + 'f';\n }\n\n // -oes -> -o (potatoes -> potato, but not \"does\" -> \"do\")\n if (lower.endsWith('oes') && lower.length > 3) {\n const base = lower.slice(0, -2);\n // Skip short words like \"does\", \"goes\", \"toes\"\n if (base.length > 2) {\n return base;\n }\n }\n\n // -ses, -xes, -zes, -ches, -shes -> remove -es\n if (\n (lower.endsWith('ses') ||\n lower.endsWith('xes') ||\n lower.endsWith('zes') ||\n lower.endsWith('ches') ||\n lower.endsWith('shes')) &&\n lower.length > 3\n ) {\n return lower.slice(0, -2);\n }\n\n // -s -> remove -s (users -> user)\n // But not -ss (class, boss, etc. - these are singular)\n if (lower.endsWith('s') && !lower.endsWith('ss') && lower.length > 1) {\n return lower.slice(0, -1);\n }\n\n // Default: return as-is (assume already singular)\n return lower;\n}\n\n/**\n * Convert a word to its plural form\n *\n * This function is idempotent - calling it on an already-plural word\n * returns the same word (e.g., pluralize('users') === 'users').\n *\n * @example\n * ```typescript\n * pluralize('user') // 'users'\n * pluralize('users') // 'users' (idempotent)\n * pluralize('category') // 'categories'\n * pluralize('categories') // 'categories' (idempotent)\n * pluralize('person') // 'people'\n * pluralize('people') // 'people' (idempotent)\n * pluralize('staff', { custom: { staff: 'staff' } }) // 'staff'\n * ```\n */\nexport function pluralize(word: string, config?: PluralizeConfig): string {\n const lower = word.toLowerCase();\n\n // Check custom overrides first\n if (config?.custom?.[lower]) {\n return config.custom[lower];\n }\n\n // First, singularize the word to handle already-plural inputs\n // This makes pluralize() idempotent: pluralize('users') === 'users'\n const singular = singularize(lower);\n\n // Check irregulars (using the singularized form)\n if (irregulars[singular]) {\n return irregulars[singular];\n }\n\n // Check uncountables\n if (uncountables.has(singular)) {\n return singular;\n }\n\n // Apply plural rules to the singular form\n if (singular.endsWith('y') && !isVowel(singular[singular.length - 2])) {\n return singular.slice(0, -1) + 'ies';\n }\n if (\n singular.endsWith('s') ||\n singular.endsWith('x') ||\n singular.endsWith('z') ||\n singular.endsWith('ch') ||\n singular.endsWith('sh')\n ) {\n return singular + 'es';\n }\n if (singular.endsWith('f')) {\n return singular.slice(0, -1) + 'ves';\n }\n if (singular.endsWith('fe')) {\n return singular.slice(0, -2) + 'ves';\n }\n\n return singular + 's';\n}\n\n/**\n * Convert string to PascalCase\n *\n * @example\n * ```typescript\n * toPascalCase('user') // 'User'\n * toPascalCase('blog-post') // 'BlogPost'\n * toPascalCase('my_entity') // 'MyEntity'\n * ```\n */\nexport function toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\n/**\n * Convert string to camelCase\n *\n * @example\n * ```typescript\n * toCamelCase('user') // 'user'\n * toCamelCase('blog-post') // 'blogPost'\n * toCamelCase('MyEntity') // 'myEntity'\n * ```\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Convert string to snake_case\n *\n * @example\n * ```typescript\n * toSnakeCase('userId') // 'user_id'\n * toSnakeCase('BlogPost') // 'blog_post'\n * toSnakeCase('myEntity') // 'my_entity'\n * ```\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '')\n .replace(/[-\\s]+/g, '_');\n}\n","/**\n * Faker mapping utility - maps schema fields to Faker.js calls\n *\n * @module cli/utils/faker-mapping\n * @category CLI\n */\n\nimport type { FieldDefinition } from '../../schema/types';\nimport type { SchemockConfig, FakerMapping } from '../types';\n\n/**\n * Escape a string value for safe use in JavaScript string literals.\n * Escapes single quotes, backslashes, and newlines.\n *\n * @param value - The string value to escape\n * @returns Escaped string safe for JS single-quoted strings\n */\nfunction escapeJsString(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes first\n .replace(/'/g, \"\\\\'\") // Escape single quotes\n .replace(/\\n/g, '\\\\n') // Escape newlines\n .replace(/\\r/g, '\\\\r') // Escape carriage returns\n .replace(/\\t/g, '\\\\t'); // Escape tabs\n}\n\n/**\n * Default faker mappings\n */\nconst defaultMappings: FakerMapping[] = [\n // By hint - Person\n { hint: 'person.fullName', call: 'faker.person.fullName()' },\n { hint: 'person.firstName', call: 'faker.person.firstName()' },\n { hint: 'person.lastName', call: 'faker.person.lastName()' },\n { hint: 'person.bio', call: 'faker.lorem.paragraph()' },\n { hint: 'person.jobTitle', call: 'faker.person.jobTitle()' },\n\n // By hint - Internet\n { hint: 'internet.email', call: 'faker.internet.email()' },\n { hint: 'internet.url', call: 'faker.internet.url()' },\n { hint: 'internet.avatar', call: 'faker.image.avatar()' },\n { hint: 'internet.username', call: 'faker.internet.username()' },\n { hint: 'internet.password', call: 'faker.internet.password()' },\n\n // By hint - Lorem\n { hint: 'lorem.word', call: 'faker.lorem.word()' },\n { hint: 'lorem.sentence', call: 'faker.lorem.sentence()' },\n { hint: 'lorem.paragraph', call: 'faker.lorem.paragraph()' },\n { hint: 'lorem.paragraphs', call: 'faker.lorem.paragraphs(3)' },\n { hint: 'lorem.text', call: 'faker.lorem.text()' },\n\n // By hint - Image\n { hint: 'image.avatar', call: 'faker.image.avatar()' },\n { hint: 'image.url', call: 'faker.image.url()' },\n\n // By hint - Location\n { hint: 'location.city', call: 'faker.location.city()' },\n { hint: 'location.country', call: 'faker.location.country()' },\n { hint: 'location.streetAddress', call: 'faker.location.streetAddress()' },\n { hint: 'location.zipCode', call: 'faker.location.zipCode()' },\n { hint: 'location.latitude', call: 'faker.location.latitude()' },\n { hint: 'location.longitude', call: 'faker.location.longitude()' },\n\n // By hint - Commerce\n { hint: 'commerce.price', call: 'parseFloat(faker.commerce.price())' },\n { hint: 'commerce.productName', call: 'faker.commerce.productName()' },\n { hint: 'commerce.department', call: 'faker.commerce.department()' },\n\n // By hint - Company\n { hint: 'company.name', call: 'faker.company.name()' },\n { hint: 'company.catchPhrase', call: 'faker.company.catchPhrase()' },\n\n // By hint - Color\n { hint: 'color.rgb', call: 'faker.color.rgb()' },\n { hint: 'color.human', call: 'faker.color.human()' },\n\n // By hint - Date\n { hint: 'date.past', call: 'faker.date.past()' },\n { hint: 'date.future', call: 'faker.date.future()' },\n { hint: 'date.recent', call: 'faker.date.recent()' },\n { hint: 'date.birthdate', call: 'faker.date.birthdate()' },\n\n // By field name patterns\n { fieldName: /^email$/i, call: 'faker.internet.email()' },\n { fieldName: /^name$/i, call: 'faker.person.fullName()' },\n { fieldName: /firstName/i, call: 'faker.person.firstName()' },\n { fieldName: /lastName/i, call: 'faker.person.lastName()' },\n { fieldName: /phone/i, call: 'faker.phone.number()' },\n { fieldName: /avatar/i, call: 'faker.image.avatar()' },\n { fieldName: /image|photo|picture/i, call: 'faker.image.url()' },\n { fieldName: /url|link|website/i, call: 'faker.internet.url()' },\n { fieldName: /address/i, call: 'faker.location.streetAddress()' },\n { fieldName: /city/i, call: 'faker.location.city()' },\n { fieldName: /country/i, call: 'faker.location.country()' },\n { fieldName: /zip|postal/i, call: 'faker.location.zipCode()' },\n { fieldName: /price|cost|amount/i, call: 'parseFloat(faker.commerce.price())' },\n { fieldName: /title/i, call: 'faker.lorem.sentence({ min: 3, max: 8 })' },\n { fieldName: /description|content|body|text/i, call: 'faker.lorem.paragraphs(2)' },\n { fieldName: /bio|about/i, call: 'faker.lorem.paragraph()' },\n { fieldName: /color/i, call: 'faker.color.rgb()' },\n { fieldName: /slug/i, call: 'faker.helpers.slugify(faker.lorem.words(3))' },\n { fieldName: /token|key|secret/i, call: 'faker.string.alphanumeric(32)' },\n\n // By type (fallback)\n { type: 'uuid', call: 'faker.string.uuid()' },\n { type: 'email', call: 'faker.internet.email()' },\n { type: 'url', call: 'faker.internet.url()' },\n { type: 'string', call: 'faker.lorem.word()' },\n { type: 'text', call: 'faker.lorem.paragraphs(2)' },\n { type: 'number', call: 'faker.number.int({ min: 1, max: 1000 })' },\n { type: 'int', call: 'faker.number.int({ min: 1, max: 1000 })' },\n { type: 'float', call: 'faker.number.float({ min: 0, max: 1000, fractionDigits: 2 })' },\n { type: 'boolean', call: 'faker.datatype.boolean()' },\n { type: 'date', call: 'faker.date.recent()' },\n { type: 'json', call: '{}' },\n { type: 'ref', call: 'faker.string.uuid()' },\n];\n\n/**\n * Convert a field definition to a Faker.js call string\n *\n * @example\n * ```typescript\n * fieldToFakerCall('email', { type: 'email' }, config)\n * // 'faker.internet.email()'\n *\n * fieldToFakerCall('status', { type: 'enum', values: ['active', 'inactive'] }, config)\n * // \"faker.helpers.arrayElement(['active', 'inactive'])\"\n * ```\n */\nexport function fieldToFakerCall(\n fieldName: string,\n field: FieldDefinition,\n config: SchemockConfig\n): string {\n // Merge custom mappings with defaults (custom takes priority)\n const mappings = [...(config.fakerMappings || []), ...defaultMappings];\n\n // Handle special types first\n\n // Enum\n if (field.type === 'enum' || (field.values && field.values.length > 0)) {\n const values = (field.values as string[]).map((v) => `'${escapeJsString(v)}'`).join(', ');\n return `faker.helpers.arrayElement([${values}])`;\n }\n\n // Array\n if (field.type === 'array') {\n const itemCall = field.items ? fieldToFakerCall('item', field.items, config) : 'faker.lorem.word()';\n const min = field.constraints?.min ?? 1;\n const max = field.constraints?.max ?? 5;\n return `Array.from({ length: faker.number.int({ min: ${min}, max: ${max} }) }, () => ${itemCall})`;\n }\n\n // Object\n if (field.type === 'object' && field.shape) {\n const props = Object.entries(field.shape)\n .map(([k, v]) => `${k}: ${fieldToFakerCall(k, v, config)}`)\n .join(', ');\n return `({ ${props} })`;\n }\n\n // Try hint first (highest priority)\n if (field.hint) {\n const match = mappings.find((m) => m.hint === field.hint);\n if (match) return match.call;\n }\n\n // Try field name pattern\n for (const mapping of mappings) {\n if (mapping.fieldName && mapping.fieldName.test(fieldName)) {\n return mapping.call;\n }\n }\n\n // Try type with constraints\n if (field.type === 'number' || field.type === 'int') {\n const min = field.constraints?.min ?? 1;\n const max = field.constraints?.max ?? 1000;\n return `faker.number.int({ min: ${min}, max: ${max} })`;\n }\n if (field.type === 'float') {\n const min = field.constraints?.min ?? 0;\n const max = field.constraints?.max ?? 1000;\n return `faker.number.float({ min: ${min}, max: ${max}, fractionDigits: 2 })`;\n }\n if (field.type === 'string' && (field.constraints?.min || field.constraints?.max)) {\n const min = field.constraints?.min ?? 1;\n const max = field.constraints?.max ?? 100;\n return `faker.string.alphanumeric({ length: { min: ${min}, max: ${max} } })`;\n }\n\n // Try type fallback\n const typeMatch = mappings.find((m) => m.type === field.type);\n if (typeMatch) return typeMatch.call;\n\n // Ultimate fallback\n return 'faker.lorem.word()';\n}\n","/**\n * Type mapping utility - converts schema field types to TypeScript types\n *\n * @module cli/utils/type-mapping\n * @category CLI\n */\n\nimport type { FieldDefinition } from '../../schema/types';\n\n/**\n * Convert a field definition to its TypeScript type representation\n *\n * @example\n * ```typescript\n * fieldToTsType({ type: 'string' }) // 'string'\n * fieldToTsType({ type: 'enum', values: ['a', 'b'] }) // \"'a' | 'b'\"\n * fieldToTsType({ type: 'array', items: { type: 'string' } }) // 'string[]'\n * fieldToTsType({ type: 'bigint' }) // 'bigint'\n * fieldToTsType({ type: 'decimal' }) // 'string' (precision-safe)\n * ```\n */\nexport function fieldToTsType(field: FieldDefinition): string {\n switch (field.type) {\n case 'uuid':\n case 'string':\n case 'email':\n case 'url':\n case 'text':\n return 'string';\n\n case 'number':\n case 'int':\n case 'integer':\n case 'float':\n case 'double':\n return 'number';\n\n // BigInt support - use native bigint type\n case 'bigint':\n case 'bigserial':\n return 'bigint';\n\n // Decimal/Money - use string for precision (avoids floating point issues)\n case 'decimal':\n case 'numeric':\n case 'money':\n return 'string';\n\n // Binary data - use Uint8Array or Buffer\n case 'bytea':\n case 'binary':\n case 'blob':\n return 'Uint8Array';\n\n case 'boolean':\n return 'boolean';\n\n // Date/time types\n case 'date':\n case 'datetime':\n case 'timestamp':\n case 'timestamptz':\n return 'Date';\n\n // Time without date\n case 'time':\n case 'timetz':\n return 'string'; // HH:MM:SS format\n\n // Interval (duration)\n case 'interval':\n return 'string'; // ISO 8601 duration or PostgreSQL interval format\n\n case 'enum':\n if (field.values && field.values.length > 0) {\n return (field.values as string[]).map((v) => `'${v}'`).join(' | ');\n }\n return 'string';\n\n case 'array':\n if (field.items) {\n return `${fieldToTsType(field.items)}[]`;\n }\n return 'unknown[]';\n\n case 'object':\n if (field.shape) {\n const props = Object.entries(field.shape)\n .map(([k, v]) => `${escapePropertyKey(k)}: ${fieldToTsType(v)}`)\n .join('; ');\n return `{ ${props} }`;\n }\n return 'Record<string, unknown>';\n\n case 'json':\n case 'jsonb':\n return 'unknown';\n\n case 'ref':\n return 'string'; // FK is always string UUID\n\n // PostGIS geometry types\n case 'point':\n return '{ x: number; y: number }';\n\n case 'geometry':\n case 'geography':\n return 'unknown'; // GeoJSON or WKT - depends on use case\n\n default:\n return 'unknown';\n }\n}\n\n/**\n * Escape a property key for use in TypeScript object types.\n * Keys with special characters need to be quoted.\n *\n * @param key - The property key to escape\n * @returns Properly formatted key for TypeScript\n */\nfunction escapePropertyKey(key: string): string {\n // Check if key is a valid identifier (letters, digits, underscore, $, doesn't start with digit)\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) {\n return key;\n }\n // Quote the key and escape any quotes inside\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n}\n\n/**\n * Convert a primitive type string to TypeScript type\n */\nexport function primitiveToTs(type: string): string {\n switch (type) {\n case 'string':\n case 'text':\n case 'uuid':\n case 'email':\n case 'url':\n return 'string';\n\n case 'number':\n case 'int':\n case 'integer':\n case 'float':\n case 'double':\n return 'number';\n\n case 'bigint':\n case 'bigserial':\n return 'bigint';\n\n case 'decimal':\n case 'numeric':\n case 'money':\n return 'string';\n\n case 'bytea':\n case 'binary':\n case 'blob':\n return 'Uint8Array';\n\n case 'boolean':\n return 'boolean';\n\n case 'date':\n case 'datetime':\n case 'timestamp':\n case 'timestamptz':\n return 'Date';\n\n case 'time':\n case 'timetz':\n case 'interval':\n return 'string';\n\n default:\n return 'unknown';\n }\n}\n","/**\n * Schema analysis for Schemock CLI\n *\n * @module cli/analyze\n * @category CLI\n */\n\nimport type { EntitySchema, FieldDefinition, RelationDefinition, RLSConfig, IndexConfig, RPCConfig } from '../schema/types';\nimport type { SchemockConfig, AnalyzedSchema, AnalyzedField, AnalyzedRelation, AnalyzedComputed, AnalyzedRLS, AnalyzedIndex, AnalyzedRPC } from './types';\nimport { pluralize, singularize, toPascalCase, toSnakeCase } from './utils/pluralize';\nimport { fieldToFakerCall } from './utils/faker-mapping';\nimport { fieldToTsType, primitiveToTs } from './utils/type-mapping';\n\n/**\n * Infer computed field type from naming convention\n *\n * Uses a comprehensive set of naming patterns to infer types:\n * - Numeric: count, total, sum, avg, min, max, amount, price, etc.\n * - Boolean: is*, has*, can*, should*, was*, will*, etc.\n * - String: name, title, label, description, get*Name, *Str, etc.\n * - Date: *At, *Date, *Time, *Timestamp\n * - Array: *List, *Array, *Items, *Collection, all*, get*s\n *\n * @param name - The computed field name to analyze\n * @returns Inferred TypeScript type\n */\nfunction inferComputedType(name: string): string {\n const lowerName = name.toLowerCase();\n\n // ================== Date patterns (check FIRST - more specific) ==================\n // Date patterns should be checked before number patterns because\n // words like \"expirationDate\" contain \"ration\" which matches \"ratio\"\n if (lowerName.endsWith('at') || lowerName.endsWith('date') ||\n lowerName.endsWith('time') || lowerName.endsWith('timestamp') ||\n lowerName.endsWith('datetime') || lowerName.endsWith('since') ||\n lowerName.endsWith('until') || lowerName.endsWith('deadline') ||\n lowerName.startsWith('date') || lowerName.startsWith('time')) {\n return 'Date';\n }\n\n // ================== Number patterns ==================\n // Aggregation suffixes\n if (lowerName.endsWith('count') || lowerName.endsWith('total') ||\n lowerName.endsWith('sum') || lowerName.endsWith('avg') ||\n lowerName.endsWith('average') || lowerName.endsWith('min') ||\n lowerName.endsWith('max') || lowerName.endsWith('length') ||\n lowerName.endsWith('size') || lowerName.endsWith('index')) {\n return 'number';\n }\n\n // Numeric value patterns\n if (lowerName.includes('amount') || lowerName.includes('price') ||\n lowerName.includes('cost') || lowerName.includes('fee') ||\n lowerName.includes('balance') || lowerName.includes('score') ||\n lowerName.includes('rating') || lowerName.includes('rank') ||\n lowerName.includes('level') || lowerName.includes('age') ||\n lowerName.includes('weight') || lowerName.includes('height') ||\n lowerName.includes('width') || lowerName.includes('depth') ||\n lowerName.includes('quantity') || lowerName.includes('percent') ||\n lowerName.includes('ratio') || lowerName.includes('progress') ||\n lowerName.includes('position') || lowerName.includes('order') ||\n lowerName.includes('duration') || lowerName.includes('offset') ||\n lowerName.includes('limit')) {\n return 'number';\n }\n\n // ================== Boolean patterns ==================\n // Common prefixes\n if (lowerName.startsWith('is') || lowerName.startsWith('has') ||\n lowerName.startsWith('can') || lowerName.startsWith('should') ||\n lowerName.startsWith('will') || lowerName.startsWith('was') ||\n lowerName.startsWith('did') || lowerName.startsWith('does') ||\n lowerName.startsWith('allow') || lowerName.startsWith('enable') ||\n lowerName.startsWith('disable')) {\n return 'boolean';\n }\n\n // Boolean suffixes\n if (lowerName.endsWith('enabled') || lowerName.endsWith('disabled') ||\n lowerName.endsWith('active') || lowerName.endsWith('visible') ||\n lowerName.endsWith('hidden') || lowerName.endsWith('valid') ||\n lowerName.endsWith('invalid') || lowerName.endsWith('complete') ||\n lowerName.endsWith('empty') || lowerName.endsWith('loading') ||\n lowerName.endsWith('loaded') || lowerName.endsWith('ready') ||\n lowerName.endsWith('available') || lowerName.endsWith('exists') ||\n lowerName.endsWith('selected') || lowerName.endsWith('checked') ||\n lowerName.endsWith('required') || lowerName.endsWith('optional')) {\n return 'boolean';\n }\n\n // ================== String patterns ==================\n if (lowerName.endsWith('name') || lowerName.endsWith('title') ||\n lowerName.endsWith('label') || lowerName.endsWith('description') ||\n lowerName.endsWith('text') || lowerName.endsWith('content') ||\n lowerName.endsWith('message') || lowerName.endsWith('str') ||\n lowerName.endsWith('string') || lowerName.endsWith('slug') ||\n lowerName.endsWith('path') || lowerName.endsWith('url') ||\n lowerName.endsWith('uri') || lowerName.endsWith('email') ||\n lowerName.endsWith('phone') || lowerName.endsWith('address') ||\n lowerName.endsWith('display') || lowerName.endsWith('format') ||\n lowerName.endsWith('html') || lowerName.endsWith('json') ||\n lowerName.endsWith('type') || lowerName.endsWith('status') ||\n lowerName.endsWith('key') || lowerName.endsWith('id') ||\n lowerName.endsWith('code') || lowerName.endsWith('token') ||\n lowerName.endsWith('hash') || lowerName.endsWith('signature')) {\n return 'string';\n }\n\n // Common getters that return strings\n if (lowerName.startsWith('get') && (\n lowerName.includes('name') || lowerName.includes('title') ||\n lowerName.includes('label') || lowerName.includes('display') ||\n lowerName.includes('format') || lowerName.includes('string'))) {\n return 'string';\n }\n\n // ================== Array patterns ==================\n if (lowerName.endsWith('list') || lowerName.endsWith('array') ||\n lowerName.endsWith('items') || lowerName.endsWith('collection') ||\n lowerName.endsWith('all') || lowerName.endsWith('entries') ||\n lowerName.endsWith('values') || lowerName.endsWith('keys') ||\n lowerName.endsWith('ids') || lowerName.endsWith('names') ||\n lowerName.startsWith('all') || lowerName.startsWith('list')) {\n return 'unknown[]';\n }\n\n // Plural getter patterns (e.g., getUsers, fetchPosts)\n if ((lowerName.startsWith('get') || lowerName.startsWith('fetch') ||\n lowerName.startsWith('load') || lowerName.startsWith('find')) &&\n (lowerName.endsWith('s') && !lowerName.endsWith('ss'))) {\n return 'unknown[]';\n }\n\n // ================== Object patterns ==================\n if (lowerName.endsWith('config') || lowerName.endsWith('options') ||\n lowerName.endsWith('settings') || lowerName.endsWith('props') ||\n lowerName.endsWith('properties') || lowerName.endsWith('data') ||\n lowerName.endsWith('info') || lowerName.endsWith('meta') ||\n lowerName.endsWith('metadata') || lowerName.endsWith('attrs') ||\n lowerName.endsWith('attributes') || lowerName.endsWith('context') ||\n lowerName.endsWith('state') || lowerName.endsWith('result') ||\n lowerName.endsWith('response') || lowerName.endsWith('payload')) {\n return 'Record<string, unknown>';\n }\n\n // Default to string for simple getters (safest assumption)\n if (lowerName.startsWith('get') || lowerName.startsWith('compute') ||\n lowerName.startsWith('calculate') || lowerName.startsWith('derive')) {\n // Look for more hints in the name\n const withoutPrefix = lowerName.replace(/^(get|compute|calculate|derive)/, '');\n if (withoutPrefix) {\n return inferComputedType(withoutPrefix);\n }\n }\n\n // Default to unknown for unrecognized patterns\n return 'unknown';\n}\n\n/**\n * Find a schema by name, trying multiple naming variations.\n * This handles cases where relation targets don't exactly match schema names.\n *\n * @param schemaMap - Map of schema names to schemas\n * @param name - The name to search for\n * @returns The matching schema, or undefined if not found\n */\nfunction findSchemaByName(\n schemaMap: Map<string, EntitySchema>,\n name: string\n): EntitySchema | undefined {\n // Try exact match first\n const exact = schemaMap.get(name);\n if (exact) return exact;\n\n // Try singular form\n const singular = singularize(name);\n const singularMatch = schemaMap.get(singular);\n if (singularMatch) return singularMatch;\n\n // Try plural form\n const plural = pluralize(name);\n const pluralMatch = schemaMap.get(plural);\n if (pluralMatch) return pluralMatch;\n\n // Try case-insensitive match\n const lowerName = name.toLowerCase();\n for (const [schemaName, schema] of schemaMap) {\n if (schemaName.toLowerCase() === lowerName) return schema;\n if (singularize(schemaName).toLowerCase() === lowerName) return schema;\n if (pluralize(schemaName).toLowerCase() === lowerName) return schema;\n }\n\n return undefined;\n}\n\n/**\n * Analyze multiple schemas and return fully analyzed versions\n *\n * @param schemas - Raw entity schemas\n * @param config - Schemock configuration\n * @returns Analyzed schemas sorted by dependencies (topological order)\n *\n * @example\n * ```typescript\n * const analyzed = analyzeSchemas([userSchema, postSchema], config);\n * // Returns schemas sorted so dependencies come first\n * ```\n */\nexport function analyzeSchemas(schemas: EntitySchema[], config: SchemockConfig): AnalyzedSchema[] {\n const schemaMap = new Map(schemas.map((s) => [s.name, s]));\n const analyzed: AnalyzedSchema[] = [];\n\n for (const schema of schemas) {\n analyzed.push(analyzeSchema(schema, schemaMap, config));\n }\n\n // Sort by dependencies (schemas with no deps first)\n return topologicalSort(analyzed);\n}\n\n/**\n * Analyze a single schema\n */\nfunction analyzeSchema(\n schema: EntitySchema,\n schemaMap: Map<string, EntitySchema>,\n config: SchemockConfig\n): AnalyzedSchema {\n // Compute both singular and plural forms (handles both user->users and users->users)\n const singular = singularize(schema.name);\n const plural = pluralize(schema.name, config.pluralization);\n const adapterConfig = config.adapters?.[config.adapter];\n\n // Determine table name from config or default\n let tableName = plural;\n if (config.adapter === 'supabase' && adapterConfig && 'tableMap' in adapterConfig) {\n tableName = adapterConfig.tableMap?.[schema.name] ?? plural;\n } else if (config.adapter === 'firebase' && adapterConfig && 'collectionMap' in adapterConfig) {\n tableName = adapterConfig.collectionMap?.[schema.name] ?? plural;\n }\n\n const result: AnalyzedSchema = {\n name: schema.name,\n singularName: singular,\n pluralName: plural,\n pascalName: toPascalCase(singular), // Use singular for PascalCase (User, not Users)\n pascalSingularName: toPascalCase(singular),\n pascalPluralName: toPascalCase(plural),\n tableName,\n endpoint: `${config.apiPrefix}/${plural}`,\n\n fields: [],\n relations: [],\n computed: [],\n\n dependsOn: [],\n\n hasTimestamps: schema.timestamps ?? true,\n isJunctionTable: false,\n\n rls: analyzeRLS(schema.rls),\n indexes: [], // Will be populated after fields analysis\n rpc: [], // Will be populated after RPC analysis\n\n original: schema,\n };\n\n // Analyze fields\n let refCount = 0;\n let nonRefNonIdCount = 0;\n\n for (const [fieldName, field] of Object.entries(schema.fields)) {\n const analyzedField = analyzeField(fieldName, field, config);\n result.fields.push(analyzedField);\n\n if (analyzedField.isRef) {\n refCount++;\n if (analyzedField.refTarget) {\n result.dependsOn.push(analyzedField.refTarget);\n }\n } else if (fieldName !== 'id') {\n nonRefNonIdCount++;\n }\n }\n\n // Detect junction table (2+ refs, 0-1 other fields like 'role')\n result.isJunctionTable = refCount >= 2 && nonRefNonIdCount <= 1;\n\n // Analyze relations\n if (schema.relations) {\n for (const [relName, rel] of Object.entries(schema.relations)) {\n const analyzedRel = analyzeRelation(relName, rel, singular, schema.fields, schemaMap, schema.name);\n result.relations.push(analyzedRel);\n\n // Add belongsTo targets to dependencies (for topological sort)\n if (analyzedRel.type === 'belongsTo' && !result.dependsOn.includes(analyzedRel.target)) {\n result.dependsOn.push(analyzedRel.target);\n }\n }\n }\n\n // Analyze computed fields\n if (schema.computed) {\n for (const [compName, comp] of Object.entries(schema.computed)) {\n // Infer type from naming convention since computed fields don't have explicit types\n const inferredType = inferComputedType(compName);\n result.computed.push({\n name: compName,\n type: inferredType,\n tsType: primitiveToTs(inferredType),\n });\n }\n }\n\n // Analyze indexes (user-defined + auto-generated for FKs and unique fields)\n result.indexes = analyzeIndexes(schema, result.fields, tableName);\n\n // Analyze RPC functions\n result.rpc = analyzeRPC(schema, tableName, schemaMap);\n\n return result;\n}\n\n/**\n * Analyze a single field\n */\nfunction analyzeField(name: string, field: FieldDefinition, config: SchemockConfig): AnalyzedField {\n const result: AnalyzedField = {\n name,\n type: field.type,\n tsType: fieldToTsType(field),\n fakerCall: fieldToFakerCall(name, field, config),\n\n nullable: field.nullable ?? false,\n unique: field.unique ?? false,\n readOnly: field.readOnly ?? false,\n hasDefault: field.default !== undefined,\n defaultValue: field.default,\n\n isRef: field.type === 'ref',\n refTarget: field.type === 'ref' ? field.target : undefined,\n\n isEnum: field.type === 'enum' || (field.values?.length ?? 0) > 0,\n enumValues: field.values as string[] | undefined,\n\n isArray: field.type === 'array',\n isObject: field.type === 'object',\n\n min: field.constraints?.min,\n max: field.constraints?.max,\n pattern: field.constraints?.pattern?.source,\n };\n\n // Handle nested types\n if (field.type === 'array' && field.items) {\n result.itemType = analyzeField('item', field.items, config);\n }\n if (field.type === 'object' && field.shape) {\n result.shape = {};\n for (const [k, v] of Object.entries(field.shape)) {\n result.shape[k] = analyzeField(k, v, config);\n }\n }\n\n return result;\n}\n\n/**\n * Find a foreign key field in a set of fields that references a target entity.\n *\n * Matching strategy (in order of preference):\n * 1. Find a ref field with target matching the entity (e.g., field.ref('failoverconfig'))\n * 2. Find a field with name matching common patterns (entityId, entity_id, entityID)\n *\n * @param fields - Record of field definitions to search\n * @param entityName - The entity name to match (e.g., 'project', 'user', 'failoverconfig')\n * @returns The matching field name, or undefined if not found\n */\nfunction findForeignKeyField(\n fields: Record<string, FieldDefinition>,\n entityName: string\n): string | undefined {\n const lowerEntity = entityName.toLowerCase();\n const singularEntity = singularize(entityName).toLowerCase();\n const pluralEntity = pluralize(entityName).toLowerCase();\n\n // Strategy 1: Find a ref field that targets this entity\n // This handles cases like: config_id: field.ref('failoverconfig')\n for (const [fieldName, field] of Object.entries(fields)) {\n if (field.type === 'ref' && field.target) {\n const targetLower = field.target.toLowerCase();\n const targetSingular = singularize(field.target).toLowerCase();\n const targetPlural = pluralize(field.target).toLowerCase();\n\n // Match if target matches entity name in any form (singular/plural)\n if (targetLower === lowerEntity ||\n targetLower === singularEntity ||\n targetLower === pluralEntity ||\n targetSingular === singularEntity ||\n targetPlural === pluralEntity) {\n return fieldName;\n }\n }\n }\n\n // Strategy 2: Match by field name patterns (legacy behavior)\n // Patterns to match: projectId, project_id, projectID\n const fieldNames = Object.keys(fields);\n const patterns = [\n `${singularEntity}Id`, // projectId\n `${singularEntity}_id`, // project_id\n `${singularEntity}ID`, // projectID\n `${pluralEntity}Id`, // projectsId (less common but possible)\n `${pluralEntity}_id`, // projects_id\n ];\n\n for (const pattern of patterns) {\n const match = fieldNames.find(f => f.toLowerCase() === pattern.toLowerCase());\n if (match) {\n return match; // Return the actual field name (preserving original case)\n }\n }\n\n return undefined;\n}\n\n/**\n * Analyze a relation definition\n *\n * Foreign key inference:\n * - belongsTo: Look for FK field in THIS schema's fields (e.g., project_id, projectId)\n * - hasMany/hasOne: Look for FK field in TARGET schema's fields\n *\n * Falls back to camelCase convention if no matching field is found.\n *\n * @param name - Relation name (e.g., 'posts', 'author')\n * @param rel - Relation definition from schema\n * @param sourceEntitySingular - Singularized name of the entity defining this relation\n * @param localFields - Fields defined on this schema (for belongsTo FK lookup)\n * @param schemaMap - Map of all schemas (for hasMany/hasOne FK lookup in target)\n * @param sourceEntityName - The source entity name (for warning messages)\n */\nfunction analyzeRelation(\n name: string,\n rel: RelationDefinition,\n sourceEntitySingular: string,\n localFields: Record<string, FieldDefinition>,\n schemaMap: Map<string, EntitySchema>,\n sourceEntityName?: string\n): AnalyzedRelation {\n const singularTarget = singularize(rel.target);\n let foreignKey: string;\n let fkInferred = false;\n let fkDefaultFallback = false;\n\n if (rel.foreignKey) {\n // User explicitly specified the FK - use it as-is\n foreignKey = rel.foreignKey;\n } else if (rel.type === 'belongsTo') {\n // FK is on THIS entity, pointing to target\n // Look for existing field that matches the target entity name\n const foundField = findForeignKeyField(localFields, singularTarget);\n if (foundField) {\n foreignKey = foundField;\n fkInferred = true;\n } else {\n foreignKey = `${singularTarget}Id`;\n fkDefaultFallback = true;\n }\n } else {\n // hasMany/hasOne: FK is on the TARGET entity, pointing back to source\n const targetSchema = findSchemaByName(schemaMap, rel.target);\n const targetFields = targetSchema?.fields ?? {};\n const targetRelations = targetSchema?.relations ?? {};\n let foundField: string | undefined;\n\n // Strategy 1: Look for a belongsTo relation on the target that points back to source\n for (const [, targetRel] of Object.entries(targetRelations)) {\n if (targetRel.type === 'belongsTo') {\n // Check if this belongsTo points back to our source entity\n const belongsToTarget = targetRel.target.toLowerCase();\n const sourceVariants = [\n sourceEntitySingular.toLowerCase(),\n singularize(sourceEntitySingular).toLowerCase(),\n pluralize(sourceEntitySingular).toLowerCase(),\n ];\n\n const targetMatches = sourceVariants.includes(belongsToTarget) ||\n sourceVariants.includes(singularize(belongsToTarget).toLowerCase()) ||\n sourceVariants.includes(pluralize(belongsToTarget).toLowerCase());\n\n if (targetMatches) {\n // Found a belongsTo pointing back to source\n if (targetRel.foreignKey) {\n // Use explicitly specified foreignKey\n foundField = targetRel.foreignKey;\n } else {\n // Run the same FK inference logic used for belongsTo\n // Look for a field that matches the belongsTo target\n const belongsToSingular = singularize(targetRel.target);\n foundField = findForeignKeyField(targetFields, belongsToSingular);\n }\n if (foundField) break;\n }\n }\n }\n\n // Strategy 2: Look for a ref field in target schema that references source\n if (!foundField) {\n foundField = findForeignKeyField(targetFields, sourceEntitySingular);\n }\n\n if (foundField) {\n foreignKey = foundField;\n fkInferred = true;\n } else {\n foreignKey = `${sourceEntitySingular}Id`;\n fkDefaultFallback = true;\n }\n }\n\n // Emit warning if FK was not found and we fell back to default naming\n if (fkDefaultFallback) {\n const entityContext = sourceEntityName ? ` in '${sourceEntityName}'` : '';\n const targetInfo = rel.type === 'belongsTo'\n ? `Could not find a field matching '${singularTarget}' (tried: ${singularTarget}Id, ${singularTarget}_id, ref fields targeting ${rel.target})`\n : `Could not find a field in '${rel.target}' pointing back to '${sourceEntitySingular}'`;\n\n console.warn(\n `\\x1b[33mā FK Inference Warning:\\x1b[0m Relation '${name}'${entityContext} (${rel.type} ā ${rel.target})\\n` +\n ` ${targetInfo}\\n` +\n ` Using default: '${foreignKey}'\\n` +\n ` \\x1b[2mTo fix: Add 'foreignKey' option to the relation, e.g.: ${rel.type}('${rel.target}', { foreignKey: 'yourFieldName' })\\x1b[0m`\n );\n }\n\n const result: AnalyzedRelation = {\n name,\n type: rel.type,\n target: rel.target,\n targetPascal: toPascalCase(singularize(rel.target)),\n foreignKey,\n eager: rel.eager ?? false,\n inferred: fkInferred, // Track whether FK was inferred vs explicit\n };\n\n if (rel.type === 'belongsTo') {\n result.localField = foreignKey;\n }\n\n // Check for many-to-many (hasMany with through)\n if (rel.type === 'hasMany' && rel.through) {\n result.type = 'manyToMany';\n result.through = rel.through;\n result.otherKey = rel.otherKey;\n }\n\n return result;\n}\n\n/**\n * Analyze indexes for a schema\n *\n * Generates:\n * 1. User-defined indexes from schema.indexes\n * 2. Auto-generated indexes for FK fields (ref types)\n * 3. Auto-generated indexes for unique fields\n */\nfunction analyzeIndexes(\n schema: EntitySchema,\n fields: AnalyzedField[],\n tableName: string\n): AnalyzedIndex[] {\n const indexes: AnalyzedIndex[] = [];\n const existingIndexFields = new Set<string>();\n\n // 1. Process user-defined indexes\n if (schema.indexes) {\n for (const indexConfig of schema.indexes) {\n const indexName = indexConfig.name ?? `idx_${tableName}_${indexConfig.fields.join('_')}`;\n\n indexes.push({\n name: indexName,\n tableName,\n fields: indexConfig.fields,\n type: indexConfig.type ?? 'btree',\n unique: indexConfig.unique ?? false,\n using: indexConfig.using,\n where: indexConfig.where,\n concurrently: indexConfig.concurrently ?? false,\n autoGenerated: false,\n });\n\n // Track which fields already have indexes\n indexConfig.fields.forEach((f) => existingIndexFields.add(f));\n }\n }\n\n // 2. Auto-generate indexes for FK fields (ref types)\n for (const field of fields) {\n if (field.isRef && !existingIndexFields.has(field.name)) {\n indexes.push({\n name: `idx_${tableName}_${toSnakeCase(field.name)}`,\n tableName,\n fields: [field.name],\n type: 'btree',\n unique: false,\n concurrently: false,\n autoGenerated: true,\n });\n existingIndexFields.add(field.name);\n }\n }\n\n // 3. Auto-generate indexes for unique fields (except 'id' and 'email' which often have unique constraints)\n for (const field of fields) {\n if (field.unique && field.name !== 'id' && !existingIndexFields.has(field.name)) {\n indexes.push({\n name: `idx_${tableName}_${toSnakeCase(field.name)}_unique`,\n tableName,\n fields: [field.name],\n type: 'btree',\n unique: true,\n concurrently: false,\n autoGenerated: true,\n });\n existingIndexFields.add(field.name);\n }\n }\n\n return indexes;\n}\n\n/**\n * Map common schema types to PostgreSQL types\n */\nfunction schemaToPgType(type: string): string {\n const typeMap: Record<string, string> = {\n uuid: 'UUID',\n string: 'TEXT',\n text: 'TEXT',\n email: 'TEXT',\n url: 'TEXT',\n int: 'INTEGER',\n integer: 'INTEGER',\n number: 'DOUBLE PRECISION',\n float: 'DOUBLE PRECISION',\n boolean: 'BOOLEAN',\n date: 'TIMESTAMPTZ',\n datetime: 'TIMESTAMPTZ',\n json: 'JSONB',\n jsonb: 'JSONB',\n array: 'JSONB',\n object: 'JSONB',\n };\n return typeMap[type.toLowerCase()] ?? 'TEXT';\n}\n\n/**\n * Analyze RPC functions for a schema\n */\nfunction analyzeRPC(\n schema: EntitySchema,\n tableName: string,\n schemaMap: Map<string, EntitySchema>\n): AnalyzedRPC[] {\n const rpcFunctions: AnalyzedRPC[] = [];\n\n if (!schema.rpc) {\n return rpcFunctions;\n }\n\n for (const [name, config] of Object.entries(schema.rpc)) {\n // Determine return type\n const returnsArray = config.returns.endsWith('[]');\n const baseReturnType = returnsArray ? config.returns.slice(0, -2) : config.returns;\n\n // Check if return type is an entity name\n const isEntityReturn = schemaMap.has(baseReturnType) || baseReturnType === schema.name;\n\n let pgReturns: string;\n if (config.returns === 'void') {\n pgReturns = 'VOID';\n } else if (isEntityReturn) {\n // Return entity type maps to SETOF tableName\n const targetTable = baseReturnType === schema.name\n ? tableName\n : schemaMap.get(baseReturnType)?.name ?? baseReturnType;\n pgReturns = returnsArray ? `SETOF ${targetTable}` : targetTable;\n } else {\n // Scalar type\n pgReturns = returnsArray ? `${schemaToPgType(baseReturnType)}[]` : schemaToPgType(baseReturnType);\n }\n\n // Process arguments\n const args = (config.args ?? []).map((arg) => ({\n name: arg.name,\n type: arg.type,\n pgType: schemaToPgType(arg.type),\n default: arg.default,\n }));\n\n rpcFunctions.push({\n name,\n entityName: schema.name,\n tableName,\n args,\n returns: config.returns,\n pgReturns,\n returnsArray,\n sql: config.sql,\n language: config.language ?? 'sql',\n volatility: config.volatility ?? 'volatile',\n security: config.security ?? 'invoker',\n description: config.description,\n });\n }\n\n return rpcFunctions;\n}\n\n/**\n * Extract function body from arrow function source\n * Converts: (row, ctx) => { ... } to just the body content\n * Or: (row, ctx) => expression to \"return expression\"\n */\nfunction extractFunctionBody(fnSource: string): string {\n // Remove leading/trailing whitespace\n const trimmed = fnSource.trim();\n\n // Match arrow function pattern\n const arrowMatch = trimmed.match(/^\\([^)]*\\)\\s*=>\\s*(.+)$/s);\n if (!arrowMatch) {\n // Not an arrow function, return as-is\n return trimmed;\n }\n\n const body = arrowMatch[1].trim();\n\n // If body starts with {, it's a block body - extract inner content\n if (body.startsWith('{') && body.endsWith('}')) {\n return body.slice(1, -1).trim();\n }\n\n // Expression body - wrap in return\n return `return ${body};`;\n}\n\n/**\n * Serialize an RLS policy function for code generation\n */\nfunction serializeRLSFunction(fn: unknown): string | undefined {\n if (typeof fn !== 'function') return undefined;\n\n const source = fn.toString();\n\n // Extract and return the function body\n return extractFunctionBody(source);\n}\n\n/**\n * Analyze RLS configuration\n */\nfunction analyzeRLS(rls?: RLSConfig): AnalyzedRLS {\n if (!rls) {\n return {\n enabled: false,\n hasSelect: false,\n hasInsert: false,\n hasUpdate: false,\n hasDelete: false,\n scope: [],\n bypass: [],\n };\n }\n\n const hasScope = (rls.scope?.length ?? 0) > 0;\n\n // Check for policies (either JS functions, scope mappings, or custom SQL)\n const hasSelect = !!(rls.select || hasScope || rls.sql?.select);\n const hasInsert = !!(rls.insert || hasScope || rls.sql?.insert);\n const hasUpdate = !!(rls.update || hasScope || rls.sql?.update);\n const hasDelete = !!(rls.delete || hasScope || rls.sql?.delete);\n\n const enabled = hasSelect || hasInsert || hasUpdate || hasDelete;\n\n // Serialize function sources for code generation\n const selectSource = serializeRLSFunction(rls.select);\n const insertSource = serializeRLSFunction(rls.insert);\n const updateSource = serializeRLSFunction(rls.update);\n const deleteSource = serializeRLSFunction(rls.delete);\n\n return {\n enabled,\n hasSelect,\n hasInsert,\n hasUpdate,\n hasDelete,\n scope: rls.scope ?? [],\n bypass: rls.bypass ?? [],\n selectSource,\n insertSource,\n updateSource,\n deleteSource,\n sql: rls.sql,\n original: rls,\n };\n}\n\n/**\n * Topological sort of schemas by dependencies\n */\nfunction topologicalSort(schemas: AnalyzedSchema[]): AnalyzedSchema[] {\n const sorted: AnalyzedSchema[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const schemaMap = new Map(schemas.map((s) => [s.name, s]));\n\n function visit(schema: AnalyzedSchema) {\n if (visited.has(schema.name)) return;\n if (visiting.has(schema.name)) {\n // Circular dependency - just add it\n console.warn(`Warning: Circular dependency involving ${schema.name}`);\n return;\n }\n\n visiting.add(schema.name);\n\n for (const dep of schema.dependsOn) {\n const depSchema = schemaMap.get(dep);\n if (depSchema) {\n visit(depSchema);\n }\n }\n\n visiting.delete(schema.name);\n visited.add(schema.name);\n sorted.push(schema);\n }\n\n for (const schema of schemas) {\n visit(schema);\n }\n\n return sorted;\n}\n","/**\n * Endpoint analysis for Schemock CLI\n *\n * Analyzes endpoint schemas and extracts all information needed for code generation.\n *\n * @module cli/analyze-endpoints\n * @category CLI\n */\n\nimport type { EndpointSchema, FieldDefinition } from '../schema/types';\nimport type { AnalyzedEndpoint, AnalyzedEndpointField } from './types';\n\n/**\n * Analyze an array of endpoint schemas\n *\n * @param endpoints - Array of endpoint schemas from discovery\n * @returns Array of analyzed endpoints ready for code generation\n */\nexport function analyzeEndpoints(endpoints: EndpointSchema[]): AnalyzedEndpoint[] {\n return endpoints.map(analyzeEndpoint);\n}\n\n/**\n * Analyze a single endpoint schema\n */\nfunction analyzeEndpoint(endpoint: EndpointSchema): AnalyzedEndpoint {\n // Derive name from path\n const name = deriveEndpointName(endpoint.path);\n const pascalName = toPascalCase(name);\n\n // Extract path parameters (e.g., :id, :userId)\n const pathParams = extractPathParams(endpoint.path);\n\n // Analyze params, body, and response fields\n const params = analyzeFields(endpoint.params);\n const body = analyzeFields(endpoint.body);\n const response = analyzeFields(endpoint.response);\n\n // Serialize the mock resolver function to string\n const mockResolverSource = serializeMockResolver(endpoint.mockResolver);\n\n return {\n path: endpoint.path,\n method: endpoint.method,\n name,\n pascalName,\n pathParams,\n params,\n body,\n response,\n mockResolverSource,\n description: endpoint.description,\n };\n}\n\n/**\n * Derive endpoint name from path\n *\n * Examples:\n * - /api/search -> search\n * - /api/orders/:id -> ordersById\n * - /api/users/:userId/posts -> userPosts\n * - /health -> health\n */\nfunction deriveEndpointName(path: string): string {\n // Remove /api/ prefix if present\n let cleaned = path.replace(/^\\/api\\//, '');\n\n // Remove leading slash\n cleaned = cleaned.replace(/^\\//, '');\n\n // Handle path parameters - convert :param to ByParam\n const parts = cleaned.split('/');\n const nameParts: string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part.startsWith(':')) {\n // Path parameter - add \"By\" prefix and capitalize\n const paramName = part.slice(1);\n nameParts.push('By' + capitalize(paramName));\n } else if (part) {\n // Regular path segment\n if (i === 0) {\n nameParts.push(part);\n } else {\n nameParts.push(capitalize(part));\n }\n }\n }\n\n return nameParts.join('');\n}\n\n/**\n * Extract path parameter names from path\n *\n * Example: /api/users/:userId/posts/:postId -> ['userId', 'postId']\n */\nfunction extractPathParams(path: string): string[] {\n const matches = path.match(/:(\\w+)/g) || [];\n return matches.map((m) => m.slice(1));\n}\n\n/**\n * Convert string to PascalCase\n */\nfunction toPascalCase(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Analyze a record of field definitions\n */\nfunction analyzeFields(fields: Record<string, FieldDefinition>): AnalyzedEndpointField[] {\n return Object.entries(fields).map(([name, field]) => analyzeField(name, field));\n}\n\n/**\n * Analyze a single field definition\n */\nfunction analyzeField(name: string, field: FieldDefinition): AnalyzedEndpointField {\n const tsType = fieldToTsType(field);\n const hasDefault = field.default !== undefined;\n\n const analyzed: AnalyzedEndpointField = {\n name,\n type: field.type,\n tsType,\n required: !hasDefault && !field.nullable,\n hasDefault,\n default: field.default,\n isArray: field.type === 'array',\n isObject: field.type === 'object',\n };\n\n // Handle enum values\n if (field.values && field.values.length > 0) {\n analyzed.enumValues = field.values as string[];\n }\n\n // Handle array items\n if (field.type === 'array' && field.items) {\n analyzed.itemType = analyzeField('item', field.items);\n }\n\n // Handle object shape\n if (field.type === 'object' && field.shape) {\n analyzed.shape = Object.entries(field.shape).map(([n, f]) => analyzeField(n, f));\n }\n\n return analyzed;\n}\n\n/**\n * Convert field definition to TypeScript type string\n */\nfunction fieldToTsType(field: FieldDefinition): string {\n // Handle enum types\n if (field.values && field.values.length > 0) {\n return field.values.map((v) => `'${v}'`).join(' | ');\n }\n\n // Handle array types\n if (field.type === 'array') {\n if (field.items) {\n const itemType = fieldToTsType(field.items);\n return `Array<${itemType}>`;\n }\n return 'unknown[]';\n }\n\n // Handle object types\n if (field.type === 'object') {\n if (field.shape) {\n const props = Object.entries(field.shape)\n .map(([name, f]) => {\n const optional = f.default !== undefined ? '?' : '';\n return `${name}${optional}: ${fieldToTsType(f)}`;\n })\n .join('; ');\n return `{ ${props} }`;\n }\n return 'Record<string, unknown>';\n }\n\n // Map basic types\n const typeMap: Record<string, string> = {\n string: 'string',\n uuid: 'string',\n email: 'string',\n url: 'string',\n number: 'number',\n int: 'number',\n float: 'number',\n boolean: 'boolean',\n date: 'Date',\n ref: 'string',\n };\n\n const baseType = typeMap[field.type] || 'unknown';\n\n // Add null if nullable\n if (field.nullable) {\n return `${baseType} | null`;\n }\n\n return baseType;\n}\n\n/**\n * Serialize mock resolver function to string\n *\n * Handles both regular functions and arrow functions\n */\nfunction serializeMockResolver(resolver: Function): string {\n const source = resolver.toString();\n\n // If it's an arrow function, it might need to be wrapped\n // Check if it starts with 'async' or directly with parameters\n if (source.startsWith('async (') || source.startsWith('(') || source.startsWith('async(')) {\n return source;\n }\n\n // If it's a regular function, convert to arrow function format\n if (source.startsWith('async function') || source.startsWith('function')) {\n // Extract parameters and body\n const match = source.match(/^(async\\s+)?function\\s*\\w*\\s*\\(([^)]*)\\)\\s*\\{([\\s\\S]*)\\}$/);\n if (match) {\n const [, asyncPrefix, params, body] = match;\n return `${asyncPrefix || ''}(${params}) => {${body}}`;\n }\n }\n\n // Return as-is if we can't parse it\n return source;\n}\n","/**\n * Code builder utility for generating formatted code\n *\n * @module cli/utils/code-builder\n * @category CLI\n */\n\n/**\n * Helper class for building generated code with proper indentation\n *\n * @example\n * ```typescript\n * const code = new CodeBuilder();\n * code.line(\"import { foo } from 'bar';\");\n * code.line();\n * code.block('export function myFunc() {', () => {\n * code.line('return 42;');\n * });\n * console.log(code.toString());\n * ```\n */\nexport class CodeBuilder {\n private _lines: string[] = [];\n private indentLevel = 0;\n private indentStr = ' '; // 2 spaces\n\n /**\n * Increase indentation level\n */\n indent(): this {\n this.indentLevel++;\n return this;\n }\n\n /**\n * Decrease indentation level\n */\n dedent(): this {\n this.indentLevel = Math.max(0, this.indentLevel - 1);\n return this;\n }\n\n /**\n * Add a line of code\n */\n line(content: string = ''): this {\n if (content === '') {\n this._lines.push('');\n } else {\n this._lines.push(this.indentStr.repeat(this.indentLevel) + content);\n }\n return this;\n }\n\n /**\n * Add multiple lines of code\n */\n addLines(content: string[]): this {\n for (const line of content) {\n this.line(line);\n }\n return this;\n }\n\n /**\n * Add a single-line comment\n */\n comment(text: string): this {\n return this.line(`// ${text}`);\n }\n\n /**\n * Add a JSDoc comment\n */\n docComment(text: string): this {\n return this.line(`/** ${text} */`);\n }\n\n /**\n * Add a multi-line JSDoc comment\n */\n multiDocComment(lines: string[]): this {\n this.line('/**');\n for (const line of lines) {\n this.line(` * ${line}`);\n }\n this.line(' */');\n return this;\n }\n\n /**\n * Add a code block with automatic indentation\n */\n block(opener: string, fn: () => void, closer: string = '}'): this {\n this.line(opener);\n this.indent();\n fn();\n this.dedent();\n this.line(closer);\n return this;\n }\n\n /**\n * Add raw content without indentation\n */\n raw(content: string): this {\n this._lines.push(content);\n return this;\n }\n\n /**\n * Get the generated code as a string\n */\n toString(): string {\n return this._lines.join('\\n');\n }\n\n /**\n * Clear all content\n */\n clear(): this {\n this._lines = [];\n this.indentLevel = 0;\n return this;\n }\n\n /**\n * Get current indentation level\n */\n getIndentLevel(): number {\n return this.indentLevel;\n }\n}\n","/**\n * TypeScript types generator\n *\n * @module cli/generators/types\n * @category CLI\n */\n\nimport type { AnalyzedSchema, AnalyzedRelation } from '../types';\nimport { CodeBuilder } from '../utils/code-builder';\nimport { toPascalCase } from '../utils/pluralize';\n\n/**\n * Generate TypeScript type definitions for all schemas\n *\n * @param schemas - Analyzed schemas\n * @returns Generated TypeScript code\n */\nexport function generateTypes(schemas: AnalyzedSchema[]): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.comment('Regenerate with: npx schemock generate');\n code.line();\n\n // Generate types for each non-junction schema\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateEntityTypes(code, schema, schemas);\n }\n\n // Generate common types\n generateCommonTypes(code);\n\n return code.toString();\n}\n\n/**\n * Generate types for a single entity\n */\nfunction generateEntityTypes(code: CodeBuilder, schema: AnalyzedSchema, allSchemas: AnalyzedSchema[]): void {\n const { pascalName, fields, relations, computed, hasTimestamps } = schema;\n\n // ========== Main Entity Type ==========\n code.docComment(`${pascalName} entity`);\n code.block(`export interface ${pascalName} {`, () => {\n // Index signature for Record<string, unknown> compatibility\n code.line('[key: string]: unknown;');\n\n // Fields (includes timestamps if schema has timestamps: true)\n for (const field of fields) {\n const opt = field.nullable ? '?' : '';\n code.line(`${field.name}${opt}: ${field.tsType};`);\n }\n\n // Computed\n for (const comp of computed) {\n code.line(`${comp.name}: ${comp.tsType};`);\n }\n\n // Relations (optional - loaded on demand)\n for (const rel of relations) {\n const relType = rel.type === 'hasMany' || rel.type === 'manyToMany' ? `${rel.targetPascal}[]` : rel.targetPascal;\n code.line(`${rel.name}?: ${relType};`);\n }\n });\n code.line();\n\n // ========== With-Relation Types ==========\n for (const rel of relations) {\n const relType = rel.type === 'hasMany' || rel.type === 'manyToMany' ? `${rel.targetPascal}[]` : rel.targetPascal;\n const typeName = `${pascalName}With${toPascalCase(rel.name)}`;\n\n code.docComment(`${pascalName} with ${rel.name} loaded`);\n code.block(`export interface ${typeName} extends Omit<${pascalName}, '${rel.name}'> {`, () => {\n code.line(`${rel.name}: ${relType};`);\n });\n code.line();\n }\n\n // ========== Create Type ==========\n code.docComment(`Data for creating a ${pascalName}`);\n code.block(`export interface ${pascalName}Create {`, () => {\n for (const field of fields) {\n if (field.name === 'id' || field.readOnly) continue;\n const opt = field.nullable || field.hasDefault ? '?' : '';\n code.line(`${field.name}${opt}: ${field.tsType};`);\n }\n\n // Nested creates for hasMany/hasOne\n for (const rel of relations) {\n if (rel.type === 'hasMany') {\n code.line(`${rel.name}?: ${rel.targetPascal}Create[];`);\n } else if (rel.type === 'hasOne') {\n code.line(`${rel.name}?: ${rel.targetPascal}Create;`);\n }\n }\n });\n code.line();\n\n // ========== Update Type ==========\n code.docComment(`Data for updating a ${pascalName}`);\n code.block(`export interface ${pascalName}Update {`, () => {\n for (const field of fields) {\n if (field.name === 'id' || field.readOnly) continue;\n code.line(`${field.name}?: ${field.tsType};`);\n }\n });\n code.line();\n\n // ========== Filter Type ==========\n code.docComment(`Filter options for querying ${pascalName}`);\n code.block(`export interface ${pascalName}Filter {`, () => {\n // Index signature for compatibility with Record<string, unknown>\n code.line('[key: string]: unknown;');\n for (const field of fields) {\n code.line(`${field.name}?: ${field.tsType} | FieldFilter<${field.tsType}>;`);\n }\n });\n code.line();\n\n // ========== Include Type ==========\n if (relations.length > 0) {\n const relNames = relations.map((r) => `'${r.name}'`).join(' | ');\n code.docComment(`Relations that can be included when fetching ${pascalName}`);\n code.line(`export type ${pascalName}Include = ${relNames};`);\n code.line();\n }\n}\n\n/**\n * Generate common utility types\n */\nfunction generateCommonTypes(code: CodeBuilder): void {\n // Field filter type\n code.docComment('Generic field filter for complex queries');\n code.block('export interface FieldFilter<T> {', () => {\n code.line('equals?: T;');\n code.line('not?: T;');\n code.line('in?: T[];');\n code.line('notIn?: T[];');\n code.line('lt?: T;');\n code.line('lte?: T;');\n code.line('gt?: T;');\n code.line('gte?: T;');\n code.line('contains?: string;');\n code.line('startsWith?: string;');\n code.line('endsWith?: string;');\n code.line('isNull?: boolean;');\n });\n code.line();\n\n // Query options\n code.docComment('Common query options');\n code.block('export interface QueryOptions<TFilter, TInclude extends string = never> {', () => {\n code.line('where?: TFilter;');\n code.line('include?: TInclude[];');\n code.line('orderBy?: Record<string, \"asc\" | \"desc\">;');\n code.line('limit?: number;');\n code.line('offset?: number;');\n code.line('cursor?: string;');\n });\n code.line();\n\n // List response\n code.docComment('Paginated list response');\n code.block('export interface ListResponse<T> {', () => {\n code.line('data: T[];');\n code.block('meta: {', () => {\n code.line('total: number;');\n code.line('limit: number;');\n code.line('offset: number;');\n code.line('hasMore: boolean;');\n code.line('nextCursor?: string;');\n });\n });\n code.line();\n\n // Item response\n code.docComment('Single item response');\n code.block('export interface ItemResponse<T> {', () => {\n code.line('data: T;');\n });\n code.line();\n}\n","/**\n * Mock database factory generator (@mswjs/data)\n *\n * @module cli/generators/mock/db\n * @category CLI\n */\n\nimport type { AnalyzedSchema } from '../../types';\nimport type { MockAdapterConfig } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Generate @mswjs/data factory for mock database\n *\n * @param schemas - Analyzed schemas\n * @param config - Mock adapter configuration\n * @returns Generated TypeScript code\n */\nexport function generateMockDb(schemas: AnalyzedSchema[], config: MockAdapterConfig): string {\n const code = new CodeBuilder();\n const entityNames = schemas.map((s) => s.name);\n const persist = config.persist !== false; // Default to true\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { factory, primaryKey, nullable } from '@mswjs/data';\");\n code.line(\"import { faker } from '@faker-js/faker';\");\n code.line();\n\n // Set faker seed\n if (config.fakerSeed !== undefined) {\n code.line(`faker.seed(${config.fakerSeed});`);\n } else {\n code.line('faker.seed(Date.now());');\n }\n code.line();\n\n // Generate factory\n code.block('export const db = factory({', () => {\n for (const schema of schemas) {\n generateEntityFactory(code, schema);\n }\n }, '});');\n code.line();\n\n code.line('export type Database = typeof db;');\n\n // Add localStorage persistence\n if (persist) {\n code.line();\n generatePersistenceLayer(code, entityNames, config.storageKey);\n }\n\n return code.toString();\n}\n\n/**\n * Generate localStorage persistence layer\n */\nfunction generatePersistenceLayer(code: CodeBuilder, entityNames: string[], storageKey?: string): void {\n const key = storageKey || 'schemock';\n\n code.comment('=== localStorage Persistence ===');\n code.line();\n\n code.line(`const STORAGE_KEY = '${key}';`);\n code.line();\n\n // Check localStorage availability\n code.block('function isLocalStorageAvailable(): boolean {', () => {\n code.block('try {', () => {\n code.line(\"if (typeof window === 'undefined' || !window.localStorage) return false;\");\n code.line(\"const testKey = '__schemock_test__';\");\n code.line(\"window.localStorage.setItem(testKey, 'test');\");\n code.line('window.localStorage.removeItem(testKey);');\n code.line('return true;');\n }, '} catch {');\n code.indent();\n code.line('return false;');\n code.dedent();\n code.line('}');\n });\n code.line();\n\n // Restore dates helper\n code.block('function restoreDates(record: Record<string, unknown>): Record<string, unknown> {', () => {\n code.line('const result = { ...record };');\n code.block('for (const [key, value] of Object.entries(result)) {', () => {\n code.block(\"if (typeof value === 'string' && /^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}/.test(value)) {\", () => {\n code.line('const date = new Date(value);');\n code.line('if (!isNaN(date.getTime())) result[key] = date;');\n });\n });\n code.line('return result;');\n });\n code.line();\n\n // Load from localStorage\n code.block('function loadFromStorage(): void {', () => {\n code.line('if (!isLocalStorageAvailable()) return;');\n code.line();\n code.block('try {', () => {\n for (const entity of entityNames) {\n code.line(`const ${entity}Data = window.localStorage.getItem(\\`\\${STORAGE_KEY}:${entity}\\`);`);\n code.block(`if (${entity}Data) {`, () => {\n code.line(`const records = JSON.parse(${entity}Data) as Record<string, unknown>[];`);\n code.block('for (const record of records) {', () => {\n code.line('const restored = restoreDates(record);');\n code.line(`db.${entity}.create(restored as Parameters<typeof db.${entity}.create>[0]);`);\n });\n });\n }\n }, '} catch (error) {');\n code.indent();\n code.line(\"console.warn('[Schemock] Error loading from localStorage:', error);\");\n code.dedent();\n code.line('}');\n });\n code.line();\n\n // Save to localStorage\n code.block('function saveToStorage(): void {', () => {\n code.line('if (!isLocalStorageAvailable()) return;');\n code.line();\n code.block('try {', () => {\n for (const entity of entityNames) {\n code.line(`window.localStorage.setItem(\\`\\${STORAGE_KEY}:${entity}\\`, JSON.stringify(db.${entity}.getAll()));`);\n }\n }, '} catch (error) {');\n code.indent();\n code.line(\"console.warn('[Schemock] Error saving to localStorage:', error);\");\n code.dedent();\n code.line('}');\n });\n code.line();\n\n // Clear storage\n code.block('function clearStorage(): void {', () => {\n code.line('if (!isLocalStorageAvailable()) return;');\n for (const entity of entityNames) {\n code.line(`window.localStorage.removeItem(\\`\\${STORAGE_KEY}:${entity}\\`);`);\n }\n });\n code.line();\n\n // Debounced save\n code.line('let saveTimer: ReturnType<typeof setTimeout> | null = null;');\n code.line();\n code.block('function scheduleSave(): void {', () => {\n code.line('if (saveTimer) clearTimeout(saveTimer);');\n code.line('saveTimer = setTimeout(() => {');\n code.line(' saveToStorage();');\n code.line(' saveTimer = null;');\n code.line('}, 100);');\n });\n code.line();\n\n // Wrap db methods to auto-save (entity-specific for type safety)\n code.comment('Wrap database methods to persist on changes');\n code.block('function wrapDbMethods(): void {', () => {\n for (const entity of entityNames) {\n code.line(`const orig${entity}Create = db.${entity}.create.bind(db.${entity});`);\n code.line(`const orig${entity}Update = db.${entity}.update.bind(db.${entity});`);\n code.line(`const orig${entity}Delete = db.${entity}.delete.bind(db.${entity});`);\n code.line();\n code.line(`db.${entity}.create = (data) => {`);\n code.line(` const result = orig${entity}Create(data);`);\n code.line(' scheduleSave();');\n code.line(' return result;');\n code.line('};');\n code.line();\n code.line(`db.${entity}.update = (query) => {`);\n code.line(` const result = orig${entity}Update(query);`);\n code.line(' scheduleSave();');\n code.line(' return result;');\n code.line('};');\n code.line();\n code.line(`db.${entity}.delete = (query) => {`);\n code.line(` const result = orig${entity}Delete(query);`);\n code.line(' scheduleSave();');\n code.line(' return result;');\n code.line('};');\n code.line();\n }\n });\n code.line();\n\n // Export persistence utilities\n code.comment('Persistence utilities');\n code.block('export const persistence = {', () => {\n code.line('save: saveToStorage,');\n code.line('load: loadFromStorage,');\n code.line('clear: clearStorage,');\n code.line('/** Force immediate save (bypass debounce) */');\n code.block('flush: () => {', () => {\n code.line('if (saveTimer) {');\n code.line(' clearTimeout(saveTimer);');\n code.line(' saveTimer = null;');\n code.line('}');\n code.line('saveToStorage();');\n }, '},');\n }, '};');\n code.line();\n\n // Initialize\n code.comment('Initialize: load data and wrap methods');\n code.line('loadFromStorage();');\n code.line('wrapDbMethods();');\n}\n\n/**\n * Generate factory definition for a single entity\n */\nfunction generateEntityFactory(code: CodeBuilder, schema: AnalyzedSchema): void {\n code.block(`${schema.name}: {`, () => {\n for (const field of schema.fields) {\n if (field.name === 'id') {\n code.line('id: primaryKey(faker.string.uuid),');\n } else if (field.isObject) {\n // @mswjs/data only accepts primitives - serialize objects as JSON strings\n // They'll be parsed back when read from the API\n if (field.nullable) {\n code.line(`${field.name}: nullable(() => JSON.stringify(${field.fakerCall})),`);\n } else {\n code.line(`${field.name}: () => JSON.stringify(${field.fakerCall}),`);\n }\n } else if (field.nullable) {\n code.line(`${field.name}: nullable(() => ${field.fakerCall}),`);\n } else {\n code.line(`${field.name}: () => ${field.fakerCall},`);\n }\n }\n // Note: timestamps (createdAt/updatedAt) are already in schema.fields from defineData()\n }, '},');\n}\n","/**\n * Shared RLS code generation helpers\n *\n * @module cli/generators/shared/rls\n * @category CLI\n */\n\nimport type { AnalyzedSchema, AnalyzedRLS } from '../../types';\nimport type { RLSBypass } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Get the import statement needed for RLS context functionality\n *\n * @returns Empty string - no imports needed for browser-compatible RLS context\n */\nexport function getRLSImports(): string {\n // No longer importing async_hooks - using browser-compatible context storage\n return '';\n}\n\n/**\n * Generate generic RLS context type definition\n *\n * Uses a simple global context that works in both browsers and Node.js.\n * This is appropriate for the mock adapter since browsers are single-threaded\n * and the mock adapter is for development purposes.\n */\nexport function generateRLSContextType(code: CodeBuilder): void {\n code.comment('Row-Level Security Context (generic key-value)');\n code.block('export interface RLSContext {', () => {\n code.line('[key: string]: unknown;');\n }, '}');\n code.line();\n\n code.comment('=============================================================================');\n code.comment('Browser-Compatible RLS Context Storage');\n code.comment('');\n code.comment('Uses a simple global context that works in both browsers and Node.js.');\n code.comment('This is appropriate for development/mock scenarios where concurrent');\n code.comment('request isolation is not required.');\n code.comment('=============================================================================');\n code.line();\n\n code.comment('Global context storage - works in browsers and Node.js');\n code.line('let currentContext: RLSContext | null = null;');\n code.line();\n\n code.multiDocComment([\n 'Set RLS context for the current execution.',\n '',\n '@param ctx - The RLS context to set, or null to clear',\n '',\n '@example',\n '```typescript',\n '// Set context for a request',\n \"setContext({ userId: 'user-123', role: 'admin' });\",\n '',\n '// Clear context',\n 'setContext(null);',\n '```',\n ]);\n code.block('export function setContext(ctx: RLSContext | null): void {', () => {\n code.line('currentContext = ctx;');\n });\n code.line();\n\n code.multiDocComment([\n 'Get RLS context for the current execution.',\n '',\n '@returns The current RLS context, or null if not set',\n ]);\n code.block('export function getContext(): RLSContext | null {', () => {\n code.line('return currentContext;');\n });\n code.line();\n\n code.multiDocComment([\n 'Run a function with RLS context.',\n 'Context is set before the function runs and restored after.',\n '',\n '@param ctx - The RLS context to use',\n '@param fn - The function to run with the context',\n '@returns The result of the function',\n '',\n '@example',\n '```typescript',\n '// Run with context',\n \"const result = runWithContext({ userId: '123' }, () => {\",\n ' return api.posts.list();',\n '});',\n '```',\n ]);\n code.block('export function runWithContext<T>(ctx: RLSContext | null, fn: () => T): T {', () => {\n code.line('const previousContext = currentContext;');\n code.line('currentContext = ctx;');\n code.block('try {', () => {\n code.line('return fn();');\n }, '} finally {');\n code.indent();\n code.line('currentContext = previousContext;');\n code.dedent();\n code.line('}');\n });\n code.line();\n\n code.multiDocComment([\n 'Async version of runWithContext for async functions.',\n '',\n '@param ctx - The RLS context to use',\n '@param fn - The async function to run with the context',\n '@returns Promise resolving to the result of the function',\n ]);\n code.block('export async function runWithContextAsync<T>(ctx: RLSContext | null, fn: () => Promise<T>): Promise<T> {', () => {\n code.line('const previousContext = currentContext;');\n code.line('currentContext = ctx;');\n code.block('try {', () => {\n code.line('return await fn();');\n }, '} finally {');\n code.indent();\n code.line('currentContext = previousContext;');\n code.dedent();\n code.line('}');\n });\n code.line();\n}\n\n/**\n * Collect all unique bypass conditions from schemas\n */\nexport function collectBypassConditions(schemas: AnalyzedSchema[]): RLSBypass[] {\n const bypassMap = new Map<string, Set<string>>();\n\n for (const schema of schemas) {\n for (const bypass of schema.rls.bypass) {\n if (!bypassMap.has(bypass.contextKey)) {\n bypassMap.set(bypass.contextKey, new Set());\n }\n for (const val of bypass.values) {\n bypassMap.get(bypass.contextKey)!.add(val);\n }\n }\n }\n\n return Array.from(bypassMap.entries()).map(([contextKey, values]) => ({\n contextKey,\n values: Array.from(values),\n }));\n}\n\n/**\n * Generate bypass check helper for generic context\n */\nexport function generateBypassCheck(code: CodeBuilder, bypassConditions: RLSBypass[]): void {\n if (bypassConditions.length === 0) {\n code.block('function checkBypass(_ctx: RLSContext | null): boolean {', () => {\n code.line('return false;');\n });\n return;\n }\n\n code.block('function checkBypass(ctx: RLSContext | null): boolean {', () => {\n code.line('if (!ctx) return false;');\n\n for (const bypass of bypassConditions) {\n const valuesStr = bypass.values.map((v: string) => `'${v}'`).join(', ');\n code.line(`if ([${valuesStr}].includes(ctx.${bypass.contextKey} as string)) return true;`);\n }\n\n code.line('return false;');\n });\n}\n\n/**\n * Generate RLS filter function for an entity (generic context-based)\n *\n * @returns The function name for the generated filter\n */\nexport function generateEntityRLSFilter(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n operation: 'select' | 'insert' | 'update' | 'delete'\n): string {\n const { pascalName, rls } = schema;\n const funcName = `rls${pascalName}${operation.charAt(0).toUpperCase() + operation.slice(1)}`;\n\n if (!rls.enabled) {\n // Generate a passthrough function\n code.block(`function ${funcName}(_row: Record<string, unknown>, _ctx: RLSContext | null): boolean {`, () => {\n code.line('return true;');\n });\n return funcName;\n }\n\n code.block(`function ${funcName}(row: Record<string, unknown>, ctx: RLSContext | null): boolean {`, () => {\n // Check bypass conditions first\n if (rls.bypass.length > 0) {\n code.line('if (checkBypass(ctx)) return true;');\n code.line();\n }\n\n // Apply scope mappings (row.field === ctx.contextKey)\n if (rls.scope.length > 0) {\n for (const mapping of rls.scope) {\n code.line(`// Scope: ${mapping.field} must match context.${mapping.contextKey}`);\n code.line(`if (!ctx || row.${mapping.field} !== ctx.${mapping.contextKey}) return false;`);\n }\n code.line('return true;');\n } else if (rls.original?.[operation]) {\n // Has custom function - placeholder for users to customize\n code.comment(`Custom ${operation} policy defined - implement in generated code`);\n code.line('return true;');\n } else {\n // No policy defined for this operation\n code.line('return true;');\n }\n });\n\n return funcName;\n}\n\n/**\n * Check if any schema has RLS enabled\n */\nexport function hasAnyRLS(schemas: AnalyzedSchema[]): boolean {\n return schemas.some((s) => s.rls.enabled);\n}\n\n/**\n * Generate RLS error class\n */\nexport function generateRLSError(code: CodeBuilder): void {\n code.comment('RLS Error for unauthorized access');\n code.block('export class RLSError extends Error {', () => {\n code.line('readonly code = \"RLS_DENIED\";');\n code.block('constructor(operation: string, entity: string) {', () => {\n code.line('super(`Access denied: ${operation} on ${entity}`);');\n code.line('this.name = \"RLSError\";');\n });\n }, '}');\n code.line();\n}\n","/**\n * MSW handlers generator\n *\n * Generates MSW request handlers that route through the unified API client,\n * ensuring all requests go through the middleware chain (auth, context, RLS).\n *\n * @module cli/generators/mock/handlers\n * @category CLI\n */\n\nimport type { AnalyzedSchema } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\nimport { pluralize } from '../../utils/pluralize';\nimport { hasAnyRLS } from '../shared/rls';\n\n/**\n * Generate MSW request handlers for all entities\n *\n * @param schemas - Analyzed schemas\n * @param apiPrefix - API prefix for endpoints (default: '/api')\n * @returns Generated TypeScript code\n */\nexport function generateMockHandlers(schemas: AnalyzedSchema[], apiPrefix: string = '/api'): string {\n const code = new CodeBuilder();\n const hasRLS = hasAnyRLS(schemas);\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { http, HttpResponse } from 'msw';\");\n code.line(\"import { api } from './client';\");\n code.line(\"import { routes } from './routes';\");\n code.line(\"import type * as Types from './types';\");\n code.line();\n\n // Define RLSError locally to avoid bundler issues with symlinked packages\n if (hasRLS) {\n code.comment('RLS error class for access denied responses');\n code.block('class RLSError extends Error {', () => {\n code.line('readonly code = \"RLS_DENIED\";');\n code.block('constructor(operation: string, entity: string) {', () => {\n code.line('super(`Access denied: ${operation} on ${entity}`);');\n code.line('this.name = \"RLSError\";');\n });\n });\n code.line();\n\n code.comment('Handle errors and return appropriate HTTP responses');\n code.block('function handleError(error: unknown): Response {', () => {\n code.block('if (error instanceof RLSError) {', () => {\n code.line(\"return HttpResponse.json({ error: error.message }, { status: 403 });\");\n });\n code.block('if (error instanceof Error && error.message.includes(\"not found\")) {', () => {\n code.line(\"return HttpResponse.json({ error: error.message }, { status: 404 });\");\n });\n code.line('console.error(error);');\n code.line(\"return HttpResponse.json({ error: 'Internal server error' }, { status: 500 });\");\n });\n code.line();\n }\n\n code.block('export const handlers = [', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateEntityHandlers(code, schema, hasRLS);\n }\n }, '];');\n\n return code.toString();\n}\n\n/**\n * Generate handlers for a single entity\n */\nfunction generateEntityHandlers(code: CodeBuilder, schema: AnalyzedSchema, hasRLS: boolean): void {\n const { name, pascalName } = schema;\n const pluralName = pluralize(name);\n\n code.comment(`${pascalName} handlers`);\n\n // GET list\n code.block(`http.get(routes.${pluralName}.list.path, async ({ request }) => {`, () => {\n code.line('const url = new URL(request.url);');\n code.line(\"const limit = parseInt(url.searchParams.get('limit') || '20');\");\n code.line(\"const offset = parseInt(url.searchParams.get('offset') || '0');\");\n code.line();\n if (hasRLS) {\n code.block('try {', () => {\n code.line(`const response = await api.${name}.list({ limit, offset });`);\n code.line('return HttpResponse.json(response);');\n }, '} catch (error) {');\n code.indent();\n code.line('return handleError(error);');\n code.dedent();\n code.line('}');\n } else {\n code.line(`const response = await api.${name}.list({ limit, offset });`);\n code.line('return HttpResponse.json(response);');\n }\n }, '}),');\n code.line();\n\n // GET single\n code.block(`http.get(routes.${pluralName}.get.path, async ({ params }) => {`, () => {\n if (hasRLS) {\n code.block('try {', () => {\n code.line(`const response = await api.${name}.get(params.id as string);`);\n code.line('if (!response.data) {');\n code.line(` return HttpResponse.json({ error: '${pascalName} not found' }, { status: 404 });`);\n code.line('}');\n code.line('return HttpResponse.json(response);');\n }, '} catch (error) {');\n code.indent();\n code.line('return handleError(error);');\n code.dedent();\n code.line('}');\n } else {\n code.line(`const response = await api.${name}.get(params.id as string);`);\n code.line('if (!response.data) {');\n code.line(` return HttpResponse.json({ error: '${pascalName} not found' }, { status: 404 });`);\n code.line('}');\n code.line('return HttpResponse.json(response);');\n }\n }, '}),');\n code.line();\n\n // POST create\n code.block(`http.post(routes.${pluralName}.create.path, async ({ request }) => {`, () => {\n code.line(`const body = await request.json() as Types.${pascalName}Create;`);\n code.line();\n if (hasRLS) {\n code.block('try {', () => {\n code.line(`const response = await api.${name}.create(body);`);\n code.line('return HttpResponse.json(response, { status: 201 });');\n }, '} catch (error) {');\n code.indent();\n code.line('return handleError(error);');\n code.dedent();\n code.line('}');\n } else {\n code.line(`const response = await api.${name}.create(body);`);\n code.line('return HttpResponse.json(response, { status: 201 });');\n }\n }, '}),');\n code.line();\n\n // PUT update\n code.block(`http.put(routes.${pluralName}.update.path, async ({ params, request }) => {`, () => {\n code.line(`const body = await request.json() as Types.${pascalName}Update;`);\n code.line();\n if (hasRLS) {\n code.block('try {', () => {\n code.line(`const response = await api.${name}.update(params.id as string, body);`);\n code.line('return HttpResponse.json(response);');\n }, '} catch (error) {');\n code.indent();\n code.line('return handleError(error);');\n code.dedent();\n code.line('}');\n } else {\n code.line(`const response = await api.${name}.update(params.id as string, body);`);\n code.line('return HttpResponse.json(response);');\n }\n }, '}),');\n code.line();\n\n // PATCH update (partial)\n code.block(`http.patch(routes.${pluralName}.patch.path, async ({ params, request }) => {`, () => {\n code.line(`const body = await request.json() as Types.${pascalName}Update;`);\n code.line();\n if (hasRLS) {\n code.block('try {', () => {\n code.line(`const response = await api.${name}.update(params.id as string, body);`);\n code.line('return HttpResponse.json(response);');\n }, '} catch (error) {');\n code.indent();\n code.line('return handleError(error);');\n code.dedent();\n code.line('}');\n } else {\n code.line(`const response = await api.${name}.update(params.id as string, body);`);\n code.line('return HttpResponse.json(response);');\n }\n }, '}),');\n code.line();\n\n // DELETE\n code.block(`http.delete(routes.${pluralName}.delete.path, async ({ params }) => {`, () => {\n if (hasRLS) {\n code.block('try {', () => {\n code.line(`await api.${name}.delete(params.id as string);`);\n code.line('return new HttpResponse(null, { status: 204 });');\n }, '} catch (error) {');\n code.indent();\n code.line('return handleError(error);');\n code.dedent();\n code.line('}');\n } else {\n code.line(`await api.${name}.delete(params.id as string);`);\n code.line('return new HttpResponse(null, { status: 204 });');\n }\n }, '}),');\n code.line();\n}\n\n/**\n * Generate combined handlers export that includes endpoint handlers if they exist\n *\n * @param hasEndpoints - Whether there are custom endpoints defined\n * @returns Generated TypeScript code for all handlers export\n */\nexport function generateAllHandlersExport(hasEndpoints: boolean): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.comment('Combined handlers for MSW setup');\n code.line();\n\n code.line(\"import { handlers } from './handlers';\");\n\n if (hasEndpoints) {\n code.line(\"import { endpointHandlers } from './endpoint-handlers';\");\n code.line();\n code.comment('All handlers: entity CRUD + custom endpoints');\n code.line('export const allHandlers = [...handlers, ...endpointHandlers];');\n } else {\n code.line();\n code.comment('All handlers (no custom endpoints defined)');\n code.line('export const allHandlers = handlers;');\n }\n\n code.line();\n code.comment('Re-export for convenience');\n code.line('export { handlers };');\n\n if (hasEndpoints) {\n code.line('export { endpointHandlers };');\n }\n\n return code.toString();\n}\n","/**\n * Mock API client generator\n *\n * @module cli/generators/mock/client\n * @category CLI\n */\n\nimport type { AnalyzedSchema, AnalyzedRelation } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\nimport {\n generateRLSContextType,\n generateBypassCheck,\n generateRLSError,\n collectBypassConditions,\n hasAnyRLS,\n getRLSImports,\n} from '../shared/rls';\n\n/**\n * Generate API client for mock adapter\n *\n * @param schemas - Analyzed schemas\n * @returns Generated TypeScript code\n */\nexport function generateMockClient(schemas: AnalyzedSchema[]): string {\n const code = new CodeBuilder();\n const schemasWithRLS = hasAnyRLS(schemas);\n const allBypassConditions = collectBypassConditions(schemas);\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { db } from './db';\");\n code.line(\"import type * as Types from './types';\");\n\n // Add RLS context imports (browser-compatible)\n if (schemasWithRLS) {\n code.line(getRLSImports());\n }\n code.line();\n\n // RLS support\n if (schemasWithRLS) {\n generateRLSContextType(code);\n generateRLSError(code);\n generateBypassCheck(code, allBypassConditions);\n code.line();\n\n // Generate RLS filters for each entity\n const hasGlobalBypass = allBypassConditions.length > 0;\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateEntityRLSFilters(code, schema, hasGlobalBypass);\n }\n code.line();\n }\n\n // Helper for filtering\n generateFilterHelper(code);\n code.line();\n\n // Helper for parsing JSONB fields (stored as strings in @mswjs/data)\n generateParseRowHelper(code);\n code.line();\n\n // Generate API\n code.block('export const api = {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateEntityApi(code, schema, schemas, schemasWithRLS);\n }\n }, '};');\n\n return code.toString();\n}\n\n/**\n * Generate RLS filter functions for an entity\n *\n * @param code - Code builder instance\n * @param schema - Analyzed schema for the entity\n * @param hasGlobalBypass - Whether any schema defines bypass conditions (applies to all RLS-enabled entities)\n */\nfunction generateEntityRLSFilters(code: CodeBuilder, schema: AnalyzedSchema, hasGlobalBypass: boolean): void {\n const { pascalName, rls } = schema;\n\n if (!rls.enabled) {\n // Generate passthrough functions\n code.comment(`RLS filters for ${pascalName} (disabled)`);\n code.line(`const rls${pascalName}Select = (_row: Record<string, unknown>, _ctx: RLSContext | null): boolean => true;`);\n code.line(`const rls${pascalName}Insert = (_row: Record<string, unknown>, _ctx: RLSContext | null): boolean => true;`);\n code.line(`const rls${pascalName}Update = (_row: Record<string, unknown>, _ctx: RLSContext | null): boolean => true;`);\n code.line(`const rls${pascalName}Delete = (_row: Record<string, unknown>, _ctx: RLSContext | null): boolean => true;`);\n code.line();\n return;\n }\n\n code.comment(`RLS filters for ${pascalName}`);\n\n // Map operation to source field\n const sourceFields = {\n Select: rls.selectSource,\n Insert: rls.insertSource,\n Update: rls.updateSource,\n Delete: rls.deleteSource,\n };\n\n // Generate each operation filter\n for (const op of ['Select', 'Insert', 'Update', 'Delete'] as const) {\n const hasPolicy = rls[`has${op}` as keyof typeof rls];\n const customSource = sourceFields[op];\n\n code.block(`const rls${pascalName}${op} = (row: Record<string, unknown>, ctx: RLSContext | null): boolean => {`, () => {\n // Check bypass conditions first - use global bypass (applies to all RLS-enabled entities)\n if (hasGlobalBypass) {\n code.line('if (checkBypass(ctx)) return true;');\n }\n\n if (!hasPolicy) {\n code.line('return true;');\n return;\n }\n\n // If we have custom source code, embed it directly\n if (customSource) {\n // Embed the serialized function body\n for (const line of customSource.split('\\n')) {\n code.line(line.trim());\n }\n return;\n }\n\n // Fallback: Apply scope mappings\n if (rls.scope.length > 0) {\n for (const mapping of rls.scope) {\n code.line(`// Scope: ${mapping.field} must match context.${mapping.contextKey}`);\n code.line(`if (!ctx || row.${mapping.field} !== ctx.${mapping.contextKey}) return false;`);\n }\n }\n\n code.line('return true;');\n }, '};');\n }\n code.line();\n}\n\n/**\n * Generate filter helper function\n */\nfunction generateFilterHelper(code: CodeBuilder): void {\n code.block('function applyFilter<T>(items: T[], filter: Record<string, unknown>): T[] {', () => {\n code.block('return items.filter(item => {', () => {\n code.block('for (const [key, value] of Object.entries(filter)) {', () => {\n code.line('const itemValue = (item as Record<string, unknown>)[key];');\n code.block('if (typeof value === \"object\" && value !== null) {', () => {\n code.line('const f = value as Record<string, unknown>;');\n code.line(\"if ('equals' in f && itemValue !== f.equals) return false;\");\n code.line(\"if ('not' in f && itemValue === f.not) return false;\");\n code.line(\"if ('in' in f && !(f.in as unknown[]).includes(itemValue)) return false;\");\n code.line(\"if ('notIn' in f && (f.notIn as unknown[]).includes(itemValue)) return false;\");\n code.line(\"if ('contains' in f && !String(itemValue).includes(f.contains as string)) return false;\");\n code.line(\"if ('startsWith' in f && !String(itemValue).startsWith(f.startsWith as string)) return false;\");\n code.line(\"if ('endsWith' in f && !String(itemValue).endsWith(f.endsWith as string)) return false;\");\n code.line(\"if ('gt' in f && (itemValue as number) <= (f.gt as number)) return false;\");\n code.line(\"if ('lt' in f && (itemValue as number) >= (f.lt as number)) return false;\");\n code.line(\"if ('gte' in f && (itemValue as number) < (f.gte as number)) return false;\");\n code.line(\"if ('lte' in f && (itemValue as number) > (f.lte as number)) return false;\");\n code.line(\"if ('isNull' in f && f.isNull && itemValue !== null && itemValue !== undefined) return false;\");\n code.line(\"if ('isNull' in f && !f.isNull && (itemValue === null || itemValue === undefined)) return false;\");\n }, '} else {');\n code.indent();\n code.line('if (itemValue !== value) return false;');\n code.dedent();\n code.line('}');\n });\n code.line('return true;');\n }, '});');\n });\n}\n\n/**\n * Generate parseRow helper for JSONB fields\n */\nfunction generateParseRowHelper(code: CodeBuilder): void {\n code.comment('Parse JSONB fields stored as strings by @mswjs/data');\n code.block(\n 'function parseRow<T>(row: Record<string, unknown>, jsonFields: string[]): T {',\n () => {\n code.line('const result = { ...row };');\n code.block('for (const field of jsonFields) {', () => {\n code.block('if (result[field] && typeof result[field] === \"string\") {', () => {\n code.block('try {', () => {\n code.line('result[field] = JSON.parse(result[field] as string);');\n }, '} catch { /* keep as string */ }');\n });\n });\n code.line('return result as T;');\n }\n );\n}\n\n/**\n * Generate API methods for a single entity\n */\nfunction generateEntityApi(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n allSchemas: AnalyzedSchema[],\n hasRLS: boolean\n): void {\n const { name, pascalName, relations, fields, rls } = schema;\n const hasRelations = relations.length > 0;\n const includeType = hasRelations ? `Types.${pascalName}Include` : 'never';\n\n // Find JSON/Object fields that need parsing\n const jsonFields = fields.filter((f) => f.isArray || f.isObject).map((f) => f.name);\n const hasJsonFields = jsonFields.length > 0;\n const jsonFieldsStr = jsonFields.map((f) => `'${f}'`).join(', ');\n\n code.block(`${name}: {`, () => {\n // LIST\n code.block(\n `list: async (options?: Types.QueryOptions<Types.${pascalName}Filter, ${includeType}>): Promise<Types.ListResponse<Types.${pascalName}>> => {`,\n () => {\n if (hasJsonFields) {\n code.line(`let rawItems = db.${name}.getAll() as unknown as Record<string, unknown>[];`);\n code.line(`let items = rawItems.map(row => parseRow<Types.${pascalName}>(row, [${jsonFieldsStr}]));`);\n } else {\n code.line(`let items = db.${name}.getAll() as unknown as Types.${pascalName}[];`);\n }\n code.line();\n\n // Apply RLS filter for select\n if (hasRLS) {\n code.comment('Apply RLS filter');\n code.line(`const ctx = getContext();`);\n code.line(`items = items.filter(item => rls${pascalName}Select(item as unknown as Record<string, unknown>, ctx));`);\n code.line();\n }\n\n // Filter\n code.block('if (options?.where) {', () => {\n code.line('items = applyFilter(items, options.where);');\n });\n code.line();\n\n code.line('const total = items.length;');\n code.line();\n\n // Sort\n code.block('if (options?.orderBy) {', () => {\n code.line('const [field, dir] = Object.entries(options.orderBy)[0];');\n code.block('items = [...items].sort((a, b) => {', () => {\n code.line('const aVal = (a as Record<string, unknown>)[field] as string | number | Date;');\n code.line('const bVal = (b as Record<string, unknown>)[field] as string | number | Date;');\n code.line(\"if (aVal < bVal) return dir === 'asc' ? -1 : 1;\");\n code.line(\"if (aVal > bVal) return dir === 'asc' ? 1 : -1;\");\n code.line('return 0;');\n }, '});');\n });\n code.line();\n\n // Paginate\n code.line('const limit = options?.limit ?? 20;');\n code.line('const offset = options?.offset ?? 0;');\n code.line('items = items.slice(offset, offset + limit);');\n code.line();\n\n // Load relations\n if (hasRelations) {\n code.block('if (options?.include?.length) {', () => {\n code.block('items = items.map(item => {', () => {\n code.line('const result = { ...item } as Record<string, unknown>;');\n\n for (const rel of relations) {\n code.block(`if (options.include!.includes('${rel.name}')) {`, () => {\n generateRelationLoad(code, schema, rel);\n });\n }\n\n code.line(`return result as Types.${pascalName};`);\n }, '});');\n });\n code.line();\n }\n\n code.line('return { data: items, meta: { total, limit, offset, hasMore: offset + limit < total } };');\n },\n '},'\n );\n code.line();\n\n // GET\n code.block(\n `get: async (id: string, options?: { include?: ${includeType}[] }): Promise<Types.ItemResponse<Types.${pascalName}>> => {`,\n () => {\n code.line(`const rawItem = db.${name}.findFirst({ where: { id: { equals: id } } }) as unknown as Record<string, unknown> | null;`);\n code.line(`if (!rawItem) throw new Error('${pascalName} not found');`);\n if (hasJsonFields) {\n code.line(`const item = parseRow<Types.${pascalName}>(rawItem, [${jsonFieldsStr}]);`);\n } else {\n code.line(`const item = rawItem as Types.${pascalName};`);\n }\n code.line();\n\n // Apply RLS check for select\n if (hasRLS) {\n code.comment('Apply RLS check');\n code.line(`const ctx = getContext();`);\n code.block(`if (!rls${pascalName}Select(item as unknown as Record<string, unknown>, ctx)) {`, () => {\n code.line(`throw new RLSError('select', '${pascalName}');`);\n });\n code.line();\n }\n\n if (hasRelations) {\n code.line('const result = { ...item } as Record<string, unknown>;');\n code.line();\n code.block('if (options?.include?.length) {', () => {\n for (const rel of relations) {\n code.block(`if (options.include.includes('${rel.name}')) {`, () => {\n generateRelationLoad(code, schema, rel);\n });\n }\n });\n code.line();\n code.line(`return { data: result as Types.${pascalName} };`);\n } else {\n code.line('return { data: item };');\n }\n },\n '},'\n );\n code.line();\n\n // CREATE\n generateCreateMethod(code, schema, hasJsonFields, jsonFieldsStr, hasRLS);\n code.line();\n\n // UPDATE\n code.block(`update: async (id: string, input: Types.${pascalName}Update): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n // Check RLS on existing item first\n if (hasRLS) {\n code.comment('Check RLS before update');\n code.line(`const existing = db.${name}.findFirst({ where: { id: { equals: id } } }) as unknown as Record<string, unknown> | null;`);\n code.line(`if (!existing) throw new Error('${pascalName} not found');`);\n code.line(`const ctx = getContext();`);\n code.block(`if (!rls${pascalName}Update(existing, ctx)) {`, () => {\n code.line(`throw new RLSError('update', '${pascalName}');`);\n });\n code.line();\n }\n\n code.line(`const rawItem = db.${name}.update({`);\n code.line(' where: { id: { equals: id } },');\n code.line(` // eslint-disable-next-line @typescript-eslint/no-explicit-any`);\n code.line(' data: { ...input, updatedAt: new Date() } as any,');\n code.line('}) as unknown as Record<string, unknown> | null;');\n if (!hasRLS) {\n code.line(`if (!rawItem) throw new Error('${pascalName} not found');`);\n }\n if (hasJsonFields) {\n code.line(`return { data: parseRow<Types.${pascalName}>(rawItem!, [${jsonFieldsStr}]) };`);\n } else {\n code.line(`return { data: rawItem as Types.${pascalName} };`);\n }\n }, '},');\n code.line();\n\n // DELETE\n code.block('delete: async (id: string): Promise<void> => {', () => {\n // Check RLS on existing item first\n if (hasRLS) {\n code.comment('Check RLS before delete');\n code.line(`const existing = db.${name}.findFirst({ where: { id: { equals: id } } }) as unknown as Record<string, unknown> | null;`);\n code.line(`if (!existing) throw new Error('${pascalName} not found');`);\n code.line(`const ctx = getContext();`);\n code.block(`if (!rls${pascalName}Delete(existing, ctx)) {`, () => {\n code.line(`throw new RLSError('delete', '${pascalName}');`);\n });\n code.line();\n }\n\n code.line(`const item = db.${name}.delete({ where: { id: { equals: id } } });`);\n if (!hasRLS) {\n code.line(`if (!item) throw new Error('${pascalName} not found');`);\n }\n }, '},');\n }, '},');\n code.line();\n}\n\n/**\n * Generate code to load a relation\n */\nfunction generateRelationLoad(code: CodeBuilder, schema: AnalyzedSchema, rel: AnalyzedRelation): void {\n if (rel.type === 'hasMany') {\n code.line(`result.${rel.name} = db.${rel.target}.findMany({`);\n code.line(` where: { ${rel.foreignKey}: { equals: item.id } }`);\n code.line('});');\n } else if (rel.type === 'hasOne') {\n code.line(`result.${rel.name} = db.${rel.target}.findFirst({`);\n code.line(` where: { ${rel.foreignKey}: { equals: item.id } }`);\n code.line('});');\n } else if (rel.type === 'belongsTo') {\n code.line(`result.${rel.name} = db.${rel.target}.findFirst({`);\n code.line(` where: { id: { equals: (item as Record<string, unknown>).${rel.localField} as string } }`);\n code.line('});');\n } else if (rel.type === 'manyToMany') {\n // foreignKey is the FK on the junction table pointing to the source entity\n code.line(`const junctions = db.${rel.through}.findMany({`);\n code.line(` where: { ${rel.foreignKey}: { equals: item.id } }`);\n code.line('});');\n code.line(`result.${rel.name} = junctions`);\n code.line(` .map(j => db.${rel.target}.findFirst({`);\n code.line(` where: { id: { equals: (j as Record<string, unknown>).${rel.otherKey} as string } }`);\n code.line(' }))');\n code.line(' .filter(Boolean);');\n }\n}\n\n/**\n * Generate create method with nested relation support\n */\nfunction generateCreateMethod(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n hasJsonFields: boolean,\n jsonFieldsStr: string,\n hasRLS: boolean\n): void {\n const { name, pascalName, relations } = schema;\n const nestedRels = relations.filter((r) => r.type === 'hasMany' || r.type === 'hasOne');\n\n code.block(`create: async (input: Types.${pascalName}Create): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n if (nestedRels.length > 0) {\n // Extract nested creates\n const relNames = nestedRels.map((r) => r.name).join(', ');\n code.line(`const { ${relNames}, ...data } = input;`);\n code.line();\n code.line(`// eslint-disable-next-line @typescript-eslint/no-explicit-any`);\n code.line(`const rawItem = db.${name}.create(data as any) as unknown as Record<string, unknown>;`);\n if (hasJsonFields) {\n code.line(`const item = parseRow<Types.${pascalName}>(rawItem, [${jsonFieldsStr}]);`);\n } else {\n code.line(`const item = rawItem as Types.${pascalName};`);\n }\n code.line();\n\n // Check RLS on created item\n if (hasRLS) {\n code.comment('Check RLS on created item');\n code.line(`const ctx = getContext();`);\n code.block(`if (!rls${pascalName}Insert(item as unknown as Record<string, unknown>, ctx)) {`, () => {\n code.comment('Rollback by deleting');\n code.line(`db.${name}.delete({ where: { id: { equals: item.id } } });`);\n code.line(`throw new RLSError('insert', '${pascalName}');`);\n });\n code.line();\n }\n\n for (const rel of nestedRels) {\n code.block(`if (${rel.name}) {`, () => {\n if (rel.type === 'hasMany') {\n code.block(`for (const nested of ${rel.name}) {`, () => {\n code.line(`// eslint-disable-next-line @typescript-eslint/no-explicit-any`);\n code.line(`db.${rel.target}.create({ ...nested, ${rel.foreignKey}: item.id } as any);`);\n });\n } else {\n code.line(`// eslint-disable-next-line @typescript-eslint/no-explicit-any`);\n code.line(`db.${rel.target}.create({ ...${rel.name}, ${rel.foreignKey}: item.id } as any);`);\n }\n });\n }\n\n code.line();\n code.line('return { data: item };');\n } else {\n code.line(`// eslint-disable-next-line @typescript-eslint/no-explicit-any`);\n code.line(`const rawItem = db.${name}.create(input as any) as unknown as Record<string, unknown>;`);\n if (hasJsonFields) {\n code.line(`const item = parseRow<Types.${pascalName}>(rawItem, [${jsonFieldsStr}]);`);\n } else {\n code.line(`const item = rawItem as Types.${pascalName};`);\n }\n\n // Check RLS on created item\n if (hasRLS) {\n code.line();\n code.comment('Check RLS on created item');\n code.line(`const ctx = getContext();`);\n code.block(`if (!rls${pascalName}Insert(item as unknown as Record<string, unknown>, ctx)) {`, () => {\n code.comment('Rollback by deleting');\n code.line(`db.${name}.delete({ where: { id: { equals: item.id } } });`);\n code.line(`throw new RLSError('insert', '${pascalName}');`);\n });\n }\n\n code.line();\n code.line('return { data: item };');\n }\n }, '},');\n}\n","/**\n * Mock seed utilities generator\n *\n * @module cli/generators/mock/seed\n * @category CLI\n */\n\nimport type { AnalyzedSchema, MockAdapterConfig } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Generate seed and reset utilities for mock database\n *\n * @param schemas - Analyzed schemas\n * @param config - Mock adapter configuration\n * @returns Generated TypeScript code\n */\nexport function generateSeed(schemas: AnalyzedSchema[], config: MockAdapterConfig): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { db } from './db';\");\n code.line();\n\n // Type for seed counts\n code.block('export interface SeedCounts {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n code.line(`${schema.name}?: number;`);\n }\n });\n code.line();\n\n // Default counts\n code.block('const defaultCounts: Required<SeedCounts> = {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n const count = config.seed?.[schema.name] ?? 10;\n code.line(`${schema.name}: ${count},`);\n }\n }, '};');\n code.line();\n\n // Helper to pick random item from array\n code.block('function pickRandom<T>(arr: T[]): T | undefined {', () => {\n code.line('if (arr.length === 0) return undefined;');\n code.line('return arr[Math.floor(Math.random() * arr.length)];');\n });\n code.line();\n\n // Seed function - creates relational data with valid foreign keys\n code.block('export function seed(counts: SeedCounts = {}): void {', () => {\n code.line('const merged = { ...defaultCounts, ...counts };');\n code.line();\n code.comment('Track created entity IDs for foreign key references');\n code.line('const ids: Record<string, string[]> = {};');\n code.line();\n\n // Generate in dependency order (schemas are already sorted)\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n\n // Find FK fields from belongsTo relations (these need valid parent IDs)\n const belongsToRels = schema.relations.filter(r => r.type === 'belongsTo');\n // Map: localField -> target entity name\n const fkFields = belongsToRels.map(r => ({\n fieldName: r.localField || r.foreignKey,\n target: r.target,\n nullable: schema.fields.find(f => f.name === (r.localField || r.foreignKey))?.nullable ?? false,\n }));\n\n code.line(`ids.${schema.name} = [];`);\n code.block(`for (let i = 0; i < merged.${schema.name}; i++) {`, () => {\n if (fkFields.length > 0) {\n // Create with explicit foreign key values from parent entities\n code.line(`const item = db.${schema.name}.create({`);\n code.indent();\n for (const fk of fkFields) {\n if (fk.nullable) {\n // Nullable FK: sometimes null, sometimes valid ID\n code.line(`${fk.fieldName}: Math.random() > 0.3 ? pickRandom(ids.${fk.target}) : undefined,`);\n } else {\n // Required FK: always use valid parent ID\n code.line(`${fk.fieldName}: pickRandom(ids.${fk.target}),`);\n }\n }\n code.dedent();\n code.line(`// eslint-disable-next-line @typescript-eslint/no-explicit-any`);\n code.line('} as any);');\n } else {\n code.line(`const item = db.${schema.name}.create({});`);\n }\n code.line(`ids.${schema.name}.push(item.id);`);\n });\n code.line();\n }\n });\n code.line();\n\n // Reset function\n code.block('export function reset(): void {', () => {\n // Delete in reverse order (dependents first)\n for (const schema of [...schemas].reverse()) {\n code.line(`db.${schema.name}.deleteMany({ where: {} });`);\n }\n });\n code.line();\n\n // Get all function (for debugging)\n code.block('export function getAll(): Record<string, unknown[]> {', () => {\n code.block('return {', () => {\n for (const schema of schemas) {\n code.line(`${schema.name}: db.${schema.name}.getAll(),`);\n }\n }, '};');\n });\n\n return code.toString();\n}\n","/**\n * Routes generator - Auto-generates REST route definitions from entities\n *\n * @module cli/generators/mock/routes\n * @category CLI\n */\n\nimport type { AnalyzedSchema } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\nimport { pluralize } from '../../utils/pluralize';\n\n/**\n * Generate routes.ts file with REST route definitions\n *\n * @param schemas - Analyzed schemas\n * @returns Generated TypeScript code\n */\nexport function generateRoutes(schemas: AnalyzedSchema[]): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line();\n\n code.comment('Auto-generated REST route definitions');\n code.comment('');\n code.comment('These routes are used by:');\n code.comment('- MSW handlers for intercepting requests');\n code.comment('- Backend reference for implementing custom servers');\n code.line();\n\n // Generate route types\n code.comment('Route definition type');\n code.block('export interface RouteDefinition {', () => {\n code.line(\"method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\");\n code.line('path: string;');\n }, '}');\n code.line();\n\n // Generate entity routes\n code.comment('Entity route definitions');\n code.block('export const routes = {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateEntityRoutes(code, schema);\n }\n }, '} as const;');\n code.line();\n\n // Generate type export\n code.line('export type Routes = typeof routes;');\n code.line();\n\n // Generate route path helpers\n generateRouteHelpers(code, schemas);\n\n return code.toString();\n}\n\n/**\n * Generate routes for a single entity\n */\nfunction generateEntityRoutes(code: CodeBuilder, schema: AnalyzedSchema): void {\n const { name } = schema;\n const pluralName = pluralize(name);\n const basePath = `/api/${pluralName}`;\n\n code.block(`${pluralName}: {`, () => {\n code.line(`list: { method: 'GET', path: '${basePath}' },`);\n code.line(`get: { method: 'GET', path: '${basePath}/:id' },`);\n code.line(`create: { method: 'POST', path: '${basePath}' },`);\n code.line(`update: { method: 'PUT', path: '${basePath}/:id' },`);\n code.line(`patch: { method: 'PATCH', path: '${basePath}/:id' },`);\n code.line(`delete: { method: 'DELETE', path: '${basePath}/:id' },`);\n }, '},');\n}\n\n/**\n * Generate route path helper functions\n */\nfunction generateRouteHelpers(code: CodeBuilder, schemas: AnalyzedSchema[]): void {\n code.comment('Route path helpers - generate paths with parameters');\n code.line();\n\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n\n const { name, pascalName } = schema;\n const pluralName = pluralize(name);\n const basePath = `/api/${pluralName}`;\n\n code.block(`export const ${name}Routes = {`, () => {\n code.line(`list: () => '${basePath}',`);\n code.line(`get: (id: string) => \\`${basePath}/\\${id}\\`,`);\n code.line(`create: () => '${basePath}',`);\n code.line(`update: (id: string) => \\`${basePath}/\\${id}\\`,`);\n code.line(`patch: (id: string) => \\`${basePath}/\\${id}\\`,`);\n code.line(`delete: (id: string) => \\`${basePath}/\\${id}\\`,`);\n }, '};');\n code.line();\n }\n}\n","/**\n * Code generators for custom endpoints\n *\n * Generates TypeScript types, client methods, MSW handlers, and resolvers\n * for custom endpoints defined with defineEndpoint().\n *\n * @module cli/generators/mock/endpoints\n * @category CLI\n */\n\nimport type { AnalyzedEndpoint, AnalyzedEndpointField } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n// ============================================================================\n// Type Generation\n// ============================================================================\n\n/**\n * Generate TypeScript types for all endpoints\n *\n * @param endpoints - Analyzed endpoints\n * @returns Generated TypeScript code for types\n */\nexport function generateEndpointTypes(endpoints: AnalyzedEndpoint[]): string {\n const code = new CodeBuilder();\n\n code.line();\n code.comment('=============================================================================');\n code.comment('Custom Endpoint Types');\n code.comment('=============================================================================');\n code.line();\n\n for (const endpoint of endpoints) {\n generateEndpointTypeSet(code, endpoint);\n }\n\n return code.toString();\n}\n\n/**\n * Generate types for a single endpoint (params, body, response)\n */\nfunction generateEndpointTypeSet(code: CodeBuilder, endpoint: AnalyzedEndpoint): void {\n const { pascalName, params, body, response } = endpoint;\n\n // Generate params type if there are parameters\n if (params.length > 0) {\n code.comment(`Parameters for ${endpoint.path}`);\n code.block(`export interface ${pascalName}Params {`, () => {\n for (const param of params) {\n const optional = !param.required ? '?' : '';\n code.line(`${param.name}${optional}: ${param.tsType};`);\n }\n });\n code.line();\n }\n\n // Generate body type if there's a body\n if (body.length > 0) {\n code.comment(`Request body for ${endpoint.path}`);\n code.block(`export interface ${pascalName}Body {`, () => {\n for (const field of body) {\n const optional = !field.required ? '?' : '';\n code.line(`${field.name}${optional}: ${field.tsType};`);\n }\n });\n code.line();\n }\n\n // Generate response type\n code.comment(`Response from ${endpoint.path}`);\n code.block(`export interface ${pascalName}Response {`, () => {\n for (const field of response) {\n code.line(`${field.name}: ${field.tsType};`);\n }\n });\n code.line();\n}\n\n// ============================================================================\n// Client Generation\n// ============================================================================\n\n/**\n * Generate client methods for all endpoints\n *\n * @param endpoints - Analyzed endpoints\n * @returns Generated TypeScript code for endpoint client\n */\nexport function generateEndpointClient(endpoints: AnalyzedEndpoint[]): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.comment('Client methods for custom endpoints');\n code.line();\n\n code.line(\"import type * as Types from './types';\");\n code.line();\n\n code.comment('API base URL - configure based on environment');\n code.line(\"const API_BASE = typeof window !== 'undefined' ? window.location.origin : '';\");\n code.line();\n\n code.block('export const endpoints = {', () => {\n for (const endpoint of endpoints) {\n generateClientMethod(code, endpoint);\n }\n }, '};');\n\n return code.toString();\n}\n\n/**\n * Generate a single client method\n */\nfunction generateClientMethod(code: CodeBuilder, endpoint: AnalyzedEndpoint): void {\n const { name, pascalName, method, path, params, body, pathParams } = endpoint;\n\n // Build function signature\n const args: string[] = [];\n if (params.length > 0) {\n args.push(`params: Types.${pascalName}Params`);\n }\n if (body.length > 0) {\n args.push(`body: Types.${pascalName}Body`);\n }\n\n const returnType = `Promise<Types.${pascalName}Response>`;\n\n code.block(`${name}: async (${args.join(', ')}): ${returnType} => {`, () => {\n // Build URL with path parameter substitution\n let urlExpr: string;\n\n if (pathParams.length > 0) {\n // URL with path parameters - use template literal\n let pathTemplate = path;\n for (const param of pathParams) {\n pathTemplate = pathTemplate.replace(`:${param}`, `\\${params.${param}}`);\n }\n urlExpr = `\\`\\${API_BASE}${pathTemplate}\\``;\n } else {\n urlExpr = `\\`\\${API_BASE}${path}\\``;\n }\n\n if (method === 'GET' && params.length > 0) {\n // GET with query parameters\n code.line(`const url = new URL(${urlExpr});`);\n\n // Add non-path query parameters\n const queryParams = params.filter((p) => !pathParams.includes(p.name));\n for (const param of queryParams) {\n code.block(`if (params.${param.name} !== undefined) {`, () => {\n code.line(`url.searchParams.set('${param.name}', String(params.${param.name}));`);\n });\n }\n\n code.line('const response = await fetch(url.toString());');\n } else if (body.length > 0) {\n // POST/PUT/PATCH with body\n code.line(`const response = await fetch(${urlExpr}, {`);\n code.line(` method: '${method}',`);\n code.line(\" headers: { 'Content-Type': 'application/json' },\");\n code.line(' body: JSON.stringify(body),');\n code.line('});');\n } else {\n // Simple request without body\n code.line(`const response = await fetch(${urlExpr}, { method: '${method}' });`);\n }\n\n code.line();\n code.block('if (!response.ok) {', () => {\n code.line('const error = await response.json().catch(() => ({}));');\n code.line(\"throw new Error(error.message || `HTTP ${response.status}`);\");\n });\n code.line();\n code.line('return response.json();');\n }, '},');\n code.line();\n}\n\n// ============================================================================\n// Handler Generation\n// ============================================================================\n\n/**\n * Generate MSW handlers for all endpoints\n *\n * @param endpoints - Analyzed endpoints\n * @returns Generated TypeScript code for MSW handlers\n */\nexport function generateEndpointHandlers(endpoints: AnalyzedEndpoint[]): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.comment('MSW handlers for custom endpoints');\n code.line();\n\n code.line(\"import { http, HttpResponse } from 'msw';\");\n code.line(\"import { db } from './db';\");\n code.line(\"import { endpointResolvers } from './endpoint-resolvers';\");\n code.line();\n\n code.block('export const endpointHandlers = [', () => {\n for (const endpoint of endpoints) {\n generateHandler(code, endpoint);\n }\n }, '];');\n\n return code.toString();\n}\n\n/**\n * Generate a single MSW handler\n */\nfunction generateHandler(code: CodeBuilder, endpoint: AnalyzedEndpoint): void {\n const { name, method, path, params, body, pathParams } = endpoint;\n const httpMethod = method.toLowerCase();\n\n code.comment(`${method} ${path}`);\n code.block(`http.${httpMethod}('${path}', async ({ request, params: pathParams }) => {`, () => {\n // Parse query parameters for GET\n if (method === 'GET' && params.length > 0) {\n code.line('const url = new URL(request.url);');\n code.block('const params = {', () => {\n for (const param of params) {\n if (pathParams.includes(param.name)) {\n // Path parameter\n code.line(`${param.name}: pathParams.${param.name} as string,`);\n } else {\n // Query parameter\n generateParamParsing(code, param);\n }\n }\n }, '};');\n code.line();\n } else if (pathParams.length > 0) {\n // Only path params, no query params\n code.block('const params = {', () => {\n for (const paramName of pathParams) {\n code.line(`${paramName}: pathParams.${paramName} as string,`);\n }\n }, '};');\n code.line();\n }\n\n // Parse body for POST/PUT/PATCH\n if (body.length > 0) {\n code.line('const body = await request.json();');\n code.line();\n }\n\n // Build context object\n const ctxParts: string[] = ['db'];\n if (params.length > 0 || pathParams.length > 0) ctxParts.push('params');\n if (body.length > 0) ctxParts.push('body');\n code.line('const headers: Record<string, string> = {};');\n code.line(\"request.headers.forEach((value, key) => { headers[key] = value; });\");\n ctxParts.push('headers');\n code.line();\n\n // Call resolver with try/catch\n code.block('try {', () => {\n code.line(`const result = await endpointResolvers.${name}({ ${ctxParts.join(', ')} });`);\n code.line('return HttpResponse.json(result);');\n }, '} catch (error) {');\n code.indent();\n code.line('console.error(`Error in ${name}:`, error);');\n code.line('const message = error instanceof Error ? error.message : \"Internal server error\";');\n code.line('return HttpResponse.json({ error: message }, { status: 500 });');\n code.dedent();\n code.line('}');\n }, '}),');\n code.line();\n}\n\n/**\n * Generate parameter parsing code\n */\nfunction generateParamParsing(code: CodeBuilder, param: AnalyzedEndpointField): void {\n const { name, tsType, hasDefault } = param;\n const defaultVal = hasDefault ? JSON.stringify(param.default) : 'undefined';\n\n if (tsType === 'number' || tsType.includes('number')) {\n if (hasDefault) {\n code.line(`${name}: Number(url.searchParams.get('${name}') ?? ${defaultVal}),`);\n } else {\n code.line(`${name}: url.searchParams.has('${name}') ? Number(url.searchParams.get('${name}')) : undefined,`);\n }\n } else if (tsType === 'boolean' || tsType.includes('boolean')) {\n if (hasDefault) {\n code.line(`${name}: url.searchParams.has('${name}') ? url.searchParams.get('${name}') === 'true' : ${defaultVal},`);\n } else {\n code.line(`${name}: url.searchParams.has('${name}') ? url.searchParams.get('${name}') === 'true' : undefined,`);\n }\n } else {\n // String or enum\n if (hasDefault) {\n code.line(`${name}: url.searchParams.get('${name}') ?? ${defaultVal},`);\n } else {\n code.line(`${name}: url.searchParams.get('${name}') ?? undefined,`);\n }\n }\n}\n\n// ============================================================================\n// Resolver Generation\n// ============================================================================\n\n/**\n * Generate endpoint resolvers file\n *\n * Contains the serialized mock resolver functions from endpoint definitions.\n *\n * @param endpoints - Analyzed endpoints\n * @returns Generated TypeScript code for resolvers\n */\nexport function generateEndpointResolvers(endpoints: AnalyzedEndpoint[]): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.comment('Mock resolvers for custom endpoints');\n code.comment('');\n code.comment('These resolvers are copied from your defineEndpoint() calls.');\n code.comment('They receive { params, body, db, headers } and return the response.');\n code.line();\n\n // Type imports\n code.line(\"import type { MockResolverContext } from 'schemock/schema';\");\n code.line();\n\n // Resolver type\n code.line('type ResolverFn = (ctx: MockResolverContext) => unknown | Promise<unknown>;');\n code.line();\n\n code.block('export const endpointResolvers: Record<string, ResolverFn> = {', () => {\n for (const endpoint of endpoints) {\n code.comment(`${endpoint.method} ${endpoint.path}`);\n if (endpoint.description) {\n code.comment(endpoint.description);\n }\n code.line(`${endpoint.name}: ${endpoint.mockResolverSource},`);\n code.line();\n }\n }, '};');\n\n return code.toString();\n}\n","/**\n * Supabase client generator\n *\n * @module cli/generators/supabase/client\n * @category CLI\n */\n\nimport type { AnalyzedSchema, AnalyzedRelation, SupabaseAdapterConfig } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Generate Supabase API client\n *\n * @param schemas - Analyzed schemas\n * @param config - Supabase adapter configuration\n * @returns Generated TypeScript code\n */\nexport function generateSupabaseClient(schemas: AnalyzedSchema[], config: SupabaseAdapterConfig): string {\n const code = new CodeBuilder();\n const envPrefix = config.envPrefix ?? 'NEXT_PUBLIC_SUPABASE';\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { createClient } from '@supabase/supabase-js';\");\n code.line(\"import type * as Types from './types';\");\n code.line();\n\n code.line(`const supabaseUrl = process.env.${envPrefix}_URL!;`);\n code.line(`const supabaseKey = process.env.${envPrefix}_ANON_KEY!;`);\n code.line();\n\n code.line('export const supabase = createClient(supabaseUrl, supabaseKey);');\n code.line();\n\n // Helper for building select with relations\n code.block('function buildSelect(include?: string[]): string {', () => {\n code.line(\"if (!include?.length) return '*';\");\n code.line(\"return `*, ${include.map(rel => `${rel}(*)`).join(', ')}`;\");\n });\n code.line();\n\n // Build schema map for looking up target schemas\n const schemaMap = new Map(schemas.map((s) => [s.name, s]));\n\n // Generate API\n code.block('export const api = {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateSupabaseEntityApi(code, schema, config, schemaMap);\n }\n }, '};');\n\n return code.toString();\n}\n\n/**\n * Generate Supabase API methods for a single entity\n */\nfunction generateSupabaseEntityApi(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n config: SupabaseAdapterConfig,\n schemaMap: Map<string, AnalyzedSchema>\n): void {\n const { name, pascalName, tableName, relations } = schema;\n const hasRelations = relations.length > 0;\n const includeType = hasRelations ? `Types.${pascalName}Include` : 'never';\n\n code.block(`${name}: {`, () => {\n // LIST\n code.block(\n `list: async (options?: Types.QueryOptions<Types.${pascalName}Filter, ${includeType}>): Promise<Types.ListResponse<Types.${pascalName}>> => {`,\n () => {\n code.line('const select = buildSelect(options?.include);');\n code.line(`let query = supabase.from('${tableName}').select(select, { count: 'exact' });`);\n code.line();\n\n // Filters\n code.block('if (options?.where) {', () => {\n code.block('for (const [key, value] of Object.entries(options.where)) {', () => {\n code.block('if (typeof value === \"object\" && value !== null) {', () => {\n code.line('const f = value as Record<string, unknown>;');\n code.line(\"if ('equals' in f) query = query.eq(key, f.equals);\");\n code.line(\"if ('not' in f) query = query.neq(key, f.not);\");\n code.line(\"if ('in' in f) query = query.in(key, f.in as unknown[]);\");\n code.line(\"if ('notIn' in f) query = query.not(key, 'in', `(${(f.notIn as unknown[]).join(',')})`);\");\n code.line(\"if ('contains' in f) query = query.ilike(key, `%${f.contains}%`);\");\n code.line(\"if ('startsWith' in f) query = query.ilike(key, `${f.startsWith}%`);\");\n code.line(\"if ('endsWith' in f) query = query.ilike(key, `%${f.endsWith}`);\");\n code.line(\"if ('gt' in f) query = query.gt(key, f.gt);\");\n code.line(\"if ('gte' in f) query = query.gte(key, f.gte);\");\n code.line(\"if ('lt' in f) query = query.lt(key, f.lt);\");\n code.line(\"if ('lte' in f) query = query.lte(key, f.lte);\");\n code.line(\"if ('isNull' in f) f.isNull ? query = query.is(key, null) : query = query.not(key, 'is', null);\");\n }, '} else {');\n code.indent();\n code.line('query = query.eq(key, value);');\n code.dedent();\n code.line('}');\n });\n });\n code.line();\n\n // Ordering\n code.block('if (options?.orderBy) {', () => {\n code.block('for (const [field, dir] of Object.entries(options.orderBy)) {', () => {\n code.line(\"query = query.order(field, { ascending: dir === 'asc' });\");\n });\n });\n code.line();\n\n // Pagination\n code.line('const limit = options?.limit ?? 20;');\n code.line('const offset = options?.offset ?? 0;');\n code.line('query = query.range(offset, offset + limit - 1);');\n code.line();\n\n code.line('const { data, error, count } = await query;');\n code.line('if (error) throw error;');\n code.line();\n code.line('return {');\n code.line(` data: (data || []) as Types.${pascalName}[],`);\n code.line(' meta: { total: count || 0, limit, offset, hasMore: offset + limit < (count || 0) },');\n code.line('};');\n },\n '},'\n );\n code.line();\n\n // GET\n code.block(`get: async (id: string, options?: { include?: ${includeType}[] }): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n code.line('const select = buildSelect(options?.include);');\n code.line(`const { data, error } = await supabase.from('${tableName}').select(select).eq('id', id).single();`);\n code.line('if (error) throw error;');\n code.line(`return { data: data as Types.${pascalName} };`);\n }, '},');\n code.line();\n\n // CREATE (with nested relation support)\n generateSupabaseCreateMethod(code, schema, config, schemaMap);\n code.line();\n\n // UPDATE\n code.block(`update: async (id: string, input: Types.${pascalName}Update): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n code.line(`const { data, error } = await supabase.from('${tableName}').update(input).eq('id', id).select().single();`);\n code.line('if (error) throw error;');\n code.line(`return { data: data as Types.${pascalName} };`);\n }, '},');\n code.line();\n\n // DELETE\n code.block('delete: async (id: string): Promise<void> => {', () => {\n code.line(`const { error } = await supabase.from('${tableName}').delete().eq('id', id);`);\n code.line('if (error) throw error;');\n }, '},');\n }, '},');\n code.line();\n}\n\n/**\n * Generate Supabase create method with nested relation support\n */\nfunction generateSupabaseCreateMethod(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n config: SupabaseAdapterConfig,\n schemaMap: Map<string, AnalyzedSchema>\n): void {\n const { pascalName, tableName, relations } = schema;\n const nestedRels = relations.filter((r) => r.type === 'hasMany' || r.type === 'hasOne');\n\n code.block(`create: async (input: Types.${pascalName}Create): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n if (nestedRels.length > 0) {\n const relNames = nestedRels.map((r) => r.name).join(', ');\n code.line(`const { ${relNames}, ...data } = input;`);\n code.line();\n code.line(`const { data: item, error } = await supabase.from('${tableName}').insert(data).select().single();`);\n code.line('if (error) throw error;');\n code.line();\n\n for (const rel of nestedRels) {\n // Use target schema's tableName for proper pluralization, fall back to config or simple pluralization\n const targetSchema = schemaMap.get(rel.target);\n const targetTable = config.tableMap?.[rel.target] ?? targetSchema?.tableName ?? rel.target + 's';\n code.block(`if (${rel.name}) {`, () => {\n if (rel.type === 'hasMany') {\n code.line(`const nestedData = ${rel.name}.map(nested => ({ ...nested, ${rel.foreignKey}: item.id }));`);\n code.line(`const { error: nestedError } = await supabase.from('${targetTable}').insert(nestedData);`);\n code.line('if (nestedError) throw nestedError;');\n } else {\n code.line(`const { error: nestedError } = await supabase.from('${targetTable}').insert({ ...${rel.name}, ${rel.foreignKey}: item.id });`);\n code.line('if (nestedError) throw nestedError;');\n }\n });\n }\n\n code.line();\n code.line(`return { data: item as Types.${pascalName} };`);\n } else {\n code.line(`const { data, error } = await supabase.from('${tableName}').insert(input).select().single();`);\n code.line('if (error) throw error;');\n code.line(`return { data: data as Types.${pascalName} };`);\n }\n }, '},');\n}\n","/**\n * Firebase client generator\n *\n * @module cli/generators/firebase/client\n * @category CLI\n */\n\nimport type { AnalyzedSchema, AnalyzedRelation, FirebaseAdapterConfig } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Generate Firebase API client\n *\n * @param schemas - Analyzed schemas\n * @param config - Firebase adapter configuration\n * @returns Generated TypeScript code\n */\nexport function generateFirebaseClient(schemas: AnalyzedSchema[], config: FirebaseAdapterConfig): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line('import {');\n code.line(' collection,');\n code.line(' doc,');\n code.line(' getDoc,');\n code.line(' getDocs,');\n code.line(' addDoc,');\n code.line(' updateDoc,');\n code.line(' deleteDoc,');\n code.line(' query,');\n code.line(' where,');\n code.line(' orderBy,');\n code.line(' limit as fbLimit,');\n code.line(\"} from 'firebase/firestore';\");\n code.line(\"import type * as Types from './types';\");\n code.line();\n\n code.comment('Import your Firebase instance');\n code.line(\"import { db as firestore } from '../lib/firebase';\");\n code.line();\n\n code.block('export const api = {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateFirebaseEntityApi(code, schema, config, schemas);\n }\n }, '};');\n\n return code.toString();\n}\n\n/**\n * Generate Firebase API methods for a single entity\n */\nfunction generateFirebaseEntityApi(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n config: FirebaseAdapterConfig,\n allSchemas: AnalyzedSchema[]\n): void {\n const { name, pascalName, relations } = schema;\n const collectionName = config.collectionMap?.[name] ?? schema.pluralName;\n const hasRelations = relations.length > 0;\n const includeType = hasRelations ? `Types.${pascalName}Include` : 'never';\n\n // Create schema map for looking up target collections\n const schemaMap = new Map(allSchemas.map((s) => [s.name, s]));\n\n // Helper to get collection name for a target schema\n const getTargetCollection = (targetName: string): string => {\n const targetSchema = schemaMap.get(targetName);\n return config.collectionMap?.[targetName] ?? targetSchema?.pluralName ?? targetName + 's';\n };\n\n code.block(`${name}: {`, () => {\n // LIST\n code.block(\n `list: async (options?: Types.QueryOptions<Types.${pascalName}Filter, ${includeType}>): Promise<Types.ListResponse<Types.${pascalName}>> => {`,\n () => {\n code.line(`let q = query(collection(firestore, '${collectionName}'));`);\n code.line();\n\n // Filters (Firebase supports many operators)\n code.block('if (options?.where) {', () => {\n code.block('for (const [key, value] of Object.entries(options.where)) {', () => {\n code.block('if (typeof value === \"object\" && value !== null) {', () => {\n code.line('const f = value as Record<string, unknown>;');\n code.line(\"if ('equals' in f) q = query(q, where(key, '==', f.equals));\");\n code.line(\"if ('not' in f) q = query(q, where(key, '!=', f.not));\");\n code.line(\"if ('gt' in f) q = query(q, where(key, '>', f.gt));\");\n code.line(\"if ('gte' in f) q = query(q, where(key, '>=', f.gte));\");\n code.line(\"if ('lt' in f) q = query(q, where(key, '<', f.lt));\");\n code.line(\"if ('lte' in f) q = query(q, where(key, '<=', f.lte));\");\n code.line(\"if ('in' in f) q = query(q, where(key, 'in', f.in));\");\n code.line(\"if ('notIn' in f) q = query(q, where(key, 'not-in', f.notIn));\");\n code.comment('Note: contains/startsWith/endsWith require compound indexes in Firebase');\n code.line(\"if ('contains' in f) q = query(q, where(key, '>=', f.contains), where(key, '<=', f.contains + '\\\\uf8ff'));\");\n code.line(\"if ('startsWith' in f) q = query(q, where(key, '>=', f.startsWith), where(key, '<=', f.startsWith + '\\\\uf8ff'));\");\n }, '} else {');\n code.indent();\n code.line(\"q = query(q, where(key, '==', value));\");\n code.dedent();\n code.line('}');\n });\n });\n code.line();\n\n // Ordering\n code.block('if (options?.orderBy) {', () => {\n code.block('for (const [field, dir] of Object.entries(options.orderBy)) {', () => {\n code.line(\"q = query(q, orderBy(field, dir as 'asc' | 'desc'));\");\n });\n });\n code.line();\n\n // Pagination (Firebase doesn't support offset natively, so we fetch extra and slice)\n code.line('const queryLimit = options?.limit ?? 20;');\n code.line('const queryOffset = options?.offset ?? 0;');\n code.comment('Fetch limit + offset to enable client-side offset');\n code.line('q = query(q, fbLimit(queryLimit + queryOffset));');\n code.line();\n\n code.line('const snapshot = await getDocs(q);');\n code.line(`let allItems = snapshot.docs.map(d => ({ id: d.id, ...d.data() })) as Types.${pascalName}[];`);\n code.line('const total = allItems.length;');\n code.comment('Apply client-side offset');\n code.line('let items = allItems.slice(queryOffset, queryOffset + queryLimit);');\n code.line();\n\n // Load relations\n if (hasRelations) {\n code.block('if (options?.include?.length) {', () => {\n code.block('items = await Promise.all(items.map(async (item) => {', () => {\n code.line('const result = { ...item } as Record<string, unknown>;');\n\n for (const rel of relations) {\n code.block(`if (options.include!.includes('${rel.name}')) {`, () => {\n generateFirebaseRelationLoad(code, schema, rel, config);\n });\n }\n\n code.line(`return result as Types.${pascalName};`);\n }, '}));');\n });\n }\n code.line();\n\n code.line('return {');\n code.line(' data: items,');\n code.line(' meta: { total, limit: queryLimit, offset: queryOffset, hasMore: queryOffset + queryLimit < total },');\n code.line('};');\n },\n '},'\n );\n code.line();\n\n // GET\n code.block(`get: async (id: string, options?: { include?: ${includeType}[] }): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n code.line(`const docRef = doc(firestore, '${collectionName}', id);`);\n code.line('const snapshot = await getDoc(docRef);');\n code.line(`if (!snapshot.exists()) throw new Error('${pascalName} not found');`);\n code.line(`let item = { id: snapshot.id, ...snapshot.data() } as Types.${pascalName};`);\n\n if (hasRelations) {\n code.line();\n code.block('if (options?.include?.length) {', () => {\n code.line('const result = { ...item } as Record<string, unknown>;');\n\n for (const rel of relations) {\n code.block(`if (options.include.includes('${rel.name}')) {`, () => {\n generateFirebaseRelationLoad(code, schema, rel, config);\n });\n }\n\n code.line(`item = result as Types.${pascalName};`);\n });\n }\n\n code.line();\n code.line('return { data: item };');\n }, '},');\n code.line();\n\n // CREATE (with nested relation support)\n generateFirebaseCreateMethod(code, schema, collectionName, config, allSchemas);\n code.line();\n\n // UPDATE\n code.block(`update: async (id: string, input: Types.${pascalName}Update): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n code.line(`const docRef = doc(firestore, '${collectionName}', id);`);\n code.line('await updateDoc(docRef, { ...input, updatedAt: new Date() });');\n code.line('const snapshot = await getDoc(docRef);');\n code.line(`return { data: { id: snapshot.id, ...snapshot.data() } as Types.${pascalName} };`);\n }, '},');\n code.line();\n\n // DELETE\n code.block('delete: async (id: string): Promise<void> => {', () => {\n code.line(`await deleteDoc(doc(firestore, '${collectionName}', id));`);\n }, '},');\n }, '},');\n code.line();\n}\n\n/**\n * Generate Firebase create method with nested relation support\n */\nfunction generateFirebaseCreateMethod(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n collectionName: string,\n config: FirebaseAdapterConfig,\n allSchemas: AnalyzedSchema[]\n): void {\n const { pascalName, relations } = schema;\n const nestedRels = relations.filter((r) => r.type === 'hasMany' || r.type === 'hasOne');\n\n // Create schema map for looking up target collections\n const schemaMap = new Map(allSchemas.map((s) => [s.name, s]));\n\n // Helper to get collection name for a target schema\n const getTargetCollection = (targetName: string): string => {\n const targetSchema = schemaMap.get(targetName);\n return config.collectionMap?.[targetName] ?? targetSchema?.pluralName ?? targetName + 's';\n };\n\n code.block(`create: async (input: Types.${pascalName}Create): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n if (nestedRels.length > 0) {\n const relNames = nestedRels.map((r) => r.name).join(', ');\n code.line(`const { ${relNames}, ...data } = input;`);\n code.line('const withTimestamps = { ...data, createdAt: new Date(), updatedAt: new Date() };');\n code.line(`const docRef = await addDoc(collection(firestore, '${collectionName}'), withTimestamps);`);\n code.line(`const item = { id: docRef.id, ...withTimestamps } as Types.${pascalName};`);\n code.line();\n\n for (const rel of nestedRels) {\n const targetCollection = getTargetCollection(rel.target);\n code.block(`if (${rel.name}) {`, () => {\n if (rel.type === 'hasMany') {\n code.block(`for (const nested of ${rel.name}) {`, () => {\n code.line(`const nestedData = { ...nested, ${rel.foreignKey}: item.id, createdAt: new Date(), updatedAt: new Date() };`);\n code.line(`await addDoc(collection(firestore, '${targetCollection}'), nestedData);`);\n });\n } else {\n code.line(`const nestedData = { ...${rel.name}, ${rel.foreignKey}: item.id, createdAt: new Date(), updatedAt: new Date() };`);\n code.line(`await addDoc(collection(firestore, '${targetCollection}'), nestedData);`);\n }\n });\n }\n\n code.line();\n code.line('return { data: item };');\n } else {\n code.line('const data = { ...input, createdAt: new Date(), updatedAt: new Date() };');\n code.line(`const docRef = await addDoc(collection(firestore, '${collectionName}'), data);`);\n code.line(`return { data: { id: docRef.id, ...data } as Types.${pascalName} };`);\n }\n }, '},');\n}\n\n/**\n * Generate code to load a relation in Firebase\n */\nfunction generateFirebaseRelationLoad(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n rel: AnalyzedRelation,\n config: FirebaseAdapterConfig,\n allSchemas?: AnalyzedSchema[]\n): void {\n // Create schema map for looking up target collections\n const schemaMap = allSchemas ? new Map(allSchemas.map((s) => [s.name, s])) : new Map();\n\n // Helper to get collection name for a target schema\n const getCollection = (targetName: string): string => {\n const targetSchema = schemaMap.get(targetName);\n return config.collectionMap?.[targetName] ?? targetSchema?.pluralName ?? targetName + 's';\n };\n\n const targetCollection = getCollection(rel.target);\n\n if (rel.type === 'hasMany') {\n code.line(`const ${rel.name}Query = query(`);\n code.line(` collection(firestore, '${targetCollection}'),`);\n code.line(` where('${rel.foreignKey}', '==', item.id)`);\n code.line(');');\n code.line(`const ${rel.name}Snapshot = await getDocs(${rel.name}Query);`);\n code.line(`result.${rel.name} = ${rel.name}Snapshot.docs.map(d => ({ id: d.id, ...d.data() }));`);\n } else if (rel.type === 'hasOne') {\n code.line(`const ${rel.name}Query = query(`);\n code.line(` collection(firestore, '${targetCollection}'),`);\n code.line(` where('${rel.foreignKey}', '==', item.id),`);\n code.line(' fbLimit(1)');\n code.line(');');\n code.line(`const ${rel.name}Snapshot = await getDocs(${rel.name}Query);`);\n code.line(`result.${rel.name} = ${rel.name}Snapshot.docs[0] ? { id: ${rel.name}Snapshot.docs[0].id, ...${rel.name}Snapshot.docs[0].data() } : null;`);\n } else if (rel.type === 'belongsTo') {\n code.line(`const ${rel.name}Ref = doc(firestore, '${targetCollection}', (item as Record<string, unknown>).${rel.localField} as string);`);\n code.line(`const ${rel.name}Snapshot = await getDoc(${rel.name}Ref);`);\n code.line(`result.${rel.name} = ${rel.name}Snapshot.exists() ? { id: ${rel.name}Snapshot.id, ...${rel.name}Snapshot.data() } : null;`);\n } else if (rel.type === 'manyToMany' && rel.through) {\n const throughCollection = getCollection(rel.through);\n // foreignKey is the FK on the junction table pointing to the source entity\n code.comment('Load manyToMany via junction collection');\n code.line(`const junctionQuery = query(`);\n code.line(` collection(firestore, '${throughCollection}'),`);\n code.line(` where('${rel.foreignKey}', '==', item.id)`);\n code.line(');');\n code.line(`const junctionSnapshot = await getDocs(junctionQuery);`);\n code.line(`const relatedIds = junctionSnapshot.docs.map(d => (d.data() as Record<string, unknown>).${rel.otherKey}) as string[];`);\n code.line();\n code.block('if (relatedIds.length > 0) {', () => {\n code.comment('Firebase in query limited to 10 items, batch if needed');\n code.line(`const ${rel.name}Results: unknown[] = [];`);\n code.block('for (let i = 0; i < relatedIds.length; i += 10) {', () => {\n code.line('const batch = relatedIds.slice(i, i + 10);');\n code.line(`const batchQuery = query(`);\n code.line(` collection(firestore, '${targetCollection}'),`);\n code.line(\" where('__name__', 'in', batch)\");\n code.line(');');\n code.line('const batchSnapshot = await getDocs(batchQuery);');\n code.line(`${rel.name}Results.push(...batchSnapshot.docs.map(d => ({ id: d.id, ...d.data() })));`);\n });\n code.line(`result.${rel.name} = ${rel.name}Results;`);\n }, '} else {');\n code.indent();\n code.line(`result.${rel.name} = [];`);\n code.dedent();\n code.line('}');\n }\n}\n","/**\n * Fetch client generator\n *\n * @module cli/generators/fetch/client\n * @category CLI\n */\n\nimport type { AnalyzedSchema, FetchAdapterConfig } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Generate Fetch API client\n *\n * @param schemas - Analyzed schemas\n * @param config - Fetch adapter configuration\n * @returns Generated TypeScript code\n */\nexport function generateFetchClient(schemas: AnalyzedSchema[], config: FetchAdapterConfig): string {\n const code = new CodeBuilder();\n const baseUrl = config.baseUrl ?? '';\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import type * as Types from './types';\");\n code.line();\n\n code.line(`const BASE_URL = '${baseUrl}';`);\n code.line();\n\n // Fetch helper\n code.block('async function request<T>(path: string, options?: RequestInit): Promise<T> {', () => {\n code.line('const response = await fetch(`${BASE_URL}${path}`, {');\n code.line(\" headers: { 'Content-Type': 'application/json', ...options?.headers },\");\n code.line(' ...options,');\n code.line('});');\n code.line('if (!response.ok) throw new Error(`HTTP ${response.status}: ${response.statusText}`);');\n code.line('if (response.status === 204) return undefined as T;');\n code.line('return response.json();');\n });\n code.line();\n\n // Build query string helper\n code.block('function buildQuery(options?: Record<string, unknown>): string {', () => {\n code.line(\"if (!options) return '';\");\n code.line('const params = new URLSearchParams();');\n code.block('for (const [key, value] of Object.entries(options)) {', () => {\n code.line('if (value !== undefined) {');\n code.line(\" params.set(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\");\n code.line('}');\n });\n code.line('const str = params.toString();');\n code.line(\"return str ? `?${str}` : '';\");\n });\n code.line();\n\n // Generate API\n code.block('export const api = {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateFetchEntityApi(code, schema);\n }\n }, '};');\n\n return code.toString();\n}\n\n/**\n * Generate Fetch API methods for a single entity\n */\nfunction generateFetchEntityApi(code: CodeBuilder, schema: AnalyzedSchema): void {\n const { name, pascalName, endpoint, relations } = schema;\n const hasRelations = relations.length > 0;\n const includeType = hasRelations ? `Types.${pascalName}Include` : 'never';\n\n code.block(`${name}: {`, () => {\n // LIST\n code.block(\n `list: async (options?: Types.QueryOptions<Types.${pascalName}Filter, ${includeType}>): Promise<Types.ListResponse<Types.${pascalName}>> => {`,\n () => {\n code.line(`return request('${endpoint}' + buildQuery(options));`);\n },\n '},'\n );\n code.line();\n\n // GET\n code.block(`get: async (id: string, options?: { include?: ${includeType}[] }): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n code.line(`return request(\\`${endpoint}/\\${id}\\` + buildQuery(options));`);\n }, '},');\n code.line();\n\n // CREATE\n code.block(`create: async (input: Types.${pascalName}Create): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n code.line(`return request('${endpoint}', {`);\n code.line(\" method: 'POST',\");\n code.line(' body: JSON.stringify(input),');\n code.line('});');\n }, '},');\n code.line();\n\n // UPDATE\n code.block(`update: async (id: string, input: Types.${pascalName}Update): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n code.line(`return request(\\`${endpoint}/\\${id}\\`, {`);\n code.line(\" method: 'PUT',\");\n code.line(' body: JSON.stringify(input),');\n code.line('});');\n }, '},');\n code.line();\n\n // PATCH\n code.block(`patch: async (id: string, input: Types.${pascalName}Update): Promise<Types.ItemResponse<Types.${pascalName}>> => {`, () => {\n code.line(`return request(\\`${endpoint}/\\${id}\\`, {`);\n code.line(\" method: 'PATCH',\");\n code.line(' body: JSON.stringify(input),');\n code.line('});');\n }, '},');\n code.line();\n\n // DELETE\n code.block('delete: async (id: string): Promise<void> => {', () => {\n code.line(`await request(\\`${endpoint}/\\${id}\\`, { method: 'DELETE' });`);\n }, '},');\n }, '},');\n code.line();\n}\n","/**\n * PGlite database schema generator\n *\n * Generates SQL schema and TypeScript initialization code for PGlite\n *\n * @module cli/generators/pglite/db\n * @category CLI\n */\n\nimport type { AnalyzedSchema, AnalyzedField, PGliteAdapterConfig } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Map Schemock field types to PostgreSQL types\n */\nfunction mapToPostgresType(field: AnalyzedField): string {\n // Handle special cases first\n if (field.name === 'id') return 'UUID PRIMARY KEY DEFAULT gen_random_uuid()';\n\n // Handle enums\n if (field.isEnum && field.enumValues?.length) {\n const enumValues = field.enumValues.map((v) => `'${v}'`).join(', ');\n return `TEXT CHECK (${field.name} IN (${enumValues}))`;\n }\n\n // Handle arrays and objects as JSONB\n if (field.isArray || field.isObject) {\n return field.nullable ? 'JSONB' : 'JSONB NOT NULL';\n }\n\n // Handle refs (foreign keys)\n if (field.isRef) {\n return field.nullable ? 'UUID' : 'UUID NOT NULL';\n }\n\n // Map base types\n let pgType: string;\n switch (field.type) {\n case 'uuid':\n pgType = 'UUID';\n break;\n case 'string':\n case 'text':\n pgType = 'TEXT';\n break;\n case 'email':\n pgType = 'TEXT';\n break;\n case 'url':\n pgType = 'TEXT';\n break;\n case 'number':\n case 'float':\n pgType = 'DOUBLE PRECISION';\n break;\n case 'int':\n case 'integer':\n pgType = 'INTEGER';\n break;\n case 'boolean':\n pgType = 'BOOLEAN';\n break;\n case 'date':\n case 'datetime':\n pgType = 'TIMESTAMPTZ';\n break;\n case 'json':\n pgType = 'JSONB';\n break;\n default:\n pgType = 'TEXT';\n }\n\n // Add constraints\n const constraints: string[] = [];\n\n if (!field.nullable && field.name !== 'id') {\n constraints.push('NOT NULL');\n }\n\n if (field.unique) {\n constraints.push('UNIQUE');\n }\n\n if (field.hasDefault && field.defaultValue !== undefined) {\n const defaultVal = formatDefaultValue(field);\n if (defaultVal) {\n constraints.push(`DEFAULT ${defaultVal}`);\n }\n }\n\n return constraints.length > 0 ? `${pgType} ${constraints.join(' ')}` : pgType;\n}\n\n/**\n * Format default value for SQL\n */\nfunction formatDefaultValue(field: AnalyzedField): string | null {\n const val = field.defaultValue;\n\n if (val === null) return 'NULL';\n if (typeof val === 'boolean') return val ? 'TRUE' : 'FALSE';\n if (typeof val === 'number') return String(val);\n if (typeof val === 'string') return `'${val.replace(/'/g, \"''\")}'`;\n if (val instanceof Date) return `'${val.toISOString()}'`;\n if (typeof val === 'object') return `'${JSON.stringify(val).replace(/'/g, \"''\")}'::jsonb`;\n\n return null;\n}\n\n/**\n * Generate CREATE TABLE statement for a schema\n */\nfunction generateCreateTable(schema: AnalyzedSchema): string {\n const lines: string[] = [`CREATE TABLE IF NOT EXISTS \"${schema.tableName}\" (`];\n\n // Add columns\n const columns: string[] = [];\n for (const field of schema.fields) {\n const pgType = mapToPostgresType(field);\n columns.push(` \"${field.name}\" ${pgType}`);\n }\n\n lines.push(columns.join(',\\n'));\n lines.push(');');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate foreign key constraints (after all tables exist)\n */\nfunction generateForeignKeys(schema: AnalyzedSchema, allSchemas: AnalyzedSchema[]): string[] {\n const fks: string[] = [];\n\n for (const field of schema.fields) {\n if (field.isRef && field.refTarget) {\n const targetSchema = allSchemas.find((s) => s.name === field.refTarget);\n if (targetSchema) {\n fks.push(\n `ALTER TABLE \"${schema.tableName}\" ADD CONSTRAINT \"fk_${schema.tableName}_${field.name}\" ` +\n `FOREIGN KEY (\"${field.name}\") REFERENCES \"${targetSchema.tableName}\"(\"id\") ON DELETE CASCADE;`\n );\n }\n }\n }\n\n return fks;\n}\n\n/**\n * Generate indexes for unique fields\n */\nfunction generateIndexes(schema: AnalyzedSchema): string[] {\n const indexes: string[] = [];\n\n for (const field of schema.fields) {\n // Create index for foreign keys\n if (field.isRef) {\n indexes.push(\n `CREATE INDEX IF NOT EXISTS \"idx_${schema.tableName}_${field.name}\" ON \"${schema.tableName}\"(\"${field.name}\");`\n );\n }\n }\n\n return indexes;\n}\n\n/**\n * Generate RLS policies for a schema (generic context-based)\n */\nfunction generateRLSPolicies(schema: AnalyzedSchema): string[] {\n const { tableName, rls } = schema;\n const policies: string[] = [];\n\n if (!rls.enabled) {\n return policies;\n }\n\n // Enable RLS on the table\n policies.push(`ALTER TABLE \"${tableName}\" ENABLE ROW LEVEL SECURITY;`);\n policies.push(`ALTER TABLE \"${tableName}\" FORCE ROW LEVEL SECURITY;`);\n\n // Generate policies based on configuration\n const operations = ['SELECT', 'INSERT', 'UPDATE', 'DELETE'] as const;\n const opHas = {\n SELECT: rls.hasSelect,\n INSERT: rls.hasInsert,\n UPDATE: rls.hasUpdate,\n DELETE: rls.hasDelete,\n };\n\n for (const op of operations) {\n if (!opHas[op]) continue;\n\n // Check for custom SQL policy first\n const opLower = op.toLowerCase() as 'select' | 'insert' | 'update' | 'delete';\n const customSql = rls.sql?.[opLower];\n\n if (customSql) {\n // Use custom SQL policy\n policies.push(\n `CREATE POLICY \"${tableName}_${opLower}_policy\" ON \"${tableName}\" FOR ${op} USING (${customSql});`\n );\n } else if (rls.scope.length > 0) {\n // Generate policy from scope mappings\n const conditions: string[] = [];\n\n // Add bypass conditions first\n for (const bypass of rls.bypass) {\n const valuesStr = bypass.values.map((v) => `'${v}'`).join(', ');\n conditions.push(`current_setting('app.${bypass.contextKey}', true) IN (${valuesStr})`);\n }\n\n // Add scope conditions\n for (const mapping of rls.scope) {\n // row.field = current_setting('app.contextKey')\n conditions.push(`\"${mapping.field}\" = current_setting('app.${mapping.contextKey}', true)::uuid`);\n }\n\n const condition = conditions.length > 1\n ? conditions.map((c, i) => i === 0 && rls.bypass.length > 0 ? c : `(${c})`).join(' OR ')\n : conditions[0] || 'true';\n\n policies.push(\n `CREATE POLICY \"${tableName}_${opLower}_policy\" ON \"${tableName}\" FOR ${op} USING (${condition});`\n );\n }\n }\n\n return policies;\n}\n\n/**\n * Generate PGlite database initialization code\n *\n * @param schemas - Analyzed schemas\n * @param config - PGlite adapter configuration\n * @returns Generated TypeScript code\n */\nexport function generatePGliteDb(schemas: AnalyzedSchema[], config: PGliteAdapterConfig): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { PGlite } from '@electric-sql/pglite';\");\n code.line();\n\n // Storage option\n const storage = config.persistence === 'memory' ? undefined : config.dataDir || 'idb://schemock-db';\n\n code.comment('Database instance');\n if (storage) {\n code.line(`export const db = new PGlite('${storage}');`);\n } else {\n code.line('export const db = new PGlite();');\n }\n code.line();\n\n // Generate SQL schema\n code.comment('SQL Schema');\n code.line('const schema = `');\n\n // Enable UUID extension\n code.raw('CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";');\n code.raw('');\n\n // Create tables in dependency order\n for (const schema of schemas) {\n code.raw(generateCreateTable(schema));\n code.raw('');\n }\n\n // Add foreign keys\n const allFKs: string[] = [];\n for (const schema of schemas) {\n allFKs.push(...generateForeignKeys(schema, schemas));\n }\n if (allFKs.length > 0) {\n code.raw('-- Foreign Keys');\n for (const fk of allFKs) {\n code.raw(fk);\n }\n code.raw('');\n }\n\n // Add indexes\n const allIndexes: string[] = [];\n for (const schema of schemas) {\n allIndexes.push(...generateIndexes(schema));\n }\n if (allIndexes.length > 0) {\n code.raw('-- Indexes');\n for (const idx of allIndexes) {\n code.raw(idx);\n }\n code.raw('');\n }\n\n // Add RLS policies\n const allPolicies: string[] = [];\n for (const schema of schemas) {\n allPolicies.push(...generateRLSPolicies(schema));\n }\n if (allPolicies.length > 0) {\n code.raw('-- Row-Level Security Policies');\n for (const policy of allPolicies) {\n code.raw(policy);\n }\n }\n\n code.line('`;');\n code.line();\n\n // Initialize function\n code.comment('Initialize database schema');\n code.line('let initialized = false;');\n code.line();\n code.block('export async function initDb(): Promise<void> {', () => {\n code.line('if (initialized) return;');\n code.line('await db.exec(schema);');\n code.line('initialized = true;');\n });\n code.line();\n\n // Reset function\n code.comment('Reset database (drop and recreate all tables)');\n code.block('export async function resetDb(): Promise<void> {', () => {\n code.line('const dropSql = [');\n for (const schema of [...schemas].reverse()) {\n code.line(` 'DROP TABLE IF EXISTS \"${schema.tableName}\" CASCADE',`);\n }\n code.line('].join(\";\\\\n\");');\n code.line();\n code.line('await db.exec(dropSql);');\n code.line('initialized = false;');\n code.line('await initDb();');\n });\n code.line();\n\n // Export table names\n code.comment('Table name mapping');\n code.block('export const tables = {', () => {\n for (const schema of schemas) {\n code.line(`${schema.name}: '${schema.tableName}',`);\n }\n }, '} as const;');\n code.line();\n\n code.line('export type TableName = keyof typeof tables;');\n code.line();\n\n // Check if any schema has RLS enabled\n const hasRLS = schemas.some((s) => s.rls.enabled);\n if (hasRLS) {\n generateRLSHelpers(code);\n }\n\n return code.toString();\n}\n\n/**\n * Generate RLS helper functions (generic context-based)\n */\nfunction generateRLSHelpers(code: CodeBuilder): void {\n code.comment('Row-Level Security Context (generic key-value)');\n code.block('export interface RLSContext {', () => {\n code.line('[key: string]: unknown;');\n }, '}');\n code.line();\n\n code.comment('Set context for RLS (sets PostgreSQL session variables)');\n code.block('export async function setContext(ctx: RLSContext | null): Promise<void> {', () => {\n code.block('if (ctx) {', () => {\n code.block('for (const [key, value] of Object.entries(ctx)) {', () => {\n code.line(\"if (value !== undefined && value !== null) {\");\n code.line(\" await db.exec(`SET LOCAL app.${key} = '${value}'`);\");\n code.line('}');\n });\n }, '} else {');\n code.indent();\n code.comment('Reset all app.* settings would require knowing which keys were set');\n code.comment('For simplicity, start a new transaction instead');\n code.dedent();\n code.line('}');\n });\n code.line();\n\n code.comment('Execute a function with context (transaction-scoped)');\n code.block('export async function withContext<T>(ctx: RLSContext, fn: () => Promise<T>): Promise<T> {', () => {\n code.line(\"await db.exec('BEGIN');\");\n code.block('try {', () => {\n code.line('await setContext(ctx);');\n code.line('const result = await fn();');\n code.line(\"await db.exec('COMMIT');\");\n code.line('return result;');\n }, '} catch (e) {');\n code.indent();\n code.line(\"await db.exec('ROLLBACK');\");\n code.line('throw e;');\n code.dedent();\n code.line('}');\n });\n code.line();\n\n code.comment('RLS Error class');\n code.block('export class RLSError extends Error {', () => {\n code.line(\"readonly code = 'RLS_DENIED';\");\n code.block('constructor(message: string) {', () => {\n code.line('super(message);');\n code.line(\"this.name = 'RLSError';\");\n });\n }, '}');\n}\n","/**\n * PGlite API client generator\n *\n * Generates a TypeScript client with SQL-based CRUD operations\n *\n * @module cli/generators/pglite/client\n * @category CLI\n */\n\nimport type { AnalyzedSchema, AnalyzedRelation } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Generate PGlite API client\n *\n * @param schemas - Analyzed schemas\n * @returns Generated TypeScript code\n */\nexport function generatePGliteClient(schemas: AnalyzedSchema[]): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { db, initDb, tables } from './db';\");\n code.line(\"import type * as Types from './types';\");\n code.line();\n\n // Generate SQL query builder helpers\n generateQueryHelpers(code);\n code.line();\n\n // Generate the API object\n code.block('export const api = {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateEntityApi(code, schema, schemas);\n }\n }, '};');\n\n return code.toString();\n}\n\n/**\n * Generate SQL query helper functions\n */\nfunction generateQueryHelpers(code: CodeBuilder): void {\n // Filter to SQL WHERE clause builder\n code.comment('Build WHERE clause from filter object');\n code.block(\n 'function buildWhere(filter: Record<string, unknown>, params: unknown[], startIndex = 1): { sql: string; nextIndex: number } {',\n () => {\n code.line('const conditions: string[] = [];');\n code.line('let paramIndex = startIndex;');\n code.line();\n code.block('for (const [key, value] of Object.entries(filter)) {', () => {\n code.block('if (typeof value === \"object\" && value !== null) {', () => {\n code.line('const f = value as Record<string, unknown>;');\n code.line();\n code.block(\"if ('equals' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" = $${paramIndex++}`);');\n code.line('params.push(f.equals);');\n });\n code.block(\"if ('not' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" != $${paramIndex++}`);');\n code.line('params.push(f.not);');\n });\n code.block(\"if ('in' in f) {\", () => {\n code.line('const arr = f.in as unknown[];');\n code.line('const placeholders = arr.map(() => `$${paramIndex++}`).join(\", \");');\n code.line('conditions.push(`\"${key}\" IN (${placeholders})`);');\n code.line('params.push(...arr);');\n });\n code.block(\"if ('notIn' in f) {\", () => {\n code.line('const arr = f.notIn as unknown[];');\n code.line('const placeholders = arr.map(() => `$${paramIndex++}`).join(\", \");');\n code.line('conditions.push(`\"${key}\" NOT IN (${placeholders})`);');\n code.line('params.push(...arr);');\n });\n code.block(\"if ('contains' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" ILIKE $${paramIndex++}`);');\n code.line(\"params.push(`%${f.contains}%`);\");\n });\n code.block(\"if ('startsWith' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" ILIKE $${paramIndex++}`);');\n code.line(\"params.push(`${f.startsWith}%`);\");\n });\n code.block(\"if ('endsWith' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" ILIKE $${paramIndex++}`);');\n code.line(\"params.push(`%${f.endsWith}`);\");\n });\n code.block(\"if ('gt' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" > $${paramIndex++}`);');\n code.line('params.push(f.gt);');\n });\n code.block(\"if ('lt' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" < $${paramIndex++}`);');\n code.line('params.push(f.lt);');\n });\n code.block(\"if ('gte' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" >= $${paramIndex++}`);');\n code.line('params.push(f.gte);');\n });\n code.block(\"if ('lte' in f) {\", () => {\n code.line('conditions.push(`\"${key}\" <= $${paramIndex++}`);');\n code.line('params.push(f.lte);');\n });\n code.block(\"if ('isNull' in f) {\", () => {\n code.line('conditions.push(f.isNull ? `\"${key}\" IS NULL` : `\"${key}\" IS NOT NULL`);');\n });\n }, '} else {');\n code.indent();\n code.line('conditions.push(`\"${key}\" = $${paramIndex++}`);');\n code.line('params.push(value);');\n code.dedent();\n code.line('}');\n });\n code.line();\n code.line(\"return { sql: conditions.length ? conditions.join(' AND ') : '1=1', nextIndex: paramIndex };\");\n }\n );\n code.line();\n\n // ORDER BY builder\n code.comment('Build ORDER BY clause');\n code.block('function buildOrderBy(orderBy?: Record<string, \"asc\" | \"desc\">): string {', () => {\n code.line('if (!orderBy) return \"\";');\n code.line('const clauses = Object.entries(orderBy).map(([key, dir]) => `\"${key}\" ${dir.toUpperCase()}`);');\n code.line('return clauses.length ? `ORDER BY ${clauses.join(\", \")}` : \"\";');\n });\n code.line();\n\n // Parse JSONB fields\n code.comment('Parse JSONB fields in result');\n code.block(\n 'function parseRow<T>(row: Record<string, unknown>, jsonFields: string[]): T {',\n () => {\n code.line('const result = { ...row };');\n code.block('for (const field of jsonFields) {', () => {\n code.block('if (result[field] && typeof result[field] === \"string\") {', () => {\n code.block('try {', () => {\n code.line('result[field] = JSON.parse(result[field] as string);');\n }, '} catch { /* keep as string */ }');\n });\n });\n code.line('return result as T;');\n }\n );\n}\n\n/**\n * Generate API methods for a single entity\n */\nfunction generateEntityApi(code: CodeBuilder, schema: AnalyzedSchema, allSchemas: AnalyzedSchema[]): void {\n const { name, pascalName, tableName, relations, fields } = schema;\n const hasRelations = relations.length > 0;\n const includeType = hasRelations ? `Types.${pascalName}Include` : 'never';\n\n // Find JSONB fields for parsing\n const jsonFields = fields.filter((f) => f.isArray || f.isObject).map((f) => f.name);\n\n code.block(`${name}: {`, () => {\n // LIST\n code.block(\n `list: async (options?: Types.QueryOptions<Types.${pascalName}Filter, ${includeType}>): Promise<Types.ListResponse<Types.${pascalName}>> => {`,\n () => {\n code.line('await initDb();');\n code.line('const params: unknown[] = [];');\n code.line('let paramIndex = 1;');\n code.line();\n\n // Build WHERE clause\n code.line('let whereClause = \"1=1\";');\n code.block('if (options?.where) {', () => {\n code.line('const { sql, nextIndex } = buildWhere(options.where, params);');\n code.line('whereClause = sql;');\n code.line('paramIndex = nextIndex;');\n });\n code.line();\n\n // Count query\n code.line(`const countResult = await db.query<{ count: string }>(`);\n code.line(` \\`SELECT COUNT(*) as count FROM \"${tableName}\" WHERE \\${whereClause}\\`,`);\n code.line(' params');\n code.line(');');\n code.line('const total = parseInt(countResult.rows[0].count, 10);');\n code.line();\n\n // Main query\n code.line('const orderBy = buildOrderBy(options?.orderBy);');\n code.line('const limit = options?.limit ?? 20;');\n code.line('const offset = options?.offset ?? 0;');\n code.line();\n code.line(`const result = await db.query<Types.${pascalName}>(`);\n code.line(` \\`SELECT * FROM \"${tableName}\" WHERE \\${whereClause} \\${orderBy} LIMIT \\${limit} OFFSET \\${offset}\\`,`);\n code.line(' params');\n code.line(');');\n code.line();\n\n // Parse JSONB fields\n if (jsonFields.length > 0) {\n const jsonFieldsStr = jsonFields.map((f) => `'${f}'`).join(', ');\n code.line(`let items = result.rows.map(row => parseRow<Types.${pascalName}>(row as Record<string, unknown>, [${jsonFieldsStr}]));`);\n } else {\n code.line('let items = result.rows;');\n }\n code.line();\n\n // Load relations\n if (hasRelations) {\n code.block('if (options?.include?.length) {', () => {\n code.block('items = await Promise.all(items.map(async (item) => {', () => {\n code.line('const result = { ...item } as Record<string, unknown>;');\n for (const rel of relations) {\n code.block(`if (options.include!.includes('${rel.name}')) {`, () => {\n generateRelationLoad(code, schema, rel, allSchemas);\n });\n }\n code.line(`return result as Types.${pascalName};`);\n }, '}));');\n });\n code.line();\n }\n\n code.line('return { data: items, meta: { total, limit, offset, hasMore: offset + limit < total } };');\n },\n '},'\n );\n code.line();\n\n // GET\n code.block(\n `get: async (id: string, options?: { include?: ${includeType}[] }): Promise<Types.ItemResponse<Types.${pascalName}>> => {`,\n () => {\n code.line('await initDb();');\n code.line();\n code.line(`const result = await db.query<Types.${pascalName}>(`);\n code.line(` \\`SELECT * FROM \"${tableName}\" WHERE \"id\" = $1\\`,`);\n code.line(' [id]');\n code.line(');');\n code.line();\n code.line(`if (result.rows.length === 0) throw new Error('${pascalName} not found');`);\n code.line();\n\n if (jsonFields.length > 0) {\n const jsonFieldsStr = jsonFields.map((f) => `'${f}'`).join(', ');\n code.line(`let item = parseRow<Types.${pascalName}>(result.rows[0] as Record<string, unknown>, [${jsonFieldsStr}]);`);\n } else {\n code.line('let item = result.rows[0];');\n }\n code.line();\n\n if (hasRelations) {\n code.line('const resultObj = { ...item } as Record<string, unknown>;');\n code.line();\n code.block('if (options?.include?.length) {', () => {\n for (const rel of relations) {\n code.block(`if (options.include.includes('${rel.name}')) {`, () => {\n generateRelationLoad(code, schema, rel, allSchemas, 'resultObj', 'item');\n });\n }\n });\n code.line();\n code.line(`return { data: resultObj as Types.${pascalName} };`);\n } else {\n code.line('return { data: item };');\n }\n },\n '},'\n );\n code.line();\n\n // CREATE\n generateCreateMethod(code, schema, allSchemas);\n code.line();\n\n // UPDATE\n code.block(\n `update: async (id: string, input: Types.${pascalName}Update): Promise<Types.ItemResponse<Types.${pascalName}>> => {`,\n () => {\n code.line('await initDb();');\n code.line();\n code.line(\"const data = { ...input, updatedAt: new Date() };\");\n code.line('const fields = Object.keys(data);');\n code.line('const values = Object.values(data);');\n code.line();\n code.line('const setClauses = fields.map((f, i) => `\"${f}\" = $${i + 1}`).join(\", \");');\n code.line();\n code.line(`const result = await db.query<Types.${pascalName}>(`);\n code.line(` \\`UPDATE \"${tableName}\" SET \\${setClauses} WHERE \"id\" = $\\${fields.length + 1} RETURNING *\\`,`);\n code.line(' [...values, id]');\n code.line(');');\n code.line();\n code.line(`if (result.rows.length === 0) throw new Error('${pascalName} not found');`);\n\n if (jsonFields.length > 0) {\n const jsonFieldsStr = jsonFields.map((f) => `'${f}'`).join(', ');\n code.line(`return { data: parseRow<Types.${pascalName}>(result.rows[0] as Record<string, unknown>, [${jsonFieldsStr}]) };`);\n } else {\n code.line('return { data: result.rows[0] };');\n }\n },\n '},'\n );\n code.line();\n\n // DELETE\n code.block('delete: async (id: string): Promise<void> => {', () => {\n code.line('await initDb();');\n code.line();\n code.line(`const result = await db.query(`);\n code.line(` \\`DELETE FROM \"${tableName}\" WHERE \"id\" = $1 RETURNING \"id\"\\`,`);\n code.line(' [id]');\n code.line(');');\n code.line();\n code.line(`if (result.rows.length === 0) throw new Error('${pascalName} not found');`);\n }, '},');\n }, '},');\n code.line();\n}\n\n/**\n * Generate code to load a relation\n */\nfunction generateRelationLoad(\n code: CodeBuilder,\n schema: AnalyzedSchema,\n rel: AnalyzedRelation,\n allSchemas: AnalyzedSchema[],\n resultVar = 'result',\n itemVar = 'item'\n): void {\n const targetSchema = allSchemas.find((s) => s.name === rel.target);\n if (!targetSchema) return;\n\n if (rel.type === 'hasMany') {\n code.line(`const ${rel.name}Result = await db.query(`);\n code.line(` \\`SELECT * FROM \"${targetSchema.tableName}\" WHERE \"${rel.foreignKey}\" = $1\\`,`);\n code.line(` [${itemVar}.id]`);\n code.line(');');\n code.line(`${resultVar}.${rel.name} = ${rel.name}Result.rows;`);\n } else if (rel.type === 'hasOne') {\n code.line(`const ${rel.name}Result = await db.query(`);\n code.line(` \\`SELECT * FROM \"${targetSchema.tableName}\" WHERE \"${rel.foreignKey}\" = $1 LIMIT 1\\`,`);\n code.line(` [${itemVar}.id]`);\n code.line(');');\n code.line(`${resultVar}.${rel.name} = ${rel.name}Result.rows[0] ?? null;`);\n } else if (rel.type === 'belongsTo') {\n code.line(`const ${rel.name}Result = await db.query(`);\n code.line(` \\`SELECT * FROM \"${targetSchema.tableName}\" WHERE \"id\" = $1 LIMIT 1\\`,`);\n code.line(` [(${itemVar} as Record<string, unknown>).${rel.localField}]`);\n code.line(');');\n code.line(`${resultVar}.${rel.name} = ${rel.name}Result.rows[0] ?? null;`);\n } else if (rel.type === 'manyToMany') {\n const throughSchema = allSchemas.find((s) => s.name === rel.through);\n if (throughSchema) {\n // foreignKey is the FK on the junction table pointing to the source entity\n code.line(`const junctions = await db.query(`);\n code.line(` \\`SELECT \"${rel.otherKey}\" FROM \"${throughSchema.tableName}\" WHERE \"${rel.foreignKey}\" = $1\\`,`);\n code.line(` [${itemVar}.id]`);\n code.line(');');\n code.line(`const relatedIds = junctions.rows.map(j => (j as Record<string, unknown>).${rel.otherKey});`);\n code.block('if (relatedIds.length > 0) {', () => {\n code.line('const placeholders = relatedIds.map((_, i) => `$${i + 1}`).join(\", \");');\n code.line(`const related = await db.query(`);\n code.line(` \\`SELECT * FROM \"${targetSchema.tableName}\" WHERE \"id\" IN (\\${placeholders})\\`,`);\n code.line(' relatedIds');\n code.line(');');\n code.line(`${resultVar}.${rel.name} = related.rows;`);\n }, '} else {');\n code.indent();\n code.line(`${resultVar}.${rel.name} = [];`);\n code.dedent();\n code.line('}');\n }\n }\n}\n\n/**\n * Generate create method with nested relation support\n */\nfunction generateCreateMethod(code: CodeBuilder, schema: AnalyzedSchema, allSchemas: AnalyzedSchema[]): void {\n const { name, pascalName, tableName, relations, fields } = schema;\n const nestedRels = relations.filter((r) => r.type === 'hasMany' || r.type === 'hasOne');\n const jsonFields = fields.filter((f) => f.isArray || f.isObject).map((f) => f.name);\n\n code.block(\n `create: async (input: Types.${pascalName}Create): Promise<Types.ItemResponse<Types.${pascalName}>> => {`,\n () => {\n code.line('await initDb();');\n code.line();\n\n if (nestedRels.length > 0) {\n const relNames = nestedRels.map((r) => r.name).join(', ');\n code.line(`const { ${relNames}, ...data } = input;`);\n } else {\n code.line('const data = input;');\n }\n code.line();\n\n // Serialize JSONB fields\n if (jsonFields.length > 0) {\n code.line('const serialized = { ...data } as Record<string, unknown>;');\n for (const jf of jsonFields) {\n code.block(`if (serialized.${jf} !== undefined) {`, () => {\n code.line(`serialized.${jf} = JSON.stringify(serialized.${jf});`);\n });\n }\n code.line();\n code.line('const fields = Object.keys(serialized);');\n code.line('const values = Object.values(serialized);');\n } else {\n code.line('const fields = Object.keys(data);');\n code.line('const values = Object.values(data);');\n }\n code.line();\n code.line('const placeholders = fields.map((_, i) => `$${i + 1}`).join(\", \");');\n code.line('const columns = fields.map(f => `\"${f}\"`).join(\", \");');\n code.line();\n code.line(`const result = await db.query<Types.${pascalName}>(`);\n code.line(` \\`INSERT INTO \"${tableName}\" (\\${columns}) VALUES (\\${placeholders}) RETURNING *\\`,`);\n code.line(' values');\n code.line(');');\n code.line();\n if (jsonFields.length > 0) {\n const jsonFieldsStr = jsonFields.map((f) => `'${f}'`).join(', ');\n code.line(`const item = parseRow<Types.${pascalName}>(result.rows[0] as Record<string, unknown>, [${jsonFieldsStr}]);`);\n } else {\n code.line('const item = result.rows[0];');\n }\n\n // Handle nested creates\n if (nestedRels.length > 0) {\n code.line();\n for (const rel of nestedRels) {\n const targetSchema = allSchemas.find((s) => s.name === rel.target);\n if (!targetSchema) continue;\n\n code.block(`if (${rel.name}) {`, () => {\n if (rel.type === 'hasMany') {\n code.block(`for (const nested of ${rel.name}) {`, () => {\n code.line(`const nestedData = { ...nested, ${rel.foreignKey}: item.id };`);\n code.line('const nestedFields = Object.keys(nestedData);');\n code.line('const nestedValues = Object.values(nestedData);');\n code.line('const nestedPlaceholders = nestedFields.map((_, i) => `$${i + 1}`).join(\", \");');\n code.line('const nestedColumns = nestedFields.map(f => `\"${f}\"`).join(\", \");');\n code.line('await db.query(');\n code.line(` \\`INSERT INTO \"${targetSchema.tableName}\" (\\${nestedColumns}) VALUES (\\${nestedPlaceholders})\\`,`);\n code.line(' nestedValues');\n code.line(');');\n });\n } else {\n code.line(`const nestedData = { ...${rel.name}, ${rel.foreignKey}: item.id };`);\n code.line('const nestedFields = Object.keys(nestedData);');\n code.line('const nestedValues = Object.values(nestedData);');\n code.line('const nestedPlaceholders = nestedFields.map((_, i) => `$${i + 1}`).join(\", \");');\n code.line('const nestedColumns = nestedFields.map(f => `\"${f}\"`).join(\", \");');\n code.line('await db.query(');\n code.line(` \\`INSERT INTO \"${targetSchema.tableName}\" (\\${nestedColumns}) VALUES (\\${nestedPlaceholders})\\`,`);\n code.line(' nestedValues');\n code.line(');');\n }\n });\n }\n }\n\n code.line();\n code.line('return { data: item };');\n },\n '},'\n );\n}\n","/**\n * PGlite seed utilities generator\n *\n * Generates seed data and utility functions for PGlite database\n *\n * @module cli/generators/pglite/seed\n * @category CLI\n */\n\nimport type { AnalyzedSchema, AnalyzedField, PGliteAdapterConfig } from '../../types';\nimport { CodeBuilder } from '../../utils/code-builder';\n\n/**\n * Generate seed and utility functions for PGlite database\n *\n * @param schemas - Analyzed schemas\n * @param config - PGlite adapter configuration\n * @returns Generated TypeScript code\n */\nexport function generatePGliteSeed(schemas: AnalyzedSchema[], config: PGliteAdapterConfig): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { db, initDb, resetDb, tables } from './db';\");\n code.line(\"import { faker } from '@faker-js/faker';\");\n code.line();\n\n // Set faker seed\n if (config.fakerSeed !== undefined) {\n code.line(`faker.seed(${config.fakerSeed});`);\n } else {\n code.line('faker.seed(Date.now());');\n }\n code.line();\n\n // Type for seed counts\n code.block('export interface SeedCounts {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n code.line(`${schema.name}?: number;`);\n }\n });\n code.line();\n\n // Default counts\n code.block('const defaultCounts: Required<SeedCounts> = {', () => {\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n const count = config.seed?.[schema.name] ?? 10;\n code.line(`${schema.name}: ${count},`);\n }\n }, '};');\n code.line();\n\n // Helper to pick random item from array\n code.block('function pickRandom<T>(arr: T[]): T | undefined {', () => {\n code.line('if (arr.length === 0) return undefined;');\n code.line('return arr[Math.floor(Math.random() * arr.length)];');\n });\n code.line();\n\n // Generate entity data function\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateEntityGenerator(code, schema);\n code.line();\n }\n\n // Seed function\n code.block('export async function seed(counts: SeedCounts = {}): Promise<void> {', () => {\n code.line('await initDb();');\n code.line('const merged = { ...defaultCounts, ...counts };');\n code.line();\n code.comment('Track created entity IDs for foreign key references');\n code.line('const ids: Record<string, string[]> = {};');\n code.line();\n\n // Generate in dependency order\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n\n const belongsToRels = schema.relations.filter((r) => r.type === 'belongsTo');\n\n code.line(`ids.${schema.name} = [];`);\n code.block(`for (let i = 0; i < merged.${schema.name}; i++) {`, () => {\n // Generate data\n if (belongsToRels.length > 0) {\n code.line(`const data = generate${schema.pascalName}();`);\n // Set FK values from parent entities\n for (const rel of belongsToRels) {\n const localField = rel.localField || rel.foreignKey;\n const field = schema.fields.find((f) => f.name === localField);\n if (field?.nullable) {\n code.line(`data.${localField} = Math.random() > 0.3 ? pickRandom(ids.${rel.target}) : null;`);\n } else {\n code.line(`data.${localField} = pickRandom(ids.${rel.target}) ?? null;`);\n }\n }\n } else {\n code.line(`const data = generate${schema.pascalName}();`);\n }\n code.line();\n\n // Build INSERT query\n code.line('const fields = Object.keys(data).filter(k => data[k as keyof typeof data] !== undefined);');\n code.line('const values = fields.map(k => data[k as keyof typeof data]);');\n code.line('const placeholders = fields.map((_, i) => `$${i + 1}`).join(\", \");');\n code.line('const columns = fields.map(f => `\"${f}\"`).join(\", \");');\n code.line();\n code.line(`const result = await db.query<{ id: string }>(`);\n code.line(` \\`INSERT INTO \"${schema.tableName}\" (\\${columns}) VALUES (\\${placeholders}) RETURNING \"id\"\\`,`);\n code.line(' values');\n code.line(');');\n code.line(`ids.${schema.name}.push(result.rows[0].id);`);\n });\n code.line();\n }\n\n code.line(\"console.log('ā Database seeded');\");\n });\n code.line();\n\n // Reset function\n code.block('export async function reset(): Promise<void> {', () => {\n code.line('await resetDb();');\n code.line(\"console.log('ā Database reset');\");\n });\n code.line();\n\n // Get all function (for debugging)\n code.block('export async function getAll(): Promise<Record<string, unknown[]>> {', () => {\n code.line('await initDb();');\n code.block('return {', () => {\n for (const schema of schemas) {\n code.line(`${schema.name}: (await db.query(\\`SELECT * FROM \"${schema.tableName}\"\\`)).rows,`);\n }\n }, '};');\n });\n code.line();\n\n // Count function\n code.block('export async function count(): Promise<Record<string, number>> {', () => {\n code.line('await initDb();');\n code.block('return {', () => {\n for (const schema of schemas) {\n code.line(\n `${schema.name}: parseInt((await db.query<{ count: string }>(\\`SELECT COUNT(*) as count FROM \"${schema.tableName}\"\\`)).rows[0].count, 10),`\n );\n }\n }, '};');\n });\n\n return code.toString();\n}\n\n/**\n * Generate a function that creates fake entity data\n */\nfunction generateEntityGenerator(code: CodeBuilder, schema: AnalyzedSchema): void {\n // Build the return type shape for fields\n const fieldTypes: string[] = [];\n for (const field of schema.fields) {\n if (field.name === 'id') continue; // UUID auto-generated by DB\n if (field.isRef) {\n // FK fields - typed as string | null\n fieldTypes.push(`${field.name}: string | null`);\n } else {\n fieldTypes.push(`${field.name}: ${field.tsType}${field.nullable ? ' | null' : ''}`);\n }\n }\n\n code.block(`function generate${schema.pascalName}(): { ${fieldTypes.join('; ')} } {`, () => {\n code.block('return {', () => {\n for (const field of schema.fields) {\n if (field.name === 'id') continue; // UUID auto-generated by DB\n if (field.isRef) {\n // FK fields - placeholder, will be set by seed function\n code.line(`${field.name}: null,`);\n } else {\n generateFieldValue(code, field);\n }\n }\n }, '};');\n });\n}\n\n/**\n * Generate faker call for a field\n */\nfunction generateFieldValue(code: CodeBuilder, field: AnalyzedField): void {\n // Handle nullable fields\n if (field.nullable) {\n code.line(`${field.name}: Math.random() > 0.1 ? ${field.fakerCall} : null,`);\n } else {\n code.line(`${field.name}: ${field.fakerCall},`);\n }\n}\n","/**\n * React Query hooks generator\n *\n * @module cli/generators/hooks\n * @category CLI\n */\n\nimport type { AnalyzedSchema } from '../types';\nimport { CodeBuilder } from '../utils/code-builder';\nimport { toPascalCase } from '../utils/pluralize';\n\n/**\n * Generate React Query hooks for all entities\n *\n * @param schemas - Analyzed schemas\n * @returns Generated TypeScript code\n */\nexport function generateHooks(schemas: AnalyzedSchema[]): string {\n const code = new CodeBuilder();\n\n code.comment('GENERATED BY SCHEMOCK - DO NOT EDIT');\n code.line(\"import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\");\n code.line(\"import { useMemo } from 'react';\");\n code.line(\"import { api } from './client';\");\n code.line(\"import type * as Types from './types';\");\n code.line();\n\n // Add stable query key helper to prevent unnecessary refetches\n generateStableKeyHelper(code);\n\n for (const schema of schemas) {\n if (schema.isJunctionTable) continue;\n generateEntityHooks(code, schema);\n }\n\n return code.toString();\n}\n\n/**\n * Generate helper function for creating stable query keys\n *\n * This prevents unnecessary refetches when options objects have the same\n * values but different references (common with inline objects in React).\n */\nfunction generateStableKeyHelper(code: CodeBuilder): void {\n code.comment('=============================================================================');\n code.comment('Stable Query Key Helper');\n code.comment('');\n code.comment('Creates stable query keys from options objects to prevent unnecessary');\n code.comment('refetches when object references change but values are the same.');\n code.comment('=============================================================================');\n code.line();\n\n code.multiDocComment([\n 'Create a stable serialized key from an options object.',\n 'Uses JSON.stringify with sorted keys for consistent ordering.',\n '',\n '@param options - The options object to serialize',\n '@returns A stable string representation of the options',\n ]);\n code.block('function stableKey(options: unknown): string {', () => {\n code.line('if (options === undefined || options === null) return \"\";');\n code.block('try {', () => {\n code.comment('Sort object keys for consistent serialization');\n code.line('return JSON.stringify(options, (_, value) => {');\n code.line(' if (value && typeof value === \"object\" && !Array.isArray(value)) {');\n code.line(' return Object.keys(value).sort().reduce((sorted, key) => {');\n code.line(' sorted[key] = value[key];');\n code.line(' return sorted;');\n code.line(' }, {} as Record<string, unknown>);');\n code.line(' }');\n code.line(' return value;');\n code.line('});');\n }, '} catch {');\n code.indent();\n code.comment('Fallback for non-serializable values');\n code.line('return String(options);');\n code.dedent();\n code.line('}');\n });\n code.line();\n\n code.multiDocComment([\n 'React hook that memoizes a stable query key from options.',\n 'Only recomputes when the serialized value changes.',\n '',\n '@param baseKey - The base query key (e.g., \"users\")',\n '@param options - Optional options to include in the key',\n '@returns A stable query key array',\n ]);\n code.block('function useStableQueryKey(baseKey: string, ...parts: unknown[]): unknown[] {', () => {\n code.line('const serialized = parts.map(p => stableKey(p)).join(\"|\");');\n code.line('return useMemo(() => [baseKey, ...parts], [baseKey, serialized]);');\n });\n code.line();\n}\n\n/**\n * Generate hooks for a single entity\n */\nfunction generateEntityHooks(code: CodeBuilder, schema: AnalyzedSchema): void {\n const { name, pascalName, pluralName, pascalPluralName, relations } = schema;\n const hasRelations = relations.length > 0;\n\n code.comment(`==================== ${pascalName} Hooks ====================`);\n code.line();\n\n // useEntities (list)\n code.docComment(`Fetch list of ${pluralName}`);\n code.block(`export function use${pascalPluralName}(options?: {`, () => {\n code.line(`where?: Types.${pascalName}Filter;`);\n if (hasRelations) {\n code.line(`include?: Types.${pascalName}Include[];`);\n }\n code.line(\"orderBy?: Record<string, 'asc' | 'desc'>;\");\n code.line('limit?: number;');\n code.line('offset?: number;');\n code.line('enabled?: boolean;');\n }, '}) {');\n code.indent();\n code.comment('Use stable query key to prevent unnecessary refetches');\n code.line(`const queryKey = useStableQueryKey('${pluralName}', options);`);\n code.block('return useQuery({', () => {\n code.line('queryKey,');\n code.line(`queryFn: () => api.${name}.list(options),`);\n code.line('enabled: options?.enabled ?? true,');\n }, '});');\n code.dedent();\n code.line('}');\n code.line();\n\n // useEntity (single)\n code.docComment(`Fetch single ${pascalName} by ID`);\n code.block(`export function use${pascalName}(id: string | undefined, options?: {`, () => {\n if (hasRelations) {\n code.line(`include?: Types.${pascalName}Include[];`);\n }\n code.line('enabled?: boolean;');\n }, '}) {');\n code.indent();\n if (hasRelations) {\n code.comment('Use stable query key for includes array');\n code.line(`const queryKey = useStableQueryKey('${pluralName}', id, options?.include);`);\n }\n code.block('return useQuery({', () => {\n if (hasRelations) {\n code.line('queryKey,');\n code.line(`queryFn: () => api.${name}.get(id!, { include: options?.include }),`);\n } else {\n code.line(`queryKey: ['${pluralName}', id],`);\n code.line(`queryFn: () => api.${name}.get(id!),`);\n }\n code.line('enabled: (options?.enabled ?? true) && !!id,');\n }, '});');\n code.dedent();\n code.line('}');\n code.line();\n\n // Convenience hooks for common includes\n for (const rel of relations) {\n const hookName = `use${pascalName}With${toPascalCase(rel.name)}`;\n code.docComment(`Fetch ${pascalName} with ${rel.name} included`);\n code.block(`export function ${hookName}(id: string | undefined) {`, () => {\n code.line(`return use${pascalName}(id, { include: ['${rel.name}'] });`);\n });\n code.line();\n }\n\n // useCreateEntity\n code.docComment(`Create a new ${pascalName}`);\n code.block(`export function useCreate${pascalName}() {`, () => {\n code.line('const queryClient = useQueryClient();');\n code.block('return useMutation({', () => {\n code.line(`mutationFn: (data: Types.${pascalName}Create) => api.${name}.create(data),`);\n code.block('onSuccess: () => {', () => {\n code.line(`queryClient.invalidateQueries({ queryKey: ['${pluralName}'] });`);\n }, '},');\n }, '});');\n });\n code.line();\n\n // useUpdateEntity\n code.docComment(`Update an existing ${pascalName}`);\n code.block(`export function useUpdate${pascalName}() {`, () => {\n code.line('const queryClient = useQueryClient();');\n code.block('return useMutation({', () => {\n code.line(`mutationFn: ({ id, data }: { id: string; data: Types.${pascalName}Update }) =>`);\n code.line(` api.${name}.update(id, data),`);\n code.block('onSuccess: (_, { id }) => {', () => {\n code.line(`queryClient.invalidateQueries({ queryKey: ['${pluralName}'] });`);\n code.line(`queryClient.invalidateQueries({ queryKey: ['${pluralName}', id] });`);\n }, '},');\n }, '});');\n });\n code.line();\n\n // useDeleteEntity\n code.docComment(`Delete a ${pascalName}`);\n code.block(`export function useDelete${pascalName}() {`, () => {\n code.line('const queryClient = useQueryClient();');\n code.block('return useMutation({', () => {\n code.line(`mutationFn: (id: string) => api.${name}.delete(id),`);\n code.block('onSuccess: () => {', () => {\n code.line(`queryClient.invalidateQueries({ queryKey: ['${pluralName}'] });`);\n }, '},');\n }, '});');\n });\n code.line();\n}\n","/**\n * Main generate command for Schemock CLI\n *\n * @module cli/commands/generate\n * @category CLI\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { loadConfig } from '../config';\nimport { discoverSchemas, getRelativePath } from '../discover';\nimport { analyzeSchemas } from '../analyze';\nimport { analyzeEndpoints } from '../analyze-endpoints';\nimport type { SchemockConfig, AnalyzedSchema, AnalyzedEndpoint, GenerateOptions } from '../types';\n\n// Generators\nimport { generateTypes } from '../generators/types';\nimport { generateMockDb } from '../generators/mock/db';\nimport { generateMockHandlers, generateAllHandlersExport } from '../generators/mock/handlers';\nimport { generateMockClient } from '../generators/mock/client';\nimport { generateSeed } from '../generators/mock/seed';\nimport { generateRoutes } from '../generators/mock/routes';\nimport {\n generateEndpointTypes,\n generateEndpointClient,\n generateEndpointHandlers,\n generateEndpointResolvers,\n} from '../generators/mock/endpoints';\nimport { generateSupabaseClient } from '../generators/supabase/client';\nimport { generateFirebaseClient } from '../generators/firebase/client';\nimport { generateFetchClient } from '../generators/fetch/client';\nimport { generatePGliteDb, generatePGliteClient, generatePGliteSeed } from '../generators/pglite';\nimport { generateHooks } from '../generators/hooks';\n\n/**\n * Main generate command\n *\n * @param options - Generation options\n */\nexport async function generate(options: GenerateOptions): Promise<void> {\n console.log('\\nš Schemock Generate\\n');\n\n // 1. Load config\n const config = await loadConfig(options.config);\n const adapter = (options.adapter || config.adapter || 'mock') as SchemockConfig['adapter'];\n const outputDir = options.output || config.output || './src/generated';\n\n console.log(` Adapter: ${adapter}`);\n console.log(` Output: ${outputDir}\\n`);\n\n // 2. Discover schemas and endpoints\n console.log('š¦ Discovering schemas...');\n const { schemas, endpoints, files } = await discoverSchemas(config.schemas);\n\n for (const file of files) {\n console.log(` Found: ${getRelativePath(file)}`);\n }\n console.log(` Total: ${schemas.length} schemas, ${endpoints.length} endpoints\\n`);\n\n // 3. Analyze schemas\n const analyzed = analyzeSchemas(schemas, { ...config, adapter });\n\n // 4. Analyze endpoints\n const analyzedEndpoints = analyzeEndpoints(endpoints);\n\n if (options.verbose) {\n console.log('š Analyzed schemas:');\n for (const schema of analyzed) {\n console.log(` ${schema.pascalName}: ${schema.fields.length} fields, ${schema.relations.length} relations`);\n if (schema.isJunctionTable) {\n console.log(` (junction table)`);\n }\n }\n if (analyzedEndpoints.length > 0) {\n console.log('\\nš Analyzed endpoints:');\n for (const endpoint of analyzedEndpoints) {\n console.log(` ${endpoint.method} ${endpoint.path} -> ${endpoint.name}`);\n }\n }\n console.log();\n }\n\n // 4. Create output directory\n if (!options.dryRun) {\n await mkdir(outputDir, { recursive: true });\n }\n\n // 5. Generate types (always)\n console.log('š Generating types...');\n let typesCode = generateTypes(analyzed);\n\n // Append endpoint types if there are any\n if (analyzedEndpoints.length > 0) {\n typesCode += generateEndpointTypes(analyzedEndpoints);\n }\n\n await writeOutput(join(outputDir, 'types.ts'), typesCode, options.dryRun);\n const entityCount = analyzed.filter((s) => !s.isJunctionTable).length;\n const endpointInfo = analyzedEndpoints.length > 0 ? ` + ${analyzedEndpoints.length} endpoint types` : '';\n console.log(` ā types.ts (${entityCount} entities + Create/Update/Filter types${endpointInfo})\\n`);\n\n // 6. Generate adapter-specific code\n console.log(`š Generating ${adapter} adapter...`);\n\n switch (adapter) {\n case 'mock':\n await generateMockAdapter(analyzed, analyzedEndpoints, outputDir, config, options);\n break;\n case 'supabase':\n await generateSupabaseAdapter(analyzed, outputDir, config, options);\n break;\n case 'firebase':\n await generateFirebaseAdapter(analyzed, outputDir, config, options);\n break;\n case 'fetch':\n await generateFetchAdapter(analyzed, outputDir, config, options);\n break;\n case 'graphql':\n console.log(' ā ļø GraphQL adapter not yet implemented');\n break;\n case 'pglite':\n await generatePGliteAdapter(analyzed, outputDir, config, options);\n break;\n default:\n throw new Error(`Unknown adapter: ${adapter}`);\n }\n\n // 7. Generate hooks (always)\n console.log('\\nāļø Generating React hooks...');\n const hooksCode = generateHooks(analyzed);\n await writeOutput(join(outputDir, 'hooks.ts'), hooksCode, options.dryRun);\n const hookCount = analyzed.filter((s) => !s.isJunctionTable).length * 5; // 5 hooks per entity\n console.log(` ā hooks.ts (${hookCount} hooks)`);\n\n // 8. Generate index.ts\n console.log('\\nš¦ Generating barrel exports...');\n const indexCode = generateIndex(adapter, analyzedEndpoints.length > 0);\n await writeOutput(join(outputDir, 'index.ts'), indexCode, options.dryRun);\n console.log(' ā index.ts');\n\n // Done\n console.log(`\\nā
Generated ${adapter} adapter in ${outputDir}\\n`);\n\n const firstSchema = analyzed.find((s) => !s.isJunctionTable);\n if (firstSchema) {\n console.log('Usage:');\n console.log(` import { use${firstSchema.pascalPluralName}, useCreate${firstSchema.pascalName} } from '${outputDir.replace('./', '')}';`);\n console.log('');\n }\n}\n\n/**\n * Generate mock adapter files\n */\nasync function generateMockAdapter(\n schemas: AnalyzedSchema[],\n endpoints: AnalyzedEndpoint[],\n outputDir: string,\n config: SchemockConfig,\n options: GenerateOptions\n): Promise<void> {\n const mockConfig = config.adapters?.mock || {};\n const hasEndpoints = endpoints.length > 0;\n\n const dbCode = generateMockDb(schemas, mockConfig);\n await writeOutput(join(outputDir, 'db.ts'), dbCode, options.dryRun);\n console.log(` ā db.ts (@mswjs/data factory with ${schemas.length} entities)`);\n\n const routesCode = generateRoutes(schemas);\n await writeOutput(join(outputDir, 'routes.ts'), routesCode, options.dryRun);\n const entityCount = schemas.filter((s) => !s.isJunctionTable).length;\n console.log(` ā routes.ts (${entityCount} entity route definitions)`);\n\n const handlersCode = generateMockHandlers(schemas, config.apiPrefix || '/api');\n await writeOutput(join(outputDir, 'handlers.ts'), handlersCode, options.dryRun);\n const handlerCount = schemas.filter((s) => !s.isJunctionTable).length * 6; // 6 handlers per entity\n console.log(` ā handlers.ts (${handlerCount} MSW handlers)`);\n\n const seedCode = generateSeed(schemas, mockConfig);\n await writeOutput(join(outputDir, 'seed.ts'), seedCode, options.dryRun);\n console.log(' ā seed.ts (seed/reset utilities)');\n\n const clientCode = generateMockClient(schemas);\n await writeOutput(join(outputDir, 'client.ts'), clientCode, options.dryRun);\n console.log(' ā client.ts (API client with relations support)');\n\n // Generate endpoint files if there are any\n if (hasEndpoints) {\n console.log('\\nšÆ Generating custom endpoints...');\n\n const endpointClientCode = generateEndpointClient(endpoints);\n await writeOutput(join(outputDir, 'endpoints.ts'), endpointClientCode, options.dryRun);\n console.log(` ā endpoints.ts (${endpoints.length} endpoint client methods)`);\n\n const endpointHandlersCode = generateEndpointHandlers(endpoints);\n await writeOutput(join(outputDir, 'endpoint-handlers.ts'), endpointHandlersCode, options.dryRun);\n console.log(` ā endpoint-handlers.ts (${endpoints.length} MSW handlers)`);\n\n const endpointResolversCode = generateEndpointResolvers(endpoints);\n await writeOutput(join(outputDir, 'endpoint-resolvers.ts'), endpointResolversCode, options.dryRun);\n console.log(` ā endpoint-resolvers.ts (mock resolvers)`);\n }\n\n // Generate combined handlers export\n const allHandlersCode = generateAllHandlersExport(hasEndpoints);\n await writeOutput(join(outputDir, 'all-handlers.ts'), allHandlersCode, options.dryRun);\n console.log(' ā all-handlers.ts (combined handlers export)');\n}\n\n/**\n * Generate Supabase adapter files\n */\nasync function generateSupabaseAdapter(\n schemas: AnalyzedSchema[],\n outputDir: string,\n config: SchemockConfig,\n options: GenerateOptions\n): Promise<void> {\n const supabaseConfig = config.adapters?.supabase || {};\n const clientCode = generateSupabaseClient(schemas, supabaseConfig);\n await writeOutput(join(outputDir, 'client.ts'), clientCode, options.dryRun);\n console.log(' ā client.ts (Supabase client)');\n}\n\n/**\n * Generate Firebase adapter files\n */\nasync function generateFirebaseAdapter(\n schemas: AnalyzedSchema[],\n outputDir: string,\n config: SchemockConfig,\n options: GenerateOptions\n): Promise<void> {\n const firebaseConfig = config.adapters?.firebase || {};\n const clientCode = generateFirebaseClient(schemas, firebaseConfig);\n await writeOutput(join(outputDir, 'client.ts'), clientCode, options.dryRun);\n console.log(' ā client.ts (Firebase client)');\n}\n\n/**\n * Generate Fetch adapter files\n */\nasync function generateFetchAdapter(\n schemas: AnalyzedSchema[],\n outputDir: string,\n config: SchemockConfig,\n options: GenerateOptions\n): Promise<void> {\n const fetchConfig = config.adapters?.fetch || {};\n const clientCode = generateFetchClient(schemas, fetchConfig);\n await writeOutput(join(outputDir, 'client.ts'), clientCode, options.dryRun);\n console.log(' ā client.ts (Fetch client)');\n}\n\n/**\n * Generate PGlite adapter files\n */\nasync function generatePGliteAdapter(\n schemas: AnalyzedSchema[],\n outputDir: string,\n config: SchemockConfig,\n options: GenerateOptions\n): Promise<void> {\n const pgliteConfig = config.adapters?.pglite || {};\n\n const dbCode = generatePGliteDb(schemas, pgliteConfig);\n await writeOutput(join(outputDir, 'db.ts'), dbCode, options.dryRun);\n console.log(` ā db.ts (PGlite schema with ${schemas.length} tables)`);\n\n const clientCode = generatePGliteClient(schemas);\n await writeOutput(join(outputDir, 'client.ts'), clientCode, options.dryRun);\n console.log(' ā client.ts (SQL-based CRUD operations)');\n\n const seedCode = generatePGliteSeed(schemas, pgliteConfig);\n await writeOutput(join(outputDir, 'seed.ts'), seedCode, options.dryRun);\n console.log(' ā seed.ts (seed/reset utilities)');\n}\n\n/**\n * Generate barrel export index file\n */\nfunction generateIndex(adapter: string, hasEndpoints: boolean = false): string {\n const lines = [\n '// GENERATED BY SCHEMOCK - DO NOT EDIT',\n '',\n \"export * from './types';\",\n \"export * from './hooks';\",\n \"export { api } from './client';\",\n ];\n\n if (adapter === 'mock') {\n lines.push(\"export { db } from './db';\");\n lines.push(\"export { handlers } from './handlers';\");\n lines.push(\"export { allHandlers } from './all-handlers';\");\n lines.push(\"export { seed, reset, getAll } from './seed';\");\n\n if (hasEndpoints) {\n lines.push(\"export { endpoints } from './endpoints';\");\n lines.push(\"export { endpointHandlers } from './endpoint-handlers';\");\n }\n }\n\n if (adapter === 'pglite') {\n lines.push(\"export { db, initDb, resetDb, tables } from './db';\");\n lines.push(\"export { seed, reset, getAll, count } from './seed';\");\n }\n\n if (adapter === 'supabase') {\n lines.push(\"export { supabase } from './client';\");\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Write output file (or show dry-run message)\n */\nasync function writeOutput(path: string, content: string, dryRun?: boolean): Promise<void> {\n if (dryRun) {\n console.log(` [DRY RUN] Would write: ${path}`);\n return;\n }\n await writeFile(path, content, 'utf-8');\n}\n"]}
|