@rapidd/build 1.2.3 → 2.0.1
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/README.md +219 -68
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +31 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/src/commands/build.d.ts +17 -0
- package/dist/src/commands/build.d.ts.map +1 -0
- package/dist/src/commands/build.js +236 -0
- package/dist/src/commands/build.js.map +1 -0
- package/dist/src/generators/aclGenerator.d.ts +6 -0
- package/dist/src/generators/aclGenerator.d.ts.map +1 -0
- package/dist/src/generators/aclGenerator.js +384 -0
- package/dist/src/generators/aclGenerator.js.map +1 -0
- package/dist/src/generators/index.d.ts +4 -0
- package/dist/src/generators/index.d.ts.map +1 -0
- package/dist/src/generators/index.js +13 -0
- package/dist/src/generators/index.js.map +1 -0
- package/dist/src/generators/modelGenerator.d.ts +10 -0
- package/dist/src/generators/modelGenerator.d.ts.map +1 -0
- package/dist/src/generators/modelGenerator.js +143 -0
- package/dist/src/generators/modelGenerator.js.map +1 -0
- package/dist/src/generators/routeGenerator.d.ts +10 -0
- package/dist/src/generators/routeGenerator.d.ts.map +1 -0
- package/dist/src/generators/routeGenerator.js +148 -0
- package/dist/src/generators/routeGenerator.js.map +1 -0
- package/dist/src/parsers/datasourceParser.d.ts +11 -0
- package/dist/src/parsers/datasourceParser.d.ts.map +1 -0
- package/dist/src/parsers/datasourceParser.js +131 -0
- package/dist/src/parsers/datasourceParser.js.map +1 -0
- package/dist/src/parsers/deepSQLAnalyzer.d.ts +85 -0
- package/dist/src/parsers/deepSQLAnalyzer.d.ts.map +1 -0
- package/dist/src/parsers/deepSQLAnalyzer.js +482 -0
- package/dist/src/parsers/deepSQLAnalyzer.js.map +1 -0
- package/dist/src/parsers/enhancedRLSConverter.d.ts +14 -0
- package/dist/src/parsers/enhancedRLSConverter.d.ts.map +1 -0
- package/dist/src/parsers/enhancedRLSConverter.js +168 -0
- package/dist/src/parsers/enhancedRLSConverter.js.map +1 -0
- package/dist/src/parsers/functionAnalyzer.d.ts +55 -0
- package/dist/src/parsers/functionAnalyzer.d.ts.map +1 -0
- package/dist/src/parsers/functionAnalyzer.js +274 -0
- package/dist/src/parsers/functionAnalyzer.js.map +1 -0
- package/dist/src/parsers/index.d.ts +13 -0
- package/dist/src/parsers/index.d.ts.map +1 -0
- package/dist/src/parsers/index.js +20 -0
- package/dist/src/parsers/index.js.map +1 -0
- package/dist/src/parsers/prismaFilterBuilder.d.ts +79 -0
- package/dist/src/parsers/prismaFilterBuilder.d.ts.map +1 -0
- package/dist/src/parsers/prismaFilterBuilder.js +322 -0
- package/dist/src/parsers/prismaFilterBuilder.js.map +1 -0
- package/dist/src/parsers/prismaParser.d.ts +14 -0
- package/dist/src/parsers/prismaParser.d.ts.map +1 -0
- package/dist/src/parsers/prismaParser.js +263 -0
- package/dist/src/parsers/prismaParser.js.map +1 -0
- package/package.json +21 -13
- package/bin/cli.js +0 -33
- package/index.js +0 -11
- package/src/commands/build.js +0 -638
- package/src/generators/aclGenerator.js +0 -394
- package/src/generators/modelGenerator.js +0 -174
- package/src/generators/relationshipsGenerator.js +0 -200
- package/src/generators/routeGenerator.js +0 -119
- package/src/parsers/datasourceParser.js +0 -121
- package/src/parsers/deepSQLAnalyzer.js +0 -554
- package/src/parsers/enhancedRLSConverter.js +0 -181
- package/src/parsers/functionAnalyzer.js +0 -302
- package/src/parsers/prismaFilterBuilder.js +0 -422
- 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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"}
|