omni-rest 0.2.2 → 0.2.4
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/cli.js +46 -27
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +46 -27
- package/dist/cli.mjs.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/introspect.ts","../src/zod-generator.ts","../src/openapi.ts","../src/frontend/scan.ts","../src/frontend/schema.ts","../src/frontend/detect.ts","../src/frontend/deps.ts","../src/frontend/prompt.ts","../src/frontend/codegen/hook.ts","../src/frontend/codegen/utils.ts","../src/frontend/codegen/columns.ts","../src/frontend/codegen/table.ts","../src/frontend/codegen/form.ts","../src/frontend/output.ts","../src/frontend-generator.ts","../src/cli.ts"],"names":["path","fs","cwd","path2","fs2","fs3","path3","path4","fs4","resolve","prompt","readline","relationalFields","fs5","path5","path6","readline2","COLORS","run"],"mappings":"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","file":"cli.js","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 { 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 { 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 * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { CandidateFrontend } from \"./types\";\r\n\r\nconst EXCLUDED_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".next\", \"out\"]);\r\n\r\n/**\r\n * Reads and parses a package.json at the given directory.\r\n * Returns null if the file doesn't exist or can't be parsed.\r\n */\r\nfunction readPackageJson(dir: string): Record<string, unknown> | null {\r\n const pkgPath = path.join(dir, \"package.json\");\r\n try {\r\n const content = fs.readFileSync(pkgPath, \"utf-8\");\r\n return JSON.parse(content);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Scores a single directory based on the presence of framework config files\r\n * and react in package.json. Returns a CandidateFrontend or null if score is 0.\r\n */\r\nfunction scoreDir(dir: string, cwd: string): CandidateFrontend | null {\r\n let score = 0;\r\n const signals: string[] = [];\r\n\r\n // Check for next.config.js / next.config.ts\r\n if (\r\n fs.existsSync(path.join(dir, \"next.config.js\")) ||\r\n fs.existsSync(path.join(dir, \"next.config.ts\"))\r\n ) {\r\n score += 10;\r\n const file = fs.existsSync(path.join(dir, \"next.config.js\"))\r\n ? \"next.config.js\"\r\n : \"next.config.ts\";\r\n signals.push(`${file} found`);\r\n }\r\n\r\n // Check for vite.config.ts / vite.config.js\r\n if (\r\n fs.existsSync(path.join(dir, \"vite.config.ts\")) ||\r\n fs.existsSync(path.join(dir, \"vite.config.js\"))\r\n ) {\r\n score += 10;\r\n const file = fs.existsSync(path.join(dir, \"vite.config.ts\"))\r\n ? \"vite.config.ts\"\r\n : \"vite.config.js\";\r\n signals.push(`${file} found`);\r\n }\r\n\r\n // Check package.json for react dependency\r\n const pkg = readPackageJson(dir);\r\n if (pkg) {\r\n const deps = (pkg.dependencies as Record<string, string> | undefined) ?? {};\r\n const devDeps = (pkg.devDependencies as Record<string, string> | undefined) ?? {};\r\n\r\n if (\"react\" in deps) {\r\n score += 5;\r\n signals.push(\"react in dependencies\");\r\n } else if (\"react\" in devDeps) {\r\n score += 3;\r\n signals.push(\"react in devDependencies\");\r\n }\r\n }\r\n\r\n // Bonus for current working directory\r\n if (path.resolve(dir) === path.resolve(cwd)) {\r\n score += 2;\r\n signals.push(\"current working directory\");\r\n }\r\n\r\n if (score === 0) return null;\r\n\r\n return {\r\n dir: path.resolve(dir),\r\n score,\r\n signals,\r\n };\r\n}\r\n\r\n/**\r\n * Recursively walks up to `maxDepth` levels deep from `rootDir`,\r\n * excluding directories in EXCLUDED_DIRS, and collects scored candidates.\r\n */\r\nfunction walk(\r\n dir: string,\r\n cwd: string,\r\n currentDepth: number,\r\n maxDepth: number,\r\n results: Map<string, CandidateFrontend>\r\n): void {\r\n const absDir = path.resolve(dir);\r\n\r\n // Score this directory\r\n const candidate = scoreDir(absDir, cwd);\r\n if (candidate && !results.has(absDir)) {\r\n results.set(absDir, candidate);\r\n }\r\n\r\n if (currentDepth >= maxDepth) return;\r\n\r\n // Recurse into subdirectories\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(absDir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory()) continue;\r\n if (EXCLUDED_DIRS.has(entry.name)) continue;\r\n\r\n walk(path.join(absDir, entry.name), cwd, currentDepth + 1, maxDepth, results);\r\n }\r\n}\r\n\r\n/**\r\n * Walks up to 3 levels deep from `dir`, scores each candidate directory,\r\n * and returns CandidateFrontend[] sorted descending by score (score 0 excluded).\r\n */\r\nexport function scoreCandidates(dir: string): CandidateFrontend[] {\r\n const cwd = process.cwd();\r\n const results = new Map<string, CandidateFrontend>();\r\n\r\n walk(dir, cwd, 0, 3, results);\r\n\r\n return Array.from(results.values()).sort((a, b) => b.score - a.score);\r\n}\r\n\r\n/**\r\n * Public API: scans for frontend directories starting from `dir`.\r\n * Returns CandidateFrontend[] sorted descending by score.\r\n */\r\nexport async function scanForFrontendDir(dir: string): Promise<CandidateFrontend[]> {\r\n return scoreCandidates(dir);\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { ModelMeta } from \"../types\";\r\nimport { getModels } from \"../introspect\";\r\n\r\n/**\r\n * Finds the nearest `schema.prisma` file by walking up from `startDir`.\r\n *\r\n * - If `explicitPath` is provided, verifies it exists and returns it immediately.\r\n * - Otherwise walks up the directory tree until `schema.prisma` is found or root is reached.\r\n *\r\n * Requirements: 2.1, 2.2, 2.3, 2.4, 2.5\r\n */\r\nexport async function findSchema(\r\n startDir: string,\r\n explicitPath?: string\r\n): Promise<string> {\r\n if (explicitPath !== undefined) {\r\n const resolved = path.resolve(explicitPath);\r\n if (!fs.existsSync(resolved)) {\r\n throw new Error(\r\n `[omni-rest] Schema file not found at the specified path: \"${resolved}\"\\n` +\r\n `Please check that the path is correct and the file is readable.`\r\n );\r\n }\r\n return resolved;\r\n }\r\n\r\n let current = path.resolve(startDir);\r\n\r\n while (true) {\r\n const candidate = path.join(current, \"schema.prisma\");\r\n if (fs.existsSync(candidate)) {\r\n return candidate;\r\n }\r\n\r\n const parent = path.dirname(current);\r\n if (parent === current) {\r\n // Reached filesystem root without finding schema.prisma\r\n throw new Error(\r\n `[omni-rest] Could not find \"schema.prisma\" by walking up from \"${startDir}\".\\n` +\r\n `Please run this command from within your Prisma project, or specify the path with --schema <path>.`\r\n );\r\n }\r\n current = parent;\r\n }\r\n}\r\n\r\n/**\r\n * Loads `@prisma/client` from the user's `node_modules` at `prismaClientPath`\r\n * and returns the list of models via `getModels`.\r\n *\r\n * Requirements: 5.1, 5.2, 5.3, 5.4, 5.5\r\n */\r\nexport async function loadDMMF(prismaClientPath: string): Promise<ModelMeta[]> {\r\n let prismaClientModule: any;\r\n\r\n try {\r\n // Use require() to load from the user's node_modules path\r\n prismaClientModule = require(prismaClientPath);\r\n } catch (err) {\r\n throw new Error(\r\n `[omni-rest] Could not load \"@prisma/client\" from \"${prismaClientPath}\".\\n` +\r\n `Please run \"npx prisma generate\" to generate the Prisma client, then try again.`\r\n );\r\n }\r\n\r\n // Extract the Prisma namespace to pass DMMF access to getModels\r\n const prismaNamespace = prismaClientModule?.Prisma ?? prismaClientModule?.default?.Prisma;\r\n\r\n if (!prismaNamespace?.dmmf?.datamodel?.models) {\r\n throw new Error(\r\n `[omni-rest] Could not read DMMF from \"@prisma/client\" at \"${prismaClientPath}\".\\n` +\r\n `Please run \"npx prisma generate\" to regenerate the Prisma client, then try again.`\r\n );\r\n }\r\n\r\n // Temporarily override the Prisma import used by getModels by passing a\r\n // synthetic prisma-like object that exposes _runtimeDataModel from the DMMF.\r\n // getModels() accepts an optional prisma instance; if not provided it falls\r\n // back to the package-level @prisma/client import. Since we want to use the\r\n // user's client, we build a minimal shim.\r\n const dmmfModels: any[] = prismaNamespace.dmmf.datamodel.models;\r\n\r\n // Build a synthetic prisma instance whose _runtimeDataModel mirrors the DMMF\r\n // so that getModels() picks it up via the first branch.\r\n const syntheticPrisma = {\r\n _runtimeDataModel: {\r\n models: Object.fromEntries(\r\n dmmfModels.map((m: any) => [\r\n m.name,\r\n {\r\n fields: m.fields,\r\n },\r\n ])\r\n ),\r\n },\r\n };\r\n\r\n return getModels(syntheticPrisma);\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\ntype Framework = \"nextjs\" | \"vite-react\" | \"react\";\r\n\r\n/**\r\n * Detects the frontend framework used in the given directory.\r\n *\r\n * Priority:\r\n * 1. next.config.js or next.config.ts → \"nextjs\"\r\n * 2. vite.config.ts or vite.config.js (no next config) → \"vite-react\"\r\n * 3. package.json with react in dependencies/devDependencies → \"react\"\r\n * 4. Fallback: prints warning and returns \"react\"\r\n *\r\n * Requirements: 3.1, 3.2, 3.3, 3.4\r\n */\r\nexport function detectFramework(frontendDir: string): Framework {\r\n const hasNextConfig =\r\n fs.existsSync(path.join(frontendDir, \"next.config.js\")) ||\r\n fs.existsSync(path.join(frontendDir, \"next.config.ts\"));\r\n\r\n if (hasNextConfig) return \"nextjs\";\r\n\r\n const hasViteConfig =\r\n fs.existsSync(path.join(frontendDir, \"vite.config.ts\")) ||\r\n fs.existsSync(path.join(frontendDir, \"vite.config.js\"));\r\n\r\n if (hasViteConfig) return \"vite-react\";\r\n\r\n // Check package.json for react dependency\r\n const pkgPath = path.join(frontendDir, \"package.json\");\r\n if (fs.existsSync(pkgPath)) {\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\r\n const deps = pkg.dependencies ?? {};\r\n const devDeps = pkg.devDependencies ?? {};\r\n if (\"react\" in deps || \"react\" in devDeps) {\r\n return \"react\";\r\n }\r\n } catch {\r\n // ignore parse errors\r\n }\r\n }\r\n\r\n console.warn(\r\n `[omni-rest] Warning: Could not detect frontend framework in \"${frontendDir}\". Defaulting to \"react\".`\r\n );\r\n return \"react\";\r\n}\r\n\r\n/**\r\n * Parses a simple .env file and returns a map of key → value.\r\n * Handles KEY=VALUE and KEY=\"VALUE\" formats. Ignores comments and blank lines.\r\n */\r\nfunction parseEnvFile(filePath: string): Map<string, string> {\r\n const result = new Map<string, string>();\r\n let content: string;\r\n try {\r\n content = fs.readFileSync(filePath, \"utf-8\");\r\n } catch {\r\n return result;\r\n }\r\n\r\n for (const line of content.split(\"\\n\")) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n const eqIdx = trimmed.indexOf(\"=\");\r\n if (eqIdx === -1) continue;\r\n const key = trimmed.slice(0, eqIdx).trim();\r\n let value = trimmed.slice(eqIdx + 1).trim();\r\n // Strip surrounding quotes\r\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n }\r\n result.set(key, value);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Resolves the API base URL from environment files.\r\n *\r\n * Priority:\r\n * 1. .env.local → NEXT_PUBLIC_API_URL\r\n * 2. .env → NEXT_PUBLIC_API_URL or VITE_API_URL\r\n * 3. Fallback: \"/api\"\r\n *\r\n * Does NOT modify any env file.\r\n * Requirements: 4.1, 4.2, 4.3, 4.4\r\n */\r\nexport function resolveBaseUrl(frontendDir: string): string {\r\n // 1. Check .env.local for NEXT_PUBLIC_API_URL\r\n const envLocal = parseEnvFile(path.join(frontendDir, \".env.local\"));\r\n if (envLocal.has(\"NEXT_PUBLIC_API_URL\")) {\r\n return envLocal.get(\"NEXT_PUBLIC_API_URL\")!;\r\n }\r\n\r\n // 2. Check .env for NEXT_PUBLIC_API_URL or VITE_API_URL\r\n const env = parseEnvFile(path.join(frontendDir, \".env\"));\r\n if (env.has(\"NEXT_PUBLIC_API_URL\")) {\r\n return env.get(\"NEXT_PUBLIC_API_URL\")!;\r\n }\r\n if (env.has(\"VITE_API_URL\")) {\r\n return env.get(\"VITE_API_URL\")!;\r\n }\r\n\r\n // 3. Default\r\n return \"/api\";\r\n}\r\n\r\n/**\r\n * Resolves the output directory for generated files.\r\n *\r\n * Rules (in priority order):\r\n * 1. If outFlag is provided → path.resolve(frontendDir, outFlag)\r\n * 2. If framework is \"nextjs\" and frontendDir/app/ exists but frontendDir/src/ does not → frontendDir/app/\r\n * 3. Otherwise → frontendDir/src/\r\n *\r\n * Requirements: 13.1, 13.2, 13.3\r\n */\r\nexport function resolveOutputDir(\r\n frontendDir: string,\r\n framework: Framework,\r\n outFlag?: string\r\n): string {\r\n if (outFlag) {\r\n return path.resolve(frontendDir, outFlag);\r\n }\r\n\r\n if (framework === \"nextjs\") {\r\n const appDir = path.join(frontendDir, \"app\");\r\n const srcDir = path.join(frontendDir, \"src\");\r\n if (fs.existsSync(appDir) && !fs.existsSync(srcDir)) {\r\n return path.resolve(frontendDir, \"app\");\r\n }\r\n }\r\n\r\n return path.resolve(frontendDir, \"src\");\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\nconst BASE_PACKAGES = [\r\n \"@tanstack/react-query\",\r\n \"@tanstack/react-table\",\r\n \"react-hook-form\",\r\n \"zod\",\r\n \"@hookform/resolvers\",\r\n];\r\n\r\nconst FRAMEWORK_PACKAGES: Record<string, string[]> = {\r\n nextjs: [\"next\"],\r\n \"vite-react\": [\"react-router-dom\"],\r\n};\r\n\r\n/**\r\n * Checks that required packages are present in the frontend project's package.json.\r\n *\r\n * Returns an array of missing package names. If package.json cannot be read,\r\n * all required packages are returned as missing.\r\n *\r\n * Requirements: 14.1, 14.2, 14.3, 14.4, 14.5\r\n */\r\nexport function checkDependencies(\r\n frontendDir: string,\r\n framework: \"nextjs\" | \"vite-react\" | \"react\"\r\n): string[] {\r\n const required = [\r\n ...BASE_PACKAGES,\r\n ...(FRAMEWORK_PACKAGES[framework] ?? []),\r\n ];\r\n\r\n const pkgPath = path.join(frontendDir, \"package.json\");\r\n let installed: Set<string>;\r\n\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\r\n const deps = Object.keys(pkg.dependencies ?? {});\r\n const devDeps = Object.keys(pkg.devDependencies ?? {});\r\n installed = new Set([...deps, ...devDeps]);\r\n } catch {\r\n // package.json missing or unreadable — treat all as missing\r\n return required;\r\n }\r\n\r\n return required.filter((pkg) => !installed.has(pkg));\r\n}\r\n","import * as readline from \"readline\";\r\nimport type { ModelMeta, FieldMeta } from \"../types\";\r\nimport type { ModelConfig } from \"./types\";\r\n\r\n// ─── Flags interface ──────────────────────────────────────────────────────────\r\n\r\nexport interface BuildConfigFlags {\r\n autopilot?: boolean;\r\n noBulk?: boolean;\r\n steps?: \"auto\" | \"always\" | \"never\";\r\n modelsFilter?: string[];\r\n}\r\n\r\n// ─── shouldUseMultiStep ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Determines whether a model's form should use multi-step wizard mode.\r\n *\r\n * Rules (Requirements 16.1, 16.2, 16.3):\r\n * - \"always\" → true (regardless of field count)\r\n * - \"never\" → false (regardless of field count)\r\n * - \"auto\" / undefined → true only when fieldCount > 6\r\n */\r\nexport function shouldUseMultiStep(\r\n fieldCount: number,\r\n stepsFlag?: \"auto\" | \"always\" | \"never\"\r\n): boolean {\r\n if (stepsFlag === \"always\") return true;\r\n if (stepsFlag === \"never\") return false;\r\n // \"auto\" or undefined\r\n return fieldCount > 6;\r\n}\r\n\r\n// ─── Field helpers ────────────────────────────────────────────────────────────\r\n\r\nfunction scalarFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter((f) => !f.isRelation);\r\n}\r\n\r\nfunction relationalFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter((f) => f.isRelation);\r\n}\r\n\r\n// ─── Autopilot config ─────────────────────────────────────────────────────────\r\n\r\nfunction buildAutopilotConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): ModelConfig[] {\r\n return models.map((model) => {\r\n const scalars = scalarFields(model).map((f) => f.name);\r\n const relations = relationalFields(model).map((f) => f.name);\r\n const fieldCount = model.fields.length;\r\n\r\n return {\r\n model,\r\n tableFields: scalars,\r\n formFields: scalars,\r\n relationalFields: relations,\r\n bulkDelete: !flags.noBulk,\r\n canExport: true,\r\n multiStep: shouldUseMultiStep(fieldCount, flags.steps),\r\n };\r\n });\r\n}\r\n\r\n// ─── Interactive helpers ──────────────────────────────────────────────────────\r\n\r\nfunction ask(rl: readline.Interface, question: string): Promise<string> {\r\n return new Promise((resolve) => rl.question(question, resolve));\r\n}\r\n\r\n/**\r\n * Presents a numbered list and returns the indices the user selected.\r\n * Input format: \"1,3,5\" or \"1 3 5\" or \"all\" (selects everything).\r\n */\r\nasync function multiSelect(\r\n rl: readline.Interface,\r\n prompt: string,\r\n items: string[]\r\n): Promise<number[]> {\r\n console.log(prompt);\r\n items.forEach((item, i) => console.log(` ${i + 1}. ${item}`));\r\n const answer = await ask(rl, \" Enter numbers (comma/space separated, or 'all'): \");\r\n const trimmed = answer.trim().toLowerCase();\r\n if (trimmed === \"all\" || trimmed === \"\") {\r\n return items.map((_, i) => i);\r\n }\r\n return trimmed\r\n .split(/[\\s,]+/)\r\n .map((s) => parseInt(s, 10) - 1)\r\n .filter((i) => i >= 0 && i < items.length);\r\n}\r\n\r\nasync function yesNo(\r\n rl: readline.Interface,\r\n prompt: string,\r\n defaultYes = true\r\n): Promise<boolean> {\r\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\r\n const answer = await ask(rl, `${prompt} ${hint}: `);\r\n const trimmed = answer.trim().toLowerCase();\r\n if (trimmed === \"\") return defaultYes;\r\n return trimmed === \"y\" || trimmed === \"yes\";\r\n}\r\n\r\n// ─── Interactive config ───────────────────────────────────────────────────────\r\n\r\nasync function buildInteractiveConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): Promise<ModelConfig[]> {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n try {\r\n // Step 1: which models to generate\r\n const modelIndices = await multiSelect(\r\n rl,\r\n \"\\nWhich models do you want to generate? (default: all)\",\r\n models.map((m) => m.name)\r\n );\r\n const selectedModels = modelIndices.map((i) => models[i]);\r\n\r\n const configs: ModelConfig[] = [];\r\n\r\n for (const model of selectedModels) {\r\n console.log(`\\n── Configuring ${model.name} ──`);\r\n\r\n const scalars = scalarFields(model);\r\n const relations = relationalFields(model);\r\n\r\n // Relational fields as searchable-select\r\n let selectedRelations: string[] = relations.map((f) => f.name);\r\n if (relations.length > 0) {\r\n const relIndices = await multiSelect(\r\n rl,\r\n ` Relational fields for ${model.name} (searchable-select dropdowns):`,\r\n relations.map((f) => f.name)\r\n );\r\n selectedRelations = relIndices.map((i) => relations[i].name);\r\n }\r\n\r\n // Scalar fields for table\r\n const tableIndices = await multiSelect(\r\n rl,\r\n ` Scalar fields to show in the table for ${model.name}:`,\r\n scalars.map((f) => f.name)\r\n );\r\n const tableFields = tableIndices.map((i) => scalars[i].name);\r\n\r\n // Scalar fields for form\r\n const formIndices = await multiSelect(\r\n rl,\r\n ` Scalar fields to include in the form for ${model.name}:`,\r\n scalars.map((f) => f.name)\r\n );\r\n const formFields = formIndices.map((i) => scalars[i].name);\r\n\r\n // Bulk delete — CLI flag overrides prompt\r\n const bulkDelete = flags.noBulk\r\n ? false\r\n : await yesNo(rl, ` Enable bulk delete for ${model.name}?`);\r\n\r\n // Export — prompt answer\r\n const canExport = await yesNo(rl, ` Enable CSV/JSON export for ${model.name}?`);\r\n\r\n // Multi-step: if steps flag is set, use it; otherwise prompt only when auto\r\n let multiStep: boolean;\r\n if (flags.steps === \"always\") {\r\n multiStep = true;\r\n } else if (flags.steps === \"never\") {\r\n multiStep = false;\r\n } else {\r\n // auto / undefined — suggest based on field count, let user confirm\r\n const suggested = formFields.length > 6;\r\n multiStep = await yesNo(\r\n rl,\r\n ` Enable multi-step form for ${model.name}?`,\r\n suggested\r\n );\r\n }\r\n\r\n configs.push({\r\n model,\r\n tableFields,\r\n formFields,\r\n relationalFields: selectedRelations,\r\n bulkDelete,\r\n canExport,\r\n multiStep,\r\n });\r\n }\r\n\r\n return configs;\r\n } finally {\r\n rl.close();\r\n }\r\n}\r\n\r\n// ─── Public API ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Builds per-model configuration either from autopilot defaults or interactive prompts.\r\n *\r\n * Requirements: 6.1–6.8, 7.1–7.7\r\n */\r\nexport async function buildConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): Promise<ModelConfig[]> {\r\n // Apply models filter if provided\r\n const filtered =\r\n flags.modelsFilter && flags.modelsFilter.length > 0\r\n ? models.filter((m) => flags.modelsFilter!.includes(m.name))\r\n : models;\r\n\r\n if (flags.autopilot) {\r\n return buildAutopilotConfig(filtered, flags);\r\n }\r\n\r\n return buildInteractiveConfig(filtered, flags);\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `use[Model].ts` TanStack Query hook file.\r\n */\r\nexport function generateHookFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { baseUrl, staleTime, gcTime, noOptimistic } = config;\r\n const { model, bulkDelete } = modelConfig;\r\n const { name, routeName } = model;\r\n\r\n // Capitalise first letter for hook names\r\n const Model = name; // e.g. \"User\"\r\n const models = `${Model}s`; // e.g. \"Users\"\r\n\r\n const lines: string[] = [];\r\n\r\n // Imports\r\n lines.push(`import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";`);\r\n lines.push(`import type { ${Model}, Prisma } from \"@prisma/client\";`);\r\n lines.push(``);\r\n\r\n // Base URL constant\r\n lines.push(`const BASE_URL = \"${baseUrl}\";`);\r\n lines.push(``);\r\n\r\n // ── use[Model]s ──────────────────────────────────────────────────────────\r\n lines.push(`export function use${models}(params?: Record<string, any>) {`);\r\n lines.push(` return useQuery({`);\r\n lines.push(` queryKey: [\"${routeName}\", params],`);\r\n lines.push(` queryFn: () => {`);\r\n lines.push(` const url = new URL(\\`\\${BASE_URL}/${routeName}\\`, window.location.origin);`);\r\n lines.push(` if (params) {`);\r\n lines.push(` Object.entries(params).forEach(([k, v]) => {`);\r\n lines.push(` if (v !== undefined && v !== null) url.searchParams.set(k, String(v));`);\r\n lines.push(` });`);\r\n lines.push(` }`);\r\n lines.push(` return fetch(url.toString()).then((r) => r.json());`);\r\n lines.push(` },`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── use[Model] ───────────────────────────────────────────────────────────\r\n lines.push(`export function use${Model}(id: string) {`);\r\n lines.push(` return useQuery({`);\r\n lines.push(` queryKey: [\"${routeName}\", id],`);\r\n lines.push(` queryFn: () =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`).then((r) => r.json()),`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useCreate[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useCreate${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (data: Prisma.${Model}CreateInput) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}\\`, {`);\r\n lines.push(` method: \"POST\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify(data),`);\r\n lines.push(` }).then((r) => r.json()) as Promise<${Model}>,`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (newItem) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: [...(old?.data ?? []), { ...newItem, id: \"__optimistic__\" }],`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useUpdate[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useUpdate${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: ({ id, data }: { id: string; data: Prisma.${Model}UpdateInput }) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`, {`);\r\n lines.push(` method: \"PATCH\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify(data),`);\r\n lines.push(` }).then((r) => r.json()) as Promise<${Model}>,`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async ({ id, data }) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).map((item: any) =>`);\r\n lines.push(` item.id === id ? { ...item, ...data } : item`);\r\n lines.push(` ),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useDelete[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useDelete${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (id: string) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`, { method: \"DELETE\" }).then((r) =>`);\r\n lines.push(` r.json()`);\r\n lines.push(` ),`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (id) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).filter((item: any) => item.id !== id),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useBulkDelete[Model]s ────────────────────────────────────────────────\r\n if (bulkDelete !== false) {\r\n lines.push(`export function useBulkDelete${models}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (ids: string[]) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}\\`, {`);\r\n lines.push(` method: \"DELETE\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify({ ids }),`);\r\n lines.push(` }).then((r) => r.json()),`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (ids) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).filter((item: any) => !ids.includes(item.id)),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { FieldMeta } from \"../../types\";\r\n\r\n/**\r\n * Converts a camelCase string to Title Case with spaces.\r\n * e.g. \"firstName\" → \"First Name\", \"userId\" → \"User Id\"\r\n */\r\nexport function camelToTitle(name: string): string {\r\n // Insert a space before each uppercase letter, then capitalize the first letter\r\n return name\r\n .replace(/([A-Z])/g, \" $1\")\r\n .replace(/^./, (ch) => ch.toUpperCase())\r\n .trim();\r\n}\r\n\r\nconst VALID_FIELD_TYPES = [\r\n \"text\",\r\n \"number\",\r\n \"switch\",\r\n \"date\",\r\n \"textarea\",\r\n \"select\",\r\n \"searchable-select\",\r\n] as const;\r\n\r\nexport type FormFieldType = (typeof VALID_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Maps a DMMF FieldMeta to a FormGenerator field type string.\r\n */\r\nexport function fieldTypeMap(field: FieldMeta): FormFieldType {\r\n if (field.isRelation) return \"searchable-select\";\r\n\r\n switch (field.type) {\r\n case \"String\":\r\n return \"text\";\r\n case \"Int\":\r\n case \"Float\":\r\n case \"Decimal\":\r\n return \"number\";\r\n case \"Boolean\":\r\n return \"switch\";\r\n case \"DateTime\":\r\n return \"date\";\r\n case \"Json\":\r\n return \"textarea\";\r\n default:\r\n // Enum types are not one of the scalar primitives above\r\n // We detect enums by checking if the type starts with an uppercase letter\r\n // and is not a known scalar — treat as \"select\"\r\n if (/^[A-Z]/.test(field.type)) return \"select\";\r\n return \"text\";\r\n }\r\n}\r\n\r\n/**\r\n * Splits a string[] into arrays of at most `maxPerStep` items.\r\n * Number of steps = ceil(fields.length / maxPerStep).\r\n */\r\nexport function chunkFields(fields: string[], maxPerStep = 4): string[][] {\r\n const steps: string[][] = [];\r\n for (let i = 0; i < fields.length; i += maxPerStep) {\r\n steps.push(fields.slice(i, i + maxPerStep));\r\n }\r\n return steps;\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\nimport { camelToTitle } from \"./utils\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Columns.tsx` TanStack Table column definitions file.\r\n */\r\nexport function generateColumnsFile(\r\n _config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { model, tableFields } = modelConfig;\r\n const { name } = model;\r\n\r\n // e.g. \"User\" → \"user\"\r\n const varName = name.charAt(0).toLowerCase() + name.slice(1);\r\n\r\n const lines: string[] = [];\r\n\r\n // Imports\r\n lines.push(`import type { ColumnDef } from \"@tanstack/react-table\";`);\r\n lines.push(`import type { ${name} } from \"@prisma/client\";`);\r\n lines.push(``);\r\n\r\n // Column array\r\n lines.push(`export const ${varName}Columns: ColumnDef<${name}>[] = [`);\r\n\r\n // One entry per selected scalar field\r\n for (const field of tableFields) {\r\n lines.push(` {`);\r\n lines.push(` accessorKey: \"${field}\",`);\r\n lines.push(` header: \"${camelToTitle(field)}\",`);\r\n lines.push(` },`);\r\n }\r\n\r\n // Actions column\r\n lines.push(` {`);\r\n lines.push(` id: \"actions\",`);\r\n lines.push(` header: \"Actions\",`);\r\n lines.push(` cell: ({ row }) => (`);\r\n lines.push(` <div className=\"flex gap-2\">`);\r\n lines.push(` <button onClick={() => row.original && void 0}>Edit</button>`);\r\n lines.push(` <button onClick={() => row.original && void 0}>Delete</button>`);\r\n lines.push(` </div>`);\r\n lines.push(` ),`);\r\n lines.push(` },`);\r\n\r\n lines.push(`];`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Table.tsx` DataTable component file.\r\n */\r\nexport function generateTableFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { framework } = config;\r\n const { model, bulkDelete, canExport } = modelConfig;\r\n const { name } = model;\r\n\r\n // Derived names\r\n const Model = name; // e.g. \"User\"\r\n const models = `${Model}s`; // e.g. \"Users\"\r\n const varName = name.charAt(0).toLowerCase() + name.slice(1); // e.g. \"user\"\r\n\r\n // Hook names\r\n const useListHook = `use${models}`; // e.g. \"useUsers\"\r\n const useDeleteHook = `useDelete${Model}`; // e.g. \"useDeleteUser\"\r\n const useBulkDeleteHook = `useBulkDelete${models}`; // e.g. \"useBulkDeleteUsers\"\r\n\r\n // Column variable name\r\n const columnsVar = `${varName}Columns`; // e.g. \"userColumns\"\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive for Next.js (must be first line)\r\n if (framework === \"nextjs\") {\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n }\r\n\r\n // Imports\r\n lines.push(`import { DataTable } from \"../data-table\";`);\r\n lines.push(`import { ${columnsVar} } from \"./${Model}Columns\";`);\r\n\r\n // Build hook import list\r\n const hookImports: string[] = [useListHook, useDeleteHook];\r\n if (bulkDelete) {\r\n hookImports.push(useBulkDeleteHook);\r\n }\r\n lines.push(`import { ${hookImports.join(\", \")} } from \"../hooks/use${Model}\";`);\r\n lines.push(``);\r\n\r\n // Component\r\n lines.push(`export function ${Model}Table() {`);\r\n lines.push(` const { data } = ${useListHook}();`);\r\n lines.push(` const ${varName}Delete = ${useDeleteHook}();`);\r\n\r\n if (bulkDelete) {\r\n lines.push(` const ${varName}BulkDelete = ${useBulkDeleteHook}();`);\r\n }\r\n\r\n lines.push(``);\r\n lines.push(` return (`);\r\n\r\n // Build DataTable props\r\n const dtProps: string[] = [\r\n ` columns={${columnsVar}}`,\r\n ` data={data?.data ?? []}`,\r\n ` onRowDelete={(row) => ${varName}Delete.mutate(row.id)}`,\r\n ];\r\n\r\n if (bulkDelete) {\r\n dtProps.push(` onMultiDelete={(rows) => ${varName}BulkDelete.mutate(rows.map((r) => r.id))}`);\r\n }\r\n\r\n if (canExport) {\r\n dtProps.push(` canExport={true}`);\r\n }\r\n\r\n lines.push(` <DataTable`);\r\n for (const prop of dtProps) {\r\n lines.push(prop);\r\n }\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\nimport { camelToTitle, fieldTypeMap, chunkFields } from \"./utils\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Form.tsx` FormGenerator component file.\r\n */\r\nexport function generateFormFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { framework } = config;\r\n const { model, formFields, relationalFields, multiStep } = modelConfig;\r\n const { name, fields: allFields } = model;\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive for Next.js (must be first line)\r\n if (framework === \"nextjs\") {\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n }\r\n\r\n // Collect relational field metadata: fieldName → relatedModelName\r\n const relationalFieldMeta: Array<{ fieldName: string; relatedModel: string }> = [];\r\n for (const relFieldName of relationalFields) {\r\n const fieldMeta = allFields.find((f) => f.name === relFieldName);\r\n if (fieldMeta) {\r\n relationalFieldMeta.push({\r\n fieldName: relFieldName,\r\n relatedModel: fieldMeta.type, // e.g. \"User\" for a userId relation\r\n });\r\n }\r\n }\r\n\r\n // Imports\r\n lines.push(`import { FormGenerator } from \"../form-generator\";`);\r\n lines.push(`import { ${name}Schema } from \"src/schemas.generated\";`);\r\n lines.push(\r\n `import { useCreate${name}, useUpdate${name} } from \"../hooks/use${name}\";`\r\n );\r\n\r\n // Import use[RelatedModel]s hooks for relational fields\r\n for (const { relatedModel } of relationalFieldMeta) {\r\n lines.push(\r\n `import { use${relatedModel}s } from \"../hooks/use${relatedModel}\";`\r\n );\r\n }\r\n\r\n lines.push(``);\r\n\r\n // Component\r\n lines.push(`export function ${name}Form({ id }: { id?: string }) {`);\r\n lines.push(` const create${name} = useCreate${name}();`);\r\n lines.push(` const update${name} = useUpdate${name}();`);\r\n\r\n // Fetch relational data for searchable-select options\r\n for (const { fieldName, relatedModel } of relationalFieldMeta) {\r\n const varName =\r\n fieldName.charAt(0).toLowerCase() + fieldName.slice(1) + \"Options\";\r\n lines.push(\r\n ` const { data: ${varName}Data } = use${relatedModel}s();`\r\n );\r\n }\r\n\r\n lines.push(``);\r\n\r\n // Build fields array\r\n lines.push(` const fields = [`);\r\n\r\n // Scalar form fields\r\n for (const fieldName of formFields) {\r\n const fieldMeta = allFields.find((f) => f.name === fieldName);\r\n const type = fieldMeta ? fieldTypeMap(fieldMeta) : \"text\";\r\n lines.push(` {`);\r\n lines.push(` name: \"${fieldName}\",`);\r\n lines.push(` label: \"${camelToTitle(fieldName)}\",`);\r\n lines.push(` type: \"${type}\",`);\r\n lines.push(` },`);\r\n }\r\n\r\n // Relational fields as searchable-select\r\n for (const { fieldName, relatedModel } of relationalFieldMeta) {\r\n const varName =\r\n fieldName.charAt(0).toLowerCase() + fieldName.slice(1) + \"Options\";\r\n lines.push(` {`);\r\n lines.push(` name: \"${fieldName}\",`);\r\n lines.push(` label: \"${camelToTitle(fieldName)}\",`);\r\n lines.push(` type: \"searchable-select\",`);\r\n lines.push(\r\n ` options: (${varName}Data?.data ?? []).map((r: any) => ({ label: String(r.name ?? r.id), value: String(r.id) })),`\r\n );\r\n lines.push(` },`);\r\n }\r\n\r\n lines.push(` ];`);\r\n lines.push(``);\r\n\r\n // Build FormGenerator JSX\r\n if (multiStep) {\r\n // Chunk all field names (scalar + relational) into steps\r\n const allFieldNames = [\r\n ...formFields,\r\n ...relationalFieldMeta.map((r) => r.fieldName),\r\n ];\r\n const chunks = chunkFields(allFieldNames, 4);\r\n\r\n lines.push(` const steps = [`);\r\n chunks.forEach((chunk, i) => {\r\n lines.push(` {`);\r\n lines.push(` title: \"Step ${i + 1}\",`);\r\n lines.push(\r\n ` fields: [${chunk.map((f) => `\"${f}\"`).join(\", \")}],`\r\n );\r\n lines.push(` },`);\r\n });\r\n lines.push(` ];`);\r\n lines.push(``);\r\n\r\n lines.push(` return (`);\r\n lines.push(` <FormGenerator`);\r\n lines.push(` fields={fields}`);\r\n lines.push(` schema={${name}Schema}`);\r\n lines.push(\r\n ` onSubmit={(data) => id ? update${name}.mutate({ id, data }) : create${name}.mutate(data)}`\r\n );\r\n lines.push(` steps={steps}`);\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n } else {\r\n lines.push(` return (`);\r\n lines.push(` <FormGenerator`);\r\n lines.push(` fields={fields}`);\r\n lines.push(` schema={${name}Schema}`);\r\n lines.push(\r\n ` onSubmit={(data) => id ? update${name}.mutate({ id, data }) : create${name}.mutate(data)}`\r\n );\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n }\r\n\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { FileResult } from \"./types\";\r\n\r\n// ── ANSI colour helpers ───────────────────────────────────────────────────────\r\nconst GREEN = \"\\x1b[32m\";\r\nconst YELLOW = \"\\x1b[33m\";\r\nconst BLUE = \"\\x1b[34m\";\r\nconst RED = \"\\x1b[31m\";\r\nconst RESET = \"\\x1b[0m\";\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// writeFile\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Writes `content` to `destPath`, creating intermediate directories as needed.\r\n * Returns a `FileResult` with:\r\n * - `\"created\"` — file did not exist before\r\n * - `\"overwritten\"` — file already existed and was replaced\r\n * - `\"error\"` — write failed (error attached)\r\n */\r\nexport async function writeFile(destPath: string, content: string): Promise<FileResult> {\r\n let existed = false;\r\n try {\r\n existed = fs.existsSync(destPath);\r\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\r\n fs.writeFileSync(destPath, content, \"utf8\");\r\n return { path: destPath, status: existed ? \"overwritten\" : \"created\" };\r\n } catch (err) {\r\n return { path: destPath, status: \"error\", error: err instanceof Error ? err : new Error(String(err)) };\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// copyBaseComponents\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst BASE_COMPONENTS: Array<{ src: string; dest: string }> = [\r\n { src: \"frontend-next/data-table.tsx\", dest: \"components/data-table.tsx\" },\r\n { src: \"frontend-next/form-generator.tsx\", dest: \"components/form-generator.tsx\" },\r\n];\r\n\r\n/**\r\n * Copies the shared DataTable and FormGenerator source files from `packageRoot`\r\n * into `{outputDir}/components/`.\r\n *\r\n * - If the destination already exists, returns `FileResult` with `\"skipped\"`.\r\n * - Creates intermediate directories as needed.\r\n * - Returns one `FileResult` per file.\r\n */\r\nexport async function copyBaseComponents(outputDir: string, packageRoot: string): Promise<FileResult[]> {\r\n const results: FileResult[] = [];\r\n\r\n for (const { src, dest } of BASE_COMPONENTS) {\r\n const srcPath = path.join(packageRoot, src);\r\n const destPath = path.join(outputDir, dest);\r\n\r\n if (fs.existsSync(destPath)) {\r\n results.push({ path: destPath, status: \"skipped\" });\r\n continue;\r\n }\r\n\r\n try {\r\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\r\n fs.copyFileSync(srcPath, destPath);\r\n results.push({ path: destPath, status: \"created\" });\r\n } catch (err) {\r\n results.push({\r\n path: destPath,\r\n status: \"error\",\r\n error: err instanceof Error ? err : new Error(String(err)),\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// printSummary\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Prints a per-file status line for each `FileResult`, then a final count\r\n * summary line.\r\n *\r\n * Visual indicators:\r\n * created → green ✓\r\n * overwritten → yellow ⚠\r\n * skipped → blue ℹ\r\n * error → red ✗\r\n */\r\nexport function printSummary(results: FileResult[]): void {\r\n for (const r of results) {\r\n switch (r.status) {\r\n case \"created\":\r\n console.log(`${GREEN}✓${RESET} created ${r.path}`);\r\n break;\r\n case \"overwritten\":\r\n console.log(`${YELLOW}⚠${RESET} overwritten ${r.path}`);\r\n break;\r\n case \"skipped\":\r\n console.log(`${BLUE}ℹ${RESET} skipped ${r.path}`);\r\n break;\r\n case \"error\":\r\n console.log(`${RED}✗${RESET} error ${r.path}${r.error ? ` — ${r.error.message}` : \"\"}`);\r\n break;\r\n }\r\n }\r\n\r\n const created = results.filter(r => r.status === \"created\").length;\r\n const overwritten = results.filter(r => r.status === \"overwritten\").length;\r\n const skipped = results.filter(r => r.status === \"skipped\").length;\r\n const errors = results.filter(r => r.status === \"error\").length;\r\n\r\n console.log(\r\n `\\nGenerated ${created} files (${overwritten} overwritten, ${skipped} skipped, ${errors} errors)`\r\n );\r\n}\r\n","import * as path from \"path\";\r\nimport * as readline from \"readline\";\r\n\r\nimport { scanForFrontendDir } from \"./frontend/scan\";\r\nimport { findSchema, loadDMMF } from \"./frontend/schema\";\r\nimport { detectFramework, resolveBaseUrl, resolveOutputDir } from \"./frontend/detect\";\r\nimport { checkDependencies } from \"./frontend/deps\";\r\nimport { buildConfig, type BuildConfigFlags } from \"./frontend/prompt\";\r\nimport { generateHookFile } from \"./frontend/codegen/hook\";\r\nimport { generateColumnsFile } from \"./frontend/codegen/columns\";\r\nimport { generateTableFile } from \"./frontend/codegen/table\";\r\nimport { generateFormFile } from \"./frontend/codegen/form\";\r\nimport { writeFile, copyBaseComponents, printSummary } from \"./frontend/output\";\r\nimport type { GeneratorConfig, ModelConfig, FileResult } from \"./frontend/types\";\r\n\r\n// ── ANSI colour helpers (mirrors src/cli.ts COLORS) ──────────────────────────\r\nconst COLORS = {\r\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\r\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\r\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\r\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\r\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// generateAll\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Orchestrates code generation for all models in `config`.\r\n *\r\n * For each ModelConfig it calls all four codegen functions, writes the\r\n * resulting files, then copies the shared base components and prints a\r\n * summary.\r\n *\r\n * Requirements: 7.2, 7.3, 7.4, 7.5, 7.6, 15.1, 15.2\r\n */\r\nexport async function generateAll(config: GeneratorConfig): Promise<FileResult[]> {\r\n const { outputDir, models } = config;\r\n // packageRoot is the omni-rest package root (one level up from dist/src)\r\n const packageRoot = path.resolve(__dirname, \"..\");\r\n\r\n const results: FileResult[] = [];\r\n\r\n for (const modelConfig of models) {\r\n const { name } = modelConfig.model;\r\n const modelLower = name.charAt(0).toLowerCase() + name.slice(1);\r\n\r\n // 1. Hook file → {outputDir}/hooks/use{Model}.ts\r\n const hookContent = generateHookFile(config, modelConfig);\r\n const hookPath = path.join(outputDir, \"hooks\", `use${name}.ts`);\r\n results.push(await writeFile(hookPath, hookContent));\r\n\r\n // 2. Columns file → {outputDir}/components/{model}/{Model}Columns.tsx\r\n const columnsContent = generateColumnsFile(config, modelConfig);\r\n const columnsPath = path.join(outputDir, \"components\", modelLower, `${name}Columns.tsx`);\r\n results.push(await writeFile(columnsPath, columnsContent));\r\n\r\n // 3. Table file → {outputDir}/components/{model}/{Model}Table.tsx\r\n const tableContent = generateTableFile(config, modelConfig);\r\n const tablePath = path.join(outputDir, \"components\", modelLower, `${name}Table.tsx`);\r\n results.push(await writeFile(tablePath, tableContent));\r\n\r\n // 4. Form file → {outputDir}/components/{model}/{Model}Form.tsx\r\n const formContent = generateFormFile(config, modelConfig);\r\n const formPath = path.join(outputDir, \"components\", modelLower, `${name}Form.tsx`);\r\n results.push(await writeFile(formPath, formContent));\r\n }\r\n\r\n // Copy shared base components\r\n const baseResults = await copyBaseComponents(outputDir, packageRoot);\r\n results.push(...baseResults);\r\n\r\n // Print summary\r\n printSummary(results);\r\n\r\n return results;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// run (top-level async entry point)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst HELP_TEXT = `\r\n Usage: npx omni-rest generate:frontend [options]\r\n\r\n Options:\r\n --schema <path> Path to schema.prisma (default: auto-discover)\r\n --frontend-dir <path> Frontend project root (default: auto-scan)\r\n --out <dir> Output directory relative to frontend-dir (default: src/)\r\n --models <names> Comma-separated model names to generate (default: all)\r\n --autopilot Skip all prompts, use defaults\r\n --no-bulk Disable bulk delete hooks and wiring\r\n --no-optimistic Disable optimistic update patterns\r\n --stale-time <ms> useQuery staleTime (default: 30000)\r\n --gc-time <ms> useQuery gcTime (default: 300000)\r\n --steps <mode> Multi-step form mode: auto | always | never (default: auto)\r\n --help Print this help\r\n`;\r\n\r\n/** Prompts the user for a single line of input. */\r\nfunction prompt(question: string): Promise<string> {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(question, (answer) => {\r\n rl.close();\r\n resolve(answer.trim());\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Top-level async entry point for `generate:frontend`.\r\n *\r\n * Parses flags from `argv`, runs the full pipeline, and calls `generateAll`.\r\n *\r\n * Requirements: 1.1, 2.4, 2.5, 18.1, 18.2, 18.8–18.16\r\n */\r\nexport async function run(argv: string[]): Promise<void> {\r\n // ── Parse flags ────────────────────────────────────────────────────────────\r\n let schemaPath: string | undefined;\r\n let frontendDirFlag: string | undefined;\r\n let outFlag: string | undefined;\r\n let modelsFlag: string | undefined;\r\n let autopilot = false;\r\n let noBulk = false;\r\n let noOptimistic = false;\r\n let staleTime = 30000;\r\n let gcTime = 300000;\r\n let stepsFlag: \"auto\" | \"always\" | \"never\" = \"auto\";\r\n\r\n for (let i = 0; i < argv.length; i++) {\r\n const arg = argv[i];\r\n switch (arg) {\r\n case \"--help\":\r\n console.log(HELP_TEXT);\r\n return;\r\n case \"--schema\":\r\n schemaPath = argv[++i];\r\n break;\r\n case \"--frontend-dir\":\r\n frontendDirFlag = argv[++i];\r\n break;\r\n case \"--out\":\r\n outFlag = argv[++i];\r\n break;\r\n case \"--models\":\r\n modelsFlag = argv[++i];\r\n break;\r\n case \"--autopilot\":\r\n autopilot = true;\r\n break;\r\n case \"--no-bulk\":\r\n noBulk = true;\r\n break;\r\n case \"--no-optimistic\":\r\n noOptimistic = true;\r\n break;\r\n case \"--stale-time\":\r\n staleTime = parseInt(argv[++i], 10) || 30000;\r\n break;\r\n case \"--gc-time\":\r\n gcTime = parseInt(argv[++i], 10) || 300000;\r\n break;\r\n case \"--steps\": {\r\n const val = argv[++i];\r\n if (val === \"always\" || val === \"never\" || val === \"auto\") {\r\n stepsFlag = val;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const cwd = process.cwd();\r\n\r\n console.log(COLORS.bold(\"\\n omni-rest · generate:frontend\\n\"));\r\n\r\n // ── Step 1: Resolve frontendDir ────────────────────────────────────────────\r\n let frontendDir: string;\r\n\r\n if (frontendDirFlag) {\r\n // Requirement 18.1 — use provided path directly\r\n const resolved = require(\"path\").resolve(cwd, frontendDirFlag);\r\n const fs = require(\"fs\") as typeof import(\"fs\");\r\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {\r\n console.error(\r\n COLORS.red(\r\n ` ✗ --frontend-dir path does not exist or is not a directory: \"${resolved}\"`\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n frontendDir = resolved;\r\n } else {\r\n // Requirement 18.3 — scan for candidates\r\n const candidates = await scanForFrontendDir(cwd);\r\n\r\n if (candidates.length === 0) {\r\n // Requirement 18.11 / 18.14\r\n console.error(\r\n COLORS.red(\r\n ` ✗ No frontend project found.\\n` +\r\n ` Scan criteria: next.config.*, vite.config.*, or package.json with react dependency.\\n` +\r\n ` Run from your frontend directory or use --frontend-dir <path>.`\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n if (autopilot) {\r\n if (candidates.length > 1) {\r\n // Requirement 18.13\r\n console.error(COLORS.red(` ✗ Multiple frontend candidates found. Specify one with --frontend-dir:\\n`));\r\n candidates.forEach((c, i) => console.error(` ${i + 1}. ${c.dir} (score: ${c.score})`));\r\n process.exit(1);\r\n }\r\n // Requirement 18.12 — single candidate, use it\r\n frontendDir = candidates[0].dir;\r\n console.log(COLORS.cyan(` → Using frontend dir: ${frontendDir}`));\r\n } else if (candidates.length === 1) {\r\n // Requirement 18.8 / 18.9 — confirm with user\r\n const answer = await prompt(\r\n ` Frontend dir detected: ${COLORS.bold(candidates[0].dir)}\\n Use this directory? [Y/n]: `\r\n );\r\n if (answer.toLowerCase() === \"n\" || answer.toLowerCase() === \"no\") {\r\n console.log(\" Aborted.\");\r\n return;\r\n }\r\n frontendDir = candidates[0].dir;\r\n } else {\r\n // Requirement 18.10 — multiple candidates, let user pick\r\n console.log(\" Multiple frontend candidates found:\\n\");\r\n candidates.forEach((c, i) => {\r\n console.log(` ${i + 1}. ${c.dir} (score: ${c.score}, signals: ${c.signals.join(\", \")})`);\r\n });\r\n const answer = await prompt(`\\n Select a number [1]: `);\r\n const idx = (parseInt(answer, 10) || 1) - 1;\r\n if (idx < 0 || idx >= candidates.length) {\r\n console.error(COLORS.red(\" ✗ Invalid selection.\"));\r\n process.exit(1);\r\n }\r\n frontendDir = candidates[idx].dir;\r\n }\r\n }\r\n\r\n // ── Step 2: Find schema.prisma ─────────────────────────────────────────────\r\n let resolvedSchemaPath: string;\r\n try {\r\n resolvedSchemaPath = await findSchema(cwd, schemaPath);\r\n console.log(COLORS.cyan(` → Schema: ${resolvedSchemaPath}`));\r\n } catch (err: any) {\r\n console.error(COLORS.red(` ✗ ${err.message}`));\r\n process.exit(1);\r\n }\r\n\r\n // ── Step 3: Load DMMF ──────────────────────────────────────────────────────\r\n const prismaClientPath = path.join(frontendDir, \"node_modules\", \"@prisma\", \"client\");\r\n let allModels;\r\n try {\r\n allModels = await loadDMMF(prismaClientPath);\r\n console.log(COLORS.cyan(` → Found ${allModels.length} model(s): ${allModels.map((m) => m.name).join(\", \")}`));\r\n } catch (err: any) {\r\n console.error(COLORS.red(` ✗ ${err.message}`));\r\n process.exit(1);\r\n }\r\n\r\n // ── Step 4: Detect framework ───────────────────────────────────────────────\r\n const framework = detectFramework(frontendDir);\r\n console.log(COLORS.cyan(` → Framework: ${framework}`));\r\n\r\n // ── Step 5: Resolve base URL ───────────────────────────────────────────────\r\n const baseUrl = resolveBaseUrl(frontendDir);\r\n console.log(COLORS.cyan(` → Base URL: ${baseUrl}`));\r\n\r\n // ── Step 6: Resolve output dir ─────────────────────────────────────────────\r\n const outputDir = resolveOutputDir(frontendDir, framework, outFlag);\r\n console.log(COLORS.cyan(` → Output dir: ${outputDir}`));\r\n\r\n // ── Step 7: Check dependencies ─────────────────────────────────────────────\r\n const missing = checkDependencies(frontendDir, framework);\r\n if (missing.length > 0) {\r\n console.warn(\r\n COLORS.yellow(\r\n ` ⚠ Missing dependencies: ${missing.join(\", \")}\\n` +\r\n ` Install with: npm install ${missing.join(\" \")}`\r\n )\r\n );\r\n }\r\n\r\n // ── Step 8: Build per-model config ─────────────────────────────────────────\r\n const modelsFilter = modelsFlag\r\n ? modelsFlag.split(\",\").map((s) => s.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n // Warn about unknown model names in --models filter\r\n if (modelsFilter) {\r\n const knownNames = new Set(allModels.map((m) => m.name));\r\n for (const name of modelsFilter) {\r\n if (!knownNames.has(name)) {\r\n console.warn(COLORS.yellow(` ⚠ Unknown model name in --models filter: \"${name}\"`));\r\n }\r\n }\r\n }\r\n\r\n const flags: BuildConfigFlags = {\r\n autopilot,\r\n noBulk,\r\n steps: stepsFlag,\r\n modelsFilter,\r\n };\r\n\r\n const modelConfigs: ModelConfig[] = await buildConfig(allModels, flags);\r\n\r\n // ── Step 9: Build GeneratorConfig and run generateAll ─────────────────────\r\n const generatorConfig: GeneratorConfig = {\r\n frontendDir,\r\n schemaPath: resolvedSchemaPath,\r\n framework,\r\n baseUrl,\r\n outputDir,\r\n autopilot,\r\n models: modelConfigs,\r\n staleTime,\r\n gcTime,\r\n noOptimistic,\r\n steps: stepsFlag,\r\n };\r\n\r\n await generateAll(generatorConfig);\r\n\r\n console.log(COLORS.bold(\"\\n Done!\\n\"));\r\n}\r\n","#!/usr/bin/env node\n/**\n * omni-rest CLI\n *\n * Usage:\n * npx omni-rest generate:zod → generates src/schemas.generated.ts\n * npx omni-rest generate:openapi → generates openapi.json\n * npx omni-rest generate → generates both\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { generateZodSchemas } from \"./zod-generator\";\nimport { generateOpenApiSpec } from \"./openapi\";\nimport { run as runFrontendGenerator } from \"./frontend-generator\";\n\nconst args = process.argv.slice(2);\nconst command = args[0] ?? \"generate\";\nconst remainingArgs = args.slice(1);\nconst cwd = process.cwd();\n\nconst COLORS = {\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n};\n\nfunction write(filePath: string, content: string) {\n const abs = path.resolve(cwd, filePath);\n fs.mkdirSync(path.dirname(abs), { recursive: true });\n fs.writeFileSync(abs, content, \"utf-8\");\n console.log(COLORS.green(` ✓ Written: ${filePath}`));\n}\n\n/**\n * Instantiates a PrismaClient from the user's project.\n * Handles both:\n * - Standard Prisma (client in node_modules/@prisma/client or node_modules/.prisma/client)\n * - Prisma 7+ with custom output path in schema.prisma generator block\n */\nfunction createPrismaClient(): any {\n // 1. Try to find a custom output path from schema.prisma\n const customClient = tryLoadFromSchemaOutput();\n if (customClient) return customClient;\n\n // 2. Fall back to resolving @prisma/client from the user's project\n try {\n const clientPath = require.resolve(\"@prisma/client\", { paths: [cwd] });\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { PrismaClient } = require(clientPath);\n return new PrismaClient();\n } catch {\n throw new Error(\n \"[omni-rest] Could not load @prisma/client from your project. \" +\n \"Run `npx prisma generate` first, then try again.\"\n );\n }\n}\n\n/**\n * Reads schema.prisma to find a custom `output` in the generator block,\n * then loads PrismaClient directly from that path.\n * Prisma 7+ requires datasource options in the constructor even for\n * introspection-only use, so we pass a dummy URL — no DB connection is made.\n */\nfunction tryLoadFromSchemaOutput(): any | null {\n const schemaPaths = [\n path.resolve(cwd, \"prisma/schema.prisma\"),\n path.resolve(cwd, \"schema.prisma\"),\n ];\n\n for (const schemaPath of schemaPaths) {\n if (!fs.existsSync(schemaPath)) continue;\n try {\n const schema = fs.readFileSync(schemaPath, \"utf-8\");\n const match = schema.match(/output\\s*=\\s*[\"']([^\"']+)[\"']/);\n if (!match) continue;\n\n const outputDir = path.resolve(path.dirname(schemaPath), match[1]);\n const indexPath = path.join(outputDir, \"index.js\");\n if (!fs.existsSync(indexPath)) continue;\n\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(indexPath);\n const PrismaClient = mod.PrismaClient ?? mod.default?.PrismaClient;\n if (!PrismaClient) continue;\n\n // Detect the datasource provider from schema to build a valid dummy URL\n const providerMatch = schema.match(/provider\\s*=\\s*[\"']([^\"']+)[\"']/);\n const provider = providerMatch?.[1] ?? \"postgresql\";\n const dummyUrl = getDummyUrl(provider);\n\n // Try with datasource URL first (Prisma 7+), fall back to no-arg (Prisma 5)\n try {\n return new PrismaClient({ datasourceUrl: dummyUrl });\n } catch {\n return new PrismaClient();\n }\n } catch {\n continue;\n }\n }\n return null;\n}\n\nfunction getDummyUrl(provider: string): string {\n switch (provider) {\n case \"mysql\": return \"mysql://root:root@localhost:3306/dummy\";\n case \"sqlite\": return \"file:./dummy.db\";\n case \"sqlserver\": return \"sqlserver://localhost:1433;database=dummy;user=sa;password=dummy\";\n case \"mongodb\": return \"mongodb://localhost:27017/dummy\";\n case \"cockroachdb\":return \"postgresql://root@localhost:26257/dummy\";\n default: return \"postgresql://postgres:postgres@localhost:5432/dummy\";\n }\n}\n\nconst USAGE = `\n Usage:\n npx omni-rest generate Generate both Zod schemas and OpenAPI spec\n npx omni-rest generate:zod Generate Zod schemas only\n npx omni-rest generate:openapi Generate OpenAPI spec only\n npx omni-rest generate:frontend Scaffold frontend components from Prisma schema\n`;\n\nasync function run() {\n console.log(COLORS.bold(\"\\n omni-rest generator\\n\"));\n\n if (command === \"generate:frontend\") {\n try {\n await runFrontendGenerator(remainingArgs);\n } catch (e: any) {\n console.error(COLORS.red(` ✗ ${e.message}`));\n process.exit(1);\n }\n return;\n }\n\n if (![\"generate\", \"generate:zod\", \"generate:openapi\"].includes(command)) {\n console.log(USAGE);\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n return;\n }\n\n let prisma: any;\n try {\n prisma = createPrismaClient();\n } catch (e: any) {\n console.error(COLORS.red(` ✗ ${e.message}`));\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n return;\n }\n\n try {\n if (command === \"generate:zod\" || command === \"generate\") {\n try {\n console.log(COLORS.cyan(\" → Generating Zod schemas from Prisma DMMF...\"));\n const code = generateZodSchemas(prisma);\n write(\"src/schemas.generated.ts\", code);\n } catch (e: any) {\n console.error(COLORS.red(` ✗ Zod generation failed: ${e.message}`));\n }\n }\n\n if (command === \"generate:openapi\" || command === \"generate\") {\n try {\n console.log(COLORS.cyan(\" → Generating OpenAPI spec from Prisma DMMF...\"));\n const spec = generateOpenApiSpec(prisma, {\n title: getPackageName(),\n version: getPackageVersion(),\n });\n write(\"openapi.json\", JSON.stringify(spec, null, 2));\n } catch (e: any) {\n console.error(COLORS.red(` ✗ OpenAPI generation failed: ${e.message}`));\n }\n }\n } finally {\n // Always disconnect the Prisma client when done\n await prisma.$disconnect();\n }\n\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n}\n\nfunction getPackageName(): string {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(cwd, \"package.json\"), \"utf-8\")\n );\n return pkg.name ?? \"My API\";\n } catch {\n return \"My API\";\n }\n}\n\nfunction getPackageVersion(): string {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(cwd, \"package.json\"), \"utf-8\")\n );\n return pkg.version ?? \"1.0.0\";\n } catch {\n return \"1.0.0\";\n }\n}\n\nrun().catch((e) => {\n console.error(e);\n process.exit(1);\n});"]}
|
|
1
|
+
{"version":3,"sources":["../src/introspect.ts","../src/zod-generator.ts","../src/openapi.ts","../src/frontend/scan.ts","../src/frontend/schema.ts","../src/frontend/detect.ts","../src/frontend/deps.ts","../src/frontend/prompt.ts","../src/frontend/codegen/hook.ts","../src/frontend/codegen/utils.ts","../src/frontend/codegen/columns.ts","../src/frontend/codegen/table.ts","../src/frontend/codegen/form.ts","../src/frontend/output.ts","../src/frontend-generator.ts","../src/cli.ts"],"names":["path","fs","cwd","path2","fs2","fs3","path3","path4","fs4","resolve","prompt","readline","relationalFields","fs5","path5","path6","readline2","COLORS","run"],"mappings":"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","file":"cli.js","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 { 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 { 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 * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { CandidateFrontend } from \"./types\";\r\n\r\nconst EXCLUDED_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".next\", \"out\"]);\r\n\r\n/**\r\n * Reads and parses a package.json at the given directory.\r\n * Returns null if the file doesn't exist or can't be parsed.\r\n */\r\nfunction readPackageJson(dir: string): Record<string, unknown> | null {\r\n const pkgPath = path.join(dir, \"package.json\");\r\n try {\r\n const content = fs.readFileSync(pkgPath, \"utf-8\");\r\n return JSON.parse(content);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Scores a single directory based on the presence of framework config files\r\n * and react in package.json. Returns a CandidateFrontend or null if score is 0.\r\n */\r\nfunction scoreDir(dir: string, cwd: string): CandidateFrontend | null {\r\n let score = 0;\r\n const signals: string[] = [];\r\n\r\n // Check for next.config.js / next.config.ts\r\n if (\r\n fs.existsSync(path.join(dir, \"next.config.js\")) ||\r\n fs.existsSync(path.join(dir, \"next.config.ts\"))\r\n ) {\r\n score += 10;\r\n const file = fs.existsSync(path.join(dir, \"next.config.js\"))\r\n ? \"next.config.js\"\r\n : \"next.config.ts\";\r\n signals.push(`${file} found`);\r\n }\r\n\r\n // Check for vite.config.ts / vite.config.js\r\n if (\r\n fs.existsSync(path.join(dir, \"vite.config.ts\")) ||\r\n fs.existsSync(path.join(dir, \"vite.config.js\"))\r\n ) {\r\n score += 10;\r\n const file = fs.existsSync(path.join(dir, \"vite.config.ts\"))\r\n ? \"vite.config.ts\"\r\n : \"vite.config.js\";\r\n signals.push(`${file} found`);\r\n }\r\n\r\n // Check package.json for react dependency\r\n const pkg = readPackageJson(dir);\r\n if (pkg) {\r\n const deps = (pkg.dependencies as Record<string, string> | undefined) ?? {};\r\n const devDeps = (pkg.devDependencies as Record<string, string> | undefined) ?? {};\r\n\r\n if (\"react\" in deps) {\r\n score += 5;\r\n signals.push(\"react in dependencies\");\r\n } else if (\"react\" in devDeps) {\r\n score += 3;\r\n signals.push(\"react in devDependencies\");\r\n }\r\n }\r\n\r\n // Bonus for current working directory\r\n if (path.resolve(dir) === path.resolve(cwd)) {\r\n score += 2;\r\n signals.push(\"current working directory\");\r\n }\r\n\r\n if (score === 0) return null;\r\n\r\n return {\r\n dir: path.resolve(dir),\r\n score,\r\n signals,\r\n };\r\n}\r\n\r\n/**\r\n * Recursively walks up to `maxDepth` levels deep from `rootDir`,\r\n * excluding directories in EXCLUDED_DIRS, and collects scored candidates.\r\n */\r\nfunction walk(\r\n dir: string,\r\n cwd: string,\r\n currentDepth: number,\r\n maxDepth: number,\r\n results: Map<string, CandidateFrontend>\r\n): void {\r\n const absDir = path.resolve(dir);\r\n\r\n // Score this directory\r\n const candidate = scoreDir(absDir, cwd);\r\n if (candidate && !results.has(absDir)) {\r\n results.set(absDir, candidate);\r\n }\r\n\r\n if (currentDepth >= maxDepth) return;\r\n\r\n // Recurse into subdirectories\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(absDir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory()) continue;\r\n if (EXCLUDED_DIRS.has(entry.name)) continue;\r\n\r\n walk(path.join(absDir, entry.name), cwd, currentDepth + 1, maxDepth, results);\r\n }\r\n}\r\n\r\n/**\r\n * Walks up to 3 levels deep from `dir`, scores each candidate directory,\r\n * and returns CandidateFrontend[] sorted descending by score (score 0 excluded).\r\n */\r\nexport function scoreCandidates(dir: string): CandidateFrontend[] {\r\n const cwd = process.cwd();\r\n const results = new Map<string, CandidateFrontend>();\r\n\r\n walk(dir, cwd, 0, 3, results);\r\n\r\n return Array.from(results.values()).sort((a, b) => b.score - a.score);\r\n}\r\n\r\n/**\r\n * Public API: scans for frontend directories starting from `dir`.\r\n * Returns CandidateFrontend[] sorted descending by score.\r\n */\r\nexport async function scanForFrontendDir(dir: string): Promise<CandidateFrontend[]> {\r\n return scoreCandidates(dir);\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { ModelMeta } from \"../types\";\r\nimport { getModels } from \"../introspect\";\r\n\r\n/**\r\n * Finds the nearest `schema.prisma` file by walking up from `startDir`.\r\n *\r\n * - If `explicitPath` is provided, verifies it exists and returns it immediately.\r\n * - Otherwise walks up the directory tree until `schema.prisma` is found or root is reached.\r\n *\r\n * Requirements: 2.1, 2.2, 2.3, 2.4, 2.5\r\n */\r\nexport async function findSchema(\r\n startDir: string,\r\n explicitPath?: string\r\n): Promise<string> {\r\n if (explicitPath !== undefined) {\r\n const resolved = path.resolve(explicitPath);\r\n if (!fs.existsSync(resolved)) {\r\n throw new Error(\r\n `[omni-rest] Schema file not found at the specified path: \"${resolved}\"\\n` +\r\n `Please check that the path is correct and the file is readable.`\r\n );\r\n }\r\n return resolved;\r\n }\r\n\r\n let current = path.resolve(startDir);\r\n\r\n while (true) {\r\n const candidate = path.join(current, \"schema.prisma\");\r\n if (fs.existsSync(candidate)) {\r\n return candidate;\r\n }\r\n\r\n const parent = path.dirname(current);\r\n if (parent === current) {\r\n // Reached filesystem root without finding schema.prisma\r\n throw new Error(\r\n `[omni-rest] Could not find \"schema.prisma\" by walking up from \"${startDir}\".\\n` +\r\n `Please run this command from within your Prisma project, or specify the path with --schema <path>.`\r\n );\r\n }\r\n current = parent;\r\n }\r\n}\r\n\r\n/**\r\n * Loads `@prisma/client` from the user's `node_modules` at `prismaClientPath`\r\n * and returns the list of models via `getModels`.\r\n *\r\n * Requirements: 5.1, 5.2, 5.3, 5.4, 5.5\r\n */\r\nexport async function loadDMMF(prismaClientPath: string): Promise<ModelMeta[]> {\r\n let prismaClientModule: any;\r\n\r\n try {\r\n // Use require() to load from the user's node_modules path\r\n prismaClientModule = require(prismaClientPath);\r\n } catch (err) {\r\n throw new Error(\r\n `[omni-rest] Could not load \"@prisma/client\" from \"${prismaClientPath}\".\\n` +\r\n `Please run \"npx prisma generate\" to generate the Prisma client, then try again.`\r\n );\r\n }\r\n\r\n // Extract the Prisma namespace to pass DMMF access to getModels\r\n const prismaNamespace = prismaClientModule?.Prisma ?? prismaClientModule?.default?.Prisma;\r\n\r\n if (!prismaNamespace?.dmmf?.datamodel?.models) {\r\n throw new Error(\r\n `[omni-rest] Could not read DMMF from \"@prisma/client\" at \"${prismaClientPath}\".\\n` +\r\n `Please run \"npx prisma generate\" to regenerate the Prisma client, then try again.`\r\n );\r\n }\r\n\r\n // Temporarily override the Prisma import used by getModels by passing a\r\n // synthetic prisma-like object that exposes _runtimeDataModel from the DMMF.\r\n // getModels() accepts an optional prisma instance; if not provided it falls\r\n // back to the package-level @prisma/client import. Since we want to use the\r\n // user's client, we build a minimal shim.\r\n const dmmfModels: any[] = prismaNamespace.dmmf.datamodel.models;\r\n\r\n // Build a synthetic prisma instance whose _runtimeDataModel mirrors the DMMF\r\n // so that getModels() picks it up via the first branch.\r\n const syntheticPrisma = {\r\n _runtimeDataModel: {\r\n models: Object.fromEntries(\r\n dmmfModels.map((m: any) => [\r\n m.name,\r\n {\r\n fields: m.fields,\r\n },\r\n ])\r\n ),\r\n },\r\n };\r\n\r\n return getModels(syntheticPrisma);\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\ntype Framework = \"nextjs\" | \"vite-react\" | \"react\";\r\n\r\n/**\r\n * Detects the frontend framework used in the given directory.\r\n *\r\n * Priority:\r\n * 1. next.config.js or next.config.ts → \"nextjs\"\r\n * 2. vite.config.ts or vite.config.js (no next config) → \"vite-react\"\r\n * 3. package.json with react in dependencies/devDependencies → \"react\"\r\n * 4. Fallback: prints warning and returns \"react\"\r\n *\r\n * Requirements: 3.1, 3.2, 3.3, 3.4\r\n */\r\nexport function detectFramework(frontendDir: string): Framework {\r\n const hasNextConfig =\r\n fs.existsSync(path.join(frontendDir, \"next.config.js\")) ||\r\n fs.existsSync(path.join(frontendDir, \"next.config.ts\"));\r\n\r\n if (hasNextConfig) return \"nextjs\";\r\n\r\n const hasViteConfig =\r\n fs.existsSync(path.join(frontendDir, \"vite.config.ts\")) ||\r\n fs.existsSync(path.join(frontendDir, \"vite.config.js\"));\r\n\r\n if (hasViteConfig) return \"vite-react\";\r\n\r\n // Check package.json for react dependency\r\n const pkgPath = path.join(frontendDir, \"package.json\");\r\n if (fs.existsSync(pkgPath)) {\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\r\n const deps = pkg.dependencies ?? {};\r\n const devDeps = pkg.devDependencies ?? {};\r\n if (\"react\" in deps || \"react\" in devDeps) {\r\n return \"react\";\r\n }\r\n } catch {\r\n // ignore parse errors\r\n }\r\n }\r\n\r\n console.warn(\r\n `[omni-rest] Warning: Could not detect frontend framework in \"${frontendDir}\". Defaulting to \"react\".`\r\n );\r\n return \"react\";\r\n}\r\n\r\n/**\r\n * Parses a simple .env file and returns a map of key → value.\r\n * Handles KEY=VALUE and KEY=\"VALUE\" formats. Ignores comments and blank lines.\r\n */\r\nfunction parseEnvFile(filePath: string): Map<string, string> {\r\n const result = new Map<string, string>();\r\n let content: string;\r\n try {\r\n content = fs.readFileSync(filePath, \"utf-8\");\r\n } catch {\r\n return result;\r\n }\r\n\r\n for (const line of content.split(\"\\n\")) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n const eqIdx = trimmed.indexOf(\"=\");\r\n if (eqIdx === -1) continue;\r\n const key = trimmed.slice(0, eqIdx).trim();\r\n let value = trimmed.slice(eqIdx + 1).trim();\r\n // Strip surrounding quotes\r\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n }\r\n result.set(key, value);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Resolves the API base URL from environment files.\r\n *\r\n * Priority:\r\n * 1. .env.local → NEXT_PUBLIC_API_URL\r\n * 2. .env → NEXT_PUBLIC_API_URL or VITE_API_URL\r\n * 3. Fallback: \"/api\"\r\n *\r\n * Does NOT modify any env file.\r\n * Requirements: 4.1, 4.2, 4.3, 4.4\r\n */\r\nexport function resolveBaseUrl(frontendDir: string): string {\r\n // 1. Check .env.local for NEXT_PUBLIC_API_URL\r\n const envLocal = parseEnvFile(path.join(frontendDir, \".env.local\"));\r\n if (envLocal.has(\"NEXT_PUBLIC_API_URL\")) {\r\n return envLocal.get(\"NEXT_PUBLIC_API_URL\")!;\r\n }\r\n\r\n // 2. Check .env for NEXT_PUBLIC_API_URL or VITE_API_URL\r\n const env = parseEnvFile(path.join(frontendDir, \".env\"));\r\n if (env.has(\"NEXT_PUBLIC_API_URL\")) {\r\n return env.get(\"NEXT_PUBLIC_API_URL\")!;\r\n }\r\n if (env.has(\"VITE_API_URL\")) {\r\n return env.get(\"VITE_API_URL\")!;\r\n }\r\n\r\n // 3. Default\r\n return \"/api\";\r\n}\r\n\r\n/**\r\n * Resolves the output directory for generated files.\r\n *\r\n * Rules (in priority order):\r\n * 1. If outFlag is provided → path.resolve(frontendDir, outFlag)\r\n * 2. If framework is \"nextjs\" and frontendDir/app/ exists but frontendDir/src/ does not → frontendDir/app/\r\n * 3. Otherwise → frontendDir/src/\r\n *\r\n * Requirements: 13.1, 13.2, 13.3\r\n */\r\nexport function resolveOutputDir(\r\n frontendDir: string,\r\n framework: Framework,\r\n outFlag?: string\r\n): string {\r\n if (outFlag) {\r\n return path.resolve(frontendDir, outFlag);\r\n }\r\n\r\n if (framework === \"nextjs\") {\r\n const appDir = path.join(frontendDir, \"app\");\r\n const srcDir = path.join(frontendDir, \"src\");\r\n if (fs.existsSync(appDir) && !fs.existsSync(srcDir)) {\r\n return path.resolve(frontendDir, \"app\");\r\n }\r\n }\r\n\r\n return path.resolve(frontendDir, \"src\");\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\n\r\nconst BASE_PACKAGES = [\r\n \"@tanstack/react-query\",\r\n \"@tanstack/react-table\",\r\n \"react-hook-form\",\r\n \"zod\",\r\n \"@hookform/resolvers\",\r\n];\r\n\r\nconst FRAMEWORK_PACKAGES: Record<string, string[]> = {\r\n nextjs: [\"next\"],\r\n \"vite-react\": [\"react-router-dom\"],\r\n};\r\n\r\n/**\r\n * Checks that required packages are present in the frontend project's package.json.\r\n *\r\n * Returns an array of missing package names. If package.json cannot be read,\r\n * all required packages are returned as missing.\r\n *\r\n * Requirements: 14.1, 14.2, 14.3, 14.4, 14.5\r\n */\r\nexport function checkDependencies(\r\n frontendDir: string,\r\n framework: \"nextjs\" | \"vite-react\" | \"react\"\r\n): string[] {\r\n const required = [\r\n ...BASE_PACKAGES,\r\n ...(FRAMEWORK_PACKAGES[framework] ?? []),\r\n ];\r\n\r\n const pkgPath = path.join(frontendDir, \"package.json\");\r\n let installed: Set<string>;\r\n\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\r\n const deps = Object.keys(pkg.dependencies ?? {});\r\n const devDeps = Object.keys(pkg.devDependencies ?? {});\r\n installed = new Set([...deps, ...devDeps]);\r\n } catch {\r\n // package.json missing or unreadable — treat all as missing\r\n return required;\r\n }\r\n\r\n return required.filter((pkg) => !installed.has(pkg));\r\n}\r\n","import * as readline from \"readline\";\r\nimport type { ModelMeta, FieldMeta } from \"../types\";\r\nimport type { ModelConfig } from \"./types\";\r\n\r\n// ─── Flags interface ──────────────────────────────────────────────────────────\r\n\r\nexport interface BuildConfigFlags {\r\n autopilot?: boolean;\r\n noBulk?: boolean;\r\n steps?: \"auto\" | \"always\" | \"never\";\r\n modelsFilter?: string[];\r\n}\r\n\r\n// ─── shouldUseMultiStep ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Determines whether a model's form should use multi-step wizard mode.\r\n *\r\n * Rules (Requirements 16.1, 16.2, 16.3):\r\n * - \"always\" → true (regardless of field count)\r\n * - \"never\" → false (regardless of field count)\r\n * - \"auto\" / undefined → true only when fieldCount > 6\r\n */\r\nexport function shouldUseMultiStep(\r\n fieldCount: number,\r\n stepsFlag?: \"auto\" | \"always\" | \"never\"\r\n): boolean {\r\n if (stepsFlag === \"always\") return true;\r\n if (stepsFlag === \"never\") return false;\r\n // \"auto\" or undefined\r\n return fieldCount > 6;\r\n}\r\n\r\n// ─── Field helpers ────────────────────────────────────────────────────────────\r\n\r\nfunction scalarFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter((f) => !f.isRelation);\r\n}\r\n\r\nfunction relationalFields(model: ModelMeta): FieldMeta[] {\r\n return model.fields.filter((f) => f.isRelation);\r\n}\r\n\r\n// ─── Autopilot config ─────────────────────────────────────────────────────────\r\n\r\nfunction buildAutopilotConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): ModelConfig[] {\r\n return models.map((model) => {\r\n const scalars = scalarFields(model).map((f) => f.name);\r\n const relations = relationalFields(model).map((f) => f.name);\r\n const fieldCount = model.fields.length;\r\n\r\n return {\r\n model,\r\n tableFields: scalars,\r\n formFields: scalars,\r\n relationalFields: relations,\r\n bulkDelete: !flags.noBulk,\r\n canExport: true,\r\n multiStep: shouldUseMultiStep(fieldCount, flags.steps),\r\n };\r\n });\r\n}\r\n\r\n// ─── Interactive helpers ──────────────────────────────────────────────────────\r\n\r\nfunction ask(rl: readline.Interface, question: string): Promise<string> {\r\n return new Promise((resolve) => rl.question(question, resolve));\r\n}\r\n\r\n/**\r\n * Presents a numbered list and returns the indices the user selected.\r\n * Input format: \"1,3,5\" or \"1 3 5\" or \"all\" (selects everything).\r\n */\r\nasync function multiSelect(\r\n rl: readline.Interface,\r\n prompt: string,\r\n items: string[]\r\n): Promise<number[]> {\r\n console.log(prompt);\r\n items.forEach((item, i) => console.log(` ${i + 1}. ${item}`));\r\n const answer = await ask(rl, \" Enter numbers (comma/space separated, or 'all'): \");\r\n const trimmed = answer.trim().toLowerCase();\r\n if (trimmed === \"all\" || trimmed === \"\") {\r\n return items.map((_, i) => i);\r\n }\r\n return trimmed\r\n .split(/[\\s,]+/)\r\n .map((s) => parseInt(s, 10) - 1)\r\n .filter((i) => i >= 0 && i < items.length);\r\n}\r\n\r\nasync function yesNo(\r\n rl: readline.Interface,\r\n prompt: string,\r\n defaultYes = true\r\n): Promise<boolean> {\r\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\r\n const answer = await ask(rl, `${prompt} ${hint}: `);\r\n const trimmed = answer.trim().toLowerCase();\r\n if (trimmed === \"\") return defaultYes;\r\n return trimmed === \"y\" || trimmed === \"yes\";\r\n}\r\n\r\n// ─── Interactive config ───────────────────────────────────────────────────────\r\n\r\nasync function buildInteractiveConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): Promise<ModelConfig[]> {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n try {\r\n // Step 1: which models to generate\r\n const modelIndices = await multiSelect(\r\n rl,\r\n \"\\nWhich models do you want to generate? (default: all)\",\r\n models.map((m) => m.name)\r\n );\r\n const selectedModels = modelIndices.map((i) => models[i]);\r\n\r\n const configs: ModelConfig[] = [];\r\n\r\n for (const model of selectedModels) {\r\n console.log(`\\n── Configuring ${model.name} ──`);\r\n\r\n const scalars = scalarFields(model);\r\n const relations = relationalFields(model);\r\n\r\n // Relational fields as searchable-select\r\n let selectedRelations: string[] = relations.map((f) => f.name);\r\n if (relations.length > 0) {\r\n const relIndices = await multiSelect(\r\n rl,\r\n ` Relational fields for ${model.name} (searchable-select dropdowns):`,\r\n relations.map((f) => f.name)\r\n );\r\n selectedRelations = relIndices.map((i) => relations[i].name);\r\n }\r\n\r\n // Scalar fields for table\r\n const tableIndices = await multiSelect(\r\n rl,\r\n ` Scalar fields to show in the table for ${model.name}:`,\r\n scalars.map((f) => f.name)\r\n );\r\n const tableFields = tableIndices.map((i) => scalars[i].name);\r\n\r\n // Scalar fields for form\r\n const formIndices = await multiSelect(\r\n rl,\r\n ` Scalar fields to include in the form for ${model.name}:`,\r\n scalars.map((f) => f.name)\r\n );\r\n const formFields = formIndices.map((i) => scalars[i].name);\r\n\r\n // Bulk delete — CLI flag overrides prompt\r\n const bulkDelete = flags.noBulk\r\n ? false\r\n : await yesNo(rl, ` Enable bulk delete for ${model.name}?`);\r\n\r\n // Export — prompt answer\r\n const canExport = await yesNo(rl, ` Enable CSV/JSON export for ${model.name}?`);\r\n\r\n // Multi-step: if steps flag is set, use it; otherwise prompt only when auto\r\n let multiStep: boolean;\r\n if (flags.steps === \"always\") {\r\n multiStep = true;\r\n } else if (flags.steps === \"never\") {\r\n multiStep = false;\r\n } else {\r\n // auto / undefined — suggest based on field count, let user confirm\r\n const suggested = formFields.length > 6;\r\n multiStep = await yesNo(\r\n rl,\r\n ` Enable multi-step form for ${model.name}?`,\r\n suggested\r\n );\r\n }\r\n\r\n configs.push({\r\n model,\r\n tableFields,\r\n formFields,\r\n relationalFields: selectedRelations,\r\n bulkDelete,\r\n canExport,\r\n multiStep,\r\n });\r\n }\r\n\r\n return configs;\r\n } finally {\r\n rl.close();\r\n }\r\n}\r\n\r\n// ─── Public API ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Builds per-model configuration either from autopilot defaults or interactive prompts.\r\n *\r\n * Requirements: 6.1–6.8, 7.1–7.7\r\n */\r\nexport async function buildConfig(\r\n models: ModelMeta[],\r\n flags: BuildConfigFlags\r\n): Promise<ModelConfig[]> {\r\n // Apply models filter if provided\r\n const filtered =\r\n flags.modelsFilter && flags.modelsFilter.length > 0\r\n ? models.filter((m) => flags.modelsFilter!.includes(m.name))\r\n : models;\r\n\r\n if (flags.autopilot) {\r\n return buildAutopilotConfig(filtered, flags);\r\n }\r\n\r\n return buildInteractiveConfig(filtered, flags);\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `use[Model].ts` TanStack Query hook file.\r\n */\r\nexport function generateHookFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { baseUrl, staleTime, gcTime, noOptimistic } = config;\r\n const { model, bulkDelete } = modelConfig;\r\n const { name, routeName } = model;\r\n\r\n // Capitalise first letter for hook names\r\n const Model = name; // e.g. \"User\"\r\n const models = `${Model}s`; // e.g. \"Users\"\r\n\r\n const lines: string[] = [];\r\n\r\n // Imports\r\n lines.push(`import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";`);\r\n lines.push(`import type { ${Model}, Prisma } from \"@prisma/client\";`);\r\n lines.push(``);\r\n\r\n // Base URL constant\r\n lines.push(`const BASE_URL = \"${baseUrl}\";`);\r\n lines.push(``);\r\n\r\n // ── use[Model]s ──────────────────────────────────────────────────────────\r\n lines.push(`export function use${models}(params?: Record<string, any>) {`);\r\n lines.push(` return useQuery({`);\r\n lines.push(` queryKey: [\"${routeName}\", params],`);\r\n lines.push(` queryFn: () => {`);\r\n lines.push(` const url = new URL(\\`\\${BASE_URL}/${routeName}\\`, window.location.origin);`);\r\n lines.push(` if (params) {`);\r\n lines.push(` Object.entries(params).forEach(([k, v]) => {`);\r\n lines.push(` if (v !== undefined && v !== null) url.searchParams.set(k, String(v));`);\r\n lines.push(` });`);\r\n lines.push(` }`);\r\n lines.push(` return fetch(url.toString()).then((r) => r.json());`);\r\n lines.push(` },`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── use[Model] ───────────────────────────────────────────────────────────\r\n lines.push(`export function use${Model}(id: string) {`);\r\n lines.push(` return useQuery({`);\r\n lines.push(` queryKey: [\"${routeName}\", id],`);\r\n lines.push(` queryFn: () =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`).then((r) => r.json()),`);\r\n lines.push(` staleTime: ${staleTime},`);\r\n lines.push(` gcTime: ${gcTime},`);\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useCreate[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useCreate${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (data: Prisma.${Model}CreateInput) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}\\`, {`);\r\n lines.push(` method: \"POST\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify(data),`);\r\n lines.push(` }).then((r) => r.json()) as Promise<${Model}>,`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (newItem) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: [...(old?.data ?? []), { ...newItem, id: \"__optimistic__\" }],`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useUpdate[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useUpdate${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: ({ id, data }: { id: string; data: Prisma.${Model}UpdateInput }) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`, {`);\r\n lines.push(` method: \"PATCH\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify(data),`);\r\n lines.push(` }).then((r) => r.json()) as Promise<${Model}>,`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async ({ id, data }) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).map((item: any) =>`);\r\n lines.push(` item.id === id ? { ...item, ...data } : item`);\r\n lines.push(` ),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useDelete[Model] ─────────────────────────────────────────────────────\r\n lines.push(`export function useDelete${Model}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (id: string) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}/\\${id}\\`, { method: \"DELETE\" }).then((r) =>`);\r\n lines.push(` r.json()`);\r\n lines.push(` ),`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (id) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).filter((item: any) => item.id !== id),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n // ── useBulkDelete[Model]s ────────────────────────────────────────────────\r\n if (bulkDelete !== false) {\r\n lines.push(`export function useBulkDelete${models}() {`);\r\n lines.push(` const queryClient = useQueryClient();`);\r\n lines.push(` return useMutation({`);\r\n lines.push(` mutationFn: (ids: string[]) =>`);\r\n lines.push(` fetch(\\`\\${BASE_URL}/${routeName}\\`, {`);\r\n lines.push(` method: \"DELETE\",`);\r\n lines.push(` headers: { \"Content-Type\": \"application/json\" },`);\r\n lines.push(` body: JSON.stringify({ ids }),`);\r\n lines.push(` }).then((r) => r.json()),`);\r\n if (!noOptimistic) {\r\n lines.push(` onMutate: async (ids) => {`);\r\n lines.push(` await queryClient.cancelQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` const previous = queryClient.getQueryData([\"${routeName}\"]);`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], (old: any) => ({`);\r\n lines.push(` ...old,`);\r\n lines.push(` data: (old?.data ?? []).filter((item: any) => !ids.includes(item.id)),`);\r\n lines.push(` }));`);\r\n lines.push(` return { previous };`);\r\n lines.push(` },`);\r\n lines.push(` onError: (_err, _vars, ctx) => {`);\r\n lines.push(` queryClient.setQueryData([\"${routeName}\"], ctx?.previous);`);\r\n lines.push(` },`);\r\n lines.push(` onSettled: () => {`);\r\n lines.push(` queryClient.invalidateQueries({ queryKey: [\"${routeName}\"] });`);\r\n lines.push(` },`);\r\n }\r\n lines.push(` });`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { FieldMeta } from \"../../types\";\r\n\r\n/**\r\n * Converts a camelCase string to Title Case with spaces.\r\n * e.g. \"firstName\" → \"First Name\", \"userId\" → \"User Id\"\r\n */\r\nexport function camelToTitle(name: string): string {\r\n // Insert a space before each uppercase letter, then capitalize the first letter\r\n return name\r\n .replace(/([A-Z])/g, \" $1\")\r\n .replace(/^./, (ch) => ch.toUpperCase())\r\n .trim();\r\n}\r\n\r\nconst VALID_FIELD_TYPES = [\r\n \"text\",\r\n \"number\",\r\n \"switch\",\r\n \"date\",\r\n \"textarea\",\r\n \"select\",\r\n \"searchable-select\",\r\n] as const;\r\n\r\nexport type FormFieldType = (typeof VALID_FIELD_TYPES)[number];\r\n\r\n/**\r\n * Maps a DMMF FieldMeta to a FormGenerator field type string.\r\n */\r\nexport function fieldTypeMap(field: FieldMeta): FormFieldType {\r\n if (field.isRelation) return \"searchable-select\";\r\n\r\n switch (field.type) {\r\n case \"String\":\r\n return \"text\";\r\n case \"Int\":\r\n case \"Float\":\r\n case \"Decimal\":\r\n return \"number\";\r\n case \"Boolean\":\r\n return \"switch\";\r\n case \"DateTime\":\r\n return \"date\";\r\n case \"Json\":\r\n return \"textarea\";\r\n default:\r\n // Enum types are not one of the scalar primitives above\r\n // We detect enums by checking if the type starts with an uppercase letter\r\n // and is not a known scalar — treat as \"select\"\r\n if (/^[A-Z]/.test(field.type)) return \"select\";\r\n return \"text\";\r\n }\r\n}\r\n\r\n/**\r\n * Splits a string[] into arrays of at most `maxPerStep` items.\r\n * Number of steps = ceil(fields.length / maxPerStep).\r\n */\r\nexport function chunkFields(fields: string[], maxPerStep = 4): string[][] {\r\n const steps: string[][] = [];\r\n for (let i = 0; i < fields.length; i += maxPerStep) {\r\n steps.push(fields.slice(i, i + maxPerStep));\r\n }\r\n return steps;\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\nimport { camelToTitle } from \"./utils\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Columns.tsx` TanStack Table column definitions file.\r\n */\r\nexport function generateColumnsFile(\r\n _config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { model, tableFields } = modelConfig;\r\n const { name } = model;\r\n\r\n // e.g. \"User\" → \"user\"\r\n const varName = name.charAt(0).toLowerCase() + name.slice(1);\r\n\r\n const lines: string[] = [];\r\n\r\n // Imports\r\n lines.push(`import type { ColumnDef } from \"@tanstack/react-table\";`);\r\n lines.push(`import type { ${name} } from \"@prisma/client\";`);\r\n lines.push(``);\r\n\r\n // Column array\r\n lines.push(`export const ${varName}Columns: ColumnDef<${name}>[] = [`);\r\n\r\n // One entry per selected scalar field\r\n for (const field of tableFields) {\r\n lines.push(` {`);\r\n lines.push(` accessorKey: \"${field}\",`);\r\n lines.push(` header: \"${camelToTitle(field)}\",`);\r\n lines.push(` },`);\r\n }\r\n\r\n // Actions column\r\n lines.push(` {`);\r\n lines.push(` id: \"actions\",`);\r\n lines.push(` header: \"Actions\",`);\r\n lines.push(` cell: ({ row }) => (`);\r\n lines.push(` <div className=\"flex gap-2\">`);\r\n lines.push(` <button onClick={() => row.original && void 0}>Edit</button>`);\r\n lines.push(` <button onClick={() => row.original && void 0}>Delete</button>`);\r\n lines.push(` </div>`);\r\n lines.push(` ),`);\r\n lines.push(` },`);\r\n\r\n lines.push(`];`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Table.tsx` DataTable component file.\r\n */\r\nexport function generateTableFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { framework } = config;\r\n const { model, bulkDelete, canExport } = modelConfig;\r\n const { name } = model;\r\n\r\n // Derived names\r\n const Model = name; // e.g. \"User\"\r\n const models = `${Model}s`; // e.g. \"Users\"\r\n const varName = name.charAt(0).toLowerCase() + name.slice(1); // e.g. \"user\"\r\n\r\n // Hook names\r\n const useListHook = `use${models}`; // e.g. \"useUsers\"\r\n const useDeleteHook = `useDelete${Model}`; // e.g. \"useDeleteUser\"\r\n const useBulkDeleteHook = `useBulkDelete${models}`; // e.g. \"useBulkDeleteUsers\"\r\n\r\n // Column variable name\r\n const columnsVar = `${varName}Columns`; // e.g. \"userColumns\"\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive for Next.js (must be first line)\r\n if (framework === \"nextjs\") {\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n }\r\n\r\n // Imports\r\n lines.push(`import { DataTable } from \"../data-table\";`);\r\n lines.push(`import { ${columnsVar} } from \"./${Model}Columns\";`);\r\n\r\n // Build hook import list\r\n const hookImports: string[] = [useListHook, useDeleteHook];\r\n if (bulkDelete) {\r\n hookImports.push(useBulkDeleteHook);\r\n }\r\n lines.push(`import { ${hookImports.join(\", \")} } from \"../hooks/use${Model}\";`);\r\n lines.push(``);\r\n\r\n // Component\r\n lines.push(`export function ${Model}Table() {`);\r\n lines.push(` const { data } = ${useListHook}();`);\r\n lines.push(` const ${varName}Delete = ${useDeleteHook}();`);\r\n\r\n if (bulkDelete) {\r\n lines.push(` const ${varName}BulkDelete = ${useBulkDeleteHook}();`);\r\n }\r\n\r\n lines.push(``);\r\n lines.push(` return (`);\r\n\r\n // Build DataTable props\r\n const dtProps: string[] = [\r\n ` columns={${columnsVar}}`,\r\n ` data={data?.data ?? []}`,\r\n ` onRowDelete={(row) => ${varName}Delete.mutate(row.id)}`,\r\n ];\r\n\r\n if (bulkDelete) {\r\n dtProps.push(` onMultiDelete={(rows) => ${varName}BulkDelete.mutate(rows.map((r) => r.id))}`);\r\n }\r\n\r\n if (canExport) {\r\n dtProps.push(` canExport={true}`);\r\n }\r\n\r\n lines.push(` <DataTable`);\r\n for (const prop of dtProps) {\r\n lines.push(prop);\r\n }\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import type { GeneratorConfig, ModelConfig } from \"../types\";\r\nimport { camelToTitle, fieldTypeMap, chunkFields } from \"./utils\";\r\n\r\n/**\r\n * Generates the content of a `[Model]Form.tsx` FormGenerator component file.\r\n */\r\nexport function generateFormFile(\r\n config: GeneratorConfig,\r\n modelConfig: ModelConfig\r\n): string {\r\n const { framework } = config;\r\n const { model, formFields, relationalFields, multiStep } = modelConfig;\r\n const { name, fields: allFields } = model;\r\n\r\n const lines: string[] = [];\r\n\r\n // 'use client' directive for Next.js (must be first line)\r\n if (framework === \"nextjs\") {\r\n lines.push(`'use client'`);\r\n lines.push(``);\r\n }\r\n\r\n // Collect relational field metadata: fieldName → relatedModelName\r\n const relationalFieldMeta: Array<{ fieldName: string; relatedModel: string }> = [];\r\n for (const relFieldName of relationalFields) {\r\n const fieldMeta = allFields.find((f) => f.name === relFieldName);\r\n if (fieldMeta) {\r\n relationalFieldMeta.push({\r\n fieldName: relFieldName,\r\n relatedModel: fieldMeta.type, // e.g. \"User\" for a userId relation\r\n });\r\n }\r\n }\r\n\r\n // Imports\r\n lines.push(`import { FormGenerator } from \"../form-generator\";`);\r\n lines.push(`import { ${name}Schema } from \"src/schemas.generated\";`);\r\n lines.push(\r\n `import { useCreate${name}, useUpdate${name} } from \"../hooks/use${name}\";`\r\n );\r\n\r\n // Import use[RelatedModel]s hooks for relational fields\r\n for (const { relatedModel } of relationalFieldMeta) {\r\n lines.push(\r\n `import { use${relatedModel}s } from \"../hooks/use${relatedModel}\";`\r\n );\r\n }\r\n\r\n lines.push(``);\r\n\r\n // Component\r\n lines.push(`export function ${name}Form({ id }: { id?: string }) {`);\r\n lines.push(` const create${name} = useCreate${name}();`);\r\n lines.push(` const update${name} = useUpdate${name}();`);\r\n\r\n // Fetch relational data for searchable-select options\r\n for (const { fieldName, relatedModel } of relationalFieldMeta) {\r\n const varName =\r\n fieldName.charAt(0).toLowerCase() + fieldName.slice(1) + \"Options\";\r\n lines.push(\r\n ` const { data: ${varName}Data } = use${relatedModel}s();`\r\n );\r\n }\r\n\r\n lines.push(``);\r\n\r\n // Build fields array\r\n lines.push(` const fields = [`);\r\n\r\n // Scalar form fields\r\n for (const fieldName of formFields) {\r\n const fieldMeta = allFields.find((f) => f.name === fieldName);\r\n const type = fieldMeta ? fieldTypeMap(fieldMeta) : \"text\";\r\n lines.push(` {`);\r\n lines.push(` name: \"${fieldName}\",`);\r\n lines.push(` label: \"${camelToTitle(fieldName)}\",`);\r\n lines.push(` type: \"${type}\",`);\r\n lines.push(` },`);\r\n }\r\n\r\n // Relational fields as searchable-select\r\n for (const { fieldName, relatedModel } of relationalFieldMeta) {\r\n const varName =\r\n fieldName.charAt(0).toLowerCase() + fieldName.slice(1) + \"Options\";\r\n lines.push(` {`);\r\n lines.push(` name: \"${fieldName}\",`);\r\n lines.push(` label: \"${camelToTitle(fieldName)}\",`);\r\n lines.push(` type: \"searchable-select\",`);\r\n lines.push(\r\n ` options: (${varName}Data?.data ?? []).map((r: any) => ({ label: String(r.name ?? r.id), value: String(r.id) })),`\r\n );\r\n lines.push(` },`);\r\n }\r\n\r\n lines.push(` ];`);\r\n lines.push(``);\r\n\r\n // Build FormGenerator JSX\r\n if (multiStep) {\r\n // Chunk all field names (scalar + relational) into steps\r\n const allFieldNames = [\r\n ...formFields,\r\n ...relationalFieldMeta.map((r) => r.fieldName),\r\n ];\r\n const chunks = chunkFields(allFieldNames, 4);\r\n\r\n lines.push(` const steps = [`);\r\n chunks.forEach((chunk, i) => {\r\n lines.push(` {`);\r\n lines.push(` title: \"Step ${i + 1}\",`);\r\n lines.push(\r\n ` fields: [${chunk.map((f) => `\"${f}\"`).join(\", \")}],`\r\n );\r\n lines.push(` },`);\r\n });\r\n lines.push(` ];`);\r\n lines.push(``);\r\n\r\n lines.push(` return (`);\r\n lines.push(` <FormGenerator`);\r\n lines.push(` fields={fields}`);\r\n lines.push(` schema={${name}Schema}`);\r\n lines.push(\r\n ` onSubmit={(data) => id ? update${name}.mutate({ id, data }) : create${name}.mutate(data)}`\r\n );\r\n lines.push(` steps={steps}`);\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n } else {\r\n lines.push(` return (`);\r\n lines.push(` <FormGenerator`);\r\n lines.push(` fields={fields}`);\r\n lines.push(` schema={${name}Schema}`);\r\n lines.push(\r\n ` onSubmit={(data) => id ? update${name}.mutate({ id, data }) : create${name}.mutate(data)}`\r\n );\r\n lines.push(` />`);\r\n lines.push(` );`);\r\n }\r\n\r\n lines.push(`}`);\r\n lines.push(``);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","import * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport type { FileResult } from \"./types\";\r\n\r\n// ── ANSI colour helpers ───────────────────────────────────────────────────────\r\nconst GREEN = \"\\x1b[32m\";\r\nconst YELLOW = \"\\x1b[33m\";\r\nconst BLUE = \"\\x1b[34m\";\r\nconst RED = \"\\x1b[31m\";\r\nconst RESET = \"\\x1b[0m\";\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// writeFile\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Writes `content` to `destPath`, creating intermediate directories as needed.\r\n * Returns a `FileResult` with:\r\n * - `\"created\"` — file did not exist before\r\n * - `\"overwritten\"` — file already existed and was replaced\r\n * - `\"error\"` — write failed (error attached)\r\n */\r\nexport async function writeFile(destPath: string, content: string): Promise<FileResult> {\r\n let existed = false;\r\n try {\r\n existed = fs.existsSync(destPath);\r\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\r\n fs.writeFileSync(destPath, content, \"utf8\");\r\n return { path: destPath, status: existed ? \"overwritten\" : \"created\" };\r\n } catch (err) {\r\n return { path: destPath, status: \"error\", error: err instanceof Error ? err : new Error(String(err)) };\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// copyBaseComponents\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst BASE_COMPONENTS: Array<{ src: string; dest: string }> = [\r\n { src: \"frontend-next/data-table.tsx\", dest: \"components/data-table.tsx\" },\r\n { src: \"frontend-next/form-generator.tsx\", dest: \"components/form-generator.tsx\" },\r\n];\r\n\r\n/**\r\n * Copies the shared DataTable and FormGenerator source files from `packageRoot`\r\n * into `{outputDir}/components/`.\r\n *\r\n * - If the destination already exists, returns `FileResult` with `\"skipped\"`.\r\n * - Creates intermediate directories as needed.\r\n * - Returns one `FileResult` per file.\r\n */\r\nexport async function copyBaseComponents(outputDir: string, packageRoot: string): Promise<FileResult[]> {\r\n const results: FileResult[] = [];\r\n\r\n for (const { src, dest } of BASE_COMPONENTS) {\r\n const srcPath = path.join(packageRoot, src);\r\n const destPath = path.join(outputDir, dest);\r\n\r\n if (fs.existsSync(destPath)) {\r\n results.push({ path: destPath, status: \"skipped\" });\r\n continue;\r\n }\r\n\r\n try {\r\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\r\n fs.copyFileSync(srcPath, destPath);\r\n results.push({ path: destPath, status: \"created\" });\r\n } catch (err) {\r\n results.push({\r\n path: destPath,\r\n status: \"error\",\r\n error: err instanceof Error ? err : new Error(String(err)),\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// printSummary\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Prints a per-file status line for each `FileResult`, then a final count\r\n * summary line.\r\n *\r\n * Visual indicators:\r\n * created → green ✓\r\n * overwritten → yellow ⚠\r\n * skipped → blue ℹ\r\n * error → red ✗\r\n */\r\nexport function printSummary(results: FileResult[]): void {\r\n for (const r of results) {\r\n switch (r.status) {\r\n case \"created\":\r\n console.log(`${GREEN}✓${RESET} created ${r.path}`);\r\n break;\r\n case \"overwritten\":\r\n console.log(`${YELLOW}⚠${RESET} overwritten ${r.path}`);\r\n break;\r\n case \"skipped\":\r\n console.log(`${BLUE}ℹ${RESET} skipped ${r.path}`);\r\n break;\r\n case \"error\":\r\n console.log(`${RED}✗${RESET} error ${r.path}${r.error ? ` — ${r.error.message}` : \"\"}`);\r\n break;\r\n }\r\n }\r\n\r\n const created = results.filter(r => r.status === \"created\").length;\r\n const overwritten = results.filter(r => r.status === \"overwritten\").length;\r\n const skipped = results.filter(r => r.status === \"skipped\").length;\r\n const errors = results.filter(r => r.status === \"error\").length;\r\n\r\n console.log(\r\n `\\nGenerated ${created} files (${overwritten} overwritten, ${skipped} skipped, ${errors} errors)`\r\n );\r\n}\r\n","import * as path from \"path\";\r\nimport * as readline from \"readline\";\r\n\r\nimport { scanForFrontendDir } from \"./frontend/scan\";\r\nimport { findSchema, loadDMMF } from \"./frontend/schema\";\r\nimport { detectFramework, resolveBaseUrl, resolveOutputDir } from \"./frontend/detect\";\r\nimport { checkDependencies } from \"./frontend/deps\";\r\nimport { buildConfig, type BuildConfigFlags } from \"./frontend/prompt\";\r\nimport { generateHookFile } from \"./frontend/codegen/hook\";\r\nimport { generateColumnsFile } from \"./frontend/codegen/columns\";\r\nimport { generateTableFile } from \"./frontend/codegen/table\";\r\nimport { generateFormFile } from \"./frontend/codegen/form\";\r\nimport { writeFile, copyBaseComponents, printSummary } from \"./frontend/output\";\r\nimport type { GeneratorConfig, ModelConfig, FileResult } from \"./frontend/types\";\r\n\r\n// ── ANSI colour helpers (mirrors src/cli.ts COLORS) ──────────────────────────\r\nconst COLORS = {\r\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\r\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\r\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\r\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\r\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// generateAll\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Orchestrates code generation for all models in `config`.\r\n *\r\n * For each ModelConfig it calls all four codegen functions, writes the\r\n * resulting files, then copies the shared base components and prints a\r\n * summary.\r\n *\r\n * Requirements: 7.2, 7.3, 7.4, 7.5, 7.6, 15.1, 15.2\r\n */\r\nexport async function generateAll(config: GeneratorConfig): Promise<FileResult[]> {\r\n const { outputDir, models } = config;\r\n // packageRoot is the omni-rest package root (one level up from dist/src)\r\n const packageRoot = path.resolve(__dirname, \"..\");\r\n\r\n const results: FileResult[] = [];\r\n\r\n for (const modelConfig of models) {\r\n const { name } = modelConfig.model;\r\n const modelLower = name.charAt(0).toLowerCase() + name.slice(1);\r\n\r\n // 1. Hook file → {outputDir}/hooks/use{Model}.ts\r\n const hookContent = generateHookFile(config, modelConfig);\r\n const hookPath = path.join(outputDir, \"hooks\", `use${name}.ts`);\r\n results.push(await writeFile(hookPath, hookContent));\r\n\r\n // 2. Columns file → {outputDir}/components/{model}/{Model}Columns.tsx\r\n const columnsContent = generateColumnsFile(config, modelConfig);\r\n const columnsPath = path.join(outputDir, \"components\", modelLower, `${name}Columns.tsx`);\r\n results.push(await writeFile(columnsPath, columnsContent));\r\n\r\n // 3. Table file → {outputDir}/components/{model}/{Model}Table.tsx\r\n const tableContent = generateTableFile(config, modelConfig);\r\n const tablePath = path.join(outputDir, \"components\", modelLower, `${name}Table.tsx`);\r\n results.push(await writeFile(tablePath, tableContent));\r\n\r\n // 4. Form file → {outputDir}/components/{model}/{Model}Form.tsx\r\n const formContent = generateFormFile(config, modelConfig);\r\n const formPath = path.join(outputDir, \"components\", modelLower, `${name}Form.tsx`);\r\n results.push(await writeFile(formPath, formContent));\r\n }\r\n\r\n // Copy shared base components\r\n const baseResults = await copyBaseComponents(outputDir, packageRoot);\r\n results.push(...baseResults);\r\n\r\n // Print summary\r\n printSummary(results);\r\n\r\n return results;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// run (top-level async entry point)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst HELP_TEXT = `\r\n Usage: npx omni-rest generate:frontend [options]\r\n\r\n Options:\r\n --schema <path> Path to schema.prisma (default: auto-discover)\r\n --frontend-dir <path> Frontend project root (default: auto-scan)\r\n --out <dir> Output directory relative to frontend-dir (default: src/)\r\n --models <names> Comma-separated model names to generate (default: all)\r\n --autopilot Skip all prompts, use defaults\r\n --no-bulk Disable bulk delete hooks and wiring\r\n --no-optimistic Disable optimistic update patterns\r\n --stale-time <ms> useQuery staleTime (default: 30000)\r\n --gc-time <ms> useQuery gcTime (default: 300000)\r\n --steps <mode> Multi-step form mode: auto | always | never (default: auto)\r\n --help Print this help\r\n`;\r\n\r\n/** Prompts the user for a single line of input. */\r\nfunction prompt(question: string): Promise<string> {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(question, (answer) => {\r\n rl.close();\r\n resolve(answer.trim());\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Top-level async entry point for `generate:frontend`.\r\n *\r\n * Parses flags from `argv`, runs the full pipeline, and calls `generateAll`.\r\n *\r\n * Requirements: 1.1, 2.4, 2.5, 18.1, 18.2, 18.8–18.16\r\n */\r\nexport async function run(argv: string[]): Promise<void> {\r\n // ── Parse flags ────────────────────────────────────────────────────────────\r\n let schemaPath: string | undefined;\r\n let frontendDirFlag: string | undefined;\r\n let outFlag: string | undefined;\r\n let modelsFlag: string | undefined;\r\n let autopilot = false;\r\n let noBulk = false;\r\n let noOptimistic = false;\r\n let staleTime = 30000;\r\n let gcTime = 300000;\r\n let stepsFlag: \"auto\" | \"always\" | \"never\" = \"auto\";\r\n\r\n for (let i = 0; i < argv.length; i++) {\r\n const arg = argv[i];\r\n switch (arg) {\r\n case \"--help\":\r\n console.log(HELP_TEXT);\r\n return;\r\n case \"--schema\":\r\n schemaPath = argv[++i];\r\n break;\r\n case \"--frontend-dir\":\r\n frontendDirFlag = argv[++i];\r\n break;\r\n case \"--out\":\r\n outFlag = argv[++i];\r\n break;\r\n case \"--models\":\r\n modelsFlag = argv[++i];\r\n break;\r\n case \"--autopilot\":\r\n autopilot = true;\r\n break;\r\n case \"--no-bulk\":\r\n noBulk = true;\r\n break;\r\n case \"--no-optimistic\":\r\n noOptimistic = true;\r\n break;\r\n case \"--stale-time\":\r\n staleTime = parseInt(argv[++i], 10) || 30000;\r\n break;\r\n case \"--gc-time\":\r\n gcTime = parseInt(argv[++i], 10) || 300000;\r\n break;\r\n case \"--steps\": {\r\n const val = argv[++i];\r\n if (val === \"always\" || val === \"never\" || val === \"auto\") {\r\n stepsFlag = val;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const cwd = process.cwd();\r\n\r\n console.log(COLORS.bold(\"\\n omni-rest · generate:frontend\\n\"));\r\n\r\n // ── Step 1: Resolve frontendDir ────────────────────────────────────────────\r\n let frontendDir: string;\r\n\r\n if (frontendDirFlag) {\r\n // Requirement 18.1 — use provided path directly\r\n const resolved = require(\"path\").resolve(cwd, frontendDirFlag);\r\n const fs = require(\"fs\") as typeof import(\"fs\");\r\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {\r\n console.error(\r\n COLORS.red(\r\n ` ✗ --frontend-dir path does not exist or is not a directory: \"${resolved}\"`\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n frontendDir = resolved;\r\n } else {\r\n // Requirement 18.3 — scan for candidates\r\n const candidates = await scanForFrontendDir(cwd);\r\n\r\n if (candidates.length === 0) {\r\n // Requirement 18.11 / 18.14\r\n console.error(\r\n COLORS.red(\r\n ` ✗ No frontend project found.\\n` +\r\n ` Scan criteria: next.config.*, vite.config.*, or package.json with react dependency.\\n` +\r\n ` Run from your frontend directory or use --frontend-dir <path>.`\r\n )\r\n );\r\n process.exit(1);\r\n }\r\n\r\n if (autopilot) {\r\n if (candidates.length > 1) {\r\n // Requirement 18.13\r\n console.error(COLORS.red(` ✗ Multiple frontend candidates found. Specify one with --frontend-dir:\\n`));\r\n candidates.forEach((c, i) => console.error(` ${i + 1}. ${c.dir} (score: ${c.score})`));\r\n process.exit(1);\r\n }\r\n // Requirement 18.12 — single candidate, use it\r\n frontendDir = candidates[0].dir;\r\n console.log(COLORS.cyan(` → Using frontend dir: ${frontendDir}`));\r\n } else if (candidates.length === 1) {\r\n // Requirement 18.8 / 18.9 — confirm with user\r\n const answer = await prompt(\r\n ` Frontend dir detected: ${COLORS.bold(candidates[0].dir)}\\n Use this directory? [Y/n]: `\r\n );\r\n if (answer.toLowerCase() === \"n\" || answer.toLowerCase() === \"no\") {\r\n console.log(\" Aborted.\");\r\n return;\r\n }\r\n frontendDir = candidates[0].dir;\r\n } else {\r\n // Requirement 18.10 — multiple candidates, let user pick\r\n console.log(\" Multiple frontend candidates found:\\n\");\r\n candidates.forEach((c, i) => {\r\n console.log(` ${i + 1}. ${c.dir} (score: ${c.score}, signals: ${c.signals.join(\", \")})`);\r\n });\r\n const answer = await prompt(`\\n Select a number [1]: `);\r\n const idx = (parseInt(answer, 10) || 1) - 1;\r\n if (idx < 0 || idx >= candidates.length) {\r\n console.error(COLORS.red(\" ✗ Invalid selection.\"));\r\n process.exit(1);\r\n }\r\n frontendDir = candidates[idx].dir;\r\n }\r\n }\r\n\r\n // ── Step 2: Find schema.prisma ─────────────────────────────────────────────\r\n let resolvedSchemaPath: string;\r\n try {\r\n resolvedSchemaPath = await findSchema(cwd, schemaPath);\r\n console.log(COLORS.cyan(` → Schema: ${resolvedSchemaPath}`));\r\n } catch (err: any) {\r\n console.error(COLORS.red(` ✗ ${err.message}`));\r\n process.exit(1);\r\n }\r\n\r\n // ── Step 3: Load DMMF ──────────────────────────────────────────────────────\r\n const prismaClientPath = path.join(frontendDir, \"node_modules\", \"@prisma\", \"client\");\r\n let allModels;\r\n try {\r\n allModels = await loadDMMF(prismaClientPath);\r\n console.log(COLORS.cyan(` → Found ${allModels.length} model(s): ${allModels.map((m) => m.name).join(\", \")}`));\r\n } catch (err: any) {\r\n console.error(COLORS.red(` ✗ ${err.message}`));\r\n process.exit(1);\r\n }\r\n\r\n // ── Step 4: Detect framework ───────────────────────────────────────────────\r\n const framework = detectFramework(frontendDir);\r\n console.log(COLORS.cyan(` → Framework: ${framework}`));\r\n\r\n // ── Step 5: Resolve base URL ───────────────────────────────────────────────\r\n const baseUrl = resolveBaseUrl(frontendDir);\r\n console.log(COLORS.cyan(` → Base URL: ${baseUrl}`));\r\n\r\n // ── Step 6: Resolve output dir ─────────────────────────────────────────────\r\n const outputDir = resolveOutputDir(frontendDir, framework, outFlag);\r\n console.log(COLORS.cyan(` → Output dir: ${outputDir}`));\r\n\r\n // ── Step 7: Check dependencies ─────────────────────────────────────────────\r\n const missing = checkDependencies(frontendDir, framework);\r\n if (missing.length > 0) {\r\n console.warn(\r\n COLORS.yellow(\r\n ` ⚠ Missing dependencies: ${missing.join(\", \")}\\n` +\r\n ` Install with: npm install ${missing.join(\" \")}`\r\n )\r\n );\r\n }\r\n\r\n // ── Step 8: Build per-model config ─────────────────────────────────────────\r\n const modelsFilter = modelsFlag\r\n ? modelsFlag.split(\",\").map((s) => s.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n // Warn about unknown model names in --models filter\r\n if (modelsFilter) {\r\n const knownNames = new Set(allModels.map((m) => m.name));\r\n for (const name of modelsFilter) {\r\n if (!knownNames.has(name)) {\r\n console.warn(COLORS.yellow(` ⚠ Unknown model name in --models filter: \"${name}\"`));\r\n }\r\n }\r\n }\r\n\r\n const flags: BuildConfigFlags = {\r\n autopilot,\r\n noBulk,\r\n steps: stepsFlag,\r\n modelsFilter,\r\n };\r\n\r\n const modelConfigs: ModelConfig[] = await buildConfig(allModels, flags);\r\n\r\n // ── Step 9: Build GeneratorConfig and run generateAll ─────────────────────\r\n const generatorConfig: GeneratorConfig = {\r\n frontendDir,\r\n schemaPath: resolvedSchemaPath,\r\n framework,\r\n baseUrl,\r\n outputDir,\r\n autopilot,\r\n models: modelConfigs,\r\n staleTime,\r\n gcTime,\r\n noOptimistic,\r\n steps: stepsFlag,\r\n };\r\n\r\n await generateAll(generatorConfig);\r\n\r\n console.log(COLORS.bold(\"\\n Done!\\n\"));\r\n}\r\n","#!/usr/bin/env node\n/**\n * omni-rest CLI\n *\n * Usage:\n * npx omni-rest generate:zod → generates src/schemas.generated.ts\n * npx omni-rest generate:openapi → generates openapi.json\n * npx omni-rest generate → generates both\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { generateZodSchemas } from \"./zod-generator\";\nimport { generateOpenApiSpec } from \"./openapi\";\nimport { run as runFrontendGenerator } from \"./frontend-generator\";\n\nconst args = process.argv.slice(2);\nconst command = args[0] ?? \"generate\";\nconst remainingArgs = args.slice(1);\nconst cwd = process.cwd();\n\nconst COLORS = {\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n};\n\nfunction write(filePath: string, content: string) {\n const abs = path.resolve(cwd, filePath);\n fs.mkdirSync(path.dirname(abs), { recursive: true });\n fs.writeFileSync(abs, content, \"utf-8\");\n console.log(COLORS.green(` ✓ Written: ${filePath}`));\n}\n\n/**\n * Instantiates a PrismaClient from the user's project.\n * Handles both:\n * - Standard Prisma (client in node_modules/@prisma/client or node_modules/.prisma/client)\n * - Prisma 7+ with custom output path in schema.prisma generator block\n */\nfunction createPrismaClient(): any {\n // 1. Try to find a custom output path from schema.prisma\n const customClient = tryLoadFromSchemaOutput();\n if (customClient) return customClient;\n\n // 2. Try the standard .prisma/client path (Prisma 7 default output)\n const standardPrismaClient = tryLoadFromStandardOutput();\n if (standardPrismaClient) return standardPrismaClient;\n\n // 3. Fall back to resolving @prisma/client and extracting/instantiating (Prisma <7)\n try {\n const clientPath = require.resolve(\"@prisma/client\", { paths: [cwd] });\n\n // Try text-based extraction first (no require needed)\n const textResult = extractRuntimeDataModelFromFile(clientPath);\n if (textResult) return textResult;\n\n // Last resort: actually instantiate (requires DB connection)\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require(clientPath);\n const PrismaClient = mod.PrismaClient ?? mod.default?.PrismaClient;\n if (!PrismaClient) throw new Error(\"PrismaClient not found in @prisma/client\");\n return new PrismaClient();\n } catch {\n throw new Error(\n \"[omni-rest] Could not load @prisma/client from your project. \" +\n \"Run `npx prisma generate` first, then try again.\"\n );\n }\n}\n\n/**\n * Reads schema.prisma to find a custom `output` in the generator block,\n * then extracts runtimeDataModel from the generated file as plain text.\n * Returns a fake prisma-like object with _runtimeDataModel populated.\n */\nfunction tryLoadFromSchemaOutput(): any | null {\n const schemaPaths = [\n path.resolve(cwd, \"prisma/schema.prisma\"),\n path.resolve(cwd, \"schema.prisma\"),\n ];\n\n for (const schemaPath of schemaPaths) {\n if (!fs.existsSync(schemaPath)) continue;\n try {\n const schema = fs.readFileSync(schemaPath, \"utf-8\");\n const match = schema.match(/output\\s*=\\s*[\"']([^\"']+)[\"']/);\n if (!match) continue;\n\n const outputDir = path.resolve(path.dirname(schemaPath), match[1]);\n const indexPath = path.join(outputDir, \"index.js\");\n const result = extractRuntimeDataModelFromFile(indexPath);\n if (result) return result;\n } catch {\n continue;\n }\n }\n return null;\n}\n\n/**\n * Tries to extract runtimeDataModel by reading the generated Prisma client\n * source as plain text and regex-extracting the embedded JSON.\n * Works for Prisma 7+ default output (node_modules/.prisma/client/index.js)\n * and any custom output path. No require() needed — no DB connection needed.\n */\nfunction tryLoadFromStandardOutput(): any | null {\n const candidates = [\n path.resolve(cwd, \"node_modules/.prisma/client/index.js\"),\n path.resolve(cwd, \"node_modules/@prisma/client/index.js\"),\n ];\n\n for (const clientPath of candidates) {\n const result = extractRuntimeDataModelFromFile(clientPath);\n if (result) return result;\n }\n return null;\n}\n\n/**\n * Reads a generated Prisma client JS file as text and extracts\n * the runtimeDataModel JSON via regex — no require() needed.\n */\nfunction extractRuntimeDataModelFromFile(filePath: string): any | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const src = fs.readFileSync(filePath, \"utf-8\");\n\n // Prisma 7: config.runtimeDataModel = JSON.parse(\"...\")\n const match = src.match(/config\\.runtimeDataModel\\s*=\\s*JSON\\.parse\\(\"((?:[^\"\\\\]|\\\\.)*)\"\\)/);\n if (match) {\n const json = match[1].replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n const runtimeDataModel = JSON.parse(json);\n if (runtimeDataModel?.models) {\n return { _runtimeDataModel: runtimeDataModel, $disconnect: async () => {} };\n }\n }\n\n // Older Prisma: runtimeDataModel = { models: { ... } } inline object\n const match2 = src.match(/runtimeDataModel\\s*=\\s*(\\{[\\s\\S]*?\"models\"\\s*:\\s*\\{[\\s\\S]*?\\}\\s*\\})/);\n if (match2) {\n try {\n const runtimeDataModel = JSON.parse(match2[1]);\n if (runtimeDataModel?.models) {\n return { _runtimeDataModel: runtimeDataModel, $disconnect: async () => {} };\n }\n } catch { /* not valid JSON, skip */ }\n }\n } catch {\n // ignore read errors\n }\n return null;\n}\n\nfunction getDummyUrl(provider: string): string {\n switch (provider) {\n case \"mysql\": return \"mysql://root:root@localhost:3306/dummy\";\n case \"sqlite\": return \"file:./dummy.db\";\n case \"sqlserver\": return \"sqlserver://localhost:1433;database=dummy;user=sa;password=dummy\";\n case \"mongodb\": return \"mongodb://localhost:27017/dummy\";\n case \"cockroachdb\": return \"postgresql://root@localhost:26257/dummy\";\n default: return \"postgresql://postgres:postgres@localhost:5432/dummy\";\n }\n}\n\nconst USAGE = `\n Usage:\n npx omni-rest generate Generate both Zod schemas and OpenAPI spec\n npx omni-rest generate:zod Generate Zod schemas only\n npx omni-rest generate:openapi Generate OpenAPI spec only\n npx omni-rest generate:frontend Scaffold frontend components from Prisma schema\n`;\n\nasync function run() {\n console.log(COLORS.bold(\"\\n omni-rest generator\\n\"));\n\n if (command === \"generate:frontend\") {\n try {\n await runFrontendGenerator(remainingArgs);\n } catch (e: any) {\n console.error(COLORS.red(` ✗ ${e.message}`));\n process.exit(1);\n }\n return;\n }\n\n if (![\"generate\", \"generate:zod\", \"generate:openapi\"].includes(command)) {\n console.log(USAGE);\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n return;\n }\n\n let prisma: any;\n try {\n prisma = createPrismaClient();\n } catch (e: any) {\n console.error(COLORS.red(` ✗ ${e.message}`));\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n return;\n }\n\n try {\n if (command === \"generate:zod\" || command === \"generate\") {\n try {\n console.log(COLORS.cyan(\" → Generating Zod schemas from Prisma DMMF...\"));\n const code = generateZodSchemas(prisma);\n write(\"src/schemas.generated.ts\", code);\n } catch (e: any) {\n console.error(COLORS.red(` ✗ Zod generation failed: ${e.message}`));\n }\n }\n\n if (command === \"generate:openapi\" || command === \"generate\") {\n try {\n console.log(COLORS.cyan(\" → Generating OpenAPI spec from Prisma DMMF...\"));\n const spec = generateOpenApiSpec(prisma, {\n title: getPackageName(),\n version: getPackageVersion(),\n });\n write(\"openapi.json\", JSON.stringify(spec, null, 2));\n } catch (e: any) {\n console.error(COLORS.red(` ✗ OpenAPI generation failed: ${e.message}`));\n }\n }\n } finally {\n // Always disconnect the Prisma client when done\n await prisma.$disconnect();\n }\n\n console.log(COLORS.bold(\"\\n Done!\\n\"));\n}\n\nfunction getPackageName(): string {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(cwd, \"package.json\"), \"utf-8\")\n );\n return pkg.name ?? \"My API\";\n } catch {\n return \"My API\";\n }\n}\n\nfunction getPackageVersion(): string {\n try {\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(cwd, \"package.json\"), \"utf-8\")\n );\n return pkg.version ?? \"1.0.0\";\n } catch {\n return \"1.0.0\";\n }\n}\n\nrun().catch((e) => {\n console.error(e);\n process.exit(1);\n});"]}
|