@rapidd/build 2.0.3 → 2.1.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.
- package/README.md +26 -165
- package/dist/bin/cli.js +0 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/index.d.ts +2 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -12
- package/dist/index.js.map +1 -1
- package/dist/src/commands/build.d.ts +1 -3
- package/dist/src/commands/build.d.ts.map +1 -1
- package/dist/src/commands/build.js +1 -106
- package/dist/src/commands/build.js.map +1 -1
- package/dist/src/generators/aclGenerator.d.ts +2 -2
- package/dist/src/generators/aclGenerator.d.ts.map +1 -1
- package/dist/src/generators/aclGenerator.js +11 -304
- package/dist/src/generators/aclGenerator.js.map +1 -1
- package/dist/src/generators/modelGenerator.d.ts +1 -1
- package/dist/src/generators/modelGenerator.d.ts.map +1 -1
- package/dist/src/generators/modelGenerator.js +46 -16
- package/dist/src/generators/modelGenerator.js.map +1 -1
- package/dist/src/generators/routeGenerator.d.ts +1 -1
- package/dist/src/generators/routeGenerator.d.ts.map +1 -1
- package/dist/src/generators/routeGenerator.js +6 -2
- package/dist/src/generators/routeGenerator.js.map +1 -1
- package/dist/src/parsers/index.d.ts +1 -10
- package/dist/src/parsers/index.d.ts.map +1 -1
- package/dist/src/parsers/index.js +1 -14
- package/dist/src/parsers/index.js.map +1 -1
- package/dist/src/parsers/prismaParser.d.ts +1 -1
- package/dist/src/parsers/prismaParser.d.ts.map +1 -1
- package/dist/src/parsers/prismaParser.js +7 -7
- package/dist/src/parsers/prismaParser.js.map +1 -1
- package/dist/src/parsers/types.d.ts +33 -0
- package/dist/src/parsers/types.d.ts.map +1 -0
- package/dist/src/parsers/types.js +3 -0
- package/dist/src/parsers/types.js.map +1 -0
- package/package.json +14 -19
- package/dist/src/parsers/datasourceParser.d.ts +0 -11
- package/dist/src/parsers/datasourceParser.d.ts.map +0 -1
- package/dist/src/parsers/datasourceParser.js +0 -131
- package/dist/src/parsers/datasourceParser.js.map +0 -1
- package/dist/src/parsers/deepSQLAnalyzer.d.ts +0 -85
- package/dist/src/parsers/deepSQLAnalyzer.d.ts.map +0 -1
- package/dist/src/parsers/deepSQLAnalyzer.js +0 -482
- package/dist/src/parsers/deepSQLAnalyzer.js.map +0 -1
- package/dist/src/parsers/enhancedRLSConverter.d.ts +0 -14
- package/dist/src/parsers/enhancedRLSConverter.d.ts.map +0 -1
- package/dist/src/parsers/enhancedRLSConverter.js +0 -168
- package/dist/src/parsers/enhancedRLSConverter.js.map +0 -1
- package/dist/src/parsers/functionAnalyzer.d.ts +0 -55
- package/dist/src/parsers/functionAnalyzer.d.ts.map +0 -1
- package/dist/src/parsers/functionAnalyzer.js +0 -274
- package/dist/src/parsers/functionAnalyzer.js.map +0 -1
- package/dist/src/parsers/prismaFilterBuilder.d.ts +0 -79
- package/dist/src/parsers/prismaFilterBuilder.d.ts.map +0 -1
- package/dist/src/parsers/prismaFilterBuilder.js +0 -322
- package/dist/src/parsers/prismaFilterBuilder.js.map +0 -1
|
@@ -1,322 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prismaFilterBuilder.js","sourceRoot":"","sources":["../../../src/parsers/prismaFilterBuilder.ts"],"names":[],"mappings":"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"}
|