@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,482 @@
1
+ "use strict";
2
+ /**
3
+ * Deep SQL Analyzer for PostgreSQL RLS Policies
4
+ * Uses extensive regex patterns to extract meaning from SQL expressions
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DeepSQLAnalyzer = void 0;
8
+ class DeepSQLAnalyzer {
9
+ constructor() {
10
+ // Common PostgreSQL function patterns mapped to user fields
11
+ this.functionMappings = {
12
+ // User ID functions
13
+ 'get_current_user_id': 'id',
14
+ 'current_user_id': 'id',
15
+ 'auth.uid': 'id',
16
+ 'auth.user_id': 'id',
17
+ // Role functions
18
+ 'get_current_user_role': 'role',
19
+ 'current_user_role': 'role',
20
+ 'current_role': 'role',
21
+ 'auth.role': 'role',
22
+ // Tenant functions
23
+ 'get_current_tenant_id': 'tenant_id',
24
+ 'current_tenant_id': 'tenant_id',
25
+ 'current_tenant': 'tenant_id',
26
+ // Organization functions
27
+ 'get_current_org_id': 'org_id',
28
+ 'current_org_id': 'org_id',
29
+ 'current_organization_id': 'org_id',
30
+ // Related entity functions
31
+ 'get_current_student_id': 'student_id',
32
+ 'current_student_id': 'student_id',
33
+ 'get_student_id_for_user': 'student_id',
34
+ 'get_current_teacher_id': 'teacher_id',
35
+ 'current_teacher_id': 'teacher_id',
36
+ 'get_teacher_id_for_user': 'teacher_id',
37
+ 'get_current_employee_id': 'employee_id',
38
+ 'current_employee_id': 'employee_id',
39
+ 'get_employee_id_for_user': 'employee_id',
40
+ 'get_current_customer_id': 'customer_id',
41
+ 'current_customer_id': 'customer_id',
42
+ 'get_customer_id_for_user': 'customer_id'
43
+ };
44
+ // Session variable mappings
45
+ this.sessionMappings = {
46
+ 'app.current_user_id': 'id',
47
+ 'jwt.claims.sub': 'id',
48
+ 'request.jwt.claims.sub': 'id',
49
+ 'request.jwt.claim.sub': 'id',
50
+ 'app.current_role': 'role',
51
+ 'jwt.claims.role': 'role',
52
+ 'request.jwt.claim.role': 'role',
53
+ 'app.current_tenant': 'tenant_id',
54
+ 'app.tenant_id': 'tenant_id',
55
+ 'jwt.claims.tenant_id': 'tenant_id',
56
+ 'app.org_id': 'org_id',
57
+ 'app.organization_id': 'org_id'
58
+ };
59
+ }
60
+ /**
61
+ * Analyze SQL expression and extract Prisma filters
62
+ */
63
+ analyzeSQLForFilters(sql) {
64
+ if (!sql || sql.trim() === '') {
65
+ return { filters: [], conditions: [], userContext: {} };
66
+ }
67
+ const analysis = {
68
+ filters: [],
69
+ conditions: [],
70
+ userContext: {}
71
+ };
72
+ // Normalize SQL
73
+ sql = this.normalizeSql(sql);
74
+ // Remove EXISTS subqueries with proper parentheses matching
75
+ const sqlWithoutExists = this.removeExistsSubqueries(sql);
76
+ // Extract different types of conditions (use sqlWithoutExists to avoid EXISTS internals)
77
+ this.extractDirectComparisons(sqlWithoutExists, analysis);
78
+ this.extractFunctionComparisons(sqlWithoutExists, analysis);
79
+ this.extractSessionVariableComparisons(sqlWithoutExists, analysis);
80
+ this.extractInClauses(sqlWithoutExists, analysis);
81
+ // Extract EXISTS from original SQL
82
+ this.extractExistsSubqueries(sql, analysis);
83
+ // Extract from original SQL for these
84
+ this.extractCaseWhenConditions(sql, analysis);
85
+ this.extractRoleChecks(sql, analysis);
86
+ this.extractComplexJoins(sql, analysis);
87
+ return analysis;
88
+ }
89
+ /**
90
+ * Normalize SQL for easier parsing
91
+ */
92
+ normalizeSql(sql) {
93
+ let normalized = sql
94
+ .replace(/\s+/g, ' ')
95
+ .replace(/\n/g, ' ')
96
+ .replace(/\t/g, ' ')
97
+ .replace(/::character varying/gi, '') // Remove multi-word type casts first
98
+ .replace(/::[\w_]+\s*\[\]/g, ']') // Replace ::type[] with just ] (preserve array bracket)
99
+ .replace(/::[\w_]+/g, '') // Remove simple type casts
100
+ .trim();
101
+ // Remove balanced outer wrapping parentheses
102
+ while (normalized.startsWith('(') && normalized.endsWith(')')) {
103
+ const inner = normalized.slice(1, -1);
104
+ // Count parentheses to check if outer pair is balanced
105
+ let depth = 0;
106
+ let isBalanced = true;
107
+ for (let i = 0; i < inner.length; i++) {
108
+ if (inner[i] === '(')
109
+ depth++;
110
+ if (inner[i] === ')')
111
+ depth--;
112
+ // If depth goes negative, the outer parens are needed
113
+ if (depth < 0) {
114
+ isBalanced = false;
115
+ break;
116
+ }
117
+ }
118
+ // Only remove if balanced and not a single function call
119
+ if (isBalanced && depth === 0 && (inner.includes(' = ') || inner.includes(' AND ') || inner.includes(' OR '))) {
120
+ normalized = inner.trim();
121
+ }
122
+ else {
123
+ break;
124
+ }
125
+ }
126
+ return normalized;
127
+ }
128
+ /**
129
+ * Remove EXISTS subqueries with proper parentheses matching
130
+ */
131
+ removeExistsSubqueries(sql) {
132
+ let result = sql;
133
+ let changed = true;
134
+ // Keep removing EXISTS clauses until none are left
135
+ while (changed) {
136
+ changed = false;
137
+ const existsIndex = result.search(/EXISTS\s*\(/i);
138
+ if (existsIndex !== -1) {
139
+ // Find the matching closing parenthesis
140
+ const startParen = result.indexOf('(', existsIndex);
141
+ let depth = 1;
142
+ let endParen = startParen + 1;
143
+ while (endParen < result.length && depth > 0) {
144
+ if (result[endParen] === '(')
145
+ depth++;
146
+ if (result[endParen] === ')')
147
+ depth--;
148
+ endParen++;
149
+ }
150
+ // Replace EXISTS(...) with 'true'
151
+ result = result.substring(0, existsIndex) + 'true' + result.substring(endParen);
152
+ changed = true;
153
+ }
154
+ }
155
+ return result;
156
+ }
157
+ /**
158
+ * Extract direct field comparisons
159
+ */
160
+ extractDirectComparisons(sql, analysis) {
161
+ // Pattern: field = 'value' (with or without quotes on field name)
162
+ const stringPattern = /(?:"?(\w+)"?)\s*=\s*'([^']+)'/gi;
163
+ let match;
164
+ while ((match = stringPattern.exec(sql)) !== null) {
165
+ const field = match[1];
166
+ const value = match[2];
167
+ // Skip if field is actually a function
168
+ if (field.toLowerCase().includes('current') || field.toLowerCase().includes('get')) {
169
+ continue;
170
+ }
171
+ analysis.filters.push({
172
+ type: 'equal',
173
+ field: field,
174
+ value: value,
175
+ prisma: `{ ${field}: '${value}' }`
176
+ });
177
+ }
178
+ // Pattern: field = number (with or without quotes on field name)
179
+ const numberPattern = /(?:"?(\w+)"?)\s*=\s*(\d+)(?!\s*\))/gi;
180
+ while ((match = numberPattern.exec(sql)) !== null) {
181
+ const field = match[1];
182
+ const value = match[2];
183
+ // Skip if field is actually a function
184
+ if (field.toLowerCase().includes('current') || field.toLowerCase().includes('get')) {
185
+ continue;
186
+ }
187
+ analysis.filters.push({
188
+ type: 'equal',
189
+ field: field,
190
+ value: value,
191
+ prisma: `{ ${field}: ${value} }`
192
+ });
193
+ }
194
+ // Pattern: field = true/false (with or without quotes on field name)
195
+ const booleanPattern = /(?:"?(\w+)"?)\s*=\s*(true|false)/gi;
196
+ while ((match = booleanPattern.exec(sql)) !== null) {
197
+ const field = match[1];
198
+ const value = match[2].toLowerCase();
199
+ analysis.filters.push({
200
+ type: 'equal',
201
+ field: field,
202
+ value: value,
203
+ prisma: `{ ${field}: ${value} }`
204
+ });
205
+ }
206
+ // Pattern: field IS NULL
207
+ const isNullPattern = /(?:"?(\w+)"?)\s+IS\s+NULL/gi;
208
+ while ((match = isNullPattern.exec(sql)) !== null) {
209
+ analysis.filters.push({
210
+ type: 'is_null',
211
+ field: match[1],
212
+ prisma: `{ ${match[1]}: null }`
213
+ });
214
+ }
215
+ // Pattern: field IS NOT NULL
216
+ const isNotNullPattern = /(\w+)\s+IS\s+NOT\s+NULL/gi;
217
+ while ((match = isNotNullPattern.exec(sql)) !== null) {
218
+ analysis.filters.push({
219
+ type: 'not_null',
220
+ field: match[1],
221
+ prisma: `{ ${match[1]}: { not: null } }`
222
+ });
223
+ }
224
+ }
225
+ /**
226
+ * Extract function-based comparisons
227
+ */
228
+ extractFunctionComparisons(sql, analysis) {
229
+ // Pattern: field = function() (with or without quotes on field name)
230
+ const patterns = [
231
+ /(?:"?(\w+)"?)\s*=\s*([\w.]+)\s*\(\s*\)/gi, // field = function()
232
+ /([\w.]+)\s*\(\s*\)\s*=\s*(?:"?(\w+)"?)/gi // function() = field
233
+ ];
234
+ // Normalize dots in function names for lookup
235
+ const normalizeFuncName = (name) => name.replace(/\./g, '_');
236
+ for (let i = 0; i < patterns.length; i++) {
237
+ const pattern = patterns[i];
238
+ let match;
239
+ while ((match = pattern.exec(sql)) !== null) {
240
+ let field, funcName;
241
+ // First pattern is: field = function()
242
+ // Second pattern is: function() = field
243
+ if (i === 0) {
244
+ field = match[1];
245
+ funcName = normalizeFuncName(match[2]);
246
+ }
247
+ else {
248
+ funcName = normalizeFuncName(match[1]);
249
+ field = match[2];
250
+ }
251
+ // Look up function mapping (check both with/without underscore and original)
252
+ let userField = this.functionMappings[funcName] || this.functionMappings[funcName.toLowerCase()];
253
+ // Also try the original name without normalization
254
+ if (!userField) {
255
+ const originalName = (i === 0 ? match[2] : match[1]);
256
+ userField = this.functionMappings[originalName] || this.functionMappings[originalName.toLowerCase()];
257
+ }
258
+ if (userField) {
259
+ // Skip if field is actually a function (e.g., both sides are functions)
260
+ if (field.toLowerCase().includes('current') || field.toLowerCase().includes('get') || field.includes('(')) {
261
+ continue;
262
+ }
263
+ // Skip if this is part of an ANY clause (handled by extractRoleChecks)
264
+ if (sql.includes(match[0] + ' = ANY') || sql.includes(match[0] + '= ANY') ||
265
+ sql.includes(match[0] + ' =ANY') || sql.includes(match[0] + '=ANY')) {
266
+ continue;
267
+ }
268
+ analysis.filters.push({
269
+ type: `user_${userField}`,
270
+ field: field,
271
+ userField: userField,
272
+ prisma: `{ ${field}: user?.${userField} }`
273
+ });
274
+ // Track user context requirements
275
+ const contextKey = `requires${userField.charAt(0).toUpperCase()}${userField.slice(1).replace(/_(.)/g, (_, c) => c.toUpperCase())}`;
276
+ analysis.userContext[contextKey] = true;
277
+ }
278
+ }
279
+ }
280
+ // Pattern: function() = 'value'
281
+ const funcValuePattern = /([\w.]+)\s*\(\s*\)\s*=\s*'([^']+)'/gi;
282
+ let match;
283
+ while ((match = funcValuePattern.exec(sql)) !== null) {
284
+ const funcName = match[1].replace(/\./g, '_');
285
+ const value = match[2];
286
+ const userField = this.functionMappings[funcName] || this.functionMappings[funcName.toLowerCase()];
287
+ if (userField === 'role') {
288
+ analysis.conditions.push({
289
+ type: 'role_equal',
290
+ role: value,
291
+ javascript: `user?.role === '${value}'`
292
+ });
293
+ analysis.userContext.requiresRole = true;
294
+ }
295
+ }
296
+ }
297
+ /**
298
+ * Extract session variable comparisons
299
+ */
300
+ extractSessionVariableComparisons(sql, analysis) {
301
+ // Pattern: field = current_setting('...')
302
+ const patterns = [
303
+ /(\w+)\s*=\s*(?:\(?\s*current_setting\s*\(\s*'([^']+)'[^)]*\)\s*\)?)/gi,
304
+ /current_setting\s*\(\s*'([^']+)'[^)]*\)\s*=\s*(\w+)/gi
305
+ ];
306
+ for (let i = 0; i < patterns.length; i++) {
307
+ const pattern = patterns[i];
308
+ let match;
309
+ while ((match = pattern.exec(sql)) !== null) {
310
+ let field, setting;
311
+ // First pattern: field = current_setting(...)
312
+ // Second pattern: current_setting(...) = field
313
+ if (i === 0) {
314
+ field = match[1];
315
+ setting = match[2];
316
+ }
317
+ else {
318
+ setting = match[1];
319
+ field = match[2];
320
+ }
321
+ const userField = this.sessionMappings[setting];
322
+ if (userField) {
323
+ // Skip if field is actually a function
324
+ if (field.includes('('))
325
+ continue;
326
+ analysis.filters.push({
327
+ type: `session_${userField}`,
328
+ field: field,
329
+ userField: userField,
330
+ prisma: `{ ${field}: user?.${userField} }`
331
+ });
332
+ // Track user context requirements
333
+ const contextKey = `requires${userField.charAt(0).toUpperCase()}${userField.slice(1).replace(/_(.)/g, (_, c) => c.toUpperCase())}`;
334
+ analysis.userContext[contextKey] = true;
335
+ }
336
+ }
337
+ }
338
+ }
339
+ /**
340
+ * Extract IN clauses
341
+ */
342
+ extractInClauses(sql, analysis) {
343
+ // Pattern: field IN (values)
344
+ const inPattern = /(\w+)\s+IN\s*\(([^)]+)\)/gi;
345
+ let match;
346
+ while ((match = inPattern.exec(sql)) !== null) {
347
+ const field = match[1];
348
+ const values = match[2];
349
+ // Skip if field is a function
350
+ if (field.toLowerCase().includes('current') || field.toLowerCase().includes('get')) {
351
+ continue;
352
+ }
353
+ // Check if it's a subquery
354
+ if (values.toLowerCase().includes('select')) {
355
+ // Handle subquery
356
+ analysis.conditions.push({
357
+ type: 'in_subquery',
358
+ field: field,
359
+ subquery: values,
360
+ prisma: `/* IN subquery for ${field} - requires manual implementation */`
361
+ });
362
+ }
363
+ else {
364
+ // Parse values
365
+ const valueList = values
366
+ .split(',')
367
+ .map(v => v.trim().replace(/'/g, ''));
368
+ const quotedValues = valueList.map(v => isNaN(Number(v)) && v !== 'true' && v !== 'false' ? `'${v}'` : v);
369
+ analysis.filters.push({
370
+ type: 'in',
371
+ field: field,
372
+ values: quotedValues,
373
+ prisma: `{ ${field}: { in: [${quotedValues.join(', ')}] } }`
374
+ });
375
+ }
376
+ }
377
+ }
378
+ /**
379
+ * Extract EXISTS subqueries
380
+ */
381
+ extractExistsSubqueries(sql, analysis) {
382
+ const existsPattern = /EXISTS\s*\(([^)]+(?:\([^)]*\)[^)]*)*)\)/gi;
383
+ let match;
384
+ while ((match = existsPattern.exec(sql)) !== null) {
385
+ const subquery = match[1];
386
+ // Try to extract the table and join condition
387
+ const fromMatch = subquery.match(/FROM\s+(\w+)/i);
388
+ const whereMatch = subquery.match(/WHERE\s+(.+)/i);
389
+ if (fromMatch) {
390
+ const table = fromMatch[1];
391
+ const condition = whereMatch ? whereMatch[1] : '';
392
+ analysis.conditions.push({
393
+ type: 'exists',
394
+ table: table,
395
+ condition: condition,
396
+ prisma: `/* EXISTS check on ${table} - implement as relation check */`
397
+ });
398
+ }
399
+ }
400
+ }
401
+ /**
402
+ * Extract CASE WHEN conditions
403
+ */
404
+ extractCaseWhenConditions(sql, analysis) {
405
+ const casePattern = /CASE\s+WHEN\s+([^THEN]+)\s+THEN\s+([^WHEN|ELSE|END]+)(?:\s+WHEN\s+([^THEN]+)\s+THEN\s+([^WHEN|ELSE|END]+))*(?:\s+ELSE\s+([^END]+))?\s+END/gi;
406
+ let match;
407
+ while ((match = casePattern.exec(sql)) !== null) {
408
+ const conditions = [];
409
+ // Extract WHEN conditions
410
+ const whenPattern = /WHEN\s+([^THEN]+)\s+THEN\s+([^WHEN|ELSE|END]+)/gi;
411
+ let whenMatch;
412
+ while ((whenMatch = whenPattern.exec(match[0])) !== null) {
413
+ const condition = whenMatch[1].trim();
414
+ const result = whenMatch[2].trim();
415
+ conditions.push({
416
+ condition: condition,
417
+ result: result
418
+ });
419
+ }
420
+ if (conditions.length > 0) {
421
+ analysis.conditions.push({
422
+ type: 'case_when',
423
+ conditions: conditions,
424
+ prisma: `/* CASE WHEN logic - requires conditional implementation */`
425
+ });
426
+ }
427
+ }
428
+ }
429
+ /**
430
+ * Extract role-based checks
431
+ */
432
+ extractRoleChecks(sql, analysis) {
433
+ // Pattern: (function()) = ANY((ARRAY[...])) or function() = ANY(ARRAY[...])
434
+ // Handle optional wrapping parens around function and multiple parens around ARRAY
435
+ const anyArrayPattern = /\(?([\w.]+)\s*\(\s*\)\)?\s*=\s*ANY\s*\(+\s*(?:ARRAY\s*)?\[([^\]]+)\]/gi;
436
+ let match;
437
+ while ((match = anyArrayPattern.exec(sql)) !== null) {
438
+ const funcName = match[1].replace(/\./g, '_');
439
+ const values = match[2];
440
+ const userField = this.functionMappings[funcName] || this.functionMappings[funcName.toLowerCase()];
441
+ if (userField === 'role') {
442
+ const roles = values
443
+ .split(',')
444
+ .map(r => r.trim().replace(/'/g, ''));
445
+ analysis.conditions.push({
446
+ type: 'role_any',
447
+ roles: roles,
448
+ javascript: `[${roles.map(r => `'${r}'`).join(', ')}].includes(user?.role)`
449
+ });
450
+ analysis.userContext.requiresRole = true;
451
+ }
452
+ }
453
+ }
454
+ /**
455
+ * Extract complex JOIN conditions
456
+ */
457
+ extractComplexJoins(sql, analysis) {
458
+ // Look for patterns that suggest relationships
459
+ const relationPatterns = [
460
+ // user owns resource through intermediate table
461
+ /(\w+)\s+IN\s*\(\s*SELECT\s+\w+\s+FROM\s+(\w+)\s+WHERE\s+(\w+)=/gi,
462
+ // team/group membership
463
+ /(\w+)\.(\w+)\s+IN\s*\(\s*SELECT\s+\w+\s+FROM\s+(\w+_members?)\s+WHERE/gi
464
+ ];
465
+ for (const pattern of relationPatterns) {
466
+ let match;
467
+ while ((match = pattern.exec(sql)) !== null) {
468
+ if (match[2]) {
469
+ analysis.conditions.push({
470
+ type: 'relation',
471
+ table: match[2],
472
+ field: match[1],
473
+ prisma: `/* Relation check through ${match[2]} table */`
474
+ });
475
+ }
476
+ }
477
+ }
478
+ }
479
+ }
480
+ exports.DeepSQLAnalyzer = DeepSQLAnalyzer;
481
+ exports.default = DeepSQLAnalyzer;
482
+ //# sourceMappingURL=deepSQLAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepSQLAnalyzer.js","sourceRoot":"","sources":["../../../src/parsers/deepSQLAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Enhanced RLS Converter using Deep SQL Analysis
3
+ */
4
+ import { DeepSQLAnalyzer } from './deepSQLAnalyzer';
5
+ import { ModelInfo, RelationshipInfo } from './prismaFilterBuilder';
6
+ export interface EnhancedConverter {
7
+ convertToJavaScript: (sql: string, dataVar?: string, userVar?: string, modelName?: string | null) => string;
8
+ convertToPrismaFilter: (sql: string, userVar?: string, modelName?: string | null) => string;
9
+ getUserContextRequirements: (sql: string) => Record<string, boolean>;
10
+ analyzer: DeepSQLAnalyzer;
11
+ }
12
+ export declare function createEnhancedConverter(functionMappings?: Record<string, unknown>, sessionVariables?: string[] | Record<string, unknown>, models?: Record<string, ModelInfo>, relationships?: Record<string, Record<string, RelationshipInfo>>): EnhancedConverter;
13
+ export { createEnhancedConverter as default };
14
+ //# sourceMappingURL=enhancedRLSConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancedRLSConverter.d.ts","sourceRoot":"","sources":["../../../src/parsers/enhancedRLSConverter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAe,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAuB,SAAS,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzF,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;IAC5G,qBAAqB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;IAC5F,0BAA0B,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrE,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,wBAAgB,uBAAuB,CACrC,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAC9C,gBAAgB,GAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACzD,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAM,EACtC,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAM,GACnE,iBAAiB,CA2KnB;AAED,OAAO,EAAE,uBAAuB,IAAI,OAAO,EAAE,CAAC"}