@demokit-ai/core 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +6463 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2392 -3
- package/dist/index.d.ts +2392 -3
- package/dist/index.js +6387 -4
- package/dist/index.js.map +1 -1
- package/package.json +36 -18
- package/README.md +0 -190
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/matcher.ts","../src/storage.ts","../src/session.ts","../src/interceptor.ts","../src/state.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MatchResult, ParsedPattern } from './types'\n\n/**\n * Cache for parsed patterns to avoid re-parsing\n */\nconst patternCache = new Map<string, ParsedPattern>()\n\n/**\n * Parse a URL pattern into its components\n *\n * @param pattern - Pattern in format \"METHOD /path/:param\"\n * @returns Parsed pattern with method, regex, and param names\n *\n * @example\n * parseUrlPattern('GET /api/users/:id')\n * // { method: 'GET', pathPattern: /^\\/api\\/users\\/([^/]+)$/, paramNames: ['id'] }\n *\n * parseUrlPattern('GET /api/projects/*')\n * // { method: 'GET', pathPattern: /^\\/api\\/projects\\/.*$/, paramNames: [] }\n */\nexport function parseUrlPattern(pattern: string): ParsedPattern {\n const cached = patternCache.get(pattern)\n if (cached) {\n return cached\n }\n\n const spaceIndex = pattern.indexOf(' ')\n if (spaceIndex === -1) {\n throw new Error(\n `Invalid pattern \"${pattern}\": must be in format \"METHOD /path\". Example: \"GET /api/users/:id\"`\n )\n }\n\n const method = pattern.slice(0, spaceIndex).toUpperCase()\n const path = pattern.slice(spaceIndex + 1)\n\n if (!path.startsWith('/')) {\n throw new Error(\n `Invalid pattern \"${pattern}\": path must start with \"/\". Example: \"GET /api/users\"`\n )\n }\n\n const paramNames: string[] = []\n\n // Escape regex special characters except : and *\n // Then convert :param to capture groups and * to wildcards\n let regexStr = path\n // Escape regex special chars (except : and *)\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n // Convert :paramName to named capture group pattern\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name: string) => {\n paramNames.push(name)\n return '([^/]+)'\n })\n // Convert * to wildcard (match anything)\n .replace(/\\*/g, '.*')\n\n const parsed: ParsedPattern = {\n method,\n pathPattern: new RegExp(`^${regexStr}$`),\n paramNames,\n }\n\n patternCache.set(pattern, parsed)\n return parsed\n}\n\n/**\n * Match a request against a fixture pattern\n *\n * @param pattern - Fixture pattern (e.g., \"GET /api/users/:id\")\n * @param method - HTTP method of the request\n * @param pathname - URL pathname of the request\n * @returns Match result with extracted params, or null if no match\n *\n * @example\n * matchUrl('GET /api/users/:id', 'GET', '/api/users/123')\n * // { matched: true, params: { id: '123' } }\n *\n * matchUrl('GET /api/users/:id', 'POST', '/api/users/123')\n * // null (method doesn't match)\n *\n * matchUrl('GET /api/users/:id', 'GET', '/api/projects/123')\n * // null (path doesn't match)\n */\nexport function matchUrl(\n pattern: string,\n method: string,\n pathname: string\n): MatchResult | null {\n const { method: patternMethod, pathPattern, paramNames } = parseUrlPattern(pattern)\n\n // Check method first (fast path)\n if (patternMethod !== method.toUpperCase()) {\n return null\n }\n\n // Match path against pattern\n const match = pathname.match(pathPattern)\n if (!match) {\n return null\n }\n\n // Extract params from capture groups\n const params: Record<string, string> = {}\n paramNames.forEach((name, index) => {\n const value = match[index + 1]\n if (value !== undefined) {\n params[name] = decodeURIComponent(value)\n }\n })\n\n return { matched: true, params }\n}\n\n/**\n * Find the first matching pattern from a fixture map\n *\n * @param fixtures - Map of patterns to fixtures\n * @param method - HTTP method of the request\n * @param pathname - URL pathname of the request\n * @returns Tuple of [pattern, match result] or null if no match\n */\nexport function findMatchingPattern(\n fixtures: Record<string, unknown>,\n method: string,\n pathname: string\n): [string, MatchResult] | null {\n for (const pattern of Object.keys(fixtures)) {\n const result = matchUrl(pattern, method, pathname)\n if (result) {\n return [pattern, result]\n }\n }\n return null\n}\n\n/**\n * Clear the pattern cache (useful for testing)\n */\nexport function clearPatternCache(): void {\n patternCache.clear()\n}\n\n// ============================================================================\n// Query Key Matching (for TanStack Query, SWR, etc.)\n// ============================================================================\n\n/**\n * A query key element can be a string, number, or object\n */\nexport type QueryKeyElement = string | number | boolean | null | undefined | Record<string, unknown>\n\n/**\n * A query key is an array of elements (like TanStack Query uses)\n */\nexport type QueryKey = readonly QueryKeyElement[]\n\n/**\n * Result of query key matching\n */\nexport interface QueryKeyMatchResult {\n /**\n * Whether the pattern matched the query key\n */\n matched: boolean\n\n /**\n * Extracted parameters from :param placeholders\n */\n params: Record<string, unknown>\n}\n\n/**\n * Check if two values are deeply equal\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (a === null || b === null) return a === b\n if (typeof a !== typeof b) return false\n\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>\n const bObj = b as Record<string, unknown>\n const aKeys = Object.keys(aObj)\n const bKeys = Object.keys(bObj)\n\n if (aKeys.length !== bKeys.length) return false\n\n return aKeys.every((key) => deepEqual(aObj[key], bObj[key]))\n }\n\n return false\n}\n\n/**\n * Check if a string is a parameter placeholder (e.g., ':id', ':userId')\n */\nfunction isParamPlaceholder(value: unknown): value is string {\n return typeof value === 'string' && value.startsWith(':') && value.length > 1\n}\n\n/**\n * Extract the parameter name from a placeholder (e.g., ':id' -> 'id')\n */\nfunction getParamName(placeholder: string): string {\n return placeholder.slice(1)\n}\n\n/**\n * Match an object value against an object pattern with parameter extraction\n *\n * @param value - The actual object value from the query key\n * @param pattern - The pattern object (may contain :param placeholders)\n * @returns Match result with extracted params, or null if no match\n */\nfunction matchObjectWithParams(\n value: Record<string, unknown>,\n pattern: Record<string, unknown>\n): { matched: boolean; params: Record<string, unknown> } | null {\n const params: Record<string, unknown> = {}\n const patternKeys = Object.keys(pattern)\n const valueKeys = Object.keys(value)\n\n // Pattern must have same or fewer keys (pattern keys must all be present in value)\n if (patternKeys.length > valueKeys.length) {\n return null\n }\n\n for (const key of patternKeys) {\n if (!(key in value)) {\n return null\n }\n\n const patternVal = pattern[key]\n const actualVal = value[key]\n\n if (isParamPlaceholder(patternVal)) {\n // Extract parameter value\n params[getParamName(patternVal)] = actualVal\n } else if (typeof patternVal === 'object' && patternVal !== null && typeof actualVal === 'object' && actualVal !== null) {\n // Recursively match nested objects\n const nestedResult = matchObjectWithParams(\n actualVal as Record<string, unknown>,\n patternVal as Record<string, unknown>\n )\n if (!nestedResult) {\n return null\n }\n Object.assign(params, nestedResult.params)\n } else if (!deepEqual(patternVal, actualVal)) {\n return null\n }\n }\n\n return { matched: true, params }\n}\n\n/**\n * Match a query key against a pattern\n *\n * Supports:\n * - Exact string/number matching: ['users'] matches ['users']\n * - Parameter extraction with :param syntax: ['users', ':id'] matches ['users', '123']\n * - Object matching with params: ['users', { id: ':id' }] matches ['users', { id: '123' }]\n * - Wildcard matching with '*': ['users', '*'] matches ['users', 'anything']\n *\n * @param queryKey - The actual query key to match\n * @param pattern - The pattern to match against\n * @returns Match result with extracted params, or null if no match\n *\n * @example\n * // Exact match\n * matchQueryKey(['users'], ['users'])\n * // { matched: true, params: {} }\n *\n * // Parameter extraction from string\n * matchQueryKey(['users', '123'], ['users', ':id'])\n * // { matched: true, params: { id: '123' } }\n *\n * // Parameter extraction from object\n * matchQueryKey(['users', { id: '123', status: 'active' }], ['users', { id: ':userId' }])\n * // { matched: true, params: { userId: '123' } }\n *\n * // Wildcard matching\n * matchQueryKey(['users', 'anything'], ['users', '*'])\n * // { matched: true, params: {} }\n *\n * // No match - different length\n * matchQueryKey(['users'], ['users', 'list'])\n * // null\n */\nexport function matchQueryKey(\n queryKey: QueryKey,\n pattern: QueryKey\n): QueryKeyMatchResult | null {\n // Arrays must be same length\n if (queryKey.length !== pattern.length) {\n return null\n }\n\n const params: Record<string, unknown> = {}\n\n for (let i = 0; i < pattern.length; i++) {\n const patternElement = pattern[i]\n const keyElement = queryKey[i]\n\n // Wildcard matches anything\n if (patternElement === '*') {\n continue\n }\n\n // Parameter placeholder extracts value\n if (isParamPlaceholder(patternElement)) {\n params[getParamName(patternElement)] = keyElement\n continue\n }\n\n // Object matching with potential nested params\n if (\n typeof patternElement === 'object' &&\n patternElement !== null &&\n typeof keyElement === 'object' &&\n keyElement !== null\n ) {\n const objectResult = matchObjectWithParams(\n keyElement as Record<string, unknown>,\n patternElement as Record<string, unknown>\n )\n if (!objectResult) {\n return null\n }\n Object.assign(params, objectResult.params)\n continue\n }\n\n // Exact match for primitives\n if (patternElement !== keyElement) {\n return null\n }\n }\n\n return { matched: true, params }\n}\n\n/**\n * Find the first matching pattern from a map of query key patterns\n *\n * @param patterns - Map of serialized patterns to values\n * @param queryKey - The query key to match\n * @returns Tuple of [pattern, value, match result] or null if no match\n *\n * @example\n * const patterns = {\n * 'users': { data: [] },\n * 'users/:id': (params) => ({ id: params.id }),\n * }\n * findMatchingQueryKeyPattern(patterns, ['users', '123'])\n * // [['users', ':id'], { params: { id: '123' } }]\n */\nexport function findMatchingQueryKeyPattern<T>(\n patterns: Map<QueryKey, T>,\n queryKey: QueryKey\n): [QueryKey, T, QueryKeyMatchResult] | null {\n for (const [pattern, value] of patterns) {\n const result = matchQueryKey(queryKey, pattern)\n if (result) {\n return [pattern, value, result]\n }\n }\n return null\n}\n","/**\n * Default localStorage key for demo mode state\n */\nexport const DEFAULT_STORAGE_KEY = 'demokit-mode'\n\n/**\n * Check if localStorage is available (handles SSR and restricted contexts)\n */\nfunction isLocalStorageAvailable(): boolean {\n try {\n const testKey = '__demokit_test__'\n if (typeof window === 'undefined' || !window.localStorage) {\n return false\n }\n window.localStorage.setItem(testKey, testKey)\n window.localStorage.removeItem(testKey)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Load demo mode state from localStorage\n *\n * @param key - localStorage key to use\n * @returns Current demo mode state, or false if not set or unavailable\n */\nexport function loadDemoState(key: string = DEFAULT_STORAGE_KEY): boolean {\n if (!isLocalStorageAvailable()) {\n return false\n }\n\n try {\n const value = window.localStorage.getItem(key)\n return value === 'true'\n } catch {\n return false\n }\n}\n\n/**\n * Save demo mode state to localStorage\n *\n * @param key - localStorage key to use\n * @param enabled - Whether demo mode is enabled\n */\nexport function saveDemoState(\n key: string = DEFAULT_STORAGE_KEY,\n enabled: boolean\n): void {\n if (!isLocalStorageAvailable()) {\n return\n }\n\n try {\n if (enabled) {\n window.localStorage.setItem(key, 'true')\n } else {\n window.localStorage.removeItem(key)\n }\n } catch {\n // Silently fail if storage is full or restricted\n }\n}\n\n/**\n * Clear demo mode state from localStorage\n *\n * @param key - localStorage key to use\n */\nexport function clearDemoState(key: string = DEFAULT_STORAGE_KEY): void {\n if (!isLocalStorageAvailable()) {\n return\n }\n\n try {\n window.localStorage.removeItem(key)\n } catch {\n // Silently fail\n }\n}\n","/**\n * Session state management for DemoKit\n *\n * Provides in-memory storage for mutable state during a demo session.\n * State persists across requests but resets on page refresh.\n */\n\n/**\n * Session state interface for storing and retrieving demo session data\n *\n * @example\n * ```typescript\n * // In a fixture handler\n * 'POST /api/users': ({ body, session }) => {\n * const users = session.get<User[]>('users') || []\n * const newUser = { id: crypto.randomUUID(), ...body }\n * session.set('users', [...users, newUser])\n * return newUser\n * }\n *\n * 'GET /api/users': ({ session }) => {\n * return session.get<User[]>('users') || []\n * }\n * ```\n */\nexport interface SessionState {\n /**\n * Get a value from the session state\n * @param key - The key to retrieve\n * @returns The value if it exists, undefined otherwise\n */\n get<T>(key: string): T | undefined\n\n /**\n * Set a value in the session state\n * @param key - The key to set\n * @param value - The value to store\n */\n set<T>(key: string, value: T): void\n\n /**\n * Delete a value from the session state\n * @param key - The key to delete\n */\n delete(key: string): void\n\n /**\n * Clear all session state\n */\n clear(): void\n\n /**\n * Get all keys in the session state\n * @returns Array of all keys\n */\n keys(): string[]\n\n /**\n * Check if a key exists in the session state\n * @param key - The key to check\n * @returns True if the key exists\n */\n has(key: string): boolean\n\n /**\n * Get the number of items in the session state\n * @returns The number of items\n */\n size(): number\n}\n\n/**\n * Create a new session state instance\n *\n * Session state is purely in-memory and resets when the page is refreshed.\n * This is intentional - demo sessions should start fresh each time.\n *\n * @returns A new SessionState instance\n *\n * @example\n * ```typescript\n * const session = createSessionState()\n *\n * session.set('cart', [{ id: '1', quantity: 2 }])\n * const cart = session.get<CartItem[]>('cart')\n *\n * session.clear() // Reset all state\n * ```\n */\nexport function createSessionState(): SessionState {\n const store = new Map<string, unknown>()\n\n return {\n get<T>(key: string): T | undefined {\n return store.get(key) as T | undefined\n },\n\n set<T>(key: string, value: T): void {\n store.set(key, value)\n },\n\n delete(key: string): void {\n store.delete(key)\n },\n\n clear(): void {\n store.clear()\n },\n\n keys(): string[] {\n return Array.from(store.keys())\n },\n\n has(key: string): boolean {\n return store.has(key)\n },\n\n size(): number {\n return store.size\n },\n }\n}\n","import type {\n DemoKitConfig,\n DemoInterceptor,\n FixtureMap,\n FixtureHandler,\n RequestContext,\n} from './types'\nimport { findMatchingPattern } from './matcher'\nimport { loadDemoState, saveDemoState, DEFAULT_STORAGE_KEY } from './storage'\nimport { createSessionState, type SessionState } from './session'\n\n/**\n * Parse request body based on content type\n */\nasync function parseRequestBody(\n body: BodyInit | null | undefined,\n headers: Headers\n): Promise<unknown> {\n if (!body) {\n return undefined\n }\n\n const contentType = headers.get('content-type') || ''\n\n try {\n if (typeof body === 'string') {\n if (contentType.includes('application/json')) {\n return JSON.parse(body)\n }\n return body\n }\n\n if (body instanceof FormData) {\n const obj: Record<string, unknown> = {}\n body.forEach((value, key) => {\n obj[key] = value\n })\n return obj\n }\n\n if (body instanceof URLSearchParams) {\n const obj: Record<string, string> = {}\n body.forEach((value, key) => {\n obj[key] = value\n })\n return obj\n }\n\n if (body instanceof Blob) {\n const text = await body.text()\n if (contentType.includes('application/json')) {\n return JSON.parse(text)\n }\n return text\n }\n\n if (body instanceof ArrayBuffer) {\n const text = new TextDecoder().decode(body)\n if (contentType.includes('application/json')) {\n return JSON.parse(text)\n }\n return text\n }\n } catch {\n // Return raw body if parsing fails\n }\n\n return body\n}\n\n/**\n * Create a mock Response from fixture data\n */\nfunction createMockResponse(data: unknown, status = 200): Response {\n const body = JSON.stringify(data)\n return new Response(body, {\n status,\n statusText: status === 200 ? 'OK' : 'Error',\n headers: {\n 'Content-Type': 'application/json',\n 'X-DemoKit-Mock': 'true',\n },\n })\n}\n\n/**\n * Extract pathname from URL, handling various input types\n */\nfunction extractPathname(input: RequestInfo | URL, baseUrl: string): string {\n try {\n if (typeof input === 'string') {\n // Handle relative URLs\n if (input.startsWith('/')) {\n return input.split('?')[0] || '/'\n }\n return new URL(input, baseUrl).pathname\n }\n if (input instanceof URL) {\n return input.pathname\n }\n if (input instanceof Request) {\n return new URL(input.url, baseUrl).pathname\n }\n } catch {\n // Fallback for malformed URLs\n }\n return '/'\n}\n\n/**\n * Extract full URL from input\n */\nfunction extractUrl(input: RequestInfo | URL, baseUrl: string): string {\n try {\n if (typeof input === 'string') {\n if (input.startsWith('/')) {\n return new URL(input, baseUrl).toString()\n }\n return input\n }\n if (input instanceof URL) {\n return input.toString()\n }\n if (input instanceof Request) {\n return input.url\n }\n } catch {\n // Fallback\n }\n return baseUrl\n}\n\n/**\n * Create a demo interceptor that patches fetch to return mock data\n *\n * @param config - Configuration including fixtures and options\n * @returns Demo interceptor instance with enable/disable controls\n *\n * @example\n * const demo = createDemoInterceptor({\n * fixtures: {\n * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],\n * 'GET /api/users/:id': ({ params }) => ({ id: params.id, name: 'Demo User' }),\n * 'POST /api/users': ({ body }) => ({ id: 'new', ...body }),\n * }\n * })\n *\n * demo.enable() // All matching fetches return mock data\n * demo.disable() // Back to real API\n */\nexport function createDemoInterceptor(config: DemoKitConfig): DemoInterceptor {\n const {\n fixtures: initialFixtures,\n storageKey = DEFAULT_STORAGE_KEY,\n onEnable,\n onDisable,\n initialEnabled,\n baseUrl = 'http://localhost',\n } = config\n\n // Track state\n let enabled = initialEnabled ?? loadDemoState(storageKey)\n let currentFixtures: FixtureMap = { ...initialFixtures }\n\n // Create session state (in-memory, resets on page refresh)\n let sessionState: SessionState = createSessionState()\n\n // Store original fetch\n let originalFetch: typeof fetch | null = null\n let isPatched = false\n\n /**\n * Patch global fetch to intercept requests\n */\n function patchFetch(): void {\n if (isPatched || typeof globalThis.fetch !== 'function') {\n return\n }\n\n originalFetch = globalThis.fetch\n\n globalThis.fetch = async function interceptedFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n // If demo mode is disabled, pass through\n if (!enabled) {\n return originalFetch!(input, init)\n }\n\n const method = init?.method?.toUpperCase() || 'GET'\n const pathname = extractPathname(input, baseUrl)\n\n // Try to find a matching fixture\n const match = findMatchingPattern(currentFixtures, method, pathname)\n\n if (!match) {\n // No matching fixture - pass through to real API\n return originalFetch!(input, init)\n }\n\n const [pattern, matchResult] = match\n const handler = currentFixtures[pattern] as FixtureHandler\n\n // Build request context for the handler\n const url = extractUrl(input, baseUrl)\n const headers = new Headers(init?.headers)\n const body = await parseRequestBody(init?.body, headers)\n\n let searchParams: URLSearchParams\n try {\n searchParams = new URL(url, baseUrl).searchParams\n } catch {\n searchParams = new URLSearchParams()\n }\n\n const context: RequestContext = {\n url,\n method,\n params: matchResult.params,\n searchParams,\n body,\n headers,\n session: sessionState,\n }\n\n // Execute handler and get result\n let result: unknown\n try {\n if (typeof handler === 'function') {\n result = await handler(context)\n } else {\n result = handler\n }\n } catch (error) {\n // Return error response if handler throws\n console.error('[DemoKit] Fixture handler error:', error)\n return createMockResponse(\n { error: 'Fixture handler error', message: String(error) },\n 500\n )\n }\n\n return createMockResponse(result)\n }\n\n isPatched = true\n }\n\n /**\n * Restore original fetch\n */\n function restoreFetch(): void {\n if (!isPatched || !originalFetch) {\n return\n }\n\n globalThis.fetch = originalFetch\n originalFetch = null\n isPatched = false\n }\n\n // Patch fetch immediately\n patchFetch()\n\n return {\n enable(): void {\n if (enabled) return\n\n enabled = true\n saveDemoState(storageKey, true)\n onEnable?.()\n },\n\n disable(): void {\n if (!enabled) return\n\n enabled = false\n saveDemoState(storageKey, false)\n onDisable?.()\n },\n\n isEnabled(): boolean {\n return enabled\n },\n\n toggle(): boolean {\n if (enabled) {\n this.disable()\n } else {\n this.enable()\n }\n return enabled\n },\n\n setFixtures(fixtures: FixtureMap): void {\n currentFixtures = { ...fixtures }\n },\n\n addFixture(pattern: string, handler: FixtureHandler): void {\n currentFixtures[pattern] = handler\n },\n\n removeFixture(pattern: string): void {\n delete currentFixtures[pattern]\n },\n\n resetSession(): void {\n sessionState.clear()\n },\n\n getSession(): SessionState {\n return sessionState\n },\n\n destroy(): void {\n restoreFetch()\n enabled = false\n sessionState.clear()\n },\n }\n}\n","import type { FixtureMap } from './types'\n\n/**\n * Shared demo state interface that can be used across frameworks\n * This provides a consistent API for managing demo mode state\n */\nexport interface DemoState {\n /**\n * Whether demo mode is currently enabled\n */\n enabled: boolean\n\n /**\n * The currently active scenario name, if any\n * Scenarios allow grouping fixtures for different demo flows\n */\n scenario: string | null\n\n /**\n * The active fixture map for the current scenario\n */\n fixtures: FixtureMap\n\n /**\n * Timestamp when demo mode was last enabled\n * Useful for session timeout logic\n */\n enabledAt: number | null\n}\n\n/**\n * Create initial demo state\n *\n * @param initialEnabled - Whether demo mode should start enabled\n * @param fixtures - Initial fixture map\n * @returns A new DemoState object\n *\n * @example\n * const state = createDemoState(false, {\n * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],\n * })\n */\nexport function createDemoState(\n initialEnabled: boolean = false,\n fixtures: FixtureMap = {}\n): DemoState {\n return {\n enabled: initialEnabled,\n scenario: null,\n fixtures,\n enabledAt: initialEnabled ? Date.now() : null,\n }\n}\n\n/**\n * Options for creating a demo state store\n */\nexport interface DemoStateStoreOptions {\n /**\n * Initial enabled state\n * @default false\n */\n initialEnabled?: boolean\n\n /**\n * Initial fixtures\n * @default {}\n */\n fixtures?: FixtureMap\n\n /**\n * Available scenarios with their fixtures\n */\n scenarios?: Record<string, FixtureMap>\n\n /**\n * Callback when state changes\n */\n onChange?: (state: DemoState) => void\n}\n\n/**\n * A minimal state store for demo mode\n * Framework adapters can use this or integrate with their own state management\n */\nexport interface DemoStateStore {\n /**\n * Get the current state\n */\n getState(): DemoState\n\n /**\n * Enable demo mode\n */\n enable(): void\n\n /**\n * Disable demo mode\n */\n disable(): void\n\n /**\n * Toggle demo mode\n */\n toggle(): boolean\n\n /**\n * Set the active scenario\n * @param name - Scenario name (or null to clear)\n */\n setScenario(name: string | null): void\n\n /**\n * Update fixtures (merges with existing)\n */\n updateFixtures(fixtures: FixtureMap): void\n\n /**\n * Replace all fixtures\n */\n setFixtures(fixtures: FixtureMap): void\n\n /**\n * Subscribe to state changes\n * @returns Unsubscribe function\n */\n subscribe(listener: (state: DemoState) => void): () => void\n}\n\n/**\n * Create a demo state store\n *\n * This is a minimal, framework-agnostic state store that can be used\n * directly or wrapped by framework-specific adapters (React, Vue, etc.)\n *\n * @param options - Store configuration options\n * @returns A DemoStateStore instance\n *\n * @example\n * const store = createDemoStateStore({\n * initialEnabled: false,\n * fixtures: {\n * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],\n * },\n * scenarios: {\n * 'empty-state': { 'GET /api/users': () => [] },\n * 'error-state': { 'GET /api/users': () => { throw new Error('API Error') } },\n * },\n * })\n *\n * // Subscribe to changes\n * const unsubscribe = store.subscribe((state) => {\n * console.log('Demo mode:', state.enabled)\n * })\n *\n * // Enable demo mode\n * store.enable()\n *\n * // Switch scenario\n * store.setScenario('empty-state')\n */\nexport function createDemoStateStore(options: DemoStateStoreOptions = {}): DemoStateStore {\n const {\n initialEnabled = false,\n fixtures = {},\n scenarios = {},\n onChange,\n } = options\n\n let state = createDemoState(initialEnabled, fixtures)\n const listeners = new Set<(state: DemoState) => void>()\n\n function notify() {\n listeners.forEach((listener) => listener(state))\n onChange?.(state)\n }\n\n function setState(updates: Partial<DemoState>) {\n state = { ...state, ...updates }\n notify()\n }\n\n return {\n getState() {\n return state\n },\n\n enable() {\n if (!state.enabled) {\n setState({ enabled: true, enabledAt: Date.now() })\n }\n },\n\n disable() {\n if (state.enabled) {\n setState({ enabled: false, enabledAt: null })\n }\n },\n\n toggle() {\n const newEnabled = !state.enabled\n setState({\n enabled: newEnabled,\n enabledAt: newEnabled ? Date.now() : null,\n })\n return newEnabled\n },\n\n setScenario(name: string | null) {\n if (name === null) {\n setState({ scenario: null, fixtures })\n } else if (scenarios[name]) {\n setState({ scenario: name, fixtures: { ...fixtures, ...scenarios[name] } })\n } else {\n console.warn(`[DemoKit] Unknown scenario: ${name}`)\n }\n },\n\n updateFixtures(newFixtures: FixtureMap) {\n setState({ fixtures: { ...state.fixtures, ...newFixtures } })\n },\n\n setFixtures(newFixtures: FixtureMap) {\n setState({ fixtures: newFixtures })\n },\n\n subscribe(listener: (state: DemoState) => void) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/matcher.ts","../src/storage.ts","../src/session.ts","../src/interceptor.ts","../src/state.ts","../src/remote.ts","../src/services/schema/types.ts","../src/services/schema/relationships.ts","../src/services/schema/parser.ts","../src/services/schema/parsers/detect.ts","../src/services/schema/parsers/typescript.ts","../src/services/schema/parsers/zod.ts","../src/services/schema/parsers/drizzle.ts","../src/services/schema/parsers/prisma.ts","../src/services/schema/parsers/graphql.ts","../src/services/schema/parsers/supabase.ts","../src/services/schema/parsers/trpc.ts","../src/services/schema/parsers/nextjs.ts","../src/services/schema/parsers/index.ts","../src/services/schema/merge/schema-merger.ts","../src/services/schema/utils/errors.ts","../src/services/codegen/validation/checks.ts","../src/services/codegen/validation/validator.ts","../src/services/codegen/generation/id-generator.ts","../src/services/codegen/generation/address-data.ts","../src/services/codegen/generation/value-generators.ts","../src/services/codegen/generation/generator.ts","../src/services/codegen/generation/csv-parser.ts","../src/services/codegen/context/app-context.ts","../src/services/codegen/output/formatter.ts","../src/services/codegen/validation/rules.ts"],"names":["validate","dereference","parseRequestBody","name","extractJSDocDescription","parseDefaultValue","isArray","removeComments","toPascalCase","parseZodType","parseZodObjectBody","parseInterfaceBody","result","mergeModels","seededRandom","hashString","toConstantCase"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MatchResult, ParsedPattern } from './types'\n\n/**\n * Cache for parsed patterns to avoid re-parsing\n */\nconst patternCache = new Map<string, ParsedPattern>()\n\n/**\n * Parse a URL pattern into its components\n *\n * @param pattern - Pattern in format \"METHOD /path/:param\"\n * @returns Parsed pattern with method, regex, and param names\n *\n * @example\n * parseUrlPattern('GET /api/users/:id')\n * // { method: 'GET', pathPattern: /^\\/api\\/users\\/([^/]+)$/, paramNames: ['id'] }\n *\n * parseUrlPattern('GET /api/projects/*')\n * // { method: 'GET', pathPattern: /^\\/api\\/projects\\/.*$/, paramNames: [] }\n */\nexport function parseUrlPattern(pattern: string): ParsedPattern {\n const cached = patternCache.get(pattern)\n if (cached) {\n return cached\n }\n\n const spaceIndex = pattern.indexOf(' ')\n if (spaceIndex === -1) {\n throw new Error(\n `Invalid pattern \"${pattern}\": must be in format \"METHOD /path\". Example: \"GET /api/users/:id\"`\n )\n }\n\n const method = pattern.slice(0, spaceIndex).toUpperCase()\n const path = pattern.slice(spaceIndex + 1)\n\n if (!path.startsWith('/')) {\n throw new Error(\n `Invalid pattern \"${pattern}\": path must start with \"/\". Example: \"GET /api/users\"`\n )\n }\n\n const paramNames: string[] = []\n\n // Escape regex special characters except : and *\n // Then convert :param to capture groups and * to wildcards\n let regexStr = path\n // Escape regex special chars (except : and *)\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n // Convert :paramName to named capture group pattern\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name: string) => {\n paramNames.push(name)\n return '([^/]+)'\n })\n // Convert * to wildcard (match anything)\n .replace(/\\*/g, '.*')\n\n const parsed: ParsedPattern = {\n method,\n pathPattern: new RegExp(`^${regexStr}$`),\n paramNames,\n }\n\n patternCache.set(pattern, parsed)\n return parsed\n}\n\n/**\n * Match a request against a fixture pattern\n *\n * @param pattern - Fixture pattern (e.g., \"GET /api/users/:id\")\n * @param method - HTTP method of the request\n * @param pathname - URL pathname of the request\n * @returns Match result with extracted params, or null if no match\n *\n * @example\n * matchUrl('GET /api/users/:id', 'GET', '/api/users/123')\n * // { matched: true, params: { id: '123' } }\n *\n * matchUrl('GET /api/users/:id', 'POST', '/api/users/123')\n * // null (method doesn't match)\n *\n * matchUrl('GET /api/users/:id', 'GET', '/api/projects/123')\n * // null (path doesn't match)\n */\nexport function matchUrl(\n pattern: string,\n method: string,\n pathname: string\n): MatchResult | null {\n const { method: patternMethod, pathPattern, paramNames } = parseUrlPattern(pattern)\n\n // Check method first (fast path)\n if (patternMethod !== method.toUpperCase()) {\n return null\n }\n\n // Match path against pattern\n const match = pathname.match(pathPattern)\n if (!match) {\n return null\n }\n\n // Extract params from capture groups\n const params: Record<string, string> = {}\n paramNames.forEach((name, index) => {\n const value = match[index + 1]\n if (value !== undefined) {\n params[name] = decodeURIComponent(value)\n }\n })\n\n return { matched: true, params }\n}\n\n/**\n * Find the first matching pattern from a fixture map\n *\n * @param fixtures - Map of patterns to fixtures\n * @param method - HTTP method of the request\n * @param pathname - URL pathname of the request\n * @returns Tuple of [pattern, match result] or null if no match\n */\nexport function findMatchingPattern(\n fixtures: Record<string, unknown>,\n method: string,\n pathname: string\n): [string, MatchResult] | null {\n for (const pattern of Object.keys(fixtures)) {\n const result = matchUrl(pattern, method, pathname)\n if (result) {\n return [pattern, result]\n }\n }\n return null\n}\n\n/**\n * Clear the pattern cache (useful for testing)\n */\nexport function clearPatternCache(): void {\n patternCache.clear()\n}\n\n// ============================================================================\n// Query Key Matching (for TanStack Query, SWR, etc.)\n// ============================================================================\n\n/**\n * A query key element can be a string, number, or object\n */\nexport type QueryKeyElement = string | number | boolean | null | undefined | Record<string, unknown>\n\n/**\n * A query key is an array of elements (like TanStack Query uses)\n */\nexport type QueryKey = readonly QueryKeyElement[]\n\n/**\n * Result of query key matching\n */\nexport interface QueryKeyMatchResult {\n /**\n * Whether the pattern matched the query key\n */\n matched: boolean\n\n /**\n * Extracted parameters from :param placeholders\n */\n params: Record<string, unknown>\n}\n\n/**\n * Check if two values are deeply equal\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (a === null || b === null) return a === b\n if (typeof a !== typeof b) return false\n\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>\n const bObj = b as Record<string, unknown>\n const aKeys = Object.keys(aObj)\n const bKeys = Object.keys(bObj)\n\n if (aKeys.length !== bKeys.length) return false\n\n return aKeys.every((key) => deepEqual(aObj[key], bObj[key]))\n }\n\n return false\n}\n\n/**\n * Check if a string is a parameter placeholder (e.g., ':id', ':userId')\n */\nfunction isParamPlaceholder(value: unknown): value is string {\n return typeof value === 'string' && value.startsWith(':') && value.length > 1\n}\n\n/**\n * Extract the parameter name from a placeholder (e.g., ':id' -> 'id')\n */\nfunction getParamName(placeholder: string): string {\n return placeholder.slice(1)\n}\n\n/**\n * Match an object value against an object pattern with parameter extraction\n *\n * @param value - The actual object value from the query key\n * @param pattern - The pattern object (may contain :param placeholders)\n * @returns Match result with extracted params, or null if no match\n */\nfunction matchObjectWithParams(\n value: Record<string, unknown>,\n pattern: Record<string, unknown>\n): { matched: boolean; params: Record<string, unknown> } | null {\n const params: Record<string, unknown> = {}\n const patternKeys = Object.keys(pattern)\n const valueKeys = Object.keys(value)\n\n // Pattern must have same or fewer keys (pattern keys must all be present in value)\n if (patternKeys.length > valueKeys.length) {\n return null\n }\n\n for (const key of patternKeys) {\n if (!(key in value)) {\n return null\n }\n\n const patternVal = pattern[key]\n const actualVal = value[key]\n\n if (isParamPlaceholder(patternVal)) {\n // Extract parameter value\n params[getParamName(patternVal)] = actualVal\n } else if (typeof patternVal === 'object' && patternVal !== null && typeof actualVal === 'object' && actualVal !== null) {\n // Recursively match nested objects\n const nestedResult = matchObjectWithParams(\n actualVal as Record<string, unknown>,\n patternVal as Record<string, unknown>\n )\n if (!nestedResult) {\n return null\n }\n Object.assign(params, nestedResult.params)\n } else if (!deepEqual(patternVal, actualVal)) {\n return null\n }\n }\n\n return { matched: true, params }\n}\n\n/**\n * Match a query key against a pattern\n *\n * Supports:\n * - Exact string/number matching: ['users'] matches ['users']\n * - Parameter extraction with :param syntax: ['users', ':id'] matches ['users', '123']\n * - Object matching with params: ['users', { id: ':id' }] matches ['users', { id: '123' }]\n * - Wildcard matching with '*': ['users', '*'] matches ['users', 'anything']\n *\n * @param queryKey - The actual query key to match\n * @param pattern - The pattern to match against\n * @returns Match result with extracted params, or null if no match\n *\n * @example\n * // Exact match\n * matchQueryKey(['users'], ['users'])\n * // { matched: true, params: {} }\n *\n * // Parameter extraction from string\n * matchQueryKey(['users', '123'], ['users', ':id'])\n * // { matched: true, params: { id: '123' } }\n *\n * // Parameter extraction from object\n * matchQueryKey(['users', { id: '123', status: 'active' }], ['users', { id: ':userId' }])\n * // { matched: true, params: { userId: '123' } }\n *\n * // Wildcard matching\n * matchQueryKey(['users', 'anything'], ['users', '*'])\n * // { matched: true, params: {} }\n *\n * // No match - different length\n * matchQueryKey(['users'], ['users', 'list'])\n * // null\n */\nexport function matchQueryKey(\n queryKey: QueryKey,\n pattern: QueryKey\n): QueryKeyMatchResult | null {\n // Arrays must be same length\n if (queryKey.length !== pattern.length) {\n return null\n }\n\n const params: Record<string, unknown> = {}\n\n for (let i = 0; i < pattern.length; i++) {\n const patternElement = pattern[i]\n const keyElement = queryKey[i]\n\n // Wildcard matches anything\n if (patternElement === '*') {\n continue\n }\n\n // Parameter placeholder extracts value\n if (isParamPlaceholder(patternElement)) {\n params[getParamName(patternElement)] = keyElement\n continue\n }\n\n // Object matching with potential nested params\n if (\n typeof patternElement === 'object' &&\n patternElement !== null &&\n typeof keyElement === 'object' &&\n keyElement !== null\n ) {\n const objectResult = matchObjectWithParams(\n keyElement as Record<string, unknown>,\n patternElement as Record<string, unknown>\n )\n if (!objectResult) {\n return null\n }\n Object.assign(params, objectResult.params)\n continue\n }\n\n // Exact match for primitives\n if (patternElement !== keyElement) {\n return null\n }\n }\n\n return { matched: true, params }\n}\n\n/**\n * Find the first matching pattern from a map of query key patterns\n *\n * @param patterns - Map of serialized patterns to values\n * @param queryKey - The query key to match\n * @returns Tuple of [pattern, value, match result] or null if no match\n *\n * @example\n * const patterns = {\n * 'users': { data: [] },\n * 'users/:id': (params) => ({ id: params.id }),\n * }\n * findMatchingQueryKeyPattern(patterns, ['users', '123'])\n * // [['users', ':id'], { params: { id: '123' } }]\n */\nexport function findMatchingQueryKeyPattern<T>(\n patterns: Map<QueryKey, T>,\n queryKey: QueryKey\n): [QueryKey, T, QueryKeyMatchResult] | null {\n for (const [pattern, value] of patterns) {\n const result = matchQueryKey(queryKey, pattern)\n if (result) {\n return [pattern, value, result]\n }\n }\n return null\n}\n","/**\n * Default localStorage key for demo mode state\n */\nexport const DEFAULT_STORAGE_KEY = 'demokit-mode'\n\n/**\n * Check if localStorage is available (handles SSR and restricted contexts)\n */\nfunction isLocalStorageAvailable(): boolean {\n try {\n const testKey = '__demokit_test__'\n if (typeof window === 'undefined' || !window.localStorage) {\n return false\n }\n window.localStorage.setItem(testKey, testKey)\n window.localStorage.removeItem(testKey)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Load demo mode state from localStorage\n *\n * @param key - localStorage key to use\n * @returns Current demo mode state, or false if not set or unavailable\n */\nexport function loadDemoState(key: string = DEFAULT_STORAGE_KEY): boolean {\n if (!isLocalStorageAvailable()) {\n return false\n }\n\n try {\n const value = window.localStorage.getItem(key)\n return value === 'true'\n } catch {\n return false\n }\n}\n\n/**\n * Save demo mode state to localStorage\n *\n * @param key - localStorage key to use\n * @param enabled - Whether demo mode is enabled\n */\nexport function saveDemoState(\n key: string = DEFAULT_STORAGE_KEY,\n enabled: boolean\n): void {\n if (!isLocalStorageAvailable()) {\n return\n }\n\n try {\n if (enabled) {\n window.localStorage.setItem(key, 'true')\n } else {\n window.localStorage.removeItem(key)\n }\n } catch {\n // Silently fail if storage is full or restricted\n }\n}\n\n/**\n * Clear demo mode state from localStorage\n *\n * @param key - localStorage key to use\n */\nexport function clearDemoState(key: string = DEFAULT_STORAGE_KEY): void {\n if (!isLocalStorageAvailable()) {\n return\n }\n\n try {\n window.localStorage.removeItem(key)\n } catch {\n // Silently fail\n }\n}\n","/**\n * Session state management for DemoKit\n *\n * Provides in-memory storage for mutable state during a demo session.\n * State persists across requests but resets on page refresh.\n */\n\n/**\n * Session state interface for storing and retrieving demo session data\n *\n * @example\n * ```typescript\n * // In a fixture handler\n * 'POST /api/users': ({ body, session }) => {\n * const users = session.get<User[]>('users') || []\n * const newUser = { id: crypto.randomUUID(), ...body }\n * session.set('users', [...users, newUser])\n * return newUser\n * }\n *\n * 'GET /api/users': ({ session }) => {\n * return session.get<User[]>('users') || []\n * }\n * ```\n */\nexport interface SessionState {\n /**\n * Get a value from the session state\n * @param key - The key to retrieve\n * @returns The value if it exists, undefined otherwise\n */\n get<T>(key: string): T | undefined\n\n /**\n * Set a value in the session state\n * @param key - The key to set\n * @param value - The value to store\n */\n set<T>(key: string, value: T): void\n\n /**\n * Delete a value from the session state\n * @param key - The key to delete\n */\n delete(key: string): void\n\n /**\n * Clear all session state\n */\n clear(): void\n\n /**\n * Get all keys in the session state\n * @returns Array of all keys\n */\n keys(): string[]\n\n /**\n * Check if a key exists in the session state\n * @param key - The key to check\n * @returns True if the key exists\n */\n has(key: string): boolean\n\n /**\n * Get the number of items in the session state\n * @returns The number of items\n */\n size(): number\n}\n\n/**\n * Create a new session state instance\n *\n * Session state is purely in-memory and resets when the page is refreshed.\n * This is intentional - demo sessions should start fresh each time.\n *\n * @returns A new SessionState instance\n *\n * @example\n * ```typescript\n * const session = createSessionState()\n *\n * session.set('cart', [{ id: '1', quantity: 2 }])\n * const cart = session.get<CartItem[]>('cart')\n *\n * session.clear() // Reset all state\n * ```\n */\nexport function createSessionState(): SessionState {\n const store = new Map<string, unknown>()\n\n return {\n get<T>(key: string): T | undefined {\n return store.get(key) as T | undefined\n },\n\n set<T>(key: string, value: T): void {\n store.set(key, value)\n },\n\n delete(key: string): void {\n store.delete(key)\n },\n\n clear(): void {\n store.clear()\n },\n\n keys(): string[] {\n return Array.from(store.keys())\n },\n\n has(key: string): boolean {\n return store.has(key)\n },\n\n size(): number {\n return store.size\n },\n }\n}\n","import type {\n DemoKitConfig,\n DemoInterceptor,\n FixtureMap,\n FixtureHandler,\n RequestContext,\n DetectionConfig,\n} from './types'\nimport { findMatchingPattern } from './matcher'\nimport { loadDemoState, saveDemoState, DEFAULT_STORAGE_KEY } from './storage'\nimport { createSessionState, type SessionState } from './session'\n\n/**\n * Parse request body based on content type\n */\nasync function parseRequestBody(\n body: BodyInit | null | undefined,\n headers: Headers\n): Promise<unknown> {\n if (!body) {\n return undefined\n }\n\n const contentType = headers.get('content-type') || ''\n\n try {\n if (typeof body === 'string') {\n if (contentType.includes('application/json')) {\n return JSON.parse(body)\n }\n return body\n }\n\n if (body instanceof FormData) {\n const obj: Record<string, unknown> = {}\n body.forEach((value, key) => {\n obj[key] = value\n })\n return obj\n }\n\n if (body instanceof URLSearchParams) {\n const obj: Record<string, string> = {}\n body.forEach((value, key) => {\n obj[key] = value\n })\n return obj\n }\n\n if (body instanceof Blob) {\n const text = await body.text()\n if (contentType.includes('application/json')) {\n return JSON.parse(text)\n }\n return text\n }\n\n if (body instanceof ArrayBuffer) {\n const text = new TextDecoder().decode(body)\n if (contentType.includes('application/json')) {\n return JSON.parse(text)\n }\n return text\n }\n } catch {\n // Return raw body if parsing fails\n }\n\n return body\n}\n\n/**\n * Create a mock Response from fixture data\n */\nfunction createMockResponse(data: unknown, status = 200): Response {\n const body = JSON.stringify(data)\n return new Response(body, {\n status,\n statusText: status === 200 ? 'OK' : 'Error',\n headers: {\n 'Content-Type': 'application/json',\n 'X-DemoKit-Mock': 'true',\n },\n })\n}\n\n/**\n * Extract pathname from URL, handling various input types\n */\nfunction extractPathname(input: RequestInfo | URL, baseUrl: string): string {\n try {\n if (typeof input === 'string') {\n // Handle relative URLs\n if (input.startsWith('/')) {\n return input.split('?')[0] || '/'\n }\n return new URL(input, baseUrl).pathname\n }\n if (input instanceof URL) {\n return input.pathname\n }\n if (input instanceof Request) {\n return new URL(input.url, baseUrl).pathname\n }\n } catch {\n // Fallback for malformed URLs\n }\n return '/'\n}\n\n/**\n * Extract full URL from input\n */\nfunction extractUrl(input: RequestInfo | URL, baseUrl: string): string {\n try {\n if (typeof input === 'string') {\n if (input.startsWith('/')) {\n return new URL(input, baseUrl).toString()\n }\n return input\n }\n if (input instanceof URL) {\n return input.toString()\n }\n if (input instanceof Request) {\n return input.url\n }\n } catch {\n // Fallback\n }\n return baseUrl\n}\n\n/**\n * Check if demo mode should be auto-enabled based on detection config\n */\nfunction detectDemoMode(detection?: DetectionConfig): { detected: boolean; isPublicDemo: boolean } {\n if (!detection || typeof window === 'undefined') {\n return { detected: false, isPublicDemo: false }\n }\n\n // Check subdomain match\n if (detection.subdomains?.length) {\n const hostname = window.location.hostname\n if (detection.subdomains.some((sub) => hostname === sub)) {\n return { detected: true, isPublicDemo: true }\n }\n }\n\n // Check query parameter\n const queryParams = detection.queryParams ?? ['demo']\n const searchParams = new URLSearchParams(window.location.search)\n for (const param of queryParams) {\n const value = searchParams.get(param)\n if (value !== null && value !== 'false') {\n return { detected: true, isPublicDemo: false }\n }\n }\n\n return { detected: false, isPublicDemo: false }\n}\n\n/**\n * Create a demo interceptor that patches fetch to return mock data\n *\n * @param config - Configuration including fixtures and options\n * @returns Demo interceptor instance with enable/disable controls\n *\n * @example\n * const demo = createDemoInterceptor({\n * fixtures: {\n * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],\n * 'GET /api/users/:id': ({ params }) => ({ id: params.id, name: 'Demo User' }),\n * 'POST /api/users': ({ body }) => ({ id: 'new', ...body }),\n * }\n * })\n *\n * demo.enable() // All matching fetches return mock data\n * demo.disable() // Back to real API\n */\nexport function createDemoInterceptor(config: DemoKitConfig): DemoInterceptor {\n const {\n fixtures: initialFixtures,\n storageKey = DEFAULT_STORAGE_KEY,\n onEnable,\n onDisable,\n initialEnabled,\n baseUrl = 'http://localhost',\n detection,\n canDisable,\n onMutationIntercepted,\n } = config\n\n // Auto-detect demo mode from URL\n const detectionResult = detectDemoMode(detection)\n\n // Track state — detection overrides storage/initialEnabled\n let enabled = detectionResult.detected || (initialEnabled ?? loadDemoState(storageKey))\n let currentFixtures: FixtureMap = { ...initialFixtures }\n\n // Create session state (in-memory, resets on page refresh)\n let sessionState: SessionState = createSessionState()\n\n // Store original fetch\n let originalFetch: typeof fetch | null = null\n let isPatched = false\n\n /**\n * Patch global fetch to intercept requests\n */\n function patchFetch(): void {\n if (isPatched || typeof globalThis.fetch !== 'function') {\n return\n }\n\n originalFetch = globalThis.fetch\n\n globalThis.fetch = async function interceptedFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n // If demo mode is disabled, pass through\n if (!enabled) {\n console.log('[DemoKit] Demo mode disabled, passing through')\n return originalFetch!(input, init)\n }\n\n const method = init?.method?.toUpperCase() || 'GET'\n const pathname = extractPathname(input, baseUrl)\n\n console.log('[DemoKit] Intercepting request:', { method, pathname, enabled })\n console.log('[DemoKit] Available fixtures:', Object.keys(currentFixtures))\n\n // Try to find a matching fixture\n const match = findMatchingPattern(currentFixtures, method, pathname)\n\n if (!match) {\n // No matching fixture - pass through to real API\n console.log('[DemoKit] No matching fixture for:', `${method} ${pathname}`)\n return originalFetch!(input, init)\n }\n\n console.log('[DemoKit] Found matching fixture:', match[0])\n\n const [pattern, matchResult] = match\n const handler = currentFixtures[pattern] as FixtureHandler\n\n // Build request context for the handler\n const url = extractUrl(input, baseUrl)\n const headers = new Headers(init?.headers)\n const body = await parseRequestBody(init?.body, headers)\n\n let searchParams: URLSearchParams\n try {\n searchParams = new URL(url, baseUrl).searchParams\n } catch {\n searchParams = new URLSearchParams()\n }\n\n const context: RequestContext = {\n url,\n method,\n params: matchResult.params,\n searchParams,\n body,\n headers,\n session: sessionState,\n }\n\n // Fire mutation callback for non-GET requests\n if (method !== 'GET' && onMutationIntercepted) {\n onMutationIntercepted({\n url,\n method,\n params: matchResult.params,\n pattern,\n })\n }\n\n // Execute handler and get result\n let result: unknown\n try {\n if (typeof handler === 'function') {\n result = await handler(context)\n } else {\n result = handler\n }\n } catch (error) {\n // Return error response if handler throws\n console.error('[DemoKit] Fixture handler error:', error)\n return createMockResponse(\n { error: 'Fixture handler error', message: String(error) },\n 500\n )\n }\n\n return createMockResponse(result)\n }\n\n isPatched = true\n }\n\n /**\n * Restore original fetch\n */\n function restoreFetch(): void {\n if (!isPatched || !originalFetch) {\n return\n }\n\n globalThis.fetch = originalFetch\n originalFetch = null\n isPatched = false\n }\n\n // Patch fetch immediately\n patchFetch()\n\n return {\n enable(): void {\n if (enabled) return\n\n enabled = true\n saveDemoState(storageKey, true)\n onEnable?.()\n },\n\n disable(): boolean | string {\n if (!enabled) return true\n\n if (canDisable) {\n const result = canDisable()\n if (result !== true) {\n // Prevented — return the reason (false or string message)\n return result\n }\n }\n\n enabled = false\n saveDemoState(storageKey, false)\n onDisable?.()\n return true\n },\n\n isEnabled(): boolean {\n return enabled\n },\n\n isPublicDemo(): boolean {\n return detectionResult.isPublicDemo\n },\n\n toggle(): boolean {\n if (enabled) {\n this.disable()\n } else {\n this.enable()\n }\n return enabled\n },\n\n setFixtures(fixtures: FixtureMap): void {\n currentFixtures = { ...fixtures }\n },\n\n addFixture(pattern: string, handler: FixtureHandler): void {\n currentFixtures[pattern] = handler\n },\n\n removeFixture(pattern: string): void {\n delete currentFixtures[pattern]\n },\n\n resetSession(): void {\n sessionState.clear()\n },\n\n getSession(): SessionState {\n return sessionState\n },\n\n destroy(): void {\n restoreFetch()\n enabled = false\n sessionState.clear()\n },\n }\n}\n","import type { FixtureMap } from './types'\n\n/**\n * Shared demo state interface that can be used across frameworks\n * This provides a consistent API for managing demo mode state\n */\nexport interface DemoState {\n /**\n * Whether demo mode is currently enabled\n */\n enabled: boolean\n\n /**\n * The currently active scenario name, if any\n * Scenarios allow grouping fixtures for different demo flows\n */\n scenario: string | null\n\n /**\n * The active fixture map for the current scenario\n */\n fixtures: FixtureMap\n\n /**\n * Timestamp when demo mode was last enabled\n * Useful for session timeout logic\n */\n enabledAt: number | null\n}\n\n/**\n * Create initial demo state\n *\n * @param initialEnabled - Whether demo mode should start enabled\n * @param fixtures - Initial fixture map\n * @returns A new DemoState object\n *\n * @example\n * const state = createDemoState(false, {\n * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],\n * })\n */\nexport function createDemoState(\n initialEnabled: boolean = false,\n fixtures: FixtureMap = {}\n): DemoState {\n return {\n enabled: initialEnabled,\n scenario: null,\n fixtures,\n enabledAt: initialEnabled ? Date.now() : null,\n }\n}\n\n/**\n * Options for creating a demo state store\n */\nexport interface DemoStateStoreOptions {\n /**\n * Initial enabled state\n * @default false\n */\n initialEnabled?: boolean\n\n /**\n * Initial fixtures\n * @default {}\n */\n fixtures?: FixtureMap\n\n /**\n * Available scenarios with their fixtures\n */\n scenarios?: Record<string, FixtureMap>\n\n /**\n * Callback when state changes\n */\n onChange?: (state: DemoState) => void\n}\n\n/**\n * A minimal state store for demo mode\n * Framework adapters can use this or integrate with their own state management\n */\nexport interface DemoStateStore {\n /**\n * Get the current state\n */\n getState(): DemoState\n\n /**\n * Enable demo mode\n */\n enable(): void\n\n /**\n * Disable demo mode\n */\n disable(): void\n\n /**\n * Toggle demo mode\n */\n toggle(): boolean\n\n /**\n * Set the active scenario\n * @param name - Scenario name (or null to clear)\n */\n setScenario(name: string | null): void\n\n /**\n * Update fixtures (merges with existing)\n */\n updateFixtures(fixtures: FixtureMap): void\n\n /**\n * Replace all fixtures\n */\n setFixtures(fixtures: FixtureMap): void\n\n /**\n * Subscribe to state changes\n * @returns Unsubscribe function\n */\n subscribe(listener: (state: DemoState) => void): () => void\n}\n\n/**\n * Create a demo state store\n *\n * This is a minimal, framework-agnostic state store that can be used\n * directly or wrapped by framework-specific adapters (React, Vue, etc.)\n *\n * @param options - Store configuration options\n * @returns A DemoStateStore instance\n *\n * @example\n * const store = createDemoStateStore({\n * initialEnabled: false,\n * fixtures: {\n * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],\n * },\n * scenarios: {\n * 'empty-state': { 'GET /api/users': () => [] },\n * 'error-state': { 'GET /api/users': () => { throw new Error('API Error') } },\n * },\n * })\n *\n * // Subscribe to changes\n * const unsubscribe = store.subscribe((state) => {\n * console.log('Demo mode:', state.enabled)\n * })\n *\n * // Enable demo mode\n * store.enable()\n *\n * // Switch scenario\n * store.setScenario('empty-state')\n */\nexport function createDemoStateStore(options: DemoStateStoreOptions = {}): DemoStateStore {\n const {\n initialEnabled = false,\n fixtures = {},\n scenarios = {},\n onChange,\n } = options\n\n let state = createDemoState(initialEnabled, fixtures)\n const listeners = new Set<(state: DemoState) => void>()\n\n function notify() {\n listeners.forEach((listener) => listener(state))\n onChange?.(state)\n }\n\n function setState(updates: Partial<DemoState>) {\n state = { ...state, ...updates }\n notify()\n }\n\n return {\n getState() {\n return state\n },\n\n enable() {\n if (!state.enabled) {\n setState({ enabled: true, enabledAt: Date.now() })\n }\n },\n\n disable() {\n if (state.enabled) {\n setState({ enabled: false, enabledAt: null })\n }\n },\n\n toggle() {\n const newEnabled = !state.enabled\n setState({\n enabled: newEnabled,\n enabledAt: newEnabled ? Date.now() : null,\n })\n return newEnabled\n },\n\n setScenario(name: string | null) {\n if (name === null) {\n setState({ scenario: null, fixtures })\n } else if (scenarios[name]) {\n setState({ scenario: name, fixtures: { ...fixtures, ...scenarios[name] } })\n } else {\n console.warn(`[DemoKit] Unknown scenario: ${name}`)\n }\n },\n\n updateFixtures(newFixtures: FixtureMap) {\n setState({ fixtures: { ...state.fixtures, ...newFixtures } })\n },\n\n setFixtures(newFixtures: FixtureMap) {\n setState({ fixtures: newFixtures })\n },\n\n subscribe(listener: (state: DemoState) => void) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}","/**\n * Remote Configuration Support for DemoKit Cloud\n *\n * Provides functions to fetch fixture data and endpoint mappings from DemoKit Cloud\n * and transform them into FixtureMap handlers that can be used with the demo interceptor.\n *\n * @example\n * ```typescript\n * import { fetchCloudFixtures, buildFixtureMap } from '@demokit-ai/core'\n *\n * const response = await fetchCloudFixtures({\n * apiKey: 'dk_live_xxx',\n * })\n *\n * const fixtureMap = buildFixtureMap(response.data, response.mappings)\n * ```\n */\n\nimport type {\n RemoteConfig,\n CloudFixtureResponse,\n EndpointMapping,\n FixtureMap,\n FixtureHandler,\n RequestContext,\n} from './types'\n\n/**\n * Default DemoKit Cloud API URL\n */\nexport const DEFAULT_API_URL = 'https://api.demokit.cloud/api'\n\n/**\n * @deprecated Use DEFAULT_API_URL instead\n */\nexport const DEFAULT_CLOUD_URL = DEFAULT_API_URL\n\n/**\n * Default request timeout in milliseconds\n */\nexport const DEFAULT_TIMEOUT = 10000\n\n/**\n * Default maximum retries\n */\nexport const DEFAULT_MAX_RETRIES = 3\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(apiKey: string): boolean {\n return typeof apiKey === 'string' && apiKey.startsWith('dk_live_')\n}\n\n/**\n * Error thrown when remote fetch fails\n */\nexport class RemoteFetchError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly retryable: boolean = false\n ) {\n super(message)\n this.name = 'RemoteFetchError'\n }\n}\n\n/**\n * Sleep utility for retry backoff\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Calculate exponential backoff delay\n */\nfunction getBackoffDelay(attempt: number, baseDelay: number = 1000): number {\n return Math.min(baseDelay * Math.pow(2, attempt), 10000)\n}\n\n/**\n * Fetch fixtures and mappings from DemoKit Cloud\n *\n * @param config - Remote configuration with API key and options\n * @returns Promise resolving to cloud fixture response with data, mappings, and version\n * @throws RemoteFetchError if the request fails\n *\n * @example\n * ```typescript\n * const response = await fetchCloudFixtures({\n * apiKey: 'dk_live_xxx',\n * onLoad: (data) => console.log('Loaded version:', data.version),\n * onError: (error) => console.error('Failed to load:', error),\n * })\n * ```\n */\nexport async function fetchCloudFixtures(\n config: RemoteConfig\n): Promise<CloudFixtureResponse> {\n const {\n apiKey,\n apiUrl,\n cloudUrl, // deprecated, for backwards compatibility\n onError,\n onLoad,\n timeout = DEFAULT_TIMEOUT,\n retry = true,\n maxRetries = DEFAULT_MAX_RETRIES,\n } = config\n\n // Use apiUrl if provided, fall back to cloudUrl for backwards compatibility\n const baseUrl = apiUrl || cloudUrl || DEFAULT_API_URL\n\n // Validate API key format\n if (!isValidApiKey(apiKey)) {\n const error = new RemoteFetchError(\n 'Invalid API key format. Expected format: dk_live_xxx',\n undefined,\n false\n )\n onError?.(error)\n throw error\n }\n\n // Build the fixtures endpoint URL\n // apiUrl is expected to be the versioned base (e.g., https://api.demokit.cloud/api/v1)\n // We just append /fixtures\n const url = `${baseUrl.replace(/\\/$/, '')}/fixtures`\n\n let lastError: Error | null = null\n const maxAttempts = retry ? maxRetries : 1\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n // Create abort controller for timeout\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Handle non-OK responses\n if (!response.ok) {\n const body = await response.json().catch(() => ({}))\n const message = (body as { error?: string }).error || response.statusText\n\n // Determine if retryable (5xx errors)\n const retryable = response.status >= 500\n\n throw new RemoteFetchError(message, response.status, retryable)\n }\n\n // Parse response\n const data = (await response.json()) as CloudFixtureResponse\n\n // Validate response structure\n if (!data || typeof data !== 'object') {\n throw new RemoteFetchError('Invalid response format', undefined, false)\n }\n\n if (!data.data || !data.mappings || !data.version) {\n throw new RemoteFetchError(\n 'Missing required fields in response: data, mappings, or version',\n undefined,\n false\n )\n }\n\n // Call success callback\n onLoad?.(data)\n\n return data\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n\n // Handle abort (timeout)\n if (error instanceof Error && error.name === 'AbortError') {\n lastError = new RemoteFetchError(\n `Request timed out after ${timeout}ms`,\n undefined,\n true\n )\n }\n\n // Check if we should retry\n const isRetryable =\n error instanceof RemoteFetchError ? error.retryable : true\n const shouldRetry = retry && isRetryable && attempt < maxAttempts - 1\n\n if (shouldRetry) {\n const delay = getBackoffDelay(attempt)\n await sleep(delay)\n continue\n }\n\n // No more retries\n break\n }\n }\n\n // All attempts failed\n onError?.(lastError!)\n throw lastError\n}\n\n/**\n * Build a FixtureMap from cloud data and endpoint mappings\n *\n * Transforms endpoint mappings into fixture handlers that can be used\n * with the demo interceptor. Each mapping becomes a pattern-matched\n * handler that returns the appropriate data.\n *\n * @param data - Fixture data keyed by model name (e.g., { users: [...], products: [...] })\n * @param mappings - Endpoint mappings from DemoKit Cloud\n * @returns FixtureMap that can be passed to createDemoInterceptor\n *\n * @example\n * ```typescript\n * const fixtureMap = buildFixtureMap(\n * { users: [{ id: '1', name: 'Alice' }] },\n * [\n * { method: 'GET', pattern: '/api/users', sourceModel: 'users', responseType: 'collection' },\n * { method: 'GET', pattern: '/api/users/:id', sourceModel: 'users', responseType: 'single', lookupField: 'id', lookupParam: 'id' },\n * ]\n * )\n *\n * // Result:\n * // {\n * // 'GET /api/users': () => [{ id: '1', name: 'Alice' }],\n * // 'GET /api/users/:id': ({ params }) => users.find(u => u.id === params.id),\n * // }\n * ```\n */\nexport function buildFixtureMap(\n data: Record<string, unknown[]>,\n mappings: EndpointMapping[]\n): FixtureMap {\n const fixtureMap: FixtureMap = {}\n\n for (const mapping of mappings) {\n const key = `${mapping.method} ${mapping.pattern}`\n const sourceData = data[mapping.sourceModel] || []\n\n const handler = createHandlerForMapping(mapping, sourceData)\n if (handler) {\n fixtureMap[key] = handler\n }\n }\n\n return fixtureMap\n}\n\n/**\n * Create a fixture handler for a single endpoint mapping\n *\n * @param mapping - The endpoint mapping configuration\n * @param sourceData - The source data array for this mapping\n * @returns A fixture handler function or undefined if mapping is invalid\n */\nexport function createHandlerForMapping(\n mapping: EndpointMapping,\n sourceData: unknown[]\n): FixtureHandler | undefined {\n switch (mapping.responseType) {\n case 'collection':\n return createCollectionHandler(sourceData)\n\n case 'single':\n return createSingleHandler(mapping, sourceData)\n\n case 'custom':\n // Custom handlers are not yet supported in the SDK\n // They would require safe eval or a transform registry\n console.warn(\n `[DemoKit] Custom response type not yet supported for pattern: ${mapping.pattern}`\n )\n return undefined\n\n default:\n console.warn(\n `[DemoKit] Unknown response type \"${mapping.responseType}\" for pattern: ${mapping.pattern}`\n )\n return undefined\n }\n}\n\n/**\n * Create a handler that returns all records from source data\n */\nfunction createCollectionHandler(sourceData: unknown[]): FixtureHandler {\n // Return a shallow copy to prevent accidental mutation\n return () => [...sourceData]\n}\n\n/**\n * Create a handler that looks up a single record by field value\n */\nfunction createSingleHandler(\n mapping: EndpointMapping,\n sourceData: unknown[]\n): FixtureHandler {\n const { lookupField, lookupParam } = mapping\n\n // If lookup configuration is missing, return first item or undefined\n if (!lookupField || !lookupParam) {\n return () => sourceData[0]\n }\n\n return (context: RequestContext) => {\n const lookupValue = context.params[lookupParam]\n\n if (lookupValue === undefined) {\n return undefined\n }\n\n // Find record where field matches the param value (as strings)\n return sourceData.find((item) => {\n if (!item || typeof item !== 'object') return false\n const record = item as Record<string, unknown>\n return String(record[lookupField]) === lookupValue\n })\n }\n}\n\n/**\n * Merge remote fixtures with local overrides\n *\n * Creates a combined FixtureMap where local fixtures take precedence\n * over remote fixtures for the same patterns.\n *\n * @param remoteFixtures - Fixtures built from cloud mappings\n * @param localOverrides - Local fixtures that override remote ones\n * @returns Merged FixtureMap\n *\n * @example\n * ```typescript\n * const merged = mergeFixtures(remoteFixtures, {\n * // Override specific endpoint with custom logic\n * 'POST /api/users': ({ body }) => ({ id: 'custom', ...body }),\n * })\n * ```\n */\nexport function mergeFixtures(\n remoteFixtures: FixtureMap,\n localOverrides?: FixtureMap\n): FixtureMap {\n if (!localOverrides) {\n return { ...remoteFixtures }\n }\n\n return {\n ...remoteFixtures,\n ...localOverrides,\n }\n}\n\n/**\n * Create a complete fixture setup from cloud response and optional overrides\n *\n * Convenience function that combines buildFixtureMap and mergeFixtures.\n *\n * @param response - Cloud fixture response\n * @param localOverrides - Optional local fixtures to merge\n * @returns Complete FixtureMap ready for use with createDemoInterceptor\n */\nexport function createRemoteFixtures(\n response: CloudFixtureResponse,\n localOverrides?: FixtureMap\n): FixtureMap {\n const remoteFixtures = buildFixtureMap(response.data, response.mappings)\n return mergeFixtures(remoteFixtures, localOverrides)\n}\n","/**\n * Core types for DemoKit schema representation\n *\n * These types represent a parsed API schema with relationship detection,\n * independent of the source format (OpenAPI, GraphQL, etc.)\n */\n\n/**\n * The main schema representation for DemoKit\n * Contains all information needed for fixture generation\n */\nexport interface DemokitSchema {\n /**\n * Metadata about the API\n */\n info: SchemaInfo\n\n /**\n * All API endpoints discovered from the spec\n */\n endpoints: Endpoint[]\n\n /**\n * All data models (schemas) from the spec\n */\n models: Record<string, DataModel>\n\n /**\n * Detected relationships between models\n */\n relationships: Relationship[]\n}\n\n/**\n * API metadata\n */\nexport interface SchemaInfo {\n /**\n * API title from the spec\n */\n title: string\n\n /**\n * API version\n */\n version: string\n\n /**\n * Optional description\n */\n description?: string\n\n /**\n * Base URL for the API (if specified)\n */\n baseUrl?: string\n}\n\n/**\n * An API endpoint\n */\nexport interface Endpoint {\n /**\n * HTTP method (GET, POST, PUT, PATCH, DELETE)\n */\n method: HttpMethod\n\n /**\n * URL path with parameter placeholders\n * @example \"/users/{id}\" or \"/orders/{orderId}/items\"\n */\n path: string\n\n /**\n * Operation ID from OpenAPI (if available)\n */\n operationId?: string\n\n /**\n * Human-readable summary\n */\n summary?: string\n\n /**\n * Detailed description\n */\n description?: string\n\n /**\n * Path parameters\n */\n pathParams: ParameterDef[]\n\n /**\n * Query parameters\n */\n queryParams: ParameterDef[]\n\n /**\n * Request body schema (for POST/PUT/PATCH)\n */\n requestBody?: RequestBody\n\n /**\n * Response schemas by status code\n */\n responses: Record<string, ResponseDef>\n\n /**\n * Tags for grouping endpoints\n */\n tags: string[]\n}\n\n/**\n * HTTP methods supported\n */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\n/**\n * A request or response body definition\n */\nexport interface RequestBody {\n /**\n * Content type (usually application/json)\n */\n contentType: string\n\n /**\n * Reference to the model name, or inline schema\n */\n schema: SchemaRef | DataModel\n\n /**\n * Whether the body is required\n */\n required: boolean\n\n /**\n * Description of the body\n */\n description?: string\n}\n\n/**\n * A response definition\n */\nexport interface ResponseDef {\n /**\n * HTTP status code\n */\n statusCode: string\n\n /**\n * Description of the response\n */\n description?: string\n\n /**\n * Content type to schema mapping\n */\n content?: Record<string, SchemaRef | DataModel>\n}\n\n/**\n * A parameter definition (path or query)\n */\nexport interface ParameterDef {\n /**\n * Parameter name\n */\n name: string\n\n /**\n * Where the parameter is located\n */\n in: 'path' | 'query' | 'header' | 'cookie'\n\n /**\n * Whether the parameter is required\n */\n required: boolean\n\n /**\n * Parameter type\n */\n type: PropertyType\n\n /**\n * Optional format hint\n */\n format?: string\n\n /**\n * Description\n */\n description?: string\n\n /**\n * Example value\n */\n example?: unknown\n}\n\n/**\n * Reference to another schema/model\n */\nexport interface SchemaRef {\n /**\n * The referenced model name\n */\n $ref: string\n}\n\n/**\n * A data model representing an object schema\n */\nexport interface DataModel {\n /**\n * Model name (from the schema component name)\n */\n name: string\n\n /**\n * The type of this model\n */\n type: ModelType\n\n /**\n * Description from the spec\n */\n description?: string\n\n /**\n * Properties for object types\n */\n properties?: Record<string, PropertyDef>\n\n /**\n * Required property names\n */\n required?: string[]\n\n /**\n * For array types, the item schema\n */\n items?: SchemaRef | DataModel\n\n /**\n * Enum values for enum types\n */\n enum?: unknown[]\n\n /**\n * Example value from the spec\n */\n example?: unknown\n\n /**\n * Additional properties schema (for dictionaries)\n */\n additionalProperties?: boolean | SchemaRef | DataModel\n}\n\n/**\n * Model types\n */\nexport type ModelType = 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean' | 'null'\n\n/**\n * A property definition within a model\n */\nexport interface PropertyDef {\n /**\n * Property name\n */\n name: string\n\n /**\n * Property type\n */\n type: PropertyType\n\n /**\n * Format hint (uuid, email, date-time, etc.)\n */\n format?: string\n\n /**\n * Description\n */\n description?: string\n\n /**\n * Whether this property is required\n */\n required?: boolean\n\n /**\n * Whether this property is nullable\n */\n nullable?: boolean\n\n /**\n * Enum values for string enums\n */\n enum?: unknown[]\n\n /**\n * For array types, the item schema\n */\n items?: SchemaRef | DataModel\n\n /**\n * Reference to another model (for $ref properties)\n */\n $ref?: string\n\n /**\n * Example value\n */\n example?: unknown\n\n /**\n * Default value\n */\n default?: unknown\n\n /**\n * Minimum value (for numbers)\n */\n minimum?: number\n\n /**\n * Maximum value (for numbers)\n */\n maximum?: number\n\n /**\n * Min length (for strings)\n */\n minLength?: number\n\n /**\n * Max length (for strings)\n */\n maxLength?: number\n\n /**\n * Pattern (regex for strings)\n */\n pattern?: string\n\n /**\n * Detected relationship to another model\n * Set by relationship detection, not directly from spec\n */\n relationshipTo?: RelationshipTarget\n\n /**\n * Custom extension for explicit relationship hints\n * @example \"x-demokit-relationship\": { \"model\": \"User\", \"field\": \"id\" }\n */\n 'x-demokit-relationship'?: RelationshipTarget\n}\n\n/**\n * Property types\n */\nexport type PropertyType =\n | 'string'\n | 'number'\n | 'integer'\n | 'boolean'\n | 'array'\n | 'object'\n | 'null'\n\n/**\n * A detected relationship between two models\n */\nexport interface Relationship {\n /**\n * The source side of the relationship\n */\n from: RelationshipSide\n\n /**\n * The target side of the relationship\n */\n to: RelationshipSide\n\n /**\n * Type of relationship\n */\n type: RelationshipType\n\n /**\n * Whether the relationship is required (not nullable)\n */\n required: boolean\n\n /**\n * How this relationship was detected\n */\n detectedBy: RelationshipDetectionMethod\n}\n\n/**\n * One side of a relationship\n */\nexport interface RelationshipSide {\n /**\n * Model name\n */\n model: string\n\n /**\n * Field name\n */\n field: string\n}\n\n/**\n * Target for a relationship from a property\n */\nexport interface RelationshipTarget {\n /**\n * Target model name\n */\n model: string\n\n /**\n * Target field (usually \"id\")\n */\n field: string\n}\n\n/**\n * Types of relationships between models\n */\nexport type RelationshipType =\n | 'one-to-one'\n | 'one-to-many'\n | 'many-to-one'\n | 'many-to-many'\n\n/**\n * How a relationship was detected\n */\nexport type RelationshipDetectionMethod =\n | 'explicit-ref' // OpenAPI $ref\n | 'naming-convention' // userId -> User.id pattern\n | 'x-demokit-extension' // x-demokit-relationship extension\n | 'inferred' // AI or heuristic inference\n\n/**\n * Helper type to check if something is a schema reference\n */\nexport function isSchemaRef(value: unknown): value is SchemaRef {\n return (\n typeof value === 'object' &&\n value !== null &&\n '$ref' in value &&\n typeof (value as SchemaRef).$ref === 'string'\n )\n}\n\n/**\n * Extract the model name from a $ref string\n * @example \"#/components/schemas/User\" -> \"User\"\n */\nexport function extractRefName(ref: string): string {\n const parts = ref.split('/')\n return parts[parts.length - 1] ?? ref\n}\n","/**\n * Relationship detection for DemoKit schemas\n *\n * Detects relationships between models using:\n * 1. Explicit $ref references in OpenAPI\n * 2. Naming conventions (userId -> User.id)\n * 3. x-demokit-relationship extension\n */\n\nimport type {\n DataModel,\n PropertyDef,\n Relationship,\n RelationshipTarget,\n RelationshipDetectionMethod,\n RelationshipType,\n} from './types'\nimport { isSchemaRef, extractRefName } from './types'\n\n/**\n * Common ID field naming patterns\n * Maps suffix patterns to implied relationships\n */\nconst ID_FIELD_PATTERNS = [\n // Standard patterns: userId -> User, customerId -> Customer\n { pattern: /^(.+)Id$/, targetField: 'id' },\n { pattern: /^(.+)_id$/, targetField: 'id' },\n { pattern: /^(.+)ID$/, targetField: 'id' },\n\n // UUID patterns: userUuid -> User, customerUUID -> Customer\n { pattern: /^(.+)Uuid$/, targetField: 'uuid' },\n { pattern: /^(.+)UUID$/, targetField: 'uuid' },\n { pattern: /^(.+)_uuid$/, targetField: 'uuid' },\n]\n\n/**\n * Convert a field name prefix to a model name\n * @example \"user\" -> \"User\", \"orderItem\" -> \"OrderItem\"\n */\nfunction prefixToModelName(prefix: string): string {\n return prefix.charAt(0).toUpperCase() + prefix.slice(1)\n}\n\n/**\n * Check if a property looks like a foreign key based on naming conventions\n */\nexport function detectRelationshipFromNaming(\n property: PropertyDef,\n availableModels: Set<string>\n): RelationshipTarget | null {\n const fieldName = property.name\n\n for (const { pattern, targetField } of ID_FIELD_PATTERNS) {\n const match = fieldName.match(pattern)\n if (match && match[1]) {\n const prefix = match[1]\n const modelName = prefixToModelName(prefix)\n\n // Check if this model exists in the schema\n if (availableModels.has(modelName)) {\n return { model: modelName, field: targetField }\n }\n\n // Also check for plural forms\n const pluralModel = modelName + 's'\n if (availableModels.has(pluralModel)) {\n return { model: pluralModel, field: targetField }\n }\n }\n }\n\n return null\n}\n\n/**\n * Check if a property has an explicit x-demokit-relationship extension\n */\nexport function detectRelationshipFromExtension(\n property: PropertyDef\n): RelationshipTarget | null {\n const extension = property['x-demokit-relationship']\n if (extension && typeof extension === 'object') {\n return {\n model: extension.model,\n field: extension.field || 'id',\n }\n }\n return null\n}\n\n/**\n * Check if a property is a $ref to another model\n */\nexport function detectRelationshipFromRef(\n property: PropertyDef,\n availableModels: Set<string>\n): RelationshipTarget | null {\n if (property.$ref) {\n const modelName = extractRefName(property.$ref)\n if (availableModels.has(modelName)) {\n return { model: modelName, field: 'id' }\n }\n }\n\n // Check if items is a $ref (for arrays of references)\n if (property.items && isSchemaRef(property.items)) {\n const modelName = extractRefName(property.items.$ref)\n if (availableModels.has(modelName)) {\n return { model: modelName, field: 'id' }\n }\n }\n\n return null\n}\n\n/**\n * Detect the relationship type based on property and target\n */\nfunction determineRelationshipType(\n property: PropertyDef,\n _fromModel: DataModel\n): RelationshipType {\n // If the property is an array, it's one-to-many or many-to-many\n if (property.type === 'array') {\n // For simplicity, treat array references as one-to-many\n // (the \"one\" side has the array of references)\n return 'one-to-many'\n }\n\n // Single reference is many-to-one (many records can reference one target)\n return 'many-to-one'\n}\n\n/**\n * Detect all relationships in a set of models\n */\nexport function detectRelationships(\n models: Record<string, DataModel>\n): Relationship[] {\n const relationships: Relationship[] = []\n const availableModels = new Set(Object.keys(models))\n\n for (const [modelName, model] of Object.entries(models)) {\n if (!model.properties) continue\n\n for (const [propName, property] of Object.entries(model.properties)) {\n let target: RelationshipTarget | null = null\n let detectionMethod: RelationshipDetectionMethod = 'inferred'\n\n // Priority 1: Explicit x-demokit-relationship extension\n target = detectRelationshipFromExtension(property)\n if (target) {\n detectionMethod = 'x-demokit-extension'\n }\n\n // Priority 2: $ref references\n if (!target) {\n target = detectRelationshipFromRef(property, availableModels)\n if (target) {\n detectionMethod = 'explicit-ref'\n }\n }\n\n // Priority 3: Naming conventions\n if (!target) {\n target = detectRelationshipFromNaming(property, availableModels)\n if (target) {\n detectionMethod = 'naming-convention'\n }\n }\n\n if (target) {\n // Don't create self-referential relationships for simple IDs\n if (target.model === modelName && target.field === 'id' && propName === 'id') {\n continue\n }\n\n // Add the detected relationship info to the property\n property.relationshipTo = target\n\n relationships.push({\n from: { model: modelName, field: propName },\n to: target,\n type: determineRelationshipType(property, model),\n required: property.required ?? false,\n detectedBy: detectionMethod,\n })\n }\n }\n }\n\n return relationships\n}\n\n/**\n * Find all relationships for a specific model\n */\nexport function getRelationshipsForModel(\n modelName: string,\n relationships: Relationship[]\n): {\n outgoing: Relationship[]\n incoming: Relationship[]\n} {\n return {\n outgoing: relationships.filter(r => r.from.model === modelName),\n incoming: relationships.filter(r => r.to.model === modelName),\n }\n}\n\n/**\n * Check if a model is referenced by other models\n */\nexport function isModelReferenced(\n modelName: string,\n relationships: Relationship[]\n): boolean {\n return relationships.some(r => r.to.model === modelName)\n}\n\n/**\n * Get the dependency order for models based on relationships\n * Returns models in order such that dependencies come before dependents\n */\nexport function getModelDependencyOrder(\n models: Record<string, DataModel>,\n relationships: Relationship[]\n): string[] {\n const modelNames = Object.keys(models)\n const visited = new Set<string>()\n const order: string[] = []\n\n function visit(name: string, path: Set<string> = new Set()) {\n if (visited.has(name)) return\n if (path.has(name)) {\n // Circular dependency - skip to break the cycle\n return\n }\n\n path.add(name)\n\n // Visit all models that this model depends on first\n const deps = relationships\n .filter(r => r.from.model === name)\n .map(r => r.to.model)\n .filter(dep => modelNames.includes(dep))\n\n for (const dep of deps) {\n visit(dep, new Set(path))\n }\n\n if (!visited.has(name)) {\n visited.add(name)\n order.push(name)\n }\n }\n\n for (const name of modelNames) {\n visit(name)\n }\n\n return order\n}\n","/**\n * OpenAPI 3.x parser for DemoKit\n *\n * Parses OpenAPI specs into DemoKit's internal schema representation\n * with automatic relationship detection.\n *\n * Uses @scalar/openapi-parser - a modern, webpack-compatible parser.\n */\n\nimport { dereference, validate } from '@scalar/openapi-parser'\nimport type { OpenAPI, OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type {\n DemokitSchema,\n SchemaInfo,\n Endpoint,\n DataModel,\n PropertyDef,\n HttpMethod,\n ParameterDef,\n RequestBody,\n ResponseDef,\n PropertyType,\n ModelType,\n} from './types'\nimport { detectRelationships } from './relationships'\n\n// Type aliases for OpenAPI 3.x structures\ntype OpenAPIDocument = OpenAPI.Document\ntype SchemaObject = OpenAPIV3_1.SchemaObject\ntype ReferenceObject = OpenAPIV3_1.ReferenceObject\ntype ParameterObject = OpenAPIV3_1.ParameterObject\ntype RequestBodyObject = OpenAPIV3_1.RequestBodyObject\ntype ResponseObject = OpenAPIV3_1.ResponseObject\ntype MediaTypeObject = OpenAPIV3_1.MediaTypeObject\n\n/**\n * Options for parsing OpenAPI specs\n */\nexport interface ParseOptions {\n /**\n * Whether to dereference all $ref pointers\n * @default true\n */\n dereference?: boolean\n\n /**\n * Whether to detect relationships automatically\n * @default true\n */\n detectRelationships?: boolean\n\n /**\n * Whether to include response schemas in models\n * @default true\n */\n includeResponses?: boolean\n}\n\n/**\n * Parse an OpenAPI spec from a file path or URL\n */\nexport async function parseOpenAPIFromPath(\n pathOrUrl: string,\n options: ParseOptions = {}\n): Promise<DemokitSchema> {\n // Fetch the content\n const response = await fetch(pathOrUrl)\n if (!response.ok) {\n throw new Error(`Failed to fetch OpenAPI spec from ${pathOrUrl}: ${response.statusText}`)\n }\n\n const content = await response.text()\n return parseOpenAPIFromString(content, options)\n}\n\n/**\n * Parse an OpenAPI spec from a string (JSON or YAML)\n */\nexport async function parseOpenAPIFromString(\n spec: string,\n options: ParseOptions = {}\n): Promise<DemokitSchema> {\n const { dereference: shouldDereference = true } = options\n\n // First validate the spec\n const validationResult = await validate(spec)\n if (!validationResult.valid) {\n const errorMessages = validationResult.errors?.map(e => e.message).join(', ') || 'Unknown validation error'\n throw new Error(`Invalid OpenAPI specification: ${errorMessages}`)\n }\n\n // Get the dereferenced schema if requested\n let schema: OpenAPIDocument\n if (shouldDereference) {\n const derefResult = await dereference(spec)\n if (derefResult.errors && derefResult.errors.length > 0) {\n const errorMessages = derefResult.errors.map(e => e.message).join(', ')\n throw new Error(`Failed to dereference OpenAPI spec: ${errorMessages}`)\n }\n schema = derefResult.schema as OpenAPIDocument\n } else {\n // Parse without dereferencing - just use the validated result\n schema = validationResult.specification as OpenAPIDocument\n }\n\n return parseOpenAPIDocument(schema, options)\n}\n\n/**\n * Parse an OpenAPI spec from an already-parsed object\n */\nexport async function parseOpenAPIFromObject(\n spec: Record<string, unknown>,\n options: ParseOptions = {}\n): Promise<DemokitSchema> {\n const { dereference: shouldDereference = true } = options\n\n // Validate the object\n const validationResult = await validate(spec)\n if (!validationResult.valid) {\n const errorMessages = validationResult.errors?.map(e => e.message).join(', ') || 'Unknown validation error'\n throw new Error(`Invalid OpenAPI specification: ${errorMessages}`)\n }\n\n // Get the dereferenced schema if requested\n let schema: OpenAPIDocument\n if (shouldDereference) {\n const derefResult = await dereference(spec)\n if (derefResult.errors && derefResult.errors.length > 0) {\n const errorMessages = derefResult.errors.map(e => e.message).join(', ')\n throw new Error(`Failed to dereference OpenAPI spec: ${errorMessages}`)\n }\n schema = derefResult.schema as OpenAPIDocument\n } else {\n schema = validationResult.specification as OpenAPIDocument\n }\n\n return parseOpenAPIDocument(schema, options)\n}\n\n/**\n * Parse an OpenAPI document into DemokitSchema\n */\nfunction parseOpenAPIDocument(\n doc: OpenAPIDocument,\n options: ParseOptions = {}\n): DemokitSchema {\n const { detectRelationships: shouldDetect = true } = options\n\n // Parse info\n const info = parseInfo(doc)\n\n // Parse models from components/schemas\n const models = parseModels(doc)\n\n // Parse endpoints from paths\n const endpoints = parseEndpoints(doc)\n\n // Detect relationships\n const relationships = shouldDetect ? detectRelationships(models) : []\n\n return {\n info,\n endpoints,\n models,\n relationships,\n }\n}\n\n/**\n * Parse API info from the document\n */\nfunction parseInfo(doc: OpenAPIDocument): SchemaInfo {\n const docInfo = (doc as any).info || {}\n const info: SchemaInfo = {\n title: docInfo.title ?? 'Untitled API',\n version: docInfo.version ?? '1.0.0',\n description: docInfo.description,\n }\n\n // Try to extract base URL from servers\n const servers = (doc as any).servers\n if (servers && servers.length > 0 && servers[0]) {\n info.baseUrl = servers[0].url\n }\n\n return info\n}\n\n/**\n * Parse all models from components/schemas\n */\nfunction parseModels(doc: OpenAPIDocument): Record<string, DataModel> {\n const models: Record<string, DataModel> = {}\n\n const components = (doc as any).components\n const schemas = components?.schemas\n if (!schemas) {\n return models\n }\n\n for (const [name, schema] of Object.entries(schemas)) {\n // Skip reference objects (shouldn't happen after dereference)\n if (schema && typeof schema === 'object' && '$ref' in schema) {\n continue\n }\n\n models[name] = parseSchemaToModel(name, schema as SchemaObject)\n }\n\n return models\n}\n\n/**\n * Parse a schema object into a DataModel\n */\nfunction parseSchemaToModel(name: string, schema: SchemaObject): DataModel {\n if (!schema || typeof schema !== 'object') {\n return { name, type: 'object' }\n }\n\n const s = schema as Record<string, unknown>\n const model: DataModel = {\n name,\n type: schemaTypeToModelType(s.type as string | string[] | undefined),\n description: s.description as string | undefined,\n }\n\n // Parse properties for object types\n if (s.type === 'object' || s.properties) {\n model.type = 'object'\n model.properties = {}\n model.required = (s.required as string[]) || []\n\n if (s.properties && typeof s.properties === 'object') {\n for (const [propName, propSchema] of Object.entries(s.properties)) {\n model.properties[propName] = parseProperty(\n propName,\n propSchema as SchemaObject | ReferenceObject,\n model.required.includes(propName)\n )\n }\n }\n\n if (s.additionalProperties !== undefined) {\n if (typeof s.additionalProperties === 'boolean') {\n model.additionalProperties = s.additionalProperties\n } else if (s.additionalProperties && typeof s.additionalProperties === 'object') {\n if ('$ref' in s.additionalProperties) {\n model.additionalProperties = {\n $ref: (s.additionalProperties as ReferenceObject).$ref,\n }\n } else {\n model.additionalProperties = parseSchemaToModel(\n `${name}AdditionalProps`,\n s.additionalProperties as SchemaObject\n )\n }\n }\n }\n }\n\n // Parse array items\n if (s.type === 'array' && s.items) {\n model.type = 'array'\n if (typeof s.items === 'object' && '$ref' in s.items) {\n model.items = { $ref: (s.items as ReferenceObject).$ref }\n } else {\n model.items = parseSchemaToModel(`${name}Item`, s.items as SchemaObject)\n }\n }\n\n // Parse enum values\n if (s.enum) {\n model.enum = s.enum as unknown[]\n }\n\n // Parse example\n if (s.example !== undefined) {\n model.example = s.example\n }\n\n return model\n}\n\n/**\n * Parse a property schema into a PropertyDef\n */\nfunction parseProperty(\n name: string,\n schema: SchemaObject | ReferenceObject,\n required: boolean\n): PropertyDef {\n // Handle $ref\n if (schema && typeof schema === 'object' && '$ref' in schema) {\n return {\n name,\n type: 'object',\n required,\n $ref: schema.$ref,\n }\n }\n\n const s = schema as Record<string, unknown>\n\n const prop: PropertyDef = {\n name,\n type: schemaTypeToPropertyType(s.type as string | string[] | undefined),\n required,\n nullable: s.nullable as boolean | undefined,\n description: s.description as string | undefined,\n format: s.format as string | undefined,\n enum: s.enum as unknown[] | undefined,\n example: s.example,\n default: s.default,\n minimum: s.minimum as number | undefined,\n maximum: s.maximum as number | undefined,\n minLength: s.minLength as number | undefined,\n maxLength: s.maxLength as number | undefined,\n pattern: s.pattern as string | undefined,\n }\n\n // Parse array items\n if (s.type === 'array' && s.items) {\n prop.type = 'array'\n if (typeof s.items === 'object' && '$ref' in s.items) {\n prop.items = { $ref: (s.items as ReferenceObject).$ref }\n } else {\n prop.items = parseSchemaToModel(`${name}Item`, s.items as SchemaObject)\n }\n }\n\n // Check for x-demokit-relationship extension\n const xRelationship = s['x-demokit-relationship']\n if (xRelationship && typeof xRelationship === 'object') {\n prop['x-demokit-relationship'] = xRelationship as { model: string; field: string }\n }\n\n return prop\n}\n\n/**\n * Parse all endpoints from paths\n */\nfunction parseEndpoints(doc: OpenAPIDocument): Endpoint[] {\n const endpoints: Endpoint[] = []\n\n const paths = (doc as any).paths\n if (!paths) {\n return endpoints\n }\n\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']\n\n for (const [path, pathItem] of Object.entries(paths)) {\n if (!pathItem || typeof pathItem !== 'object') continue\n\n for (const method of methods) {\n const operation = (pathItem as Record<string, unknown>)[method.toLowerCase()]\n\n if (!operation || typeof operation !== 'object') continue\n\n endpoints.push(parseEndpoint(method, path, operation as Record<string, unknown>, pathItem as Record<string, unknown>))\n }\n }\n\n return endpoints\n}\n\n/**\n * Parse a single endpoint\n */\nfunction parseEndpoint(\n method: HttpMethod,\n path: string,\n operation: Record<string, unknown>,\n pathItem: Record<string, unknown>\n): Endpoint {\n // Combine path-level and operation-level parameters\n const pathParams: ParameterDef[] = []\n const queryParams: ParameterDef[] = []\n\n const allParams = [\n ...((pathItem.parameters as unknown[]) || []),\n ...((operation.parameters as unknown[]) || []),\n ]\n\n for (const param of allParams) {\n if (!param || typeof param !== 'object') continue\n if ('$ref' in param) continue // Skip refs\n\n const parsed = parseParameter(param as ParameterObject)\n\n if (parsed.in === 'path') {\n pathParams.push(parsed)\n } else if (parsed.in === 'query') {\n queryParams.push(parsed)\n }\n }\n\n // Parse request body\n let requestBody: RequestBody | undefined\n const opRequestBody = operation.requestBody\n if (opRequestBody && typeof opRequestBody === 'object' && !('$ref' in opRequestBody)) {\n requestBody = parseRequestBody(opRequestBody as RequestBodyObject)\n }\n\n // Parse responses\n const responses: Record<string, ResponseDef> = {}\n const opResponses = operation.responses\n if (opResponses && typeof opResponses === 'object') {\n for (const [statusCode, response] of Object.entries(opResponses)) {\n if (!response || typeof response !== 'object') continue\n if ('$ref' in response) continue\n responses[statusCode] = parseResponse(statusCode, response as ResponseObject)\n }\n }\n\n return {\n method,\n path,\n operationId: operation.operationId as string | undefined,\n summary: operation.summary as string | undefined,\n description: operation.description as string | undefined,\n pathParams,\n queryParams,\n requestBody,\n responses,\n tags: (operation.tags as string[]) || [],\n }\n}\n\n/**\n * Parse a parameter object\n */\nfunction parseParameter(param: ParameterObject): ParameterDef {\n const p = param as Record<string, unknown>\n const schema = p.schema as Record<string, unknown> | undefined\n\n return {\n name: p.name as string,\n in: p.in as 'path' | 'query' | 'header' | 'cookie',\n required: (p.required as boolean) ?? false,\n type: schema ? schemaTypeToPropertyType(schema.type as string | string[] | undefined) : 'string',\n format: schema?.format as string | undefined,\n description: p.description as string | undefined,\n example: p.example ?? schema?.example,\n }\n}\n\n/**\n * Parse a request body object\n */\nfunction parseRequestBody(body: RequestBodyObject): RequestBody {\n const b = body as Record<string, unknown>\n const content = b.content as Record<string, unknown> | undefined\n const contentType = Object.keys(content || {})[0] || 'application/json'\n const mediaType = content?.[contentType] as MediaTypeObject | undefined\n\n let schema: RequestBody['schema'] = { name: 'Unknown', type: 'object' }\n\n if (mediaType) {\n const m = mediaType as Record<string, unknown>\n const mediaSchema = m.schema\n if (mediaSchema && typeof mediaSchema === 'object') {\n if ('$ref' in mediaSchema) {\n schema = { $ref: (mediaSchema as ReferenceObject).$ref }\n } else {\n schema = parseSchemaToModel('RequestBody', mediaSchema as SchemaObject)\n }\n }\n }\n\n return {\n contentType,\n schema,\n required: (b.required as boolean) ?? false,\n description: b.description as string | undefined,\n }\n}\n\n/**\n * Parse a response object\n */\nfunction parseResponse(statusCode: string, response: ResponseObject): ResponseDef {\n const r = response as Record<string, unknown>\n const responseDef: ResponseDef = {\n statusCode,\n description: r.description as string | undefined,\n }\n\n const content = r.content as Record<string, unknown> | undefined\n if (content) {\n responseDef.content = {}\n\n for (const [contentType, mediaType] of Object.entries(content)) {\n if (!mediaType || typeof mediaType !== 'object') continue\n\n const m = mediaType as Record<string, unknown>\n const schema = m.schema\n if (schema && typeof schema === 'object') {\n if ('$ref' in schema) {\n responseDef.content[contentType] = {\n $ref: (schema as ReferenceObject).$ref,\n }\n } else {\n responseDef.content[contentType] = parseSchemaToModel(\n `Response${statusCode}`,\n schema as SchemaObject\n )\n }\n }\n }\n }\n\n return responseDef\n}\n\n/**\n * Convert OpenAPI schema type to ModelType\n */\nfunction schemaTypeToModelType(\n type: string | string[] | undefined\n): ModelType {\n if (!type) return 'object'\n if (Array.isArray(type)) return type[0] as ModelType\n return type as ModelType\n}\n\n/**\n * Convert OpenAPI schema type to PropertyType\n */\nfunction schemaTypeToPropertyType(\n type: string | string[] | undefined\n): PropertyType {\n if (!type) return 'object'\n if (Array.isArray(type)) return type[0] as PropertyType\n return type as PropertyType\n}\n","/**\n * Format detection utilities for codebase schema files.\n * Detects which schema format (TypeScript, Zod, Drizzle, Prisma, etc.)\n * a given file or content is written in.\n */\n\nimport type {\n SchemaFormat,\n CodebaseFile,\n FormatDetectionResult,\n FormatDetectionPatterns,\n} from './types'\n\n/**\n * Detection patterns for each schema format.\n */\nexport const FORMAT_PATTERNS: Record<Exclude<SchemaFormat, 'auto'>, FormatDetectionPatterns> = {\n drizzle: {\n pathPatterns: ['**/schema/**/*.ts', '**/db/schema*.ts', '**/drizzle/**/*.ts'],\n contentPatterns: [\n 'pgTable(',\n 'mysqlTable(',\n 'sqliteTable(',\n 'relations(',\n \"from 'drizzle-orm\",\n 'from \"drizzle-orm',\n ],\n extensions: ['.ts'],\n },\n prisma: {\n pathPatterns: ['**/prisma/schema.prisma', '**/schema.prisma', '**/*.prisma'],\n contentPatterns: [\n 'model ',\n 'datasource ',\n 'generator ',\n '@relation(',\n '@id',\n '@unique',\n ],\n extensions: ['.prisma'],\n },\n zod: {\n pathPatterns: ['**/schemas/**/*.ts', '**/schema.ts', '**/validation/**/*.ts'],\n contentPatterns: [\n 'z.object(',\n 'z.string(',\n 'z.number(',\n 'z.boolean(',\n 'z.array(',\n 'z.enum(',\n \"from 'zod'\",\n 'from \"zod\"',\n ],\n extensions: ['.ts', '.tsx'],\n },\n typescript: {\n pathPatterns: ['**/types/**/*.ts', '**/types.ts', '**/models/**/*.ts', '**/interfaces/**/*.ts'],\n contentPatterns: [\n 'interface ',\n 'type ',\n 'export interface',\n 'export type',\n ],\n extensions: ['.ts', '.tsx', '.d.ts'],\n },\n graphql: {\n pathPatterns: ['**/*.graphql', '**/*.gql', '**/schema.graphql'],\n contentPatterns: [\n 'type Query',\n 'type Mutation',\n 'type Subscription',\n 'input ',\n 'enum ',\n 'scalar ',\n ],\n extensions: ['.graphql', '.gql'],\n },\n supabase: {\n pathPatterns: ['**/database.types.ts', '**/supabase.ts', '**/types/supabase.ts'],\n contentPatterns: [\n 'Database',\n 'Tables:',\n 'public:',\n 'Row:',\n 'Insert:',\n 'Update:',\n ],\n extensions: ['.ts'],\n },\n trpc: {\n pathPatterns: ['**/trpc/**/*.ts', '**/routers/**/*.ts', '**/api/trpc/**/*.ts'],\n contentPatterns: [\n 'router(',\n 'publicProcedure',\n 'protectedProcedure',\n '.input(',\n '.output(',\n 't.router',\n \"from '@trpc/server'\",\n ],\n extensions: ['.ts'],\n },\n nextjs: {\n pathPatterns: ['**/app/api/**/*.ts', '**/pages/api/**/*.ts', '**/actions/**/*.ts'],\n contentPatterns: [\n 'NextRequest',\n 'NextResponse',\n '\"use server\"',\n \"'use server'\",\n 'export async function GET',\n 'export async function POST',\n ],\n extensions: ['.ts', '.tsx'],\n },\n openapi: {\n pathPatterns: ['**/openapi.yaml', '**/openapi.json', '**/swagger.yaml', '**/swagger.json', '**/api.yaml'],\n contentPatterns: [\n 'openapi:',\n 'swagger:',\n '\"openapi\":',\n '\"swagger\":',\n 'paths:',\n 'components:',\n ],\n extensions: ['.yaml', '.yml', '.json'],\n },\n}\n\n/**\n * Priority order when multiple formats are detected.\n * Formats earlier in the list take precedence.\n */\nexport const FORMAT_PRIORITY: SchemaFormat[] = [\n 'drizzle', // Explicit ORM relations\n 'prisma', // Explicit ORM relations\n 'graphql', // Explicit type system\n 'supabase', // Generated from database\n 'zod', // Validation schemas\n 'typescript',// Generic types\n 'trpc', // Uses Zod internally\n 'nextjs', // API routes\n 'openapi', // API specs\n]\n\n/**\n * Detect the schema format of a single file.\n */\nexport function detectFormat(file: CodebaseFile): FormatDetectionResult {\n const results: Array<{ format: SchemaFormat; confidence: number; evidence: string[] }> = []\n\n for (const format of FORMAT_PRIORITY) {\n if (format === 'auto') continue\n\n const patterns = FORMAT_PATTERNS[format]\n const evidence: string[] = []\n let confidence = 0\n\n // Check file extension\n const hasMatchingExtension = patterns.extensions.some((ext) =>\n file.path.endsWith(ext)\n )\n\n if (!hasMatchingExtension) {\n continue\n }\n\n // Check content patterns\n for (const pattern of patterns.contentPatterns) {\n if (file.content.includes(pattern)) {\n evidence.push(`Contains \"${pattern}\"`)\n confidence += 0.15\n }\n }\n\n // Check path patterns\n for (const pathPattern of patterns.pathPatterns) {\n if (matchGlobPattern(file.path, pathPattern)) {\n evidence.push(`Path matches \"${pathPattern}\"`)\n confidence += 0.2\n }\n }\n\n if (confidence > 0) {\n results.push({\n format,\n confidence: Math.min(1, confidence),\n evidence,\n })\n }\n }\n\n // Sort by confidence and return best match\n results.sort((a, b) => b.confidence - a.confidence)\n\n if (results.length === 0 || !results[0]) {\n return { format: null, confidence: 0, evidence: [] }\n }\n\n return results[0]\n}\n\n/**\n * Detect the primary schema format from multiple files.\n * Returns the format with highest total confidence.\n */\nexport function detectFormatFromFiles(files: CodebaseFile[]): FormatDetectionResult {\n const formatScores = new Map<SchemaFormat, { confidence: number; evidence: string[] }>()\n\n for (const file of files) {\n const result = detectFormat(file)\n if (result.format) {\n const existing = formatScores.get(result.format) || { confidence: 0, evidence: [] }\n formatScores.set(result.format, {\n confidence: existing.confidence + result.confidence,\n evidence: [...existing.evidence, ...result.evidence.map((e) => `[${file.path}] ${e}`)],\n })\n }\n }\n\n if (formatScores.size === 0) {\n return { format: null, confidence: 0, evidence: [] }\n }\n\n // Find format with highest score\n let bestFormat: SchemaFormat = 'typescript'\n let bestScore = 0\n let bestEvidence: string[] = []\n\n for (const [format, { confidence, evidence }] of formatScores) {\n if (confidence > bestScore) {\n bestFormat = format\n bestScore = confidence\n bestEvidence = evidence\n }\n }\n\n // Normalize confidence to 0-1 range\n const normalizedConfidence = Math.min(1, bestScore / files.length)\n\n return {\n format: bestFormat,\n confidence: normalizedConfidence,\n evidence: bestEvidence,\n }\n}\n\n/**\n * Group files by their detected format.\n */\nexport function groupFilesByFormat(files: CodebaseFile[]): Map<SchemaFormat, CodebaseFile[]> {\n const groups = new Map<SchemaFormat, CodebaseFile[]>()\n\n for (const file of files) {\n const result = detectFormat(file)\n if (result.format && result.confidence > 0.3) {\n const existing = groups.get(result.format) || []\n groups.set(result.format, [...existing, file])\n }\n }\n\n return groups\n}\n\n/**\n * Simple glob pattern matching for file paths.\n * Supports * (any characters except /) and ** (any path segment).\n */\nfunction matchGlobPattern(path: string, pattern: string): boolean {\n // Normalize path separators\n const normalizedPath = path.replace(/\\\\/g, '/')\n\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*\\*/g, '{{GLOBSTAR}}')\n .replace(/\\*/g, '[^/]*')\n .replace(/\\?/g, '[^/]')\n .replace(/{{GLOBSTAR}}/g, '.*')\n .replace(/\\//g, '\\\\/')\n\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(normalizedPath)\n}\n","/**\n * TypeScript interface/type parser.\n * Parses TypeScript interface and type declarations into DemokitSchema.\n *\n * Supports:\n * - interface declarations\n * - type aliases (object types)\n * - enum declarations\n * - Generic types (partial support)\n * - Union/intersection types (partial support)\n * - Array types\n * - Optional properties\n * - JSDoc comments for descriptions\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n PropertyType,\n} from '../types'\nimport type { CodebaseFile, ParseSchemaOptions, ParseResult, ParseWarning } from './types'\nimport { detectRelationships } from '../relationships'\n\n/**\n * Parse TypeScript files containing interface/type definitions.\n */\nexport function parseTypeScript(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const {\n name = 'TypeScript Schema',\n version = '1.0.0',\n detectRelationships: shouldDetectRelationships = true,\n } = options\n\n const models: Record<string, DataModel> = {}\n const warnings: ParseWarning[] = []\n const parsedFiles: string[] = []\n\n for (const file of files) {\n if (!file.path.endsWith('.ts') && !file.path.endsWith('.tsx')) {\n continue\n }\n\n try {\n const fileModels = parseTypeScriptFile(file.content, file.path, warnings)\n for (const model of fileModels) {\n if (models[model.name]) {\n warnings.push({\n code: 'DUPLICATE_MODEL',\n message: `Model \"${model.name}\" already exists, skipping duplicate from ${file.path}`,\n file: file.path,\n })\n } else {\n models[model.name] = model\n }\n }\n parsedFiles.push(file.path)\n } catch (error) {\n warnings.push({\n code: 'PARSE_ERROR',\n message: `Failed to parse ${file.path}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: file.path,\n })\n }\n }\n\n const relationships = shouldDetectRelationships ? detectRelationships(models) : []\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: 'Schema parsed from TypeScript types',\n },\n endpoints: [], // TypeScript types don't define endpoints\n models,\n relationships,\n }\n\n return {\n schema,\n format: 'typescript',\n warnings,\n parsedFiles,\n }\n}\n\n/**\n * Parse a single TypeScript file.\n */\nfunction parseTypeScriptFile(\n content: string,\n filePath: string,\n warnings: ParseWarning[]\n): DataModel[] {\n const models: DataModel[] = []\n\n // Parse interfaces\n const interfaceMatches = content.matchAll(\n /(?:\\/\\*\\*[\\s\\S]*?\\*\\/\\s*)?(export\\s+)?interface\\s+(\\w+)(?:\\s+extends\\s+[\\w,\\s]+)?\\s*\\{([^}]*)\\}/g\n )\n\n for (const match of interfaceMatches) {\n const [fullMatch, , name, body] = match\n\n // Skip if match groups are undefined\n if (!name || !body) continue\n\n const description = extractJSDocDescription(fullMatch || '')\n const properties = parseInterfaceBody(body, filePath, warnings)\n\n models.push({\n name,\n type: 'object',\n description,\n properties,\n required: Object.entries(properties)\n .filter(([, prop]) => prop.required)\n .map(([name]) => name),\n })\n }\n\n // Parse type aliases (object types only)\n const typeMatches = content.matchAll(\n /(?:\\/\\*\\*[\\s\\S]*?\\*\\/\\s*)?(export\\s+)?type\\s+(\\w+)\\s*=\\s*\\{([^}]*)\\}/g\n )\n\n for (const match of typeMatches) {\n const [fullMatch, , name, body] = match\n\n // Skip if match groups are undefined\n if (!name || !body) continue\n\n const description = extractJSDocDescription(fullMatch || '')\n const properties = parseInterfaceBody(body, filePath, warnings)\n\n models.push({\n name,\n type: 'object',\n description,\n properties,\n required: Object.entries(properties)\n .filter(([, prop]) => prop.required)\n .map(([name]) => name),\n })\n }\n\n // Parse enums\n const enumMatches = content.matchAll(\n /(?:\\/\\*\\*[\\s\\S]*?\\*\\/\\s*)?(export\\s+)?enum\\s+(\\w+)\\s*\\{([^}]*)\\}/g\n )\n\n for (const match of enumMatches) {\n const [fullMatch, , name, body] = match\n\n // Skip if match groups are undefined\n if (!name || !body) continue\n\n const description = extractJSDocDescription(fullMatch || '')\n const enumValues = parseEnumBody(body)\n\n models.push({\n name,\n type: 'string',\n description,\n enum: enumValues,\n })\n }\n\n return models\n}\n\n/**\n * Parse the body of an interface or type object.\n */\nfunction parseInterfaceBody(\n body: string,\n filePath: string,\n warnings: ParseWarning[]\n): Record<string, PropertyDef> {\n const properties: Record<string, PropertyDef> = {}\n\n // Match property lines: name?: Type; or name: Type;\n // Also captures JSDoc comments before properties\n const lines = body.split('\\n')\n let currentJSDoc = ''\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Collect JSDoc comments\n if (trimmed.startsWith('/**') || trimmed.startsWith('*') || trimmed.startsWith('//')) {\n currentJSDoc += trimmed + '\\n'\n continue\n }\n\n // Match property declaration\n const propMatch = trimmed.match(\n /^(\\w+)(\\?)?:\\s*(.+?)\\s*;?\\s*$/\n )\n\n if (propMatch) {\n const [, propName, optional, typeStr] = propMatch\n\n // Skip if match groups are undefined\n if (!propName || !typeStr) continue\n\n const isRequired = !optional\n\n try {\n const { type, format, items, enumValues, nullable } = parseTypeString(typeStr)\n\n properties[propName] = {\n name: propName,\n type,\n required: isRequired,\n nullable,\n description: extractJSDocDescription(currentJSDoc),\n format,\n items,\n enum: enumValues,\n }\n } catch (error) {\n warnings.push({\n code: 'PROPERTY_PARSE_ERROR',\n message: `Could not parse property \"${propName}\": ${typeStr}`,\n file: filePath,\n })\n }\n\n currentJSDoc = ''\n }\n }\n\n return properties\n}\n\n/**\n * Parse a TypeScript type string into PropertyDef fields.\n */\nfunction parseTypeString(typeStr: string): {\n type: PropertyType\n format?: string\n items?: { $ref: string } | DataModel\n enumValues?: unknown[]\n nullable: boolean\n} {\n const trimmed = typeStr.trim()\n\n // Handle nullable types (Type | null or Type | undefined)\n const nullable = /\\|\\s*(null|undefined)/.test(trimmed)\n const withoutNull = trimmed.replace(/\\|\\s*(null|undefined)/g, '').trim()\n\n // Handle array types: Type[] or Array<Type>\n const arrayMatch = withoutNull.match(/^(.+)\\[\\]$/) || withoutNull.match(/^Array<(.+)>$/)\n if (arrayMatch && arrayMatch[1]) {\n const innerType = arrayMatch[1].trim()\n const { type: itemType } = parseTypeString(innerType)\n\n // If the inner type looks like a model reference (PascalCase), use $ref\n if (isPascalCase(innerType) && !isPrimitiveType(innerType)) {\n return {\n type: 'array',\n items: { $ref: innerType },\n nullable,\n }\n }\n\n return {\n type: 'array',\n items: {\n name: 'items',\n type: itemType,\n properties: {},\n },\n nullable,\n }\n }\n\n // Handle string literal unions as enums\n const stringLiteralMatch = withoutNull.match(/^(['\"][^'\"]+['\"]\\s*\\|\\s*)+['\"][^'\"]+['\"]$/)\n if (stringLiteralMatch) {\n const values = withoutNull\n .split('|')\n .map((v) => v.trim().replace(/^['\"]|['\"]$/g, ''))\n\n return {\n type: 'string',\n enumValues: values,\n nullable,\n }\n }\n\n // Handle primitive types\n const primitiveMap: Record<string, { type: PropertyType; format?: string }> = {\n string: { type: 'string' },\n number: { type: 'number' },\n boolean: { type: 'boolean' },\n bigint: { type: 'integer' },\n Date: { type: 'string', format: 'date-time' },\n // Common utility types\n uuid: { type: 'string', format: 'uuid' },\n email: { type: 'string', format: 'email' },\n }\n\n const primitive = primitiveMap[withoutNull]\n if (primitive) {\n return { ...primitive, nullable }\n }\n\n // Handle 'any', 'unknown', 'object' as generic object\n if (['any', 'unknown', 'object', 'Record<string, unknown>', 'Record<string, any>'].includes(withoutNull)) {\n return { type: 'object', nullable }\n }\n\n // Handle 'void', 'never', 'undefined' as null\n if (['void', 'never', 'undefined'].includes(withoutNull)) {\n return { type: 'null', nullable: true }\n }\n\n // Assume it's a reference to another model (PascalCase identifier)\n if (isPascalCase(withoutNull) && /^\\w+$/.test(withoutNull)) {\n // Return as object with $ref hint (relationship detection will pick this up)\n return {\n type: 'object',\n format: `ref:${withoutNull}`,\n nullable,\n }\n }\n\n // Default to string for unknown types\n return { type: 'string', nullable }\n}\n\n/**\n * Parse enum body into array of values.\n */\nfunction parseEnumBody(body: string): unknown[] {\n const values: unknown[] = []\n\n // Match enum members: Name = 'value', Name = 123, or just Name\n const memberMatches = body.matchAll(\n /(\\w+)\\s*(?:=\\s*(['\"]([^'\"]+)['\"]|(\\d+)))?\\s*,?/g\n )\n\n for (const match of memberMatches) {\n const [, name, , stringValue, numValue] = match\n\n if (stringValue !== undefined) {\n values.push(stringValue)\n } else if (numValue !== undefined) {\n values.push(parseInt(numValue, 10))\n } else if (name !== undefined) {\n values.push(name)\n }\n }\n\n return values\n}\n\n/**\n * Extract description from JSDoc comment.\n */\nfunction extractJSDocDescription(text: string): string | undefined {\n // Match /** ... */ comments\n const jsdocMatch = text.match(/\\/\\*\\*\\s*([\\s\\S]*?)\\s*\\*\\//)\n if (jsdocMatch && jsdocMatch[1]) {\n const content = jsdocMatch[1]\n .split('\\n')\n .map((line) => line.replace(/^\\s*\\*\\s?/, '').trim())\n .filter((line) => !line.startsWith('@')) // Exclude @tags\n .join(' ')\n .trim()\n\n return content || undefined\n }\n\n // Match // comments\n const lineCommentMatch = text.match(/\\/\\/\\s*(.+)/)\n if (lineCommentMatch && lineCommentMatch[1]) {\n return lineCommentMatch[1].trim()\n }\n\n return undefined\n}\n\n/**\n * Check if a string is PascalCase (likely a type/interface name).\n */\nfunction isPascalCase(str: string): boolean {\n return /^[A-Z][a-zA-Z0-9]*$/.test(str)\n}\n\n/**\n * Check if a type string is a primitive TypeScript type.\n */\nfunction isPrimitiveType(type: string): boolean {\n return ['string', 'number', 'boolean', 'bigint', 'symbol', 'null', 'undefined', 'void', 'never', 'any', 'unknown'].includes(type)\n}\n","/**\n * Zod schema parser.\n * Parses Zod validation schemas into DemokitSchema.\n *\n * Supports:\n * - z.object() schemas\n * - z.string(), z.number(), z.boolean() primitives\n * - z.array() and z.tuple()\n * - z.enum() and z.nativeEnum()\n * - z.optional(), z.nullable()\n * - z.union(), z.intersection()\n * - z.lazy() for recursive types\n * - .describe() for descriptions\n * - .default() values\n * - String validations (.email(), .uuid(), .url(), etc.)\n * - Number validations (.min(), .max(), .int())\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n PropertyType,\n} from '../types'\nimport type { CodebaseFile, ParseSchemaOptions, ParseResult, ParseWarning } from './types'\nimport { detectRelationships } from '../relationships'\n\n/**\n * Parse Zod schema files into DemokitSchema.\n */\nexport function parseZod(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const {\n name = 'Zod Schema',\n version = '1.0.0',\n detectRelationships: shouldDetectRelationships = true,\n } = options\n\n const models: Record<string, DataModel> = {}\n const warnings: ParseWarning[] = []\n const parsedFiles: string[] = []\n\n for (const file of files) {\n if (!file.path.endsWith('.ts') && !file.path.endsWith('.tsx')) {\n continue\n }\n\n // Check if file contains Zod imports\n if (!file.content.includes(\"from 'zod'\") && !file.content.includes('from \"zod\"')) {\n continue\n }\n\n try {\n const fileModels = parseZodFile(file.content, file.path, warnings)\n for (const model of fileModels) {\n if (models[model.name]) {\n warnings.push({\n code: 'DUPLICATE_MODEL',\n message: `Model \"${model.name}\" already exists, skipping duplicate from ${file.path}`,\n file: file.path,\n })\n } else {\n models[model.name] = model\n }\n }\n parsedFiles.push(file.path)\n } catch (error) {\n warnings.push({\n code: 'PARSE_ERROR',\n message: `Failed to parse ${file.path}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: file.path,\n })\n }\n }\n\n const relationships = shouldDetectRelationships ? detectRelationships(models) : []\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: 'Schema parsed from Zod validation schemas',\n },\n endpoints: [],\n models,\n relationships,\n }\n\n return {\n schema,\n format: 'zod',\n warnings,\n parsedFiles,\n }\n}\n\n/**\n * Parse a single Zod file.\n */\nfunction parseZodFile(\n content: string,\n filePath: string,\n warnings: ParseWarning[]\n): DataModel[] {\n const models: DataModel[] = []\n\n // Find all exported Zod schema definitions\n // Pattern: export const SchemaName = z.object({ ... })\n const schemaMatches = content.matchAll(\n /(?:\\/\\*\\*[\\s\\S]*?\\*\\/\\s*)?(export\\s+)?(?:const|let)\\s+(\\w+)(?:Schema|Type)?\\s*=\\s*(z\\.[\\s\\S]+?)(?=\\n\\n|\\nexport|\\nconst|\\nlet|\\nfunction|\\nclass|$)/g\n )\n\n for (const match of schemaMatches) {\n const [fullMatch, , rawName, zodExpr] = match\n\n // Skip if match groups are undefined\n if (!rawName || !zodExpr) continue\n\n // Clean up the name (remove Schema/Type suffix for model name)\n const name = rawName.replace(/(Schema|Type)$/, '')\n\n // Skip if not a z.object (we only care about object schemas for models)\n if (!zodExpr.trim().startsWith('z.object(')) {\n // But still try to parse enums\n if (zodExpr.trim().startsWith('z.enum(')) {\n const enumModel = parseZodEnum(name, zodExpr, fullMatch || '')\n if (enumModel) {\n models.push(enumModel)\n }\n }\n continue\n }\n\n try {\n const description = extractJSDocDescription(fullMatch || '')\n const properties = parseZodObject(zodExpr, filePath, warnings)\n\n models.push({\n name,\n type: 'object',\n description,\n properties,\n required: Object.entries(properties)\n .filter(([, prop]) => prop.required)\n .map(([name]) => name),\n })\n } catch (error) {\n warnings.push({\n code: 'SCHEMA_PARSE_ERROR',\n message: `Could not parse schema \"${name}\": ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: filePath,\n })\n }\n }\n\n return models\n}\n\n/**\n * Parse z.object({ ... }) into properties.\n */\nfunction parseZodObject(\n zodExpr: string,\n filePath: string,\n warnings: ParseWarning[]\n): Record<string, PropertyDef> {\n const properties: Record<string, PropertyDef> = {}\n\n // Extract the object body from z.object({ ... })\n const objectMatch = zodExpr.match(/z\\.object\\(\\s*\\{([\\s\\S]*?)\\}\\s*\\)/)\n if (!objectMatch || !objectMatch[1]) {\n return properties\n }\n\n const objectBody = objectMatch[1]\n\n // Parse each property\n // Pattern: propertyName: z.string().optional().describe(\"...\")\n const propMatches = objectBody.matchAll(\n /(\\w+)\\s*:\\s*(z\\.[\\s\\S]+?)(?=,\\s*\\n\\s*\\w+\\s*:|,?\\s*\\}\\s*\\)|$)/g\n )\n\n for (const match of propMatches) {\n const [, propName, zodType] = match\n\n // Skip if match groups are undefined\n if (!propName || !zodType) continue\n\n try {\n const propDef = parseZodType(propName, zodType.trim())\n properties[propName] = propDef\n } catch (error) {\n warnings.push({\n code: 'PROPERTY_PARSE_ERROR',\n message: `Could not parse property \"${propName}\" in ${filePath}`,\n file: filePath,\n })\n }\n }\n\n return properties\n}\n\n/**\n * Parse a Zod type expression into a PropertyDef.\n */\nfunction parseZodType(name: string, zodType: string): PropertyDef {\n let type: PropertyType = 'string'\n let format: string | undefined\n let nullable = false\n let required = true\n let description: string | undefined\n let defaultValue: unknown\n let enumValues: unknown[] | undefined\n let minimum: number | undefined\n let maximum: number | undefined\n let minLength: number | undefined\n let maxLength: number | undefined\n let pattern: string | undefined\n let items: { $ref: string } | DataModel | undefined\n\n // Check for .optional()\n if (zodType.includes('.optional()')) {\n required = false\n }\n\n // Check for .nullable()\n if (zodType.includes('.nullable()') || zodType.includes('.nullish()')) {\n nullable = true\n required = false\n }\n\n // Extract .describe(\"...\")\n const describeMatch = zodType.match(/\\.describe\\(\\s*(['\"`])([\\s\\S]*?)\\1\\s*\\)/)\n if (describeMatch) {\n description = describeMatch[2]\n }\n\n // Extract .default(...)\n const defaultMatch = zodType.match(/\\.default\\(\\s*(.+?)\\s*\\)/)\n if (defaultMatch && defaultMatch[1]) {\n try {\n // Try to parse the default value\n defaultValue = parseDefaultValue(defaultMatch[1])\n } catch {\n // Ignore parse errors for defaults\n }\n }\n\n // Determine the base type\n if (zodType.startsWith('z.string(')) {\n type = 'string'\n\n // Check for string format methods\n if (zodType.includes('.email()')) format = 'email'\n else if (zodType.includes('.uuid()')) format = 'uuid'\n else if (zodType.includes('.url()')) format = 'uri'\n else if (zodType.includes('.datetime()')) format = 'date-time'\n else if (zodType.includes('.date()')) format = 'date'\n else if (zodType.includes('.ip()')) format = 'ipv4'\n\n // Extract length constraints\n const minMatch = zodType.match(/\\.min\\(\\s*(\\d+)/)\n if (minMatch && minMatch[1]) minLength = parseInt(minMatch[1], 10)\n\n const maxMatch = zodType.match(/\\.max\\(\\s*(\\d+)/)\n if (maxMatch && maxMatch[1]) maxLength = parseInt(maxMatch[1], 10)\n\n const regexMatch = zodType.match(/\\.regex\\(\\s*\\/(.+?)\\//)\n if (regexMatch && regexMatch[1]) pattern = regexMatch[1]\n } else if (zodType.startsWith('z.number(')) {\n type = 'number'\n\n if (zodType.includes('.int()')) type = 'integer'\n\n const minMatch = zodType.match(/\\.min\\(\\s*(-?\\d+(?:\\.\\d+)?)/)\n if (minMatch && minMatch[1]) minimum = parseFloat(minMatch[1])\n\n const maxMatch = zodType.match(/\\.max\\(\\s*(-?\\d+(?:\\.\\d+)?)/)\n if (maxMatch && maxMatch[1]) maximum = parseFloat(maxMatch[1])\n\n const gteMatch = zodType.match(/\\.gte\\(\\s*(-?\\d+(?:\\.\\d+)?)/)\n if (gteMatch && gteMatch[1]) minimum = parseFloat(gteMatch[1])\n\n const lteMatch = zodType.match(/\\.lte\\(\\s*(-?\\d+(?:\\.\\d+)?)/)\n if (lteMatch && lteMatch[1]) maximum = parseFloat(lteMatch[1])\n } else if (zodType.startsWith('z.boolean(')) {\n type = 'boolean'\n } else if (zodType.startsWith('z.bigint(')) {\n type = 'integer'\n } else if (zodType.startsWith('z.date(')) {\n type = 'string'\n format = 'date-time'\n } else if (zodType.startsWith('z.array(')) {\n type = 'array'\n // Extract item type\n const itemMatch = zodType.match(/z\\.array\\(\\s*(z\\.\\w+(?:\\([^)]*\\))?(?:\\.[^)]+\\))?)/)\n if (itemMatch && itemMatch[1]) {\n const itemType = parseZodType('items', itemMatch[1])\n items = {\n name: 'items',\n type: itemType.type,\n properties: {},\n }\n }\n } else if (zodType.startsWith('z.enum(')) {\n type = 'string'\n const enumMatch = zodType.match(/z\\.enum\\(\\s*\\[\\s*([\\s\\S]*?)\\s*\\]\\s*\\)/)\n if (enumMatch && enumMatch[1]) {\n enumValues = enumMatch[1]\n .split(',')\n .map((v) => v.trim().replace(/^['\"]|['\"]$/g, ''))\n .filter(Boolean)\n }\n } else if (zodType.startsWith('z.literal(')) {\n type = 'string'\n const literalMatch = zodType.match(/z\\.literal\\(\\s*(['\"`])(.+?)\\1\\s*\\)/)\n if (literalMatch && literalMatch[2]) {\n enumValues = [literalMatch[2]]\n }\n } else if (zodType.startsWith('z.object(')) {\n type = 'object'\n } else if (zodType.startsWith('z.record(')) {\n type = 'object'\n } else if (zodType.startsWith('z.union(') || zodType.startsWith('z.or(')) {\n // For unions, try to detect if it's a string enum-like union\n type = 'string'\n } else if (zodType.startsWith('z.null(') || zodType.startsWith('z.undefined()')) {\n type = 'null'\n nullable = true\n } else if (zodType.startsWith('z.any(') || zodType.startsWith('z.unknown()')) {\n type = 'object'\n } else if (zodType.startsWith('z.lazy(')) {\n // Lazy types are usually recursive references\n type = 'object'\n const lazyMatch = zodType.match(/z\\.lazy\\(\\s*\\(\\)\\s*=>\\s*(\\w+)/)\n if (lazyMatch && lazyMatch[1]) {\n format = `ref:${lazyMatch[1].replace(/(Schema|Type)$/, '')}`\n }\n } else {\n // Check if it's a reference to another schema\n const refMatch = zodType.match(/^(\\w+)(Schema|Type)?(?:\\.|$)/)\n if (refMatch && refMatch[1]) {\n type = 'object'\n format = `ref:${refMatch[1].replace(/(Schema|Type)$/, '')}`\n }\n }\n\n return {\n name,\n type,\n format,\n required,\n nullable,\n description,\n default: defaultValue,\n enum: enumValues,\n minimum,\n maximum,\n minLength,\n maxLength,\n pattern,\n items,\n }\n}\n\n/**\n * Parse a Zod enum into a DataModel.\n */\nfunction parseZodEnum(\n name: string,\n zodExpr: string,\n fullMatch: string\n): DataModel | null {\n const enumMatch = zodExpr.match(/z\\.enum\\(\\s*\\[\\s*([\\s\\S]*?)\\s*\\]\\s*\\)/)\n if (!enumMatch || !enumMatch[1]) return null\n\n const values = enumMatch[1]\n .split(',')\n .map((v) => v.trim().replace(/^['\"]|['\"]$/g, ''))\n .filter(Boolean)\n\n return {\n name,\n type: 'string',\n description: extractJSDocDescription(fullMatch),\n enum: values,\n }\n}\n\n/**\n * Parse a default value from Zod.\n */\nfunction parseDefaultValue(valueStr: string): unknown {\n const trimmed = valueStr.trim()\n\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n if (trimmed === 'null') return null\n if (trimmed === 'undefined') return undefined\n\n // Try parsing as number\n const num = parseFloat(trimmed)\n if (!isNaN(num)) return num\n\n // Try parsing as string literal\n const strMatch = trimmed.match(/^['\"`](.*)['\"`]$/)\n if (strMatch) return strMatch[1]\n\n // Try parsing as array\n if (trimmed.startsWith('[')) {\n try {\n return JSON.parse(trimmed)\n } catch {\n return trimmed\n }\n }\n\n return trimmed\n}\n\n/**\n * Extract description from JSDoc comment.\n */\nfunction extractJSDocDescription(text: string): string | undefined {\n const jsdocMatch = text.match(/\\/\\*\\*\\s*([\\s\\S]*?)\\s*\\*\\//)\n if (jsdocMatch && jsdocMatch[1]) {\n const content = jsdocMatch[1]\n .split('\\n')\n .map((line) => line.replace(/^\\s*\\*\\s?/, '').trim())\n .filter((line) => !line.startsWith('@'))\n .join(' ')\n .trim()\n\n return content || undefined\n }\n\n return undefined\n}\n","/**\n * Drizzle ORM schema parser.\n * Parses Drizzle table definitions and relations into DemokitSchema.\n *\n * Supports:\n * - pgTable(), mysqlTable(), sqliteTable() definitions\n * - Column types (text, integer, boolean, uuid, timestamp, etc.)\n * - Primary keys, foreign keys, unique constraints\n * - relations() function for explicit relationships\n * - Default values\n * - Nullable columns\n *\n * This parser extracts high-fidelity relationship information\n * since Drizzle uses explicit relations() declarations.\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n PropertyType,\n Relationship,\n RelationshipType,\n} from '../types'\nimport type { CodebaseFile, ParseSchemaOptions, ParseResult, ParseWarning } from './types'\nimport { detectRelationships } from '../relationships'\n\n/**\n * Parse Drizzle schema files into DemokitSchema.\n */\nexport function parseDrizzle(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const {\n name = 'Drizzle Schema',\n version = '1.0.0',\n detectRelationships: shouldDetectRelationships = true,\n inferRelationships = true,\n } = options\n\n const models: Record<string, DataModel> = {}\n const explicitRelationships: Relationship[] = []\n const warnings: ParseWarning[] = []\n const parsedFiles: string[] = []\n\n for (const file of files) {\n if (!file.path.endsWith('.ts')) {\n continue\n }\n\n // Check if file contains Drizzle imports\n if (!file.content.includes('drizzle-orm')) {\n continue\n }\n\n try {\n const { tables, relations } = parseDrizzleFile(file.content, file.path, warnings)\n\n for (const model of tables) {\n if (models[model.name]) {\n warnings.push({\n code: 'DUPLICATE_MODEL',\n message: `Model \"${model.name}\" already exists, skipping duplicate from ${file.path}`,\n file: file.path,\n })\n } else {\n models[model.name] = model\n }\n }\n\n explicitRelationships.push(...relations)\n parsedFiles.push(file.path)\n } catch (error) {\n warnings.push({\n code: 'PARSE_ERROR',\n message: `Failed to parse ${file.path}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: file.path,\n })\n }\n }\n\n // Combine explicit relationships with inferred ones\n let allRelationships = [...explicitRelationships]\n\n if (shouldDetectRelationships && inferRelationships) {\n const inferred = detectRelationships(models)\n // Only add inferred relationships that don't conflict with explicit ones\n for (const rel of inferred) {\n const exists = explicitRelationships.some(\n (r) =>\n r.from.model === rel.from.model &&\n r.from.field === rel.from.field &&\n r.to.model === rel.to.model\n )\n if (!exists) {\n allRelationships.push(rel)\n }\n }\n }\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: 'Schema parsed from Drizzle ORM definitions',\n },\n endpoints: [],\n models,\n relationships: allRelationships,\n }\n\n return {\n schema,\n format: 'drizzle',\n warnings,\n parsedFiles,\n }\n}\n\n/**\n * Parse a single Drizzle file.\n */\nfunction parseDrizzleFile(\n content: string,\n filePath: string,\n warnings: ParseWarning[]\n): { tables: DataModel[]; relations: Relationship[] } {\n const tables: DataModel[] = []\n const relations: Relationship[] = []\n\n // Parse table definitions\n // Pattern: export const tableName = pgTable('table_name', { ... })\n const tableMatches = content.matchAll(\n /(?:\\/\\*\\*[\\s\\S]*?\\*\\/\\s*)?(export\\s+)?(?:const|let)\\s+(\\w+)\\s*=\\s*(pgTable|mysqlTable|sqliteTable)\\(\\s*['\"](\\w+)['\"]\\s*,\\s*\\{([\\s\\S]*?)\\}\\s*(?:,\\s*\\([^)]*\\)\\s*=>\\s*\\([\\s\\S]*?\\)\\s*)?\\)/g\n )\n\n for (const match of tableMatches) {\n const [fullMatch, , varName, , , columnsBody] = match\n\n // Skip if required match groups are undefined\n if (!varName || !columnsBody) continue\n\n const description = extractJSDocDescription(fullMatch || '')\n\n try {\n const { properties, required } = parseColumnsBody(columnsBody)\n\n // Use PascalCase version of variable name as model name\n const modelName = toPascalCase(varName)\n\n tables.push({\n name: modelName,\n type: 'object',\n description,\n properties,\n required,\n })\n } catch (error) {\n warnings.push({\n code: 'TABLE_PARSE_ERROR',\n message: `Could not parse table \"${varName}\": ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: filePath,\n })\n }\n }\n\n // Parse relations definitions\n // Pattern: export const tableRelations = relations(table, ({ one, many }) => ({ ... }))\n const relationsMatches = content.matchAll(\n /(?:export\\s+)?(?:const|let)\\s+(\\w+)Relations?\\s*=\\s*relations\\(\\s*(\\w+)\\s*,\\s*\\(\\s*\\{\\s*([\\w,\\s]+)\\s*\\}\\s*\\)\\s*=>\\s*\\(\\s*\\{([\\s\\S]*?)\\}\\s*\\)\\s*\\)/g\n )\n\n for (const match of relationsMatches) {\n const [, , sourceTable, , relationsBody] = match\n\n // Skip if required match groups are undefined\n if (!sourceTable || !relationsBody) continue\n\n const sourceModel = toPascalCase(sourceTable)\n\n const parsedRels = parseRelationsBody(relationsBody, sourceModel)\n relations.push(...parsedRels)\n }\n\n return { tables, relations }\n}\n\n/**\n * Parse the columns body of a table definition.\n */\nfunction parseColumnsBody(\n body: string\n): { properties: Record<string, PropertyDef>; required: string[] } {\n const properties: Record<string, PropertyDef> = {}\n const required: string[] = []\n\n // Match column definitions\n // Pattern: columnName: text('column_name').notNull().default(...)\n const columnMatches = body.matchAll(\n /(\\w+)\\s*:\\s*(\\w+)\\(\\s*['\"]?(\\w+)?['\"]?\\s*(?:,\\s*\\{[^}]*\\})?\\s*\\)([\\s\\S]*?)(?=,\\s*\\n\\s*\\w+\\s*:|$)/g\n )\n\n for (const match of columnMatches) {\n const [, propName, columnType, , modifiers] = match\n\n // Skip if required match groups are undefined\n if (!propName || !columnType) continue\n\n const { type, format, nullable, isRequired, defaultValue, enumValues } =\n parseColumnType(columnType, modifiers || '')\n\n properties[propName] = {\n name: propName,\n type,\n format,\n required: isRequired,\n nullable,\n default: defaultValue,\n enum: enumValues,\n }\n\n if (isRequired) {\n required.push(propName)\n }\n }\n\n return { properties, required }\n}\n\n/**\n * Parse a Drizzle column type and modifiers.\n */\nfunction parseColumnType(\n columnType: string,\n modifiers: string\n): {\n type: PropertyType\n format?: string\n nullable: boolean\n isRequired: boolean\n isPrimaryKey: boolean\n defaultValue?: unknown\n enumValues?: unknown[]\n} {\n let type: PropertyType = 'string'\n let format: string | undefined\n let nullable = true\n let isRequired = false\n let isPrimaryKey = false\n let defaultValue: unknown\n let enumValues: unknown[] | undefined\n\n // Parse column type\n switch (columnType.toLowerCase()) {\n case 'text':\n case 'varchar':\n case 'char':\n type = 'string'\n break\n case 'integer':\n case 'int':\n case 'smallint':\n case 'bigint':\n case 'serial':\n case 'smallserial':\n case 'bigserial':\n type = 'integer'\n break\n case 'real':\n case 'doublePrecision':\n case 'double':\n case 'float':\n case 'numeric':\n case 'decimal':\n type = 'number'\n break\n case 'boolean':\n type = 'boolean'\n break\n case 'uuid':\n type = 'string'\n format = 'uuid'\n break\n case 'timestamp':\n case 'timestamptz':\n type = 'string'\n format = 'date-time'\n break\n case 'date':\n type = 'string'\n format = 'date'\n break\n case 'time':\n type = 'string'\n format = 'time'\n break\n case 'json':\n case 'jsonb':\n type = 'object'\n break\n case 'interval':\n type = 'string'\n format = 'duration'\n break\n case 'point':\n case 'line':\n case 'polygon':\n case 'geometry':\n case 'geography':\n type = 'object'\n format = 'geo'\n break\n case 'inet':\n case 'cidr':\n case 'macaddr':\n type = 'string'\n format = 'network'\n break\n case 'bytea':\n type = 'string'\n format = 'byte'\n break\n case 'pgEnum':\n case 'mysqlEnum':\n type = 'string'\n // Try to extract enum values from the call\n const enumMatch = modifiers.match(/\\[\\s*([\\s\\S]*?)\\s*\\]/)\n if (enumMatch && enumMatch[1]) {\n enumValues = enumMatch[1]\n .split(',')\n .map((v) => v.trim().replace(/^['\"]|['\"]$/g, ''))\n .filter(Boolean)\n }\n break\n default:\n type = 'string'\n }\n\n // Parse modifiers\n if (modifiers.includes('.notNull()')) {\n nullable = false\n isRequired = true\n }\n\n if (modifiers.includes('.primaryKey()')) {\n isPrimaryKey = true\n isRequired = true\n nullable = false\n }\n\n if (modifiers.includes('.defaultRandom()')) {\n // UUID default\n defaultValue = undefined // Will be generated\n } else if (modifiers.includes('.defaultNow()')) {\n // Timestamp default\n defaultValue = undefined // Will be current time\n } else {\n // Extract default value\n const defaultMatch = modifiers.match(/\\.default\\(\\s*(.+?)\\s*\\)/)\n if (defaultMatch && defaultMatch[1]) {\n defaultValue = parseDefaultValue(defaultMatch[1])\n }\n }\n\n // Check for references (foreign keys)\n if (modifiers.includes('.references(')) {\n const refMatch = modifiers.match(/\\.references\\(\\s*\\(\\)\\s*=>\\s*(\\w+)\\.(\\w+)/)\n if (refMatch && refMatch[1]) {\n const refTable = refMatch[1]\n format = `ref:${toPascalCase(refTable)}`\n }\n }\n\n return { type, format, nullable, isRequired, isPrimaryKey, defaultValue, enumValues }\n}\n\n/**\n * Parse the body of a relations() definition.\n */\nfunction parseRelationsBody(\n body: string,\n sourceModel: string\n): Relationship[] {\n const relationships: Relationship[] = []\n\n // Match relation definitions\n // Pattern: relationName: one(targetTable, { fields: [...], references: [...] })\n // or: relationName: many(targetTable)\n const relationMatches = body.matchAll(\n /(\\w+)\\s*:\\s*(one|many)\\(\\s*(\\w+)\\s*(?:,\\s*\\{([\\s\\S]*?)\\}\\s*)?\\)/g\n )\n\n for (const match of relationMatches) {\n const [, relationName, relationType, targetTable, options] = match\n\n // Skip if required match groups are undefined\n if (!relationName || !relationType || !targetTable) continue\n\n const targetModel = toPascalCase(targetTable)\n\n let fromField: string = relationName\n let toField: string = 'id'\n const relationshipType: RelationshipType = relationType === 'one' ? 'many-to-one' : 'one-to-many'\n\n // Parse options if present\n if (options) {\n const fieldsMatch = options.match(/fields\\s*:\\s*\\[\\s*(\\w+)\\.(\\w+)\\s*\\]/)\n if (fieldsMatch && fieldsMatch[2]) {\n fromField = fieldsMatch[2]\n }\n\n const referencesMatch = options.match(/references\\s*:\\s*\\[\\s*(\\w+)\\.(\\w+)\\s*\\]/)\n if (referencesMatch && referencesMatch[2]) {\n toField = referencesMatch[2]\n }\n }\n\n relationships.push({\n from: {\n model: sourceModel,\n field: fromField,\n },\n to: {\n model: targetModel,\n field: toField,\n },\n type: relationshipType,\n required: relationType === 'one', // one() relations are typically required\n detectedBy: 'explicit-ref',\n })\n }\n\n return relationships\n}\n\n/**\n * Parse a default value from Drizzle.\n */\nfunction parseDefaultValue(valueStr: string): unknown {\n const trimmed = valueStr.trim()\n\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n if (trimmed === 'null') return null\n\n const num = parseFloat(trimmed)\n if (!isNaN(num)) return num\n\n const strMatch = trimmed.match(/^['\"`](.*)['\"`]$/)\n if (strMatch) return strMatch[1]\n\n return trimmed\n}\n\n/**\n * Extract description from JSDoc comment.\n */\nfunction extractJSDocDescription(text: string): string | undefined {\n const jsdocMatch = text.match(/\\/\\*\\*\\s*([\\s\\S]*?)\\s*\\*\\//)\n if (jsdocMatch && jsdocMatch[1]) {\n const content = jsdocMatch[1]\n .split('\\n')\n .map((line) => line.replace(/^\\s*\\*\\s?/, '').trim())\n .filter((line) => !line.startsWith('@'))\n .join(' ')\n .trim()\n\n return content || undefined\n }\n\n return undefined\n}\n\n/**\n * Convert a variable name to PascalCase.\n */\nfunction toPascalCase(str: string): string {\n // Handle snake_case\n if (str.includes('_')) {\n return str\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('')\n }\n\n // Handle camelCase\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Prisma schema parser.\n * Parses Prisma schema files (.prisma) into DemokitSchema.\n *\n * Supports:\n * - model definitions with fields\n * - Field types (String, Int, Float, Boolean, DateTime, etc.)\n * - @id, @unique, @default attributes\n * - @relation for relationships\n * - Optional fields (?)\n * - Array fields ([])\n * - Enums\n * - @map and @@map for custom names\n *\n * Prisma schemas have explicit relationship definitions,\n * providing high-fidelity relationship detection.\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n PropertyType,\n Relationship,\n} from '../types'\nimport type { CodebaseFile, ParseSchemaOptions, ParseResult, ParseWarning } from './types'\n\n/**\n * Parse Prisma schema files into DemokitSchema.\n */\nexport function parsePrisma(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const {\n name = 'Prisma Schema',\n version = '1.0.0',\n } = options\n\n const models: Record<string, DataModel> = {}\n const relationships: Relationship[] = []\n const warnings: ParseWarning[] = []\n const parsedFiles: string[] = []\n\n for (const file of files) {\n if (!file.path.endsWith('.prisma')) {\n continue\n }\n\n try {\n const { parsedModels, parsedRelations, parsedEnums } = parsePrismaFile(\n file.content,\n file.path,\n warnings\n )\n\n for (const model of parsedModels) {\n if (models[model.name]) {\n warnings.push({\n code: 'DUPLICATE_MODEL',\n message: `Model \"${model.name}\" already exists, skipping duplicate from ${file.path}`,\n file: file.path,\n })\n } else {\n models[model.name] = model\n }\n }\n\n for (const enumModel of parsedEnums) {\n if (models[enumModel.name]) {\n warnings.push({\n code: 'DUPLICATE_ENUM',\n message: `Enum \"${enumModel.name}\" already exists, skipping duplicate from ${file.path}`,\n file: file.path,\n })\n } else {\n models[enumModel.name] = enumModel\n }\n }\n\n relationships.push(...parsedRelations)\n parsedFiles.push(file.path)\n } catch (error) {\n warnings.push({\n code: 'PARSE_ERROR',\n message: `Failed to parse ${file.path}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: file.path,\n })\n }\n }\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: 'Schema parsed from Prisma schema files',\n },\n endpoints: [],\n models,\n relationships,\n }\n\n return {\n schema,\n format: 'prisma',\n warnings,\n parsedFiles,\n }\n}\n\n/**\n * Parse a single Prisma schema file.\n */\nfunction parsePrismaFile(\n content: string,\n filePath: string,\n warnings: ParseWarning[]\n): { parsedModels: DataModel[]; parsedRelations: Relationship[]; parsedEnums: DataModel[] } {\n const parsedModels: DataModel[] = []\n const parsedRelations: Relationship[] = []\n const parsedEnums: DataModel[] = []\n\n // Remove comments for easier parsing\n const cleanContent = removeComments(content)\n\n // Parse enums first (they may be referenced by models)\n const enumMatches = cleanContent.matchAll(\n /enum\\s+(\\w+)\\s*\\{([^}]*)\\}/g\n )\n\n for (const match of enumMatches) {\n const [, enumName, enumBody] = match\n\n // Skip if match groups are undefined\n if (!enumName || !enumBody) continue\n\n const values = enumBody\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('//'))\n\n parsedEnums.push({\n name: enumName,\n type: 'string',\n enum: values,\n })\n }\n\n // Parse model definitions\n const modelMatches = cleanContent.matchAll(\n /model\\s+(\\w+)\\s*\\{([^}]*)\\}/g\n )\n\n for (const match of modelMatches) {\n const [, modelName, modelBody] = match\n\n // Skip if match groups are undefined\n if (!modelName || !modelBody) continue\n\n try {\n const { properties, required, relations } = parseModelBody(\n modelBody,\n modelName\n )\n\n parsedModels.push({\n name: modelName,\n type: 'object',\n properties,\n required,\n })\n\n parsedRelations.push(...relations)\n } catch (error) {\n warnings.push({\n code: 'MODEL_PARSE_ERROR',\n message: `Could not parse model \"${modelName}\": ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: filePath,\n })\n }\n }\n\n return { parsedModels, parsedRelations, parsedEnums }\n}\n\n/**\n * Parse the body of a Prisma model definition.\n */\nfunction parseModelBody(\n body: string,\n modelName: string\n): { properties: Record<string, PropertyDef>; required: string[]; relations: Relationship[] } {\n const properties: Record<string, PropertyDef> = {}\n const required: string[] = []\n const relations: Relationship[] = []\n\n const lines = body.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n // Skip empty lines, comments, and model-level attributes\n if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('@@')) {\n continue\n }\n\n // Parse field: fieldName Type @attributes\n const fieldMatch = trimmed.match(\n /^(\\w+)\\s+([\\w\\[\\]?]+)(?:\\s+(.*))?$/\n )\n\n if (!fieldMatch) {\n continue\n }\n\n const [, fieldName, fieldType, attributes = ''] = fieldMatch\n\n // Skip if required match groups are undefined\n if (!fieldName || !fieldType) continue\n\n // Skip relation fields (they reference other models)\n const isRelationField = isRelationType(fieldType)\n\n if (isRelationField) {\n // Parse the @relation attribute for relationship info\n const relationMatch = attributes.match(\n /@relation\\(\\s*(?:name:\\s*[\"'](\\w+)[\"'],?\\s*)?(?:fields:\\s*\\[([^\\]]+)\\],?\\s*)?(?:references:\\s*\\[([^\\]]+)\\],?\\s*)?\\)/\n )\n\n if (relationMatch) {\n const [, , fields, references] = relationMatch\n const fromField = fields?.trim() || fieldName\n const toField = references?.trim() || 'id'\n const targetModel = fieldType.replace(/[\\[\\]?]/g, '')\n\n relations.push({\n from: {\n model: modelName,\n field: fromField,\n },\n to: {\n model: targetModel,\n field: toField,\n },\n type: fieldType.includes('[]') ? 'one-to-many' : 'many-to-one',\n required: !fieldType.includes('?') && !fieldType.includes('[]'),\n detectedBy: 'explicit-ref',\n })\n }\n\n continue // Don't add relation fields to properties\n }\n\n // Parse the field\n const { type, format, nullable, isRequired, defaultValue, enumValues } =\n parseFieldType(fieldType, attributes)\n\n properties[fieldName] = {\n name: fieldName,\n type,\n format,\n required: isRequired,\n nullable,\n default: defaultValue,\n enum: enumValues,\n }\n\n if (isRequired) {\n required.push(fieldName)\n }\n }\n\n return { properties, required, relations }\n}\n\n/**\n * Parse a Prisma field type and attributes.\n */\nfunction parseFieldType(\n fieldType: string,\n attributes: string\n): {\n type: PropertyType\n format?: string\n nullable: boolean\n isRequired: boolean\n defaultValue?: unknown\n enumValues?: unknown[]\n} {\n let type: PropertyType = 'string'\n let format: string | undefined\n let nullable = false\n let isRequired = true\n let defaultValue: unknown\n const enumValues: unknown[] | undefined = undefined\n\n // Check for optional (?)\n if (fieldType.endsWith('?')) {\n nullable = true\n isRequired = false\n }\n\n // Check for array ([])\n const isArray = fieldType.includes('[]')\n\n // Get base type (remove ? and [])\n const baseType = fieldType.replace(/[\\[\\]?]/g, '')\n\n // Map Prisma types to PropertyType\n switch (baseType) {\n case 'String':\n type = 'string'\n break\n case 'Int':\n case 'BigInt':\n type = 'integer'\n break\n case 'Float':\n case 'Decimal':\n type = 'number'\n break\n case 'Boolean':\n type = 'boolean'\n break\n case 'DateTime':\n type = 'string'\n format = 'date-time'\n break\n case 'Json':\n type = 'object'\n break\n case 'Bytes':\n type = 'string'\n format = 'byte'\n break\n default:\n // Could be an enum or custom type\n type = 'string'\n format = `ref:${baseType}`\n }\n\n // If array, wrap type\n if (isArray) {\n type = 'array'\n }\n\n // Parse attributes\n if (attributes.includes('@id')) {\n isRequired = true\n nullable = false\n }\n\n // Parse @default\n const defaultMatch = attributes.match(/@default\\(([^)]+)\\)/)\n if (defaultMatch && defaultMatch[1]) {\n const defaultStr = defaultMatch[1].trim()\n\n if (defaultStr === 'autoincrement()') {\n // Auto-generated\n defaultValue = undefined\n } else if (defaultStr === 'now()') {\n // Current timestamp\n defaultValue = undefined\n } else if (defaultStr === 'uuid()' || defaultStr === 'cuid()') {\n // Generated ID\n defaultValue = undefined\n } else if (defaultStr === 'true') {\n defaultValue = true\n } else if (defaultStr === 'false') {\n defaultValue = false\n } else if (/^-?\\d+(\\.\\d+)?$/.test(defaultStr)) {\n defaultValue = parseFloat(defaultStr)\n } else if (defaultStr.startsWith('\"') || defaultStr.startsWith(\"'\")) {\n defaultValue = defaultStr.slice(1, -1)\n } else {\n // Could be an enum value\n defaultValue = defaultStr\n }\n }\n\n return { type, format, nullable, isRequired, defaultValue, enumValues }\n}\n\n/**\n * Check if a type is a relation to another model.\n * Relation fields are PascalCase and may have [] or ?.\n */\nfunction isRelationType(type: string): boolean {\n const baseType = type.replace(/[\\[\\]?]/g, '')\n\n // Prisma types are PascalCase\n if (!/^[A-Z]/.test(baseType)) {\n return false\n }\n\n // Built-in Prisma types\n const builtInTypes = [\n 'String', 'Int', 'Float', 'Boolean', 'DateTime',\n 'Json', 'Bytes', 'BigInt', 'Decimal', 'Unsupported',\n ]\n\n return !builtInTypes.includes(baseType)\n}\n\n/**\n * Remove comments from Prisma schema content.\n */\nfunction removeComments(content: string): string {\n // Remove single-line comments\n let result = content.replace(/\\/\\/[^\\n]*/g, '')\n\n // Remove multi-line comments (Prisma uses /// for doc comments)\n result = result.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n\n return result\n}\n","/**\n * GraphQL SDL parser.\n * Parses GraphQL schema files (.graphql, .gql) into DemokitSchema.\n *\n * Supports:\n * - type definitions (type, interface, input, enum)\n * - Field types (String, Int, Float, Boolean, ID, custom types)\n * - Non-null (!) and list ([]) modifiers\n * - Field relationships based on type references\n * - Query, Mutation, and Subscription types\n *\n * GraphQL schemas have explicit type references,\n * providing high-fidelity relationship detection.\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n PropertyType,\n Relationship,\n} from \"../types\";\nimport type {\n CodebaseFile,\n ParseSchemaOptions,\n ParseResult,\n ParseWarning,\n} from \"./types\";\n\n/**\n * Parse GraphQL schema files into DemokitSchema.\n */\nexport function parseGraphQL(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const { name = \"GraphQL Schema\", version = \"1.0.0\" } = options;\n\n const models: Record<string, DataModel> = {};\n const relationships: Relationship[] = [];\n const warnings: ParseWarning[] = [];\n const parsedFiles: string[] = [];\n\n for (const file of files) {\n // Accept .graphql, .gql, and .ts files with SDL strings\n if (!file.path.endsWith(\".graphql\") && !file.path.endsWith(\".gql\")) {\n // Check if it's a .ts file with GraphQL SDL\n if (\n file.path.endsWith(\".ts\") &&\n !file.content.includes(\"type Query\") &&\n !file.content.includes(\"type Mutation\")\n ) {\n continue;\n }\n }\n\n try {\n const { parsedModels, parsedRelations, parsedEnums } = parseGraphQLFile(\n file.content,\n file.path,\n warnings\n );\n\n for (const model of parsedModels) {\n if (models[model.name]) {\n warnings.push({\n code: \"DUPLICATE_TYPE\",\n message: `Type \"${model.name}\" already exists, skipping duplicate from ${file.path}`,\n file: file.path,\n });\n } else {\n models[model.name] = model;\n }\n }\n\n for (const enumModel of parsedEnums) {\n if (models[enumModel.name]) {\n warnings.push({\n code: \"DUPLICATE_ENUM\",\n message: `Enum \"${enumModel.name}\" already exists, skipping duplicate from ${file.path}`,\n file: file.path,\n });\n } else {\n models[enumModel.name] = enumModel;\n }\n }\n\n relationships.push(...parsedRelations);\n parsedFiles.push(file.path);\n } catch (error) {\n warnings.push({\n code: \"PARSE_ERROR\",\n message: `Failed to parse ${file.path}: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n file: file.path,\n });\n }\n }\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: \"Schema parsed from GraphQL SDL files\",\n },\n endpoints: [],\n models,\n relationships,\n };\n\n return {\n schema,\n format: \"graphql\",\n warnings,\n parsedFiles,\n };\n}\n\n/**\n * Parse a single GraphQL file.\n */\nfunction parseGraphQLFile(\n content: string,\n filePath: string,\n warnings: ParseWarning[]\n): {\n parsedModels: DataModel[];\n parsedRelations: Relationship[];\n parsedEnums: DataModel[];\n} {\n const parsedModels: DataModel[] = [];\n const parsedRelations: Relationship[] = [];\n const parsedEnums: DataModel[] = [];\n\n // Remove comments for easier parsing\n const cleanContent = removeComments(content);\n\n // Parse enum definitions\n const enumMatches = cleanContent.matchAll(/enum\\s+(\\w+)\\s*\\{([^}]*)\\}/g);\n\n for (const match of enumMatches) {\n const [, enumName, enumBody] = match;\n\n if (!enumName || !enumBody) continue;\n\n const values = enumBody\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith(\"#\"));\n\n parsedEnums.push({\n name: enumName,\n type: \"string\",\n enum: values,\n });\n }\n\n // Parse type/interface/input definitions\n // Pattern: type TypeName { ... } or type TypeName implements Interface { ... }\n const typeMatches = cleanContent.matchAll(\n /(?:\"\"\"[^\"]*\"\"\"\\s*)?(type|interface|input)\\s+(\\w+)(?:\\s+implements\\s+[\\w\\s&,]+)?\\s*\\{([^}]*)\\}/g\n );\n\n for (const match of typeMatches) {\n const [fullMatch, typeName, typeBody] = match;\n\n if (!typeName || !typeBody) continue;\n\n // Skip special GraphQL types\n if ([\"Query\", \"Mutation\", \"Subscription\"].includes(typeName)) {\n // We could extract endpoint info from these, but for now skip\n continue;\n }\n\n try {\n const description = extractDescription(fullMatch || \"\");\n const { properties, required, relations } = parseTypeBody(\n typeBody,\n typeName\n );\n\n parsedModels.push({\n name: typeName,\n type: \"object\",\n description,\n properties,\n required,\n });\n\n parsedRelations.push(...relations);\n } catch (error) {\n warnings.push({\n code: \"TYPE_PARSE_ERROR\",\n message: `Could not parse type \"${typeName}\": ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n file: filePath,\n });\n }\n }\n\n return { parsedModels, parsedRelations, parsedEnums };\n}\n\n/**\n * Parse the body of a GraphQL type definition.\n */\nfunction parseTypeBody(\n body: string,\n typeName: string\n): {\n properties: Record<string, PropertyDef>;\n required: string[];\n relations: Relationship[];\n} {\n const properties: Record<string, PropertyDef> = {};\n const required: string[] = [];\n const relations: Relationship[] = [];\n\n const lines = body.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines and comments\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n // Parse field: fieldName: Type! or fieldName(args): Type\n // Pattern: fieldName(args)?: Type!\n const fieldMatch = trimmed.match(\n /^(\\w+)(?:\\([^)]*\\))?\\s*:\\s*(.+?)(?:\\s*=\\s*.+)?$/\n );\n\n if (!fieldMatch) {\n continue;\n }\n\n const [, fieldName, fieldType] = fieldMatch;\n\n if (!fieldName || !fieldType) continue;\n\n const { type, format, nullable, isArray, itemType, refType } =\n parseGraphQLType(fieldType.trim());\n\n properties[fieldName] = {\n name: fieldName,\n type: isArray ? \"array\" : type,\n format,\n required: !nullable,\n nullable,\n };\n\n if (isArray && itemType) {\n properties[fieldName].items = { name: itemType, type: \"object\" };\n }\n\n if (!nullable) {\n required.push(fieldName);\n }\n\n // Create relationship if field references another type\n if (refType) {\n relations.push({\n from: {\n model: typeName,\n field: fieldName,\n },\n to: {\n model: refType,\n field: \"id\", // Default to id\n },\n type: isArray ? \"one-to-many\" : \"many-to-one\",\n required: !nullable,\n detectedBy: \"explicit-ref\",\n });\n }\n }\n\n return { properties, required, relations };\n}\n\n/**\n * Parse a GraphQL type string.\n */\nfunction parseGraphQLType(typeStr: string): {\n type: PropertyType;\n format?: string;\n nullable: boolean;\n isArray: boolean;\n itemType?: string;\n refType?: string;\n} {\n let type: PropertyType = \"string\";\n let format: string | undefined;\n let nullable = true;\n let isArray = false;\n let itemType: string | undefined;\n let refType: string | undefined;\n\n let currentType = typeStr.trim();\n\n // Check for non-null modifier\n if (currentType.endsWith(\"!\")) {\n nullable = false;\n currentType = currentType.slice(0, -1).trim();\n }\n\n // Check for list type\n if (currentType.startsWith(\"[\") && currentType.endsWith(\"]\")) {\n isArray = true;\n currentType = currentType.slice(1, -1).trim();\n\n // Check for non-null item\n if (currentType.endsWith(\"!\")) {\n currentType = currentType.slice(0, -1).trim();\n }\n }\n\n // Also handle [Type!]! pattern\n if (currentType.startsWith(\"[\")) {\n isArray = true;\n const innerMatch = currentType.match(/\\[([^\\]!]+)!?\\]!?/);\n if (innerMatch) {\n currentType = innerMatch[1] || currentType;\n }\n }\n\n // Map GraphQL built-in types\n switch (currentType) {\n case \"String\":\n type = \"string\";\n break;\n case \"Int\":\n type = \"integer\";\n break;\n case \"Float\":\n type = \"number\";\n break;\n case \"Boolean\":\n type = \"boolean\";\n break;\n case \"ID\":\n type = \"string\";\n format = \"uuid\";\n break;\n default:\n // Custom type - likely a reference to another model\n if (/^[A-Z]/.test(currentType)) {\n type = \"object\";\n refType = currentType;\n format = `ref:${currentType}`;\n } else {\n type = \"string\";\n }\n }\n\n if (isArray) {\n itemType = currentType;\n }\n\n return { type, format, nullable, isArray, itemType, refType };\n}\n\n/**\n * Remove comments from GraphQL content.\n */\nfunction removeComments(content: string): string {\n // Remove single-line comments\n let result = content.replace(/#[^\\n]*/g, \"\");\n\n // Keep triple-quoted descriptions but process them separately\n // (They're used for documentation)\n\n return result;\n}\n\n/**\n * Extract description from triple-quoted string.\n */\nfunction extractDescription(text: string): string | undefined {\n const descMatch = text.match(/\"\"\"([\\s\\S]*?)\"\"\"/);\n if (descMatch && descMatch[1]) {\n return descMatch[1].trim() || undefined;\n }\n return undefined;\n}\n","/**\n * Supabase generated types parser.\n * Parses Supabase database.types.ts files into DemokitSchema.\n *\n * Supports:\n * - Database interface with Tables property\n * - Tables.*.Row type for each table\n * - Column types mapped from PostgreSQL types\n * - Foreign key relationships from Insert/Update types\n * - Views and Enums\n *\n * Supabase generates types from the database schema,\n * providing accurate type information and relationships.\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n PropertyType,\n Relationship,\n} from '../types'\nimport type { CodebaseFile, ParseSchemaOptions, ParseResult, ParseWarning } from './types'\n\n/**\n * Parse Supabase types files into DemokitSchema.\n */\nexport function parseSupabase(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const {\n name = 'Supabase Schema',\n version = '1.0.0',\n } = options\n\n const models: Record<string, DataModel> = {}\n const relationships: Relationship[] = []\n const warnings: ParseWarning[] = []\n const parsedFiles: string[] = []\n\n for (const file of files) {\n if (!file.path.endsWith('.ts')) {\n continue\n }\n\n // Check for Supabase types patterns\n if (!file.content.includes('Database') ||\n (!file.content.includes('Tables:') && !file.content.includes('Tables: {'))) {\n continue\n }\n\n try {\n const { parsedModels, parsedRelations, parsedEnums } = parseSupabaseFile(\n file.content,\n file.path,\n warnings\n )\n\n for (const model of parsedModels) {\n if (models[model.name]) {\n warnings.push({\n code: 'DUPLICATE_TABLE',\n message: `Table \"${model.name}\" already exists, skipping duplicate from ${file.path}`,\n file: file.path,\n })\n } else {\n models[model.name] = model\n }\n }\n\n for (const enumModel of parsedEnums) {\n if (!models[enumModel.name]) {\n models[enumModel.name] = enumModel\n }\n }\n\n relationships.push(...parsedRelations)\n parsedFiles.push(file.path)\n } catch (error) {\n warnings.push({\n code: 'PARSE_ERROR',\n message: `Failed to parse ${file.path}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: file.path,\n })\n }\n }\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: 'Schema parsed from Supabase generated types',\n },\n endpoints: [],\n models,\n relationships,\n }\n\n return {\n schema,\n format: 'supabase',\n warnings,\n parsedFiles,\n }\n}\n\n/**\n * Parse a single Supabase types file.\n */\nfunction parseSupabaseFile(\n content: string,\n filePath: string,\n warnings: ParseWarning[]\n): { parsedModels: DataModel[]; parsedRelations: Relationship[]; parsedEnums: DataModel[] } {\n const parsedModels: DataModel[] = []\n const parsedRelations: Relationship[] = []\n const parsedEnums: DataModel[] = []\n\n // Find the Tables section\n // Pattern: Tables: { tableName: { Row: { ... }, Insert: { ... }, Update: { ... } } }\n const tablesMatch = content.match(/Tables:\\s*\\{([\\s\\S]*?)\\n\\s*\\}/m)\n\n if (!tablesMatch) {\n // Try alternative format\n const altTablesMatch = content.match(/public:\\s*\\{[\\s\\S]*?Tables:\\s*\\{([\\s\\S]*?)\\n\\s{4}\\}/m)\n if (!altTablesMatch) {\n warnings.push({\n code: 'NO_TABLES_FOUND',\n message: 'Could not find Tables section in Supabase types file',\n file: filePath,\n })\n return { parsedModels, parsedRelations, parsedEnums }\n }\n }\n\n // Parse each table definition\n // Pattern: tableName: { Row: { ... } }\n const tableMatches = content.matchAll(\n /(\\w+):\\s*\\{\\s*Row:\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}/g\n )\n\n for (const match of tableMatches) {\n const [, tableName, rowBody] = match\n\n if (!tableName || !rowBody) continue\n\n // Skip internal Supabase types\n if (tableName.startsWith('_') || tableName === 'Row' || tableName === 'Insert' || tableName === 'Update') {\n continue\n }\n\n try {\n const { properties, required, relations } = parseRowType(\n rowBody,\n toPascalCase(tableName)\n )\n\n parsedModels.push({\n name: toPascalCase(tableName),\n type: 'object',\n description: `Generated from Supabase table: ${tableName}`,\n properties,\n required,\n })\n\n parsedRelations.push(...relations)\n } catch (error) {\n warnings.push({\n code: 'TABLE_PARSE_ERROR',\n message: `Could not parse table \"${tableName}\": ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: filePath,\n })\n }\n }\n\n // Parse Enums section\n const enumsMatch = content.match(/Enums:\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}/m)\n if (enumsMatch && enumsMatch[1]) {\n const enumMatches = enumsMatch[1].matchAll(\n /(\\w+):\\s*([^}\\n]+)/g\n )\n\n for (const match of enumMatches) {\n const [, enumName, enumValues] = match\n if (!enumName || !enumValues) continue\n\n // Parse enum values from the type union\n const values = enumValues\n .split('|')\n .map((v) => v.trim().replace(/^['\"]|['\"]$/g, ''))\n .filter(Boolean)\n\n if (values.length > 0) {\n parsedEnums.push({\n name: enumName,\n type: 'string',\n enum: values,\n })\n }\n }\n }\n\n return { parsedModels, parsedRelations, parsedEnums }\n}\n\n/**\n * Parse the Row type body from a Supabase table.\n */\nfunction parseRowType(\n body: string,\n tableName: string\n): { properties: Record<string, PropertyDef>; required: string[]; relations: Relationship[] } {\n const properties: Record<string, PropertyDef> = {}\n const required: string[] = []\n const relations: Relationship[] = []\n\n // Parse column definitions\n // Pattern: columnName: type | null\n const columnMatches = body.matchAll(\n /(\\w+):\\s*([^;\\n]+?)(?:\\s*\\|?\\s*null)?(?:;|\\n|$)/g\n )\n\n for (const match of columnMatches) {\n const [fullMatch, columnName, columnType] = match\n\n if (!columnName || !columnType) continue\n\n const nullable = fullMatch?.includes('| null') || fullMatch?.includes('|null') || false\n const cleanType = columnType.replace(/\\s*\\|\\s*null\\s*/g, '').trim()\n\n const { type, format } = parseSupabaseType(cleanType)\n\n properties[columnName] = {\n name: columnName,\n type,\n format,\n required: !nullable,\n nullable,\n }\n\n if (!nullable) {\n required.push(columnName)\n }\n\n // Detect foreign key relationships from naming convention\n if (columnName.endsWith('_id') && columnName !== 'id') {\n const refTableName = columnName.slice(0, -3) // Remove '_id'\n relations.push({\n from: {\n model: tableName,\n field: columnName,\n },\n to: {\n model: toPascalCase(refTableName),\n field: 'id',\n },\n type: 'many-to-one',\n required: !nullable,\n detectedBy: 'naming-convention',\n })\n }\n }\n\n return { properties, required, relations }\n}\n\n/**\n * Parse a Supabase/PostgreSQL type string.\n */\nfunction parseSupabaseType(\n typeStr: string\n): { type: PropertyType; format?: string } {\n const cleanType = typeStr.trim()\n\n // Handle common PostgreSQL types from Supabase\n switch (cleanType) {\n case 'string':\n case 'text':\n return { type: 'string' }\n\n case 'number':\n case 'integer':\n case 'bigint':\n case 'smallint':\n return { type: 'integer' }\n\n case 'float':\n case 'double':\n case 'decimal':\n case 'numeric':\n case 'real':\n return { type: 'number' }\n\n case 'boolean':\n case 'bool':\n return { type: 'boolean' }\n\n case 'Date':\n case 'Date | string':\n return { type: 'string', format: 'date-time' }\n\n default:\n // Check for specific patterns\n if (cleanType.includes('Json') || cleanType === 'Json') {\n return { type: 'object' }\n }\n\n if (cleanType.startsWith('Database[')) {\n // Reference to enum or other type\n const refMatch = cleanType.match(/Database\\[\"public\"\\]\\[\"Enums\"\\]\\[\"(\\w+)\"\\]/)\n if (refMatch) {\n return { type: 'string', format: `enum:${refMatch[1]}` }\n }\n }\n\n // Array types\n if (cleanType.endsWith('[]')) {\n return { type: 'array' }\n }\n\n // UUID pattern\n if (cleanType.toLowerCase().includes('uuid')) {\n return { type: 'string', format: 'uuid' }\n }\n\n return { type: 'string' }\n }\n}\n\n/**\n * Convert a snake_case string to PascalCase.\n */\nfunction toPascalCase(str: string): string {\n return str\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('')\n}\n","/**\n * tRPC router parser.\n * Parses tRPC router definitions into DemokitSchema.\n *\n * Supports:\n * - router() definitions with procedure chains\n * - .input() and .output() Zod schemas\n * - publicProcedure and protectedProcedure\n * - Nested routers (appRouter structure)\n *\n * tRPC uses Zod for validation, so this parser extracts\n * Zod schemas and delegates to the Zod parser for details.\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n PropertyType,\n} from '../types'\nimport type { CodebaseFile, ParseSchemaOptions, ParseResult, ParseWarning } from './types'\n\n/**\n * Parse tRPC router files into DemokitSchema.\n */\nexport function parseTRPC(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const {\n name = 'tRPC Schema',\n version = '1.0.0',\n } = options\n\n const models: Record<string, DataModel> = {}\n const warnings: ParseWarning[] = []\n const parsedFiles: string[] = []\n\n for (const file of files) {\n if (!file.path.endsWith('.ts')) {\n continue\n }\n\n // Check for tRPC patterns\n if (!file.content.includes('router(') &&\n !file.content.includes('publicProcedure') &&\n !file.content.includes('protectedProcedure') &&\n !file.content.includes('.input(') &&\n !file.content.includes('.output(')) {\n continue\n }\n\n try {\n const { parsedModels } = parseTRPCFile(\n file.content,\n file.path,\n warnings\n )\n\n for (const model of parsedModels) {\n const existing = models[model.name]\n if (existing) {\n // Merge properties if model already exists\n models[model.name] = mergeModels(existing, model)\n } else {\n models[model.name] = model\n }\n }\n\n parsedFiles.push(file.path)\n } catch (error) {\n warnings.push({\n code: 'PARSE_ERROR',\n message: `Failed to parse ${file.path}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: file.path,\n })\n }\n }\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: 'Schema parsed from tRPC router definitions',\n },\n endpoints: [],\n models,\n relationships: [],\n }\n\n return {\n schema,\n format: 'trpc',\n warnings,\n parsedFiles,\n }\n}\n\n/**\n * Parse a single tRPC router file.\n */\nfunction parseTRPCFile(\n content: string,\n _filePath: string,\n _warnings: ParseWarning[]\n): { parsedModels: DataModel[] } {\n const parsedModels: DataModel[] = []\n\n // Extract .input() schemas\n // Pattern: .input(z.object({ ... })) or .input(schemaName)\n const inputMatches = content.matchAll(\n /\\.input\\(\\s*(z\\.object\\(\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}\\s*\\)|(\\w+))\\s*\\)/g\n )\n\n for (const match of inputMatches) {\n const [fullMatch, , inlineSchema, schemaRef] = match\n\n if (inlineSchema) {\n // Inline z.object schema\n const procedureName = extractProcedureName(content, fullMatch)\n if (procedureName) {\n try {\n const properties = parseZodObjectBody(inlineSchema)\n parsedModels.push({\n name: `${toPascalCase(procedureName)}Input`,\n type: 'object',\n description: `Input schema for ${procedureName} procedure`,\n properties,\n required: Object.keys(properties).filter(\n (k) => properties[k]?.required\n ),\n })\n } catch {\n // Skip if parsing fails\n }\n }\n } else if (schemaRef) {\n // Schema reference - try to find it in the file\n const schemaMatch = content.match(\n new RegExp(`(?:const|let)\\\\s+${schemaRef}\\\\s*=\\\\s*z\\\\.object\\\\(\\\\s*\\\\{([^}]*(?:\\\\{[^}]*\\\\}[^}]*)*)\\\\}\\\\s*\\\\)`)\n )\n if (schemaMatch && schemaMatch[1]) {\n try {\n const properties = parseZodObjectBody(schemaMatch[1])\n parsedModels.push({\n name: toPascalCase(schemaRef),\n type: 'object',\n description: `Schema: ${schemaRef}`,\n properties,\n required: Object.keys(properties).filter(\n (k) => properties[k]?.required\n ),\n })\n } catch {\n // Skip if parsing fails\n }\n }\n }\n }\n\n // Extract .output() schemas\n const outputMatches = content.matchAll(\n /\\.output\\(\\s*(z\\.object\\(\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}\\s*\\)|(\\w+))\\s*\\)/g\n )\n\n for (const match of outputMatches) {\n const [fullMatch, , inlineSchema, schemaRef] = match\n\n if (inlineSchema) {\n const procedureName = extractProcedureName(content, fullMatch)\n if (procedureName) {\n try {\n const properties = parseZodObjectBody(inlineSchema)\n parsedModels.push({\n name: `${toPascalCase(procedureName)}Output`,\n type: 'object',\n description: `Output schema for ${procedureName} procedure`,\n properties,\n required: Object.keys(properties).filter(\n (k) => properties[k]?.required\n ),\n })\n } catch {\n // Skip if parsing fails\n }\n }\n } else if (schemaRef) {\n const schemaMatch = content.match(\n new RegExp(`(?:const|let)\\\\s+${schemaRef}\\\\s*=\\\\s*z\\\\.object\\\\(\\\\s*\\\\{([^}]*(?:\\\\{[^}]*\\\\}[^}]*)*)\\\\}\\\\s*\\\\)`)\n )\n if (schemaMatch && schemaMatch[1]) {\n try {\n const properties = parseZodObjectBody(schemaMatch[1])\n parsedModels.push({\n name: toPascalCase(schemaRef),\n type: 'object',\n description: `Schema: ${schemaRef}`,\n properties,\n required: Object.keys(properties).filter(\n (k) => properties[k]?.required\n ),\n })\n } catch {\n // Skip if parsing fails\n }\n }\n }\n }\n\n // Also find standalone Zod schemas that might be used\n const standaloneSchemas = content.matchAll(\n /(?:export\\s+)?(?:const|let)\\s+(\\w+Schema?)\\s*=\\s*z\\.object\\(\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}\\s*\\)/g\n )\n\n for (const match of standaloneSchemas) {\n const [, schemaName, schemaBody] = match\n if (!schemaName || !schemaBody) continue\n\n // Skip if already parsed\n const modelName = toPascalCase(schemaName.replace(/Schema$/, ''))\n if (parsedModels.some((m) => m.name === modelName)) {\n continue\n }\n\n try {\n const properties = parseZodObjectBody(schemaBody)\n parsedModels.push({\n name: modelName,\n type: 'object',\n description: `Schema: ${schemaName}`,\n properties,\n required: Object.keys(properties).filter(\n (k) => properties[k]?.required\n ),\n })\n } catch {\n // Skip if parsing fails\n }\n }\n\n return { parsedModels }\n}\n\n/**\n * Parse a Zod object body (simplified version for tRPC).\n * Full parsing is delegated to the Zod parser.\n */\nfunction parseZodObjectBody(body: string): Record<string, PropertyDef> {\n const properties: Record<string, PropertyDef> = {}\n\n // Parse property definitions\n // Pattern: propName: z.string().optional()\n const propMatches = body.matchAll(\n /(\\w+)\\s*:\\s*z\\.(\\w+)\\(([^)]*)\\)([^,\\n]*)/g\n )\n\n for (const match of propMatches) {\n const [, propName, zodType, , modifiers] = match\n\n if (!propName || !zodType) continue\n\n const { type, format, nullable, isRequired } = parseZodType(zodType, modifiers || '')\n\n properties[propName] = {\n name: propName,\n type,\n format,\n required: isRequired,\n nullable,\n }\n }\n\n return properties\n}\n\n/**\n * Parse a Zod type and its modifiers.\n */\nfunction parseZodType(\n zodType: string,\n modifiers: string\n): { type: PropertyType; format?: string; nullable: boolean; isRequired: boolean } {\n let type: PropertyType = 'string'\n let format: string | undefined\n let nullable = false\n let isRequired = true\n\n // Map Zod types\n switch (zodType.toLowerCase()) {\n case 'string':\n type = 'string'\n break\n case 'number':\n type = 'number'\n break\n case 'boolean':\n case 'bool':\n type = 'boolean'\n break\n case 'date':\n type = 'string'\n format = 'date-time'\n break\n case 'array':\n type = 'array'\n break\n case 'object':\n type = 'object'\n break\n case 'enum':\n type = 'string'\n break\n case 'uuid':\n type = 'string'\n format = 'uuid'\n break\n default:\n type = 'string'\n }\n\n // Check modifiers\n if (modifiers.includes('.optional()')) {\n isRequired = false\n }\n if (modifiers.includes('.nullable()')) {\n nullable = true\n isRequired = false\n }\n if (modifiers.includes('.nullish()')) {\n nullable = true\n isRequired = false\n }\n if (modifiers.includes('.email()')) {\n format = 'email'\n }\n if (modifiers.includes('.url()')) {\n format = 'uri'\n }\n if (modifiers.includes('.uuid()')) {\n format = 'uuid'\n }\n\n return { type, format, nullable, isRequired }\n}\n\n/**\n * Extract procedure name from context around a match.\n */\nfunction extractProcedureName(content: string, match: string): string | null {\n const matchIndex = content.indexOf(match)\n if (matchIndex === -1) return null\n\n // Look backwards for procedure name\n const before = content.slice(Math.max(0, matchIndex - 200), matchIndex)\n\n // Pattern: procedureName: publicProcedure or procedureName: t.procedure\n const nameMatch = before.match(/(\\w+)\\s*:\\s*(?:public|protected)?[Pp]rocedure/)\n if (nameMatch) {\n return nameMatch[1] || null\n }\n\n return null\n}\n\n/**\n * Merge two models.\n */\nfunction mergeModels(existing: DataModel, incoming: DataModel): DataModel {\n return {\n ...existing,\n properties: {\n ...incoming.properties,\n ...existing.properties,\n },\n required: [\n ...new Set([...(existing.required || []), ...(incoming.required || [])]),\n ],\n }\n}\n\n/**\n * Convert string to PascalCase.\n */\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_](\\w)/g, (_, c) => c.toUpperCase())\n .replace(/^\\w/, (c) => c.toUpperCase())\n}\n","/**\n * Next.js parser.\n * Parses Next.js API routes and Server Actions into DemokitSchema.\n *\n * Supports:\n * - App Router: app/api/[...]/route.ts (GET, POST, PUT, PATCH, DELETE)\n * - Pages Router: pages/api/[...].ts (handler function)\n * - Server Actions: 'use server' directive\n * - TypeScript types for request/response bodies\n * - Zod validation schemas in API routes\n *\n * Extracts endpoint and schema information from Next.js conventions.\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n PropertyType,\n Endpoint,\n HttpMethod,\n} from '../types'\nimport type { CodebaseFile, ParseSchemaOptions, ParseResult, ParseWarning } from './types'\n\n/**\n * Parse Next.js files into DemokitSchema.\n */\nexport function parseNextJS(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const {\n name = 'Next.js API Schema',\n version = '1.0.0',\n } = options\n\n const models: Record<string, DataModel> = {}\n const endpoints: Endpoint[] = []\n const warnings: ParseWarning[] = []\n const parsedFiles: string[] = []\n\n for (const file of files) {\n if (!file.path.endsWith('.ts') && !file.path.endsWith('.tsx')) {\n continue\n }\n\n // Determine file type\n // Check for App Router routes - match /app/api/ or just app/api/ patterns\n const isAppRouterRoute = (file.path.includes('/app/api/') || file.path.startsWith('app/api/')) && file.path.endsWith('route.ts')\n // Check for Pages Router routes\n const isPagesApiRoute = (file.path.includes('/pages/api/') || file.path.startsWith('pages/api/')) && (file.path.endsWith('.ts') || file.path.endsWith('.tsx'))\n const isServerAction = file.content.includes(\"'use server'\") || file.content.includes('\"use server\"')\n\n if (!isAppRouterRoute && !isPagesApiRoute && !isServerAction) {\n continue\n }\n\n try {\n if (isAppRouterRoute) {\n const { parsedModels, parsedEndpoints } = parseAppRouterRoute(\n file.content,\n file.path,\n warnings\n )\n for (const model of parsedModels) {\n if (!models[model.name]) {\n models[model.name] = model\n }\n }\n endpoints.push(...parsedEndpoints)\n } else if (isPagesApiRoute) {\n const { parsedModels, parsedEndpoints } = parsePagesApiRoute(\n file.content,\n file.path,\n warnings\n )\n for (const model of parsedModels) {\n if (!models[model.name]) {\n models[model.name] = model\n }\n }\n endpoints.push(...parsedEndpoints)\n } else if (isServerAction) {\n const { parsedModels, parsedEndpoints } = parseServerActions(\n file.content,\n file.path,\n warnings\n )\n for (const model of parsedModels) {\n if (!models[model.name]) {\n models[model.name] = model\n }\n }\n endpoints.push(...parsedEndpoints)\n }\n\n parsedFiles.push(file.path)\n } catch (error) {\n warnings.push({\n code: 'PARSE_ERROR',\n message: `Failed to parse ${file.path}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n file: file.path,\n })\n }\n }\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: 'Schema parsed from Next.js API routes and Server Actions',\n },\n endpoints,\n models,\n relationships: [],\n }\n\n return {\n schema,\n format: 'nextjs',\n warnings,\n parsedFiles,\n }\n}\n\n/**\n * Parse an App Router route.ts file.\n */\nfunction parseAppRouterRoute(\n content: string,\n filePath: string,\n _warnings: ParseWarning[]\n): { parsedModels: DataModel[]; parsedEndpoints: Endpoint[] } {\n const parsedModels: DataModel[] = []\n const parsedEndpoints: Endpoint[] = []\n\n // Extract API path from file path\n // e.g., app/api/users/[id]/route.ts -> /api/users/{id}\n const apiPath = extractApiPath(filePath)\n\n // Find exported HTTP method handlers\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']\n\n for (const method of methods) {\n // Pattern: export async function GET or export function GET or export const GET\n const hasHandler =\n new RegExp(`export\\\\s+(?:async\\\\s+)?function\\\\s+${method}\\\\s*\\\\(`).test(content) ||\n new RegExp(`export\\\\s+const\\\\s+${method}\\\\s*=`).test(content)\n\n if (hasHandler) {\n // Extract handler body for analysis\n const handlerMatch = content.match(\n new RegExp(`export\\\\s+(?:async\\\\s+)?function\\\\s+${method}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\n\\\\}`, 'm')\n )\n const handlerBody = handlerMatch ? handlerMatch[1] || '' : ''\n\n // Create endpoint\n const endpoint: Endpoint = {\n method,\n path: apiPath,\n operationId: `${method.toLowerCase()}${toPascalCase(apiPath.replace(/[^a-zA-Z0-9]/g, '_'))}`,\n summary: `${method} ${apiPath}`,\n pathParams: extractPathParams(apiPath),\n queryParams: [],\n responses: {},\n tags: extractTags(apiPath),\n }\n\n // Try to extract request body schema for POST/PUT/PATCH\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n const bodySchema = extractRequestBodySchema(content, handlerBody)\n if (bodySchema) {\n const modelName = `${toPascalCase(apiPath.replace(/[^a-zA-Z0-9]/g, ''))}${method}Body`\n parsedModels.push({\n name: modelName,\n type: 'object',\n description: `Request body for ${method} ${apiPath}`,\n properties: bodySchema.properties,\n required: Object.keys(bodySchema.properties).filter(\n (k) => bodySchema.properties[k]?.required\n ),\n })\n\n endpoint.requestBody = {\n contentType: 'application/json',\n schema: { $ref: modelName },\n required: true,\n }\n }\n }\n\n parsedEndpoints.push(endpoint)\n }\n }\n\n // Extract any Zod schemas or TypeScript interfaces\n const schemas = extractSchemas(content)\n parsedModels.push(...schemas)\n\n return { parsedModels, parsedEndpoints }\n}\n\n/**\n * Parse a Pages Router API route.\n */\nfunction parsePagesApiRoute(\n content: string,\n filePath: string,\n _warnings: ParseWarning[]\n): { parsedModels: DataModel[]; parsedEndpoints: Endpoint[] } {\n const parsedModels: DataModel[] = []\n const parsedEndpoints: Endpoint[] = []\n\n // Extract API path\n const apiPath = extractPagesApiPath(filePath)\n\n // Pages Router uses a default export handler\n const hasDefaultHandler = content.includes('export default')\n\n if (hasDefaultHandler) {\n // Check which methods are handled\n const methods: HttpMethod[] = []\n if (content.includes(\"req.method === 'GET'\") || content.includes('req.method === \"GET\"') || !content.includes('req.method')) {\n methods.push('GET')\n }\n if (content.includes(\"req.method === 'POST'\") || content.includes('req.method === \"POST\"')) {\n methods.push('POST')\n }\n if (content.includes(\"req.method === 'PUT'\") || content.includes('req.method === \"PUT\"')) {\n methods.push('PUT')\n }\n if (content.includes(\"req.method === 'PATCH'\") || content.includes('req.method === \"PATCH\"')) {\n methods.push('PATCH')\n }\n if (content.includes(\"req.method === 'DELETE'\") || content.includes('req.method === \"DELETE\"')) {\n methods.push('DELETE')\n }\n\n // If no specific method checks, assume GET/POST\n if (methods.length === 0) {\n methods.push('GET', 'POST')\n }\n\n for (const method of methods) {\n parsedEndpoints.push({\n method,\n path: apiPath,\n operationId: `${method.toLowerCase()}${toPascalCase(apiPath.replace(/[^a-zA-Z0-9]/g, '_'))}`,\n summary: `${method} ${apiPath}`,\n pathParams: extractPathParams(apiPath),\n queryParams: [],\n responses: {},\n tags: extractTags(apiPath),\n })\n }\n }\n\n // Extract schemas\n const schemas = extractSchemas(content)\n parsedModels.push(...schemas)\n\n return { parsedModels, parsedEndpoints }\n}\n\n/**\n * Parse Server Actions from a file.\n */\nfunction parseServerActions(\n content: string,\n _filePath: string,\n _warnings: ParseWarning[]\n): { parsedModels: DataModel[]; parsedEndpoints: Endpoint[] } {\n const parsedModels: DataModel[] = []\n const parsedEndpoints: Endpoint[] = []\n\n // Find exported async functions (server actions)\n const actionMatches = content.matchAll(\n /export\\s+async\\s+function\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(?::\\s*Promise<([^>]+)>)?/g\n )\n\n for (const match of actionMatches) {\n const [, functionName, params, returnType] = match\n\n if (!functionName) continue\n\n // Create an endpoint for the Server Action\n parsedEndpoints.push({\n method: 'POST',\n path: `/actions/${functionName}`,\n operationId: functionName,\n summary: `Server Action: ${functionName}`,\n pathParams: [],\n queryParams: [],\n responses: {},\n tags: ['server-actions'],\n })\n\n // Try to parse parameter types\n if (params) {\n const paramSchema = parseActionParams(params)\n if (paramSchema && Object.keys(paramSchema).length > 0) {\n parsedModels.push({\n name: `${toPascalCase(functionName)}Input`,\n type: 'object',\n description: `Input for server action: ${functionName}`,\n properties: paramSchema,\n required: Object.keys(paramSchema).filter(\n (k) => paramSchema[k]?.required\n ),\n })\n }\n }\n\n // Try to parse return type\n if (returnType) {\n const returnSchema = parseTypeAnnotation(returnType)\n if (returnSchema) {\n parsedModels.push({\n name: `${toPascalCase(functionName)}Output`,\n type: 'object',\n description: `Output of server action: ${functionName}`,\n properties: returnSchema,\n required: Object.keys(returnSchema),\n })\n }\n }\n }\n\n // Also extract any Zod schemas or interfaces\n const schemas = extractSchemas(content)\n parsedModels.push(...schemas)\n\n return { parsedModels, parsedEndpoints }\n}\n\n/**\n * Extract API path from App Router file path.\n */\nfunction extractApiPath(filePath: string): string {\n // app/api/users/[id]/route.ts -> /api/users/[id]\n // app/api/[...slug]/route.ts -> /api/[...slug]\n // Handle both relative (app/api/...) and absolute (/src/app/api/...) paths\n\n // Normalize path separators and find the app/api portion\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n\n // Match app/api/... up to route.ts\n const match = normalizedPath.match(/app(\\/api\\/.+?)\\/route\\.ts$/)\n if (match && match[1]) {\n // Keep the original bracket notation for the path\n return match[1]\n }\n return '/api/unknown'\n}\n\n/**\n * Extract API path from Pages Router file path.\n */\nfunction extractPagesApiPath(filePath: string): string {\n // pages/api/users/[id].ts -> /api/users/[id]\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n const match = normalizedPath.match(/pages(\\/api\\/.+?)\\.tsx?$/)\n if (match && match[1]) {\n return match[1]\n }\n return '/api/unknown'\n}\n\n/**\n * Extract path parameters from API path.\n */\nfunction extractPathParams(apiPath: string): Array<{ name: string; in: 'path'; required: boolean; type: PropertyType }> {\n const params: Array<{ name: string; in: 'path'; required: boolean; type: PropertyType }> = []\n const matches = apiPath.matchAll(/\\{(\\w+)\\}/g)\n\n for (const match of matches) {\n const paramName = match[1]\n if (paramName) {\n params.push({\n name: paramName,\n in: 'path',\n required: true,\n type: 'string',\n })\n }\n }\n\n return params\n}\n\n/**\n * Extract tags from API path.\n */\nfunction extractTags(apiPath: string): string[] {\n const parts = apiPath.split('/').filter(Boolean)\n if (parts.length >= 2) {\n // Use the first meaningful segment after /api/\n const tag = parts[1]\n if (tag && !tag.startsWith('{')) {\n return [tag]\n }\n }\n return []\n}\n\n/**\n * Try to extract request body schema from handler.\n */\nfunction extractRequestBodySchema(\n content: string,\n handlerBody: string\n): { properties: Record<string, PropertyDef> } | null {\n // Look for Zod validation\n const zodMatch = content.match(/z\\.object\\(\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}\\s*\\)/)\n if (zodMatch && zodMatch[1]) {\n const properties = parseZodObjectBody(zodMatch[1])\n return { properties }\n }\n\n // Look for destructuring from request body\n const bodyMatch = handlerBody.match(/(?:const|let)\\s*\\{([^}]+)\\}\\s*=\\s*(?:await\\s+)?(?:request|req)\\.json\\(\\)/)\n if (bodyMatch && bodyMatch[1]) {\n const fields = bodyMatch[1].split(',').map((f) => f.trim()).filter(Boolean)\n const properties: Record<string, PropertyDef> = {}\n for (const field of fields) {\n const fieldName = field.split(':')[0]?.trim()\n if (fieldName) {\n properties[fieldName] = {\n name: fieldName,\n type: 'string', // Default to string\n required: true,\n }\n }\n }\n return { properties }\n }\n\n return null\n}\n\n/**\n * Extract schemas from content (Zod schemas and TypeScript interfaces).\n */\nfunction extractSchemas(content: string): DataModel[] {\n const models: DataModel[] = []\n\n // Extract Zod schemas\n const zodMatches = content.matchAll(\n /(?:export\\s+)?(?:const|let)\\s+(\\w+Schema?)\\s*=\\s*z\\.object\\(\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}\\s*\\)/g\n )\n\n for (const match of zodMatches) {\n const [, schemaName, schemaBody] = match\n if (!schemaName || !schemaBody) continue\n\n const properties = parseZodObjectBody(schemaBody)\n models.push({\n name: toPascalCase(schemaName.replace(/Schema$/, '')),\n type: 'object',\n description: `Schema: ${schemaName}`,\n properties,\n required: Object.keys(properties).filter((k) => properties[k]?.required),\n })\n }\n\n // Extract TypeScript interfaces\n const interfaceMatches = content.matchAll(\n /(?:export\\s+)?interface\\s+(\\w+)\\s*\\{([^}]*)\\}/g\n )\n\n for (const match of interfaceMatches) {\n const [, interfaceName, interfaceBody] = match\n if (!interfaceName || !interfaceBody) continue\n\n // Skip common Next.js interfaces\n if (['NextApiRequest', 'NextApiResponse', 'NextRequest', 'NextResponse'].includes(interfaceName)) {\n continue\n }\n\n const properties = parseInterfaceBody(interfaceBody)\n models.push({\n name: interfaceName,\n type: 'object',\n properties,\n required: Object.keys(properties).filter((k) => properties[k]?.required),\n })\n }\n\n return models\n}\n\n/**\n * Parse Zod object body.\n */\nfunction parseZodObjectBody(body: string): Record<string, PropertyDef> {\n const properties: Record<string, PropertyDef> = {}\n\n const propMatches = body.matchAll(\n /(\\w+)\\s*:\\s*z\\.(\\w+)\\(([^)]*)\\)([^,\\n]*)/g\n )\n\n for (const match of propMatches) {\n const [, propName, zodType, , modifiers] = match\n if (!propName || !zodType) continue\n\n const { type, format, nullable, isRequired } = parseZodType(zodType, modifiers || '')\n\n properties[propName] = {\n name: propName,\n type,\n format,\n required: isRequired,\n nullable,\n }\n }\n\n return properties\n}\n\n/**\n * Parse interface body.\n */\nfunction parseInterfaceBody(body: string): Record<string, PropertyDef> {\n const properties: Record<string, PropertyDef> = {}\n\n const propMatches = body.matchAll(\n /(\\w+)(\\??)\\s*:\\s*([^;\\n]+)/g\n )\n\n for (const match of propMatches) {\n const [, propName, optional, propType] = match\n if (!propName || !propType) continue\n\n const { type, format } = parseTypeScriptType(propType.trim())\n const isRequired = !optional\n\n properties[propName] = {\n name: propName,\n type,\n format,\n required: isRequired,\n nullable: !isRequired,\n }\n }\n\n return properties\n}\n\n/**\n * Parse action parameters.\n */\nfunction parseActionParams(params: string): Record<string, PropertyDef> {\n const properties: Record<string, PropertyDef> = {}\n\n // Pattern: paramName: Type\n const paramMatches = params.matchAll(\n /(\\w+)\\s*:\\s*([^,]+)/g\n )\n\n for (const match of paramMatches) {\n const [, paramName, paramType] = match\n if (!paramName || !paramType) continue\n\n const { type, format } = parseTypeScriptType(paramType.trim())\n\n properties[paramName] = {\n name: paramName,\n type,\n format,\n required: true,\n }\n }\n\n return properties\n}\n\n/**\n * Parse a type annotation (e.g., return type).\n */\nfunction parseTypeAnnotation(typeStr: string): Record<string, PropertyDef> | null {\n const cleanType = typeStr.trim()\n\n // Handle object literal type\n if (cleanType.startsWith('{') && cleanType.endsWith('}')) {\n return parseInterfaceBody(cleanType.slice(1, -1))\n }\n\n // Handle named type reference\n if (/^\\w+$/.test(cleanType)) {\n return {\n data: {\n name: 'data',\n type: 'object',\n format: `ref:${cleanType}`,\n required: true,\n },\n }\n }\n\n return null\n}\n\n/**\n * Parse Zod type.\n */\nfunction parseZodType(\n zodType: string,\n modifiers: string\n): { type: PropertyType; format?: string; nullable: boolean; isRequired: boolean } {\n let type: PropertyType = 'string'\n let format: string | undefined\n let nullable = false\n let isRequired = true\n\n switch (zodType.toLowerCase()) {\n case 'string':\n type = 'string'\n break\n case 'number':\n type = 'number'\n break\n case 'boolean':\n type = 'boolean'\n break\n case 'date':\n type = 'string'\n format = 'date-time'\n break\n case 'array':\n type = 'array'\n break\n case 'object':\n type = 'object'\n break\n default:\n type = 'string'\n }\n\n if (modifiers.includes('.optional()')) isRequired = false\n if (modifiers.includes('.nullable()')) {\n nullable = true\n isRequired = false\n }\n if (modifiers.includes('.email()')) format = 'email'\n if (modifiers.includes('.url()')) format = 'uri'\n if (modifiers.includes('.uuid()')) format = 'uuid'\n\n return { type, format, nullable, isRequired }\n}\n\n/**\n * Parse TypeScript type.\n */\nfunction parseTypeScriptType(typeStr: string): { type: PropertyType; format?: string } {\n const cleanType = typeStr.replace(/\\s/g, '')\n\n switch (cleanType) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'Date':\n return { type: 'string', format: 'date-time' }\n default:\n if (cleanType.endsWith('[]')) {\n return { type: 'array' }\n }\n if (cleanType.startsWith('{')) {\n return { type: 'object' }\n }\n return { type: 'string' }\n }\n}\n\n/**\n * Convert to PascalCase.\n */\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_](\\w)/g, (_, c) => c.toUpperCase())\n .replace(/^\\w/, (c) => c.toUpperCase())\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n","/**\n * Unified schema parser entry point.\n *\n * Provides a single `parseSchema()` function that can parse\n * multiple schema formats and automatically detect the format.\n *\n * @example\n * // Parse with auto-detection\n * const result = await parseSchema(files)\n *\n * // Parse specific format\n * const result = await parseSchema(files, { format: 'drizzle' })\n *\n * // Parse from strings\n * const result = await parseSchemaFromStrings([\n * { path: 'schema.ts', content: 'export const users = pgTable(...)' }\n * ])\n */\n\nimport type { DemokitSchema } from '../types'\nimport type {\n SchemaFormat,\n CodebaseFile,\n ParseSchemaOptions,\n ParseResult,\n ParseWarning,\n} from './types'\nimport { detectFormatFromFiles, groupFilesByFormat, FORMAT_PRIORITY } from './detect'\nimport { parseTypeScript } from './typescript'\nimport { parseZod } from './zod'\nimport { parseDrizzle } from './drizzle'\nimport { parsePrisma } from './prisma'\nimport { parseGraphQL } from './graphql'\nimport { parseSupabase } from './supabase'\nimport { parseTRPC } from './trpc'\nimport { parseNextJS } from './nextjs'\nimport { detectRelationships } from '../relationships'\n\n// Re-export types and utilities\nexport * from './types'\nexport * from './detect'\nexport { parseTypeScript } from './typescript'\nexport { parseZod } from './zod'\nexport { parseDrizzle } from './drizzle'\nexport { parsePrisma } from './prisma'\nexport { parseGraphQL } from './graphql'\nexport { parseSupabase } from './supabase'\nexport { parseTRPC } from './trpc'\nexport { parseNextJS } from './nextjs'\n\n/**\n * Parse schema files from a codebase.\n *\n * Supports TypeScript, Zod, Drizzle, and Prisma formats.\n * Can auto-detect the format or use a specified format.\n *\n * @param files - Array of files with path and content\n * @param options - Parsing options\n * @returns Parsed schema with metadata\n */\nexport function parseSchema(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const { format = 'auto' } = options\n\n if (format === 'auto') {\n return parseSchemaAutoDetect(files, options)\n }\n\n return parseSchemaWithFormat(files, format, options)\n}\n\n/**\n * Parse schema with auto-detection of format.\n */\nfunction parseSchemaAutoDetect(\n files: CodebaseFile[],\n options: ParseSchemaOptions\n): ParseResult {\n const warnings: ParseWarning[] = []\n\n // Try to detect the primary format\n const detection = detectFormatFromFiles(files)\n\n if (!detection.format) {\n // No format detected - try to parse as TypeScript\n warnings.push({\n code: 'NO_FORMAT_DETECTED',\n message: 'Could not detect schema format, falling back to TypeScript',\n })\n const result = parseSchemaWithFormat(files, 'typescript', options)\n result.warnings = [...warnings, ...result.warnings]\n return result\n }\n\n if (detection.confidence < 0.5) {\n warnings.push({\n code: 'LOW_CONFIDENCE',\n message: `Low confidence (${Math.round(detection.confidence * 100)}%) for format \"${detection.format}\"`,\n })\n }\n\n const result = parseSchemaWithFormat(files, detection.format, options)\n\n // Add detection warnings\n result.warnings = [...warnings, ...result.warnings]\n\n return result\n}\n\n/**\n * Parse schema with a specific format.\n */\nfunction parseSchemaWithFormat(\n files: CodebaseFile[],\n format: SchemaFormat,\n options: ParseSchemaOptions\n): ParseResult {\n switch (format) {\n case 'drizzle':\n return parseDrizzle(files, options)\n\n case 'prisma':\n return parsePrisma(files, options)\n\n case 'zod':\n return parseZod(files, options)\n\n case 'typescript':\n return parseTypeScript(files, options)\n\n case 'graphql':\n return parseGraphQL(files, options)\n\n case 'supabase':\n return parseSupabase(files, options)\n\n case 'trpc':\n return parseTRPC(files, options)\n\n case 'nextjs':\n return parseNextJS(files, options)\n\n // OpenAPI is handled by the existing OpenAPI parser (separate package)\n case 'openapi':\n return {\n schema: createEmptySchema(options),\n format,\n warnings: [{\n code: 'UNSUPPORTED_FORMAT',\n message: `Format \"${format}\" should be parsed using the OpenAPI-specific parser`,\n }],\n parsedFiles: [],\n }\n\n default:\n return {\n schema: createEmptySchema(options),\n format: 'typescript',\n warnings: [{\n code: 'UNKNOWN_FORMAT',\n message: `Unknown format \"${format}\", falling back to TypeScript`,\n }],\n parsedFiles: [],\n }\n }\n}\n\n/**\n * Parse multiple formats from a codebase and merge the results.\n *\n * This is useful when a codebase uses multiple schema sources\n * (e.g., Drizzle for database + Zod for validation).\n *\n * @param files - Array of files with path and content\n * @param options - Parsing options\n * @returns Merged schema from all detected formats\n */\nexport function parseSchemaMultiFormat(\n files: CodebaseFile[],\n options: ParseSchemaOptions = {}\n): ParseResult {\n const {\n name = 'Merged Schema',\n version = '1.0.0',\n detectRelationships: shouldDetectRelationships = true,\n } = options\n\n const allModels: Record<string, DataModel> = {}\n const allRelationships: import('../types').Relationship[] = []\n const allWarnings: ParseWarning[] = []\n const allParsedFiles: string[] = []\n const detectedFormats: SchemaFormat[] = []\n\n // Group files by format\n const filesByFormat = groupFilesByFormat(files)\n\n // Parse each format in priority order\n for (const format of FORMAT_PRIORITY) {\n const formatFiles = filesByFormat.get(format)\n if (!formatFiles || formatFiles.length === 0) {\n continue\n }\n\n detectedFormats.push(format)\n\n const result = parseSchemaWithFormat(formatFiles, format, {\n ...options,\n detectRelationships: false, // We'll detect after merging\n })\n\n // Merge models (later formats don't override earlier ones)\n for (const [modelName, model] of Object.entries(result.schema.models)) {\n if (!allModels[modelName]) {\n allModels[modelName] = model\n } else {\n // Merge properties\n allModels[modelName] = mergeModels(allModels[modelName], model)\n }\n }\n\n // Collect relationships\n allRelationships.push(...result.schema.relationships)\n\n // Collect warnings with format prefix\n for (const warning of result.warnings) {\n allWarnings.push({\n ...warning,\n code: `${format.toUpperCase()}_${warning.code}`,\n })\n }\n\n allParsedFiles.push(...result.parsedFiles)\n }\n\n // Detect additional relationships from merged models\n if (shouldDetectRelationships) {\n const inferred = detectRelationships(allModels)\n for (const rel of inferred) {\n // Only add if not already present\n const exists = allRelationships.some(\n (r) =>\n r.from.model === rel.from.model &&\n r.from.field === rel.from.field &&\n r.to.model === rel.to.model\n )\n if (!exists) {\n allRelationships.push(rel)\n }\n }\n }\n\n // Deduplicate relationships\n const uniqueRelationships = deduplicateRelationships(allRelationships)\n\n const schema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: `Schema merged from formats: ${detectedFormats.join(', ')}`,\n },\n endpoints: [],\n models: allModels,\n relationships: uniqueRelationships,\n }\n\n return {\n schema,\n format: detectedFormats[0] || 'typescript',\n warnings: allWarnings,\n parsedFiles: allParsedFiles,\n }\n}\n\n/**\n * Merge two models, combining their properties.\n * Earlier model's properties take precedence.\n */\nfunction mergeModels(existing: DataModel, incoming: DataModel): DataModel {\n return {\n ...existing,\n description: existing.description || incoming.description,\n properties: {\n ...incoming.properties,\n ...existing.properties, // Existing takes precedence\n },\n required: [\n ...new Set([...(existing.required || []), ...(incoming.required || [])]),\n ],\n }\n}\n\n/**\n * Deduplicate relationships, preferring explicit ones.\n */\nfunction deduplicateRelationships(\n relationships: import('../types').Relationship[]\n): import('../types').Relationship[] {\n const seen = new Map<string, import('../types').Relationship>()\n\n for (const rel of relationships) {\n const key = `${rel.from.model}.${rel.from.field}->${rel.to.model}.${rel.to.field}`\n\n const existing = seen.get(key)\n if (!existing) {\n seen.set(key, rel)\n } else if (rel.detectedBy === 'explicit-ref' && existing.detectedBy !== 'explicit-ref') {\n // Prefer explicit relationships\n seen.set(key, rel)\n }\n }\n\n return Array.from(seen.values())\n}\n\n/**\n * Create an empty schema with info from options.\n */\nfunction createEmptySchema(options: ParseSchemaOptions): DemokitSchema {\n return {\n info: {\n title: options.name || 'Schema',\n version: options.version || '1.0.0',\n },\n endpoints: [],\n models: {},\n relationships: [],\n }\n}\n\n// Import DataModel type for mergeModels\nimport type { DataModel } from '../types'\n","/**\n * Schema Merger.\n * Merges multiple DemokitSchemas from different sources into a unified schema.\n *\n * Features:\n * - Case-insensitive model name matching\n * - Property merge with source tracking\n * - Relationship priority (explicit > inferred)\n * - Conflict detection and resolution\n * - Endpoint merging from multiple sources\n */\n\nimport type {\n DemokitSchema,\n DataModel,\n PropertyDef,\n Relationship,\n Endpoint,\n} from '../types'\nimport type { SchemaFormat } from '../parsers/types'\n\n/**\n * Options for schema merging.\n */\nexport interface MergeOptions {\n /**\n * How to resolve property conflicts when the same model appears in multiple sources.\n * - 'prefer-explicit': Prefer properties from more explicit sources (e.g., Drizzle over TypeScript)\n * - 'prefer-first': Keep the first value encountered\n * - 'union': Combine all properties, with first taking precedence for conflicts\n */\n conflictResolution?: 'prefer-explicit' | 'prefer-first' | 'union'\n\n /**\n * Order of precedence for relationships.\n * Earlier formats have higher priority.\n * Default: ['drizzle', 'prisma', 'graphql', 'supabase', 'zod', 'trpc', 'typescript', 'nextjs']\n */\n relationshipPriority?: SchemaFormat[]\n\n /**\n * Whether to track the source of each field for debugging.\n */\n trackSources?: boolean\n\n /**\n * Name for the merged schema.\n */\n name?: string\n\n /**\n * Version for the merged schema.\n */\n version?: string\n}\n\n/**\n * A source schema with its format identifier.\n */\nexport interface SchemaSource {\n format: SchemaFormat\n schema: DemokitSchema\n}\n\n/**\n * Result of a merge operation.\n */\nexport interface MergeResult {\n /**\n * The merged schema.\n */\n schema: DemokitSchema\n\n /**\n * Conflicts detected during merge.\n */\n conflicts: MergeConflict[]\n\n /**\n * Source tracking for each model (if enabled).\n */\n sources?: ModelSourceMap\n\n /**\n * Formats that were merged.\n */\n mergedFormats: SchemaFormat[]\n}\n\n/**\n * Describes a merge conflict.\n */\nexport interface MergeConflict {\n type: 'model' | 'property' | 'relationship'\n modelName: string\n propertyName?: string\n sources: SchemaFormat[]\n resolution: 'kept-first' | 'merged' | 'overwritten'\n details?: string\n}\n\n/**\n * Tracks which source provided each model/property.\n */\nexport interface ModelSourceMap {\n [modelName: string]: {\n primarySource: SchemaFormat\n properties: {\n [propertyName: string]: SchemaFormat\n }\n }\n}\n\n/**\n * Default relationship priority order.\n * More explicit sources (with explicit relationships) come first.\n */\nconst DEFAULT_RELATIONSHIP_PRIORITY: SchemaFormat[] = [\n 'drizzle',\n 'prisma',\n 'graphql',\n 'supabase',\n 'zod',\n 'trpc',\n 'typescript',\n 'nextjs',\n 'openapi',\n]\n\n/**\n * Merge multiple schemas into a unified schema.\n *\n * @param sources - Array of schemas with their format identifiers\n * @param options - Merge options\n * @returns Merged schema with conflict information\n */\nexport function mergeSchemas(\n sources: SchemaSource[],\n options: MergeOptions = {}\n): MergeResult {\n const {\n conflictResolution = 'prefer-explicit',\n relationshipPriority = DEFAULT_RELATIONSHIP_PRIORITY,\n trackSources = false,\n name = 'Merged Schema',\n version = '1.0.0',\n } = options\n\n const mergedModels: Record<string, DataModel> = {}\n const mergedRelationships: Relationship[] = []\n const mergedEndpoints: Endpoint[] = []\n const conflicts: MergeConflict[] = []\n const modelSources: ModelSourceMap = {}\n const mergedFormats: SchemaFormat[] = []\n\n // Sort sources by relationship priority\n const sortedSources = [...sources].sort((a, b) => {\n const aIndex = relationshipPriority.indexOf(a.format)\n const bIndex = relationshipPriority.indexOf(b.format)\n return (aIndex === -1 ? Infinity : aIndex) - (bIndex === -1 ? Infinity : bIndex)\n })\n\n // Process each source\n for (const source of sortedSources) {\n if (!mergedFormats.includes(source.format)) {\n mergedFormats.push(source.format)\n }\n\n // Merge models\n for (const [modelName, model] of Object.entries(source.schema.models)) {\n const normalizedName = normalizeModelName(modelName)\n const existingName = findExistingModelName(mergedModels, normalizedName)\n\n if (existingName) {\n // Model already exists - merge it\n const existingModel = mergedModels[existingName]\n if (existingModel) {\n const { merged, conflict } = mergeModels(\n existingModel,\n model,\n existingName,\n modelSources[existingName]?.primarySource || source.format,\n source.format,\n conflictResolution\n )\n\n mergedModels[existingName] = merged\n\n if (conflict) {\n conflicts.push(conflict)\n }\n\n // Update property sources\n if (trackSources) {\n const existingSource = modelSources[existingName]\n if (existingSource) {\n for (const propName of Object.keys(model.properties || {})) {\n if (!existingSource.properties[propName]) {\n existingSource.properties[propName] = source.format\n }\n }\n }\n }\n }\n } else {\n // New model\n mergedModels[modelName] = { ...model }\n\n if (trackSources) {\n modelSources[modelName] = {\n primarySource: source.format,\n properties: Object.keys(model.properties || {}).reduce(\n (acc, propName) => ({ ...acc, [propName]: source.format }),\n {}\n ),\n }\n }\n }\n }\n\n // Merge relationships\n for (const relationship of source.schema.relationships) {\n const existing = findExistingRelationship(mergedRelationships, relationship)\n\n if (existing) {\n // Check if new relationship is more authoritative\n const existingPriority = relationshipPriority.indexOf(\n getRelationshipSource(existing)\n )\n const newPriority = relationshipPriority.indexOf(source.format)\n\n if (newPriority !== -1 && (existingPriority === -1 || newPriority < existingPriority)) {\n // Replace with higher priority relationship\n const index = mergedRelationships.indexOf(existing)\n mergedRelationships[index] = { ...relationship }\n\n conflicts.push({\n type: 'relationship',\n modelName: relationship.from.model,\n sources: [getRelationshipSource(existing), source.format],\n resolution: 'overwritten',\n details: `Relationship ${relationship.from.model}.${relationship.from.field} -> ${relationship.to.model} overwritten by ${source.format}`,\n })\n }\n } else {\n // New relationship\n mergedRelationships.push({ ...relationship })\n }\n }\n\n // Merge endpoints\n for (const endpoint of source.schema.endpoints) {\n const existing = mergedEndpoints.find(\n (e) => e.method === endpoint.method && e.path === endpoint.path\n )\n\n if (!existing) {\n mergedEndpoints.push({ ...endpoint })\n }\n }\n }\n\n const mergedSchema: DemokitSchema = {\n info: {\n title: name,\n version,\n description: `Schema merged from: ${mergedFormats.join(', ')}`,\n },\n models: mergedModels,\n relationships: mergedRelationships,\n endpoints: mergedEndpoints,\n }\n\n const result: MergeResult = {\n schema: mergedSchema,\n conflicts,\n mergedFormats,\n }\n\n if (trackSources) {\n result.sources = modelSources\n }\n\n return result\n}\n\n/**\n * Normalize a model name for case-insensitive matching.\n */\nfunction normalizeModelName(name: string): string {\n return name.toLowerCase()\n}\n\n/**\n * Find an existing model name that matches (case-insensitive).\n */\nfunction findExistingModelName(\n models: Record<string, DataModel>,\n normalizedName: string\n): string | null {\n for (const existingName of Object.keys(models)) {\n if (normalizeModelName(existingName) === normalizedName) {\n return existingName\n }\n }\n return null\n}\n\n/**\n * Merge two models into one.\n */\nfunction mergeModels(\n existing: DataModel,\n incoming: DataModel,\n modelName: string,\n existingSource: SchemaFormat,\n incomingSource: SchemaFormat,\n conflictResolution: 'prefer-explicit' | 'prefer-first' | 'union'\n): { merged: DataModel; conflict: MergeConflict | null } {\n let conflict: MergeConflict | null = null\n\n // Check for property conflicts\n const existingProps = existing.properties || {}\n const incomingProps = incoming.properties || {}\n const conflictingProps = Object.keys(existingProps).filter(\n (k) => k in incomingProps\n )\n\n if (conflictingProps.length > 0) {\n conflict = {\n type: 'model',\n modelName,\n sources: [existingSource, incomingSource],\n resolution: conflictResolution === 'prefer-first' ? 'kept-first' : 'merged',\n details: `Conflicting properties: ${conflictingProps.join(', ')}`,\n }\n }\n\n let mergedProps: Record<string, PropertyDef>\n\n switch (conflictResolution) {\n case 'prefer-first':\n // Keep existing properties, add new ones\n mergedProps = {\n ...incomingProps,\n ...existingProps,\n }\n break\n\n case 'prefer-explicit':\n // Prefer properties from more explicit sources\n mergedProps = {\n ...existingProps,\n ...incomingProps, // Incoming overwrites if it's more explicit (handled by sort order)\n }\n break\n\n case 'union':\n default:\n // Merge all properties, existing takes precedence for conflicts\n mergedProps = {\n ...incomingProps,\n ...existingProps,\n }\n break\n }\n\n const merged: DataModel = {\n ...existing,\n description: existing.description || incoming.description,\n properties: mergedProps,\n required: [\n ...new Set([...(existing.required || []), ...(incoming.required || [])]),\n ],\n // Preserve enum values\n enum: existing.enum || incoming.enum,\n }\n\n return { merged, conflict }\n}\n\n/**\n * Find an existing relationship that matches.\n */\nfunction findExistingRelationship(\n relationships: Relationship[],\n incoming: Relationship\n): Relationship | null {\n return (\n relationships.find(\n (r) =>\n normalizeModelName(r.from.model) === normalizeModelName(incoming.from.model) &&\n r.from.field === incoming.from.field &&\n normalizeModelName(r.to.model) === normalizeModelName(incoming.to.model)\n ) || null\n )\n}\n\n/**\n * Get the source format of a relationship.\n */\nfunction getRelationshipSource(relationship: Relationship): SchemaFormat {\n // Try to infer from detectedBy\n if (relationship.detectedBy === 'explicit-ref') {\n // Could be drizzle, prisma, graphql\n return 'drizzle' // Default to highest priority\n }\n if (relationship.detectedBy === 'naming-convention') {\n return 'typescript'\n }\n return 'typescript'\n}\n\n/**\n * Compare two schemas and return the differences.\n */\nexport function diffSchemas(\n base: DemokitSchema,\n updated: DemokitSchema\n): SchemaDiff {\n const added: SchemaDiffItem[] = []\n const removed: SchemaDiffItem[] = []\n const modified: SchemaDiffItem[] = []\n\n // Compare models\n const baseModels = new Set(Object.keys(base.models))\n const updatedModels = new Set(Object.keys(updated.models))\n\n // Find added models\n for (const modelName of updatedModels) {\n if (!baseModels.has(modelName)) {\n added.push({\n type: 'model',\n name: modelName,\n details: updated.models[modelName],\n })\n }\n }\n\n // Find removed models\n for (const modelName of baseModels) {\n if (!updatedModels.has(modelName)) {\n removed.push({\n type: 'model',\n name: modelName,\n details: base.models[modelName],\n })\n }\n }\n\n // Find modified models\n for (const modelName of baseModels) {\n if (updatedModels.has(modelName)) {\n const baseModel = base.models[modelName]\n const updatedModel = updated.models[modelName]\n\n if (baseModel && updatedModel) {\n const propDiffs = diffProperties(\n baseModel.properties || {},\n updatedModel.properties || {}\n )\n\n if (propDiffs.length > 0) {\n modified.push({\n type: 'model',\n name: modelName,\n details: { propDiffs },\n })\n }\n }\n }\n }\n\n return { added, removed, modified }\n}\n\n/**\n * Diff two sets of properties.\n */\nfunction diffProperties(\n base: Record<string, PropertyDef>,\n updated: Record<string, PropertyDef>\n): PropertyDiff[] {\n const diffs: PropertyDiff[] = []\n const baseProps = new Set(Object.keys(base))\n const updatedProps = new Set(Object.keys(updated))\n\n // Added properties\n for (const propName of updatedProps) {\n if (!baseProps.has(propName)) {\n diffs.push({ name: propName, change: 'added', newValue: updated[propName] })\n }\n }\n\n // Removed properties\n for (const propName of baseProps) {\n if (!updatedProps.has(propName)) {\n diffs.push({ name: propName, change: 'removed', oldValue: base[propName] })\n }\n }\n\n // Modified properties\n for (const propName of baseProps) {\n if (updatedProps.has(propName)) {\n const baseProp = base[propName]\n const updatedProp = updated[propName]\n\n if (baseProp && updatedProp && (\n baseProp.type !== updatedProp.type ||\n baseProp.format !== updatedProp.format ||\n baseProp.required !== updatedProp.required ||\n baseProp.nullable !== updatedProp.nullable\n )) {\n diffs.push({\n name: propName,\n change: 'modified',\n oldValue: baseProp,\n newValue: updatedProp,\n })\n }\n }\n }\n\n return diffs\n}\n\n/**\n * Schema diff result.\n */\nexport interface SchemaDiff {\n added: SchemaDiffItem[]\n removed: SchemaDiffItem[]\n modified: SchemaDiffItem[]\n}\n\n/**\n * A single diff item.\n */\nexport interface SchemaDiffItem {\n type: 'model' | 'relationship' | 'endpoint'\n name: string\n details: unknown\n}\n\n/**\n * Property diff.\n */\nexport interface PropertyDiff {\n name: string\n change: 'added' | 'removed' | 'modified'\n oldValue?: PropertyDef\n newValue?: PropertyDef\n}\n","/**\n * Error handling utilities for schema parsing.\n *\n * Provides custom error types and safe parsing utilities\n * for graceful error recovery during schema parsing.\n */\n\nimport type { ParseWarning } from \"../parsers/types\";\n\n/**\n * Base error class for schema parsing errors.\n */\nexport class SchemaParseError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly filePath?: string,\n public readonly line?: number\n ) {\n super(message);\n this.name = \"SchemaParseError\";\n }\n}\n\n/**\n * Error thrown when a format cannot be detected.\n */\nexport class FormatDetectionError extends SchemaParseError {\n constructor(message: string, filePath?: string) {\n super(message, \"FORMAT_DETECTION_FAILED\", filePath);\n this.name = \"FormatDetectionError\";\n }\n}\n\n/**\n * Error thrown when a file cannot be parsed.\n */\nexport class FileParseError extends SchemaParseError {\n constructor(message: string, filePath: string, line?: number) {\n super(message, \"FILE_PARSE_FAILED\", filePath, line);\n this.name = \"FileParseError\";\n }\n}\n\n/**\n * Error thrown when schema validation fails.\n */\nexport class SchemaValidationError extends SchemaParseError {\n constructor(message: string, public readonly validationErrors: string[]) {\n super(message, \"SCHEMA_VALIDATION_FAILED\");\n this.name = \"SchemaValidationError\";\n }\n}\n\n/**\n * Error thrown when merging schemas fails.\n */\nexport class SchemaMergeError extends SchemaParseError {\n constructor(message: string, public readonly modelName?: string) {\n super(message, \"SCHEMA_MERGE_FAILED\");\n this.name = \"SchemaMergeError\";\n }\n}\n\n/**\n * Result of a safe operation that may fail.\n */\nexport type SafeResult<T> =\n | { success: true; value: T; warnings: ParseWarning[] }\n | { success: false; error: Error; warnings: ParseWarning[] };\n\n/**\n * Safely execute a parsing function and capture errors as warnings.\n *\n * @param fn - The function to execute\n * @param fallback - Fallback value if the function fails\n * @param errorCode - Warning code to use if the function fails\n * @returns Result with value or error\n */\nexport function safeExecute<T>(\n fn: () => T,\n fallback: T,\n errorCode: string\n): { value: T; warning?: ParseWarning } {\n try {\n return { value: fn() };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n value: fallback,\n warning: {\n code: errorCode,\n message,\n file: error instanceof SchemaParseError ? error.filePath : undefined,\n line: error instanceof SchemaParseError ? error.line : undefined,\n },\n };\n }\n}\n\n/**\n * Safely parse content with error recovery.\n * Returns partial results with warnings instead of failing completely.\n *\n * @param items - Array of items to process\n * @param processor - Function to process each item\n * @param errorCode - Warning code prefix for errors\n * @returns Processed results and accumulated warnings\n */\nexport function safeProcessMany<T, R>(\n items: T[],\n processor: (item: T) => R,\n errorCode: string\n): { results: R[]; warnings: ParseWarning[] } {\n const results: R[] = [];\n const warnings: ParseWarning[] = [];\n\n for (const item of items) {\n try {\n results.push(processor(item));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warnings.push({\n code: `${errorCode}_ITEM_FAILED`,\n message: `Failed to process item: ${message}`,\n });\n }\n }\n\n return { results, warnings };\n}\n\n/**\n * Create a warning from an error.\n */\nexport function errorToWarning(\n error: unknown,\n code: string,\n file?: string\n): ParseWarning {\n const message = error instanceof Error ? error.message : String(error);\n return {\n code,\n message,\n file:\n file || (error instanceof SchemaParseError ? error.filePath : undefined),\n line: error instanceof SchemaParseError ? error.line : undefined,\n };\n}\n\n/**\n * Aggregate multiple warnings into a summary warning.\n */\nexport function aggregateWarnings(\n warnings: ParseWarning[],\n summaryCode: string,\n summaryPrefix: string\n): ParseWarning[] {\n if (warnings.length === 0) {\n return [];\n }\n\n if (warnings.length === 1) {\n return warnings;\n }\n\n const firstWarning = warnings[0];\n\n if (!firstWarning) {\n return warnings;\n }\n\n return [\n {\n code: summaryCode,\n message: `${summaryPrefix}: ${warnings.length} issues found. First: ${firstWarning.message}`,\n },\n ...warnings,\n ];\n}\n\n/**\n * Check if an error is recoverable (should result in warning, not failure).\n */\nexport function isRecoverableError(error: unknown): boolean {\n // Syntax errors in individual files are recoverable\n if (error instanceof FileParseError) {\n return true;\n }\n\n // Format detection failures are recoverable (can fall back to TypeScript)\n if (error instanceof FormatDetectionError) {\n return true;\n }\n\n // Schema validation errors are recoverable (can return partial schema)\n if (error instanceof SchemaValidationError) {\n return true;\n }\n\n // Generic errors with certain messages are recoverable\n if (error instanceof Error) {\n const recoverablePatterns = [\n /syntax error/i,\n /unexpected token/i,\n /parse error/i,\n /could not parse/i,\n /invalid format/i,\n ];\n return recoverablePatterns.some((pattern) => pattern.test(error.message));\n }\n\n return false;\n}\n","/**\n * Individual validation check functions\n *\n * Each function returns true if the value passes the check.\n */\n\n// ============================================================================\n// Type Checks\n// ============================================================================\n\n/**\n * Check if value is a string\n */\nexport function isString(value: unknown): boolean {\n return typeof value === 'string'\n}\n\n/**\n * Check if value is a number (not NaN)\n */\nexport function isNumber(value: unknown): boolean {\n return typeof value === 'number' && !Number.isNaN(value)\n}\n\n/**\n * Check if value is an integer\n */\nexport function isInteger(value: unknown): boolean {\n return typeof value === 'number' && Number.isInteger(value)\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): boolean {\n return typeof value === 'boolean'\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value)\n}\n\n/**\n * Check if value is a plain object\n */\nexport function isObject(value: unknown): boolean {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * Check if value is null\n */\nexport function isNull(value: unknown): boolean {\n return value === null\n}\n\n/**\n * Check if value is undefined\n */\nexport function isUndefined(value: unknown): boolean {\n return value === undefined\n}\n\n/**\n * Check if value is null or undefined\n */\nexport function isNullish(value: unknown): boolean {\n return value === null || value === undefined\n}\n\n// ============================================================================\n// Format Checks\n// ============================================================================\n\n// UUID v4 pattern\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n\n// More relaxed UUID pattern (accepts any version)\nconst UUID_ANY_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n// Email pattern (simplified but practical)\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\n// URL pattern (simplified)\nconst URL_PATTERN = /^https?:\\/\\/[^\\s/$.?#].[^\\s]*$/i\n\n// ISO 8601 date pattern (YYYY-MM-DD)\nconst DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/\n\n// ISO 8601 datetime pattern (with various formats)\nconst DATETIME_PATTERN = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,6})?(Z|[+-]\\d{2}:\\d{2})?)?$/\n\n/**\n * Check if value is a valid UUID\n */\nexport function isUUID(value: unknown, strict = false): boolean {\n if (typeof value !== 'string') return false\n return strict ? UUID_PATTERN.test(value) : UUID_ANY_PATTERN.test(value)\n}\n\n/**\n * Check if value is a valid email format\n */\nexport function isEmail(value: unknown): boolean {\n if (typeof value !== 'string') return false\n return EMAIL_PATTERN.test(value)\n}\n\n/**\n * Check if value is a valid URL\n */\nexport function isURL(value: unknown): boolean {\n if (typeof value !== 'string') return false\n return URL_PATTERN.test(value)\n}\n\n/**\n * Check if value is a valid ISO 8601 date (YYYY-MM-DD)\n */\nexport function isDate(value: unknown): boolean {\n if (typeof value !== 'string') return false\n if (!DATE_PATTERN.test(value)) return false\n\n // Validate it's a real date\n const date = new Date(value)\n return !Number.isNaN(date.getTime())\n}\n\n/**\n * Check if value is a valid ISO 8601 datetime\n */\nexport function isDateTime(value: unknown): boolean {\n if (typeof value !== 'string') return false\n if (!DATETIME_PATTERN.test(value)) return false\n\n // Validate it's a real datetime\n const date = new Date(value)\n return !Number.isNaN(date.getTime())\n}\n\n/**\n * Alias for isDateTime - checks ISO 8601 format\n */\nexport function isISO8601(value: unknown): boolean {\n return isDateTime(value)\n}\n\n// ============================================================================\n// Constraint Checks\n// ============================================================================\n\n/**\n * Check if string length is at least minLength\n */\nexport function hasMinLength(value: unknown, minLength: number): boolean {\n if (typeof value !== 'string') return false\n return value.length >= minLength\n}\n\n/**\n * Check if string length is at most maxLength\n */\nexport function hasMaxLength(value: unknown, maxLength: number): boolean {\n if (typeof value !== 'string') return false\n return value.length <= maxLength\n}\n\n/**\n * Check if number is at least minimum\n */\nexport function hasMinimum(value: unknown, minimum: number): boolean {\n if (typeof value !== 'number') return false\n return value >= minimum\n}\n\n/**\n * Check if number is at most maximum\n */\nexport function hasMaximum(value: unknown, maximum: number): boolean {\n if (typeof value !== 'number') return false\n return value <= maximum\n}\n\n/**\n * Check if string matches a regex pattern\n */\nexport function matchesPattern(value: unknown, pattern: string | RegExp): boolean {\n if (typeof value !== 'string') return false\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern\n return regex.test(value)\n}\n\n/**\n * Check if value is in an enum array\n */\nexport function isInEnum(value: unknown, enumValues: unknown[]): boolean {\n return enumValues.includes(value)\n}\n\n// ============================================================================\n// Comparison Checks\n// ============================================================================\n\n/**\n * Check if two values are equal\n */\nexport function equals(value: unknown, expected: unknown): boolean {\n return value === expected\n}\n\n/**\n * Check if a date/datetime is before or equal to another\n */\nexport function isBeforeOrEqual(value: unknown, other: unknown): boolean {\n if (typeof value !== 'string' || typeof other !== 'string') return false\n\n const date1 = new Date(value)\n const date2 = new Date(other)\n\n if (Number.isNaN(date1.getTime()) || Number.isNaN(date2.getTime())) return false\n\n return date1.getTime() <= date2.getTime()\n}\n\n/**\n * Check if a date/datetime is after or equal to another\n */\nexport function isAfterOrEqual(value: unknown, other: unknown): boolean {\n if (typeof value !== 'string' || typeof other !== 'string') return false\n\n const date1 = new Date(value)\n const date2 = new Date(other)\n\n if (Number.isNaN(date1.getTime()) || Number.isNaN(date2.getTime())) return false\n\n return date1.getTime() >= date2.getTime()\n}\n\n// ============================================================================\n// Array Checks\n// ============================================================================\n\n/**\n * Check if array is not empty\n */\nexport function isArrayNotEmpty(value: unknown): boolean {\n return Array.isArray(value) && value.length > 0\n}\n\n/**\n * Check if array has at least minLength items\n */\nexport function hasArrayMinLength(value: unknown, minLength: number): boolean {\n return Array.isArray(value) && value.length >= minLength\n}\n\n/**\n * Check if array has at most maxLength items\n */\nexport function hasArrayMaxLength(value: unknown, maxLength: number): boolean {\n return Array.isArray(value) && value.length <= maxLength\n}\n\n// ============================================================================\n// Utility Checks\n// ============================================================================\n\n/**\n * Check if a string is empty or only whitespace\n */\nexport function isEmptyString(value: unknown): boolean {\n return typeof value === 'string' && value.trim() === ''\n}\n\n/**\n * Get the type name of a value (for error messages)\n */\nexport function getTypeName(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (Array.isArray(value)) return 'array'\n return typeof value\n}\n","/**\n * Main validator for demo data\n *\n * Validates data against a DemokitSchema, checking:\n * - Type correctness\n * - Format validity\n * - Referential integrity\n * - Custom constraints\n */\n\nimport type { PropertyDef, Relationship } from '../../schema'\nimport type {\n ValidationResult,\n ValidationError,\n ValidationWarning,\n ValidatorOptions,\n DemoData,\n} from '../types'\nimport * as checks from './checks'\n\n/**\n * Validate demo data against a schema\n */\nexport function validateData(\n data: DemoData,\n options: ValidatorOptions\n): ValidationResult {\n const startTime = performance.now()\n const { schema, collectWarnings = false, failFast = false, maxErrors = 1000 } = options\n\n const errors: ValidationError[] = []\n const warnings: ValidationWarning[] = []\n let totalRecords = 0\n let relationshipsChecked = 0\n let typeChecks = 0\n const recordsByModel: Record<string, number> = {}\n\n // Build ID indexes for referential integrity checks\n const idIndexes = buildIdIndexes(data)\n\n // Validate each model's data\n for (const [modelName, modelData] of Object.entries(data)) {\n const model = schema.models[modelName]\n if (!model) {\n // Data for a model that doesn't exist in schema\n warnings.push({\n type: 'suspicious_value',\n model: modelName,\n field: '',\n message: `Model \"${modelName}\" exists in data but not in schema`,\n })\n continue\n }\n\n recordsByModel[modelName] = modelData.length\n totalRecords += modelData.length\n\n // Validate each record\n for (const record of modelData) {\n const recordId = getRecordId(record)\n\n // Validate properties\n if (model.properties) {\n for (const [propName, propDef] of Object.entries(model.properties)) {\n const value = (record as Record<string, unknown>)[propName]\n const isRequired = model.required?.includes(propName) ?? propDef.required ?? false\n\n // Check required fields\n if (isRequired && checks.isNullish(value)) {\n errors.push({\n type: 'required_missing',\n model: modelName,\n field: propName,\n message: `Required field \"${propName}\" is missing`,\n recordId,\n })\n if (failFast || errors.length >= maxErrors) break\n continue\n }\n\n // Skip validation if value is null/undefined and field is optional\n if (checks.isNullish(value)) {\n if (collectWarnings && !propDef.nullable) {\n warnings.push({\n type: 'missing_optional',\n model: modelName,\n field: propName,\n message: `Optional field \"${propName}\" is missing`,\n })\n }\n continue\n }\n\n // Type validation\n const typeError = validateType(value, propDef, modelName, propName, recordId)\n if (typeError) {\n errors.push(typeError)\n typeChecks++\n if (failFast || errors.length >= maxErrors) break\n } else {\n typeChecks++\n }\n\n // Format validation\n const formatError = validateFormat(value, propDef, modelName, propName, recordId)\n if (formatError) {\n errors.push(formatError)\n if (failFast || errors.length >= maxErrors) break\n }\n\n // Constraint validation\n const constraintErrors = validateConstraints(value, propDef, modelName, propName, recordId)\n errors.push(...constraintErrors)\n if (failFast && constraintErrors.length > 0) break\n if (errors.length >= maxErrors) break\n\n // Referential integrity\n if (propDef.relationshipTo) {\n const refError = validateReference(\n value,\n propDef.relationshipTo,\n modelName,\n propName,\n recordId,\n idIndexes\n )\n relationshipsChecked++\n if (refError) {\n errors.push(refError)\n if (failFast || errors.length >= maxErrors) break\n }\n }\n\n // Warnings\n if (collectWarnings) {\n if (typeof value === 'string' && value.trim() === '') {\n warnings.push({\n type: 'empty_string',\n model: modelName,\n field: propName,\n message: `String field \"${propName}\" is empty`,\n value,\n })\n }\n }\n }\n }\n\n if (failFast && errors.length > 0) break\n if (errors.length >= maxErrors) break\n }\n\n if (failFast && errors.length > 0) break\n if (errors.length >= maxErrors) break\n }\n\n // Check for duplicate IDs\n const duplicateErrors = checkDuplicateIds(data)\n errors.push(...duplicateErrors)\n\n // Validate relationships from schema\n for (const relationship of schema.relationships) {\n const relErrors = validateRelationship(relationship, data, idIndexes)\n relationshipsChecked++\n errors.push(...relErrors)\n }\n\n const endTime = performance.now()\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n stats: {\n totalRecords,\n recordsByModel,\n relationshipsChecked,\n typeChecks,\n durationMs: Math.round(endTime - startTime),\n },\n }\n}\n\n/**\n * Build indexes of IDs for each model for fast reference lookups\n */\nfunction buildIdIndexes(data: DemoData): Map<string, Set<string>> {\n const indexes = new Map<string, Set<string>>()\n\n for (const [modelName, records] of Object.entries(data)) {\n const ids = new Set<string>()\n for (const record of records) {\n const id = getRecordId(record)\n if (id) {\n ids.add(id)\n }\n }\n indexes.set(modelName, ids)\n }\n\n return indexes\n}\n\n/**\n * Get the ID from a record (tries common ID field names)\n */\nfunction getRecordId(record: unknown): string | undefined {\n if (!record || typeof record !== 'object') return undefined\n const obj = record as Record<string, unknown>\n return (obj.id ?? obj.uuid ?? obj._id) as string | undefined\n}\n\n/**\n * Validate value type matches property definition\n */\nfunction validateType(\n value: unknown,\n propDef: PropertyDef,\n model: string,\n field: string,\n recordId?: string\n): ValidationError | null {\n const expectedType = propDef.type\n\n switch (expectedType) {\n case 'string':\n if (!checks.isString(value)) {\n return {\n type: 'type_mismatch',\n model,\n field,\n message: `Expected string but got ${checks.getTypeName(value)}`,\n value,\n expected: 'string',\n recordId,\n }\n }\n break\n\n case 'number':\n if (!checks.isNumber(value)) {\n return {\n type: 'type_mismatch',\n model,\n field,\n message: `Expected number but got ${checks.getTypeName(value)}`,\n value,\n expected: 'number',\n recordId,\n }\n }\n break\n\n case 'integer':\n if (!checks.isInteger(value)) {\n return {\n type: 'type_mismatch',\n model,\n field,\n message: `Expected integer but got ${checks.getTypeName(value)}`,\n value,\n expected: 'integer',\n recordId,\n }\n }\n break\n\n case 'boolean':\n if (!checks.isBoolean(value)) {\n return {\n type: 'type_mismatch',\n model,\n field,\n message: `Expected boolean but got ${checks.getTypeName(value)}`,\n value,\n expected: 'boolean',\n recordId,\n }\n }\n break\n\n case 'array':\n if (!checks.isArray(value)) {\n return {\n type: 'type_mismatch',\n model,\n field,\n message: `Expected array but got ${checks.getTypeName(value)}`,\n value,\n expected: 'array',\n recordId,\n }\n }\n break\n\n case 'object':\n if (!checks.isObject(value)) {\n return {\n type: 'type_mismatch',\n model,\n field,\n message: `Expected object but got ${checks.getTypeName(value)}`,\n value,\n expected: 'object',\n recordId,\n }\n }\n break\n }\n\n return null\n}\n\n/**\n * Validate value format matches property definition\n */\nfunction validateFormat(\n value: unknown,\n propDef: PropertyDef,\n model: string,\n field: string,\n recordId?: string\n): ValidationError | null {\n const format = propDef.format\n\n if (!format) return null\n\n switch (format) {\n case 'uuid':\n if (!checks.isUUID(value)) {\n return {\n type: 'format_invalid',\n model,\n field,\n message: `Expected UUID format but got \"${value}\"`,\n value,\n expected: 'uuid',\n recordId,\n }\n }\n break\n\n case 'email':\n if (!checks.isEmail(value)) {\n return {\n type: 'format_invalid',\n model,\n field,\n message: `Expected email format but got \"${value}\"`,\n value,\n expected: 'email',\n recordId,\n }\n }\n break\n\n case 'uri':\n case 'url':\n if (!checks.isURL(value)) {\n return {\n type: 'format_invalid',\n model,\n field,\n message: `Expected URL format but got \"${value}\"`,\n value,\n expected: 'url',\n recordId,\n }\n }\n break\n\n case 'date':\n if (!checks.isDate(value)) {\n return {\n type: 'format_invalid',\n model,\n field,\n message: `Expected date format (YYYY-MM-DD) but got \"${value}\"`,\n value,\n expected: 'date',\n recordId,\n }\n }\n break\n\n case 'date-time':\n if (!checks.isDateTime(value)) {\n return {\n type: 'format_invalid',\n model,\n field,\n message: `Expected datetime format (ISO 8601) but got \"${value}\"`,\n value,\n expected: 'date-time',\n recordId,\n }\n }\n break\n }\n\n return null\n}\n\n/**\n * Validate value against property constraints\n */\nfunction validateConstraints(\n value: unknown,\n propDef: PropertyDef,\n model: string,\n field: string,\n recordId?: string\n): ValidationError[] {\n const errors: ValidationError[] = []\n\n // String length constraints\n if (propDef.minLength !== undefined && !checks.hasMinLength(value, propDef.minLength)) {\n errors.push({\n type: 'constraint_violation',\n model,\n field,\n message: `String length must be at least ${propDef.minLength}`,\n value,\n expected: `minLength: ${propDef.minLength}`,\n recordId,\n })\n }\n\n if (propDef.maxLength !== undefined && !checks.hasMaxLength(value, propDef.maxLength)) {\n errors.push({\n type: 'constraint_violation',\n model,\n field,\n message: `String length must be at most ${propDef.maxLength}`,\n value,\n expected: `maxLength: ${propDef.maxLength}`,\n recordId,\n })\n }\n\n // Number constraints\n if (propDef.minimum !== undefined && !checks.hasMinimum(value, propDef.minimum)) {\n errors.push({\n type: 'constraint_violation',\n model,\n field,\n message: `Value must be at least ${propDef.minimum}`,\n value,\n expected: `minimum: ${propDef.minimum}`,\n recordId,\n })\n }\n\n if (propDef.maximum !== undefined && !checks.hasMaximum(value, propDef.maximum)) {\n errors.push({\n type: 'constraint_violation',\n model,\n field,\n message: `Value must be at most ${propDef.maximum}`,\n value,\n expected: `maximum: ${propDef.maximum}`,\n recordId,\n })\n }\n\n // Pattern constraint\n if (propDef.pattern && !checks.matchesPattern(value, propDef.pattern)) {\n errors.push({\n type: 'constraint_violation',\n model,\n field,\n message: `Value must match pattern: ${propDef.pattern}`,\n value,\n expected: `pattern: ${propDef.pattern}`,\n recordId,\n })\n }\n\n // Enum constraint\n if (propDef.enum && !checks.isInEnum(value, propDef.enum)) {\n errors.push({\n type: 'enum_invalid',\n model,\n field,\n message: `Value must be one of: ${propDef.enum.join(', ')}`,\n value,\n expected: propDef.enum.join(' | '),\n recordId,\n })\n }\n\n return errors\n}\n\n/**\n * Validate a reference to another model\n */\nfunction validateReference(\n value: unknown,\n target: { model: string; field: string },\n model: string,\n field: string,\n recordId: string | undefined,\n idIndexes: Map<string, Set<string>>\n): ValidationError | null {\n const targetIds = idIndexes.get(target.model)\n\n if (!targetIds) {\n // Target model doesn't exist in data - might be intentional\n return null\n }\n\n const valueStr = String(value)\n if (!targetIds.has(valueStr)) {\n return {\n type: 'missing_reference',\n model,\n field,\n message: `Reference to ${target.model}.${target.field} with value \"${value}\" does not exist`,\n value,\n expected: `Valid ${target.model} ID`,\n recordId,\n }\n }\n\n return null\n}\n\n/**\n * Validate a relationship from the schema\n */\nfunction validateRelationship(\n relationship: Relationship,\n data: DemoData,\n idIndexes: Map<string, Set<string>>\n): ValidationError[] {\n const errors: ValidationError[] = []\n const { from, to } = relationship\n\n const sourceData = data[from.model]\n if (!sourceData) return errors\n\n const targetIds = idIndexes.get(to.model)\n if (!targetIds) return errors\n\n for (const record of sourceData) {\n const obj = record as Record<string, unknown>\n const value = obj[from.field]\n\n if (value !== null && value !== undefined) {\n const valueStr = String(value)\n if (!targetIds.has(valueStr)) {\n errors.push({\n type: 'missing_reference',\n model: from.model,\n field: from.field,\n message: `${from.model}.${from.field} references non-existent ${to.model} with ID \"${value}\"`,\n value,\n expected: `Valid ${to.model}.${to.field}`,\n recordId: getRecordId(record),\n })\n }\n }\n }\n\n return errors\n}\n\n/**\n * Check for duplicate IDs within each model\n */\nfunction checkDuplicateIds(data: DemoData): ValidationError[] {\n const errors: ValidationError[] = []\n\n for (const [modelName, records] of Object.entries(data)) {\n const seenIds = new Map<string, number>()\n\n for (let i = 0; i < records.length; i++) {\n const id = getRecordId(records[i])\n if (id) {\n const existingIndex = seenIds.get(id)\n if (existingIndex !== undefined) {\n errors.push({\n type: 'duplicate_id',\n model: modelName,\n field: 'id',\n message: `Duplicate ID \"${id}\" found at records ${existingIndex} and ${i}`,\n value: id,\n })\n } else {\n seenIds.set(id, i)\n }\n }\n }\n }\n\n return errors\n}\n\n/**\n * Validate timestamp ordering (e.g., createdAt <= updatedAt)\n */\nexport function validateTimestampOrder(\n data: DemoData,\n rules: Array<{ model: string; before: string; after: string }>\n): ValidationError[] {\n const errors: ValidationError[] = []\n\n for (const rule of rules) {\n const records = data[rule.model]\n if (!records) continue\n\n for (const record of records) {\n const obj = record as Record<string, unknown>\n const beforeValue = obj[rule.before]\n const afterValue = obj[rule.after]\n\n if (beforeValue && afterValue) {\n if (!checks.isBeforeOrEqual(beforeValue, afterValue)) {\n errors.push({\n type: 'timestamp_order',\n model: rule.model,\n field: rule.before,\n message: `${rule.before} (${beforeValue}) must be before or equal to ${rule.after} (${afterValue})`,\n value: beforeValue,\n expected: `<= ${afterValue}`,\n recordId: getRecordId(record),\n })\n }\n }\n }\n }\n\n return errors\n}\n","/**\n * ID generation utilities for demo data\n *\n * Generates consistent, deterministic IDs for reproducible fixtures.\n */\n\n/**\n * Generate a UUID v4 (random)\n * Uses a simple implementation for portability\n */\nexport function generateUUID(): string {\n const hex = '0123456789abcdef'\n let uuid = ''\n\n for (let i = 0; i < 36; i++) {\n if (i === 8 || i === 13 || i === 18 || i === 23) {\n uuid += '-'\n } else if (i === 14) {\n uuid += '4' // Version 4\n } else if (i === 19) {\n uuid += hex[(Math.random() * 4) | 8] // Variant bits\n } else {\n uuid += hex[Math.floor(Math.random() * 16)]\n }\n }\n\n return uuid\n}\n\n/**\n * Generate a deterministic UUID from a seed\n * Useful for reproducible fixtures\n */\nexport function generateSeededUUID(seed: number): string {\n // Simple seeded random number generator (LCG)\n const next = (s: number): [number, number] => {\n const newSeed = (s * 1664525 + 1013904223) >>> 0\n return [newSeed, newSeed / 0xffffffff]\n }\n\n const hex = '0123456789abcdef'\n let uuid = ''\n let currentSeed = seed\n\n for (let i = 0; i < 36; i++) {\n if (i === 8 || i === 13 || i === 18 || i === 23) {\n uuid += '-'\n } else if (i === 14) {\n uuid += '4' // Version 4\n } else if (i === 19) {\n const [newSeed, rand] = next(currentSeed)\n currentSeed = newSeed\n uuid += hex[Math.floor(rand * 4) + 8] // Variant bits\n } else {\n const [newSeed, rand] = next(currentSeed)\n currentSeed = newSeed\n uuid += hex[Math.floor(rand * 16)]\n }\n }\n\n return uuid\n}\n\n/**\n * Generate a model-specific ID\n * Format: {prefix}_{index} or UUID based on format hint\n */\nexport function generateIdForModel(\n modelName: string,\n index: number,\n format?: string\n): string {\n if (format === 'uuid') {\n return generateSeededUUID(hashString(modelName) + index)\n }\n\n // Use lowercase prefix with underscore\n const prefix = modelName.toLowerCase().slice(0, 4)\n return `${prefix}_${String(index + 1).padStart(3, '0')}`\n}\n\n/**\n * Generate an ID based on a property definition\n */\nexport function generateId(format?: string, index: number = 0): string {\n if (format === 'uuid') {\n return generateSeededUUID(index * 12345)\n }\n\n return `id_${String(index + 1).padStart(3, '0')}`\n}\n\n/**\n * Generate a prefixed ID\n * @example generatePrefixedId('user', 1) => 'user_001'\n */\nexport function generatePrefixedId(prefix: string, index: number): string {\n return `${prefix}_${String(index + 1).padStart(3, '0')}`\n}\n\n/**\n * Generate a CUID-like ID\n * Format: c + timestamp + random\n */\nexport function generateCuid(): string {\n const timestamp = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 8)\n return `c${timestamp}${random}`\n}\n\n/**\n * Generate a ULID-like ID\n * Format: timestamp (10 chars) + random (16 chars)\n */\nexport function generateUlid(): string {\n const chars = '0123456789ABCDEFGHJKMNPQRSTVWXYZ' // Crockford's Base32\n const timestamp = Date.now()\n\n // Encode timestamp (10 characters)\n let encoded = ''\n let t = timestamp\n for (let i = 0; i < 10; i++) {\n encoded = chars[t % 32] + encoded\n t = Math.floor(t / 32)\n }\n\n // Add random characters (16 characters)\n for (let i = 0; i < 16; i++) {\n encoded += chars[Math.floor(Math.random() * 32)]\n }\n\n return encoded\n}\n\n/**\n * Simple string hash function for seeding\n */\nfunction hashString(str: string): number {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32-bit integer\n }\n return Math.abs(hash)\n}\n\n/**\n * Check if a string looks like a UUID\n */\nexport function isUUIDFormat(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n}\n\n/**\n * Check if a string looks like a CUID\n */\nexport function isCuidFormat(value: string): boolean {\n return /^c[a-z0-9]{20,}$/.test(value)\n}\n\n/**\n * Check if a string looks like a ULID\n */\nexport function isUlidFormat(value: string): boolean {\n return /^[0-9A-HJKMNP-TV-Z]{26}$/.test(value)\n}\n","/**\n * Correlated Address Data\n *\n * Provides realistic, correlated address data for multi-country support.\n * Each location entry contains city, state/province, country, and valid postal code ranges.\n */\n\nexport interface AddressLocation {\n city: string\n state: string // State, province, or region abbreviation\n stateFull: string // Full state/province name\n country: string\n countryCode: string // ISO 3166-1 alpha-2\n postalCodeFormat: string // Regex pattern for validation\n postalCodePrefix: string // Typical prefix for this area\n timezone?: string\n}\n\nexport interface GeneratedAddress {\n line1: string\n line2?: string\n city: string\n state: string\n stateFull: string\n country: string\n countryCode: string\n postalCode: string\n formatted: string\n}\n\n// Street names that work across English-speaking countries\nconst STREET_NAMES = [\n 'Main', 'Oak', 'Park', 'Cedar', 'Maple', 'Pine', 'Elm', 'Washington',\n 'Lincoln', 'Lake', 'Hill', 'River', 'Forest', 'Spring', 'Valley',\n 'Church', 'Mill', 'School', 'North', 'South', 'East', 'West',\n 'Highland', 'Sunset', 'Willow', 'Meadow', 'Bridge', 'Grove', 'Garden',\n]\n\nconst STREET_TYPES = {\n US: ['St', 'Ave', 'Blvd', 'Dr', 'Ln', 'Way', 'Ct', 'Pl', 'Rd', 'Cir'],\n UK: ['Street', 'Road', 'Lane', 'Avenue', 'Close', 'Drive', 'Way', 'Place', 'Crescent', 'Gardens'],\n CA: ['St', 'Ave', 'Blvd', 'Dr', 'Rd', 'Way', 'Cres', 'Pl', 'Ct', 'Lane'],\n AU: ['St', 'Ave', 'Rd', 'Dr', 'Ct', 'Cl', 'Cres', 'Pde', 'Tce', 'Way'],\n DE: ['Straße', 'Weg', 'Allee', 'Platz', 'Ring', 'Gasse', 'Damm', 'Ufer'],\n}\n\n// Apartment/unit designators by country\nconst UNIT_TYPES = {\n US: ['Apt', 'Suite', 'Unit', '#'],\n UK: ['Flat', 'Unit', 'Suite'],\n CA: ['Apt', 'Suite', 'Unit', '#'],\n AU: ['Unit', 'Apt', 'Suite', 'Level'],\n DE: ['Wohnung', 'Etage'],\n}\n\n/**\n * United States Locations\n * Major cities with accurate state mappings and zip code prefixes\n */\nexport const US_LOCATIONS: AddressLocation[] = [\n // New York\n { city: 'New York', state: 'NY', stateFull: 'New York', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '100', timezone: 'America/New_York' },\n { city: 'Brooklyn', state: 'NY', stateFull: 'New York', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '112', timezone: 'America/New_York' },\n { city: 'Buffalo', state: 'NY', stateFull: 'New York', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '142', timezone: 'America/New_York' },\n // California\n { city: 'Los Angeles', state: 'CA', stateFull: 'California', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '900', timezone: 'America/Los_Angeles' },\n { city: 'San Francisco', state: 'CA', stateFull: 'California', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '941', timezone: 'America/Los_Angeles' },\n { city: 'San Diego', state: 'CA', stateFull: 'California', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '921', timezone: 'America/Los_Angeles' },\n { city: 'San Jose', state: 'CA', stateFull: 'California', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '951', timezone: 'America/Los_Angeles' },\n // Texas\n { city: 'Houston', state: 'TX', stateFull: 'Texas', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '770', timezone: 'America/Chicago' },\n { city: 'Dallas', state: 'TX', stateFull: 'Texas', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '752', timezone: 'America/Chicago' },\n { city: 'Austin', state: 'TX', stateFull: 'Texas', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '787', timezone: 'America/Chicago' },\n { city: 'San Antonio', state: 'TX', stateFull: 'Texas', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '782', timezone: 'America/Chicago' },\n // Illinois\n { city: 'Chicago', state: 'IL', stateFull: 'Illinois', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '606', timezone: 'America/Chicago' },\n // Arizona\n { city: 'Phoenix', state: 'AZ', stateFull: 'Arizona', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '850', timezone: 'America/Phoenix' },\n // Pennsylvania\n { city: 'Philadelphia', state: 'PA', stateFull: 'Pennsylvania', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '191', timezone: 'America/New_York' },\n { city: 'Pittsburgh', state: 'PA', stateFull: 'Pennsylvania', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '152', timezone: 'America/New_York' },\n // Florida\n { city: 'Miami', state: 'FL', stateFull: 'Florida', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '331', timezone: 'America/New_York' },\n { city: 'Orlando', state: 'FL', stateFull: 'Florida', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '328', timezone: 'America/New_York' },\n { city: 'Tampa', state: 'FL', stateFull: 'Florida', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '336', timezone: 'America/New_York' },\n // Washington\n { city: 'Seattle', state: 'WA', stateFull: 'Washington', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '981', timezone: 'America/Los_Angeles' },\n // Massachusetts\n { city: 'Boston', state: 'MA', stateFull: 'Massachusetts', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '021', timezone: 'America/New_York' },\n // Colorado\n { city: 'Denver', state: 'CO', stateFull: 'Colorado', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '802', timezone: 'America/Denver' },\n // Georgia\n { city: 'Atlanta', state: 'GA', stateFull: 'Georgia', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '303', timezone: 'America/New_York' },\n // Nevada\n { city: 'Las Vegas', state: 'NV', stateFull: 'Nevada', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '891', timezone: 'America/Los_Angeles' },\n // Oregon\n { city: 'Portland', state: 'OR', stateFull: 'Oregon', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '972', timezone: 'America/Los_Angeles' },\n // Minnesota\n { city: 'Minneapolis', state: 'MN', stateFull: 'Minnesota', country: 'United States', countryCode: 'US', postalCodeFormat: '^\\\\d{5}(-\\\\d{4})?$', postalCodePrefix: '554', timezone: 'America/Chicago' },\n]\n\n/**\n * Canada Locations\n * Major cities with province mappings and postal code prefixes\n */\nexport const CA_LOCATIONS: AddressLocation[] = [\n // Ontario\n { city: 'Toronto', state: 'ON', stateFull: 'Ontario', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'M5', timezone: 'America/Toronto' },\n { city: 'Ottawa', state: 'ON', stateFull: 'Ontario', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'K1', timezone: 'America/Toronto' },\n { city: 'Mississauga', state: 'ON', stateFull: 'Ontario', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'L5', timezone: 'America/Toronto' },\n // British Columbia\n { city: 'Vancouver', state: 'BC', stateFull: 'British Columbia', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'V6', timezone: 'America/Vancouver' },\n { city: 'Victoria', state: 'BC', stateFull: 'British Columbia', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'V8', timezone: 'America/Vancouver' },\n // Quebec\n { city: 'Montreal', state: 'QC', stateFull: 'Quebec', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'H3', timezone: 'America/Montreal' },\n { city: 'Quebec City', state: 'QC', stateFull: 'Quebec', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'G1', timezone: 'America/Montreal' },\n // Alberta\n { city: 'Calgary', state: 'AB', stateFull: 'Alberta', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'T2', timezone: 'America/Edmonton' },\n { city: 'Edmonton', state: 'AB', stateFull: 'Alberta', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'T5', timezone: 'America/Edmonton' },\n // Manitoba\n { city: 'Winnipeg', state: 'MB', stateFull: 'Manitoba', country: 'Canada', countryCode: 'CA', postalCodeFormat: '^[A-Z]\\\\d[A-Z] ?\\\\d[A-Z]\\\\d$', postalCodePrefix: 'R3', timezone: 'America/Winnipeg' },\n]\n\n/**\n * United Kingdom Locations\n * Major cities with county/region and postcode prefixes\n */\nexport const UK_LOCATIONS: AddressLocation[] = [\n // England\n { city: 'London', state: 'Greater London', stateFull: 'Greater London', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'W1', timezone: 'Europe/London' },\n { city: 'Manchester', state: 'Greater Manchester', stateFull: 'Greater Manchester', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'M1', timezone: 'Europe/London' },\n { city: 'Birmingham', state: 'West Midlands', stateFull: 'West Midlands', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'B1', timezone: 'Europe/London' },\n { city: 'Liverpool', state: 'Merseyside', stateFull: 'Merseyside', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'L1', timezone: 'Europe/London' },\n { city: 'Leeds', state: 'West Yorkshire', stateFull: 'West Yorkshire', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'LS1', timezone: 'Europe/London' },\n { city: 'Bristol', state: 'Bristol', stateFull: 'City of Bristol', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'BS1', timezone: 'Europe/London' },\n { city: 'Cambridge', state: 'Cambridgeshire', stateFull: 'Cambridgeshire', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'CB1', timezone: 'Europe/London' },\n { city: 'Oxford', state: 'Oxfordshire', stateFull: 'Oxfordshire', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'OX1', timezone: 'Europe/London' },\n // Scotland\n { city: 'Edinburgh', state: 'Edinburgh', stateFull: 'City of Edinburgh', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'EH1', timezone: 'Europe/London' },\n { city: 'Glasgow', state: 'Glasgow', stateFull: 'City of Glasgow', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'G1', timezone: 'Europe/London' },\n // Wales\n { city: 'Cardiff', state: 'Cardiff', stateFull: 'Cardiff', country: 'United Kingdom', countryCode: 'GB', postalCodeFormat: '^[A-Z]{1,2}\\\\d[A-Z\\\\d]? ?\\\\d[A-Z]{2}$', postalCodePrefix: 'CF1', timezone: 'Europe/London' },\n]\n\n/**\n * Australia Locations\n * Major cities with state mappings and postcode ranges\n */\nexport const AU_LOCATIONS: AddressLocation[] = [\n // New South Wales\n { city: 'Sydney', state: 'NSW', stateFull: 'New South Wales', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '2000', timezone: 'Australia/Sydney' },\n { city: 'Newcastle', state: 'NSW', stateFull: 'New South Wales', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '2300', timezone: 'Australia/Sydney' },\n // Victoria\n { city: 'Melbourne', state: 'VIC', stateFull: 'Victoria', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '3000', timezone: 'Australia/Melbourne' },\n { city: 'Geelong', state: 'VIC', stateFull: 'Victoria', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '3220', timezone: 'Australia/Melbourne' },\n // Queensland\n { city: 'Brisbane', state: 'QLD', stateFull: 'Queensland', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '4000', timezone: 'Australia/Brisbane' },\n { city: 'Gold Coast', state: 'QLD', stateFull: 'Queensland', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '4217', timezone: 'Australia/Brisbane' },\n // Western Australia\n { city: 'Perth', state: 'WA', stateFull: 'Western Australia', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '6000', timezone: 'Australia/Perth' },\n // South Australia\n { city: 'Adelaide', state: 'SA', stateFull: 'South Australia', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '5000', timezone: 'Australia/Adelaide' },\n // Tasmania\n { city: 'Hobart', state: 'TAS', stateFull: 'Tasmania', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '7000', timezone: 'Australia/Hobart' },\n // ACT\n { city: 'Canberra', state: 'ACT', stateFull: 'Australian Capital Territory', country: 'Australia', countryCode: 'AU', postalCodeFormat: '^\\\\d{4}$', postalCodePrefix: '2600', timezone: 'Australia/Sydney' },\n]\n\n/**\n * Germany Locations\n * Major cities with Bundesland (federal state) and PLZ (postal code) prefixes\n */\nexport const DE_LOCATIONS: AddressLocation[] = [\n // Berlin\n { city: 'Berlin', state: 'BE', stateFull: 'Berlin', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '10115', timezone: 'Europe/Berlin' },\n // Bavaria\n { city: 'Munich', state: 'BY', stateFull: 'Bavaria', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '80331', timezone: 'Europe/Berlin' },\n { city: 'Nuremberg', state: 'BY', stateFull: 'Bavaria', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '90402', timezone: 'Europe/Berlin' },\n // Hamburg\n { city: 'Hamburg', state: 'HH', stateFull: 'Hamburg', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '20095', timezone: 'Europe/Berlin' },\n // Hesse\n { city: 'Frankfurt', state: 'HE', stateFull: 'Hesse', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '60311', timezone: 'Europe/Berlin' },\n // North Rhine-Westphalia\n { city: 'Cologne', state: 'NW', stateFull: 'North Rhine-Westphalia', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '50667', timezone: 'Europe/Berlin' },\n { city: 'Düsseldorf', state: 'NW', stateFull: 'North Rhine-Westphalia', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '40213', timezone: 'Europe/Berlin' },\n { city: 'Dortmund', state: 'NW', stateFull: 'North Rhine-Westphalia', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '44135', timezone: 'Europe/Berlin' },\n // Baden-Württemberg\n { city: 'Stuttgart', state: 'BW', stateFull: 'Baden-Württemberg', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '70173', timezone: 'Europe/Berlin' },\n // Saxony\n { city: 'Dresden', state: 'SN', stateFull: 'Saxony', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '01067', timezone: 'Europe/Berlin' },\n { city: 'Leipzig', state: 'SN', stateFull: 'Saxony', country: 'Germany', countryCode: 'DE', postalCodeFormat: '^\\\\d{5}$', postalCodePrefix: '04109', timezone: 'Europe/Berlin' },\n]\n\n/**\n * All locations combined, indexed by country code\n */\nexport const ALL_LOCATIONS: Record<string, AddressLocation[]> = {\n US: US_LOCATIONS,\n CA: CA_LOCATIONS,\n GB: UK_LOCATIONS,\n AU: AU_LOCATIONS,\n DE: DE_LOCATIONS,\n}\n\n/**\n * Flat array of all locations for random selection\n */\nexport const LOCATIONS_FLAT: AddressLocation[] = [\n ...US_LOCATIONS,\n ...CA_LOCATIONS,\n ...UK_LOCATIONS,\n ...AU_LOCATIONS,\n ...DE_LOCATIONS,\n]\n\n/**\n * Get street types for a given country code\n */\nexport function getStreetTypes(countryCode: string): string[] {\n return STREET_TYPES[countryCode as keyof typeof STREET_TYPES] ?? STREET_TYPES.US\n}\n\n/**\n * Get unit types for a given country code\n */\nexport function getUnitTypes(countryCode: string): string[] {\n return UNIT_TYPES[countryCode as keyof typeof UNIT_TYPES] ?? UNIT_TYPES.US\n}\n\n/**\n * Get street names (universal)\n */\nexport function getStreetNames(): string[] {\n return STREET_NAMES\n}\n\n/**\n * Generate a postal code for a given location\n */\nexport function generatePostalCode(location: AddressLocation, seed: number): string {\n const seededRandom = (s: number) => {\n const x = Math.sin(s) * 10000\n return x - Math.floor(x)\n }\n\n const { countryCode, postalCodePrefix } = location\n\n switch (countryCode) {\n case 'US': {\n // US ZIP: 5 digits, use prefix + random suffix\n const prefix = postalCodePrefix.slice(0, 3)\n const suffix = String(Math.floor(seededRandom(seed) * 100)).padStart(2, '0')\n return `${prefix}${suffix}`\n }\n case 'CA': {\n // Canadian postal code: A1A 1A1 format\n const letters = 'ABCEGHJKLMNPRSTVWXYZ' // Valid Canadian postal code letters\n const prefix = postalCodePrefix\n const digit1 = Math.floor(seededRandom(seed) * 10)\n const letter1 = letters[Math.floor(seededRandom(seed + 1) * letters.length)]\n const digit2 = Math.floor(seededRandom(seed + 2) * 10)\n return `${prefix}${digit1} ${letter1}${digit2}${letters[Math.floor(seededRandom(seed + 3) * letters.length)]}`\n }\n case 'GB': {\n // UK postcode: prefix + digit + letter + space + digit + 2 letters\n const prefix = postalCodePrefix\n const letters = 'ABDEFGHJLNPQRSTUWXYZ'\n const digit = Math.floor(seededRandom(seed) * 10)\n const letter1 = letters[Math.floor(seededRandom(seed + 1) * letters.length)]\n const letter2 = letters[Math.floor(seededRandom(seed + 2) * letters.length)]\n return `${prefix} ${digit}${letter1}${letter2}`\n }\n case 'AU': {\n // Australian postcode: 4 digits based on prefix\n return postalCodePrefix\n }\n case 'DE': {\n // German PLZ: 5 digits based on prefix\n return postalCodePrefix\n }\n default:\n return postalCodePrefix\n }\n}\n\n/**\n * Generate a complete correlated address\n */\nexport function generateCorrelatedAddress(\n index: number,\n seed: number = 0,\n options: {\n countryCode?: string\n includeUnit?: boolean\n } = {}\n): GeneratedAddress {\n const seededRandom = (s: number) => {\n const x = Math.sin(s) * 10000\n return x - Math.floor(x)\n }\n\n const combinedSeed = seed + index * 7919 // Prime multiplier for variety\n\n // Select country (if not specified, weight towards US)\n let locations: AddressLocation[]\n if (options.countryCode && ALL_LOCATIONS[options.countryCode]) {\n locations = ALL_LOCATIONS[options.countryCode]\n } else {\n // Weight selection: 50% US, 15% each for CA/UK, 10% each for AU/DE\n const rand = seededRandom(combinedSeed)\n if (rand < 0.5) {\n locations = US_LOCATIONS\n } else if (rand < 0.65) {\n locations = CA_LOCATIONS\n } else if (rand < 0.8) {\n locations = UK_LOCATIONS\n } else if (rand < 0.9) {\n locations = AU_LOCATIONS\n } else {\n locations = DE_LOCATIONS\n }\n }\n\n // Select a location from the pool\n const locationIndex = Math.floor(seededRandom(combinedSeed + 1) * locations.length)\n const location = locations[locationIndex]\n\n // Generate street address\n const streetNumber = 100 + Math.floor(seededRandom(combinedSeed + 2) * 9900)\n const streetNameIndex = Math.floor(seededRandom(combinedSeed + 3) * STREET_NAMES.length)\n const streetName = STREET_NAMES[streetNameIndex]\n const streetTypes = getStreetTypes(location.countryCode)\n const streetTypeIndex = Math.floor(seededRandom(combinedSeed + 4) * streetTypes.length)\n const streetType = streetTypes[streetTypeIndex]\n\n // Generate line1\n let line1: string\n if (location.countryCode === 'DE') {\n // German format: Street Name + Number\n line1 = `${streetName}${streetType} ${streetNumber}`\n } else {\n // Standard format: Number + Street Name + Type\n line1 = `${streetNumber} ${streetName} ${streetType}`\n }\n\n // Optionally generate unit/apartment\n let line2: string | undefined\n if (options.includeUnit || seededRandom(combinedSeed + 5) < 0.3) {\n const unitTypes = getUnitTypes(location.countryCode)\n const unitType = unitTypes[Math.floor(seededRandom(combinedSeed + 6) * unitTypes.length)]\n const unitNumber = Math.floor(seededRandom(combinedSeed + 7) * 500) + 1\n line2 = `${unitType} ${unitNumber}`\n }\n\n // Generate postal code\n const postalCode = generatePostalCode(location, combinedSeed + 8)\n\n // Build formatted address\n let formatted: string\n if (location.countryCode === 'GB') {\n // UK format\n formatted = line2\n ? `${line2}, ${line1}\\n${location.city}\\n${location.state}\\n${postalCode}`\n : `${line1}\\n${location.city}\\n${location.state}\\n${postalCode}`\n } else if (location.countryCode === 'DE') {\n // German format\n formatted = line2\n ? `${line1}, ${line2}\\n${postalCode} ${location.city}\\n${location.country}`\n : `${line1}\\n${postalCode} ${location.city}\\n${location.country}`\n } else {\n // Standard US/CA/AU format\n formatted = line2\n ? `${line1}\\n${line2}\\n${location.city}, ${location.state} ${postalCode}\\n${location.country}`\n : `${line1}\\n${location.city}, ${location.state} ${postalCode}\\n${location.country}`\n }\n\n return {\n line1,\n line2,\n city: location.city,\n state: location.state,\n stateFull: location.stateFull,\n country: location.country,\n countryCode: location.countryCode,\n postalCode,\n formatted,\n }\n}\n\n/**\n * Generate multiple correlated addresses\n */\nexport function generateCorrelatedAddresses(\n count: number,\n seed: number = 0,\n options: {\n countryCode?: string\n includeUnit?: boolean\n } = {}\n): GeneratedAddress[] {\n const addresses: GeneratedAddress[] = []\n for (let i = 0; i < count; i++) {\n addresses.push(generateCorrelatedAddress(i, seed, options))\n }\n return addresses\n}\n\n/**\n * Validate a postal code against a location's expected format\n */\nexport function validatePostalCode(postalCode: string, countryCode: string): boolean {\n const locations = ALL_LOCATIONS[countryCode]\n if (!locations || locations.length === 0) return false\n\n const format = locations[0].postalCodeFormat\n const regex = new RegExp(format, 'i')\n return regex.test(postalCode)\n}\n","/**\n * Value generators for different property types\n *\n * Generates realistic demo data based on property type, format, and constraints.\n */\n\nimport type { PropertyDef, DataModel } from '../../schema'\nimport type { FieldRule, Dataset } from '../types'\nimport { generateIdForModel, generateSeededUUID } from './id-generator'\nimport {\n generateCorrelatedAddress,\n type GeneratedAddress,\n} from './address-data'\n\n/**\n * Context for generating correlated values within a single record.\n * This allows related fields (like city, state, zip) to be consistent,\n * and ensures fields linked to the same dataset use the same row.\n */\nexport interface RecordContext {\n /** Pre-generated correlated address for this record */\n address?: GeneratedAddress\n /** Country code preference (US, CA, GB, AU, DE) */\n countryCode?: string\n /**\n * Pre-selected row indices for each dataset (Phase 2).\n * Key is dataset ID, value is the row index to use.\n * This ensures multiple fields linked to the same dataset use the same row.\n */\n datasetRowIndices?: Map<string, number>\n}\n\n/**\n * Create a record context with pre-generated correlated data.\n * Call this once per record to ensure address fields are consistent\n * and dataset fields use the same row for correlation.\n */\nexport function createRecordContext(\n index: number,\n seed: number = 0,\n options: {\n countryCode?: string\n hasAddressFields?: boolean\n /** Datasets for row-based correlation (Phase 2) */\n datasets?: Record<string, Dataset>\n } = {}\n): RecordContext {\n const context: RecordContext = {\n countryCode: options.countryCode,\n }\n\n // Pre-generate address if the model has address fields\n if (options.hasAddressFields !== false) {\n context.address = generateCorrelatedAddress(index, seed, {\n countryCode: options.countryCode,\n })\n }\n\n // Pre-select row indices for each dataset (Phase 2)\n // This ensures multiple fields linked to the same dataset use the same row\n if (options.datasets && Object.keys(options.datasets).length > 0) {\n const datasetRowIndices = new Map<string, number>()\n for (const [datasetId, dataset] of Object.entries(options.datasets)) {\n if (dataset.rows.length > 0) {\n // Use a unique seed per dataset to get different row selections per record\n const rowSeed = seed + index * 997 + hashString(datasetId)\n const rowIndex = Math.floor(seededRandom(rowSeed) * dataset.rows.length)\n datasetRowIndices.set(datasetId, rowIndex)\n }\n }\n context.datasetRowIndices = datasetRowIndices\n }\n\n return context\n}\n\n/**\n * Check if a model has any address-related fields\n */\nexport function modelHasAddressFields(properties: Record<string, { name: string }>): boolean {\n for (const prop of Object.values(properties)) {\n const lowerName = prop.name.toLowerCase()\n if (isAddressField(lowerName)) {\n return true\n }\n }\n return false\n}\n\n// Re-export address types for external use\nexport type { GeneratedAddress } from './address-data'\nexport { generateCorrelatedAddress, generateCorrelatedAddresses } from './address-data'\n\n/**\n * Simple seeded random number generator (LCG)\n * Returns a value between 0 and 1\n */\nfunction seededRandom(seed: number): number {\n const x = Math.sin(seed) * 10000\n return x - Math.floor(x)\n}\n\n/**\n * Generate a value from a custom field rule\n * Returns undefined if the rule doesn't apply or is incomplete\n *\n * @param rule - The custom field rule to apply\n * @param index - Record index for seeded generation\n * @param seed - Random seed for deterministic results\n * @param schemaEnum - Schema enum values (for enum rules)\n * @param recordContext - Context with pre-selected dataset row indices\n * @param datasets - Available datasets (for fromDataset rules)\n */\nfunction generateFromCustomRule(\n rule: FieldRule,\n index: number,\n seed: number,\n schemaEnum?: unknown[],\n recordContext?: RecordContext,\n datasets?: Record<string, Dataset>\n): unknown {\n switch (rule.type) {\n case 'string':\n if (rule.strategy === 'oneOf' && rule.values && rule.values.length > 0) {\n const idx = Math.floor(seededRandom(seed) * rule.values.length)\n return rule.values[idx]\n }\n if (rule.strategy === 'pattern' && rule.pattern) {\n return generateFromPattern(rule.pattern, index, seed)\n }\n return undefined\n\n case 'number':\n if (rule.strategy === 'fixed' && rule.value !== undefined) {\n return rule.value\n }\n if (rule.strategy === 'range') {\n const min = rule.min ?? 0\n const max = rule.max ?? 100\n const precision = rule.precision ?? 2\n const value = min + seededRandom(seed) * (max - min)\n return Number(value.toFixed(precision))\n }\n return undefined\n\n case 'integer':\n if (rule.strategy === 'fixed' && rule.value !== undefined) {\n return Math.round(rule.value)\n }\n if (rule.strategy === 'range') {\n const min = rule.min ?? 0\n const max = rule.max ?? 100\n return Math.floor(min + seededRandom(seed) * (max - min + 1))\n }\n return undefined\n\n case 'boolean':\n if (rule.strategy === 'fixed' && rule.value !== undefined) {\n return rule.value\n }\n if (rule.strategy === 'weighted') {\n const probability = rule.trueProbability ?? 0.5\n return seededRandom(seed) < probability\n }\n return undefined\n\n case 'enum':\n if (rule.strategy === 'subset' && rule.allowedValues && rule.allowedValues.length > 0) {\n const idx = Math.floor(seededRandom(seed) * rule.allowedValues.length)\n return rule.allowedValues[idx]\n }\n if (rule.strategy === 'weighted' && rule.weights) {\n // Use schema enum values or weights keys as the value pool\n const values = schemaEnum?.map(String) ?? Object.keys(rule.weights)\n if (values.length === 0) return undefined\n\n // Calculate total weight\n let totalWeight = 0\n for (const v of values) {\n totalWeight += rule.weights[v] ?? 1\n }\n\n // Pick a value based on weights\n let randomPoint = seededRandom(seed) * totalWeight\n for (const v of values) {\n const weight = rule.weights[v] ?? 1\n randomPoint -= weight\n if (randomPoint <= 0) {\n return v\n }\n }\n // Fallback to last value\n return values[values.length - 1]\n }\n return undefined\n\n // Phase 2: Linked Dataset support\n case 'fromDataset': {\n const dataset = datasets?.[rule.datasetId]\n if (!dataset || dataset.rows.length === 0) {\n return null // Dataset not found or empty\n }\n\n const columnIndex = dataset.columns.indexOf(rule.column)\n if (columnIndex === -1) {\n return null // Column not found\n }\n\n // Use pre-selected row from RecordContext for correlation\n // This ensures all fields linked to the same dataset use the same row\n let rowIndex = recordContext?.datasetRowIndices?.get(rule.datasetId)\n if (rowIndex === undefined) {\n // Fallback to seeded random if no context (shouldn't happen in normal use)\n rowIndex = Math.floor(seededRandom(seed) * dataset.rows.length)\n }\n\n return dataset.rows[rowIndex]?.[columnIndex] ?? null\n }\n\n default:\n return undefined\n }\n}\n\n/**\n * Generate a value from a pattern template\n * Supports {0000} for zero-padded numbers and {uuid} for UUIDs\n */\nfunction generateFromPattern(pattern: string, index: number, seed: number): string {\n let result = pattern\n\n // Handle {0000} style patterns (zero-padded sequential number)\n const numPattern = /\\{(0+)\\}/g\n result = result.replace(numPattern, (_, zeros) => {\n const length = zeros.length\n return String(index).padStart(length, '0')\n })\n\n // Handle {uuid} pattern\n result = result.replace(/\\{uuid\\}/gi, () => {\n return generateSeededUUID(seed + index * 12345)\n })\n\n // Handle {random:N} pattern for random digits\n const randomPattern = /\\{random:(\\d+)\\}/g\n result = result.replace(randomPattern, (_, lengthStr) => {\n const length = parseInt(lengthStr, 10)\n let randomStr = ''\n for (let i = 0; i < length; i++) {\n randomStr += Math.floor(seededRandom(seed + i) * 10)\n }\n return randomStr\n })\n\n return result\n}\n\n/**\n * Generate a value for a property definition\n *\n * @param propDef - The property definition from the schema\n * @param index - The record index (0-based)\n * @param baseTimestamp - Optional base timestamp for date generation\n * @param seed - Random seed for deterministic generation\n * @param recordContext - Optional context for correlated field generation\n * @param customRule - Optional custom generation rule for this field\n * @param datasets - Optional datasets for fromDataset rules (Phase 2)\n */\nexport function generateValue(\n propDef: PropertyDef,\n index: number,\n baseTimestamp?: number,\n seed: number = 0,\n recordContext?: RecordContext,\n customRule?: FieldRule,\n datasets?: Record<string, Dataset>\n): unknown {\n const { type } = propDef\n\n // Create a unique seed for this field by combining seed, index, and field name\n const fieldSeed = seed + index * 1000 + hashString(propDef.name || '')\n\n // Check for custom rule first - this takes priority over default generation\n if (customRule) {\n const customValue = generateFromCustomRule(\n customRule,\n index,\n fieldSeed,\n propDef.enum,\n recordContext,\n datasets\n )\n if (customValue !== undefined) {\n return customValue\n }\n // If custom rule didn't produce a value, fall through to default generation\n }\n\n // Handle nullable - occasionally return null (using seeded random)\n // Skip for address fields to ensure consistent empty string vs null behavior\n const lowerName = propDef.name?.toLowerCase() ?? ''\n if (propDef.nullable && !isAddressField(lowerName) && seededRandom(fieldSeed + 1) < 0.1) {\n return null\n }\n\n // Use default value if available (but NOT for ID fields that need uniqueness)\n const isIdField = propDef.name?.toLowerCase() === 'id' || propDef.format === 'uuid'\n if (propDef.default !== undefined && !isIdField) {\n return propDef.default\n }\n\n // Use example value if available (but NOT for ID fields that need uniqueness)\n if (propDef.example !== undefined && !isIdField) {\n return propDef.example\n }\n\n // Handle enums - use seeded selection for variety\n if (propDef.enum && propDef.enum.length > 0) {\n const enumIndex = Math.floor(seededRandom(fieldSeed + 2) * propDef.enum.length)\n return propDef.enum[enumIndex]\n }\n\n // Generate based on type and format\n switch (type) {\n case 'string':\n return generateStringValue(propDef, index, baseTimestamp, fieldSeed, recordContext)\n case 'number':\n return generateNumberValue(propDef, index, fieldSeed)\n case 'integer':\n return generateIntegerValue(propDef, fieldSeed)\n case 'boolean':\n return generateBooleanValue(index, fieldSeed)\n case 'array':\n return generateArrayValue(propDef, index, baseTimestamp, fieldSeed)\n case 'object':\n return generateObjectValue(index, fieldSeed)\n default:\n return null\n }\n}\n\n/**\n * Generate a string value based on format and field name\n */\nfunction generateStringValue(\n propDef: PropertyDef,\n index: number,\n baseTimestamp?: number,\n seed: number = 0,\n recordContext?: RecordContext\n): string {\n const { format, name, minLength, maxLength, pattern } = propDef\n\n // Format-specific generation\n if (format) {\n switch (format) {\n case 'uuid':\n return generateSeededUUID(seed + index * 12345 + hashString(name))\n case 'email':\n return generateEmail(index, seed)\n case 'uri':\n case 'url':\n return generateUrl(name, index, seed)\n case 'date':\n return generateDate(index, baseTimestamp)\n case 'date-time':\n return generateDateTime(index, baseTimestamp)\n case 'time':\n return generateTime(index)\n case 'hostname': {\n const hostNum = Math.floor(seededRandom(seed + index) * 1000)\n return `host${hostNum}.example.com`\n }\n case 'ipv4': {\n const ip1 = Math.floor(seededRandom(seed + index) * 256)\n const ip2 = Math.floor(seededRandom(seed + index + 1) * 256)\n return `192.168.${ip1}.${ip2}`\n }\n case 'ipv6': {\n const hex = Math.floor(seededRandom(seed + index) * 65536)\n return `2001:db8::${hex.toString(16)}`\n }\n case 'byte': {\n const num = Math.floor(seededRandom(seed + index) * 10000)\n return btoa(`data${num}`)\n }\n case 'binary': {\n const num = Math.floor(seededRandom(seed + index) * 10000)\n return `binary_data_${num}`\n }\n case 'password': {\n const num = Math.floor(seededRandom(seed + index) * 10000)\n return `Password${num}!`\n }\n case 'phone': {\n const area = Math.floor(seededRandom(seed + index) * 1000)\n const num = Math.floor(seededRandom(seed + index + 1) * 10000)\n return `+1-555-${String(area).padStart(3, '0')}-${String(num).padStart(4, '0')}`\n }\n }\n }\n\n // Name-based inference\n const lowerName = name.toLowerCase()\n\n if (lowerName === 'id' || lowerName.endsWith('id')) {\n // Foreign key or ID field - use seeded index for variety\n const seededIdx = Math.floor(seededRandom(seed + index) * 10000)\n if (lowerName === 'id') {\n return generateIdForModel('item', seededIdx)\n }\n // Could be a foreign key - generate placeholder\n const modelHint = lowerName.slice(0, -2) // Remove 'Id'\n return generateIdForModel(modelHint || 'ref', seededIdx)\n }\n\n if (lowerName === 'email' || lowerName.includes('email')) {\n return generateEmail(index, seed)\n }\n\n if (lowerName === 'name' || lowerName === 'username') {\n return generatePersonName(index, seed)\n }\n\n if (lowerName === 'firstname' || lowerName === 'first_name') {\n const idx = Math.floor(seededRandom(seed + index) * FIRST_NAMES.length)\n return FIRST_NAMES[idx] ?? 'John'\n }\n\n if (lowerName === 'lastname' || lowerName === 'last_name') {\n const idx = Math.floor(seededRandom(seed + index) * LAST_NAMES.length)\n return LAST_NAMES[idx] ?? 'Doe'\n }\n\n if (lowerName === 'title') {\n const num = Math.floor(seededRandom(seed + index) * 1000)\n return `Title ${num}`\n }\n\n if (lowerName === 'description' || lowerName === 'bio' || lowerName === 'summary') {\n return generateDescription(index, seed)\n }\n\n // Address-related fields - use correlated generation if context available\n if (isAddressField(lowerName)) {\n const addr = recordContext?.address ?? generateCorrelatedAddress(index, seed, {\n countryCode: recordContext?.countryCode,\n })\n return getAddressFieldValue(lowerName, addr, index, seed)\n }\n\n if (lowerName === 'phone' || lowerName.includes('phone')) {\n const area = Math.floor(seededRandom(seed + index) * 1000)\n const num = Math.floor(seededRandom(seed + index + 1) * 10000)\n return `+1-555-${String(area).padStart(3, '0')}-${String(num).padStart(4, '0')}`\n }\n\n if (lowerName === 'url' || lowerName === 'website' || lowerName.includes('url')) {\n return generateUrl(name, index, seed)\n }\n\n if (lowerName.includes('image') || lowerName.includes('avatar') || lowerName.includes('photo')) {\n const imgSeed = Math.floor(seededRandom(seed + index) * 10000)\n return `https://picsum.photos/seed/${imgSeed}/200/200`\n }\n\n if (lowerName === 'status') {\n const idx = Math.floor(seededRandom(seed + index) * STATUS_VALUES.length)\n return STATUS_VALUES[idx] ?? 'active'\n }\n\n if (lowerName === 'type' || lowerName === 'category') {\n const num = Math.floor(seededRandom(seed + index) * 100)\n return `type_${num}`\n }\n\n if (lowerName.includes('createdat') || lowerName.includes('created_at')) {\n return generateDateTime(index, baseTimestamp)\n }\n\n if (lowerName.includes('updatedat') || lowerName.includes('updated_at')) {\n // Updated should be after created\n return generateDateTime(index, baseTimestamp, 3600000) // +1 hour\n }\n\n if (lowerName.includes('deletedat') || lowerName.includes('deleted_at')) {\n // Only some records are deleted (using seeded random)\n return seededRandom(seed + index) < 0.2 ? generateDateTime(index, baseTimestamp, 7200000) : ''\n }\n\n // Pattern-based generation\n if (pattern) {\n return generateFromPattern(pattern, index, seed)\n }\n\n // Respect length constraints\n const suffix = Math.floor(seededRandom(seed + index) * 10000)\n let value = `${capitalize(name)} ${suffix}`\n if (minLength && value.length < minLength) {\n value = value.padEnd(minLength, '_')\n }\n if (maxLength && value.length > maxLength) {\n value = value.slice(0, maxLength)\n }\n\n return value\n}\n\n/**\n * Generate a number value\n */\nfunction generateNumberValue(propDef: PropertyDef, index: number, seed: number = 0): number {\n const { minimum, maximum, name } = propDef\n const lowerName = name.toLowerCase()\n\n // Always respect explicit constraints\n const hasConstraints = minimum !== undefined || maximum !== undefined\n\n // Price-like fields (only if no explicit constraints)\n if (!hasConstraints && (lowerName.includes('price') || lowerName.includes('amount') || lowerName.includes('total'))) {\n const base = (index + 1) * 10 + seededRandom(seed + index) * 90\n return Math.round(base * 100) / 100\n }\n\n // Percentage fields (only if no explicit constraints)\n if (!hasConstraints && (lowerName.includes('percent') || lowerName.includes('rate'))) {\n return Math.round(seededRandom(seed + index) * 100 * 100) / 100\n }\n\n // Latitude/longitude (only if no explicit constraints)\n if (!hasConstraints && lowerName.includes('lat')) {\n return Math.round((seededRandom(seed + index) * 180 - 90) * 1000000) / 1000000\n }\n if (!hasConstraints && (lowerName.includes('lng') || lowerName.includes('lon'))) {\n return Math.round((seededRandom(seed + index) * 360 - 180) * 1000000) / 1000000\n }\n\n // Respect constraints (use defaults only when not specified)\n const min = minimum ?? 0\n const max = maximum ?? 1000\n\n return Math.round((min + seededRandom(seed + index) * (max - min)) * 100) / 100\n}\n\n/**\n * Generate an integer value\n */\nfunction generateIntegerValue(propDef: PropertyDef, seed: number = 0): number {\n const { minimum, maximum, name } = propDef\n const lowerName = name.toLowerCase()\n\n // Count/quantity fields\n if (lowerName.includes('count') || lowerName.includes('quantity') || lowerName.includes('qty')) {\n return Math.floor(seededRandom(seed) * 10) + 1\n }\n\n // Age field\n if (lowerName === 'age') {\n return 18 + Math.floor(seededRandom(seed) * 50)\n }\n\n // Year field\n if (lowerName === 'year') {\n return 2020 + Math.floor(seededRandom(seed) * 5)\n }\n\n // Respect constraints\n const min = minimum ?? 0\n const max = maximum ?? 100\n\n return Math.floor(min + seededRandom(seed) * (max - min + 1))\n}\n\n/**\n * Generate a boolean value\n */\nfunction generateBooleanValue(index: number, seed: number = 0): boolean {\n return seededRandom(seed + index) > 0.5\n}\n\n/**\n * Generate an array value\n *\n * Handles:\n * - Arrays of primitives (items.type is a primitive)\n * - Arrays of objects (items.type === 'object' with properties)\n * - Fallback for undefined items\n */\nfunction generateArrayValue(\n propDef: PropertyDef,\n index: number,\n baseTimestamp?: number,\n seed: number = 0\n): unknown[] {\n const itemCount = 1 + Math.floor(seededRandom(seed + index) * 3)\n const items: unknown[] = []\n\n if (propDef.items && 'type' in propDef.items) {\n const itemSchema = propDef.items as PropertyDef | DataModel\n\n // Check if items is an object with properties (DataModel)\n if (itemSchema.type === 'object' && 'properties' in itemSchema && itemSchema.properties) {\n // Generate full objects with nested properties\n for (let i = 0; i < itemCount; i++) {\n items.push(generateNestedObject(itemSchema as DataModel, index * 10 + i, baseTimestamp, seed))\n }\n } else {\n // Simple type - use generateValue\n for (let i = 0; i < itemCount; i++) {\n items.push(generateValue(itemSchema as PropertyDef, index * 10 + i, baseTimestamp, seed))\n }\n }\n } else {\n // Default to string items\n for (let i = 0; i < itemCount; i++) {\n const num = Math.floor(seededRandom(seed + index + i) * 1000)\n items.push(`item_${num}`)\n }\n }\n\n return items\n}\n\n/**\n * Generate a nested object from a DataModel schema\n *\n * This handles inline object definitions within array items or nested properties.\n */\nfunction generateNestedObject(\n model: DataModel,\n index: number,\n baseTimestamp?: number,\n seed: number = 0\n): Record<string, unknown> {\n const record: Record<string, unknown> = {}\n const properties = model.properties ?? {}\n const requiredFields = new Set(model.required ?? [])\n\n let fieldIndex = 0\n for (const [fieldName, propDef] of Object.entries(properties)) {\n const isRequired = requiredFields.has(fieldName) || propDef.required\n\n // Skip optional fields sometimes (but always include required ones)\n if (!isRequired && seededRandom(seed + index + fieldIndex) > 0.7) {\n fieldIndex++\n continue\n }\n\n // Generate value for this field\n record[fieldName] = generateValue(propDef, index, baseTimestamp, seed)\n fieldIndex++\n }\n\n return record\n}\n\n/**\n * Generate an object value\n */\nfunction generateObjectValue(index: number, seed: number = 0): Record<string, unknown> {\n // For nested objects, generate a simple structure with seeded values\n const keyNum = Math.floor(seededRandom(seed + index) * 1000)\n const valNum = Math.floor(seededRandom(seed + index + 1) * 1000)\n return {\n key: `key_${keyNum}`,\n value: `value_${valNum}`,\n }\n}\n\n// Helper generators\n\n/**\n * Check if a field name is address-related\n */\nfunction isAddressField(lowerName: string): boolean {\n const addressFields = [\n 'address', 'line1', 'line2', 'street', 'streetaddress',\n 'city', 'state', 'province', 'region',\n 'country', 'countrycode',\n 'zipcode', 'postalcode', 'zip', 'postal',\n ]\n\n // Check exact matches\n if (addressFields.includes(lowerName)) return true\n\n // Check partial matches for common patterns\n if (lowerName.includes('address')) return true\n if (lowerName.includes('street')) return true\n if (lowerName === 'postal_code' || lowerName === 'zip_code') return true\n\n return false\n}\n\n/**\n * Get the appropriate value from a generated address based on field name\n */\nfunction getAddressFieldValue(\n lowerName: string,\n addr: GeneratedAddress,\n _index: number,\n _seed: number\n): string {\n // Full address field\n if (lowerName === 'address' || lowerName.includes('fulladdress')) {\n return addr.formatted.replace(/\\n/g, ', ')\n }\n\n // Address lines\n if (lowerName === 'line1' || lowerName === 'streetaddress' || lowerName === 'street' || lowerName.includes('address1')) {\n return addr.line1\n }\n if (lowerName === 'line2' || lowerName.includes('address2')) {\n return addr.line2 ?? ''\n }\n\n // City\n if (lowerName === 'city') {\n return addr.city\n }\n\n // State/Province\n if (lowerName === 'state' || lowerName === 'province' || lowerName === 'region') {\n return addr.state\n }\n if (lowerName === 'statefull' || lowerName === 'provincefull' || lowerName === 'state_full') {\n return addr.stateFull\n }\n\n // Country\n if (lowerName === 'country') {\n return addr.country\n }\n if (lowerName === 'countrycode' || lowerName === 'country_code') {\n return addr.countryCode\n }\n\n // Postal/Zip code\n if (lowerName === 'zipcode' || lowerName === 'postalcode' || lowerName === 'zip' ||\n lowerName === 'postal' || lowerName === 'postal_code' || lowerName === 'zip_code') {\n return addr.postalCode\n }\n\n // Default to line1 for generic address fields\n return addr.line1\n}\n\nfunction generateEmail(index: number, seed: number = 0): string {\n const nameIdx = Math.floor(seededRandom(seed + index) * FIRST_NAMES.length)\n const domainIdx = Math.floor(seededRandom(seed + index + 1) * EMAIL_DOMAINS.length)\n const num = Math.floor(seededRandom(seed + index + 2) * 1000)\n const name = (FIRST_NAMES[nameIdx] ?? 'user').toLowerCase()\n const domain = EMAIL_DOMAINS[domainIdx] ?? 'example.com'\n return `${name}${num}@${domain}`\n}\n\nfunction generateUrl(fieldName: string, index: number, seed: number = 0): string {\n const num = Math.floor(seededRandom(seed + index) * 10000)\n return `https://example.com/${fieldName.toLowerCase()}/${num}`\n}\n\nfunction generateDate(index: number, baseTimestamp?: number): string {\n const base = baseTimestamp ?? Date.now()\n const offset = index * 86400000 // 1 day per index\n const date = new Date(base - offset)\n return date.toISOString().split('T')[0] ?? ''\n}\n\nfunction generateDateTime(index: number, baseTimestamp?: number, additionalOffset: number = 0): string {\n const base = baseTimestamp ?? Date.now()\n const offset = index * 86400000 + additionalOffset // 1 day per index + additional\n const date = new Date(base - offset)\n return date.toISOString()\n}\n\nfunction generateTime(index: number): string {\n const hours = String(index % 24).padStart(2, '0')\n const minutes = String((index * 15) % 60).padStart(2, '0')\n return `${hours}:${minutes}:00`\n}\n\nfunction generatePersonName(index: number, seed: number = 0): string {\n const firstIdx = Math.floor(seededRandom(seed + index) * FIRST_NAMES.length)\n const lastIdx = Math.floor(seededRandom(seed + index + 1) * LAST_NAMES.length)\n const first = FIRST_NAMES[firstIdx] ?? 'John'\n const last = LAST_NAMES[lastIdx] ?? 'Doe'\n return `${first} ${last}`\n}\n\nfunction generateDescription(index: number, seed: number = 0): string {\n const idx = Math.floor(seededRandom(seed + index) * DESCRIPTIONS.length)\n return DESCRIPTIONS[idx] ?? 'Sample description'\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\nfunction hashString(str: string): number {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash\n }\n return Math.abs(hash)\n}\n\n// Data pools\n\nconst FIRST_NAMES = [\n 'Emma', 'Liam', 'Olivia', 'Noah', 'Ava',\n 'William', 'Sophia', 'James', 'Isabella', 'Oliver',\n 'Mia', 'Benjamin', 'Charlotte', 'Elijah', 'Amelia',\n]\n\nconst LAST_NAMES = [\n 'Smith', 'Johnson', 'Williams', 'Brown', 'Jones',\n 'Garcia', 'Miller', 'Davis', 'Rodriguez', 'Martinez',\n 'Anderson', 'Taylor', 'Thomas', 'Jackson', 'White',\n]\n\nconst EMAIL_DOMAINS = [\n 'example.com', 'test.com', 'demo.com', 'sample.org', 'mail.test',\n]\n\n// Note: Address data (cities, states, countries, streets) has been moved to\n// ./address-data.ts for correlated address generation\n\nconst STATUS_VALUES = [\n 'active', 'pending', 'completed', 'cancelled', 'processing',\n]\n\nconst DESCRIPTIONS = [\n 'This is a sample description for demonstration purposes.',\n 'A brief overview of the item with relevant details.',\n 'Detailed information about this particular entry.',\n 'Summary text providing context and background.',\n 'Description highlighting key features and characteristics.',\n]\n","/**\n * Main generator orchestrator for demo data generation\n *\n * Supports two levels:\n * - Level 1 (schema-valid): Generate data that matches types\n * - Level 2 (relationship-valid): Generate data with valid references\n */\n\nimport type { DemokitSchema, DataModel, Relationship } from '../../schema'\nimport type {\n GenerationOptions,\n GenerationResult,\n GenerationMetadata,\n DemoData,\n GenerationRulesConfig,\n} from '../types'\nimport { validateData } from '../validation/validator'\nimport { generateIdForModel } from './id-generator'\nimport {\n generateValue,\n createRecordContext,\n modelHasAddressFields,\n type RecordContext,\n} from './value-generators'\n\n/**\n * Default record counts per model\n */\nconst DEFAULT_COUNT = 5\n\n/**\n * Generate demo data from a schema\n */\nexport function generateDemoData(\n schema: DemokitSchema,\n options: GenerationOptions = { level: 'schema-valid' }\n): GenerationResult {\n const startTime = Date.now()\n const { level, counts = {}, baseTimestamp, seed = 0, validate = true, customRules } = options\n\n // Track used IDs for each model\n const usedIds: Record<string, string[]> = {}\n const data: DemoData = {}\n\n // Get model names in order (respecting dependencies for relationship-valid)\n const modelOrder = level === 'relationship-valid'\n ? getModelGenerationOrder(schema)\n : Object.keys(schema.models)\n\n // Generate data for each model\n for (const modelName of modelOrder) {\n const model = schema.models[modelName]\n if (!model || model.type !== 'object') continue\n\n const count = counts[modelName] ?? DEFAULT_COUNT\n const records: Record<string, unknown>[] = []\n usedIds[modelName] = []\n\n for (let i = 0; i < count; i++) {\n const record = generateRecord(\n model,\n schema,\n i,\n usedIds,\n level,\n baseTimestamp,\n seed,\n customRules\n )\n records.push(record)\n\n // Track the ID\n const idField = findIdField(model)\n if (idField && record[idField]) {\n usedIds[modelName].push(String(record[idField]))\n }\n }\n\n data[modelName] = records\n }\n\n // Calculate metadata\n const recordsByModel: Record<string, number> = {}\n let totalRecords = 0\n for (const [modelName, records] of Object.entries(data)) {\n recordsByModel[modelName] = records.length\n totalRecords += records.length\n }\n\n const metadata: GenerationMetadata = {\n level,\n generatedAt: new Date().toISOString(),\n totalRecords,\n recordsByModel,\n usedIds,\n durationMs: Date.now() - startTime,\n }\n\n // Validate if requested\n const validation = validate\n ? validateData(data, { schema })\n : {\n valid: true,\n errors: [],\n warnings: [],\n stats: {\n totalRecords,\n recordsByModel,\n relationshipsChecked: 0,\n typeChecks: 0,\n durationMs: 0,\n },\n }\n\n // Generate fixtures if requested\n const fixtures = options.format === 'typescript'\n ? generateTypeScriptFixtures(data)\n : undefined\n\n return {\n data,\n fixtures,\n validation,\n metadata,\n }\n}\n\n/**\n * Generate a single record for a model\n */\nfunction generateRecord(\n model: DataModel,\n schema: DemokitSchema,\n index: number,\n usedIds: Record<string, string[]>,\n level: string,\n baseTimestamp?: number,\n seed: number = 0,\n customRules?: GenerationRulesConfig\n): Record<string, unknown> {\n const record: Record<string, unknown> = {}\n const properties = model.properties ?? {}\n const requiredFields = new Set(model.required ?? [])\n\n // Create record context for correlated field generation\n // This ensures address fields (city, state, zip, etc.) are consistent within a record\n // and dataset fields use the same row for correlation (Phase 2)\n const hasAddressFields = modelHasAddressFields(properties)\n const recordContext: RecordContext = createRecordContext(index, seed, {\n hasAddressFields,\n datasets: customRules?.datasets,\n })\n\n // Track timestamp fields for ordering\n let createdAt: string | undefined\n let updatedAt: string | undefined\n\n for (const [fieldName, propDef] of Object.entries(properties)) {\n const isRequired = requiredFields.has(fieldName) || propDef.required\n\n // Skip optional fields sometimes (but always include required ones)\n // Use seeded random for deterministic results\n const fieldSeed = seed + index * 1000 + hashString(fieldName)\n if (!isRequired && seededRandom(fieldSeed) > 0.7) {\n continue\n }\n\n // Handle relationship fields for Level 2\n if (level === 'relationship-valid') {\n const relationship = findRelationshipForField(schema, model.name, fieldName)\n if (relationship) {\n const targetIds = usedIds[relationship.to.model]\n if (targetIds && targetIds.length > 0) {\n // Pick a random existing ID from the target model (seeded)\n const randomIndex = Math.floor(seededRandom(fieldSeed + 1) * targetIds.length)\n record[fieldName] = targetIds[randomIndex]\n continue\n } else if (relationship.required) {\n // No IDs available yet - this shouldn't happen with proper ordering\n // but handle gracefully\n record[fieldName] = generateIdForModel(relationship.to.model, 0)\n continue\n }\n }\n }\n\n // Look up custom rule for this field (key: \"ModelName.fieldName\")\n const ruleKey = `${model.name}.${fieldName}`\n const customRule = customRules?.fieldRules?.[ruleKey]\n\n // Generate value based on field type, passing record context for correlated generation\n // and datasets for fromDataset rules (Phase 2)\n const value = generateValue(\n propDef,\n index,\n baseTimestamp,\n seed,\n recordContext,\n customRule,\n customRules?.datasets\n )\n record[fieldName] = value\n\n // Track timestamp fields\n if (fieldName === 'createdAt' && typeof value === 'string') {\n createdAt = value\n }\n if (fieldName === 'updatedAt' && typeof value === 'string') {\n updatedAt = value\n }\n }\n\n // Ensure timestamp ordering: createdAt <= updatedAt\n if (createdAt && updatedAt) {\n const createdTime = new Date(createdAt).getTime()\n const updatedTime = new Date(updatedAt).getTime()\n if (createdTime > updatedTime) {\n // Swap them\n record.createdAt = updatedAt\n record.updatedAt = createdAt\n }\n }\n\n return record\n}\n\n/**\n * Simple seeded random number generator\n */\nfunction seededRandom(seed: number): number {\n const x = Math.sin(seed) * 10000\n return x - Math.floor(x)\n}\n\n/**\n * Hash a string to a number\n */\nfunction hashString(str: string): number {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash\n }\n return Math.abs(hash)\n}\n\n/**\n * Find the ID field for a model\n */\nfunction findIdField(model: DataModel): string | undefined {\n const properties = model.properties ?? {}\n\n // Look for common ID field names\n for (const idName of ['id', 'ID', '_id']) {\n if (properties[idName]) {\n return idName\n }\n }\n\n // Look for format: uuid\n for (const [name, prop] of Object.entries(properties)) {\n if (prop.format === 'uuid') {\n return name\n }\n }\n\n return undefined\n}\n\n/**\n * Find a relationship for a specific field\n */\nfunction findRelationshipForField(\n schema: DemokitSchema,\n modelName: string,\n fieldName: string\n): Relationship | undefined {\n return schema.relationships.find(\n (rel) => rel.from.model === modelName && rel.from.field === fieldName\n )\n}\n\n/**\n * Get models in dependency order for relationship-valid generation\n * Models that are referenced should be generated first\n */\nfunction getModelGenerationOrder(schema: DemokitSchema): string[] {\n const modelNames = Object.keys(schema.models)\n const dependencies = new Map<string, Set<string>>()\n\n // Initialize all models with empty dependency sets\n for (const name of modelNames) {\n dependencies.set(name, new Set())\n }\n\n // Build dependency graph from relationships\n for (const rel of schema.relationships) {\n const fromModel = rel.from.model\n const toModel = rel.to.model\n\n // fromModel depends on toModel (toModel must be generated first)\n if (dependencies.has(fromModel) && modelNames.includes(toModel)) {\n dependencies.get(fromModel)!.add(toModel)\n }\n }\n\n // Topological sort\n const result: string[] = []\n const visited = new Set<string>()\n const temp = new Set<string>()\n\n function visit(name: string): void {\n if (visited.has(name)) return\n if (temp.has(name)) {\n // Cycle detected - just skip (will use fallback ID generation)\n return\n }\n\n temp.add(name)\n\n const deps = dependencies.get(name) ?? new Set()\n for (const dep of deps) {\n visit(dep)\n }\n\n temp.delete(name)\n visited.add(name)\n result.push(name)\n }\n\n for (const name of modelNames) {\n visit(name)\n }\n\n return result\n}\n\n/**\n * Generate TypeScript fixture code\n */\nfunction generateTypeScriptFixtures(data: DemoData): string {\n const lines: string[] = [\n '/**',\n ' * Auto-generated demo fixtures',\n ` * Generated at: ${new Date().toISOString()}`,\n ' */',\n '',\n ]\n\n for (const [modelName, records] of Object.entries(data)) {\n const varName = `DEMO_${toConstantCase(modelName)}`\n lines.push(`export const ${varName} = ${JSON.stringify(records, null, 2)} as const`)\n lines.push('')\n }\n\n // Add a combined export\n const modelNames = Object.keys(data)\n lines.push('export const DEMO_DATA = {')\n for (const name of modelNames) {\n lines.push(` ${name}: DEMO_${toConstantCase(name)},`)\n }\n lines.push('} as const')\n\n return lines.join('\\n')\n}\n\n/**\n * Convert a name to CONSTANT_CASE\n */\nfunction toConstantCase(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[^a-zA-Z0-9]/g, '_')\n .toUpperCase()\n}\n","/**\n * CSV Parser for Linked Datasets\n *\n * Parses CSV content into structured data for use in generation rules.\n * Supports:\n * - Quoted fields with commas and newlines\n * - Header row detection\n * - Row limit enforcement (1000 rows max)\n * - Validation of consistent column counts\n */\n\nimport type { ParseCSVResult } from '../types'\n\n/** Maximum number of data rows allowed in a dataset */\nconst MAX_ROWS = 1000\n\n/**\n * Parse CSV content into columns and rows\n *\n * @param content - Raw CSV content as a string\n * @returns ParseCSVResult with columns, rows, or error\n */\nexport function parseCSV(content: string): ParseCSVResult {\n if (!content || content.trim().length === 0) {\n return {\n success: false,\n error: 'CSV content is empty',\n }\n }\n\n try {\n const lines = parseCSVLines(content)\n\n if (lines.length === 0) {\n return {\n success: false,\n error: 'No data found in CSV',\n }\n }\n\n // First line is headers\n const columns = lines[0]\n\n if (!columns || columns.length === 0) {\n return {\n success: false,\n error: 'No columns found in header row',\n }\n }\n\n // Check for duplicate column names\n const columnSet = new Set<string>()\n for (const col of columns) {\n const trimmed = col.trim()\n if (columnSet.has(trimmed)) {\n return {\n success: false,\n error: `Duplicate column name: \"${trimmed}\"`,\n }\n }\n columnSet.add(trimmed)\n }\n\n // Parse data rows\n const allRows = lines.slice(1)\n const originalRowCount = allRows.length\n\n // Validate and filter rows\n const validRows: string[][] = []\n for (let i = 0; i < allRows.length; i++) {\n const row = allRows[i]\n if (!row) continue\n\n // Skip empty rows\n if (row.length === 1 && (row[0]?.trim() ?? '') === '') {\n continue\n }\n\n // Check column count matches\n if (row.length !== columns.length) {\n return {\n success: false,\n error: `Row ${i + 2} has ${row.length} columns, expected ${columns.length}`,\n }\n }\n\n validRows.push(row)\n\n // Enforce row limit\n if (validRows.length >= MAX_ROWS) {\n break\n }\n }\n\n if (validRows.length === 0) {\n return {\n success: false,\n error: 'No data rows found in CSV',\n }\n }\n\n const truncated = originalRowCount > MAX_ROWS\n\n return {\n success: true,\n columns: columns.map((c) => c.trim()),\n rows: validRows.map((row) => row.map((cell) => cell.trim())),\n truncated,\n originalRowCount: truncated ? originalRowCount : undefined,\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to parse CSV',\n }\n }\n}\n\n/**\n * Parse CSV content into lines, handling quoted fields\n */\nfunction parseCSVLines(content: string): string[][] {\n const lines: string[][] = []\n let currentLine: string[] = []\n let currentField = ''\n let inQuotes = false\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i]\n const nextChar = content[i + 1]\n\n if (inQuotes) {\n if (char === '\"') {\n if (nextChar === '\"') {\n // Escaped quote\n currentField += '\"'\n i++ // Skip next quote\n } else {\n // End of quoted field\n inQuotes = false\n }\n } else {\n currentField += char\n }\n } else {\n if (char === '\"') {\n // Start of quoted field\n inQuotes = true\n } else if (char === ',') {\n // End of field\n currentLine.push(currentField)\n currentField = ''\n } else if (char === '\\r') {\n // Skip carriage return\n continue\n } else if (char === '\\n') {\n // End of line\n currentLine.push(currentField)\n lines.push(currentLine)\n currentLine = []\n currentField = ''\n } else {\n currentField += char\n }\n }\n }\n\n // Handle last field/line\n if (currentField.length > 0 || currentLine.length > 0) {\n currentLine.push(currentField)\n lines.push(currentLine)\n }\n\n return lines\n}\n\n/**\n * Generate a unique dataset ID\n */\nexport function generateDatasetId(): string {\n const timestamp = Date.now().toString(36)\n const random = Math.random().toString(36).substring(2, 8)\n return `ds_${timestamp}${random}`\n}\n\n/**\n * Validate that a dataset name is valid\n */\nexport function validateDatasetName(name: string): string | null {\n const trimmed = name.trim()\n\n if (trimmed.length === 0) {\n return 'Dataset name is required'\n }\n\n if (trimmed.length > 50) {\n return 'Dataset name must be 50 characters or less'\n }\n\n // Allow alphanumeric, spaces, hyphens, underscores\n if (!/^[a-zA-Z0-9\\s\\-_]+$/.test(trimmed)) {\n return 'Dataset name can only contain letters, numbers, spaces, hyphens, and underscores'\n }\n\n return null\n}\n","/**\n * App Context Inference\n *\n * Analyzes a DemokitSchema to infer what the application does,\n * its domain, key entities, and features. This provides context\n * for narrative-driven data generation.\n *\n * The inference process works in several stages:\n * 1. Domain detection - What type of application is this?\n * 2. Entity analysis - What are the key data objects?\n * 3. Feature inference - What can users do with the app?\n * 4. Business rule extraction - What constraints apply?\n *\n * @example\n * ```typescript\n * const schema = await importFromOpenAPI('api.yaml')\n * const context = inferAppContext(schema)\n * // context.domain === 'e-commerce'\n * // context.keyEntities includes Product, Order, Customer\n * ```\n */\n\nimport type { DemokitSchema, DataModel } from '../../schema'\nimport type { AppContext, EntityContext } from '../types'\n\n// ============================================================================\n// Domain Detection Keywords\n// ============================================================================\n\n/** Keywords that indicate an e-commerce application */\nconst ECOMMERCE_MODEL_KEYWORDS = ['product', 'cart', 'order', 'checkout', 'inventory', 'catalog']\nconst ECOMMERCE_FIELD_KEYWORDS = ['price', 'sku', 'quantity', 'cart', 'checkout']\n\n/** Keywords that indicate a B2B SaaS application */\nconst B2B_SAAS_MODEL_KEYWORDS = ['subscription', 'plan', 'tenant', 'organization', 'workspace']\nconst B2B_SAAS_FIELD_KEYWORDS = ['mrr', 'arr', 'churn', 'subscription', 'plan']\n\n/** Keywords that indicate a project management application */\nconst PROJECT_MGMT_KEYWORDS = ['project', 'task', 'sprint', 'milestone', 'issue', 'board']\n\n/** Keywords that indicate a CRM application */\nconst CRM_KEYWORDS = ['lead', 'opportunity', 'contact', 'deal', 'pipeline']\n\n/** Keywords that indicate a healthcare application */\nconst HEALTHCARE_KEYWORDS = ['patient', 'appointment', 'prescription', 'diagnosis', 'medical']\n\n/** Keywords that indicate an education application */\nconst EDUCATION_KEYWORDS = ['course', 'student', 'lesson', 'enrollment', 'grade']\n\n/** Keywords that indicate a social/community application */\nconst SOCIAL_KEYWORDS = ['post', 'comment', 'follow', 'like', 'feed', 'profile']\n\n/** Keywords that indicate a content management application */\nconst CMS_KEYWORDS = ['article', 'page', 'content', 'media', 'template']\n\n/** Keywords that indicate a finance application */\nconst FINANCE_KEYWORDS = ['transaction', 'account', 'payment', 'invoice', 'ledger']\n\n// ============================================================================\n// Main Inference Function\n// ============================================================================\n\n/**\n * Infer application context from a schema.\n *\n * This is the main entry point for context inference. It analyzes the schema\n * structure to understand what the application does and how its data relates.\n *\n * @param schema - The parsed DemokitSchema from an OpenAPI spec\n * @returns AppContext with inferred domain, entities, and features\n *\n * @example\n * ```typescript\n * const context = inferAppContext(schema)\n * console.log(context.domain) // 'e-commerce'\n * console.log(context.keyEntities.length) // 5\n * ```\n */\nexport function inferAppContext(schema: DemokitSchema): AppContext {\n const modelNames = Object.keys(schema.models)\n\n // Step 1: Detect the application domain (e-commerce, saas, etc.)\n const domain = inferDomain(modelNames, schema)\n\n // Step 2: Analyze each model to understand its purpose\n const keyEntities = modelNames\n .filter(name => schema.models[name]?.type === 'object')\n .map(name => inferEntityContext(name, schema.models[name]!, schema))\n\n // Step 3: Build the complete context\n return {\n name: schema.info.title || 'Application',\n description: schema.info.description || inferDescription(domain, keyEntities),\n domain,\n keyEntities,\n features: inferFeatures(schema),\n }\n}\n\n// ============================================================================\n// Domain Detection\n// ============================================================================\n\n/**\n * Infer the application domain from model names and field names.\n *\n * Uses keyword matching to identify common application types. The order\n * of checks matters - more specific domains are checked first.\n *\n * @param modelNames - List of model names from the schema\n * @param schema - The full schema for accessing field names\n * @returns Domain string like 'e-commerce', 'b2b-saas', etc.\n */\nfunction inferDomain(modelNames: string[], schema: DemokitSchema): string {\n const lowerNames = modelNames.map(n => n.toLowerCase())\n const allFields = getAllFieldNames(schema)\n\n // Check domain indicators in order of specificity\n\n // E-commerce: products, orders, shopping carts\n if (hasAny(lowerNames, ECOMMERCE_MODEL_KEYWORDS)) {\n return 'e-commerce'\n }\n if (hasAny(allFields, ECOMMERCE_FIELD_KEYWORDS)) {\n return 'e-commerce'\n }\n\n // B2B SaaS: subscriptions, tenants, workspaces\n if (hasAny(lowerNames, B2B_SAAS_MODEL_KEYWORDS)) {\n return 'b2b-saas'\n }\n if (hasAny(allFields, B2B_SAAS_FIELD_KEYWORDS)) {\n return 'b2b-saas'\n }\n\n // Project management: tasks, sprints, milestones\n if (hasAny(lowerNames, PROJECT_MGMT_KEYWORDS)) {\n return 'project-management'\n }\n\n // CRM: leads, opportunities, deals\n if (hasAny(lowerNames, CRM_KEYWORDS)) {\n return 'crm'\n }\n\n // Healthcare: patients, appointments, prescriptions\n if (hasAny(lowerNames, HEALTHCARE_KEYWORDS)) {\n return 'healthcare'\n }\n\n // Education: courses, students, enrollments\n if (hasAny(lowerNames, EDUCATION_KEYWORDS)) {\n return 'education'\n }\n\n // Social: posts, comments, follows\n if (hasAny(lowerNames, SOCIAL_KEYWORDS)) {\n return 'social'\n }\n\n // Content management: articles, pages, media\n if (hasAny(lowerNames, CMS_KEYWORDS)) {\n return 'content-management'\n }\n\n // Finance: transactions, accounts, payments\n if (hasAny(lowerNames, FINANCE_KEYWORDS)) {\n return 'finance'\n }\n\n // No specific domain detected\n return 'general'\n}\n\n/**\n * Collect all field names from all models in the schema.\n *\n * Used for domain detection based on field-level keywords (e.g., 'price'\n * suggests e-commerce even if models aren't named obviously).\n *\n * @param schema - The schema to extract field names from\n * @returns Array of lowercase field names\n */\nfunction getAllFieldNames(schema: DemokitSchema): string[] {\n const fields: string[] = []\n for (const model of Object.values(schema.models)) {\n if (model.properties) {\n fields.push(...Object.keys(model.properties).map(f => f.toLowerCase()))\n }\n }\n return fields\n}\n\n/**\n * Check if any needle substring appears in any haystack string.\n *\n * Uses partial matching (includes) rather than exact matching to catch\n * variations like 'ProductCategory' containing 'product'.\n *\n * @param haystack - Array of strings to search in\n * @param needles - Array of substrings to search for\n * @returns true if any needle is found in any haystack item\n */\nfunction hasAny(haystack: string[], needles: string[]): boolean {\n return needles.some(needle =>\n haystack.some(h => h.includes(needle))\n )\n}\n\n// ============================================================================\n// Entity Context Inference\n// ============================================================================\n\n/**\n * Infer context for a single entity/model.\n *\n * Analyzes the model's properties, relationships, and naming to understand\n * what role it plays in the application.\n *\n * @param name - The model name\n * @param model - The model definition\n * @param schema - Full schema for relationship analysis\n * @returns EntityContext describing this entity's role\n */\nfunction inferEntityContext(\n name: string,\n model: DataModel,\n schema: DemokitSchema\n): EntityContext {\n const properties = model.properties || {}\n const propertyNames = Object.keys(properties)\n\n // Identify which fields are most important for this entity\n const keyFields = propertyNames.filter(fieldName => {\n const prop = properties[fieldName]\n const lowerName = fieldName.toLowerCase()\n\n // ID fields are always key - they identify the record\n if (lowerName === 'id' || lowerName.endsWith('id')) return true\n\n // Status fields are key - they track entity lifecycle\n if (lowerName === 'status' || lowerName === 'state') return true\n\n // Monetary fields are key - they drive business value\n if (lowerName.includes('amount') || lowerName.includes('total') || lowerName.includes('price')) return true\n\n // Enum fields are often important - they categorize records\n if (prop?.enum && prop.enum.length > 0) return true\n\n return false\n })\n\n // Infer what this entity represents\n const purpose = inferEntityPurpose(name, model, schema)\n\n // Extract any business rules that apply\n const businessRules = inferBusinessRules(name, model, schema)\n\n return {\n name,\n purpose,\n keyFields: keyFields.slice(0, 5), // Limit to top 5 for readability\n businessRules: businessRules.length > 0 ? businessRules : undefined,\n }\n}\n\n/**\n * Infer the purpose/role of an entity based on its name and structure.\n *\n * Uses a combination of:\n * 1. Common naming patterns (User, Order, Product, etc.)\n * 2. Relationship analysis (what references this entity?)\n * 3. Field patterns (does it have status, timestamps, etc.?)\n *\n * @param name - The entity name\n * @param model - The model definition\n * @param schema - Full schema for relationship lookup\n * @returns Human-readable description of the entity's purpose\n */\nfunction inferEntityPurpose(name: string, model: DataModel, schema: DemokitSchema): string {\n const lowerName = name.toLowerCase()\n const properties = model.properties || {}\n const propNames = Object.keys(properties).map(p => p.toLowerCase())\n\n // Check for common entity types with well-known purposes\n // These are ordered by specificity/likelihood\n\n if (lowerName === 'user' || lowerName === 'users') {\n return 'Represents a user account in the system'\n }\n if (lowerName === 'customer' || lowerName === 'customers') {\n return 'Represents a customer who purchases products or services'\n }\n if (lowerName === 'order' || lowerName === 'orders') {\n return 'Represents a purchase order placed by a customer'\n }\n if (lowerName === 'product' || lowerName === 'products') {\n return 'Represents a product available for purchase'\n }\n if (lowerName === 'project' || lowerName === 'projects') {\n return 'Represents a project containing tasks and milestones'\n }\n if (lowerName === 'task' || lowerName === 'tasks') {\n return 'Represents a task or work item to be completed'\n }\n if (lowerName === 'subscription' || lowerName === 'subscriptions') {\n return 'Represents a recurring subscription to a plan'\n }\n if (lowerName === 'invoice' || lowerName === 'invoices') {\n return 'Represents a billing invoice for payment'\n }\n if (lowerName === 'payment' || lowerName === 'payments') {\n return 'Represents a payment transaction'\n }\n if (lowerName === 'comment' || lowerName === 'comments') {\n return 'Represents a comment or reply on content'\n }\n if (lowerName === 'post' || lowerName === 'posts') {\n return 'Represents a post or content item'\n }\n\n // Analyze relationships to understand the entity's role\n const incomingRels = schema.relationships.filter(r => r.to.model === name)\n const outgoingRels = schema.relationships.filter(r => r.from.model === name)\n\n // If many things reference this entity, it's a core entity\n if (incomingRels.length > outgoingRels.length) {\n return `Core entity referenced by ${incomingRels.map(r => r.from.model).join(', ')}`\n }\n\n // If this entity references many things, it's a junction/connector\n if (outgoingRels.length > 0) {\n return `Entity that connects to ${outgoingRels.map(r => r.to.model).join(', ')}`\n }\n\n // Fall back to field-based inference\n if (propNames.includes('status') || propNames.includes('state')) {\n return `Entity with tracked lifecycle status`\n }\n\n if (propNames.includes('createdat') || propNames.includes('created_at')) {\n return `Time-tracked entity for ${name.toLowerCase()} records`\n }\n\n // Generic fallback\n return `Represents ${name.toLowerCase()} data in the system`\n}\n\n/**\n * Infer business rules from schema constraints and relationships.\n *\n * Extracts rules from:\n * 1. Required fields (what must be provided)\n * 2. Enum constraints (what values are allowed)\n * 3. Relationships (what must exist first)\n * 4. Timestamp pairs (ordering constraints)\n *\n * @param name - The entity name\n * @param model - The model definition\n * @param schema - Full schema for relationship lookup\n * @returns Array of human-readable business rules\n */\nfunction inferBusinessRules(name: string, model: DataModel, schema: DemokitSchema): string[] {\n const rules: string[] = []\n const properties = model.properties || {}\n const required = model.required || []\n\n // Rule: Required fields must be provided\n if (required.length > 0) {\n const requiredList = required.slice(0, 3).join(', ')\n const ellipsis = required.length > 3 ? '...' : ''\n rules.push(`Must have: ${requiredList}${ellipsis}`)\n }\n\n // Rule: Status/state fields have allowed values\n for (const [fieldName, prop] of Object.entries(properties)) {\n const isStatusField = fieldName.toLowerCase() === 'status' || fieldName.toLowerCase() === 'state'\n if (isStatusField && prop.enum) {\n rules.push(`Status can be: ${prop.enum.join(', ')}`)\n }\n }\n\n // Rule: Required relationships (foreign keys that must exist)\n const outgoingRels = schema.relationships.filter(r => r.from.model === name && r.required)\n for (const rel of outgoingRels) {\n rules.push(`Must belong to a ${rel.to.model}`)\n }\n\n // Rule: Timestamp ordering (createdAt <= updatedAt)\n const hasCreatedAt = Object.keys(properties).some(p =>\n p.toLowerCase().includes('createdat') || p.toLowerCase().includes('created_at')\n )\n const hasUpdatedAt = Object.keys(properties).some(p =>\n p.toLowerCase().includes('updatedat') || p.toLowerCase().includes('updated_at')\n )\n if (hasCreatedAt && hasUpdatedAt) {\n rules.push('UpdatedAt must be >= CreatedAt')\n }\n\n return rules\n}\n\n// ============================================================================\n// Description and Feature Inference\n// ============================================================================\n\n/**\n * Generate a description from the inferred domain and entities.\n *\n * Creates a human-readable description when the schema doesn't provide one.\n *\n * @param domain - The detected application domain\n * @param entities - The inferred entity contexts\n * @returns Generated description string\n */\nfunction inferDescription(domain: string, entities: EntityContext[]): string {\n // List the first few entity names for context\n const entityList = entities.slice(0, 3).map(e => e.name).join(', ')\n\n // Map domains to description templates\n const domainDescriptions: Record<string, string> = {\n 'e-commerce': `E-commerce platform managing ${entityList}`,\n 'b2b-saas': `B2B SaaS application with ${entityList}`,\n 'project-management': `Project management tool for tracking ${entityList}`,\n 'crm': `Customer relationship management system with ${entityList}`,\n 'healthcare': `Healthcare application managing ${entityList}`,\n 'education': `Educational platform with ${entityList}`,\n 'social': `Social platform featuring ${entityList}`,\n 'content-management': `Content management system for ${entityList}`,\n 'finance': `Financial application handling ${entityList}`,\n 'general': `Application managing ${entityList}`,\n }\n\n return domainDescriptions[domain] ?? domainDescriptions['general'] ?? `Application managing ${entityList}`\n}\n\n/**\n * Infer application features from endpoints and model names.\n *\n * Analyzes:\n * 1. HTTP methods to detect CRUD capabilities\n * 2. Path patterns to detect search functionality\n * 3. Model names to detect common feature modules\n *\n * @param schema - The schema to analyze\n * @returns Array of feature descriptions\n */\nfunction inferFeatures(schema: DemokitSchema): string[] {\n const features: string[] = []\n const endpoints = schema.endpoints || []\n const modelNames = Object.keys(schema.models)\n\n // Detect CRUD capabilities from HTTP methods\n const hasCreate = endpoints.some(e => e.method === 'POST')\n const hasUpdate = endpoints.some(e => e.method === 'PUT' || e.method === 'PATCH')\n const hasDelete = endpoints.some(e => e.method === 'DELETE')\n const hasSearch = endpoints.some(e =>\n e.path.includes('search') || e.path.includes('query')\n )\n\n if (hasCreate) features.push('Create records')\n if (hasUpdate) features.push('Update records')\n if (hasDelete) features.push('Delete records')\n if (hasSearch) features.push('Search functionality')\n\n // Detect common feature modules from model names\n if (modelNames.some(n => n.toLowerCase().includes('user'))) {\n features.push('User management')\n }\n if (modelNames.some(n => n.toLowerCase().includes('auth') || n.toLowerCase().includes('session'))) {\n features.push('Authentication')\n }\n if (modelNames.some(n => n.toLowerCase().includes('notification'))) {\n features.push('Notifications')\n }\n if (modelNames.some(n => n.toLowerCase().includes('report') || n.toLowerCase().includes('analytics'))) {\n features.push('Reporting & analytics')\n }\n\n // Default feature if nothing detected\n return features.length > 0 ? features : ['Data management']\n}\n\n// ============================================================================\n// Public Helper Functions\n// ============================================================================\n\n/**\n * Create a custom app context with explicit values.\n *\n * Use this when the user wants to provide their own context rather than\n * relying on inference. Useful for demos where the inferred context\n * doesn't match the intended story.\n *\n * @param name - Application name\n * @param description - What the app does\n * @param domain - Application domain\n * @param entities - Key entities with their purposes\n * @param features - Main features/capabilities\n * @returns Complete AppContext object\n *\n * @example\n * ```typescript\n * const context = createAppContext(\n * 'ShopFlow',\n * 'Enterprise e-commerce platform',\n * 'e-commerce',\n * [{ name: 'Product', purpose: 'Items for sale', keyFields: ['id', 'price'] }],\n * ['Checkout', 'Inventory Management']\n * )\n * ```\n */\nexport function createAppContext(\n name: string,\n description: string,\n domain: string,\n entities: EntityContext[],\n features: string[]\n): AppContext {\n return {\n name,\n description,\n domain,\n keyEntities: entities,\n features,\n }\n}\n\n/**\n * Merge inferred context with user-provided overrides.\n *\n * Allows users to customize specific parts of the inferred context\n * while keeping the rest. Useful for fine-tuning without starting\n * from scratch.\n *\n * @param inferred - The automatically inferred context\n * @param overrides - User-provided values to override\n * @returns Merged context with overrides taking precedence\n *\n * @example\n * ```typescript\n * const inferred = inferAppContext(schema)\n * const custom = mergeAppContext(inferred, {\n * name: 'My Custom App Name',\n * domain: 'b2b-saas', // Override the detected domain\n * })\n * ```\n */\nexport function mergeAppContext(\n inferred: AppContext,\n overrides: Partial<AppContext>\n): AppContext {\n return {\n name: overrides.name || inferred.name,\n description: overrides.description || inferred.description,\n domain: overrides.domain || inferred.domain,\n keyEntities: overrides.keyEntities || inferred.keyEntities,\n features: overrides.features || inferred.features,\n }\n}\n","/**\n * Output Formatters\n *\n * Convert generated demo data into various output formats for different use cases:\n *\n * - **TypeScript**: Type-safe fixture files with const assertions\n * - **JSON**: Standard data interchange format with optional metadata\n * - **SQL**: INSERT statements for database seeding\n * - **CSV**: Spreadsheet-compatible format for individual models\n *\n * Each formatter handles:\n * - Proper escaping for the target format\n * - Optional headers/metadata\n * - Null and special value handling\n * - Nested objects and arrays\n *\n * @example\n * ```typescript\n * // Generate TypeScript fixtures\n * const tsCode = formatAsTypeScript(data, { asConst: true })\n *\n * // Generate JSON with metadata\n * const json = formatAsJSON(data, { includeMetadata: true })\n *\n * // Generate SQL INSERT statements\n * const sql = formatAsSQL(data, { tableName: name => `tbl_${name}` })\n *\n * // Generate CSV for a specific model\n * const csv = formatAsCSV(data, 'Customer')\n * ```\n *\n * @module\n */\n\nimport type { DemoData, DemoNarrative } from '../types'\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Output format options for TypeScript generation\n *\n * Controls the generated TypeScript code structure and styling.\n *\n * @example\n * ```typescript\n * const options: OutputOptions = {\n * asConst: true, // Add 'as const' for type safety\n * indent: 2, // 2-space indentation\n * includeHeader: true, // Add generation comment\n * narrative: myNarrative, // Include narrative in header\n * }\n * ```\n */\nexport interface OutputOptions {\n /** Whether to include TypeScript 'as const' assertions. Defaults to true. */\n asConst?: boolean\n\n /** Whether to include type annotations (future use). */\n includeTypes?: boolean\n\n /** Indentation in spaces. Defaults to 2. */\n indent?: number\n\n /** Whether to add a comment header with generation info. Defaults to true. */\n includeHeader?: boolean\n\n /** Narrative for header comments (scenario, key points). */\n narrative?: DemoNarrative\n}\n\n// ============================================================================\n// TypeScript Formatter\n// ============================================================================\n\n/**\n * Format demo data as TypeScript code\n *\n * Generates a TypeScript module with:\n * - Header comment with generation timestamp\n * - Optional narrative info (scenario, key points)\n * - Individual exports per model (DEMO_USER, DEMO_ORDER, etc.)\n * - Combined DEMO_DATA export with all models\n * - 'as const' assertions for full type inference\n *\n * Model names are converted to CONSTANT_CASE for variable names.\n *\n * @param data - Demo data object (model names → record arrays)\n * @param options - Formatting options (asConst, indent, header, narrative)\n * @returns TypeScript source code as string\n *\n * @example\n * ```typescript\n * const data = {\n * User: [{ id: '1', name: 'Alice' }],\n * Order: [{ id: '1', userId: '1', total: 100 }],\n * }\n *\n * const code = formatAsTypeScript(data, {\n * asConst: true,\n * narrative: { scenario: 'Demo', keyPoints: ['Show users'] },\n * })\n *\n * // Output:\n * // /**\n * // * Auto-generated demo fixtures\n * // * Scenario: Demo\n * // * Key points:\n * // * - Show users\n * // */\n * // export const DEMO_USER = [...] as const\n * // export const DEMO_ORDER = [...] as const\n * // export const DEMO_DATA = { User: DEMO_USER, Order: DEMO_ORDER } as const\n * ```\n */\nexport function formatAsTypeScript(\n data: DemoData,\n options: OutputOptions = {}\n): string {\n const {\n asConst = true,\n indent = 2,\n includeHeader = true,\n narrative,\n } = options\n\n const lines: string[] = []\n\n // -------------------------------------------------------------------------\n // Header Comment: Generation info and optional narrative\n // -------------------------------------------------------------------------\n if (includeHeader) {\n lines.push('/**')\n lines.push(' * Auto-generated demo fixtures')\n lines.push(` * Generated at: ${new Date().toISOString()}`)\n\n // Include narrative info if provided\n if (narrative) {\n lines.push(' *')\n lines.push(` * Scenario: ${narrative.scenario}`)\n if (narrative.keyPoints.length > 0) {\n lines.push(' *')\n lines.push(' * Key points:')\n for (const point of narrative.keyPoints) {\n lines.push(` * - ${point}`)\n }\n }\n }\n\n lines.push(' */')\n lines.push('')\n }\n\n // -------------------------------------------------------------------------\n // Individual Model Exports: DEMO_USER, DEMO_ORDER, etc.\n // -------------------------------------------------------------------------\n for (const [modelName, records] of Object.entries(data)) {\n // Convert model name to CONSTANT_CASE (e.g., UserProfile → USER_PROFILE)\n const varName = `DEMO_${toConstantCase(modelName)}`\n\n // Serialize with proper indentation\n const jsonData = JSON.stringify(records, null, indent)\n\n // Add 'as const' for full type inference if enabled\n const constAssertion = asConst ? ' as const' : ''\n\n lines.push(`export const ${varName} = ${jsonData}${constAssertion}`)\n lines.push('')\n }\n\n // -------------------------------------------------------------------------\n // Combined Export: DEMO_DATA with all models\n // -------------------------------------------------------------------------\n const modelNames = Object.keys(data)\n if (modelNames.length > 0) {\n const constAssertion = asConst ? ' as const' : ''\n lines.push('export const DEMO_DATA = {')\n for (const name of modelNames) {\n lines.push(` ${name}: DEMO_${toConstantCase(name)},`)\n }\n lines.push(`}${constAssertion}`)\n }\n\n return lines.join('\\n')\n}\n\n// ============================================================================\n// JSON Formatter\n// ============================================================================\n\n/**\n * Format demo data as JSON\n *\n * Generates standard JSON output with optional metadata wrapper.\n *\n * Without metadata:\n * ```json\n * { \"User\": [...], \"Order\": [...] }\n * ```\n *\n * With metadata:\n * ```json\n * {\n * \"_metadata\": { \"generatedAt\": \"...\", \"modelCount\": 2, \"recordCount\": 10 },\n * \"data\": { \"User\": [...], \"Order\": [...] }\n * }\n * ```\n *\n * @param data - Demo data object (model names → record arrays)\n * @param options - Formatting options (indent, includeMetadata)\n * @returns JSON string\n *\n * @example\n * ```typescript\n * // Simple JSON output\n * const json = formatAsJSON(data)\n *\n * // JSON with metadata\n * const jsonWithMeta = formatAsJSON(data, { includeMetadata: true })\n * ```\n */\nexport function formatAsJSON(\n data: DemoData,\n options: { indent?: number; includeMetadata?: boolean } = {}\n): string {\n const { indent = 2, includeMetadata = false } = options\n\n // -------------------------------------------------------------------------\n // With Metadata: Wrap data in envelope with generation info\n // -------------------------------------------------------------------------\n if (includeMetadata) {\n return JSON.stringify(\n {\n _metadata: {\n generatedAt: new Date().toISOString(),\n modelCount: Object.keys(data).length,\n recordCount: Object.values(data).reduce((sum, arr) => sum + arr.length, 0),\n },\n data,\n },\n null,\n indent\n )\n }\n\n // -------------------------------------------------------------------------\n // Simple: Just the data object\n // -------------------------------------------------------------------------\n return JSON.stringify(data, null, indent)\n}\n\n// ============================================================================\n// SQL Formatter\n// ============================================================================\n\n/**\n * Format demo data as SQL INSERT statements\n *\n * Generates INSERT statements for database seeding. Handles:\n * - Automatic table name conversion (snake_case by default)\n * - Proper value escaping (strings, nulls, numbers, booleans)\n * - JSON serialization for arrays and objects\n * - Comment headers with record counts\n *\n * @param data - Demo data object (model names → record arrays)\n * @param options - Formatting options (tableName function)\n * @returns SQL INSERT statements as string\n *\n * @example\n * ```typescript\n * const sql = formatAsSQL(data)\n * // Output:\n * // -- Auto-generated demo data\n * // -- User (5 records)\n * // INSERT INTO user (id, name, email) VALUES ('1', 'Alice', 'alice@example.com');\n *\n * // Custom table names\n * const sql = formatAsSQL(data, {\n * tableName: name => `demo_${name.toLowerCase()}`\n * })\n * ```\n */\nexport function formatAsSQL(\n data: DemoData,\n options: { tableName?: (modelName: string) => string } = {}\n): string {\n // Default table name: convert PascalCase to snake_case\n const { tableName = (name) => toSnakeCase(name) } = options\n\n // -------------------------------------------------------------------------\n // Header: Generation timestamp\n // -------------------------------------------------------------------------\n const lines: string[] = [\n '-- Auto-generated demo data',\n `-- Generated at: ${new Date().toISOString()}`,\n '',\n ]\n\n // -------------------------------------------------------------------------\n // Generate INSERT statements for each model\n // -------------------------------------------------------------------------\n for (const [modelName, records] of Object.entries(data)) {\n // Skip empty model arrays\n if (records.length === 0) continue\n\n // Convert model name to table name\n const table = tableName(modelName)\n\n // Add comment with record count\n lines.push(`-- ${modelName} (${records.length} records)`)\n\n // Generate INSERT for each record\n for (const record of records) {\n const columns = Object.keys(record)\n const values = Object.values(record).map(formatSQLValue)\n\n lines.push(\n `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${values.join(', ')});`\n )\n }\n\n lines.push('')\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Format a single value for SQL INSERT statement\n *\n * Handles:\n * - null/undefined → NULL\n * - strings → 'escaped string' (single quotes escaped as '')\n * - numbers/booleans → raw value\n * - arrays/objects → JSON string (escaped)\n *\n * @param value - Value to format\n * @returns SQL-safe value string\n *\n * @example\n * formatSQLValue(null) // 'NULL'\n * formatSQLValue('hello') // \"'hello'\"\n * formatSQLValue(\"it's\") // \"'it''s'\"\n * formatSQLValue(42) // '42'\n * formatSQLValue([1, 2]) // \"'[1,2]'\"\n */\nfunction formatSQLValue(value: unknown): string {\n // Handle null and undefined\n if (value === null || value === undefined) {\n return 'NULL'\n }\n\n // Handle strings: escape single quotes by doubling them\n if (typeof value === 'string') {\n return `'${value.replace(/'/g, \"''\")}'`\n }\n\n // Handle numbers and booleans: use raw value\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n\n // Handle arrays and objects: serialize to JSON, then escape\n if (Array.isArray(value) || typeof value === 'object') {\n return `'${JSON.stringify(value).replace(/'/g, \"''\")}'`\n }\n\n // Fallback for unexpected types\n return 'NULL'\n}\n\n// ============================================================================\n// CSV Formatter\n// ============================================================================\n\n/**\n * Format demo data as CSV (one model at a time)\n *\n * Generates RFC 4180-compliant CSV with:\n * - Header row with all column names\n * - Proper escaping (commas, quotes, newlines)\n * - Unified columns from all records (handles sparse data)\n * - JSON serialization for complex values\n *\n * Note: CSV format only supports a single model at a time.\n * For multiple models, call this function once per model.\n *\n * @param data - Demo data object (model names → record arrays)\n * @param modelName - Name of the model to export\n * @returns CSV string (empty string if model not found or empty)\n *\n * @example\n * ```typescript\n * const userCsv = formatAsCSV(data, 'User')\n * // Output:\n * // id,name,email\n * // 1,Alice,alice@example.com\n * // 2,Bob,bob@example.com\n *\n * // Export each model to separate files\n * for (const model of Object.keys(data)) {\n * const csv = formatAsCSV(data, model)\n * writeFileSync(`${model}.csv`, csv)\n * }\n * ```\n */\nexport function formatAsCSV(\n data: DemoData,\n modelName: string\n): string {\n const records = data[modelName]\n\n // Return empty string for missing or empty models\n if (!records || records.length === 0) {\n return ''\n }\n\n // -------------------------------------------------------------------------\n // Collect all unique column names from all records\n // This handles sparse data where not all records have all fields\n // -------------------------------------------------------------------------\n const columns = new Set<string>()\n for (const record of records) {\n for (const key of Object.keys(record)) {\n columns.add(key)\n }\n }\n\n const columnList = Array.from(columns)\n\n // -------------------------------------------------------------------------\n // Header Row: Column names (escaped if necessary)\n // -------------------------------------------------------------------------\n const lines: string[] = [columnList.map(escapeCSV).join(',')]\n\n // -------------------------------------------------------------------------\n // Data Rows: Values for each record\n // -------------------------------------------------------------------------\n for (const record of records) {\n const values = columnList.map(col => {\n const value = record[col]\n // Format value first (handles complex types), then escape for CSV\n return escapeCSV(formatCSVValue(value))\n })\n lines.push(values.join(','))\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Escape a string value for CSV\n *\n * Per RFC 4180, values containing commas, quotes, or newlines\n * must be wrapped in double quotes, with internal quotes doubled.\n *\n * @param value - String to escape\n * @returns CSV-safe string\n *\n * @example\n * escapeCSV('hello') // 'hello'\n * escapeCSV('hello, world') // '\"hello, world\"'\n * escapeCSV('say \"hi\"') // '\"say \"\"hi\"\"\"'\n * escapeCSV('line1\\nline2') // '\"line1\\nline2\"'\n */\nfunction escapeCSV(value: string): string {\n // Check if escaping is needed (contains special characters)\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n // Wrap in double quotes, escape internal quotes by doubling\n return `\"${value.replace(/\"/g, '\"\"')}\"`\n }\n return value\n}\n\n/**\n * Format a value for CSV output\n *\n * Converts values to string representation:\n * - null/undefined → empty string\n * - strings → as-is\n * - numbers/booleans → string representation\n * - arrays/objects → JSON string\n *\n * @param value - Value to format\n * @returns String representation for CSV\n *\n * @example\n * formatCSVValue(null) // ''\n * formatCSVValue('hello') // 'hello'\n * formatCSVValue(42) // '42'\n * formatCSVValue([1, 2]) // '[\"a\",\"b\"]'\n */\nfunction formatCSVValue(value: unknown): string {\n // Handle null and undefined as empty strings\n if (value === null || value === undefined) {\n return ''\n }\n\n // Strings pass through directly\n if (typeof value === 'string') {\n return value\n }\n\n // Numbers and booleans convert to string\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n\n // Arrays and objects serialize to JSON\n if (Array.isArray(value) || typeof value === 'object') {\n return JSON.stringify(value)\n }\n\n // Fallback for unexpected types\n return ''\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Convert a name to CONSTANT_CASE\n *\n * Transforms camelCase or PascalCase to SCREAMING_SNAKE_CASE.\n * Used for generating TypeScript constant names.\n *\n * @param name - Input name (e.g., \"CustomerOrder\", \"userId\")\n * @returns CONSTANT_CASE name (e.g., \"CUSTOMER_ORDER\", \"USER_ID\")\n *\n * @example\n * toConstantCase('CustomerOrder') // 'CUSTOMER_ORDER'\n * toConstantCase('userId') // 'USER_ID'\n * toConstantCase('APIKey') // 'API_KEY'\n */\nfunction toConstantCase(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1_$2') // Insert underscore between lower→upper\n .replace(/[^a-zA-Z0-9]/g, '_') // Replace non-alphanumeric with underscore\n .toUpperCase()\n}\n\n/**\n * Convert a name to snake_case\n *\n * Transforms camelCase or PascalCase to lowercase_snake_case.\n * Used for generating SQL table names.\n *\n * @param name - Input name (e.g., \"CustomerOrder\", \"UserId\")\n * @returns snake_case name (e.g., \"customer_order\", \"user_id\")\n *\n * @example\n * toSnakeCase('CustomerOrder') // 'customer_order'\n * toSnakeCase('UserId') // 'user_id'\n * toSnakeCase('APIKey') // 'api_key'\n */\nfunction toSnakeCase(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1_$2') // Insert underscore between lower→upper\n .replace(/[^a-zA-Z0-9]/g, '_') // Replace non-alphanumeric with underscore\n .toLowerCase()\n}\n","/**\n * Validation rule generation from DemokitSchema\n *\n * Automatically generates validation rules based on:\n * - Property types and formats\n * - Required fields\n * - Constraints (min/max, patterns)\n * - Relationships\n */\n\nimport type { DemokitSchema, DataModel, PropertyDef, Relationship } from '../../schema'\nimport type { ValidationRule, ValidationCheck, RuleGeneratorConfig } from '../types'\n\n/**\n * Generate all validation rules from a schema\n */\nexport function generateRulesFromSchema(\n schema: DemokitSchema,\n config: RuleGeneratorConfig = {}\n): ValidationRule[] {\n const {\n includeOptional = false,\n includeRelationships = true,\n includeFormats = true,\n customRules = [],\n } = config\n\n const rules: ValidationRule[] = []\n\n // Generate rules for each model\n for (const [modelName, model] of Object.entries(schema.models)) {\n const modelRules = generateModelRules(modelName, model, {\n includeOptional,\n includeFormats,\n })\n rules.push(...modelRules)\n }\n\n // Generate relationship rules\n if (includeRelationships) {\n for (const relationship of schema.relationships) {\n const relRule = generateRelationshipRule(relationship)\n rules.push(relRule)\n }\n }\n\n // Add timestamp ordering rules (common patterns)\n const timestampRules = generateTimestampRules(schema)\n rules.push(...timestampRules)\n\n // Add custom rules\n rules.push(...customRules)\n\n return rules\n}\n\n/**\n * Generate validation rules for a single model\n */\nfunction generateModelRules(\n modelName: string,\n model: DataModel,\n options: { includeOptional: boolean; includeFormats: boolean }\n): ValidationRule[] {\n const rules: ValidationRule[] = []\n\n if (!model.properties) return rules\n\n for (const [propName, propDef] of Object.entries(model.properties)) {\n const isRequired = model.required?.includes(propName) ?? propDef.required ?? false\n\n // Skip optional fields if not requested\n if (!isRequired && !options.includeOptional) {\n continue\n }\n\n // Type rule\n const typeRule = generateTypeRule(modelName, propName, propDef, isRequired)\n if (typeRule) {\n rules.push(typeRule)\n }\n\n // Format rule\n if (options.includeFormats && propDef.format) {\n const formatRule = generateFormatRule(modelName, propName, propDef)\n if (formatRule) {\n rules.push(formatRule)\n }\n }\n\n // Constraint rules\n const constraintRules = generateConstraintRules(modelName, propName, propDef)\n rules.push(...constraintRules)\n\n // Enum rule\n if (propDef.enum && propDef.enum.length > 0) {\n rules.push({\n id: `${modelName}.${propName}.enum`,\n model: modelName,\n field: propName,\n check: 'inEnum',\n target: JSON.stringify(propDef.enum),\n required: isRequired,\n message: `${propName} must be one of: ${propDef.enum.join(', ')}`,\n })\n }\n }\n\n return rules\n}\n\n/**\n * Generate type validation rule for a property\n */\nfunction generateTypeRule(\n modelName: string,\n propName: string,\n propDef: PropertyDef,\n required: boolean\n): ValidationRule | null {\n const checkMap: Record<string, ValidationCheck> = {\n string: 'isString',\n number: 'isNumber',\n integer: 'isInteger',\n boolean: 'isBoolean',\n array: 'isArray',\n object: 'isObject',\n }\n\n const check = checkMap[propDef.type]\n if (!check) return null\n\n return {\n id: `${modelName}.${propName}.type`,\n model: modelName,\n field: propName,\n check,\n required,\n message: `${propName} must be a ${propDef.type}`,\n }\n}\n\n/**\n * Generate format validation rule for a property\n */\nfunction generateFormatRule(\n modelName: string,\n propName: string,\n propDef: PropertyDef\n): ValidationRule | null {\n const formatMap: Record<string, ValidationCheck> = {\n uuid: 'isUUID',\n email: 'isEmail',\n uri: 'isURL',\n url: 'isURL',\n date: 'isDate',\n 'date-time': 'isDateTime',\n }\n\n const format = propDef.format\n if (!format) return null\n\n const check = formatMap[format]\n if (!check) return null\n\n return {\n id: `${modelName}.${propName}.format`,\n model: modelName,\n field: propName,\n check,\n message: `${propName} must be a valid ${format}`,\n }\n}\n\n/**\n * Generate constraint validation rules for a property\n */\nfunction generateConstraintRules(\n modelName: string,\n propName: string,\n propDef: PropertyDef\n): ValidationRule[] {\n const rules: ValidationRule[] = []\n\n if (propDef.minLength !== undefined) {\n rules.push({\n id: `${modelName}.${propName}.minLength`,\n model: modelName,\n field: propName,\n check: 'minLength',\n target: String(propDef.minLength),\n message: `${propName} must have at least ${propDef.minLength} characters`,\n })\n }\n\n if (propDef.maxLength !== undefined) {\n rules.push({\n id: `${modelName}.${propName}.maxLength`,\n model: modelName,\n field: propName,\n check: 'maxLength',\n target: String(propDef.maxLength),\n message: `${propName} must have at most ${propDef.maxLength} characters`,\n })\n }\n\n if (propDef.minimum !== undefined) {\n rules.push({\n id: `${modelName}.${propName}.minimum`,\n model: modelName,\n field: propName,\n check: 'minimum',\n target: String(propDef.minimum),\n message: `${propName} must be at least ${propDef.minimum}`,\n })\n }\n\n if (propDef.maximum !== undefined) {\n rules.push({\n id: `${modelName}.${propName}.maximum`,\n model: modelName,\n field: propName,\n check: 'maximum',\n target: String(propDef.maximum),\n message: `${propName} must be at most ${propDef.maximum}`,\n })\n }\n\n if (propDef.pattern) {\n rules.push({\n id: `${modelName}.${propName}.pattern`,\n model: modelName,\n field: propName,\n check: 'pattern',\n target: propDef.pattern,\n message: `${propName} must match pattern: ${propDef.pattern}`,\n })\n }\n\n return rules\n}\n\n/**\n * Generate referential integrity rule for a relationship\n */\nfunction generateRelationshipRule(relationship: Relationship): ValidationRule {\n const { from, to } = relationship\n\n return {\n id: `${from.model}.${from.field}.ref`,\n model: from.model,\n field: from.field,\n check: 'existsIn',\n target: `${to.model}.${to.field}`,\n required: relationship.required,\n message: `${from.field} must reference a valid ${to.model}`,\n }\n}\n\n/**\n * Generate timestamp ordering rules (common patterns)\n */\nfunction generateTimestampRules(schema: DemokitSchema): ValidationRule[] {\n const rules: ValidationRule[] = []\n\n // Common timestamp pairs to validate\n const timestampPairs = [\n ['createdAt', 'updatedAt'],\n ['created_at', 'updated_at'],\n ['startDate', 'endDate'],\n ['start_date', 'end_date'],\n ['startTime', 'endTime'],\n ['start_time', 'end_time'],\n ]\n\n for (const [modelName, model] of Object.entries(schema.models)) {\n if (!model.properties) continue\n\n const propNames = Object.keys(model.properties)\n\n for (const pair of timestampPairs) {\n const before = pair[0]\n const after = pair[1]\n if (!before || !after) continue\n if (propNames.includes(before) && propNames.includes(after)) {\n rules.push({\n id: `${modelName}.${before}.beforeOrEqual.${after}`,\n model: modelName,\n field: before,\n check: 'beforeOrEqual',\n target: after,\n message: `${before} must be before or equal to ${after}`,\n })\n }\n }\n }\n\n return rules\n}\n\n/**\n * Get a human-readable description of a rule\n */\nexport function describeRule(rule: ValidationRule): string {\n const prefix = rule.required ? '[Required] ' : ''\n\n switch (rule.check) {\n case 'isString':\n return `${prefix}${rule.model}.${rule.field} must be a string`\n case 'isNumber':\n return `${prefix}${rule.model}.${rule.field} must be a number`\n case 'isInteger':\n return `${prefix}${rule.model}.${rule.field} must be an integer`\n case 'isBoolean':\n return `${prefix}${rule.model}.${rule.field} must be a boolean`\n case 'isArray':\n return `${prefix}${rule.model}.${rule.field} must be an array`\n case 'isObject':\n return `${prefix}${rule.model}.${rule.field} must be an object`\n case 'isUUID':\n return `${prefix}${rule.model}.${rule.field} must be a valid UUID`\n case 'isEmail':\n return `${prefix}${rule.model}.${rule.field} must be a valid email`\n case 'isURL':\n return `${prefix}${rule.model}.${rule.field} must be a valid URL`\n case 'isISO8601':\n case 'isDateTime':\n return `${prefix}${rule.model}.${rule.field} must be a valid ISO 8601 datetime`\n case 'isDate':\n return `${prefix}${rule.model}.${rule.field} must be a valid date (YYYY-MM-DD)`\n case 'existsIn':\n return `${prefix}${rule.model}.${rule.field} must reference a valid ${rule.target}`\n case 'beforeOrEqual':\n return `${prefix}${rule.model}.${rule.field} must be before or equal to ${rule.target}`\n case 'inEnum':\n return `${prefix}${rule.model}.${rule.field} must be one of: ${rule.target}`\n default:\n return `${prefix}${rule.model}.${rule.field}: ${rule.check}`\n }\n}\n\n/**\n * Group rules by model for easier inspection\n */\nexport function groupRulesByModel(\n rules: ValidationRule[]\n): Record<string, ValidationRule[]> {\n const grouped: Record<string, ValidationRule[]> = {}\n\n for (const rule of rules) {\n const modelRules = grouped[rule.model]\n if (!modelRules) {\n grouped[rule.model] = [rule]\n } else {\n modelRules.push(rule)\n }\n }\n\n return grouped\n}\n\n/**\n * Filter rules to get only relationship rules\n */\nexport function getRelationshipRules(rules: ValidationRule[]): ValidationRule[] {\n return rules.filter((rule) => rule.check === 'existsIn')\n}\n\n/**\n * Filter rules to get only required field rules\n */\nexport function getRequiredFieldRules(rules: ValidationRule[]): ValidationRule[] {\n return rules.filter((rule) => rule.required)\n}\n"]}
|