UNPKG

@stryke/prisma-trpc-generator

Version:

A fork of the prisma-trpc-generator code to work in ESM with Prisma v6.

77 lines (75 loc) 2.99 kB
//#region src/zod/comments-helpers.ts const modelAttributeRegex = /(?:@@Gen\.)+[A-z]+\(.+\)/; const attributeNameRegex = /\.+[A-Z]+\(+/i; const attributeArgsRegex = /\(+[A-Z]+:.+\)/i; function resolveZodModelsComments(models, modelOperations, enumTypes, hiddenModels, hiddenFields) { models = collectHiddenModels(models, hiddenModels); collectHiddenFields(models, hiddenModels, hiddenFields); hideModelOperations(models, modelOperations); hideEnums(enumTypes, hiddenModels); } function collectHiddenModels(models, hiddenModels) { return models.map((model) => { if (model.documentation) { const attribute = model.documentation?.match(modelAttributeRegex)?.[0]; if (attribute?.match(attributeNameRegex)?.[0]?.slice(1, -1) !== "model") return model; const rawAttributeArgs = attribute?.match(attributeArgsRegex)?.[0]?.slice(1, -1); const parsedAttributeArgs = {}; if (rawAttributeArgs) { const rawAttributeArgsParts = rawAttributeArgs.split(":").map((it) => it.trim()).map((part) => part.startsWith("[") ? part : part.split(",")).flat().map((it) => it.trim()); for (let i = 0; i < rawAttributeArgsParts.length; i += 2) { const key = rawAttributeArgsParts[i]; const value = rawAttributeArgsParts[i + 1]; parsedAttributeArgs[key] = JSON.parse(value); } } if (parsedAttributeArgs.hide) { hiddenModels.push(model.name); return null; } } return model; }).filter(Boolean); } function collectHiddenFields(models, hiddenModels, hiddenFields) { models.forEach((model) => { model.fields.forEach((field) => { if (hiddenModels.includes(field.type)) { hiddenFields.push(field.name); if (field.relationFromFields) field.relationFromFields.forEach((item) => hiddenFields.push(item)); } }); }); } function hideEnums(enumTypes, hiddenModels) { enumTypes.prisma = enumTypes.prisma.filter((item) => !hiddenModels.find((model) => item.name.startsWith(model))); } function hideModelOperations(models, modelOperations) { let i = modelOperations.length; while (i >= 0) { --i; const modelOperation = modelOperations[i]; if (modelOperation && !models.find((model) => { return model.name === modelOperation.model; })) modelOperations.splice(i, 1); } } function hideZodInputObjectTypesAndRelatedFields(inputObjectTypes, hiddenModels, hiddenFields) { let j = inputObjectTypes.length; while (j >= 0) { --j; const inputType = inputObjectTypes[j]; if (inputType && (hiddenModels.includes(inputType?.meta?.source) || hiddenModels.find((model) => inputType.name.startsWith(model)))) inputObjectTypes.splice(j, 1); else { let k = inputType?.fields?.length ?? 0; while (k >= 0) { --k; const field = inputType?.fields?.[k]; if (field && hiddenFields.includes(field.name)) inputObjectTypes[j].fields.slice(k, 1); } } } } //#endregion exports.hideZodInputObjectTypesAndRelatedFields = hideZodInputObjectTypesAndRelatedFields; exports.resolveZodModelsComments = resolveZodModelsComments;