UNPKG

prismaql

Version:

A powerful tool for managing and editing Prisma schema files using a SQL-like DSL.

98 lines 4.08 kB
import { handlerResponse } from "../../handler-registries/handler-registry.js"; import { useHelper } from "../../utils/schema-helper.js"; import boxen from "boxen"; import chalk from "chalk"; import Table from "cli-table3"; export const getFields = (prismaState, data) => { const response = handlerResponse(data); const { args } = data; const helper = useHelper(prismaState); const modelName = args?.models?.[0]; if (!modelName) { return response.error("❌ No models specified. Usage: GET FIELDS -> [ModelName]; or GET FIELDS [FieldName], [FieldName2] IN -> [ModelName];"); } const model = helper.getModelByName(modelName); if (!model) { return response.error(`❌ Model ${modelName} not found`); } let fields = helper.getFields(modelName); if (!fields.length) { return response.result(chalk.yellow(`⚠ No fields found in model ${modelName}`)); } const onlyFilters = args?.fields || []; if (onlyFilters.length && !onlyFilters.includes("*")) { fields = fields.filter(field => onlyFilters.includes(field.name)); } if (!fields.length) { return response.result(chalk.yellow(`⚠ No fields found in model ${modelName} that match filters`)); } const idField = fields.find(f => f.attributes?.some(attr => attr.name === "id"))?.name; const table = new Table({ head: [ chalk.bold("Field Name"), chalk.bold("Type"), chalk.bold("Required"), chalk.bold("Array"), chalk.bold("Relation"), chalk.bold("Attributes") ], colWidths: [20, 15, 10, 10, 25, 25], style: { head: ["cyan"] } }); const { relations } = prismaState; let relationFields = 0; fields.forEach((field) => { let name = chalk.greenBright(field.name); const type = chalk.blueBright(field.fieldType); const required = field.optional ? chalk.redBright("No") : chalk.greenBright("Yes"); const array = field.array ? chalk.yellowBright("Yes") : chalk.gray("No"); let hasRelation = field.attributes?.some(attr => attr.name === "relation"); let relation = hasRelation ? chalk.magentaBright("Yes") : chalk.gray("No"); const attrs = ['unique', 'id', 'default']; const attributes = field.attributes?.filter(attr => attrs.includes(attr.name)).map(attr => { if (attrs.includes(attr.name) && Array.isArray(attr.args)) { const arg = attr.args[0]; if ("string" == typeof arg.value) { return `@${attr.name}(${arg.value})`; } if ("object" == typeof arg.value) { return `@${attr.name}(${arg.value.name}())`; } } return `@${attr.name}`; }).join(", ") || chalk.gray("None"); for (const rel of relations) { if (rel.modelName === model.name) { if (rel.fieldName === field.name) { relation = chalk.magentaBright(rel.relationName); hasRelation = true; } if (rel.foreignKey === field.name) { relation = chalk.magenta(`${rel.relationName} (FK)`); } } } if (hasRelation) { relationFields++; } if (field.name == idField) { name = `${chalk.bgGreenBright.black(field.name)} (ID)`; } table.push([name, type, required, array, relation, attributes]); }); const totalFoundFields = fields.length; const statistic = ` 📌Fields in model: ${chalk.bold(modelName)} Total fields found: ${chalk.bold(totalFoundFields)} Fields with relations: ${chalk.bold(relationFields)} `; return response.result(boxen(`${statistic}\n${table.toString()}`, { padding: 1, borderColor: "cyan", title: "Prisma Model Fields", titleAlignment: "center" })); }; //# sourceMappingURL=get-fields.js.map