omni-rest 0.2.0 → 0.2.2
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/adapters/express.js +9 -5
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +9 -5
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/fastify.js +9 -5
- package/dist/adapters/fastify.js.map +1 -1
- package/dist/adapters/fastify.mjs +9 -5
- package/dist/adapters/fastify.mjs.map +1 -1
- package/dist/adapters/nextjs.js +9 -5
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +9 -5
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/cli.js +60 -6
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +60 -6
- package/dist/cli.mjs.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/introspect.ts","../src/query-builder.ts","../src/middleware.ts","../src/router.ts","../src/zod-generator.ts","../src/validate.ts","../src/openapi.ts","../src/adapters/express.ts","../src/adapters/nextjs.ts","../src/adapters/fastify.ts","../src/adapters/koa.ts","../src/adapters/hapi.ts","../src/adapters/nestjs.ts"],"names":["id"],"mappings":"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","file":"index.mjs","sourcesContent":["import { Prisma } from \"@prisma/client\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Reads Prisma's DMMF (Data Model Meta Format) at runtime\r\n * and returns structured metadata for every model in your schema.\r\n *\r\n * No file reading. No code generation. Pure runtime introspection.\r\n */\r\nexport function getModels(prisma?: any): ModelMeta[] {\r\n let raw: any[] | undefined;\r\n\r\n // Try to get from PrismaClient instance first (new v5 format)\r\n if (prisma?._runtimeDataModel?.models) {\r\n const modelsObj = prisma._runtimeDataModel.models;\r\n // Convert object to array, adding name from key\r\n raw = Object.entries(modelsObj).map(([name, model]: [string, any]) => ({\r\n name,\r\n ...model,\r\n fields: (model.fields || []).map((f: any) => ({\r\n ...f,\r\n relationName: f.kind === \"object\" ? f.name : undefined,\r\n })),\r\n }));\r\n }\r\n\r\n // Fallback to DMMF from @prisma/client module\r\n if (!raw) {\r\n const dmmfModels =\r\n (Prisma as any)?.dmmf?.datamodel?.models ||\r\n (require(\"@prisma/client\")?.Prisma as any)?.dmmf?.datamodel?.models;\r\n\r\n if (dmmfModels) {\r\n raw = dmmfModels;\r\n }\r\n }\r\n\r\n if (!raw) {\r\n throw new Error(\r\n \"[omni-rest] Could not find Prisma DMMF. Ensure Prisma client is generated and you're passing a PrismaClient instance to omni-rest.\"\r\n );\r\n }\r\n\r\n if (!Array.isArray(raw)) {\r\n throw new Error(\r\n `[omni-rest] Expected models to be an array, got ${typeof raw}. Debug: prisma._runtimeDataModel.models=${!!prisma?._runtimeDataModel?.models}, raw value=${JSON.stringify(raw).slice(0, 100)}`\r\n );\r\n }\r\n\r\n return raw.map((model: any) => {\r\n const fields: FieldMeta[] = model.fields.map((f: any) => ({\r\n name: f.name,\r\n type: f.type,\r\n isId: f.isId,\r\n isRequired: f.isRequired,\r\n isList: f.isList,\r\n isRelation: !!f.relationName,\r\n }));\r\n\r\n const idField =\r\n model.fields.find((f: any) => f.isId)?.name ?? \"id\";\r\n\r\n return {\r\n name: model.name,\r\n routeName: toRouteName(model.name),\r\n fields,\r\n idField,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Converts a Prisma model name to a URL-safe route segment.\r\n * \"UserProfile\" → \"userprofile\"\r\n * \"OrderItem\" → \"orderitem\"\r\n */\r\nexport function toRouteName(modelName: string): string {\r\n return modelName.toLowerCase();\r\n}\r\n\r\n/**\r\n * Returns a map of routeName → ModelMeta for O(1) lookups.\r\n */\r\nexport function buildModelMap(\r\n models: ModelMeta[],\r\n allowList?: string[]\r\n): Record<string, ModelMeta> {\r\n const filtered = allowList\r\n ? models.filter((m) => allowList.includes(m.routeName))\r\n : models;\r\n\r\n return Object.fromEntries(filtered.map((m) => [m.routeName, m]));\r\n}\r\n\r\n/**\r\n * Gets the Prisma client delegate for a model.\r\n * prisma[\"userProfile\"] or prisma[\"user\"] — handles camelCase.\r\n */\r\nexport function getDelegate(prisma: any, meta: ModelMeta): any {\r\n // Prisma client properties are camelCase of model name\r\n // \"UserProfile\" → \"userProfile\"\r\n const key =\r\n meta.name.charAt(0).toLowerCase() + meta.name.slice(1);\r\n const delegate = prisma[key];\r\n\r\n if (!delegate) {\r\n throw new Error(\r\n `Could not find Prisma delegate for model \"${meta.name}\". ` +\r\n `Expected prisma.${key} to exist.`\r\n );\r\n }\r\n\r\n return delegate;\r\n}","import type { ParsedQuery } from \"./types\";\r\n\r\n/**\r\n * Supported filter suffixes and their Prisma equivalents.\r\n *\r\n * Usage in URL:\r\n * ?name_contains=john\r\n * ?age_gte=18\r\n * ?status_in=active,inactive\r\n * ?email_not=test@test.com\r\n */\r\nconst FILTER_OPERATORS: Record<string, string> = {\r\n _gte: \"gte\",\r\n _lte: \"lte\",\r\n _gt: \"gt\",\r\n _lt: \"lt\",\r\n _contains: \"contains\",\r\n _icontains: \"contains\", // case-insensitive version (mode: insensitive)\r\n _startsWith: \"startsWith\",\r\n _endsWith: \"endsWith\",\r\n _in: \"in\",\r\n _notIn: \"notIn\",\r\n _not: \"not\",\r\n};\r\n\r\n/**\r\n * Reserved query keys — these are NOT treated as filters.\r\n */\r\nconst RESERVED_KEYS = new Set([\r\n \"page\",\r\n \"limit\",\r\n \"sort\",\r\n \"include\",\r\n \"select\",\r\n]);\r\n\r\n/**\r\n * Parses URLSearchParams into a full Prisma query object.\r\n *\r\n * Supports:\r\n * Filtering → ?name=John ?age_gte=18 ?status_in=a,b\r\n * Sorting → ?sort=createdAt:desc or ?sort=name:asc\r\n * Pagination → ?page=2&limit=10\r\n * Relations → ?include=posts,profile\r\n * Fields → ?select=id,name,email\r\n */\r\nexport function buildQuery(\r\n searchParams: URLSearchParams,\r\n defaultLimit = 20,\r\n maxLimit = 100\r\n): ParsedQuery {\r\n const where: Record<string, any> = {};\r\n const orderBy: Record<string, \"asc\" | \"desc\"> = {};\r\n let include: Record<string, boolean> = {};\r\n let select: Record<string, boolean> | null = null;\r\n\r\n // ─── Pagination ────────────────────────────────────────────────────────────\r\n const page = Math.max(1, parseInt(searchParams.get(\"page\") ?? \"1\"));\r\n const rawLimit = parseInt(searchParams.get(\"limit\") ?? String(defaultLimit));\r\n const take = Math.min(rawLimit, maxLimit);\r\n const skip = (page - 1) * take;\r\n\r\n // ─── Sort ──────────────────────────────────────────────────────────────────\r\n const sortParam = searchParams.get(\"sort\");\r\n if (sortParam) {\r\n // Supports multiple sorts: ?sort=name:asc,createdAt:desc\r\n for (const part of sortParam.split(\",\")) {\r\n const [field, dir] = part.trim().split(\":\");\r\n if (field) {\r\n orderBy[field] = (dir === \"desc\" ? \"desc\" : \"asc\");\r\n }\r\n }\r\n }\r\n\r\n // ─── Include (relations) ───────────────────────────────────────────────────\r\n const includeParam = searchParams.get(\"include\");\r\n if (includeParam) {\r\n for (const rel of includeParam.split(\",\")) {\r\n if (rel.trim()) include[rel.trim()] = true;\r\n }\r\n }\r\n\r\n // ─── Select (fields) ──────────────────────────────────────────────────────\r\n const selectParam = searchParams.get(\"select\");\r\n if (selectParam) {\r\n select = {};\r\n for (const field of selectParam.split(\",\")) {\r\n if (field.trim()) select[field.trim()] = true;\r\n }\r\n }\r\n\r\n // ─── Filters ───────────────────────────────────────────────────────────────\r\n for (const [key, value] of searchParams.entries()) {\r\n if (RESERVED_KEYS.has(key)) continue;\r\n\r\n // Check operator suffixes (longest match first)\r\n let matched = false;\r\n const sortedOps = Object.keys(FILTER_OPERATORS).sort(\r\n (a, b) => b.length - a.length\r\n );\r\n\r\n for (const suffix of sortedOps) {\r\n if (key.endsWith(suffix)) {\r\n const field = key.slice(0, -suffix.length);\r\n const prismaOp = FILTER_OPERATORS[suffix];\r\n\r\n let parsedValue: any = value;\r\n\r\n // Parse arrays\r\n if (prismaOp === \"in\" || prismaOp === \"notIn\") {\r\n parsedValue = value.split(\",\").map((v) => v.trim());\r\n }\r\n\r\n // Attempt numeric coercion\r\n if (!isNaN(Number(parsedValue)) && typeof parsedValue === \"string\") {\r\n parsedValue = Number(parsedValue);\r\n }\r\n\r\n // Case-insensitive flag\r\n const extra = suffix === \"_icontains\" ? { mode: \"insensitive\" } : {};\r\n\r\n where[field] = { [prismaOp]: parsedValue, ...extra };\r\n matched = true;\r\n break;\r\n }\r\n }\r\n\r\n // No operator — exact match\r\n if (!matched) {\r\n let parsedValue: any = value;\r\n\r\n // Coerce booleans\r\n if (value === \"true\") parsedValue = true;\r\n else if (value === \"false\") parsedValue = false;\r\n // Coerce numbers\r\n else if (!isNaN(Number(value)) && value !== \"\") {\r\n parsedValue = Number(value);\r\n }\r\n\r\n where[key] = parsedValue;\r\n }\r\n }\r\n\r\n return { where, orderBy, skip, take, include, select };\r\n}","import type { GuardMap, HookFn, HookContext } from \"./types\";\r\n\r\n/**\r\n * Runs the guard for the given model+method combo.\r\n * Returns an error string if blocked, null if allowed.\r\n */\r\nexport async function runGuard(\r\n guards: GuardMap,\r\n model: string,\r\n method: string,\r\n ctx: { id?: string | null; body?: any }\r\n): Promise<string | null> {\r\n const modelGuards = guards[model];\r\n if (!modelGuards) return null;\r\n\r\n const fn = modelGuards[method as keyof typeof modelGuards];\r\n if (!fn) return null;\r\n\r\n return fn({ ...ctx, method });\r\n}\r\n\r\n/**\r\n * Runs a lifecycle hook (beforeOperation / afterOperation).\r\n * Silently swallows errors so hooks never crash the main flow.\r\n */\r\nexport async function runHook(\r\n hook: HookFn | undefined,\r\n ctx: HookContext\r\n): Promise<void> {\r\n if (!hook) return;\r\n try {\r\n await hook(ctx);\r\n } catch (e) {\r\n // Hooks should not crash the request\r\n console.error(\"[omni-rest] Hook error:\", e);\r\n }\r\n}","import { PrismaClient } from \"@prisma/client\";\r\nimport { getModels, buildModelMap, getDelegate } from \"./introspect\";\r\nimport { buildQuery } from \"./query-builder\";\r\nimport { runGuard, runHook } from \"./middleware\";\r\nimport type {\r\n PrismaRestOptions,\r\n HandlerResult,\r\n RouterInstance,\r\n ModelMeta,\r\n} from \"./types\";\r\n\r\n/**\r\n * Creates a framework-agnostic CRUD router powered by Prisma DMMF.\r\n *\r\n * All adapters (Express, Next.js, Fastify) use this under the hood.\r\n */\r\nexport function createRouter(\r\n prisma: PrismaClient,\r\n options: PrismaRestOptions = {}\r\n): RouterInstance {\r\n const {\r\n allow,\r\n guards = {},\r\n beforeOperation,\r\n afterOperation,\r\n defaultLimit = 20,\r\n maxLimit = 100,\r\n } = options;\r\n\r\n // Introspect schema once at startup\r\n const models = getModels(prisma);\r\n const modelMap = buildModelMap(models, allow);\r\n\r\n async function handle(\r\n method: string,\r\n modelName: string,\r\n id: string | null,\r\n body: any,\r\n searchParams: URLSearchParams,\r\n operation?: string\r\n ): Promise<HandlerResult> {\r\n // ── 1. Resolve model ───────────────────────────────────────────────────\r\n const meta = modelMap[modelName.toLowerCase()];\r\n if (!meta) {\r\n return {\r\n status: 404,\r\n data: {\r\n error: `Model \"${modelName}\" not found or not exposed.`,\r\n available: Object.keys(modelMap),\r\n },\r\n };\r\n }\r\n\r\n // ── 2. Guard check ─────────────────────────────────────────────────────\r\n const guardError = await runGuard(guards, meta.routeName, method, {\r\n id,\r\n body,\r\n });\r\n if (guardError) {\r\n return { status: 403, data: { error: guardError } };\r\n }\r\n\r\n // ── 3. Before hook ─────────────────────────────────────────────────────\r\n await runHook(beforeOperation, { model: meta.name, method, id, body });\r\n\r\n // ── 4. Execute operation ───────────────────────────────────────────────\r\n let result: HandlerResult;\r\n\r\n try {\r\n result = await executeOperation(\r\n prisma,\r\n meta,\r\n method,\r\n id,\r\n body,\r\n searchParams,\r\n defaultLimit,\r\n maxLimit,\r\n operation\r\n );\r\n } catch (e: any) {\r\n return handlePrismaError(e);\r\n }\r\n\r\n // ── 5. After hook ──────────────────────────────────────────────────────\r\n await runHook(afterOperation, {\r\n model: meta.name,\r\n method,\r\n id,\r\n body,\r\n result: result.data,\r\n });\r\n\r\n return result;\r\n }\r\n\r\n return { handle, modelMap, models };\r\n}\r\n\r\n// ─── Operation executor ────────────────────────────────────────────────────────\r\n\r\nasync function executeOperation(\r\n prisma: PrismaClient,\r\n meta: ModelMeta,\r\n method: string,\r\n id: string | null,\r\n body: any,\r\n searchParams: URLSearchParams,\r\n defaultLimit: number,\r\n maxLimit: number,\r\n operation?: string\r\n): Promise<HandlerResult> {\r\n const delegate = getDelegate(prisma, meta);\r\n const { where, orderBy, skip, take, include, select } = buildQuery(\r\n searchParams,\r\n defaultLimit,\r\n maxLimit\r\n );\r\n\r\n // Build include/select args (mutually exclusive in Prisma)\r\n const includeArg =\r\n Object.keys(include).length > 0 ? include : undefined;\r\n const selectArg =\r\n select && Object.keys(select).length > 0 ? select : undefined;\r\n const projection = selectArg ? { select: selectArg } : includeArg ? { include: includeArg } : {};\r\n\r\n // ── PATCH /model/bulk/update ────────────────────────────────────────────────\r\n if (method === \"PATCH\" && operation === \"bulk-update\") {\r\n if (!Array.isArray(body) || body.length === 0) {\r\n return {\r\n status: 400,\r\n data: { error: \"Request body must be a non-empty array of update records\" },\r\n };\r\n }\r\n\r\n // Validate that each item has an id\r\n for (const item of body) {\r\n if (!item[meta.idField]) {\r\n return {\r\n status: 400,\r\n data: { error: `Each record must have an ${meta.idField} field` },\r\n };\r\n }\r\n }\r\n\r\n // Execute updates in parallel\r\n const results = await Promise.all(\r\n body.map((item) => {\r\n const id = item[meta.idField];\r\n const updateData = { ...item };\r\n delete updateData[meta.idField]; // Remove id from update data\r\n\r\n return delegate.update({\r\n where: { [meta.idField]: coerceId(id) },\r\n data: updateData,\r\n ...projection,\r\n });\r\n })\r\n );\r\n\r\n return {\r\n status: 200,\r\n data: {\r\n updated: results.length,\r\n records: results,\r\n },\r\n };\r\n }\r\n\r\n // ── DELETE /model/bulk/delete ──────────────────────────────────────────────\r\n if (method === \"DELETE\" && operation === \"bulk-delete\") {\r\n if (!Array.isArray(body) || body.length === 0) {\r\n return {\r\n status: 400,\r\n data: { error: \"Request body must be a non-empty array of IDs\" },\r\n };\r\n }\r\n\r\n // Handle both array of IDs and array of objects with id field\r\n const ids = body.map((item: any) =>\r\n typeof item === \"object\" ? item[meta.idField] : item\r\n );\r\n\r\n // Use deleteMany with a where clause\r\n const result = await delegate.deleteMany({\r\n where: {\r\n [meta.idField]: { in: ids.map(coerceId) },\r\n },\r\n });\r\n\r\n return {\r\n status: 200,\r\n data: {\r\n deleted: result.count,\r\n },\r\n };\r\n }\r\n\r\n // ── GET /model ─────────────────────────────────────────────────────────────\r\n if (method === \"GET\" && !id) {\r\n const [data, total] = await (prisma as any).$transaction([\r\n delegate.findMany({ where, orderBy, skip, take, ...projection }),\r\n delegate.count({ where }),\r\n ]);\r\n\r\n return {\r\n status: 200,\r\n data: {\r\n data,\r\n meta: {\r\n total,\r\n page: Math.floor(skip / take) + 1,\r\n limit: take,\r\n totalPages: Math.ceil(total / take),\r\n },\r\n },\r\n };\r\n }\r\n\r\n // ── GET /model/:id ─────────────────────────────────────────────────────────\r\n if (method === \"GET\" && id) {\r\n const record = await delegate.findUnique({\r\n where: { [meta.idField]: coerceId(id) },\r\n ...projection,\r\n });\r\n\r\n if (!record) {\r\n return { status: 404, data: { error: `${meta.name} with id \"${id}\" not found.` } };\r\n }\r\n\r\n return { status: 200, data: record };\r\n }\r\n\r\n // ── POST /model ────────────────────────────────────────────────────────────\r\n if (method === \"POST\" && !id) {\r\n const record = await delegate.create({ data: body });\r\n return { status: 201, data: record };\r\n }\r\n\r\n // ── PUT /model/:id ─────────────────────────────────────────────────────────\r\n if ((method === \"PUT\" || method === \"PATCH\") && id) {\r\n const record = await delegate.update({\r\n where: { [meta.idField]: coerceId(id) },\r\n data: body,\r\n });\r\n return { status: 200, data: record };\r\n }\r\n\r\n // ── DELETE /model/:id ──────────────────────────────────────────────────────\r\n if (method === \"DELETE\" && id) {\r\n await delegate.delete({\r\n where: { [meta.idField]: coerceId(id) },\r\n });\r\n return { status: 204, data: null };\r\n }\r\n\r\n return { status: 405, data: { error: `Method ${method} not allowed.` } };\r\n}\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Coerces an ID string to number when possible (common with Int PKs).\r\n */\r\nfunction coerceId(id: string): string | number {\r\n const n = Number(id);\r\n return isNaN(n) ? id : n;\r\n}\r\n\r\n/**\r\n * Maps Prisma error codes to meaningful HTTP responses.\r\n */\r\nfunction handlePrismaError(e: any): HandlerResult {\r\n const code = e?.code;\r\n\r\n if (code === \"P2025\") {\r\n return { status: 404, data: { error: \"Record not found.\" } };\r\n }\r\n if (code === \"P2002\") {\r\n const fields = e?.meta?.target ?? \"unknown fields\";\r\n return {\r\n status: 409,\r\n data: { error: `Unique constraint failed on: ${fields}` },\r\n };\r\n }\r\n if (code === \"P2003\") {\r\n return { status: 400, data: { error: \"Foreign key constraint failed.\" } };\r\n }\r\n if (code === \"P2014\") {\r\n return { status: 400, data: { error: \"Relation violation.\" } };\r\n }\r\n\r\n return { status: 500, data: { error: e?.message ?? \"Internal server error.\" } };\r\n}","import { getModels } from \"./introspect\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Maps Prisma scalar types → Zod method names\r\n */\r\nconst PRISMA_TO_ZOD: Record<string, string> = {\r\n String: \"z.string()\",\r\n Int: \"z.number().int()\",\r\n Float: \"z.number()\",\r\n Decimal: \"z.number()\",\r\n Boolean: \"z.boolean()\",\r\n DateTime: \"z.coerce.date()\",\r\n Json: \"z.any()\",\r\n BigInt: \"z.bigint()\",\r\n Bytes: \"z.any()\",\r\n};\r\n\r\n/**\r\n * Converts a single Prisma field to its Zod expression string.\r\n */\r\nfunction fieldToZod(field: FieldMeta): string {\r\n if (field.isRelation) return null as any; // skip relations\r\n\r\n let zod = PRISMA_TO_ZOD[field.type] ?? \"z.any()\";\r\n\r\n // Optional fields\r\n if (!field.isRequired) {\r\n zod = `${zod}.optional()`;\r\n }\r\n\r\n // List fields\r\n if (field.isList) {\r\n zod = `z.array(${zod})`;\r\n }\r\n\r\n return zod;\r\n}\r\n\r\n/**\r\n * Generates Zod schema source code for a single model.\r\n *\r\n * Produces two schemas:\r\n * - CreateSchema — all required fields must be present\r\n * - UpdateSchema — all fields are optional (for PATCH)\r\n */\r\nfunction generateModelSchema(meta: ModelMeta): string {\r\n const name = meta.name;\r\n\r\n const fields = meta.fields\r\n .filter((f) => !f.isRelation && !f.isId) // skip relations and id (auto)\r\n .map((f) => {\r\n const zodExpr = fieldToZod(f);\r\n if (!zodExpr) return null;\r\n return ` ${f.name}: ${zodExpr},`;\r\n })\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n\r\n return `\r\n// ─── ${name} ──────────────────────────────────────────────────────────────────\r\n\r\nexport const ${name}CreateSchema = z.object({\r\n${fields}\r\n});\r\n\r\nexport const ${name}UpdateSchema = ${name}CreateSchema.partial();\r\n\r\nexport type ${name}Create = z.infer<typeof ${name}CreateSchema>;\r\nexport type ${name}Update = z.infer<typeof ${name}UpdateSchema>;\r\n`.trim();\r\n}\r\n\r\n/**\r\n * Generates a complete Zod schema file for ALL models in your Prisma schema.\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateZodSchemas } from \"omni-rest\";\r\n * const code = generateZodSchemas();\r\n * fs.writeFileSync(\"src/schemas.ts\", code);\r\n * ```\r\n */\r\nexport function generateZodSchemas(prisma?: any): string {\r\n const models = getModels(prisma);\r\n\r\n const schemas = models.map(generateModelSchema).join(\"\\n\\n\");\r\n\r\n return `/**\r\n * Auto-generated Zod schemas from Prisma schema.\r\n * Generated by omni-rest — do not edit manually.\r\n * Re-run after schema changes.\r\n */\r\nimport { z } from \"zod\";\r\n\r\n${schemas}\r\n`;\r\n}\r\n\r\n/**\r\n * Returns Zod schema OBJECTS at runtime (not source code).\r\n * Useful for request validation in middleware.\r\n *\r\n * Requires \"zod\" to be installed in the host project.\r\n */\r\nexport function buildRuntimeSchemas(prisma?: any): Record<\r\n string,\r\n { create: any; update: any }\r\n> {\r\n let z: any;\r\n try {\r\n z = require(\"zod\").z;\r\n } catch {\r\n throw new Error(\r\n \"[omni-rest] zod is required for runtime validation. Run: npm install zod\"\r\n );\r\n }\r\n\r\n const ZOD_FACTORIES: Record<string, () => any> = {\r\n String: () => z.string(),\r\n Int: () => z.number().int(),\r\n Float: () => z.number(),\r\n Decimal: () => z.number(),\r\n Boolean: () => z.boolean(),\r\n DateTime: () => z.coerce.date(),\r\n Json: () => z.any(),\r\n BigInt: () => z.bigint(),\r\n Bytes: () => z.any(),\r\n };\r\n\r\n const models = getModels(prisma);\r\n const result: Record<string, { create: any; update: any }> = {};\r\n\r\n for (const meta of models) {\r\n const shape: Record<string, any> = {};\r\n\r\n for (const field of meta.fields) {\r\n if (field.isRelation || field.isId) continue;\r\n\r\n const factory = ZOD_FACTORIES[field.type] ?? (() => z.any());\r\n let schema = factory();\r\n\r\n if (!field.isRequired) schema = schema.optional();\r\n if (field.isList) schema = z.array(schema);\r\n\r\n shape[field.name] = schema;\r\n }\r\n\r\n const createSchema = z.object(shape);\r\n result[meta.routeName] = {\r\n create: createSchema,\r\n update: createSchema.partial(),\r\n };\r\n }\r\n\r\n return result;\r\n}","import { buildRuntimeSchemas } from \"./zod-generator\";\r\nimport type { PrismaRestOptions } from \"./types\";\r\n\r\nlet cachedSchemas: ReturnType<typeof buildRuntimeSchemas> | null = null;\r\n\r\nfunction getSchemas() {\r\n if (!cachedSchemas) {\r\n cachedSchemas = buildRuntimeSchemas();\r\n }\r\n return cachedSchemas;\r\n}\r\n\r\n/**\r\n * Validates a request body against the auto-generated Zod schema for a model.\r\n *\r\n * Returns null if valid, or an error message string if invalid.\r\n *\r\n * @param modelRouteName e.g. \"department\"\r\n * @param method HTTP method — POST uses createSchema, PUT/PATCH uses updateSchema\r\n * @param body Request body object\r\n */\r\nexport function validateBody(\r\n modelRouteName: string,\r\n method: string,\r\n body: any\r\n): string | null {\r\n let schemas: ReturnType<typeof buildRuntimeSchemas>;\r\n\r\n try {\r\n schemas = getSchemas();\r\n } catch {\r\n // zod not installed — skip validation silently\r\n return null;\r\n }\r\n\r\n const modelSchemas = schemas[modelRouteName];\r\n if (!modelSchemas) return null;\r\n\r\n const schema =\r\n method === \"POST\" ? modelSchemas.create : modelSchemas.update;\r\n\r\n const result = schema.safeParse(body);\r\n if (!result.success) {\r\n const issues = result.error.issues\r\n .map((i: any) => `${i.path.join(\".\")}: ${i.message}`)\r\n .join(\", \");\r\n return `Validation failed — ${issues}`;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Creates a guard function that validates the request body automatically.\r\n * Plug this into the guards option to get free validation.\r\n *\r\n * @example\r\n * ```ts\r\n * import { withValidation } from \"omni-rest\";\r\n *\r\n * expressAdapter(prisma, {\r\n * guards: withValidation(), // validates ALL models\r\n * });\r\n * ```\r\n */\r\nexport function withValidation(overrides: PrismaRestOptions[\"guards\"] = {}) {\r\n const handler = ({ id, body, method }: any) => {\r\n const modelName = (handler as any).__model;\r\n const error = validateBody(modelName, method, body);\r\n return error ?? null;\r\n };\r\n\r\n return new Proxy(overrides, {\r\n get(target, modelName: string) {\r\n if (modelName in target) return target[modelName];\r\n\r\n // Return a guard map for each model that validates on write\r\n return {\r\n POST: ({ body }: any) => validateBody(modelName, \"POST\", body),\r\n PUT: ({ body }: any) => validateBody(modelName, \"PUT\", body),\r\n PATCH: ({ body }: any) => validateBody(modelName, \"PATCH\", body),\r\n };\r\n },\r\n });\r\n}","import { getModels } from \"./introspect\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Maps Prisma scalar types → OpenAPI schema types\r\n */\r\nconst PRISMA_TO_OAS: Record<string, { type: string; format?: string }> = {\r\n String: { type: \"string\" },\r\n Int: { type: \"integer\", format: \"int32\" },\r\n Float: { type: \"number\", format: \"float\" },\r\n Decimal: { type: \"number\" },\r\n Boolean: { type: \"boolean\" },\r\n DateTime: { type: \"string\", format: \"date-time\" },\r\n Json: { type: \"object\" },\r\n BigInt: { type: \"integer\", format: \"int64\" },\r\n};\r\n\r\nfunction fieldToOasSchema(field: FieldMeta): any {\r\n if (field.isRelation) return null;\r\n const base = PRISMA_TO_OAS[field.type] ?? { type: \"string\" };\r\n if (field.isList) return { type: \"array\", items: base };\r\n return base;\r\n}\r\n\r\nfunction buildModelSchema(meta: ModelMeta, forCreate = false): any {\r\n const properties: Record<string, any> = {};\r\n const required: string[] = [];\r\n\r\n for (const field of meta.fields) {\r\n if (field.isRelation) continue;\r\n if (forCreate && field.isId) continue; // id is auto on create\r\n\r\n const schema = fieldToOasSchema(field);\r\n if (!schema) continue;\r\n\r\n properties[field.name] = schema;\r\n\r\n if (field.isRequired && !field.isId && forCreate) {\r\n required.push(field.name);\r\n }\r\n }\r\n\r\n return {\r\n type: \"object\",\r\n properties,\r\n ...(required.length > 0 ? { required } : {}),\r\n };\r\n}\r\n\r\n/**\r\n * Generates a full OpenAPI 3.0 specification object for all exposed models.\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateOpenApiSpec } from \"omni-rest\";\r\n * const spec = generateOpenApiSpec(prisma, { title: \"My API\", version: \"1.0.0\", basePath: \"/api\" });\r\n * fs.writeFileSync(\"openapi.json\", JSON.stringify(spec, null, 2));\r\n * ```\r\n */\r\nexport function generateOpenApiSpec(\r\n prisma: any,\r\n options: {\r\n title?: string;\r\n version?: string;\r\n basePath?: string;\r\n allow?: string[];\r\n servers?: { url: string; description?: string }[];\r\n } = {}\r\n): object {\r\n const {\r\n title = \"omni-rest API\",\r\n version = \"1.0.0\",\r\n basePath = \"/api\",\r\n allow,\r\n servers = [{ url: \"http://localhost:3000\" }],\r\n } = options;\r\n\r\n const models = getModels(prisma).filter(\r\n (m) => !allow || allow.includes(m.routeName)\r\n );\r\n\r\n const paths: Record<string, any> = {};\r\n const schemas: Record<string, any> = {};\r\n\r\n for (const meta of models) {\r\n const name = meta.name;\r\n const route = meta.routeName;\r\n\r\n // ── Schemas ──────────────────────────────────────────────────────────────\r\n schemas[name] = buildModelSchema(meta, false);\r\n schemas[`${name}Create`] = buildModelSchema(meta, true);\r\n schemas[`${name}Update`] = {\r\n ...buildModelSchema(meta, true),\r\n required: [], // all optional for PATCH\r\n };\r\n\r\n // ── Collection path /api/:model ───────────────────────────────────────────\r\n paths[`${basePath}/${route}`] = {\r\n get: {\r\n summary: `List ${name}s`,\r\n tags: [name],\r\n parameters: buildListParameters(),\r\n responses: {\r\n 200: {\r\n description: `List of ${name}s`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n data: { type: \"array\", items: { $ref: `#/components/schemas/${name}` } },\r\n meta: { $ref: \"#/components/schemas/PaginationMeta\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n post: {\r\n summary: `Create ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Create` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 201: {\r\n description: `Created ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n 409: { $ref: \"#/components/responses/Conflict\" },\r\n },\r\n },\r\n };\r\n\r\n // ── Resource path /api/:model/:id ─────────────────────────────────────────\r\n paths[`${basePath}/${route}/{id}`] = {\r\n parameters: [\r\n {\r\n name: \"id\",\r\n in: \"path\",\r\n required: true,\r\n schema: { type: \"string\" },\r\n description: `${name} ID`,\r\n },\r\n ],\r\n get: {\r\n summary: `Get ${name} by ID`,\r\n tags: [name],\r\n responses: {\r\n 200: {\r\n description: `${name} record`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n put: {\r\n summary: `Update ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Create` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Updated ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n patch: {\r\n summary: `Partially update ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Update` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Updated ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n delete: {\r\n summary: `Delete ${name}`,\r\n tags: [name],\r\n responses: {\r\n 204: { description: \"Deleted successfully\" },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n };\r\n\r\n // ── Bulk operations paths ──────────────────────────────────────────────────\r\n paths[`${basePath}/${route}/bulk/update`] = {\r\n patch: {\r\n summary: `Bulk update ${name}s`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n description: `Array of ${name} objects with id field to update`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"array\",\r\n items: { $ref: `#/components/schemas/${name}Update` },\r\n },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Bulk update result`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n updated: { type: \"integer\" },\r\n records: {\r\n type: \"array\",\r\n items: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n },\r\n },\r\n };\r\n\r\n paths[`${basePath}/${route}/bulk/delete`] = {\r\n delete: {\r\n summary: `Bulk delete ${name}s`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n description: `Array of IDs to delete`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Bulk delete result`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n deleted: { type: \"integer\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n },\r\n },\r\n };\r\n }\r\n\r\n return {\r\n openapi: \"3.0.3\",\r\n info: { title, version },\r\n servers,\r\n paths,\r\n components: {\r\n schemas: {\r\n ...schemas,\r\n PaginationMeta: {\r\n type: \"object\",\r\n properties: {\r\n total: { type: \"integer\" },\r\n page: { type: \"integer\" },\r\n limit: { type: \"integer\" },\r\n totalPages: { type: \"integer\" },\r\n },\r\n },\r\n Error: {\r\n type: \"object\",\r\n properties: { error: { type: \"string\" } },\r\n },\r\n },\r\n responses: {\r\n NotFound: {\r\n description: \"Record not found\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n BadRequest: {\r\n description: \"Bad request\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n Conflict: {\r\n description: \"Unique constraint violation\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n tags: models.map((m) => ({ name: m.name })),\r\n };\r\n}\r\n\r\nfunction buildListParameters() {\r\n return [\r\n { name: \"page\", in: \"query\", schema: { type: \"integer\", default: 1 }, description: \"Page number\" },\r\n { name: \"limit\", in: \"query\", schema: { type: \"integer\", default: 20 }, description: \"Items per page\" },\r\n { name: \"sort\", in: \"query\", schema: { type: \"string\" }, description: \"e.g. createdAt:desc\" },\r\n { name: \"include\", in: \"query\", schema: { type: \"string\" }, description: \"Comma-separated relations\" },\r\n { name: \"select\", in: \"query\", schema: { type: \"string\" }, description: \"Comma-separated fields\" },\r\n ];\r\n}","import { PrismaClient } from \"@prisma/client\";\r\nimport { createRouter } from \"../router\";\r\nimport type { PrismaRestOptions } from \"../types\";\r\n\r\n/**\r\n * Express adapter for omni-rest.\r\n *\r\n * @example\r\n * ```ts\r\n * import express from \"express\";\r\n * import { PrismaClient } from \"@prisma/client\";\r\n * import { expressAdapter } from \"omni-rest/express\";\r\n *\r\n * const app = express();\r\n * const prisma = new PrismaClient();\r\n *\r\n * app.use(express.json());\r\n * app.use(\"/api\", expressAdapter(prisma, {\r\n * allow: [\"department\", \"category\", \"city\"],\r\n * }));\r\n *\r\n * // Auto-generates:\r\n * // GET /api/department\r\n * // POST /api/department\r\n * // GET /api/department/:id\r\n * // PUT /api/department/:id\r\n * // PATCH /api/department/:id\r\n * // DELETE /api/department/:id\r\n * // PATCH /api/department/bulk/update\r\n * // DELETE /api/department/bulk/delete\r\n * ```\r\n */\r\nexport function expressAdapter(\r\n prisma: PrismaClient,\r\n options: PrismaRestOptions = {}\r\n) {\r\n // Lazy require so express stays optional peer dep\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const { Router } = require(\"express\");\r\n const router = Router();\r\n const { handle } = createRouter(prisma, options);\r\n\r\n // PATCH + DELETE /model/bulk/update and /model/bulk/delete\r\n router.patch(\"/:model/bulk/update\", async (req: any, res: any) => {\r\n try {\r\n const { status, data } = await handle(\r\n \"PATCH\",\r\n req.params.model,\r\n null,\r\n req.body ?? [],\r\n new URLSearchParams(\r\n Object.entries(req.query as Record<string, string>)\r\n .map(([k, v]) => `${k}=${v}`)\r\n .join(\"&\")\r\n ),\r\n \"bulk-update\"\r\n );\r\n if (status === 204) {\r\n return res.sendStatus(204);\r\n }\r\n return res.status(status).json(data);\r\n } catch (e: any) {\r\n return res.status(500).json({ error: e.message });\r\n }\r\n });\r\n\r\n router.delete(\"/:model/bulk/delete\", async (req: any, res: any) => {\r\n try {\r\n const { status, data } = await handle(\r\n \"DELETE\",\r\n req.params.model,\r\n null,\r\n req.body ?? [],\r\n new URLSearchParams(\r\n Object.entries(req.query as Record<string, string>)\r\n .map(([k, v]) => `${k}=${v}`)\r\n .join(\"&\")\r\n ),\r\n \"bulk-delete\"\r\n );\r\n if (status === 204) {\r\n return res.sendStatus(204);\r\n }\r\n return res.status(status).json(data);\r\n } catch (e: any) {\r\n return res.status(500).json({ error: e.message });\r\n }\r\n });\r\n\r\n // GET + POST /model\r\n router.route(\"/:model\").get(handler).post(handler);\r\n\r\n // GET + PUT + PATCH + DELETE /model/:id\r\n router\r\n .route(\"/:model/:id\")\r\n .get(handler)\r\n .put(handler)\r\n .patch(handler)\r\n .delete(handler);\r\n\r\n async function handler(req: any, res: any) {\r\n try {\r\n const { status, data } = await handle(\r\n req.method,\r\n req.params.model,\r\n req.params.id ?? null,\r\n req.body ?? {},\r\n new URLSearchParams(\r\n Object.entries(req.query as Record<string, string>)\r\n .map(([k, v]) => `${k}=${v}`)\r\n .join(\"&\")\r\n )\r\n );\r\n\r\n if (status === 204) {\r\n return res.sendStatus(204);\r\n }\r\n\r\n return res.status(status).json(data);\r\n } catch (e: any) {\r\n return res.status(500).json({ error: e.message });\r\n }\r\n }\r\n\r\n return router;\r\n}","import { PrismaClient } from \"@prisma/client\";\r\nimport { createRouter } from \"../router\";\r\nimport type { PrismaRestOptions } from \"../types\";\r\n\r\n/**\r\n * Next.js App Router adapter for omni-rest.\r\n *\r\n * @example\r\n * ```ts\r\n * // app/api/[...prismaRest]/route.ts\r\n * import { PrismaClient } from \"@prisma/client\";\r\n * import { nextjsAdapter } from \"omni-rest/nextjs\";\r\n *\r\n * const prisma = new PrismaClient();\r\n * const handler = nextjsAdapter(prisma, {\r\n * allow: [\"department\", \"category\"],\r\n * });\r\n *\r\n * export const GET = handler;\r\n * export const POST = handler;\r\n * export const PUT = handler;\r\n * export const PATCH = handler;\r\n * export const DELETE = handler;\r\n * ```\r\n *\r\n * This covers:\r\n * GET /api/department\r\n * POST /api/department\r\n * GET /api/department/5\r\n * PUT /api/department/5\r\n * PATCH /api/department/5\r\n * DELETE /api/department/5\r\n * PATCH /api/department/bulk/update\r\n * DELETE /api/department/bulk/delete\r\n */\r\nexport function nextjsAdapter(\r\n prisma: PrismaClient,\r\n options: PrismaRestOptions = {}\r\n) {\r\n const { handle } = createRouter(prisma, options);\r\n\r\n return async function handler(\r\n req: Request,\r\n context: { params: { prismaRest: string[] } }\r\n ): Promise<Response> {\r\n const segments = context.params.prismaRest ?? [];\r\n const [modelName, ...pathSegments] = segments;\r\n\r\n if (!modelName) {\r\n return Response.json(\r\n { error: \"No model specified in path.\" },\r\n { status: 400 }\r\n );\r\n }\r\n\r\n const url = new URL(req.url);\r\n\r\n let body: any = {};\r\n if (req.method !== \"GET\" && req.method !== \"DELETE\") {\r\n try {\r\n body = await req.json();\r\n } catch {\r\n body = {};\r\n }\r\n }\r\n\r\n // Detect bulk operations\r\n let operation: string | undefined;\r\n let id: string | null = null;\r\n\r\n if (pathSegments[0] === \"bulk\" && pathSegments[1] === \"update\") {\r\n operation = \"bulk-update\";\r\n } else if (pathSegments[0] === \"bulk\" && pathSegments[1] === \"delete\") {\r\n operation = \"bulk-delete\";\r\n } else {\r\n id = pathSegments[0] ?? null;\r\n }\r\n\r\n const { status, data } = await handle(\r\n req.method,\r\n modelName,\r\n id,\r\n body,\r\n url.searchParams,\r\n operation\r\n );\r\n\r\n if (status === 204) {\r\n return new Response(null, { status: 204 });\r\n }\r\n\r\n return Response.json(data, { status });\r\n };\r\n}","import { PrismaClient } from \"@prisma/client\";\r\nimport { createRouter } from \"../router\";\r\nimport type { PrismaRestOptions } from \"../types\";\r\n\r\n/**\r\n * Fastify adapter for omni-rest.\r\n *\r\n * @example\r\n * ```ts\r\n * import Fastify from \"fastify\";\r\n * import { PrismaClient } from \"@prisma/client\";\r\n * import { fastifyAdapter } from \"omni-rest/fastify\";\r\n *\r\n * const app = Fastify();\r\n * const prisma = new PrismaClient();\r\n *\r\n * fastifyAdapter(app, prisma, {\r\n * prefix: \"/api\",\r\n * allow: [\"department\", \"category\"],\r\n * });\r\n *\r\n * app.listen({ port: 3000 });\r\n * ```\r\n */\r\nexport function fastifyAdapter(\r\n fastify: any,\r\n prisma: PrismaClient,\r\n options: PrismaRestOptions = {}\r\n) {\r\n const { handle } = createRouter(prisma, options);\r\n const prefix = options.prefix ?? \"/api\";\r\n\r\n async function routeHandler(request: any, reply: any) {\r\n const { model, id } = request.params;\r\n const body = request.body ?? {};\r\n const query = request.query ?? {};\r\n\r\n const searchParams = new URLSearchParams(\r\n Object.entries(query as Record<string, string>)\r\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\r\n .join(\"&\")\r\n );\r\n\r\n const { status, data } = await handle(\r\n request.method,\r\n model,\r\n id ?? null,\r\n body,\r\n searchParams\r\n );\r\n\r\n if (status === 204) {\r\n return reply.status(204).send();\r\n }\r\n\r\n return reply.status(status).send(data);\r\n }\r\n\r\n async function bulkHandler(request: any, reply: any, operation: string) {\r\n const { model } = request.params;\r\n const body = request.body ?? [];\r\n const query = request.query ?? {};\r\n\r\n const searchParams = new URLSearchParams(\r\n Object.entries(query as Record<string, string>)\r\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\r\n .join(\"&\")\r\n );\r\n\r\n const { status, data } = await handle(\r\n operation.includes(\"update\") ? \"PATCH\" : \"DELETE\",\r\n model,\r\n null,\r\n body,\r\n searchParams,\r\n operation\r\n );\r\n\r\n if (status === 204) {\r\n return reply.status(204).send();\r\n }\r\n\r\n return reply.status(status).send(data);\r\n }\r\n\r\n // Standard CRUD routes\r\n fastify.get(`${prefix}/:model`, routeHandler);\r\n fastify.post(`${prefix}/:model`, routeHandler);\r\n fastify.get(`${prefix}/:model/:id`, routeHandler);\r\n fastify.put(`${prefix}/:model/:id`, routeHandler);\r\n fastify.patch(`${prefix}/:model/:id`, routeHandler);\r\n fastify.delete(`${prefix}/:model/:id`, routeHandler);\r\n\r\n // Bulk operation routes (using closures to capture operation parameter)\r\n fastify.patch(`${prefix}/:model/bulk/update`, async (request: any, reply: any) => {\r\n await bulkHandler(request, reply, \"bulk-update\");\r\n });\r\n fastify.delete(`${prefix}/:model/bulk/delete`, async (request: any, reply: any) => {\r\n await bulkHandler(request, reply, \"bulk-delete\");\r\n });\r\n}","import { PrismaClient } from \"@prisma/client\";\nimport { createRouter } from \"../router\";\nimport type { PrismaRestOptions } from \"../types\";\n\n/**\n * Koa adapter for omni-rest.\n * Allows using omni-rest within a Koa application using @koa/router.\n *\n * @example\n * ```ts\n * import Koa from \"koa\";\n * import bodyParser from \"koa-bodyparser\";\n * import Router from \"@koa/router\";\n * import { PrismaClient } from \"@prisma/client\";\n * import { koaAdapter } from \"omni-rest/koa\";\n *\n * const app = new Koa();\n * const router = new Router({ prefix: \"/api\" });\n * const prisma = new PrismaClient();\n *\n * app.use(bodyParser());\n * koaAdapter(router, prisma, {\n * allow: [\"product\", \"category\"],\n * });\n *\n * app.use(router.routes());\n * ```\n */\nexport function koaAdapter(\n router: any,\n prisma: PrismaClient,\n options: PrismaRestOptions = {}\n) {\n const { handle } = createRouter(prisma, options);\n\n // Helper to extract query as URLSearchParams\n const getSearchParams = (ctx: any): URLSearchParams => {\n return new URLSearchParams(\n Object.entries(ctx.query as Record<string, string>)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\")\n );\n };\n\n // Internal Koa handler\n const koaHandler = async (ctx: any) => {\n try {\n const { status, data } = await handle(\n ctx.method,\n ctx.params.model,\n ctx.params.id ?? null,\n (ctx.request as any).body ?? {},\n getSearchParams(ctx)\n );\n\n ctx.status = status;\n if (status !== 204) {\n ctx.body = data;\n }\n } catch (e: any) {\n ctx.status = 500;\n ctx.body = { error: e.message };\n }\n };\n\n // Bulk Operations\n router.patch(\"/:model/bulk/update\", async (ctx: any) => {\n try {\n const { status, data } = await handle(\n \"PATCH\",\n ctx.params.model,\n null,\n (ctx.request as any).body ?? [],\n getSearchParams(ctx),\n \"bulk-update\"\n );\n\n ctx.status = status;\n if (status !== 204) {\n ctx.body = data;\n }\n } catch (e: any) {\n ctx.status = 500;\n ctx.body = { error: e.message };\n }\n });\n\n router.delete(\"/:model/bulk/delete\", async (ctx: any) => {\n try {\n const { status, data } = await handle(\n \"DELETE\",\n ctx.params.model,\n null,\n (ctx.request as any).body ?? [],\n getSearchParams(ctx),\n \"bulk-delete\"\n );\n\n ctx.status = status;\n if (status !== 204) {\n ctx.body = data;\n }\n } catch (e: any) {\n ctx.status = 500;\n ctx.body = { error: e.message };\n }\n });\n\n // GET + POST /model\n router.get(\"/:model\", koaHandler);\n router.post(\"/:model\", koaHandler);\n\n // GET + PUT + PATCH + DELETE /model/:id\n router.get(\"/:model/:id\", koaHandler);\n router.put(\"/:model/:id\", koaHandler);\n router.patch(\"/:model/:id\", koaHandler);\n router.delete(\"/:model/:id\", koaHandler);\n\n return router;\n}\n","import { PrismaClient } from \"@prisma/client\";\nimport { createRouter } from \"../router\";\nimport type { PrismaRestOptions } from \"../types\";\n\nexport interface HapiAdapterOptions extends PrismaRestOptions {\n prisma: PrismaClient;\n prefix?: string;\n}\n\n/**\n * Hapi plugin adapter for omni-rest.\n * Registers dynamic REST endpoints directly on the Hapi server instance.\n *\n * @example\n * ```ts\n * import Hapi from \"@hapi/hapi\";\n * import { PrismaClient } from \"@prisma/client\";\n * import { hapiAdapter } from \"omni-rest/hapi\";\n *\n * const prisma = new PrismaClient();\n * const server = Hapi.server({ port: 3000 });\n *\n * await server.register({\n * plugin: hapiAdapter,\n * options: {\n * prisma,\n * prefix: \"/api\",\n * allow: [\"product\", \"category\"],\n * }\n * });\n * ```\n */\nexport const hapiAdapter = {\n name: \"omni-rest\",\n version: \"1.0.0\",\n register: async (server: any, options: HapiAdapterOptions) => {\n if (!options.prisma) {\n throw new Error(\"[omni-rest/hapi] You must provide the prisma client inside options.prisma\");\n }\n\n const { prisma, prefix = \"\", ...restOptions } = options;\n const { handle } = createRouter(prisma, restOptions);\n\n const getSearchParams = (request: any): URLSearchParams => {\n const urlParams = new URLSearchParams();\n for (const [key, value] of Object.entries((request.query as Record<string, string>) || {})) {\n if (Array.isArray(value)) {\n value.forEach(v => urlParams.append(key, v));\n } else {\n urlParams.append(key, value);\n }\n }\n return urlParams;\n };\n\n const handler = async (request: any, h: any) => {\n try {\n const { status, data } = await handle(\n request.method.toUpperCase(),\n request.params.model,\n request.params.id ?? null,\n request.payload ?? {},\n getSearchParams(request)\n );\n\n if (status === 204) {\n return h.response().code(204);\n }\n return h.response(data).code(status);\n } catch (e: any) {\n return h.response({ error: e.message }).code(500);\n }\n };\n\n const bulkUpdateHandler = async (request: any, h: any) => {\n try {\n const { status, data } = await handle(\n \"PATCH\",\n request.params.model,\n null,\n request.payload ?? [],\n getSearchParams(request),\n \"bulk-update\"\n );\n if (status === 204) return h.response().code(204);\n return h.response(data).code(status);\n } catch (e: any) {\n return h.response({ error: e.message }).code(500);\n }\n };\n\n const bulkDeleteHandler = async (request: any, h: any) => {\n try {\n const { status, data } = await handle(\n \"DELETE\",\n request.params.model,\n null,\n request.payload ?? [],\n getSearchParams(request),\n \"bulk-delete\"\n );\n if (status === 204) return h.response().code(204);\n return h.response(data).code(status);\n } catch (e: any) {\n return h.response({ error: e.message }).code(500);\n }\n };\n\n // Bulk Operations\n server.route({\n method: \"PATCH\",\n path: `${prefix}/{model}/bulk/update`,\n handler: bulkUpdateHandler,\n });\n server.route({\n method: \"DELETE\",\n path: `${prefix}/{model}/bulk/delete`,\n handler: bulkDeleteHandler,\n });\n\n // Collection endpoints\n server.route({\n method: [\"GET\", \"POST\"],\n path: `${prefix}/{model}`,\n handler,\n });\n\n // Item endpoints\n server.route({\n method: [\"GET\", \"PUT\", \"PATCH\", \"DELETE\"],\n path: `${prefix}/{model}/{id}`,\n handler,\n });\n },\n};\n","// @ts-nocheck\nimport { PrismaClient } from \"@prisma/client\";\nimport { createRouter } from \"../router\";\nimport type { PrismaRestOptions } from \"../types\";\n\n/**\n * NestJS adapter for omni-rest.\n * Generates a dynamic controller block that maps wildcard routes directly into omni-rest handlers.\n *\n * @example\n * ```ts\n * import { Controller, Module, NestModule, MiddlewareConsumer } from '@nestjs/common';\n * import { PrismaClient } from '@prisma/client';\n * import { nestjsController } from 'omni-rest/nestjs';\n *\n * const prisma = new PrismaClient();\n *\n * // Create generating Controller natively via factory\n * export const OmniRestController = nestjsController(prisma, {\n * allow: [\"product\", \"category\"],\n * });\n *\n * @Module({\n * controllers: [OmniRestController],\n * })\n * export class AppModule {}\n * ```\n */\nexport function nestjsController(\n prisma: PrismaClient,\n options: PrismaRestOptions = {},\n prefix: string = \"api\"\n): any {\n // We lazily require NestJS specific decorators so they don't break applications that don't have `@nestjs/common`\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Controller, Get, Post, Put, Patch, Delete, Param, Body, Query, Req, Res, HttpStatus } = require(\"@nestjs/common\");\n const { handle } = createRouter(prisma, options);\n\n const getSearchParams = (query: Record<string, string>): URLSearchParams => {\n return new URLSearchParams(\n Object.entries(query || {})\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\")\n );\n };\n\n @Controller(prefix)\n class OmniRestDynamicController {\n \n @Patch(\":model/bulk/update\")\n async bulkUpdate(\n @Param(\"model\") model: string,\n @Body() body: any[],\n @Query() query: any,\n @Res() res: any\n ) {\n try {\n const { status, data } = await handle(\"PATCH\", model, null, body ?? [], getSearchParams(query), \"bulk-update\");\n if (status === 204) return res.status(HttpStatus.NO_CONTENT).send();\n return res.status(status).json(data);\n } catch (e: any) {\n return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ error: e.message });\n }\n }\n\n @Delete(\":model/bulk/delete\")\n async bulkDelete(\n @Param(\"model\") model: string,\n @Body() body: any[],\n @Query() query: any,\n @Res() res: any\n ) {\n try {\n const { status, data } = await handle(\"DELETE\", model, null, body ?? [], getSearchParams(query), \"bulk-delete\");\n if (status === 204) return res.status(HttpStatus.NO_CONTENT).send();\n return res.status(status).json(data);\n } catch (e: any) {\n return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ error: e.message });\n }\n }\n\n @Get(\":model\")\n async list(\n @Param(\"model\") model: string,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"GET\", model, null, {}, query, res);\n }\n\n @Post(\":model\")\n async create(\n @Param(\"model\") model: string,\n @Body() body: any,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"POST\", model, null, body, query, res);\n }\n\n @Get(\":model/:id\")\n async read(\n @Param(\"model\") model: string,\n @Param(\"id\") id: string,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"GET\", model, id, {}, query, res);\n }\n\n @Put(\":model/:id\")\n async replace(\n @Param(\"model\") model: string,\n @Param(\"id\") id: string,\n @Body() body: any,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"PUT\", model, id, body, query, res);\n }\n\n @Patch(\":model/:id\")\n async update(\n @Param(\"model\") model: string,\n @Param(\"id\") id: string,\n @Body() body: any,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"PATCH\", model, id, body, query, res);\n }\n\n @Delete(\":model/:id\")\n async remove(\n @Param(\"model\") model: string,\n @Param(\"id\") id: string,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"DELETE\", model, id, {}, query, res);\n }\n\n private async _processRequest(\n method: string, \n model: string, \n id: string | null, \n body: any, \n query: any, \n res: any\n ) {\n try {\n const { status, data } = await handle(method, model, id, body ?? {}, getSearchParams(query));\n if (status === 204) {\n return res.status(HttpStatus.NO_CONTENT).send();\n }\n return res.status(status).json(data);\n } catch (e: any) {\n return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ error: e.message });\n }\n }\n }\n\n return OmniRestDynamicController;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/introspect.ts","../src/query-builder.ts","../src/middleware.ts","../src/router.ts","../src/zod-generator.ts","../src/validate.ts","../src/openapi.ts","../src/adapters/express.ts","../src/adapters/nextjs.ts","../src/adapters/fastify.ts","../src/adapters/koa.ts","../src/adapters/hapi.ts","../src/adapters/nestjs.ts"],"names":["id"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Reads Prisma's DMMF (Data Model Meta Format) at runtime\r\n * and returns structured metadata for every model in your schema.\r\n *\r\n * No file reading. No code generation. Pure runtime introspection.\r\n */\r\nexport function getModels(prisma?: any): ModelMeta[] {\r\n let raw: any[] | undefined;\r\n\r\n // Try to get from PrismaClient instance first (new v5 format)\r\n if (prisma?._runtimeDataModel?.models) {\r\n const modelsObj = prisma._runtimeDataModel.models;\r\n // Convert object to array, adding name from key\r\n raw = Object.entries(modelsObj).map(([name, model]: [string, any]) => ({\r\n name,\r\n ...model,\r\n fields: (model.fields || []).map((f: any) => ({\r\n ...f,\r\n relationName: f.kind === \"object\" ? f.name : undefined,\r\n })),\r\n }));\r\n }\r\n\r\n // Fallback to DMMF from @prisma/client module — use plain require so\r\n // vi.mock(\"@prisma/client\") can intercept it in tests. The CLI handles\r\n // the global-install path resolution separately before calling getModels.\r\n if (!raw) {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const prismaModule = require(\"@prisma/client\");\r\n const dmmfModels = prismaModule?.Prisma?.dmmf?.datamodel?.models;\r\n if (dmmfModels) {\r\n raw = dmmfModels;\r\n }\r\n } catch {\r\n // @prisma/client not available or not generated — handled below\r\n }\r\n }\r\n\r\n if (!raw) {\r\n throw new Error(\r\n \"[omni-rest] Could not find Prisma DMMF. Ensure Prisma client is generated and you're passing a PrismaClient instance to omni-rest.\"\r\n );\r\n }\r\n\r\n if (!Array.isArray(raw)) {\r\n throw new Error(\r\n `[omni-rest] Expected models to be an array, got ${typeof raw}. Debug: prisma._runtimeDataModel.models=${!!prisma?._runtimeDataModel?.models}, raw value=${JSON.stringify(raw).slice(0, 100)}`\r\n );\r\n }\r\n\r\n return raw.map((model: any) => {\r\n const fields: FieldMeta[] = model.fields.map((f: any) => ({\r\n name: f.name,\r\n type: f.type,\r\n isId: f.isId,\r\n isRequired: f.isRequired,\r\n isList: f.isList,\r\n isRelation: !!f.relationName,\r\n }));\r\n\r\n const idField =\r\n model.fields.find((f: any) => f.isId)?.name ?? \"id\";\r\n\r\n return {\r\n name: model.name,\r\n routeName: toRouteName(model.name),\r\n fields,\r\n idField,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Converts a Prisma model name to a URL-safe route segment.\r\n * \"UserProfile\" → \"userprofile\"\r\n * \"OrderItem\" → \"orderitem\"\r\n */\r\nexport function toRouteName(modelName: string): string {\r\n return modelName.toLowerCase();\r\n}\r\n\r\n/**\r\n * Returns a map of routeName → ModelMeta for O(1) lookups.\r\n */\r\nexport function buildModelMap(\r\n models: ModelMeta[],\r\n allowList?: string[]\r\n): Record<string, ModelMeta> {\r\n const filtered = allowList\r\n ? models.filter((m) => allowList.includes(m.routeName))\r\n : models;\r\n\r\n return Object.fromEntries(filtered.map((m) => [m.routeName, m]));\r\n}\r\n\r\n/**\r\n * Gets the Prisma client delegate for a model.\r\n * prisma[\"userProfile\"] or prisma[\"user\"] — handles camelCase.\r\n */\r\nexport function getDelegate(prisma: any, meta: ModelMeta): any {\r\n // Prisma client properties are camelCase of model name\r\n // \"UserProfile\" → \"userProfile\"\r\n const key =\r\n meta.name.charAt(0).toLowerCase() + meta.name.slice(1);\r\n const delegate = prisma[key];\r\n\r\n if (!delegate) {\r\n throw new Error(\r\n `Could not find Prisma delegate for model \"${meta.name}\". ` +\r\n `Expected prisma.${key} to exist.`\r\n );\r\n }\r\n\r\n return delegate;\r\n}","import type { ParsedQuery } from \"./types\";\r\n\r\n/**\r\n * Supported filter suffixes and their Prisma equivalents.\r\n *\r\n * Usage in URL:\r\n * ?name_contains=john\r\n * ?age_gte=18\r\n * ?status_in=active,inactive\r\n * ?email_not=test@test.com\r\n */\r\nconst FILTER_OPERATORS: Record<string, string> = {\r\n _gte: \"gte\",\r\n _lte: \"lte\",\r\n _gt: \"gt\",\r\n _lt: \"lt\",\r\n _contains: \"contains\",\r\n _icontains: \"contains\", // case-insensitive version (mode: insensitive)\r\n _startsWith: \"startsWith\",\r\n _endsWith: \"endsWith\",\r\n _in: \"in\",\r\n _notIn: \"notIn\",\r\n _not: \"not\",\r\n};\r\n\r\n/**\r\n * Reserved query keys — these are NOT treated as filters.\r\n */\r\nconst RESERVED_KEYS = new Set([\r\n \"page\",\r\n \"limit\",\r\n \"sort\",\r\n \"include\",\r\n \"select\",\r\n]);\r\n\r\n/**\r\n * Parses URLSearchParams into a full Prisma query object.\r\n *\r\n * Supports:\r\n * Filtering → ?name=John ?age_gte=18 ?status_in=a,b\r\n * Sorting → ?sort=createdAt:desc or ?sort=name:asc\r\n * Pagination → ?page=2&limit=10\r\n * Relations → ?include=posts,profile\r\n * Fields → ?select=id,name,email\r\n */\r\nexport function buildQuery(\r\n searchParams: URLSearchParams,\r\n defaultLimit = 20,\r\n maxLimit = 100\r\n): ParsedQuery {\r\n const where: Record<string, any> = {};\r\n const orderBy: Record<string, \"asc\" | \"desc\"> = {};\r\n let include: Record<string, boolean> = {};\r\n let select: Record<string, boolean> | null = null;\r\n\r\n // ─── Pagination ────────────────────────────────────────────────────────────\r\n const page = Math.max(1, parseInt(searchParams.get(\"page\") ?? \"1\"));\r\n const rawLimit = parseInt(searchParams.get(\"limit\") ?? String(defaultLimit));\r\n const take = Math.min(rawLimit, maxLimit);\r\n const skip = (page - 1) * take;\r\n\r\n // ─── Sort ──────────────────────────────────────────────────────────────────\r\n const sortParam = searchParams.get(\"sort\");\r\n if (sortParam) {\r\n // Supports multiple sorts: ?sort=name:asc,createdAt:desc\r\n for (const part of sortParam.split(\",\")) {\r\n const [field, dir] = part.trim().split(\":\");\r\n if (field) {\r\n orderBy[field] = (dir === \"desc\" ? \"desc\" : \"asc\");\r\n }\r\n }\r\n }\r\n\r\n // ─── Include (relations) ───────────────────────────────────────────────────\r\n const includeParam = searchParams.get(\"include\");\r\n if (includeParam) {\r\n for (const rel of includeParam.split(\",\")) {\r\n if (rel.trim()) include[rel.trim()] = true;\r\n }\r\n }\r\n\r\n // ─── Select (fields) ──────────────────────────────────────────────────────\r\n const selectParam = searchParams.get(\"select\");\r\n if (selectParam) {\r\n select = {};\r\n for (const field of selectParam.split(\",\")) {\r\n if (field.trim()) select[field.trim()] = true;\r\n }\r\n }\r\n\r\n // ─── Filters ───────────────────────────────────────────────────────────────\r\n for (const [key, value] of searchParams.entries()) {\r\n if (RESERVED_KEYS.has(key)) continue;\r\n\r\n // Check operator suffixes (longest match first)\r\n let matched = false;\r\n const sortedOps = Object.keys(FILTER_OPERATORS).sort(\r\n (a, b) => b.length - a.length\r\n );\r\n\r\n for (const suffix of sortedOps) {\r\n if (key.endsWith(suffix)) {\r\n const field = key.slice(0, -suffix.length);\r\n const prismaOp = FILTER_OPERATORS[suffix];\r\n\r\n let parsedValue: any = value;\r\n\r\n // Parse arrays\r\n if (prismaOp === \"in\" || prismaOp === \"notIn\") {\r\n parsedValue = value.split(\",\").map((v) => v.trim());\r\n }\r\n\r\n // Attempt numeric coercion\r\n if (!isNaN(Number(parsedValue)) && typeof parsedValue === \"string\") {\r\n parsedValue = Number(parsedValue);\r\n }\r\n\r\n // Case-insensitive flag\r\n const extra = suffix === \"_icontains\" ? { mode: \"insensitive\" } : {};\r\n\r\n where[field] = { [prismaOp]: parsedValue, ...extra };\r\n matched = true;\r\n break;\r\n }\r\n }\r\n\r\n // No operator — exact match\r\n if (!matched) {\r\n let parsedValue: any = value;\r\n\r\n // Coerce booleans\r\n if (value === \"true\") parsedValue = true;\r\n else if (value === \"false\") parsedValue = false;\r\n // Coerce numbers\r\n else if (!isNaN(Number(value)) && value !== \"\") {\r\n parsedValue = Number(value);\r\n }\r\n\r\n where[key] = parsedValue;\r\n }\r\n }\r\n\r\n return { where, orderBy, skip, take, include, select };\r\n}","import type { GuardMap, HookFn, HookContext } from \"./types\";\r\n\r\n/**\r\n * Runs the guard for the given model+method combo.\r\n * Returns an error string if blocked, null if allowed.\r\n */\r\nexport async function runGuard(\r\n guards: GuardMap,\r\n model: string,\r\n method: string,\r\n ctx: { id?: string | null; body?: any }\r\n): Promise<string | null> {\r\n const modelGuards = guards[model];\r\n if (!modelGuards) return null;\r\n\r\n const fn = modelGuards[method as keyof typeof modelGuards];\r\n if (!fn) return null;\r\n\r\n return fn({ ...ctx, method });\r\n}\r\n\r\n/**\r\n * Runs a lifecycle hook (beforeOperation / afterOperation).\r\n * Silently swallows errors so hooks never crash the main flow.\r\n */\r\nexport async function runHook(\r\n hook: HookFn | undefined,\r\n ctx: HookContext\r\n): Promise<void> {\r\n if (!hook) return;\r\n try {\r\n await hook(ctx);\r\n } catch (e) {\r\n // Hooks should not crash the request\r\n console.error(\"[omni-rest] Hook error:\", e);\r\n }\r\n}","import { PrismaClient } from \"@prisma/client\";\r\nimport { getModels, buildModelMap, getDelegate } from \"./introspect\";\r\nimport { buildQuery } from \"./query-builder\";\r\nimport { runGuard, runHook } from \"./middleware\";\r\nimport type {\r\n PrismaRestOptions,\r\n HandlerResult,\r\n RouterInstance,\r\n ModelMeta,\r\n} from \"./types\";\r\n\r\n/**\r\n * Creates a framework-agnostic CRUD router powered by Prisma DMMF.\r\n *\r\n * All adapters (Express, Next.js, Fastify) use this under the hood.\r\n */\r\nexport function createRouter(\r\n prisma: PrismaClient,\r\n options: PrismaRestOptions = {}\r\n): RouterInstance {\r\n const {\r\n allow,\r\n guards = {},\r\n beforeOperation,\r\n afterOperation,\r\n defaultLimit = 20,\r\n maxLimit = 100,\r\n } = options;\r\n\r\n // Introspect schema once at startup\r\n const models = getModels(prisma);\r\n const modelMap = buildModelMap(models, allow);\r\n\r\n async function handle(\r\n method: string,\r\n modelName: string,\r\n id: string | null,\r\n body: any,\r\n searchParams: URLSearchParams,\r\n operation?: string\r\n ): Promise<HandlerResult> {\r\n // ── 1. Resolve model ───────────────────────────────────────────────────\r\n const meta = modelMap[modelName.toLowerCase()];\r\n if (!meta) {\r\n return {\r\n status: 404,\r\n data: {\r\n error: `Model \"${modelName}\" not found or not exposed.`,\r\n available: Object.keys(modelMap),\r\n },\r\n };\r\n }\r\n\r\n // ── 2. Guard check ─────────────────────────────────────────────────────\r\n const guardError = await runGuard(guards, meta.routeName, method, {\r\n id,\r\n body,\r\n });\r\n if (guardError) {\r\n return { status: 403, data: { error: guardError } };\r\n }\r\n\r\n // ── 3. Before hook ─────────────────────────────────────────────────────\r\n await runHook(beforeOperation, { model: meta.name, method, id, body });\r\n\r\n // ── 4. Execute operation ───────────────────────────────────────────────\r\n let result: HandlerResult;\r\n\r\n try {\r\n result = await executeOperation(\r\n prisma,\r\n meta,\r\n method,\r\n id,\r\n body,\r\n searchParams,\r\n defaultLimit,\r\n maxLimit,\r\n operation\r\n );\r\n } catch (e: any) {\r\n return handlePrismaError(e);\r\n }\r\n\r\n // ── 5. After hook ──────────────────────────────────────────────────────\r\n await runHook(afterOperation, {\r\n model: meta.name,\r\n method,\r\n id,\r\n body,\r\n result: result.data,\r\n });\r\n\r\n return result;\r\n }\r\n\r\n return { handle, modelMap, models };\r\n}\r\n\r\n// ─── Operation executor ────────────────────────────────────────────────────────\r\n\r\nasync function executeOperation(\r\n prisma: PrismaClient,\r\n meta: ModelMeta,\r\n method: string,\r\n id: string | null,\r\n body: any,\r\n searchParams: URLSearchParams,\r\n defaultLimit: number,\r\n maxLimit: number,\r\n operation?: string\r\n): Promise<HandlerResult> {\r\n const delegate = getDelegate(prisma, meta);\r\n const { where, orderBy, skip, take, include, select } = buildQuery(\r\n searchParams,\r\n defaultLimit,\r\n maxLimit\r\n );\r\n\r\n // Build include/select args (mutually exclusive in Prisma)\r\n const includeArg =\r\n Object.keys(include).length > 0 ? include : undefined;\r\n const selectArg =\r\n select && Object.keys(select).length > 0 ? select : undefined;\r\n const projection = selectArg ? { select: selectArg } : includeArg ? { include: includeArg } : {};\r\n\r\n // ── PATCH /model/bulk/update ────────────────────────────────────────────────\r\n if (method === \"PATCH\" && operation === \"bulk-update\") {\r\n if (!Array.isArray(body) || body.length === 0) {\r\n return {\r\n status: 400,\r\n data: { error: \"Request body must be a non-empty array of update records\" },\r\n };\r\n }\r\n\r\n // Validate that each item has an id\r\n for (const item of body) {\r\n if (!item[meta.idField]) {\r\n return {\r\n status: 400,\r\n data: { error: `Each record must have an ${meta.idField} field` },\r\n };\r\n }\r\n }\r\n\r\n // Execute updates in parallel\r\n const results = await Promise.all(\r\n body.map((item) => {\r\n const id = item[meta.idField];\r\n const updateData = { ...item };\r\n delete updateData[meta.idField]; // Remove id from update data\r\n\r\n return delegate.update({\r\n where: { [meta.idField]: coerceId(id) },\r\n data: updateData,\r\n ...projection,\r\n });\r\n })\r\n );\r\n\r\n return {\r\n status: 200,\r\n data: {\r\n updated: results.length,\r\n records: results,\r\n },\r\n };\r\n }\r\n\r\n // ── DELETE /model/bulk/delete ──────────────────────────────────────────────\r\n if (method === \"DELETE\" && operation === \"bulk-delete\") {\r\n if (!Array.isArray(body) || body.length === 0) {\r\n return {\r\n status: 400,\r\n data: { error: \"Request body must be a non-empty array of IDs\" },\r\n };\r\n }\r\n\r\n // Handle both array of IDs and array of objects with id field\r\n const ids = body.map((item: any) =>\r\n typeof item === \"object\" ? item[meta.idField] : item\r\n );\r\n\r\n // Use deleteMany with a where clause\r\n const result = await delegate.deleteMany({\r\n where: {\r\n [meta.idField]: { in: ids.map(coerceId) },\r\n },\r\n });\r\n\r\n return {\r\n status: 200,\r\n data: {\r\n deleted: result.count,\r\n },\r\n };\r\n }\r\n\r\n // ── GET /model ─────────────────────────────────────────────────────────────\r\n if (method === \"GET\" && !id) {\r\n const [data, total] = await (prisma as any).$transaction([\r\n delegate.findMany({ where, orderBy, skip, take, ...projection }),\r\n delegate.count({ where }),\r\n ]);\r\n\r\n return {\r\n status: 200,\r\n data: {\r\n data,\r\n meta: {\r\n total,\r\n page: Math.floor(skip / take) + 1,\r\n limit: take,\r\n totalPages: Math.ceil(total / take),\r\n },\r\n },\r\n };\r\n }\r\n\r\n // ── GET /model/:id ─────────────────────────────────────────────────────────\r\n if (method === \"GET\" && id) {\r\n const record = await delegate.findUnique({\r\n where: { [meta.idField]: coerceId(id) },\r\n ...projection,\r\n });\r\n\r\n if (!record) {\r\n return { status: 404, data: { error: `${meta.name} with id \"${id}\" not found.` } };\r\n }\r\n\r\n return { status: 200, data: record };\r\n }\r\n\r\n // ── POST /model ────────────────────────────────────────────────────────────\r\n if (method === \"POST\" && !id) {\r\n const record = await delegate.create({ data: body });\r\n return { status: 201, data: record };\r\n }\r\n\r\n // ── PUT /model/:id ─────────────────────────────────────────────────────────\r\n if ((method === \"PUT\" || method === \"PATCH\") && id) {\r\n const record = await delegate.update({\r\n where: { [meta.idField]: coerceId(id) },\r\n data: body,\r\n });\r\n return { status: 200, data: record };\r\n }\r\n\r\n // ── DELETE /model/:id ──────────────────────────────────────────────────────\r\n if (method === \"DELETE\" && id) {\r\n await delegate.delete({\r\n where: { [meta.idField]: coerceId(id) },\r\n });\r\n return { status: 204, data: null };\r\n }\r\n\r\n return { status: 405, data: { error: `Method ${method} not allowed.` } };\r\n}\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Coerces an ID string to number when possible (common with Int PKs).\r\n */\r\nfunction coerceId(id: string): string | number {\r\n const n = Number(id);\r\n return isNaN(n) ? id : n;\r\n}\r\n\r\n/**\r\n * Maps Prisma error codes to meaningful HTTP responses.\r\n */\r\nfunction handlePrismaError(e: any): HandlerResult {\r\n const code = e?.code;\r\n\r\n if (code === \"P2025\") {\r\n return { status: 404, data: { error: \"Record not found.\" } };\r\n }\r\n if (code === \"P2002\") {\r\n const fields = e?.meta?.target ?? \"unknown fields\";\r\n return {\r\n status: 409,\r\n data: { error: `Unique constraint failed on: ${fields}` },\r\n };\r\n }\r\n if (code === \"P2003\") {\r\n return { status: 400, data: { error: \"Foreign key constraint failed.\" } };\r\n }\r\n if (code === \"P2014\") {\r\n return { status: 400, data: { error: \"Relation violation.\" } };\r\n }\r\n\r\n return { status: 500, data: { error: e?.message ?? \"Internal server error.\" } };\r\n}","import { getModels } from \"./introspect\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Maps Prisma scalar types → Zod method names\r\n */\r\nconst PRISMA_TO_ZOD: Record<string, string> = {\r\n String: \"z.string()\",\r\n Int: \"z.number().int()\",\r\n Float: \"z.number()\",\r\n Decimal: \"z.number()\",\r\n Boolean: \"z.boolean()\",\r\n DateTime: \"z.coerce.date()\",\r\n Json: \"z.any()\",\r\n BigInt: \"z.bigint()\",\r\n Bytes: \"z.any()\",\r\n};\r\n\r\n/**\r\n * Converts a single Prisma field to its Zod expression string.\r\n */\r\nfunction fieldToZod(field: FieldMeta): string {\r\n if (field.isRelation) return null as any; // skip relations\r\n\r\n let zod = PRISMA_TO_ZOD[field.type] ?? \"z.any()\";\r\n\r\n // Optional fields\r\n if (!field.isRequired) {\r\n zod = `${zod}.optional()`;\r\n }\r\n\r\n // List fields\r\n if (field.isList) {\r\n zod = `z.array(${zod})`;\r\n }\r\n\r\n return zod;\r\n}\r\n\r\n/**\r\n * Generates Zod schema source code for a single model.\r\n *\r\n * Produces two schemas:\r\n * - CreateSchema — all required fields must be present\r\n * - UpdateSchema — all fields are optional (for PATCH)\r\n */\r\nfunction generateModelSchema(meta: ModelMeta): string {\r\n const name = meta.name;\r\n\r\n const fields = meta.fields\r\n .filter((f) => !f.isRelation && !f.isId) // skip relations and id (auto)\r\n .map((f) => {\r\n const zodExpr = fieldToZod(f);\r\n if (!zodExpr) return null;\r\n return ` ${f.name}: ${zodExpr},`;\r\n })\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n\r\n return `\r\n// ─── ${name} ──────────────────────────────────────────────────────────────────\r\n\r\nexport const ${name}CreateSchema = z.object({\r\n${fields}\r\n});\r\n\r\nexport const ${name}UpdateSchema = ${name}CreateSchema.partial();\r\n\r\nexport type ${name}Create = z.infer<typeof ${name}CreateSchema>;\r\nexport type ${name}Update = z.infer<typeof ${name}UpdateSchema>;\r\n`.trim();\r\n}\r\n\r\n/**\r\n * Generates a complete Zod schema file for ALL models in your Prisma schema.\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateZodSchemas } from \"omni-rest\";\r\n * const code = generateZodSchemas();\r\n * fs.writeFileSync(\"src/schemas.ts\", code);\r\n * ```\r\n */\r\nexport function generateZodSchemas(prisma?: any): string {\r\n const models = getModels(prisma);\r\n\r\n const schemas = models.map(generateModelSchema).join(\"\\n\\n\");\r\n\r\n return `/**\r\n * Auto-generated Zod schemas from Prisma schema.\r\n * Generated by omni-rest — do not edit manually.\r\n * Re-run after schema changes.\r\n */\r\nimport { z } from \"zod\";\r\n\r\n${schemas}\r\n`;\r\n}\r\n\r\n/**\r\n * Returns Zod schema OBJECTS at runtime (not source code).\r\n * Useful for request validation in middleware.\r\n *\r\n * Requires \"zod\" to be installed in the host project.\r\n */\r\nexport function buildRuntimeSchemas(prisma?: any): Record<\r\n string,\r\n { create: any; update: any }\r\n> {\r\n let z: any;\r\n try {\r\n z = require(\"zod\").z;\r\n } catch {\r\n throw new Error(\r\n \"[omni-rest] zod is required for runtime validation. Run: npm install zod\"\r\n );\r\n }\r\n\r\n const ZOD_FACTORIES: Record<string, () => any> = {\r\n String: () => z.string(),\r\n Int: () => z.number().int(),\r\n Float: () => z.number(),\r\n Decimal: () => z.number(),\r\n Boolean: () => z.boolean(),\r\n DateTime: () => z.coerce.date(),\r\n Json: () => z.any(),\r\n BigInt: () => z.bigint(),\r\n Bytes: () => z.any(),\r\n };\r\n\r\n const models = getModels(prisma);\r\n const result: Record<string, { create: any; update: any }> = {};\r\n\r\n for (const meta of models) {\r\n const shape: Record<string, any> = {};\r\n\r\n for (const field of meta.fields) {\r\n if (field.isRelation || field.isId) continue;\r\n\r\n const factory = ZOD_FACTORIES[field.type] ?? (() => z.any());\r\n let schema = factory();\r\n\r\n if (!field.isRequired) schema = schema.optional();\r\n if (field.isList) schema = z.array(schema);\r\n\r\n shape[field.name] = schema;\r\n }\r\n\r\n const createSchema = z.object(shape);\r\n result[meta.routeName] = {\r\n create: createSchema,\r\n update: createSchema.partial(),\r\n };\r\n }\r\n\r\n return result;\r\n}","import { buildRuntimeSchemas } from \"./zod-generator\";\r\nimport type { PrismaRestOptions } from \"./types\";\r\n\r\nlet cachedSchemas: ReturnType<typeof buildRuntimeSchemas> | null = null;\r\n\r\nfunction getSchemas() {\r\n if (!cachedSchemas) {\r\n cachedSchemas = buildRuntimeSchemas();\r\n }\r\n return cachedSchemas;\r\n}\r\n\r\n/**\r\n * Validates a request body against the auto-generated Zod schema for a model.\r\n *\r\n * Returns null if valid, or an error message string if invalid.\r\n *\r\n * @param modelRouteName e.g. \"department\"\r\n * @param method HTTP method — POST uses createSchema, PUT/PATCH uses updateSchema\r\n * @param body Request body object\r\n */\r\nexport function validateBody(\r\n modelRouteName: string,\r\n method: string,\r\n body: any\r\n): string | null {\r\n let schemas: ReturnType<typeof buildRuntimeSchemas>;\r\n\r\n try {\r\n schemas = getSchemas();\r\n } catch {\r\n // zod not installed — skip validation silently\r\n return null;\r\n }\r\n\r\n const modelSchemas = schemas[modelRouteName];\r\n if (!modelSchemas) return null;\r\n\r\n const schema =\r\n method === \"POST\" ? modelSchemas.create : modelSchemas.update;\r\n\r\n const result = schema.safeParse(body);\r\n if (!result.success) {\r\n const issues = result.error.issues\r\n .map((i: any) => `${i.path.join(\".\")}: ${i.message}`)\r\n .join(\", \");\r\n return `Validation failed — ${issues}`;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Creates a guard function that validates the request body automatically.\r\n * Plug this into the guards option to get free validation.\r\n *\r\n * @example\r\n * ```ts\r\n * import { withValidation } from \"omni-rest\";\r\n *\r\n * expressAdapter(prisma, {\r\n * guards: withValidation(), // validates ALL models\r\n * });\r\n * ```\r\n */\r\nexport function withValidation(overrides: PrismaRestOptions[\"guards\"] = {}) {\r\n const handler = ({ id, body, method }: any) => {\r\n const modelName = (handler as any).__model;\r\n const error = validateBody(modelName, method, body);\r\n return error ?? null;\r\n };\r\n\r\n return new Proxy(overrides, {\r\n get(target, modelName: string) {\r\n if (modelName in target) return target[modelName];\r\n\r\n // Return a guard map for each model that validates on write\r\n return {\r\n POST: ({ body }: any) => validateBody(modelName, \"POST\", body),\r\n PUT: ({ body }: any) => validateBody(modelName, \"PUT\", body),\r\n PATCH: ({ body }: any) => validateBody(modelName, \"PATCH\", body),\r\n };\r\n },\r\n });\r\n}","import { getModels } from \"./introspect\";\r\nimport type { ModelMeta, FieldMeta } from \"./types\";\r\n\r\n/**\r\n * Maps Prisma scalar types → OpenAPI schema types\r\n */\r\nconst PRISMA_TO_OAS: Record<string, { type: string; format?: string }> = {\r\n String: { type: \"string\" },\r\n Int: { type: \"integer\", format: \"int32\" },\r\n Float: { type: \"number\", format: \"float\" },\r\n Decimal: { type: \"number\" },\r\n Boolean: { type: \"boolean\" },\r\n DateTime: { type: \"string\", format: \"date-time\" },\r\n Json: { type: \"object\" },\r\n BigInt: { type: \"integer\", format: \"int64\" },\r\n};\r\n\r\nfunction fieldToOasSchema(field: FieldMeta): any {\r\n if (field.isRelation) return null;\r\n const base = PRISMA_TO_OAS[field.type] ?? { type: \"string\" };\r\n if (field.isList) return { type: \"array\", items: base };\r\n return base;\r\n}\r\n\r\nfunction buildModelSchema(meta: ModelMeta, forCreate = false): any {\r\n const properties: Record<string, any> = {};\r\n const required: string[] = [];\r\n\r\n for (const field of meta.fields) {\r\n if (field.isRelation) continue;\r\n if (forCreate && field.isId) continue; // id is auto on create\r\n\r\n const schema = fieldToOasSchema(field);\r\n if (!schema) continue;\r\n\r\n properties[field.name] = schema;\r\n\r\n if (field.isRequired && !field.isId && forCreate) {\r\n required.push(field.name);\r\n }\r\n }\r\n\r\n return {\r\n type: \"object\",\r\n properties,\r\n ...(required.length > 0 ? { required } : {}),\r\n };\r\n}\r\n\r\n/**\r\n * Generates a full OpenAPI 3.0 specification object for all exposed models.\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateOpenApiSpec } from \"omni-rest\";\r\n * const spec = generateOpenApiSpec(prisma, { title: \"My API\", version: \"1.0.0\", basePath: \"/api\" });\r\n * fs.writeFileSync(\"openapi.json\", JSON.stringify(spec, null, 2));\r\n * ```\r\n */\r\nexport function generateOpenApiSpec(\r\n prisma: any,\r\n options: {\r\n title?: string;\r\n version?: string;\r\n basePath?: string;\r\n allow?: string[];\r\n servers?: { url: string; description?: string }[];\r\n } = {}\r\n): object {\r\n const {\r\n title = \"omni-rest API\",\r\n version = \"1.0.0\",\r\n basePath = \"/api\",\r\n allow,\r\n servers = [{ url: \"http://localhost:3000\" }],\r\n } = options;\r\n\r\n const models = getModels(prisma).filter(\r\n (m) => !allow || allow.includes(m.routeName)\r\n );\r\n\r\n const paths: Record<string, any> = {};\r\n const schemas: Record<string, any> = {};\r\n\r\n for (const meta of models) {\r\n const name = meta.name;\r\n const route = meta.routeName;\r\n\r\n // ── Schemas ──────────────────────────────────────────────────────────────\r\n schemas[name] = buildModelSchema(meta, false);\r\n schemas[`${name}Create`] = buildModelSchema(meta, true);\r\n schemas[`${name}Update`] = {\r\n ...buildModelSchema(meta, true),\r\n required: [], // all optional for PATCH\r\n };\r\n\r\n // ── Collection path /api/:model ───────────────────────────────────────────\r\n paths[`${basePath}/${route}`] = {\r\n get: {\r\n summary: `List ${name}s`,\r\n tags: [name],\r\n parameters: buildListParameters(),\r\n responses: {\r\n 200: {\r\n description: `List of ${name}s`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n data: { type: \"array\", items: { $ref: `#/components/schemas/${name}` } },\r\n meta: { $ref: \"#/components/schemas/PaginationMeta\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n post: {\r\n summary: `Create ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Create` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 201: {\r\n description: `Created ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n 409: { $ref: \"#/components/responses/Conflict\" },\r\n },\r\n },\r\n };\r\n\r\n // ── Resource path /api/:model/:id ─────────────────────────────────────────\r\n paths[`${basePath}/${route}/{id}`] = {\r\n parameters: [\r\n {\r\n name: \"id\",\r\n in: \"path\",\r\n required: true,\r\n schema: { type: \"string\" },\r\n description: `${name} ID`,\r\n },\r\n ],\r\n get: {\r\n summary: `Get ${name} by ID`,\r\n tags: [name],\r\n responses: {\r\n 200: {\r\n description: `${name} record`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n put: {\r\n summary: `Update ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Create` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Updated ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n patch: {\r\n summary: `Partially update ${name}`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}Update` },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Updated ${name}`,\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n delete: {\r\n summary: `Delete ${name}`,\r\n tags: [name],\r\n responses: {\r\n 204: { description: \"Deleted successfully\" },\r\n 404: { $ref: \"#/components/responses/NotFound\" },\r\n },\r\n },\r\n };\r\n\r\n // ── Bulk operations paths ──────────────────────────────────────────────────\r\n paths[`${basePath}/${route}/bulk/update`] = {\r\n patch: {\r\n summary: `Bulk update ${name}s`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n description: `Array of ${name} objects with id field to update`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"array\",\r\n items: { $ref: `#/components/schemas/${name}Update` },\r\n },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Bulk update result`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n updated: { type: \"integer\" },\r\n records: {\r\n type: \"array\",\r\n items: { $ref: `#/components/schemas/${name}` },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n },\r\n },\r\n };\r\n\r\n paths[`${basePath}/${route}/bulk/delete`] = {\r\n delete: {\r\n summary: `Bulk delete ${name}s`,\r\n tags: [name],\r\n requestBody: {\r\n required: true,\r\n description: `Array of IDs to delete`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n },\r\n },\r\n },\r\n },\r\n responses: {\r\n 200: {\r\n description: `Bulk delete result`,\r\n content: {\r\n \"application/json\": {\r\n schema: {\r\n type: \"object\",\r\n properties: {\r\n deleted: { type: \"integer\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n 400: { $ref: \"#/components/responses/BadRequest\" },\r\n },\r\n },\r\n };\r\n }\r\n\r\n return {\r\n openapi: \"3.0.3\",\r\n info: { title, version },\r\n servers,\r\n paths,\r\n components: {\r\n schemas: {\r\n ...schemas,\r\n PaginationMeta: {\r\n type: \"object\",\r\n properties: {\r\n total: { type: \"integer\" },\r\n page: { type: \"integer\" },\r\n limit: { type: \"integer\" },\r\n totalPages: { type: \"integer\" },\r\n },\r\n },\r\n Error: {\r\n type: \"object\",\r\n properties: { error: { type: \"string\" } },\r\n },\r\n },\r\n responses: {\r\n NotFound: {\r\n description: \"Record not found\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n BadRequest: {\r\n description: \"Bad request\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n Conflict: {\r\n description: \"Unique constraint violation\",\r\n content: {\r\n \"application/json\": {\r\n schema: { $ref: \"#/components/schemas/Error\" },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n tags: models.map((m) => ({ name: m.name })),\r\n };\r\n}\r\n\r\nfunction buildListParameters() {\r\n return [\r\n { name: \"page\", in: \"query\", schema: { type: \"integer\", default: 1 }, description: \"Page number\" },\r\n { name: \"limit\", in: \"query\", schema: { type: \"integer\", default: 20 }, description: \"Items per page\" },\r\n { name: \"sort\", in: \"query\", schema: { type: \"string\" }, description: \"e.g. createdAt:desc\" },\r\n { name: \"include\", in: \"query\", schema: { type: \"string\" }, description: \"Comma-separated relations\" },\r\n { name: \"select\", in: \"query\", schema: { type: \"string\" }, description: \"Comma-separated fields\" },\r\n ];\r\n}","import { PrismaClient } from \"@prisma/client\";\r\nimport { createRouter } from \"../router\";\r\nimport type { PrismaRestOptions } from \"../types\";\r\n\r\n/**\r\n * Express adapter for omni-rest.\r\n *\r\n * @example\r\n * ```ts\r\n * import express from \"express\";\r\n * import { PrismaClient } from \"@prisma/client\";\r\n * import { expressAdapter } from \"omni-rest/express\";\r\n *\r\n * const app = express();\r\n * const prisma = new PrismaClient();\r\n *\r\n * app.use(express.json());\r\n * app.use(\"/api\", expressAdapter(prisma, {\r\n * allow: [\"department\", \"category\", \"city\"],\r\n * }));\r\n *\r\n * // Auto-generates:\r\n * // GET /api/department\r\n * // POST /api/department\r\n * // GET /api/department/:id\r\n * // PUT /api/department/:id\r\n * // PATCH /api/department/:id\r\n * // DELETE /api/department/:id\r\n * // PATCH /api/department/bulk/update\r\n * // DELETE /api/department/bulk/delete\r\n * ```\r\n */\r\nexport function expressAdapter(\r\n prisma: PrismaClient,\r\n options: PrismaRestOptions = {}\r\n) {\r\n // Lazy require so express stays optional peer dep\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const { Router } = require(\"express\");\r\n const router = Router();\r\n const { handle } = createRouter(prisma, options);\r\n\r\n // PATCH + DELETE /model/bulk/update and /model/bulk/delete\r\n router.patch(\"/:model/bulk/update\", async (req: any, res: any) => {\r\n try {\r\n const { status, data } = await handle(\r\n \"PATCH\",\r\n req.params.model,\r\n null,\r\n req.body ?? [],\r\n new URLSearchParams(\r\n Object.entries(req.query as Record<string, string>)\r\n .map(([k, v]) => `${k}=${v}`)\r\n .join(\"&\")\r\n ),\r\n \"bulk-update\"\r\n );\r\n if (status === 204) {\r\n return res.sendStatus(204);\r\n }\r\n return res.status(status).json(data);\r\n } catch (e: any) {\r\n return res.status(500).json({ error: e.message });\r\n }\r\n });\r\n\r\n router.delete(\"/:model/bulk/delete\", async (req: any, res: any) => {\r\n try {\r\n const { status, data } = await handle(\r\n \"DELETE\",\r\n req.params.model,\r\n null,\r\n req.body ?? [],\r\n new URLSearchParams(\r\n Object.entries(req.query as Record<string, string>)\r\n .map(([k, v]) => `${k}=${v}`)\r\n .join(\"&\")\r\n ),\r\n \"bulk-delete\"\r\n );\r\n if (status === 204) {\r\n return res.sendStatus(204);\r\n }\r\n return res.status(status).json(data);\r\n } catch (e: any) {\r\n return res.status(500).json({ error: e.message });\r\n }\r\n });\r\n\r\n // GET + POST /model\r\n router.route(\"/:model\").get(handler).post(handler);\r\n\r\n // GET + PUT + PATCH + DELETE /model/:id\r\n router\r\n .route(\"/:model/:id\")\r\n .get(handler)\r\n .put(handler)\r\n .patch(handler)\r\n .delete(handler);\r\n\r\n async function handler(req: any, res: any) {\r\n try {\r\n const { status, data } = await handle(\r\n req.method,\r\n req.params.model,\r\n req.params.id ?? null,\r\n req.body ?? {},\r\n new URLSearchParams(\r\n Object.entries(req.query as Record<string, string>)\r\n .map(([k, v]) => `${k}=${v}`)\r\n .join(\"&\")\r\n )\r\n );\r\n\r\n if (status === 204) {\r\n return res.sendStatus(204);\r\n }\r\n\r\n return res.status(status).json(data);\r\n } catch (e: any) {\r\n return res.status(500).json({ error: e.message });\r\n }\r\n }\r\n\r\n return router;\r\n}","import { PrismaClient } from \"@prisma/client\";\r\nimport { createRouter } from \"../router\";\r\nimport type { PrismaRestOptions } from \"../types\";\r\n\r\n/**\r\n * Next.js App Router adapter for omni-rest.\r\n *\r\n * @example\r\n * ```ts\r\n * // app/api/[...prismaRest]/route.ts\r\n * import { PrismaClient } from \"@prisma/client\";\r\n * import { nextjsAdapter } from \"omni-rest/nextjs\";\r\n *\r\n * const prisma = new PrismaClient();\r\n * const handler = nextjsAdapter(prisma, {\r\n * allow: [\"department\", \"category\"],\r\n * });\r\n *\r\n * export const GET = handler;\r\n * export const POST = handler;\r\n * export const PUT = handler;\r\n * export const PATCH = handler;\r\n * export const DELETE = handler;\r\n * ```\r\n *\r\n * This covers:\r\n * GET /api/department\r\n * POST /api/department\r\n * GET /api/department/5\r\n * PUT /api/department/5\r\n * PATCH /api/department/5\r\n * DELETE /api/department/5\r\n * PATCH /api/department/bulk/update\r\n * DELETE /api/department/bulk/delete\r\n */\r\nexport function nextjsAdapter(\r\n prisma: PrismaClient,\r\n options: PrismaRestOptions = {}\r\n) {\r\n const { handle } = createRouter(prisma, options);\r\n\r\n return async function handler(\r\n req: Request,\r\n context: { params: { prismaRest: string[] } }\r\n ): Promise<Response> {\r\n const segments = context.params.prismaRest ?? [];\r\n const [modelName, ...pathSegments] = segments;\r\n\r\n if (!modelName) {\r\n return Response.json(\r\n { error: \"No model specified in path.\" },\r\n { status: 400 }\r\n );\r\n }\r\n\r\n const url = new URL(req.url);\r\n\r\n let body: any = {};\r\n if (req.method !== \"GET\" && req.method !== \"DELETE\") {\r\n try {\r\n body = await req.json();\r\n } catch {\r\n body = {};\r\n }\r\n }\r\n\r\n // Detect bulk operations\r\n let operation: string | undefined;\r\n let id: string | null = null;\r\n\r\n if (pathSegments[0] === \"bulk\" && pathSegments[1] === \"update\") {\r\n operation = \"bulk-update\";\r\n } else if (pathSegments[0] === \"bulk\" && pathSegments[1] === \"delete\") {\r\n operation = \"bulk-delete\";\r\n } else {\r\n id = pathSegments[0] ?? null;\r\n }\r\n\r\n const { status, data } = await handle(\r\n req.method,\r\n modelName,\r\n id,\r\n body,\r\n url.searchParams,\r\n operation\r\n );\r\n\r\n if (status === 204) {\r\n return new Response(null, { status: 204 });\r\n }\r\n\r\n return Response.json(data, { status });\r\n };\r\n}","import { PrismaClient } from \"@prisma/client\";\r\nimport { createRouter } from \"../router\";\r\nimport type { PrismaRestOptions } from \"../types\";\r\n\r\n/**\r\n * Fastify adapter for omni-rest.\r\n *\r\n * @example\r\n * ```ts\r\n * import Fastify from \"fastify\";\r\n * import { PrismaClient } from \"@prisma/client\";\r\n * import { fastifyAdapter } from \"omni-rest/fastify\";\r\n *\r\n * const app = Fastify();\r\n * const prisma = new PrismaClient();\r\n *\r\n * fastifyAdapter(app, prisma, {\r\n * prefix: \"/api\",\r\n * allow: [\"department\", \"category\"],\r\n * });\r\n *\r\n * app.listen({ port: 3000 });\r\n * ```\r\n */\r\nexport function fastifyAdapter(\r\n fastify: any,\r\n prisma: PrismaClient,\r\n options: PrismaRestOptions = {}\r\n) {\r\n const { handle } = createRouter(prisma, options);\r\n const prefix = options.prefix ?? \"/api\";\r\n\r\n async function routeHandler(request: any, reply: any) {\r\n const { model, id } = request.params;\r\n const body = request.body ?? {};\r\n const query = request.query ?? {};\r\n\r\n const searchParams = new URLSearchParams(\r\n Object.entries(query as Record<string, string>)\r\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\r\n .join(\"&\")\r\n );\r\n\r\n const { status, data } = await handle(\r\n request.method,\r\n model,\r\n id ?? null,\r\n body,\r\n searchParams\r\n );\r\n\r\n if (status === 204) {\r\n return reply.status(204).send();\r\n }\r\n\r\n return reply.status(status).send(data);\r\n }\r\n\r\n async function bulkHandler(request: any, reply: any, operation: string) {\r\n const { model } = request.params;\r\n const body = request.body ?? [];\r\n const query = request.query ?? {};\r\n\r\n const searchParams = new URLSearchParams(\r\n Object.entries(query as Record<string, string>)\r\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\r\n .join(\"&\")\r\n );\r\n\r\n const { status, data } = await handle(\r\n operation.includes(\"update\") ? \"PATCH\" : \"DELETE\",\r\n model,\r\n null,\r\n body,\r\n searchParams,\r\n operation\r\n );\r\n\r\n if (status === 204) {\r\n return reply.status(204).send();\r\n }\r\n\r\n return reply.status(status).send(data);\r\n }\r\n\r\n // Standard CRUD routes\r\n fastify.get(`${prefix}/:model`, routeHandler);\r\n fastify.post(`${prefix}/:model`, routeHandler);\r\n fastify.get(`${prefix}/:model/:id`, routeHandler);\r\n fastify.put(`${prefix}/:model/:id`, routeHandler);\r\n fastify.patch(`${prefix}/:model/:id`, routeHandler);\r\n fastify.delete(`${prefix}/:model/:id`, routeHandler);\r\n\r\n // Bulk operation routes (using closures to capture operation parameter)\r\n fastify.patch(`${prefix}/:model/bulk/update`, async (request: any, reply: any) => {\r\n await bulkHandler(request, reply, \"bulk-update\");\r\n });\r\n fastify.delete(`${prefix}/:model/bulk/delete`, async (request: any, reply: any) => {\r\n await bulkHandler(request, reply, \"bulk-delete\");\r\n });\r\n}","import { PrismaClient } from \"@prisma/client\";\nimport { createRouter } from \"../router\";\nimport type { PrismaRestOptions } from \"../types\";\n\n/**\n * Koa adapter for omni-rest.\n * Allows using omni-rest within a Koa application using @koa/router.\n *\n * @example\n * ```ts\n * import Koa from \"koa\";\n * import bodyParser from \"koa-bodyparser\";\n * import Router from \"@koa/router\";\n * import { PrismaClient } from \"@prisma/client\";\n * import { koaAdapter } from \"omni-rest/koa\";\n *\n * const app = new Koa();\n * const router = new Router({ prefix: \"/api\" });\n * const prisma = new PrismaClient();\n *\n * app.use(bodyParser());\n * koaAdapter(router, prisma, {\n * allow: [\"product\", \"category\"],\n * });\n *\n * app.use(router.routes());\n * ```\n */\nexport function koaAdapter(\n router: any,\n prisma: PrismaClient,\n options: PrismaRestOptions = {}\n) {\n const { handle } = createRouter(prisma, options);\n\n // Helper to extract query as URLSearchParams\n const getSearchParams = (ctx: any): URLSearchParams => {\n return new URLSearchParams(\n Object.entries(ctx.query as Record<string, string>)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\")\n );\n };\n\n // Internal Koa handler\n const koaHandler = async (ctx: any) => {\n try {\n const { status, data } = await handle(\n ctx.method,\n ctx.params.model,\n ctx.params.id ?? null,\n (ctx.request as any).body ?? {},\n getSearchParams(ctx)\n );\n\n ctx.status = status;\n if (status !== 204) {\n ctx.body = data;\n }\n } catch (e: any) {\n ctx.status = 500;\n ctx.body = { error: e.message };\n }\n };\n\n // Bulk Operations\n router.patch(\"/:model/bulk/update\", async (ctx: any) => {\n try {\n const { status, data } = await handle(\n \"PATCH\",\n ctx.params.model,\n null,\n (ctx.request as any).body ?? [],\n getSearchParams(ctx),\n \"bulk-update\"\n );\n\n ctx.status = status;\n if (status !== 204) {\n ctx.body = data;\n }\n } catch (e: any) {\n ctx.status = 500;\n ctx.body = { error: e.message };\n }\n });\n\n router.delete(\"/:model/bulk/delete\", async (ctx: any) => {\n try {\n const { status, data } = await handle(\n \"DELETE\",\n ctx.params.model,\n null,\n (ctx.request as any).body ?? [],\n getSearchParams(ctx),\n \"bulk-delete\"\n );\n\n ctx.status = status;\n if (status !== 204) {\n ctx.body = data;\n }\n } catch (e: any) {\n ctx.status = 500;\n ctx.body = { error: e.message };\n }\n });\n\n // GET + POST /model\n router.get(\"/:model\", koaHandler);\n router.post(\"/:model\", koaHandler);\n\n // GET + PUT + PATCH + DELETE /model/:id\n router.get(\"/:model/:id\", koaHandler);\n router.put(\"/:model/:id\", koaHandler);\n router.patch(\"/:model/:id\", koaHandler);\n router.delete(\"/:model/:id\", koaHandler);\n\n return router;\n}\n","import { PrismaClient } from \"@prisma/client\";\nimport { createRouter } from \"../router\";\nimport type { PrismaRestOptions } from \"../types\";\n\nexport interface HapiAdapterOptions extends PrismaRestOptions {\n prisma: PrismaClient;\n prefix?: string;\n}\n\n/**\n * Hapi plugin adapter for omni-rest.\n * Registers dynamic REST endpoints directly on the Hapi server instance.\n *\n * @example\n * ```ts\n * import Hapi from \"@hapi/hapi\";\n * import { PrismaClient } from \"@prisma/client\";\n * import { hapiAdapter } from \"omni-rest/hapi\";\n *\n * const prisma = new PrismaClient();\n * const server = Hapi.server({ port: 3000 });\n *\n * await server.register({\n * plugin: hapiAdapter,\n * options: {\n * prisma,\n * prefix: \"/api\",\n * allow: [\"product\", \"category\"],\n * }\n * });\n * ```\n */\nexport const hapiAdapter = {\n name: \"omni-rest\",\n version: \"1.0.0\",\n register: async (server: any, options: HapiAdapterOptions) => {\n if (!options.prisma) {\n throw new Error(\"[omni-rest/hapi] You must provide the prisma client inside options.prisma\");\n }\n\n const { prisma, prefix = \"\", ...restOptions } = options;\n const { handle } = createRouter(prisma, restOptions);\n\n const getSearchParams = (request: any): URLSearchParams => {\n const urlParams = new URLSearchParams();\n for (const [key, value] of Object.entries((request.query as Record<string, string>) || {})) {\n if (Array.isArray(value)) {\n value.forEach(v => urlParams.append(key, v));\n } else {\n urlParams.append(key, value);\n }\n }\n return urlParams;\n };\n\n const handler = async (request: any, h: any) => {\n try {\n const { status, data } = await handle(\n request.method.toUpperCase(),\n request.params.model,\n request.params.id ?? null,\n request.payload ?? {},\n getSearchParams(request)\n );\n\n if (status === 204) {\n return h.response().code(204);\n }\n return h.response(data).code(status);\n } catch (e: any) {\n return h.response({ error: e.message }).code(500);\n }\n };\n\n const bulkUpdateHandler = async (request: any, h: any) => {\n try {\n const { status, data } = await handle(\n \"PATCH\",\n request.params.model,\n null,\n request.payload ?? [],\n getSearchParams(request),\n \"bulk-update\"\n );\n if (status === 204) return h.response().code(204);\n return h.response(data).code(status);\n } catch (e: any) {\n return h.response({ error: e.message }).code(500);\n }\n };\n\n const bulkDeleteHandler = async (request: any, h: any) => {\n try {\n const { status, data } = await handle(\n \"DELETE\",\n request.params.model,\n null,\n request.payload ?? [],\n getSearchParams(request),\n \"bulk-delete\"\n );\n if (status === 204) return h.response().code(204);\n return h.response(data).code(status);\n } catch (e: any) {\n return h.response({ error: e.message }).code(500);\n }\n };\n\n // Bulk Operations\n server.route({\n method: \"PATCH\",\n path: `${prefix}/{model}/bulk/update`,\n handler: bulkUpdateHandler,\n });\n server.route({\n method: \"DELETE\",\n path: `${prefix}/{model}/bulk/delete`,\n handler: bulkDeleteHandler,\n });\n\n // Collection endpoints\n server.route({\n method: [\"GET\", \"POST\"],\n path: `${prefix}/{model}`,\n handler,\n });\n\n // Item endpoints\n server.route({\n method: [\"GET\", \"PUT\", \"PATCH\", \"DELETE\"],\n path: `${prefix}/{model}/{id}`,\n handler,\n });\n },\n};\n","// @ts-nocheck\nimport { PrismaClient } from \"@prisma/client\";\nimport { createRouter } from \"../router\";\nimport type { PrismaRestOptions } from \"../types\";\n\n/**\n * NestJS adapter for omni-rest.\n * Generates a dynamic controller block that maps wildcard routes directly into omni-rest handlers.\n *\n * @example\n * ```ts\n * import { Controller, Module, NestModule, MiddlewareConsumer } from '@nestjs/common';\n * import { PrismaClient } from '@prisma/client';\n * import { nestjsController } from 'omni-rest/nestjs';\n *\n * const prisma = new PrismaClient();\n *\n * // Create generating Controller natively via factory\n * export const OmniRestController = nestjsController(prisma, {\n * allow: [\"product\", \"category\"],\n * });\n *\n * @Module({\n * controllers: [OmniRestController],\n * })\n * export class AppModule {}\n * ```\n */\nexport function nestjsController(\n prisma: PrismaClient,\n options: PrismaRestOptions = {},\n prefix: string = \"api\"\n): any {\n // We lazily require NestJS specific decorators so they don't break applications that don't have `@nestjs/common`\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Controller, Get, Post, Put, Patch, Delete, Param, Body, Query, Req, Res, HttpStatus } = require(\"@nestjs/common\");\n const { handle } = createRouter(prisma, options);\n\n const getSearchParams = (query: Record<string, string>): URLSearchParams => {\n return new URLSearchParams(\n Object.entries(query || {})\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\")\n );\n };\n\n @Controller(prefix)\n class OmniRestDynamicController {\n \n @Patch(\":model/bulk/update\")\n async bulkUpdate(\n @Param(\"model\") model: string,\n @Body() body: any[],\n @Query() query: any,\n @Res() res: any\n ) {\n try {\n const { status, data } = await handle(\"PATCH\", model, null, body ?? [], getSearchParams(query), \"bulk-update\");\n if (status === 204) return res.status(HttpStatus.NO_CONTENT).send();\n return res.status(status).json(data);\n } catch (e: any) {\n return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ error: e.message });\n }\n }\n\n @Delete(\":model/bulk/delete\")\n async bulkDelete(\n @Param(\"model\") model: string,\n @Body() body: any[],\n @Query() query: any,\n @Res() res: any\n ) {\n try {\n const { status, data } = await handle(\"DELETE\", model, null, body ?? [], getSearchParams(query), \"bulk-delete\");\n if (status === 204) return res.status(HttpStatus.NO_CONTENT).send();\n return res.status(status).json(data);\n } catch (e: any) {\n return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ error: e.message });\n }\n }\n\n @Get(\":model\")\n async list(\n @Param(\"model\") model: string,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"GET\", model, null, {}, query, res);\n }\n\n @Post(\":model\")\n async create(\n @Param(\"model\") model: string,\n @Body() body: any,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"POST\", model, null, body, query, res);\n }\n\n @Get(\":model/:id\")\n async read(\n @Param(\"model\") model: string,\n @Param(\"id\") id: string,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"GET\", model, id, {}, query, res);\n }\n\n @Put(\":model/:id\")\n async replace(\n @Param(\"model\") model: string,\n @Param(\"id\") id: string,\n @Body() body: any,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"PUT\", model, id, body, query, res);\n }\n\n @Patch(\":model/:id\")\n async update(\n @Param(\"model\") model: string,\n @Param(\"id\") id: string,\n @Body() body: any,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"PATCH\", model, id, body, query, res);\n }\n\n @Delete(\":model/:id\")\n async remove(\n @Param(\"model\") model: string,\n @Param(\"id\") id: string,\n @Query() query: any,\n @Res() res: any\n ) {\n return await this._processRequest(\"DELETE\", model, id, {}, query, res);\n }\n\n private async _processRequest(\n method: string, \n model: string, \n id: string | null, \n body: any, \n query: any, \n res: any\n ) {\n try {\n const { status, data } = await handle(method, model, id, body ?? {}, getSearchParams(query));\n if (status === 204) {\n return res.status(HttpStatus.NO_CONTENT).send();\n }\n return res.status(status).json(data);\n } catch (e: any) {\n return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ error: e.message });\n }\n }\n }\n\n return OmniRestDynamicController;\n}\n"]}
|