@rapidd/build 1.2.3 → 2.0.0

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 (71) hide show
  1. package/README.md +219 -68
  2. package/dist/bin/cli.d.ts +3 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +31 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/index.d.ts +18 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +32 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/src/commands/build.d.ts +17 -0
  11. package/dist/src/commands/build.d.ts.map +1 -0
  12. package/dist/src/commands/build.js +236 -0
  13. package/dist/src/commands/build.js.map +1 -0
  14. package/dist/src/generators/aclGenerator.d.ts +6 -0
  15. package/dist/src/generators/aclGenerator.d.ts.map +1 -0
  16. package/dist/src/generators/aclGenerator.js +384 -0
  17. package/dist/src/generators/aclGenerator.js.map +1 -0
  18. package/dist/src/generators/index.d.ts +4 -0
  19. package/dist/src/generators/index.d.ts.map +1 -0
  20. package/dist/src/generators/index.js +13 -0
  21. package/dist/src/generators/index.js.map +1 -0
  22. package/dist/src/generators/modelGenerator.d.ts +10 -0
  23. package/dist/src/generators/modelGenerator.d.ts.map +1 -0
  24. package/dist/src/generators/modelGenerator.js +143 -0
  25. package/dist/src/generators/modelGenerator.js.map +1 -0
  26. package/dist/src/generators/routeGenerator.d.ts +10 -0
  27. package/dist/src/generators/routeGenerator.d.ts.map +1 -0
  28. package/dist/src/generators/routeGenerator.js +172 -0
  29. package/dist/src/generators/routeGenerator.js.map +1 -0
  30. package/dist/src/parsers/datasourceParser.d.ts +11 -0
  31. package/dist/src/parsers/datasourceParser.d.ts.map +1 -0
  32. package/dist/src/parsers/datasourceParser.js +131 -0
  33. package/dist/src/parsers/datasourceParser.js.map +1 -0
  34. package/dist/src/parsers/deepSQLAnalyzer.d.ts +85 -0
  35. package/dist/src/parsers/deepSQLAnalyzer.d.ts.map +1 -0
  36. package/dist/src/parsers/deepSQLAnalyzer.js +482 -0
  37. package/dist/src/parsers/deepSQLAnalyzer.js.map +1 -0
  38. package/dist/src/parsers/enhancedRLSConverter.d.ts +14 -0
  39. package/dist/src/parsers/enhancedRLSConverter.d.ts.map +1 -0
  40. package/dist/src/parsers/enhancedRLSConverter.js +168 -0
  41. package/dist/src/parsers/enhancedRLSConverter.js.map +1 -0
  42. package/dist/src/parsers/functionAnalyzer.d.ts +55 -0
  43. package/dist/src/parsers/functionAnalyzer.d.ts.map +1 -0
  44. package/dist/src/parsers/functionAnalyzer.js +274 -0
  45. package/dist/src/parsers/functionAnalyzer.js.map +1 -0
  46. package/dist/src/parsers/index.d.ts +13 -0
  47. package/dist/src/parsers/index.d.ts.map +1 -0
  48. package/dist/src/parsers/index.js +20 -0
  49. package/dist/src/parsers/index.js.map +1 -0
  50. package/dist/src/parsers/prismaFilterBuilder.d.ts +79 -0
  51. package/dist/src/parsers/prismaFilterBuilder.d.ts.map +1 -0
  52. package/dist/src/parsers/prismaFilterBuilder.js +322 -0
  53. package/dist/src/parsers/prismaFilterBuilder.js.map +1 -0
  54. package/dist/src/parsers/prismaParser.d.ts +14 -0
  55. package/dist/src/parsers/prismaParser.d.ts.map +1 -0
  56. package/dist/src/parsers/prismaParser.js +263 -0
  57. package/dist/src/parsers/prismaParser.js.map +1 -0
  58. package/package.json +21 -13
  59. package/bin/cli.js +0 -33
  60. package/index.js +0 -11
  61. package/src/commands/build.js +0 -638
  62. package/src/generators/aclGenerator.js +0 -394
  63. package/src/generators/modelGenerator.js +0 -174
  64. package/src/generators/relationshipsGenerator.js +0 -200
  65. package/src/generators/routeGenerator.js +0 -119
  66. package/src/parsers/datasourceParser.js +0 -121
  67. package/src/parsers/deepSQLAnalyzer.js +0 -554
  68. package/src/parsers/enhancedRLSConverter.js +0 -181
  69. package/src/parsers/functionAnalyzer.js +0 -302
  70. package/src/parsers/prismaFilterBuilder.js +0 -422
  71. package/src/parsers/prismaParser.js +0 -287
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ /**
3
+ * Prisma Filter Builder for RLS
4
+ * Generates correct Prisma filter syntax based on schema relationships
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PrismaFilterBuilder = void 0;
8
+ class PrismaFilterBuilder {
9
+ constructor(models, relationships) {
10
+ this.models = models;
11
+ this.relationships = relationships || {};
12
+ // Find the user model
13
+ this.userModel = null;
14
+ this.userModelName = null;
15
+ for (const [modelName, modelInfo] of Object.entries(models)) {
16
+ if (modelName.toLowerCase() === 'user' || modelName.toLowerCase() === 'users') {
17
+ this.userModel = modelInfo;
18
+ this.userModelName = modelName;
19
+ break;
20
+ }
21
+ }
22
+ }
23
+ /**
24
+ * Build a Prisma filter from SQL RLS analysis
25
+ */
26
+ buildFilter(modelName, analysis, userVar = 'user') {
27
+ if (!analysis.filters || analysis.filters.length === 0) {
28
+ return '{}';
29
+ }
30
+ const filters = [];
31
+ for (const filter of analysis.filters) {
32
+ if (filter.type.startsWith('user_') || filter.type.startsWith('session_')) {
33
+ // This is a user field comparison
34
+ const userField = filter.userField || filter.type.replace(/^(user_|session_)/, '');
35
+ // Skip role filters - they're runtime checks, not data filters
36
+ if (filter.type === 'user_role' || userField === 'role') {
37
+ continue;
38
+ }
39
+ const prismaFilter = this.buildUserFieldFilter(modelName, filter.field, userField, userVar);
40
+ if (prismaFilter) {
41
+ filters.push(prismaFilter);
42
+ }
43
+ }
44
+ else {
45
+ // Direct field comparison
46
+ switch (filter.type) {
47
+ case 'equal': {
48
+ const value = isNaN(Number(filter.value)) && filter.value !== 'true' && filter.value !== 'false'
49
+ ? `'${filter.value}'`
50
+ : filter.value;
51
+ filters.push(`{ ${filter.field}: ${value} }`);
52
+ break;
53
+ }
54
+ case 'not_equal':
55
+ filters.push(`{ ${filter.field}: { not: '${filter.value}' } }`);
56
+ break;
57
+ case 'is_null':
58
+ filters.push(`{ ${filter.field}: null }`);
59
+ break;
60
+ case 'not_null':
61
+ filters.push(`{ ${filter.field}: { not: null } }`);
62
+ break;
63
+ case 'in':
64
+ filters.push(`{ ${filter.field}: { in: [${filter.values.join(', ')}] } }`);
65
+ break;
66
+ }
67
+ }
68
+ }
69
+ // Check if there are role conditions
70
+ const hasRoleConditions = analysis.conditions && analysis.conditions.some(c => c.type === 'role_any' || c.type === 'role_equal');
71
+ // If we have role conditions with OR logic, generate conditional filter
72
+ const hasOrLogic = analysis.sql && analysis.sql.includes(' OR ');
73
+ if (hasRoleConditions && hasOrLogic && filters.length > 0) {
74
+ // Generate: if (roleCheck) return {}; else return filter;
75
+ const roleConditions = analysis.conditions.filter(c => c.type === 'role_any' || c.type === 'role_equal');
76
+ const roleChecks = roleConditions.map(c => {
77
+ if (c.type === 'role_any') {
78
+ return `[${c.roles.map(r => `'${r}'`).join(', ')}].includes(${userVar}?.role)`;
79
+ }
80
+ else if (c.type === 'role_equal') {
81
+ return `${userVar}?.role === '${c.role}'`;
82
+ }
83
+ return null;
84
+ }).filter(Boolean);
85
+ const roleCheck = roleChecks.length > 1 ? `(${roleChecks.join(' || ')})` : roleChecks[0];
86
+ const dataFilter = filters.length === 1 ? filters[0] : `{ AND: [${filters.join(', ')}] }`;
87
+ return `if (${roleCheck}) { return {}; } return ${dataFilter};`;
88
+ }
89
+ if (filters.length === 0) {
90
+ return '{}';
91
+ }
92
+ // Deduplicate filters
93
+ const uniqueFilters = [...new Set(filters)];
94
+ if (uniqueFilters.length === 1) {
95
+ return uniqueFilters[0];
96
+ }
97
+ // Check if we need OR or AND
98
+ if (hasOrLogic) {
99
+ return `{ OR: [${uniqueFilters.join(', ')}] }`;
100
+ }
101
+ return `{ AND: [${uniqueFilters.join(', ')}] }`;
102
+ }
103
+ /**
104
+ * Build filter for user field comparison (handles relationships)
105
+ */
106
+ buildUserFieldFilter(modelName, fieldName, userField, userVar) {
107
+ const modelInfo = this.models[modelName];
108
+ if (!modelInfo)
109
+ return null;
110
+ // Check if this field exists directly in the model
111
+ const field = modelInfo.fields[fieldName];
112
+ if (field && !field.isRelation) {
113
+ // Direct field comparison
114
+ const userFieldPath = this.convertToUserFieldPath(userField, userVar);
115
+ return `{ ${fieldName}: ${userFieldPath} }`;
116
+ }
117
+ // Check if this is a relationship check
118
+ const modelRelations = this.relationships[modelName] || {};
119
+ // First pass: Look for junction table relationships (prioritize these)
120
+ for (const [relationName, relationInfo] of Object.entries(modelRelations)) {
121
+ const relatedModel = this.models[relationInfo.object];
122
+ if (!relatedModel)
123
+ continue;
124
+ // Prioritize many-to-many through junction table
125
+ if (relationInfo.fields && relationInfo.fields.length > 1) {
126
+ if (relationInfo.fields.includes(fieldName)) {
127
+ const userFieldPath = this.convertToUserFieldPath(userField, userVar);
128
+ return this.buildRelationFilter(relationName, relationInfo, fieldName, userFieldPath);
129
+ }
130
+ }
131
+ }
132
+ // Second pass: Look for regular relationships
133
+ for (const [relationName, relationInfo] of Object.entries(modelRelations)) {
134
+ const relatedModel = this.models[relationInfo.object];
135
+ if (!relatedModel)
136
+ continue;
137
+ // Check if the related model has this field
138
+ if (relatedModel.fields[fieldName] && !relatedModel.fields[fieldName].isRelation) {
139
+ const userFieldPath = this.convertToUserFieldPath(userField, userVar);
140
+ return this.buildRelationFilter(relationName, relationInfo, fieldName, userFieldPath);
141
+ }
142
+ }
143
+ // Fallback: direct comparison
144
+ const userFieldPath = this.convertToUserFieldPath(userField, userVar);
145
+ return `{ ${fieldName}: ${userFieldPath} }`;
146
+ }
147
+ /**
148
+ * Convert user field to proper path
149
+ */
150
+ convertToUserFieldPath(userField, userVar) {
151
+ // Special case for 'id'
152
+ if (userField === 'id') {
153
+ return `${userVar}?.id`;
154
+ }
155
+ // Check if user model actually has this field
156
+ if (this.userModel && this.userModel.fields) {
157
+ const userHasField = this.userModel.fields[userField];
158
+ if (userHasField && !userHasField.isRelation) {
159
+ // User has this field directly - use it
160
+ return `${userVar}?.${userField}`;
161
+ }
162
+ }
163
+ // User doesn't have this field - check if it's a relation pattern
164
+ if (userField.endsWith('_id')) {
165
+ // Extract the relation name (e.g., 'student_id' -> 'student')
166
+ const relationName = userField.slice(0, -3);
167
+ // Check if user has this relation
168
+ if (this.userModel && this.userModel.fields) {
169
+ const userHasRelation = this.userModel.fields[relationName];
170
+ if (userHasRelation && userHasRelation.isRelation) {
171
+ // User has this relation - use relation path
172
+ return `${userVar}.${relationName}?.id`;
173
+ }
174
+ }
175
+ // Assume it's a relation even if we can't verify
176
+ return `${userVar}.${relationName}?.id`;
177
+ }
178
+ // Default: direct field access
179
+ return `${userVar}?.${userField}`;
180
+ }
181
+ /**
182
+ * Build Prisma relation filter
183
+ */
184
+ buildRelationFilter(relationName, relationInfo, fieldName, value) {
185
+ const relatedModel = this.models[relationInfo.object];
186
+ if (!relatedModel) {
187
+ return `{ ${relationName}: { some: { ${fieldName}: ${value} } } }`;
188
+ }
189
+ // Check if related model is a junction table (has composite key)
190
+ const isJunctionTable = relationInfo.fields && relationInfo.fields.length > 1;
191
+ if (isJunctionTable) {
192
+ return `{ ${relationName}: { some: { ${fieldName}: ${value} } } }`;
193
+ }
194
+ // One-to-many or one-to-one
195
+ if (relationName.endsWith('s') || relationInfo.fields) {
196
+ return `{ ${relationName}: { some: { ${fieldName}: ${value} } } }`;
197
+ }
198
+ // Singular relation (one-to-one or many-to-one)
199
+ return `{ ${relationName}: { ${fieldName}: ${value} } }`;
200
+ }
201
+ /**
202
+ * Infer relation type from model data
203
+ */
204
+ inferRelationType(modelInfo, relationName) {
205
+ if (!modelInfo || !modelInfo.relations)
206
+ return 'one';
207
+ const relation = modelInfo.relations.find(r => r.name === relationName);
208
+ return relation && relation.isArray ? 'many' : 'one';
209
+ }
210
+ /**
211
+ * Build JavaScript equivalent of Prisma filter (for hasAccess)
212
+ */
213
+ buildJavaScriptCondition(modelName, analysis, dataVar = 'data', userVar = 'user') {
214
+ const conditions = [];
215
+ for (const filter of analysis.filters) {
216
+ if (filter.type.startsWith('user_') || filter.type.startsWith('session_')) {
217
+ const userField = filter.userField || filter.type.replace(/^(user_|session_)/, '');
218
+ // Skip role filters - they're handled in conditions section
219
+ if (filter.type === 'user_role' || userField === 'role') {
220
+ continue;
221
+ }
222
+ const jsCondition = this.buildUserFieldJavaScript(modelName, filter.field, userField, dataVar, userVar);
223
+ if (jsCondition) {
224
+ conditions.push(jsCondition);
225
+ }
226
+ }
227
+ else {
228
+ // Direct field comparison
229
+ switch (filter.type) {
230
+ case 'equal': {
231
+ const value = isNaN(Number(filter.value)) && filter.value !== 'true' && filter.value !== 'false'
232
+ ? `'${filter.value}'`
233
+ : filter.value;
234
+ conditions.push(`${dataVar}?.${filter.field} === ${value}`);
235
+ break;
236
+ }
237
+ }
238
+ }
239
+ }
240
+ // Add condition-based checks (roles, etc.)
241
+ if (analysis.conditions && analysis.conditions.length > 0) {
242
+ for (const condition of analysis.conditions) {
243
+ if (condition.javascript) {
244
+ // Replace user placeholder with actual variable
245
+ const jsCondition = condition.javascript.replace(/user/g, userVar);
246
+ conditions.push(jsCondition);
247
+ }
248
+ else if (condition.type === 'role_any') {
249
+ conditions.push(`[${condition.roles.map(r => `'${r}'`).join(', ')}].includes(${userVar}?.role)`);
250
+ }
251
+ else if (condition.type === 'role_equal') {
252
+ conditions.push(`${userVar}?.role === '${condition.role}'`);
253
+ }
254
+ }
255
+ }
256
+ if (conditions.length === 0)
257
+ return 'true';
258
+ // Deduplicate conditions
259
+ const uniqueConditions = [...new Set(conditions)];
260
+ if (uniqueConditions.length === 1)
261
+ return uniqueConditions[0];
262
+ // Check if we need OR or AND
263
+ const hasOrLogic = analysis.sql && analysis.sql.includes(' OR ');
264
+ if (hasOrLogic) {
265
+ return uniqueConditions.join(' || ');
266
+ }
267
+ return '(' + uniqueConditions.join(' && ') + ')';
268
+ }
269
+ /**
270
+ * Build JavaScript condition for user field (handles relations)
271
+ */
272
+ buildUserFieldJavaScript(modelName, fieldName, userField, dataVar, userVar) {
273
+ const modelInfo = this.models[modelName];
274
+ if (!modelInfo)
275
+ return null;
276
+ // Check if this field exists directly in the model
277
+ const field = modelInfo.fields[fieldName];
278
+ if (field && !field.isRelation) {
279
+ // Direct field comparison
280
+ const userFieldPath = this.convertToUserFieldPath(userField, userVar);
281
+ return `${dataVar}?.${fieldName} === ${userFieldPath}`;
282
+ }
283
+ // Field doesn't exist directly - check relationships
284
+ const modelRelations = this.relationships[modelName] || {};
285
+ // First pass: Look for junction table relationships (prioritize these)
286
+ for (const [relationName, relationInfo] of Object.entries(modelRelations)) {
287
+ const relatedModel = this.models[relationInfo.object];
288
+ if (!relatedModel)
289
+ continue;
290
+ // Prioritize many-to-many through junction table
291
+ if (relationInfo.fields && relationInfo.fields.length > 1) {
292
+ if (relationInfo.fields.includes(fieldName)) {
293
+ const userFieldPath = this.convertToUserFieldPath(userField, userVar);
294
+ return `${dataVar}?.${relationName}?.find(item => item.${fieldName} === ${userFieldPath})`;
295
+ }
296
+ }
297
+ }
298
+ // Second pass: Look for regular relationships
299
+ for (const [relationName, relationInfo] of Object.entries(modelRelations)) {
300
+ const relatedModel = this.models[relationInfo.object];
301
+ if (!relatedModel)
302
+ continue;
303
+ // Check if the related model has this field
304
+ if (relatedModel.fields[fieldName] && !relatedModel.fields[fieldName].isRelation) {
305
+ const userFieldPath = this.convertToUserFieldPath(userField, userVar);
306
+ // Check if this is an array relation (1:n or n:m)
307
+ if (relationName.endsWith('s') || (relationInfo.fields && relationInfo.fields.length > 1)) {
308
+ return `${dataVar}?.${relationName}?.find(item => item.${fieldName} === ${userFieldPath})`;
309
+ }
310
+ else {
311
+ return `${dataVar}?.${relationName}?.${fieldName} === ${userFieldPath}`;
312
+ }
313
+ }
314
+ }
315
+ // Fallback: direct comparison
316
+ const userFieldPath = this.convertToUserFieldPath(userField, userVar);
317
+ return `${dataVar}?.${fieldName} === ${userFieldPath}`;
318
+ }
319
+ }
320
+ exports.PrismaFilterBuilder = PrismaFilterBuilder;
321
+ exports.default = PrismaFilterBuilder;
322
+ //# sourceMappingURL=prismaFilterBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prismaFilterBuilder.js","sourceRoot":"","sources":["../../../src/parsers/prismaFilterBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ModelInfo } from './prismaFilterBuilder';
2
+ export interface ParsedSchema {
3
+ models: Record<string, ModelInfo>;
4
+ enums: Record<string, string[]>;
5
+ }
6
+ /**
7
+ * Parse Prisma schema file and extract model information
8
+ */
9
+ export declare function parsePrismaSchema(schemaPath: string): ParsedSchema;
10
+ /**
11
+ * Use Prisma's DMMF (Data Model Meta Format) to get model information
12
+ */
13
+ export declare function parsePrismaDMMF(schemaPath: string): Promise<ParsedSchema | null>;
14
+ //# sourceMappingURL=prismaParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prismaParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/prismaParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAA6B,MAAM,uBAAuB,CAAC;AAElF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACjC;AA8BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAqClE;AAuHD;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAqEtF"}
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parsePrismaSchema = parsePrismaSchema;
37
+ exports.parsePrismaDMMF = parsePrismaDMMF;
38
+ const fs = __importStar(require("fs"));
39
+ /**
40
+ * Extract blocks (model or enum) with proper brace matching
41
+ */
42
+ function extractBlocks(content, keyword) {
43
+ const blocks = [];
44
+ const regex = new RegExp(`${keyword}\\s+(\\w+)\\s*{`, 'g');
45
+ let match;
46
+ while ((match = regex.exec(content)) !== null) {
47
+ const name = match[1];
48
+ const startIndex = match.index + match[0].length;
49
+ let braceCount = 1;
50
+ let endIndex = startIndex;
51
+ // Find matching closing brace
52
+ while (braceCount > 0 && endIndex < content.length) {
53
+ if (content[endIndex] === '{')
54
+ braceCount++;
55
+ if (content[endIndex] === '}')
56
+ braceCount--;
57
+ endIndex++;
58
+ }
59
+ const body = content.substring(startIndex, endIndex - 1);
60
+ blocks.push({ name, body });
61
+ }
62
+ return blocks;
63
+ }
64
+ /**
65
+ * Parse Prisma schema file and extract model information
66
+ */
67
+ function parsePrismaSchema(schemaPath) {
68
+ const schemaContent = fs.readFileSync(schemaPath, 'utf-8');
69
+ const models = {};
70
+ // Extract models with proper brace matching
71
+ const modelBlocks = extractBlocks(schemaContent, 'model');
72
+ for (const { name, body } of modelBlocks) {
73
+ const fields = parseModelFields(body);
74
+ const compositeKeyFields = parseCompositeKey(body);
75
+ const dbName = parseMapDirective(body);
76
+ // Mark composite key fields with isId
77
+ if (compositeKeyFields) {
78
+ for (const fieldName of compositeKeyFields) {
79
+ if (fields[fieldName]) {
80
+ fields[fieldName].isId = true;
81
+ }
82
+ }
83
+ }
84
+ models[name] = {
85
+ name,
86
+ fields,
87
+ relations: parseModelRelations(body),
88
+ compositeKey: compositeKeyFields,
89
+ dbName: dbName || name.toLowerCase() // Default to lowercase model name
90
+ };
91
+ }
92
+ // Extract enums
93
+ const enums = {};
94
+ const enumBlocks = extractBlocks(schemaContent, 'enum');
95
+ for (const { name, body } of enumBlocks) {
96
+ enums[name] = parseEnumValues(body);
97
+ }
98
+ return { models, enums };
99
+ }
100
+ /**
101
+ * Parse composite key from @@id directive
102
+ */
103
+ function parseCompositeKey(modelBody) {
104
+ const lines = modelBody.split('\n').map(line => line.trim());
105
+ for (const line of lines) {
106
+ // Match @@id([field1, field2, ...])
107
+ const match = line.match(/^@@id\(\[([^\]]+)\]\)/);
108
+ if (match) {
109
+ const fieldsStr = match[1];
110
+ return fieldsStr.split(',').map(f => f.trim());
111
+ }
112
+ }
113
+ return null;
114
+ }
115
+ /**
116
+ * Parse @@map directive to get database table name
117
+ */
118
+ function parseMapDirective(modelBody) {
119
+ const lines = modelBody.split('\n').map(line => line.trim());
120
+ for (const line of lines) {
121
+ // Match @@map("table_name") or @@map('table_name')
122
+ const match = line.match(/^@@map\(["']([^"']+)["']\)/);
123
+ if (match) {
124
+ return match[1];
125
+ }
126
+ }
127
+ return null;
128
+ }
129
+ /**
130
+ * Parse model fields from model body
131
+ */
132
+ function parseModelFields(modelBody) {
133
+ const fields = {};
134
+ const lines = modelBody.split('\n').map(line => line.trim()).filter(line => line && !line.startsWith('@@'));
135
+ for (const line of lines) {
136
+ // Skip relation fields and index definitions
137
+ if (line.startsWith('//') || line.startsWith('@@'))
138
+ continue;
139
+ // Match field definition: fieldName Type modifiers
140
+ const fieldMatch = line.match(/^(\w+)\s+(\w+)(\?|\[\])?\s*(.*)?$/);
141
+ if (fieldMatch) {
142
+ const [, fieldName, fieldType, modifier, attributes] = fieldMatch;
143
+ // Determine if it's a relation field (starts with uppercase)
144
+ const isRelation = fieldType[0] === fieldType[0].toUpperCase() &&
145
+ !['String', 'Int', 'Float', 'Boolean', 'DateTime', 'Decimal', 'Json', 'Bytes'].includes(fieldType);
146
+ fields[fieldName] = {
147
+ type: fieldType,
148
+ optional: modifier === '?',
149
+ isArray: modifier === '[]',
150
+ isRelation: isRelation,
151
+ attributes: attributes || ''
152
+ };
153
+ }
154
+ }
155
+ return fields;
156
+ }
157
+ /**
158
+ * Parse model relations
159
+ */
160
+ function parseModelRelations(modelBody) {
161
+ const relations = [];
162
+ const lines = modelBody.split('\n').map(line => line.trim()).filter(line => line);
163
+ for (const line of lines) {
164
+ if (line.startsWith('//') || line.startsWith('@@'))
165
+ continue;
166
+ const fieldMatch = line.match(/^(\w+)\s+(\w+)(\?|\[\])?\s*(.*)?$/);
167
+ if (fieldMatch) {
168
+ const [, fieldName, fieldType, modifier] = fieldMatch;
169
+ // Check if it's a relation (not a Prisma scalar type)
170
+ const scalarTypes = ['String', 'Int', 'Float', 'Boolean', 'DateTime', 'Decimal', 'Json', 'Bytes', 'BigInt'];
171
+ const isRelation = !scalarTypes.includes(fieldType);
172
+ if (isRelation) {
173
+ relations.push({
174
+ name: fieldName,
175
+ type: fieldType,
176
+ isArray: modifier === '[]',
177
+ optional: modifier === '?'
178
+ });
179
+ }
180
+ }
181
+ }
182
+ return relations;
183
+ }
184
+ /**
185
+ * Parse enum values
186
+ */
187
+ function parseEnumValues(enumBody) {
188
+ const values = [];
189
+ const lines = enumBody.split('\n').map(line => line.trim()).filter(line => line && !line.startsWith('//'));
190
+ for (const line of lines) {
191
+ const valueMatch = line.match(/^(\w+)/);
192
+ if (valueMatch) {
193
+ values.push(valueMatch[1]);
194
+ }
195
+ }
196
+ return values;
197
+ }
198
+ /**
199
+ * Use Prisma's DMMF (Data Model Meta Format) to get model information
200
+ */
201
+ async function parsePrismaDMMF(schemaPath) {
202
+ try {
203
+ // In Prisma 7, DMMF is no longer exposed on the client
204
+ // We need to use getDMMF from @prisma/internals instead
205
+ const { getDMMF } = require('@prisma/internals');
206
+ // Read the schema file
207
+ const schemaContent = fs.readFileSync(schemaPath, 'utf-8');
208
+ // Get DMMF from the schema
209
+ const dmmf = await getDMMF({
210
+ datamodel: schemaContent
211
+ });
212
+ const models = {};
213
+ for (const model of dmmf.datamodel.models) {
214
+ // Extract composite key if present
215
+ const compositeKey = model.primaryKey && model.primaryKey.fields && model.primaryKey.fields.length > 1
216
+ ? model.primaryKey.fields
217
+ : null;
218
+ models[model.name] = {
219
+ name: model.name,
220
+ fields: {},
221
+ relations: [],
222
+ compositeKey,
223
+ dbName: model.dbName || model.name.toLowerCase() // Use dbName from DMMF or default to lowercase
224
+ };
225
+ for (const field of model.fields) {
226
+ models[model.name].fields[field.name] = {
227
+ type: field.type,
228
+ optional: !field.isRequired,
229
+ isArray: field.isList,
230
+ isRelation: field.kind === 'object',
231
+ isId: field.isId || false,
232
+ isUnique: field.isUnique || false,
233
+ isUpdatedAt: field.isUpdatedAt || false,
234
+ hasDefaultValue: field.hasDefaultValue || false
235
+ };
236
+ if (field.kind === 'object') {
237
+ models[model.name].relations.push({
238
+ name: field.name,
239
+ type: field.type,
240
+ isArray: field.isList,
241
+ optional: !field.isRequired,
242
+ relationName: field.relationName,
243
+ relationFromFields: field.relationFromFields || [],
244
+ relationToFields: field.relationToFields || [],
245
+ kind: field.kind
246
+ });
247
+ // Also add these to the field object for consistency
248
+ models[model.name].fields[field.name].relationName = field.relationName;
249
+ models[model.name].fields[field.name].relationFromFields = field.relationFromFields || [];
250
+ models[model.name].fields[field.name].relationToFields = field.relationToFields || [];
251
+ models[model.name].fields[field.name].kind = field.kind;
252
+ }
253
+ }
254
+ }
255
+ return { models, enums: dmmf.datamodel.enums };
256
+ }
257
+ catch (error) {
258
+ console.warn('Could not use getDMMF from @prisma/internals, falling back to schema parsing');
259
+ console.warn('Error:', error.message);
260
+ return null;
261
+ }
262
+ }
263
+ //# sourceMappingURL=prismaParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prismaParser.js","sourceRoot":"","sources":["../../../src/parsers/prismaParser.ts"],"names":[],"mappings":"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"}