prismadoc 1.0.30 → 1.0.32

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.
Files changed (2) hide show
  1. package/dist/main.js +44 -10
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -23,13 +23,16 @@ export class DocGen {
23
23
  // fieldFile!: DocGenFile;
24
24
  externalIndexExports = [];
25
25
  async init() {
26
- // Busca e processa schemas externos
26
+ const prismaDataModel = await PrismaUtils.readPrismaFolderDatamodel(PRISMA_DIR);
27
+ const { datamodel } = await getDMMF({ datamodel: prismaDataModel });
28
+ console.log("starting2");
29
+ // Busca e processa schemas externos (precisa do schema principal para resolver tipos)
27
30
  const externalSchemas = await PrismaUtils.fetchExternalSchemas(config.externalPrismaSchemas);
31
+ const mainModelNames = new Set(datamodel.models.map((m) => m.name));
32
+ const mainEnumNames = new Set(datamodel.enums.map((e) => e.name));
28
33
  for (const external of externalSchemas) {
29
- await this.processExternalSchema(external.name, external.prismaSchema);
34
+ await this.processExternalSchema(external.name, external.prismaSchema, prismaDataModel, mainModelNames, mainEnumNames);
30
35
  }
31
- const prismaDataModel = await PrismaUtils.readPrismaFolderDatamodel(PRISMA_DIR);
32
- const { datamodel } = await getDMMF({ datamodel: prismaDataModel });
33
36
  const fieldSet = new Set();
34
37
  for (const model of datamodel.models) {
35
38
  for (const field of model.fields) {
@@ -42,13 +45,44 @@ export class DocGen {
42
45
  });
43
46
  this.build();
44
47
  }
45
- async processExternalSchema(name, prismaSchema) {
46
- const { datamodel } = await getDMMF({ datamodel: prismaSchema });
48
+ /**
49
+ * Tenta getDMMF e, se falhar por tipos não encontrados, remove os campos
50
+ * que referenciam esses tipos e retenta.
51
+ */
52
+ async getDMMFSafe(schema) {
53
+ try {
54
+ return await getDMMF({ datamodel: schema });
55
+ }
56
+ catch (err) {
57
+ const message = err?.message ?? "";
58
+ const missingTypes = [...message.matchAll(/Type "(\w+)" is neither a built-in type/g)].map((m) => m[1]);
59
+ if (missingTypes.length === 0)
60
+ throw err;
61
+ const uniqueTypes = [...new Set(missingTypes)];
62
+ console.log(`⚠️ Removendo campos com tipos externos: ${uniqueTypes.join(", ")}`);
63
+ // Remove linhas que referenciam os tipos desconhecidos
64
+ const typePattern = uniqueTypes.join("|");
65
+ const re = new RegExp(`^\\s+\\w+\\s+(${typePattern})[\\s\\[\\]\\?].*$`, "gm");
66
+ const cleaned = schema.replaceAll(re, "");
67
+ return await getDMMF({ datamodel: cleaned });
68
+ }
69
+ }
70
+ async processExternalSchema(name, prismaSchema, mainPrismaDataModel, mainModelNames, mainEnumNames) {
71
+ // Remove blocos datasource/generator do schema externo para evitar duplicatas
72
+ const cleanedExternal = prismaSchema
73
+ .replaceAll(/datasource\s+\w+\s*\{[^}]*\}/g, "")
74
+ .replaceAll(/generator\s+\w+\s*\{[^}]*\}/g, "");
75
+ // Combina com o schema principal para que o Prisma resolva todos os tipos
76
+ const combined = mainPrismaDataModel + "\n" + cleanedExternal;
77
+ const { datamodel } = await this.getDMMFSafe(combined);
47
78
  const servicePrefix = Helper.toKebab(name);
48
79
  const serviceIndexExports = [];
80
+ // Filtra apenas models e enums do schema externo (ignora os do principal)
81
+ const externalModels = datamodel.models.filter((m) => !mainModelNames.has(m.name));
82
+ const externalEnums = datamodel.enums.filter((e) => !mainEnumNames.has(e.name));
49
83
  // Gerar enums.ts com os enums do schema externo
50
- if (datamodel.enums.length > 0) {
51
- const enumDeclarations = datamodel.enums
84
+ if (externalEnums.length > 0) {
85
+ const enumDeclarations = externalEnums
52
86
  .map((e) => {
53
87
  const values = e.values.map((v) => ` ${v.name} = '${v.name}'`).join(",\n");
54
88
  return `export enum ${e.name} {\n${values}\n}`;
@@ -62,7 +96,7 @@ export class DocGen {
62
96
  });
63
97
  enumFile.save();
64
98
  }
65
- for (const model of datamodel.models) {
99
+ for (const model of externalModels) {
66
100
  const docModel = new DocGenModel(model, servicePrefix);
67
101
  serviceIndexExports.push(...docModel.exports);
68
102
  docModel.save();
@@ -77,7 +111,7 @@ export class DocGen {
77
111
  // Export no index principal: export * as DG_TRANSACTION from './transaction/index'
78
112
  const aliasName = `DG_${name.toUpperCase()}`;
79
113
  this.externalIndexExports.push(`export * as ${aliasName} from './${servicePrefix}/index'`);
80
- console.log(`📦 Gerados ${datamodel.models.length} models para '${name}'.`);
114
+ console.log(`📦 Gerados ${externalModels.length} models para '${name}'.`);
81
115
  }
82
116
  build() {
83
117
  this.generic.build();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prismadoc",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "description": "Auto generates ApiProperties from schema.prisma",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",