@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.
Files changed (56) hide show
  1. package/README.md +26 -165
  2. package/dist/bin/cli.js +0 -2
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/index.d.ts +2 -11
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -12
  7. package/dist/index.js.map +1 -1
  8. package/dist/src/commands/build.d.ts +1 -3
  9. package/dist/src/commands/build.d.ts.map +1 -1
  10. package/dist/src/commands/build.js +1 -106
  11. package/dist/src/commands/build.js.map +1 -1
  12. package/dist/src/generators/aclGenerator.d.ts +2 -2
  13. package/dist/src/generators/aclGenerator.d.ts.map +1 -1
  14. package/dist/src/generators/aclGenerator.js +11 -304
  15. package/dist/src/generators/aclGenerator.js.map +1 -1
  16. package/dist/src/generators/modelGenerator.d.ts +1 -1
  17. package/dist/src/generators/modelGenerator.d.ts.map +1 -1
  18. package/dist/src/generators/modelGenerator.js +46 -16
  19. package/dist/src/generators/modelGenerator.js.map +1 -1
  20. package/dist/src/generators/routeGenerator.d.ts +1 -1
  21. package/dist/src/generators/routeGenerator.d.ts.map +1 -1
  22. package/dist/src/generators/routeGenerator.js +6 -2
  23. package/dist/src/generators/routeGenerator.js.map +1 -1
  24. package/dist/src/parsers/index.d.ts +1 -10
  25. package/dist/src/parsers/index.d.ts.map +1 -1
  26. package/dist/src/parsers/index.js +1 -14
  27. package/dist/src/parsers/index.js.map +1 -1
  28. package/dist/src/parsers/prismaParser.d.ts +1 -1
  29. package/dist/src/parsers/prismaParser.d.ts.map +1 -1
  30. package/dist/src/parsers/prismaParser.js +7 -7
  31. package/dist/src/parsers/prismaParser.js.map +1 -1
  32. package/dist/src/parsers/types.d.ts +33 -0
  33. package/dist/src/parsers/types.d.ts.map +1 -0
  34. package/dist/src/parsers/types.js +3 -0
  35. package/dist/src/parsers/types.js.map +1 -0
  36. package/package.json +14 -19
  37. package/dist/src/parsers/datasourceParser.d.ts +0 -11
  38. package/dist/src/parsers/datasourceParser.d.ts.map +0 -1
  39. package/dist/src/parsers/datasourceParser.js +0 -131
  40. package/dist/src/parsers/datasourceParser.js.map +0 -1
  41. package/dist/src/parsers/deepSQLAnalyzer.d.ts +0 -85
  42. package/dist/src/parsers/deepSQLAnalyzer.d.ts.map +0 -1
  43. package/dist/src/parsers/deepSQLAnalyzer.js +0 -482
  44. package/dist/src/parsers/deepSQLAnalyzer.js.map +0 -1
  45. package/dist/src/parsers/enhancedRLSConverter.d.ts +0 -14
  46. package/dist/src/parsers/enhancedRLSConverter.d.ts.map +0 -1
  47. package/dist/src/parsers/enhancedRLSConverter.js +0 -168
  48. package/dist/src/parsers/enhancedRLSConverter.js.map +0 -1
  49. package/dist/src/parsers/functionAnalyzer.d.ts +0 -55
  50. package/dist/src/parsers/functionAnalyzer.d.ts.map +0 -1
  51. package/dist/src/parsers/functionAnalyzer.js +0 -274
  52. package/dist/src/parsers/functionAnalyzer.js.map +0 -1
  53. package/dist/src/parsers/prismaFilterBuilder.d.ts +0 -79
  54. package/dist/src/parsers/prismaFilterBuilder.d.ts.map +0 -1
  55. package/dist/src/parsers/prismaFilterBuilder.js +0 -322
  56. 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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"}