schemock 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +82 -0
- package/dist/adapters/index.d.mts +1364 -0
- package/dist/adapters/index.d.ts +1364 -0
- package/dist/adapters/index.js +36988 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +36972 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/cli/index.d.mts +831 -0
- package/dist/cli/index.d.ts +831 -0
- package/dist/cli/index.js +4425 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +4401 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/cli.js +6776 -0
- package/dist/index.d.mts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +39439 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +39367 -0
- package/dist/index.mjs.map +1 -0
- package/dist/middleware/index.d.mts +688 -0
- package/dist/middleware/index.d.ts +688 -0
- package/dist/middleware/index.js +921 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/index.mjs +899 -0
- package/dist/middleware/index.mjs.map +1 -0
- package/dist/react/index.d.mts +316 -0
- package/dist/react/index.d.ts +316 -0
- package/dist/react/index.js +466 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +456 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/runtime/index.d.mts +814 -0
- package/dist/runtime/index.d.ts +814 -0
- package/dist/runtime/index.js +1270 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/index.mjs +1246 -0
- package/dist/runtime/index.mjs.map +1 -0
- package/dist/schema/index.d.mts +838 -0
- package/dist/schema/index.d.ts +838 -0
- package/dist/schema/index.js +696 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +681 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/types-C1MiZh1d.d.ts +96 -0
- package/dist/types-C2bd2vgy.d.mts +773 -0
- package/dist/types-C2bd2vgy.d.ts +773 -0
- package/dist/types-C9VMgu3E.d.mts +289 -0
- package/dist/types-DV2DS7wj.d.mts +96 -0
- package/dist/types-c2AN3vky.d.ts +289 -0
- package/package.json +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/handlers.ts","../../src/runtime/resolver/registry.ts","../../src/runtime/resolver/computed.ts","../../src/runtime/resolver/relation.ts","../../src/schema/types.ts","../../src/runtime/resolver/view.ts","../../src/runtime/resolver/resolver.ts","../../src/runtime/setup.ts","../../src/runtime/seed.ts","../../src/runtime/index.ts"],"names":["registry","createHandlers"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * MSW Handlers Generator - REST handlers for all CRUD operations\n *\n * Generates MSW (Mock Service Worker) HTTP handlers from entity schemas,\n * enabling automatic request interception for the MockAdapter.\n *\n * @module runtime/handlers\n * @category Runtime\n */\n\nimport { http, HttpResponse } from 'msw';\nimport type { HttpHandler } from 'msw';\nimport type { EntitySchema } from '../schema/types';\nimport type { Adapter, AdapterContext } from '../adapters/types';\n\n/**\n * Handler options for customizing MSW behavior.\n */\nexport interface HandlerOptions {\n /** Base URL for API endpoints */\n baseUrl?: string;\n /** Whether to log requests */\n quiet?: boolean;\n}\n\n/**\n * Create MSW REST handlers for all CRUD operations on entity schemas.\n *\n * Generates handlers for:\n * - GET /{entity} - List all entities\n * - GET /{entity}/:id - Get single entity\n * - POST /{entity} - Create new entity\n * - PUT /{entity}/:id - Update entity\n * - PATCH /{entity}/:id - Partial update entity\n * - DELETE /{entity}/:id - Delete entity\n *\n * @param schemas - Array of entity schemas to create handlers for\n * @param adapter - The adapter to use for operations\n * @param options - Handler configuration options\n * @returns Array of MSW HTTP handlers\n *\n * @example\n * ```typescript\n * import { createHandlers } from 'schemock/runtime';\n * import { setupWorker } from 'msw/browser';\n *\n * const handlers = createHandlers([userSchema, postSchema], mockAdapter, {\n * baseUrl: '/api',\n * });\n *\n * const worker = setupWorker(...handlers);\n * await worker.start();\n * ```\n */\nexport function createHandlers(\n schemas: EntitySchema[],\n adapter: Adapter,\n options?: HandlerOptions\n): HttpHandler[] {\n const handlers: HttpHandler[] = [];\n const baseUrl = options?.baseUrl ?? '/api';\n\n for (const schema of schemas) {\n const entityPath = getEntityPath(schema, baseUrl);\n\n // List handler - GET /api/{entity}\n handlers.push(createListHandler(schema, entityPath, adapter));\n\n // Get handler - GET /api/{entity}/:id\n handlers.push(createGetHandler(schema, entityPath, adapter));\n\n // Create handler - POST /api/{entity}\n handlers.push(createCreateHandler(schema, entityPath, adapter));\n\n // Update handler - PUT /api/{entity}/:id\n handlers.push(createUpdateHandler(schema, entityPath, adapter, 'PUT'));\n\n // Partial update handler - PATCH /api/{entity}/:id\n handlers.push(createUpdateHandler(schema, entityPath, adapter, 'PATCH'));\n\n // Delete handler - DELETE /api/{entity}/:id\n handlers.push(createDeleteHandler(schema, entityPath, adapter));\n\n // Add custom operation handlers if defined in schema\n if (schema.api?.operations) {\n handlers.push(\n ...createCustomHandlers(schema, entityPath, adapter)\n );\n }\n }\n\n return handlers;\n}\n\n/**\n * Get the API path for an entity.\n */\nfunction getEntityPath(schema: EntitySchema, baseUrl: string): string {\n if (schema.api?.basePath) {\n return schema.api.basePath;\n }\n // Pluralize entity name (simple: add 's')\n const plural = schema.name.endsWith('s')\n ? schema.name\n : `${schema.name}s`;\n return `${baseUrl}/${plural}`;\n}\n\n/**\n * Create list handler - GET /api/{entity}\n */\nfunction createListHandler(\n schema: EntitySchema,\n path: string,\n adapter: Adapter\n): HttpHandler {\n return http.get(path, async ({ request }) => {\n const url = new URL(request.url);\n const ctx: AdapterContext = {\n entity: schema.name,\n endpoint: path,\n params: {},\n filter: parseQueryFilter(url.searchParams),\n limit: parseNumber(url.searchParams.get('limit')),\n offset: parseNumber(url.searchParams.get('offset')),\n orderBy: parseOrderBy(url.searchParams.get('orderBy')),\n };\n\n const result = await adapter.findMany(ctx);\n\n if (result.error) {\n return HttpResponse.json(\n { error: result.error.message },\n { status: 500 }\n );\n }\n\n return HttpResponse.json({\n data: result.data,\n meta: result.meta,\n });\n });\n}\n\n/**\n * Create get handler - GET /api/{entity}/:id\n */\nfunction createGetHandler(\n schema: EntitySchema,\n path: string,\n adapter: Adapter\n): HttpHandler {\n return http.get(`${path}/:id`, async ({ params }) => {\n const ctx: AdapterContext = {\n entity: schema.name,\n endpoint: path,\n params: { id: params.id as string },\n };\n\n const result = await adapter.findOne(ctx);\n\n if (result.error) {\n return HttpResponse.json(\n { error: result.error.message },\n { status: 404 }\n );\n }\n\n if (!result.data) {\n return HttpResponse.json(\n { error: `${schema.name} not found` },\n { status: 404 }\n );\n }\n\n return HttpResponse.json({ data: result.data });\n });\n}\n\n/**\n * Create create handler - POST /api/{entity}\n */\nfunction createCreateHandler(\n schema: EntitySchema,\n path: string,\n adapter: Adapter\n): HttpHandler {\n return http.post(path, async ({ request }) => {\n const body = await request.json();\n\n const ctx: AdapterContext = {\n entity: schema.name,\n endpoint: path,\n data: body,\n };\n\n const result = await adapter.create(ctx);\n\n if (result.error) {\n return HttpResponse.json(\n { error: result.error.message },\n { status: 400 }\n );\n }\n\n return HttpResponse.json({ data: result.data }, { status: 201 });\n });\n}\n\n/**\n * Create update handler - PUT/PATCH /api/{entity}/:id\n */\nfunction createUpdateHandler(\n schema: EntitySchema,\n path: string,\n adapter: Adapter,\n method: 'PUT' | 'PATCH'\n): HttpHandler {\n const handler = method === 'PUT' ? http.put : http.patch;\n\n return handler(`${path}/:id`, async ({ params, request }) => {\n const body = await request.json();\n\n const ctx: AdapterContext = {\n entity: schema.name,\n endpoint: path,\n params: { id: params.id as string },\n data: body,\n };\n\n const result = await adapter.update(ctx);\n\n if (result.error) {\n return HttpResponse.json(\n { error: result.error.message },\n { status: 400 }\n );\n }\n\n if (!result.data) {\n return HttpResponse.json(\n { error: `${schema.name} not found` },\n { status: 404 }\n );\n }\n\n return HttpResponse.json({ data: result.data });\n });\n}\n\n/**\n * Create delete handler - DELETE /api/{entity}/:id\n */\nfunction createDeleteHandler(\n schema: EntitySchema,\n path: string,\n adapter: Adapter\n): HttpHandler {\n return http.delete(`${path}/:id`, async ({ params }) => {\n const ctx: AdapterContext = {\n entity: schema.name,\n endpoint: path,\n params: { id: params.id as string },\n };\n\n const result = await adapter.delete(ctx);\n\n if (result.error) {\n return HttpResponse.json(\n { error: result.error.message },\n { status: 400 }\n );\n }\n\n return new HttpResponse(null, { status: 204 });\n });\n}\n\n/**\n * Create custom operation handlers from schema API config.\n */\nfunction createCustomHandlers(\n schema: EntitySchema,\n basePath: string,\n adapter: Adapter\n): HttpHandler[] {\n const handlers: HttpHandler[] = [];\n const operations = schema.api?.operations || {};\n\n for (const [name, config] of Object.entries(operations)) {\n // Skip boolean config values (enable/disable flags)\n if (typeof config === 'boolean') continue;\n if (!config || typeof config !== 'object') continue;\n\n const customConfig = config as { method: string; path: string; params?: string[] };\n const method = customConfig.method?.toLowerCase() || 'get';\n const path = `${basePath}${customConfig.path || `/${name}`}`;\n\n const httpMethod = http[method as keyof typeof http];\n if (typeof httpMethod !== 'function') continue;\n\n handlers.push(\n (httpMethod as typeof http.get)(path, async ({ request, params }) => {\n const ctx: AdapterContext = {\n entity: schema.name,\n endpoint: path,\n operation: name,\n params: params as Record<string, unknown>,\n };\n\n if (method === 'post' || method === 'put' || method === 'patch') {\n ctx.data = await request.json();\n }\n\n if (adapter.custom) {\n const result = await adapter.custom(ctx);\n if (result.error) {\n return HttpResponse.json(\n { error: result.error.message },\n { status: 400 }\n );\n }\n return HttpResponse.json({ data: result.data });\n }\n\n return HttpResponse.json(\n { error: 'Custom operations not supported by adapter' },\n { status: 501 }\n );\n })\n );\n }\n\n return handlers;\n}\n\n/**\n * Parse query string filter parameters.\n */\nfunction parseQueryFilter(\n params: URLSearchParams\n): Record<string, unknown> | undefined {\n const filter: Record<string, unknown> = {};\n let hasFilter = false;\n\n for (const [key, value] of params.entries()) {\n // Skip pagination and ordering params\n if (['limit', 'offset', 'orderBy', 'select'].includes(key)) continue;\n\n // Handle filter[field] syntax\n if (key.startsWith('filter[') && key.endsWith(']')) {\n const field = key.slice(7, -1);\n filter[field] = parseValue(value);\n hasFilter = true;\n }\n // Handle simple field=value syntax\n else if (!key.includes('[')) {\n filter[key] = parseValue(value);\n hasFilter = true;\n }\n }\n\n return hasFilter ? filter : undefined;\n}\n\n/**\n * Parse orderBy query parameter.\n */\nfunction parseOrderBy(\n value: string | null\n): Record<string, 'asc' | 'desc'> | undefined {\n if (!value) return undefined;\n\n const orderBy: Record<string, 'asc' | 'desc'> = {};\n\n for (const part of value.split(',')) {\n const [field, direction] = part.split(':');\n if (field) {\n orderBy[field] = direction === 'desc' ? 'desc' : 'asc';\n }\n }\n\n return Object.keys(orderBy).length > 0 ? orderBy : undefined;\n}\n\n/**\n * Parse a number from string.\n */\nfunction parseNumber(value: string | null): number | undefined {\n if (!value) return undefined;\n const num = parseInt(value, 10);\n return isNaN(num) ? undefined : num;\n}\n\n/**\n * Parse a query parameter value to appropriate type.\n */\nfunction parseValue(value: string): unknown {\n // Boolean\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n // Number\n const num = Number(value);\n if (!isNaN(num)) return num;\n\n // String\n return value;\n}\n","/**\n * Schema Registry - Manages schema registration and lookup\n *\n * @module runtime/resolver/registry\n * @category Runtime\n */\n\nimport type { EntitySchema, ViewSchema, RelationDefinition } from '../../schema/types';\n\n/**\n * Schema Registry manages all registered entity and view schemas.\n * Provides fast lookup and traversal of schema metadata.\n *\n * @example\n * ```typescript\n * import { SchemaRegistry } from 'schemock/runtime';\n *\n * const registry = new SchemaRegistry();\n * registry.register(UserSchema);\n * registry.register(PostSchema);\n *\n * const user = registry.get('user');\n * ```\n */\nexport class SchemaRegistry {\n private entities = new Map<string, EntitySchema>();\n private views = new Map<string, ViewSchema>();\n\n /**\n * Register an entity schema\n * @param schema - The entity schema to register\n */\n register(schema: EntitySchema): void {\n if (this.entities.has(schema.name)) {\n console.warn(`Schema '${schema.name}' is already registered. Overwriting.`);\n }\n this.entities.set(schema.name, schema);\n }\n\n /**\n * Register a view schema\n * @param view - The view schema to register\n */\n registerView(view: ViewSchema): void {\n if (this.views.has(view.name)) {\n console.warn(`View '${view.name}' is already registered. Overwriting.`);\n }\n this.views.set(view.name, view);\n }\n\n /**\n * Get an entity schema by name\n * @param entityName - The entity name\n * @returns EntitySchema or undefined if not found\n */\n get(entityName: string): EntitySchema | undefined {\n return this.entities.get(entityName);\n }\n\n /**\n * Get an entity schema by name, throws if not found\n * @param entityName - The entity name\n * @returns EntitySchema\n * @throws Error if entity not found\n */\n getOrThrow(entityName: string): EntitySchema {\n const schema = this.entities.get(entityName);\n if (!schema) {\n throw new Error(`Entity schema '${entityName}' not found. Did you forget to register it?`);\n }\n return schema;\n }\n\n /**\n * Get a view schema by name\n * @param viewName - The view name\n * @returns ViewSchema or undefined if not found\n */\n getView(viewName: string): ViewSchema | undefined {\n return this.views.get(viewName);\n }\n\n /**\n * Get a view schema by name, throws if not found\n * @param viewName - The view name\n * @returns ViewSchema\n * @throws Error if view not found\n */\n getViewOrThrow(viewName: string): ViewSchema {\n const view = this.views.get(viewName);\n if (!view) {\n throw new Error(`View schema '${viewName}' not found. Did you forget to register it?`);\n }\n return view;\n }\n\n /**\n * Get all registered entity schemas\n * @returns Array of all entity schemas\n */\n getAll(): EntitySchema[] {\n return Array.from(this.entities.values());\n }\n\n /**\n * Get all registered view schemas\n * @returns Array of all view schemas\n */\n getAllViews(): ViewSchema[] {\n return Array.from(this.views.values());\n }\n\n /**\n * Check if an entity schema is registered\n * @param entityName - The entity name\n * @returns true if registered\n */\n has(entityName: string): boolean {\n return this.entities.has(entityName);\n }\n\n /**\n * Check if a view schema is registered\n * @param viewName - The view name\n * @returns true if registered\n */\n hasView(viewName: string): boolean {\n return this.views.has(viewName);\n }\n\n /**\n * Get all relations for an entity\n * @param entityName - The entity name\n * @returns Array of relation definitions with their names\n */\n getRelationsFor(entityName: string): Array<{ name: string; relation: RelationDefinition }> {\n const schema = this.entities.get(entityName);\n if (!schema || !schema.relations) {\n return [];\n }\n\n return Object.entries(schema.relations).map(([name, relation]) => ({\n name,\n relation,\n }));\n }\n\n /**\n * Get all entities that have a relation to a target entity\n * @param targetEntityName - The target entity name\n * @returns Array of entity names that reference the target\n */\n getEntitiesReferencingEntity(targetEntityName: string): string[] {\n const result: string[] = [];\n\n for (const [entityName, schema] of this.entities) {\n if (schema.relations) {\n for (const relation of Object.values(schema.relations)) {\n if (relation.target === targetEntityName) {\n result.push(entityName);\n break;\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get entity names in dependency order (topological sort)\n * Entities with no dependencies come first\n * @returns Array of entity names in order\n */\n getEntityOrder(): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n const visit = (entityName: string) => {\n if (visited.has(entityName)) return;\n visited.add(entityName);\n\n const schema = this.entities.get(entityName);\n if (schema?.relations) {\n for (const relation of Object.values(schema.relations)) {\n if (this.entities.has(relation.target)) {\n visit(relation.target);\n }\n }\n }\n\n result.push(entityName);\n };\n\n for (const entityName of this.entities.keys()) {\n visit(entityName);\n }\n\n return result;\n }\n\n /**\n * Clear all registered schemas\n */\n clear(): void {\n this.entities.clear();\n this.views.clear();\n }\n\n /**\n * Get entity count\n */\n get entityCount(): number {\n return this.entities.size;\n }\n\n /**\n * Get view count\n */\n get viewCount(): number {\n return this.views.size;\n }\n}\n\n/**\n * Global schema registry instance\n */\nexport const registry = new SchemaRegistry();\n","/**\n * Computed Field Resolver - Handles resolution of computed/derived fields\n *\n * @module runtime/resolver/computed\n * @category Runtime\n */\n\nimport type { EntitySchema, ComputedFieldDefinition } from '../../schema/types';\n\n/**\n * Context passed to computed field resolvers\n */\nexport interface ResolverContext {\n /** Current user ID for auth-related computations */\n currentUserId?: string;\n /** Request parameters */\n params?: Record<string, unknown>;\n /** Request headers */\n headers?: Record<string, string>;\n /** Mode: 'seed' uses mock(), 'resolve' uses resolve() */\n mode: 'seed' | 'resolve';\n}\n\n/**\n * Database entity operations interface\n */\nexport interface DatabaseEntity {\n findFirst(query: unknown): unknown;\n findMany(query: unknown): unknown[];\n count(query?: unknown): number;\n create?(data: unknown): unknown;\n update?(query: unknown): unknown;\n delete?(query: unknown): unknown;\n}\n\n/**\n * Generic database interface for computed field resolvers\n */\nexport interface Database {\n [entityName: string]: DatabaseEntity;\n}\n\n/**\n * Sorts computed fields by their dependencies using topological sort.\n * Fields with no dependencies come first, fields that depend on others come later.\n *\n * @param fields - Array of [fieldName, definition] tuples to sort\n * @param allComputed - Full record of all computed field definitions\n * @returns Sorted array of [fieldName, definition] tuples\n * @throws Error if circular dependency is detected\n *\n * @example\n * ```typescript\n * const fields = [\n * ['avgViews', { dependsOn: ['totalViews', 'postCount'] }],\n * ['postCount', { dependsOn: [] }],\n * ['totalViews', { dependsOn: ['postCount'] }],\n * ];\n *\n * const sorted = topologicalSort(fields, allComputed);\n * // Returns: [['postCount', ...], ['totalViews', ...], ['avgViews', ...]]\n * ```\n */\nexport function topologicalSort<T extends ComputedFieldDefinition>(\n fields: Array<[string, T]>,\n allComputed: Record<string, ComputedFieldDefinition>\n): Array<[string, T]> {\n const result: Array<[string, T]> = [];\n const visited = new Set<string>();\n const visiting = new Set<string>(); // For cycle detection\n\n const fieldNames = new Set(fields.map(([name]) => name));\n\n function visit(name: string): void {\n // Already processed\n if (visited.has(name)) return;\n\n // Cycle detected\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected in computed fields: ${name}`);\n }\n\n visiting.add(name);\n\n // Visit dependencies first\n const computed = allComputed[name];\n if (computed?.dependsOn) {\n for (const dep of computed.dependsOn) {\n // Only visit if it's a computed field we're sorting\n if (allComputed[dep] && fieldNames.has(dep)) {\n visit(dep);\n }\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n\n // Add to result if it's in our fields array\n const field = fields.find(([n]) => n === name);\n if (field) {\n result.push(field);\n }\n }\n\n // Visit all fields\n for (const [name] of fields) {\n visit(name);\n }\n\n return result;\n}\n\n/**\n * Cache for computed values within a request\n * Prevents re-computation of the same field\n */\nconst computeCache = new Map<string, unknown>();\n\n/**\n * Clears the compute cache. Should be called at the start of each request.\n */\nexport function clearComputeCache(): void {\n computeCache.clear();\n}\n\n/**\n * Resolves a single computed field for an entity.\n *\n * @param entity - The entity to compute the field for\n * @param fieldName - The name of the computed field\n * @param computed - The computed field definition\n * @param db - Database interface for queries\n * @param context - Resolver context\n * @returns The computed value\n *\n * @example\n * ```typescript\n * const postCount = resolveComputedField(\n * user,\n * 'postCount',\n * { resolve: (user, db) => db.post.count({ where: { authorId: user.id } }) },\n * db,\n * { mode: 'resolve' }\n * );\n * ```\n */\nexport function resolveComputedField<T>(\n entity: Record<string, unknown>,\n fieldName: string,\n computed: ComputedFieldDefinition<T>,\n db: Database,\n context: ResolverContext\n): T | Promise<T> {\n const entityId = entity.id as string;\n const cacheKey = `${entityId}:${fieldName}`;\n\n // Return cached value if available\n if (computeCache.has(cacheKey)) {\n return computeCache.get(cacheKey) as T;\n }\n\n let value: T | Promise<T>;\n\n if (context.mode === 'seed' && computed.mock) {\n // During seeding, use mock function\n value = computed.mock();\n } else {\n // During resolution, use resolve function\n value = computed.resolve(entity, db, context);\n }\n\n // Handle promises\n if (value instanceof Promise) {\n return value.then((resolved) => {\n computeCache.set(cacheKey, resolved);\n return resolved;\n });\n }\n\n computeCache.set(cacheKey, value);\n return value;\n}\n\n/**\n * Resolves all computed fields for an entity.\n * Fields are resolved in dependency order.\n *\n * @param entity - The entity to resolve computed fields for\n * @param schema - The entity schema\n * @param db - Database interface for queries\n * @param context - Resolver context\n * @returns The entity with computed fields resolved (mutates and returns the same object)\n *\n * @example\n * ```typescript\n * const user = await resolveComputedFields(rawUser, UserSchema, db, { mode: 'resolve' });\n * console.log(user.postCount); // Now available\n * ```\n */\nexport async function resolveComputedFields<T extends Record<string, unknown>>(\n entity: T,\n schema: EntitySchema,\n db: Database,\n context: ResolverContext\n): Promise<T> {\n if (!schema.computed || Object.keys(schema.computed).length === 0) {\n return entity;\n }\n\n // Get all computed fields\n const computedFields = Object.entries(schema.computed) as Array<[string, ComputedFieldDefinition]>;\n\n // Sort by dependencies\n const sorted = topologicalSort(computedFields, schema.computed);\n\n // Resolve each field in order\n for (const [fieldName, computed] of sorted) {\n const value = await resolveComputedField(entity, fieldName, computed, db, context);\n (entity as Record<string, unknown>)[fieldName] = value;\n }\n\n return entity;\n}\n\n/**\n * Resolves computed fields synchronously (for mock mode where all mocks are sync)\n *\n * @param entity - The entity to resolve computed fields for\n * @param schema - The entity schema\n * @param context - Resolver context (should have mode: 'seed')\n * @returns The entity with computed fields resolved\n */\nexport function resolveComputedFieldsSync<T extends Record<string, unknown>>(\n entity: T,\n schema: EntitySchema,\n context: ResolverContext\n): T {\n if (!schema.computed || Object.keys(schema.computed).length === 0) {\n return entity;\n }\n\n // Get all computed fields\n const computedFields = Object.entries(schema.computed) as Array<[string, ComputedFieldDefinition]>;\n\n // Sort by dependencies\n const sorted = topologicalSort(computedFields, schema.computed);\n\n // Resolve each field in order using mock\n for (const [fieldName, computed] of sorted) {\n if (computed.mock) {\n (entity as Record<string, unknown>)[fieldName] = computed.mock();\n }\n }\n\n return entity;\n}\n","/**\n * Relation Resolver - Handles lazy and eager loading of entity relations\n *\n * @module runtime/resolver/relation\n * @category Runtime\n */\n\nimport type { EntitySchema, RelationDefinition } from '../../schema/types';\nimport type { Database } from './computed';\nimport { SchemaRegistry } from './registry';\n\n/**\n * Options for resolving relations\n */\nexport interface ResolveRelationOptions {\n /** Specific relations to include (by name or nested path like 'posts.comments') */\n include?: string[];\n /** Maximum depth for nested relation resolution */\n depth?: number;\n /** Default limit for hasMany relations */\n limit?: number;\n /** Default ordering for hasMany relations */\n orderBy?: Record<string, 'asc' | 'desc'>;\n}\n\n/**\n * Default maximum depth for relation resolution\n */\nconst DEFAULT_MAX_DEPTH = 3;\n\n/**\n * Resolves a single relation for an entity.\n *\n * @param entity - The source entity\n * @param relationName - Name of the relation field\n * @param relation - The relation definition\n * @param db - Database interface\n * @param registry - Schema registry\n * @param options - Resolution options\n * @param currentDepth - Current recursion depth\n * @returns The related entity/entities or null/empty array\n *\n * @example\n * ```typescript\n * const posts = await resolveRelation(\n * user,\n * 'posts',\n * { type: 'hasMany', target: 'post', foreignKey: 'authorId' },\n * db,\n * registry,\n * { limit: 10 }\n * );\n * ```\n */\nexport async function resolveRelation<T>(\n entity: Record<string, unknown>,\n relationName: string,\n relation: RelationDefinition,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions = {},\n currentDepth = 0\n): Promise<T | T[] | null> {\n const maxDepth = options.depth ?? DEFAULT_MAX_DEPTH;\n\n // Prevent infinite recursion\n if (currentDepth >= maxDepth) {\n return relation.type === 'hasMany' ? [] : null;\n }\n\n switch (relation.type) {\n case 'hasOne':\n return resolveHasOne<T>(entity, relation, db, registry, options, currentDepth);\n case 'hasMany':\n return resolveHasMany<T>(entity, relation, db, registry, options, currentDepth);\n case 'belongsTo':\n return resolveBelongsTo<T>(entity, relation, db, registry, options, currentDepth);\n default:\n throw new Error(`Unknown relation type: ${(relation as RelationDefinition).type}`);\n }\n}\n\n/**\n * Resolves a hasOne relation (one-to-one, FK on related entity)\n */\nasync function resolveHasOne<T>(\n entity: Record<string, unknown>,\n relation: RelationDefinition,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions,\n currentDepth: number\n): Promise<T | null> {\n const targetDb = db[relation.target];\n if (!targetDb) {\n throw new Error(`Target entity '${relation.target}' not found in database`);\n }\n\n const foreignKey = relation.foreignKey || `${entity.constructor.name.toLowerCase()}Id`;\n const entityId = entity.id;\n\n const related = targetDb.findFirst({\n where: {\n [foreignKey]: { equals: entityId },\n },\n }) as T | null;\n\n if (!related) return null;\n\n // Recursively resolve nested relations if needed\n const targetSchema = registry.get(relation.target);\n if (targetSchema) {\n await resolveNestedRelations(\n related as Record<string, unknown>,\n targetSchema,\n db,\n registry,\n options,\n currentDepth + 1\n );\n }\n\n return related;\n}\n\n/**\n * Resolves a hasMany relation (one-to-many, FK on related entities)\n */\nasync function resolveHasMany<T>(\n entity: Record<string, unknown>,\n relation: RelationDefinition,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions,\n currentDepth: number\n): Promise<T[]> {\n const targetDb = db[relation.target];\n if (!targetDb) {\n throw new Error(`Target entity '${relation.target}' not found in database`);\n }\n\n const foreignKey = relation.foreignKey || `${entity.constructor.name.toLowerCase()}Id`;\n const entityId = entity.id;\n\n // Build query\n const query: Record<string, unknown> = {\n where: {\n [foreignKey]: { equals: entityId },\n },\n };\n\n // Apply limit\n const limit = options.limit ?? relation.limit;\n if (limit) {\n (query as Record<string, unknown>).take = limit;\n }\n\n // Apply ordering\n const orderBy = options.orderBy ?? relation.orderBy;\n if (orderBy) {\n (query as Record<string, unknown>).orderBy = orderBy;\n }\n\n const results = targetDb.findMany(query) as T[];\n\n // Recursively resolve nested relations\n const targetSchema = registry.get(relation.target);\n if (targetSchema) {\n for (const item of results) {\n await resolveNestedRelations(\n item as Record<string, unknown>,\n targetSchema,\n db,\n registry,\n options,\n currentDepth + 1\n );\n }\n }\n\n return results;\n}\n\n/**\n * Resolves a belongsTo relation (many-to-one, FK on this entity)\n */\nasync function resolveBelongsTo<T>(\n entity: Record<string, unknown>,\n relation: RelationDefinition,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions,\n currentDepth: number\n): Promise<T | null> {\n const foreignKey = relation.foreignKey || `${relation.target}Id`;\n const foreignKeyValue = entity[foreignKey];\n\n if (!foreignKeyValue) return null;\n\n const targetDb = db[relation.target];\n if (!targetDb) {\n throw new Error(`Target entity '${relation.target}' not found in database`);\n }\n\n const related = targetDb.findFirst({\n where: { id: { equals: foreignKeyValue } },\n }) as T | null;\n\n if (!related) return null;\n\n // Recursively resolve nested relations\n const targetSchema = registry.get(relation.target);\n if (targetSchema) {\n await resolveNestedRelations(\n related as Record<string, unknown>,\n targetSchema,\n db,\n registry,\n options,\n currentDepth + 1\n );\n }\n\n return related;\n}\n\n/**\n * Resolves nested relations on an entity based on include paths\n */\nasync function resolveNestedRelations(\n entity: Record<string, unknown>,\n schema: EntitySchema,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions,\n currentDepth: number\n): Promise<void> {\n if (!schema.relations) return;\n\n const include = options.include ?? [];\n\n for (const [relationName, relation] of Object.entries(schema.relations)) {\n // Check if this relation should be loaded\n const shouldLoad =\n relation.eager ||\n include.includes(relationName) ||\n include.some((inc) => inc.startsWith(`${relationName}.`));\n\n if (shouldLoad) {\n // Get nested includes for this relation\n const nestedIncludes = include\n .filter((inc) => inc.startsWith(`${relationName}.`))\n .map((inc) => inc.replace(`${relationName}.`, ''));\n\n entity[relationName] = await resolveRelation(\n entity,\n relationName,\n relation,\n db,\n registry,\n { ...options, include: nestedIncludes },\n currentDepth\n );\n }\n }\n}\n\n/**\n * Resolves all relations for an entity.\n *\n * @param entity - The entity to resolve relations for\n * @param schema - The entity schema\n * @param db - Database interface\n * @param registry - Schema registry\n * @param options - Resolution options\n * @returns The entity with relations resolved (mutates and returns same object)\n *\n * @example\n * ```typescript\n * const user = await resolveRelations(rawUser, UserSchema, db, registry, {\n * include: ['profile', 'posts', 'posts.comments'],\n * });\n * ```\n */\nexport async function resolveRelations<T extends Record<string, unknown>>(\n entity: T,\n schema: EntitySchema,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions = {}\n): Promise<T> {\n await resolveNestedRelations(entity, schema, db, registry, options, 0);\n return entity;\n}\n\n/**\n * Eagerly loads relations for multiple entities (batch loading).\n * More efficient than loading relations one-by-one.\n *\n * @param entities - Array of entities to load relations for\n * @param schema - The entity schema\n * @param db - Database interface\n * @param registry - Schema registry\n * @param options - Resolution options\n * @returns The entities with relations resolved\n *\n * @example\n * ```typescript\n * const users = await eagerLoadRelations(rawUsers, UserSchema, db, registry, {\n * include: ['profile'],\n * });\n * ```\n */\nexport async function eagerLoadRelations<T extends Record<string, unknown>>(\n entities: T[],\n schema: EntitySchema,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions = {}\n): Promise<T[]> {\n if (!schema.relations || entities.length === 0) {\n return entities;\n }\n\n const include = options.include ?? [];\n\n for (const [relationName, relation] of Object.entries(schema.relations)) {\n const shouldLoad =\n relation.eager ||\n include.includes(relationName) ||\n include.some((inc) => inc.startsWith(`${relationName}.`));\n\n if (!shouldLoad) continue;\n\n // Batch load based on relation type\n if (relation.type === 'belongsTo') {\n await batchLoadBelongsTo(entities, relationName, relation, db, registry, options);\n } else if (relation.type === 'hasOne') {\n await batchLoadHasOne(entities, relationName, relation, db, registry, options);\n } else if (relation.type === 'hasMany') {\n // hasMany is harder to batch efficiently, fall back to individual loads\n for (const entity of entities) {\n (entity as Record<string, unknown>)[relationName] = await resolveRelation(entity, relationName, relation, db, registry, options);\n }\n }\n }\n\n return entities;\n}\n\n/**\n * Batch loads belongsTo relations\n */\nasync function batchLoadBelongsTo<T extends Record<string, unknown>>(\n entities: T[],\n relationName: string,\n relation: RelationDefinition,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions\n): Promise<void> {\n const foreignKey = relation.foreignKey || `${relation.target}Id`;\n const targetDb = db[relation.target];\n\n // Collect all foreign key values\n const foreignKeyValues = [...new Set(entities.map((e) => (e as Record<string, unknown>)[foreignKey]).filter(Boolean))];\n\n if (foreignKeyValues.length === 0) {\n entities.forEach((e) => ((e as Record<string, unknown>)[relationName] = null));\n return;\n }\n\n // Batch fetch all related entities\n const relatedEntities = targetDb.findMany({\n where: {\n id: { in: foreignKeyValues },\n },\n }) as Record<string, unknown>[];\n\n // Create lookup map\n const lookup = new Map(relatedEntities.map((r) => [r.id, r]));\n\n // Assign to each entity\n for (const entity of entities) {\n const fkValue = (entity as Record<string, unknown>)[foreignKey];\n (entity as Record<string, unknown>)[relationName] = fkValue ? lookup.get(fkValue) ?? null : null;\n }\n\n // Recursively load nested relations\n const targetSchema = registry.get(relation.target);\n if (targetSchema) {\n const nestedIncludes = (options.include ?? [])\n .filter((inc) => inc.startsWith(`${relationName}.`))\n .map((inc) => inc.replace(`${relationName}.`, ''));\n\n if (nestedIncludes.length > 0) {\n await eagerLoadRelations(relatedEntities, targetSchema, db, registry, {\n ...options,\n include: nestedIncludes,\n });\n }\n }\n}\n\n/**\n * Batch loads hasOne relations\n */\nasync function batchLoadHasOne<T extends Record<string, unknown>>(\n entities: T[],\n relationName: string,\n relation: RelationDefinition,\n db: Database,\n registry: SchemaRegistry,\n options: ResolveRelationOptions\n): Promise<void> {\n const foreignKey = relation.foreignKey || 'id';\n const targetDb = db[relation.target];\n\n // Collect all entity IDs\n const entityIds = entities.map((e) => (e as Record<string, unknown>).id).filter(Boolean);\n\n if (entityIds.length === 0) {\n entities.forEach((e) => ((e as Record<string, unknown>)[relationName] = null));\n return;\n }\n\n // Batch fetch all related entities\n const relatedEntities = targetDb.findMany({\n where: {\n [foreignKey]: { in: entityIds },\n },\n }) as Record<string, unknown>[];\n\n // Create lookup map by foreign key\n const lookup = new Map(relatedEntities.map((r) => [r[foreignKey], r]));\n\n // Assign to each entity\n for (const entity of entities) {\n (entity as Record<string, unknown>)[relationName] = lookup.get((entity as Record<string, unknown>).id) ?? null;\n }\n\n // Recursively load nested relations\n const targetSchema = registry.get(relation.target);\n if (targetSchema) {\n const nestedIncludes = (options.include ?? [])\n .filter((inc) => inc.startsWith(`${relationName}.`))\n .map((inc) => inc.replace(`${relationName}.`, ''));\n\n if (nestedIncludes.length > 0) {\n await eagerLoadRelations(relatedEntities, targetSchema, db, registry, {\n ...options,\n include: nestedIncludes,\n });\n }\n }\n}\n","/**\n * Core type definitions for the Schemock Schema DSL\n *\n * @module schema/types\n * @category Schema\n */\n\n// ============================================================================\n// Field Types\n// ============================================================================\n\n/**\n * Constraint configuration for fields\n */\nexport interface FieldConstraints {\n /** Minimum value (for numbers) or minimum length (for strings/arrays) */\n min?: number;\n /** Maximum value (for numbers) or maximum length (for strings/arrays) */\n max?: number;\n /** Regular expression pattern for string validation */\n pattern?: RegExp;\n /** Custom validation message */\n message?: string;\n}\n\n/**\n * Base interface for all field definitions in the schema DSL.\n * Fields define the structure and behavior of entity properties.\n *\n * @example\n * ```typescript\n * const emailField: FieldDefinition<string> = {\n * type: 'email',\n * hint: 'internet.email',\n * nullable: false,\n * unique: true,\n * };\n * ```\n */\nexport interface FieldDefinition<T = unknown> {\n /** The primitive type of the field (string, number, boolean, date, array, object, ref) */\n type: string;\n /** Faker.js hint for generating mock data (e.g., 'person.fullName', 'internet.email') */\n hint?: string;\n /** Whether the field can be null */\n nullable?: boolean;\n /** Whether the field must be unique across all entities */\n unique?: boolean;\n /** Whether the field is read-only (excluded from create/update operations) */\n readOnly?: boolean;\n /** Default value when not provided */\n default?: T;\n /** Validation constraints */\n constraints?: FieldConstraints;\n /** For array fields: the type of items */\n items?: FieldDefinition;\n /** For object fields: the shape of nested properties */\n shape?: Record<string, FieldDefinition>;\n /** For ref fields: the target entity name */\n target?: string;\n /** For enum fields: the allowed values */\n values?: readonly T[];\n /** Internal type marker for TypeScript inference */\n readonly _type?: T;\n}\n\n/**\n * Builder interface for creating field definitions with chainable methods.\n * All field builder methods return a new builder instance to support method chaining.\n *\n * @example\n * ```typescript\n * const field = createFieldBuilder('string')\n * .min(1)\n * .max(100)\n * .nullable()\n * .default('');\n * ```\n */\nexport interface FieldBuilder<T> {\n /** The primitive type of the field */\n type: string;\n /** Faker.js hint for generating mock data */\n hint?: string;\n /** Whether the field can be null - use nullable() method to set */\n isNullable?: boolean;\n /** Whether the field must be unique */\n isUnique?: boolean;\n /** Whether the field is read-only */\n isReadOnly?: boolean;\n /** Default value */\n defaultValue?: T;\n /** Validation constraints */\n constraints?: FieldConstraints;\n /** For array fields */\n items?: FieldDefinition;\n /** For object fields */\n shape?: Record<string, FieldDefinition>;\n /** For ref fields */\n target?: string;\n /** For enum fields */\n values?: readonly T[];\n /** Internal type marker */\n readonly _type?: T;\n\n /** Mark the field as nullable */\n nullable(): FieldBuilder<T | null>;\n /** Mark the field as unique */\n unique(message?: string): FieldBuilder<T>;\n /** Mark the field as read-only */\n readOnly(): FieldBuilder<T>;\n /** Set a default value */\n default(value: T): FieldBuilder<T>;\n /** Set minimum constraint */\n min(value: number, message?: string): FieldBuilder<T>;\n /** Set maximum constraint */\n max(value: number, message?: string): FieldBuilder<T>;\n /** Set regex pattern constraint */\n pattern(regex: RegExp, message?: string): FieldBuilder<T>;\n}\n\n/**\n * Extended builder for string fields with additional string-specific options\n */\nexport interface StringFieldBuilder extends FieldBuilder<string> {\n /** Set minimum length */\n min(length: number, message?: string): StringFieldBuilder;\n /** Set maximum length */\n max(length: number, message?: string): StringFieldBuilder;\n /** Set regex pattern */\n pattern(regex: RegExp, message?: string): StringFieldBuilder;\n}\n\n/**\n * Extended builder for number fields with numeric-specific options\n */\nexport interface NumberFieldBuilder extends FieldBuilder<number> {\n /** Set minimum value */\n min(value: number, message?: string): NumberFieldBuilder;\n /** Set maximum value */\n max(value: number, message?: string): NumberFieldBuilder;\n /** Constrain to integer values */\n int(): NumberFieldBuilder;\n}\n\n/**\n * Extended builder for date fields with date-specific options\n */\nexport interface DateFieldBuilder extends FieldBuilder<Date> {\n /** Constrain to past dates */\n past(): DateFieldBuilder;\n /** Constrain to future dates */\n future(): DateFieldBuilder;\n /** Constrain to recent dates */\n recent(): DateFieldBuilder;\n /** Constrain between specific dates */\n between(options: { from: string | Date; to: string | Date }): DateFieldBuilder;\n}\n\n/**\n * Extended builder for enum fields with type-safe values\n */\nexport interface EnumFieldBuilder<T extends string> extends FieldBuilder<T> {\n /** Set default enum value */\n default(value: T): EnumFieldBuilder<T>;\n}\n\n/**\n * Extended builder for reference fields pointing to other entities\n */\nexport interface RefFieldBuilder extends FieldBuilder<string> {\n /** The target entity name */\n readonly target: string;\n}\n\n/**\n * Extended builder for array fields\n */\nexport interface ArrayFieldBuilder<T> extends FieldBuilder<T[]> {\n /** Set minimum array length */\n min(length: number): ArrayFieldBuilder<T>;\n /** Set maximum array length */\n max(length: number): ArrayFieldBuilder<T>;\n /** Set exact array length */\n length(count: number): ArrayFieldBuilder<T>;\n}\n\n/**\n * Extended builder for object fields with nested shape\n */\nexport interface ObjectFieldBuilder<T> extends FieldBuilder<T> {\n /** The shape definition of nested properties */\n readonly shape: Record<string, FieldDefinition>;\n}\n\n// ============================================================================\n// Relation Types\n// ============================================================================\n\n/**\n * Defines a relationship between entities.\n * Supports one-to-one, one-to-many, and many-to-many relationships.\n *\n * @example\n * ```typescript\n * const userPostsRelation: RelationDefinition = {\n * type: 'hasMany',\n * target: 'post',\n * foreignKey: 'authorId',\n * orderBy: { createdAt: 'desc' },\n * };\n * ```\n */\nexport interface RelationDefinition {\n /** The type of relationship */\n type: 'hasMany' | 'belongsTo' | 'hasOne';\n /** The target entity name */\n target: string;\n /** The foreign key field name (on the related entity for hasMany/hasOne, on this entity for belongsTo) */\n foreignKey?: string;\n /** Whether to eagerly load the relation by default */\n eager?: boolean;\n /** Default ordering for hasMany relations */\n orderBy?: Record<string, 'asc' | 'desc'>;\n /** Default limit for hasMany relations */\n limit?: number;\n /** For many-to-many: the junction table name */\n through?: string;\n /** For many-to-many: the other foreign key on the junction table */\n otherKey?: string;\n}\n\n// ============================================================================\n// Computed Field Types\n// ============================================================================\n\n/**\n * Configuration for computed fields that derive their value from other data.\n *\n * @example\n * ```typescript\n * const fullNameComputed: ComputedFieldDefinition<string> = {\n * resolve: (entity) => `${entity.firstName} ${entity.lastName}`,\n * dependsOn: ['firstName', 'lastName'],\n * };\n * ```\n */\nexport interface ComputedFieldDefinition<T = unknown> {\n /** Function to generate mock data for this computed field */\n mock?: () => T;\n /** Function to resolve the actual value from entity data */\n resolve: (entity: Record<string, unknown>, db: unknown, ctx: unknown) => T | Promise<T>;\n /** Fields this computed field depends on (for ordering resolution) */\n dependsOn?: string[];\n /** Internal type marker */\n readonly _computed: true;\n readonly _type?: T;\n}\n\n/**\n * Type guard to check if a field definition is a computed field\n */\nexport function isComputedField(field: unknown): field is ComputedFieldDefinition {\n return (\n typeof field === 'object' &&\n field !== null &&\n '_computed' in field &&\n (field as ComputedFieldDefinition)._computed === true\n );\n}\n\n/**\n * Type guard to check if a field definition is a relation\n */\nexport function isRelation(field: unknown): field is RelationDefinition {\n return (\n typeof field === 'object' &&\n field !== null &&\n 'type' in field &&\n ['hasMany', 'belongsTo', 'hasOne'].includes((field as RelationDefinition).type)\n );\n}\n\n// ============================================================================\n// Entity Schema Types\n// ============================================================================\n\n/**\n * API configuration for an entity\n */\nexport interface EntityApiConfig {\n /** Base path for REST endpoints (e.g., '/api/users') */\n basePath: string;\n /** Enable/disable specific CRUD operations */\n operations?: {\n list?: boolean;\n get?: boolean;\n create?: boolean;\n update?: boolean;\n delete?: boolean;\n [key: string]: boolean | { method: string; path: string; params?: string[] } | undefined;\n };\n /** Pagination configuration */\n pagination?: {\n style: 'offset' | 'cursor';\n defaultLimit?: number;\n maxLimit?: number;\n };\n /** Relationship endpoint configuration */\n relationships?: Record<\n string,\n {\n endpoint?: boolean;\n operations?: Array<'list' | 'create' | 'update' | 'delete'>;\n }\n >;\n}\n\n// ============================================================================\n// Index Configuration Types\n// ============================================================================\n\n/**\n * Index configuration for database optimization.\n *\n * @example Simple index\n * ```typescript\n * { fields: ['authorId'] }\n * ```\n *\n * @example Composite unique index\n * ```typescript\n * { fields: ['email', 'tenantId'], unique: true }\n * ```\n *\n * @example Full-text search index\n * ```typescript\n * {\n * fields: ['title'],\n * type: 'gin',\n * using: \"to_tsvector('english', title)\",\n * }\n * ```\n *\n * @example Partial index\n * ```typescript\n * {\n * fields: ['createdAt'],\n * where: \"status = 'active'\",\n * }\n * ```\n */\nexport interface IndexConfig {\n /** Column names to index */\n fields: string[];\n /** Custom index name (auto-generated if not provided) */\n name?: string;\n /** Index type (default: btree) */\n type?: 'btree' | 'hash' | 'gin' | 'gist' | 'brin';\n /** Custom expression for functional indexes (e.g., \"to_tsvector('english', title)\") */\n using?: string;\n /** Create unique index */\n unique?: boolean;\n /** Partial index condition (WHERE clause) */\n where?: string;\n /** Use CONCURRENTLY for production migrations (avoids locking) */\n concurrently?: boolean;\n}\n\n// ============================================================================\n// RPC/Stored Procedure Configuration Types\n// ============================================================================\n\n/**\n * RPC/Stored procedure argument definition.\n *\n * @example\n * ```typescript\n * { name: 'user_id', type: 'uuid' }\n * { name: 'limit', type: 'integer', default: '20' }\n * ```\n */\nexport interface RPCArgument {\n /** Argument name */\n name: string;\n /** PostgreSQL type (uuid, text, integer, boolean, jsonb, etc.) */\n type: string;\n /** Default value as SQL expression (optional) */\n default?: string;\n}\n\n/**\n * RPC/Stored procedure configuration.\n *\n * @example Simple query function\n * ```typescript\n * {\n * args: [{ name: 'user_id', type: 'uuid' }],\n * returns: 'post[]',\n * sql: \"SELECT * FROM posts WHERE author_id = $1\",\n * volatility: 'stable',\n * }\n * ```\n *\n * @example Mutation function\n * ```typescript\n * {\n * args: [{ name: 'post_id', type: 'uuid' }],\n * returns: 'post',\n * sql: \"UPDATE posts SET status = 'published' WHERE id = $1 RETURNING *\",\n * volatility: 'volatile',\n * }\n * ```\n *\n * @example PL/pgSQL function\n * ```typescript\n * {\n * args: [{ name: 'user_id', type: 'uuid' }],\n * returns: 'integer',\n * language: 'plpgsql',\n * sql: `\n * DECLARE\n * v_count integer;\n * BEGIN\n * SELECT COUNT(*) INTO v_count FROM posts WHERE author_id = user_id;\n * RETURN v_count;\n * END;\n * `,\n * }\n * ```\n */\nexport interface RPCConfig {\n /** Function arguments */\n args?: RPCArgument[];\n /** Return type: 'void', entity name (e.g., 'post'), array (e.g., 'post[]'), or PostgreSQL type */\n returns: string;\n /** SQL function body */\n sql: string;\n /** Function language (default: sql) */\n language?: 'sql' | 'plpgsql';\n /** Volatility marker for query optimization (default: volatile) */\n volatility?: 'volatile' | 'stable' | 'immutable';\n /** Security context (default: invoker) */\n security?: 'invoker' | 'definer';\n /** Function description for documentation */\n description?: string;\n}\n\n// ============================================================================\n// Entity Options\n// ============================================================================\n\n/**\n * Options for entity schema configuration\n */\nexport interface EntityOptions<T = unknown> {\n /** API endpoint configuration */\n api?: EntityApiConfig;\n /** Whether to automatically add timestamp fields (createdAt, updatedAt) */\n timestamps?: boolean;\n /** Row-level security configuration */\n rls?: RLSConfig<T>;\n /** Database indexes for query optimization */\n indexes?: IndexConfig[];\n /** RPC/Stored procedures related to this entity */\n rpc?: Record<string, RPCConfig>;\n}\n\n/**\n * Complete schema definition for an entity.\n * This is the primary output of the defineData function.\n *\n * @example\n * ```typescript\n * const userSchema: EntitySchema = {\n * name: 'user',\n * fields: { id: field.uuid(), name: field.string() },\n * relations: { posts: hasMany('post') },\n * computed: { postCount: field.computed({...}) },\n * };\n * ```\n */\n/**\n * Generic context for RLS evaluation.\n * Can represent users, API keys, services, tenants, or any other context.\n *\n * @example\n * ```typescript\n * // User-based context\n * const userCtx: RLSContext = { userId: 'user-123', role: 'admin', orgId: 'org-456' };\n *\n * // API key context (no user)\n * const apiKeyCtx: RLSContext = { tenantId: 'tenant-789', scope: 'read' };\n *\n * // Service-to-service context\n * const serviceCtx: RLSContext = { serviceId: 'payment-service', environment: 'prod' };\n * ```\n */\nexport interface RLSContext {\n [key: string]: unknown;\n}\n\n/**\n * Row-level security policy filter function.\n * Receives the row data and current context (can be null if no context set).\n */\nexport type RLSFilter<T = unknown> = (row: T, context: RLSContext | null) => boolean;\n\n/**\n * Scope mapping: maps a row field to a context key.\n * Used for automatic policy generation.\n *\n * @example\n * ```typescript\n * // Row field 'authorId' must match context key 'userId'\n * { field: 'authorId', contextKey: 'userId' }\n *\n * // Row field 'tenantId' must match context key 'tenantId'\n * { field: 'tenantId', contextKey: 'tenantId' }\n * ```\n */\nexport interface RLSScopeMapping {\n /** The field name on the row/entity */\n field: string;\n /** The key in the RLS context to compare against */\n contextKey: string;\n}\n\n/**\n * Bypass condition for RLS.\n * When the context matches this condition, RLS is bypassed.\n */\nexport interface RLSBypass {\n /** Context key to check */\n contextKey: string;\n /** Values that trigger bypass (e.g., ['admin', 'superuser']) */\n values: string[];\n}\n\n/**\n * Row-level security configuration for an entity.\n * Works with any context - users, API keys, services, tenants, etc.\n *\n * @example Simple scope-based (works without users)\n * ```typescript\n * const Post = defineData('post', { ... }, {\n * rls: {\n * // Rows filtered by tenantId from context\n * scope: [{ field: 'tenantId', contextKey: 'tenantId' }],\n * },\n * });\n * ```\n *\n * @example User-based with owner field\n * ```typescript\n * const Post = defineData('post', { ... }, {\n * rls: {\n * scope: [{ field: 'authorId', contextKey: 'userId' }],\n * bypass: [{ contextKey: 'role', values: ['admin'] }],\n * },\n * });\n * ```\n *\n * @example Custom filter functions\n * ```typescript\n * const Post = defineData('post', { ... }, {\n * rls: {\n * select: (row, ctx) => row.isPublic || row.authorId === ctx?.userId,\n * insert: (row, ctx) => row.authorId === ctx?.userId,\n * },\n * });\n * ```\n */\nexport interface RLSConfig<T = unknown> {\n /**\n * Scope mappings for automatic policy generation.\n * Each mapping requires row[field] === context[contextKey].\n */\n scope?: RLSScopeMapping[];\n\n /**\n * Conditions that bypass RLS entirely.\n * If any bypass condition matches, all operations are allowed.\n */\n bypass?: RLSBypass[];\n\n /** Custom filter for SELECT/read operations */\n select?: RLSFilter<T>;\n /** Custom filter for INSERT operations */\n insert?: RLSFilter<T>;\n /** Custom filter for UPDATE operations */\n update?: RLSFilter<T>;\n /** Custom filter for DELETE operations */\n delete?: RLSFilter<T>;\n\n /**\n * PostgreSQL-compatible policy SQL for PGlite/Supabase.\n * Use current_setting('app.{contextKey}') to reference context values.\n */\n sql?: {\n select?: string;\n insert?: string;\n update?: string;\n delete?: string;\n };\n}\n\nexport interface EntitySchema<T = unknown> {\n /** The unique name of this entity */\n name: string;\n /** Field definitions */\n fields: Record<string, FieldDefinition>;\n /** Relation definitions */\n relations?: Record<string, RelationDefinition>;\n /** Computed field definitions */\n computed?: Record<string, ComputedFieldDefinition>;\n /** Whether to include timestamp fields */\n timestamps?: boolean;\n /** API configuration */\n api?: EntityApiConfig;\n /** Row-level security configuration */\n rls?: RLSConfig<T>;\n /** Database indexes for query optimization */\n indexes?: IndexConfig[];\n /** RPC/Stored procedures related to this entity */\n rpc?: Record<string, RPCConfig>;\n /** Internal type marker */\n readonly _entity?: T;\n}\n\n// ============================================================================\n// View Schema Types\n// ============================================================================\n\n/**\n * Embed configuration for including related data in views\n */\nexport interface EmbedConfig {\n /** Maximum number of items to include */\n limit?: number;\n /** Ordering for embedded items */\n orderBy?: Record<string, 'asc' | 'desc'>;\n /** Fields to include (defaults to all) */\n select?: string[];\n}\n\n/**\n * View field value type - supports fields, computed, embeds, and nested objects\n */\nexport type ViewFieldValue =\n | FieldDefinition\n | ComputedFieldDefinition\n | { _embed: true; entity: EntitySchema; config?: EmbedConfig }\n | Record<string, FieldDefinition | ComputedFieldDefinition>;\n\n/**\n * View field definitions (subset of entity fields + embedded relations)\n */\nexport type ViewFields = Record<string, ViewFieldValue>;\n\n/**\n * Options for view schema configuration\n */\nexport interface ViewOptions {\n /** The API endpoint for this view */\n endpoint: string;\n /** URL parameters required for this view */\n params: string[];\n}\n\n/**\n * Schema definition for a computed view over entities.\n *\n * @example\n * ```typescript\n * const userFullView: ViewSchema = {\n * name: 'user-full',\n * fields: { id: field.uuid(), name: field.string() },\n * endpoint: '/api/users/:id/full',\n * params: ['id'],\n * };\n * ```\n */\nexport interface ViewSchema {\n /** The unique name of this view */\n name: string;\n /** Field definitions for the view output */\n fields: ViewFields;\n /** The API endpoint */\n endpoint: string;\n /** Required URL parameters */\n params: string[];\n}\n\n// ============================================================================\n// Custom Endpoint Types\n// ============================================================================\n\n/**\n * HTTP methods supported for custom endpoints\n */\nexport type EndpointMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\n/**\n * Context passed to mock resolver functions.\n * Provides access to request data and the mock database.\n *\n * @example\n * ```typescript\n * mockResolver: async ({ params, body, db }) => {\n * const users = db.user.findMany({ where: { name: { contains: params.q } } });\n * return { results: users, total: users.length };\n * }\n * ```\n */\nexport interface MockResolverContext<TParams = Record<string, unknown>, TBody = Record<string, unknown>> {\n /** Parsed query/path parameters */\n params: TParams;\n /** Parsed request body (for POST/PUT/PATCH) */\n body: TBody;\n /** Access to mock database */\n db: unknown;\n /** Request headers */\n headers: Record<string, string>;\n}\n\n/**\n * Configuration for defining a custom endpoint.\n *\n * @example\n * ```typescript\n * const config: EndpointConfig = {\n * method: 'GET',\n * params: { q: field.string(), limit: field.number.int().default(20) },\n * response: { results: field.array(field.object({...})), total: field.number.int() },\n * mockResolver: async ({ params, db }) => ({ results: [], total: 0 }),\n * };\n * ```\n */\nexport interface EndpointConfig<\n TParams = Record<string, unknown>,\n TBody = Record<string, unknown>,\n TResponse = unknown,\n> {\n /** HTTP method */\n method: EndpointMethod;\n /** Query/path parameter definitions */\n params?: Record<string, FieldBuilder<unknown> | FieldDefinition>;\n /** Request body definition (for POST/PUT/PATCH) */\n body?: Record<string, FieldBuilder<unknown> | FieldDefinition>;\n /** Response schema definition */\n response: Record<string, FieldBuilder<unknown> | FieldDefinition>;\n /** Mock resolver function that generates fake responses */\n mockResolver: (ctx: MockResolverContext<TParams, TBody>) => TResponse | Promise<TResponse>;\n /** Optional description for documentation */\n description?: string;\n}\n\n/**\n * Complete endpoint schema definition.\n * This is the output of the defineEndpoint function.\n *\n * @example\n * ```typescript\n * const SearchEndpoint = defineEndpoint('/api/search', {\n * method: 'GET',\n * params: { q: field.string() },\n * response: { results: field.array(field.string()) },\n * mockResolver: async ({ params, db }) => ({ results: [] }),\n * });\n * ```\n */\nexport interface EndpointSchema<\n TParams = Record<string, unknown>,\n TBody = Record<string, unknown>,\n TResponse = unknown,\n> {\n /** Endpoint path (e.g., '/api/search', '/api/orders/:id') */\n path: string;\n /** HTTP method */\n method: EndpointMethod;\n /** Parameter definitions (normalized to FieldDefinition) */\n params: Record<string, FieldDefinition>;\n /** Body definitions (normalized to FieldDefinition) */\n body: Record<string, FieldDefinition>;\n /** Response definitions (normalized to FieldDefinition) */\n response: Record<string, FieldDefinition>;\n /** Mock resolver function */\n mockResolver: (ctx: MockResolverContext<TParams, TBody>) => TResponse | Promise<TResponse>;\n /** Description for documentation */\n description?: string;\n /** Internal marker for type identification */\n readonly _endpoint: true;\n}\n\n/**\n * Type guard to check if a value is an EndpointSchema\n */\nexport function isEndpointSchema(value: unknown): value is EndpointSchema {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_endpoint' in value &&\n (value as EndpointSchema)._endpoint === true\n );\n}\n\n// ============================================================================\n// Type Inference Utilities\n// ============================================================================\n\n/**\n * Maps field types to their TypeScript equivalents\n */\ntype FieldTypeMap = {\n string: string;\n uuid: string;\n email: string;\n url: string;\n number: number;\n int: number;\n float: number;\n boolean: boolean;\n date: Date;\n array: unknown[];\n object: Record<string, unknown>;\n ref: string;\n enum: string;\n};\n\n/**\n * Infer the TypeScript type from a FieldDefinition\n */\nexport type InferFieldType<F extends FieldDefinition> = F['nullable'] extends true\n ? (F extends { _type: infer T } ? T : FieldTypeMap[F['type'] & keyof FieldTypeMap]) | null\n : F extends { _type: infer T }\n ? T\n : FieldTypeMap[F['type'] & keyof FieldTypeMap];\n\n/**\n * Infer the complete entity type from an EntitySchema\n *\n * @example\n * ```typescript\n * const User = defineData('user', { id: field.uuid(), name: field.string() });\n * type UserType = InferEntity<typeof User>;\n * // { id: string; name: string; }\n * ```\n */\nexport type InferEntity<S extends EntitySchema> = {\n [K in keyof S['fields']]: InferFieldType<S['fields'][K]>;\n} & (S['relations'] extends Record<string, RelationDefinition>\n ? {\n [K in keyof S['relations']]?: S['relations'][K]['type'] extends 'hasMany' ? unknown[] : unknown;\n }\n : object) &\n (S['computed'] extends Record<string, ComputedFieldDefinition>\n ? { [K in keyof S['computed']]: S['computed'][K]['_type'] }\n : object);\n\n/**\n * Infer the type for creating a new entity (excludes id, readOnly, computed fields)\n *\n * @example\n * ```typescript\n * type UserCreate = InferCreate<typeof User>;\n * // { name: string; email: string; } (without id, createdAt, etc.)\n * ```\n */\nexport type InferCreate<S extends EntitySchema> = {\n [K in keyof S['fields'] as S['fields'][K]['readOnly'] extends true\n ? never\n : K extends 'id'\n ? never\n : K]: S['fields'][K]['default'] extends undefined\n ? InferFieldType<S['fields'][K]>\n : InferFieldType<S['fields'][K]> | undefined;\n};\n\n/**\n * Infer the type for updating an entity (all fields optional, excludes readOnly)\n *\n * @example\n * ```typescript\n * type UserUpdate = InferUpdate<typeof User>;\n * // { name?: string; email?: string; }\n * ```\n */\nexport type InferUpdate<S extends EntitySchema> = Partial<InferCreate<S>>;\n","/**\n * View Resolver - Executes view queries by applying filters and transforms\n *\n * @module runtime/resolver/view\n * @category Runtime\n */\n\nimport type { ViewSchema, EntitySchema, ComputedFieldDefinition, EmbedConfig } from '../../schema/types';\nimport { isComputedField } from '../../schema/types';\nimport type { SchemaRegistry } from './registry';\nimport type { Database, ResolverContext } from './computed';\nimport { resolveComputedFields, clearComputeCache } from './computed';\n\n/**\n * Options for resolving a view\n */\nexport interface ViewResolveOptions {\n /** URL parameters */\n params: Record<string, string>;\n /** Resolver context */\n context: ResolverContext;\n}\n\n/**\n * Embed definition with target entity info\n */\ninterface EmbedDefinition {\n _embed: true;\n entity: EntitySchema;\n config?: EmbedConfig;\n}\n\n/**\n * Type guard for embed definition\n */\nfunction isEmbedDefinition(value: unknown): value is EmbedDefinition {\n return typeof value === 'object' && value !== null && '_embed' in value && (value as EmbedDefinition)._embed === true;\n}\n\n/**\n * ViewResolver handles resolution of view schemas.\n * Views are computed projections over entity data.\n *\n * @example\n * ```typescript\n * const viewResolver = new ViewResolver(registry, db);\n * const userFull = await viewResolver.resolve(UserFullView, { id: '123' });\n * ```\n */\nexport class ViewResolver {\n constructor(\n private registry: SchemaRegistry,\n private db: Database\n ) {}\n\n /**\n * Resolves a view schema with given parameters.\n *\n * @param view - The view schema to resolve\n * @param params - URL parameters for the view\n * @param context - Optional resolver context\n * @returns The resolved view data\n *\n * @example\n * ```typescript\n * const userData = await viewResolver.resolve(UserFullView, { id: 'user-123' });\n * ```\n */\n async resolve<T>(view: ViewSchema, params: Record<string, string>, context?: Partial<ResolverContext>): Promise<T> {\n clearComputeCache();\n\n const resolverContext: ResolverContext = {\n mode: 'resolve',\n params,\n ...context,\n };\n\n return this.buildViewResult<T>(view, { params, context: resolverContext });\n }\n\n /**\n * Builds the view result by resolving all fields\n */\n private async buildViewResult<T>(view: ViewSchema, options: ViewResolveOptions): Promise<T> {\n const result: Record<string, unknown> = {};\n\n // Process each field in the view\n for (const [fieldName, fieldDef] of Object.entries(view.fields)) {\n if (isEmbedDefinition(fieldDef)) {\n // Resolve embedded entity\n result[fieldName] = await this.resolveEmbed(fieldDef, result, options);\n } else if (isComputedField(fieldDef)) {\n // Resolve computed field\n result[fieldName] = await this.resolveViewComputedField(fieldDef, result, options);\n } else if (this.isNestedObjectField(fieldDef)) {\n // Resolve nested object of fields/computed\n result[fieldName] = await this.resolveNestedObject(fieldDef, result, options);\n } else {\n // Regular field - check if we need to fetch from params or base entity\n const paramValue = options.params[fieldName];\n if (paramValue !== undefined) {\n result[fieldName] = paramValue;\n }\n }\n }\n\n return result as T;\n }\n\n /**\n * Check if a field definition is a nested object\n */\n private isNestedObjectField(fieldDef: unknown): fieldDef is Record<string, unknown> {\n return (\n typeof fieldDef === 'object' &&\n fieldDef !== null &&\n !('type' in fieldDef) &&\n !('_computed' in fieldDef) &&\n !('_embed' in fieldDef)\n );\n }\n\n /**\n * Resolves an embedded entity field\n */\n private async resolveEmbed(\n embed: EmbedDefinition,\n parentData: Record<string, unknown>,\n options: ViewResolveOptions\n ): Promise<unknown> {\n const targetDb = this.db[embed.entity.name];\n if (!targetDb) {\n throw new Error(`Target entity '${embed.entity.name}' not found in database`);\n }\n\n // Build query from config\n const query: Record<string, unknown> = { where: {} };\n\n // Use params to build where clause\n const idParam = options.params.id;\n if (idParam) {\n // Try to find by common foreign key patterns\n const possibleForeignKeys = [\n `${this.guessParentEntityName(options)}Id`,\n 'userId',\n 'authorId',\n 'parentId',\n ];\n\n for (const fk of possibleForeignKeys) {\n if (embed.entity.fields && fk in embed.entity.fields) {\n (query.where as Record<string, unknown>)[fk] = { equals: idParam };\n break;\n }\n }\n }\n\n // Apply config options\n if (embed.config?.limit) {\n query.take = embed.config.limit;\n }\n\n if (embed.config?.orderBy) {\n query.orderBy = embed.config.orderBy;\n }\n\n // Determine if we should return array or single item\n const shouldReturnArray = !embed.config?.limit || embed.config.limit > 1;\n\n if (shouldReturnArray) {\n const results = targetDb.findMany(query);\n return results;\n } else {\n const result = targetDb.findFirst(query);\n return result;\n }\n }\n\n /**\n * Guess the parent entity name from the view endpoint\n */\n private guessParentEntityName(options: ViewResolveOptions): string {\n // Simple heuristic: look for entity name in params\n return 'user'; // Default fallback\n }\n\n /**\n * Resolves a computed field within a view context\n */\n private async resolveViewComputedField(\n computed: ComputedFieldDefinition,\n currentData: Record<string, unknown>,\n options: ViewResolveOptions\n ): Promise<unknown> {\n if (options.context.mode === 'seed' && computed.mock) {\n return computed.mock();\n }\n\n return computed.resolve(currentData, this.db, options.context);\n }\n\n /**\n * Resolves a nested object containing fields and computed values\n */\n private async resolveNestedObject(\n nestedDef: Record<string, unknown>,\n parentData: Record<string, unknown>,\n options: ViewResolveOptions\n ): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n for (const [fieldName, fieldDef] of Object.entries(nestedDef)) {\n if (isComputedField(fieldDef)) {\n result[fieldName] = await this.resolveViewComputedField(fieldDef, parentData, options);\n } else {\n // Regular field value\n result[fieldName] = fieldDef;\n }\n }\n\n return result;\n }\n\n /**\n * Resolves a view with mock data (for seeding)\n */\n async resolveMock<T>(view: ViewSchema, params: Record<string, string>): Promise<T> {\n return this.resolve<T>(view, params, { mode: 'seed' });\n }\n}\n\n/**\n * Creates a new ViewResolver instance\n *\n * @param registry - Schema registry\n * @param db - Database interface\n * @returns ViewResolver instance\n */\nexport function createViewResolver(registry: SchemaRegistry, db: Database): ViewResolver {\n return new ViewResolver(registry, db);\n}\n","/**\n * Main Resolver Engine - Core CRUD operations with relation and computed field resolution\n *\n * @module runtime/resolver\n * @category Runtime\n */\n\nimport type { EntitySchema, ViewSchema } from '../../schema/types';\nimport { SchemaRegistry } from './registry';\nimport type { Database, ResolverContext } from './computed';\nimport { resolveComputedFields, clearComputeCache } from './computed';\nimport { resolveRelations, eagerLoadRelations, type ResolveRelationOptions } from './relation';\nimport { ViewResolver } from './view';\n\n/**\n * Options for single entity queries\n */\nexport interface EntityQueryOptions extends ResolveRelationOptions {\n /** Filter conditions */\n where?: Record<string, unknown>;\n /** Specific computed fields to resolve */\n computed?: string[];\n}\n\n/**\n * Options for list queries\n */\nexport interface ListQueryOptions extends EntityQueryOptions {\n /** Maximum number of results */\n limit?: number;\n /** Number of results to skip (for pagination) */\n offset?: number;\n /** Sort order */\n orderBy?: Record<string, 'asc' | 'desc'>;\n}\n\n/**\n * Options for count queries\n */\nexport interface CountOptions {\n /** Filter conditions */\n where?: Record<string, unknown>;\n}\n\n/**\n * Create input type (partial entity without id)\n */\nexport type CreateInput<T> = Omit<Partial<T>, 'id'>;\n\n/**\n * Update input type (partial entity)\n */\nexport type UpdateInput<T> = Partial<T>;\n\n/**\n * Main resolver engine for CRUD operations.\n * Orchestrates relation loading, computed field resolution, and database queries.\n *\n * @example\n * ```typescript\n * const resolver = new Resolver(registry, db);\n *\n * // Find one with relations\n * const user = await resolver.findOne('user', '123', {\n * include: ['profile', 'posts'],\n * });\n *\n * // Find many with pagination\n * const users = await resolver.findMany('user', {\n * limit: 20,\n * offset: 0,\n * orderBy: { createdAt: 'desc' },\n * });\n * ```\n */\nexport class Resolver {\n private context: ResolverContext;\n private viewResolver: ViewResolver;\n\n constructor(\n private registry: SchemaRegistry,\n private db: Database,\n context?: Partial<ResolverContext>\n ) {\n this.context = { mode: 'resolve', ...context };\n this.viewResolver = new ViewResolver(registry, db);\n }\n\n /**\n * Find a single entity by ID\n *\n * @param entityName - The entity type to find\n * @param id - The entity ID\n * @param options - Query options (relations, computed fields)\n * @returns The entity or null if not found\n *\n * @example\n * ```typescript\n * const user = await resolver.findOne('user', '123', {\n * include: ['profile'],\n * computed: ['postCount'],\n * });\n * ```\n */\n async findOne<T extends Record<string, unknown>>(\n entityName: string,\n id: string,\n options: EntityQueryOptions = {}\n ): Promise<T | null> {\n clearComputeCache();\n\n const schema = this.registry.getOrThrow(entityName);\n const entityDb = this.db[entityName];\n\n if (!entityDb) {\n throw new Error(`Entity '${entityName}' not found in database`);\n }\n\n const entity = entityDb.findFirst({\n where: { id: { equals: id } },\n }) as T | null;\n\n if (!entity) return null;\n\n // Resolve relations\n await resolveRelations(entity, schema, this.db, this.registry, options);\n\n // Resolve computed fields\n await resolveComputedFields(entity, schema, this.db, this.context);\n\n return entity;\n }\n\n /**\n * Find multiple entities with filtering and pagination\n *\n * @param entityName - The entity type to find\n * @param options - Query options (filters, pagination, relations)\n * @returns Array of entities\n *\n * @example\n * ```typescript\n * const users = await resolver.findMany('user', {\n * where: { role: 'admin' },\n * limit: 20,\n * offset: 0,\n * include: ['profile'],\n * });\n * ```\n */\n async findMany<T extends Record<string, unknown>>(\n entityName: string,\n options: ListQueryOptions = {}\n ): Promise<T[]> {\n clearComputeCache();\n\n const schema = this.registry.getOrThrow(entityName);\n const entityDb = this.db[entityName];\n\n if (!entityDb) {\n throw new Error(`Entity '${entityName}' not found in database`);\n }\n\n // Build query\n const query: Record<string, unknown> = {};\n\n if (options.where) {\n query.where = this.buildWhereClause(options.where);\n }\n if (options.limit) {\n query.take = options.limit;\n }\n if (options.offset) {\n query.skip = options.offset;\n }\n if (options.orderBy) {\n query.orderBy = options.orderBy;\n }\n\n const entities = entityDb.findMany(query) as T[];\n\n // Batch load relations for efficiency\n await eagerLoadRelations(entities, schema, this.db, this.registry, options);\n\n // Resolve computed fields for each entity\n for (const entity of entities) {\n await resolveComputedFields(entity, schema, this.db, this.context);\n }\n\n return entities;\n }\n\n /**\n * Create a new entity\n *\n * @param entityName - The entity type to create\n * @param data - The entity data\n * @param options - Query options for the returned entity\n * @returns The created entity with relations and computed fields\n *\n * @example\n * ```typescript\n * const user = await resolver.create('user', {\n * name: 'John Doe',\n * email: 'john@example.com',\n * });\n * ```\n */\n async create<T extends Record<string, unknown>>(\n entityName: string,\n data: CreateInput<T>,\n options: EntityQueryOptions = {}\n ): Promise<T> {\n const schema = this.registry.getOrThrow(entityName);\n const entityDb = this.db[entityName];\n\n if (!entityDb) {\n throw new Error(`Entity '${entityName}' not found in database`);\n }\n\n // Create the entity\n if (!entityDb.create) {\n throw new Error(`Entity '${entityName}' does not support create operation`);\n }\n const entity = entityDb.create(data) as T;\n\n // Resolve relations\n await resolveRelations(entity, schema, this.db, this.registry, options);\n\n // Resolve computed fields\n await resolveComputedFields(entity, schema, this.db, this.context);\n\n return entity;\n }\n\n /**\n * Update an existing entity\n *\n * @param entityName - The entity type to update\n * @param id - The entity ID\n * @param data - The update data\n * @param options - Query options for the returned entity\n * @returns The updated entity or null if not found\n *\n * @example\n * ```typescript\n * const user = await resolver.update('user', '123', {\n * name: 'Jane Doe',\n * });\n * ```\n */\n async update<T extends Record<string, unknown>>(\n entityName: string,\n id: string,\n data: UpdateInput<T>,\n options: EntityQueryOptions = {}\n ): Promise<T | null> {\n const schema = this.registry.getOrThrow(entityName);\n const entityDb = this.db[entityName];\n\n if (!entityDb) {\n throw new Error(`Entity '${entityName}' not found in database`);\n }\n\n // Update the entity\n if (!entityDb.update) {\n throw new Error(`Entity '${entityName}' does not support update operation`);\n }\n const entity = entityDb.update({\n where: { id: { equals: id } },\n data,\n }) as T | null;\n\n if (!entity) return null;\n\n // Resolve relations\n await resolveRelations(entity, schema, this.db, this.registry, options);\n\n // Resolve computed fields\n await resolveComputedFields(entity, schema, this.db, this.context);\n\n return entity;\n }\n\n /**\n * Delete an entity by ID\n *\n * @param entityName - The entity type to delete\n * @param id - The entity ID\n * @returns true if deleted, false if not found\n *\n * @example\n * ```typescript\n * const deleted = await resolver.delete('user', '123');\n * ```\n */\n delete(entityName: string, id: string): boolean {\n const entityDb = this.db[entityName];\n\n if (!entityDb) {\n throw new Error(`Entity '${entityName}' not found in database`);\n }\n\n if (!entityDb.delete) {\n throw new Error(`Entity '${entityName}' does not support delete operation`);\n }\n const deleted = entityDb.delete({\n where: { id: { equals: id } },\n });\n\n return deleted !== null;\n }\n\n /**\n * Count entities matching a filter\n *\n * @param entityName - The entity type to count\n * @param options - Count options (filters)\n * @returns The count\n *\n * @example\n * ```typescript\n * const adminCount = await resolver.count('user', {\n * where: { role: 'admin' },\n * });\n * ```\n */\n count(entityName: string, options: CountOptions = {}): number {\n const entityDb = this.db[entityName];\n\n if (!entityDb) {\n throw new Error(`Entity '${entityName}' not found in database`);\n }\n\n const query = options.where ? { where: this.buildWhereClause(options.where) } : {};\n return entityDb.count(query);\n }\n\n /**\n * Resolve a view with parameters\n *\n * @param viewName - The view name\n * @param params - View parameters\n * @returns The resolved view data\n *\n * @example\n * ```typescript\n * const userFull = await resolver.view('user-full', { id: '123' });\n * ```\n */\n async view<T>(viewName: string, params: Record<string, string>): Promise<T | null> {\n clearComputeCache();\n\n const viewSchema = this.registry.getViewOrThrow(viewName);\n return this.viewResolver.resolve<T>(viewSchema, params, this.context);\n }\n\n /**\n * Build a where clause from simple object to database format\n */\n private buildWhereClause(where: Record<string, unknown>): Record<string, unknown> {\n const clause: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(where)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Already in query format (e.g., { equals: 'foo' })\n clause[key] = value;\n } else if (Array.isArray(value)) {\n // Array becomes 'in' clause\n clause[key] = { in: value };\n } else {\n // Simple value becomes 'equals'\n clause[key] = { equals: value };\n }\n }\n\n return clause;\n }\n\n /**\n * Get the current resolver context\n */\n getContext(): ResolverContext {\n return { ...this.context };\n }\n\n /**\n * Create a new resolver with updated context\n */\n withContext(context: Partial<ResolverContext>): Resolver {\n return new Resolver(this.registry, this.db, { ...this.context, ...context });\n }\n}\n\n/**\n * Creates a new Resolver instance\n *\n * @param registry - Schema registry\n * @param db - Database interface\n * @param context - Optional resolver context\n * @returns Resolver instance\n *\n * @example\n * ```typescript\n * const resolver = createResolver(registry, db, {\n * currentUserId: 'user-123',\n * });\n * ```\n */\nexport function createResolver(\n registry: SchemaRegistry,\n db: Database,\n context?: Partial<ResolverContext>\n): Resolver {\n return new Resolver(registry, db, context);\n}\n","/**\n * Runtime Setup - Initialize mock runtime with MSW worker\n *\n * Provides setup functions for initializing the mock server\n * in both browser and Node.js environments.\n *\n * @module runtime/setup\n * @category Runtime\n */\n\nimport type { EntitySchema } from '../schema/types';\nimport type { Adapter } from '../adapters/types';\n\n/**\n * Global runtime state.\n */\ninterface RuntimeState {\n /** Whether the runtime is initialized */\n initialized: boolean;\n /** The active adapter */\n adapter: Adapter | null;\n /** Registered entity schemas */\n schemas: EntitySchema[];\n /** MSW worker instance (browser) */\n worker: unknown | null;\n /** MSW server instance (Node.js) */\n server: unknown | null;\n}\n\n/**\n * Global runtime state singleton.\n */\nconst state: RuntimeState = {\n initialized: false,\n adapter: null,\n schemas: [],\n worker: null,\n server: null,\n};\n\n/**\n * Setup options for runtime initialization.\n */\nexport interface SetupOptions {\n /** The adapter to use */\n adapter: Adapter;\n /** Entity schemas */\n schemas: EntitySchema[];\n /** Whether to start MSW (browser only) */\n startMsw?: boolean;\n /** MSW handler options */\n mswOptions?: {\n /** Base URL for handlers */\n baseUrl?: string;\n /** Whether to log requests */\n quiet?: boolean;\n };\n}\n\n/**\n * Initialize the mock runtime.\n *\n * Sets up the adapter, registers schemas, and optionally starts\n * the MSW service worker for browser environments.\n *\n * @returns Promise that resolves when setup is complete\n *\n * @example\n * ```typescript\n * import { setup } from 'schemock/runtime';\n * import { createMockAdapter } from 'schemock/adapters';\n *\n * await setup({\n * adapter: createMockAdapter([userSchema, postSchema]),\n * schemas: [userSchema, postSchema],\n * startMsw: true,\n * });\n * ```\n */\nexport async function setup(options?: SetupOptions): Promise<void> {\n if (state.initialized) {\n console.warn('Schemock runtime already initialized');\n return;\n }\n\n if (options) {\n state.adapter = options.adapter;\n state.schemas = options.schemas;\n }\n\n // In browser environment, optionally start MSW worker\n if (\n options?.startMsw &&\n typeof window !== 'undefined' &&\n options.schemas.length > 0\n ) {\n await startMswWorker(options);\n }\n\n state.initialized = true;\n}\n\n/**\n * Start the MSW service worker (browser only).\n *\n * @param options - Setup options\n */\nasync function startMswWorker(options: SetupOptions): Promise<void> {\n try {\n // Dynamic import to avoid bundling MSW in production\n const { setupWorker } = await import('msw/browser');\n const { createHandlers } = await import('./handlers');\n\n const handlers = createHandlers(\n options.schemas,\n state.adapter!,\n options.mswOptions\n );\n\n state.worker = setupWorker(...handlers);\n\n await (state.worker as { start: (options?: { quiet?: boolean }) => Promise<void> }).start({\n quiet: options.mswOptions?.quiet ?? true,\n });\n } catch (error) {\n console.warn('MSW setup failed:', error);\n }\n}\n\n/**\n * Teardown the runtime and clean up resources.\n *\n * @example\n * ```typescript\n * await teardown();\n * ```\n */\nexport async function teardown(): Promise<void> {\n if (state.worker) {\n await (state.worker as { stop: () => Promise<void> }).stop();\n state.worker = null;\n }\n\n if (state.server) {\n (state.server as { close: () => void }).close();\n state.server = null;\n }\n\n state.adapter = null;\n state.schemas = [];\n state.initialized = false;\n}\n\n/**\n * Get the current runtime state.\n *\n * @returns The current state\n */\nexport function getState(): Readonly<RuntimeState> {\n return state;\n}\n\n/**\n * Check if the runtime is initialized.\n *\n * @returns True if initialized\n */\nexport function isInitialized(): boolean {\n return state.initialized;\n}\n\n/**\n * Get the active adapter.\n *\n * @returns The adapter or null\n */\nexport function getAdapter(): Adapter | null {\n return state.adapter;\n}\n\n/**\n * Set the active adapter (for testing or manual configuration).\n *\n * @param adapter - The adapter to set\n */\nexport function setAdapter(adapter: Adapter): void {\n state.adapter = adapter;\n}\n","/**\n * Seed Function - Populate database with fake data\n *\n * Seeds the MockAdapter database with generated fake data\n * based on entity schemas and specified counts.\n *\n * @module runtime/seed\n * @category Runtime\n */\n\nimport { getAdapter } from './setup';\nimport type { MockAdapter } from '../adapters/mock/adapter';\n\n/**\n * Seed the database with fake data.\n *\n * Uses the configured MockAdapter to generate and persist\n * fake entities based on the provided counts.\n *\n * @param counts - Map of entity names to number of items to create\n *\n * @example\n * ```typescript\n * import { seed } from 'schemock/runtime';\n *\n * // Seed with specific counts\n * seed({\n * user: 10,\n * post: 50,\n * comment: 100,\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Seed in a setup function\n * async function initMockData() {\n * await setup({ adapter, schemas });\n * seed({ user: 5, project: 10 });\n * }\n * ```\n */\nexport function seed(counts: Record<string, number>): void {\n const adapter = getAdapter();\n\n if (!adapter) {\n throw new Error(\n 'No adapter configured. Call setup() first or use adapter.seed() directly.'\n );\n }\n\n // Check if adapter is a MockAdapter with seed method\n if (adapter.name !== 'mock') {\n throw new Error(\n `seed() only works with MockAdapter. Current adapter: ${adapter.name}`\n );\n }\n\n // Call the MockAdapter's seed method\n (adapter as MockAdapter).seed(counts);\n}\n\n/**\n * Reset the database to empty state.\n *\n * Clears all data from the MockAdapter database.\n *\n * @example\n * ```typescript\n * import { reset } from 'schemock/runtime';\n *\n * // Clear all mock data\n * reset();\n * ```\n */\nexport function reset(): void {\n const adapter = getAdapter();\n\n if (!adapter) {\n throw new Error('No adapter configured. Call setup() first.');\n }\n\n if (adapter.name !== 'mock') {\n throw new Error(\n `reset() only works with MockAdapter. Current adapter: ${adapter.name}`\n );\n }\n\n (adapter as MockAdapter).reset();\n}\n\n/**\n * Seed with related data (maintains referential integrity).\n *\n * Seeds entities in dependency order, ensuring foreign keys\n * reference valid parent entities.\n *\n * @param counts - Map of entity names to counts\n * @param relations - Map of entity to foreign key relationships\n *\n * @example\n * ```typescript\n * import { seedWithRelations } from 'schemock/runtime';\n *\n * seedWithRelations(\n * { user: 5, post: 20 },\n * { post: { authorId: 'user' } }\n * );\n * ```\n */\nexport function seedWithRelations(\n counts: Record<string, number>,\n relations: Record<string, Record<string, string>>\n): void {\n const adapter = getAdapter() as MockAdapter;\n\n if (!adapter || adapter.name !== 'mock') {\n throw new Error('seedWithRelations() requires MockAdapter');\n }\n\n // Build dependency graph\n const deps = new Map<string, Set<string>>();\n for (const entity of Object.keys(counts)) {\n deps.set(entity, new Set());\n }\n for (const [entity, fks] of Object.entries(relations)) {\n for (const targetEntity of Object.values(fks)) {\n deps.get(entity)?.add(targetEntity);\n }\n }\n\n // Topological sort\n const sorted: string[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n function visit(entity: string): void {\n if (visited.has(entity)) return;\n if (visiting.has(entity)) {\n throw new Error(`Circular dependency detected: ${entity}`);\n }\n visiting.add(entity);\n for (const dep of deps.get(entity) || []) {\n visit(dep);\n }\n visiting.delete(entity);\n visited.add(entity);\n sorted.push(entity);\n }\n\n for (const entity of Object.keys(counts)) {\n visit(entity);\n }\n\n // Seed in dependency order\n const entityIds: Record<string, string[]> = {};\n\n for (const entity of sorted) {\n const count = counts[entity];\n if (count === undefined) continue;\n\n // Get parent IDs for foreign keys\n const fks = relations[entity] || {};\n const parentIds: Record<string, string[]> = {};\n for (const [fkField, parentEntity] of Object.entries(fks)) {\n parentIds[fkField] = entityIds[parentEntity] || [];\n }\n\n // Generate entities with foreign keys\n entityIds[entity] = [];\n for (let i = 0; i < count; i++) {\n const data: Record<string, unknown> = {};\n\n // Assign random parent IDs\n for (const [fkField, ids] of Object.entries(parentIds)) {\n if (ids.length > 0) {\n data[fkField] = ids[Math.floor(Math.random() * ids.length)];\n }\n }\n\n // Create via adapter\n const result = adapter.create<{ id: string }>({\n entity,\n data,\n });\n\n // This is sync in MockAdapter despite the Promise return\n result.then((res) => {\n if (res.data?.id) {\n entityIds[entity].push(res.data.id);\n }\n });\n }\n }\n}\n","/**\n * Schemock Runtime - Resolver system and setup utilities\n *\n * @module runtime\n * @category Runtime\n */\n\n// Re-export resolver system\nexport * from './resolver';\n\n// Re-export setup and seed functions\nexport { setup, teardown, isInitialized, getAdapter, setAdapter } from './setup';\nexport type { SetupOptions } from './setup';\n\nexport { seed, reset, seedWithRelations } from './seed';\n\nexport { createHandlers } from './handlers';\nexport type { HandlerOptions } from './handlers';\n"]}
|