@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,168 @@
1
+ "use strict";
2
+ /**
3
+ * Enhanced RLS Converter using Deep SQL Analysis
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createEnhancedConverter = createEnhancedConverter;
7
+ exports.default = createEnhancedConverter;
8
+ const deepSQLAnalyzer_1 = require("./deepSQLAnalyzer");
9
+ const prismaFilterBuilder_1 = require("./prismaFilterBuilder");
10
+ function createEnhancedConverter(functionMappings = {}, sessionVariables = {}, models = {}, relationships = {}) {
11
+ const analyzer = new deepSQLAnalyzer_1.DeepSQLAnalyzer();
12
+ const filterBuilder = new prismaFilterBuilder_1.PrismaFilterBuilder(models, relationships);
13
+ /**
14
+ * Convert PostgreSQL RLS to JavaScript with deep analysis
15
+ */
16
+ function convertToJavaScript(sql, dataVar = 'data', userVar = 'user', modelName = null) {
17
+ if (!sql || sql.trim() === '') {
18
+ return 'true';
19
+ }
20
+ // Use deep analysis
21
+ const analysis = analyzer.analyzeSQLForFilters(sql);
22
+ analysis.sql = sql; // Store original SQL for OR/AND detection
23
+ // If we have models and relationships, use the filter builder for better JavaScript
24
+ if (modelName && Object.keys(models).length > 0) {
25
+ return filterBuilder.buildJavaScriptCondition(modelName, analysis, dataVar, userVar);
26
+ }
27
+ // Fallback to simple JavaScript generation
28
+ const conditions = [];
29
+ // Add filter-based conditions
30
+ for (const filter of analysis.filters) {
31
+ if (filter.type.startsWith('user_') || filter.type.startsWith('session_')) {
32
+ // Dynamic user field comparison
33
+ const userField = filter.userField || filter.type.replace(/^(user_|session_)/, '');
34
+ conditions.push(`${dataVar}?.${filter.field} === ${userVar}?.${userField}`);
35
+ }
36
+ else {
37
+ switch (filter.type) {
38
+ case 'equal':
39
+ if (isNaN(Number(filter.value)) && filter.value !== 'true' && filter.value !== 'false') {
40
+ conditions.push(`${dataVar}?.${filter.field} === '${filter.value}'`);
41
+ }
42
+ else {
43
+ conditions.push(`${dataVar}?.${filter.field} === ${filter.value}`);
44
+ }
45
+ break;
46
+ case 'not_equal':
47
+ conditions.push(`${dataVar}?.${filter.field} !== '${filter.value}'`);
48
+ break;
49
+ case 'is_null':
50
+ conditions.push(`${dataVar}?.${filter.field} === null`);
51
+ break;
52
+ case 'not_null':
53
+ conditions.push(`${dataVar}?.${filter.field} !== null`);
54
+ break;
55
+ case 'in':
56
+ conditions.push(`[${filter.values.join(', ')}].includes(${dataVar}?.${filter.field})`);
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ // Add condition-based checks (roles, etc.)
62
+ for (const condition of analysis.conditions) {
63
+ if (condition.javascript) {
64
+ // Replace user placeholder with actual variable
65
+ const jsCondition = condition.javascript.replace(/user/g, userVar);
66
+ conditions.push(jsCondition);
67
+ }
68
+ else if (condition.type === 'role_any') {
69
+ conditions.push(`[${condition.roles.map(r => `'${r}'`).join(', ')}].includes(${userVar}?.role)`);
70
+ }
71
+ else if (condition.type === 'role_equal') {
72
+ conditions.push(`${userVar}?.role === '${condition.role}'`);
73
+ }
74
+ }
75
+ // Handle OR/AND logic in original SQL
76
+ const normalizedSql = sql.trim().replace(/\s+/g, ' ');
77
+ // Check if the entire expression is OR'd
78
+ if (normalizedSql.includes(' OR ') && !normalizedSql.includes(' AND ')) {
79
+ // If we have multiple conditions and SQL uses OR, join with ||
80
+ if (conditions.length > 1) {
81
+ return conditions.join(' || ');
82
+ }
83
+ }
84
+ else if (normalizedSql.includes(' AND ') && conditions.length > 1) {
85
+ // If SQL uses AND, wrap in parentheses for clarity
86
+ return '(' + conditions.join(' && ') + ')';
87
+ }
88
+ // Default: join with AND
89
+ return conditions.length > 0 ? conditions.join(' && ') : 'true';
90
+ }
91
+ /**
92
+ * Convert to Prisma filter with deep analysis
93
+ */
94
+ function convertToPrismaFilter(sql, userVar = 'user', modelName = null) {
95
+ if (!sql || sql.trim() === '')
96
+ return '{}';
97
+ // Use deep analysis
98
+ const analysis = analyzer.analyzeSQLForFilters(sql);
99
+ analysis.sql = sql; // Store original SQL for OR/AND detection
100
+ // If we have models and relationships, use the filter builder
101
+ if (modelName && Object.keys(models).length > 0) {
102
+ return filterBuilder.buildFilter(modelName, analysis, userVar);
103
+ }
104
+ // Fallback to simple filter generation
105
+ const filters = [];
106
+ for (const filter of analysis.filters) {
107
+ if (filter.type.startsWith('user_') || filter.type.startsWith('session_')) {
108
+ // Dynamic user field comparison
109
+ const userField = filter.userField || filter.type.replace(/^(user_|session_)/, '');
110
+ filters.push(`{ ${filter.field}: ${userVar}?.${userField} }`);
111
+ }
112
+ else {
113
+ switch (filter.type) {
114
+ case 'equal':
115
+ if (isNaN(Number(filter.value)) && filter.value !== 'true' && filter.value !== 'false') {
116
+ filters.push(`{ ${filter.field}: '${filter.value}' }`);
117
+ }
118
+ else {
119
+ filters.push(`{ ${filter.field}: ${filter.value} }`);
120
+ }
121
+ break;
122
+ case 'not_equal':
123
+ filters.push(`{ ${filter.field}: { not: '${filter.value}' } }`);
124
+ break;
125
+ case 'is_null':
126
+ filters.push(`{ ${filter.field}: null }`);
127
+ break;
128
+ case 'not_null':
129
+ filters.push(`{ ${filter.field}: { not: null } }`);
130
+ break;
131
+ case 'in':
132
+ filters.push(`{ ${filter.field}: { in: [${filter.values.join(', ')}] } }`);
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ // Role checks can't be directly filtered in Prisma (they're runtime checks)
138
+ // But we can still return the data filters
139
+ if (filters.length === 0) {
140
+ return '{}';
141
+ }
142
+ if (filters.length === 1) {
143
+ return filters[0];
144
+ }
145
+ // Check if original SQL uses OR or AND
146
+ const normalizedSql = sql.trim().replace(/\s+/g, ' ');
147
+ if (normalizedSql.includes(' OR ') && !normalizedSql.includes(' AND ')) {
148
+ // Use OR for multiple filters
149
+ return `{ OR: [${filters.join(', ')}] }`;
150
+ }
151
+ // Default to AND
152
+ return `{ AND: [${filters.join(', ')}] }`;
153
+ }
154
+ /**
155
+ * Analyze and get user context requirements
156
+ */
157
+ function getUserContextRequirements(sql) {
158
+ const analysis = analyzer.analyzeSQLForFilters(sql);
159
+ return analysis.userContext || {};
160
+ }
161
+ return {
162
+ convertToJavaScript,
163
+ convertToPrismaFilter,
164
+ getUserContextRequirements,
165
+ analyzer // Expose analyzer for debugging
166
+ };
167
+ }
168
+ //# sourceMappingURL=enhancedRLSConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancedRLSConverter.js","sourceRoot":"","sources":["../../../src/parsers/enhancedRLSConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * PostgreSQL Function Analyzer
3
+ * Dynamically analyzes PostgreSQL functions and generates JavaScript mappings
4
+ */
5
+ export interface FunctionMapping {
6
+ type: string;
7
+ returns: string;
8
+ description: string;
9
+ }
10
+ export interface FunctionAnalysisResult {
11
+ functionMappings: Record<string, FunctionMapping>;
12
+ sessionVariables: string[];
13
+ userContextRequirements: Record<string, boolean | {
14
+ table: string;
15
+ lookupField: string;
16
+ description: string;
17
+ }>;
18
+ }
19
+ export interface MappingConfig {
20
+ generated: string;
21
+ source: string;
22
+ functions: Record<string, {
23
+ javascript: string;
24
+ description: string;
25
+ type: string;
26
+ }>;
27
+ sessionVariables: Record<string, string>;
28
+ userContext: {
29
+ required: string[];
30
+ optional: string[];
31
+ relationships: Record<string, unknown>;
32
+ };
33
+ }
34
+ interface FunctionBodyAnalysis {
35
+ mapping: FunctionMapping | null;
36
+ requiresUserId: boolean;
37
+ queriesTable: string | null;
38
+ returnField: string | null;
39
+ lookupField: string | null;
40
+ sessionVars: string[];
41
+ }
42
+ /**
43
+ * Analyze all PostgreSQL functions used in RLS policies
44
+ */
45
+ export declare function analyzeFunctions(databaseUrl: string | null): Promise<FunctionAnalysisResult>;
46
+ /**
47
+ * Analyze a PostgreSQL function body to understand what it does
48
+ */
49
+ export declare function analyzeFunctionBody(functionBody: string, returnType: string): FunctionBodyAnalysis;
50
+ /**
51
+ * Generate a function mapping configuration
52
+ */
53
+ export declare function generateMappingConfig(analysisResult: FunctionAnalysisResult): MappingConfig;
54
+ export {};
55
+ //# sourceMappingURL=functionAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functionAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/parsers/functionAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChH;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACxC,CAAC;CACH;AAED,UAAU,oBAAoB;IAC5B,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA6HlG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,oBAAoB,CAiGlG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,sBAAsB,GAAG,aAAa,CAmD3F"}
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ /**
3
+ * PostgreSQL Function Analyzer
4
+ * Dynamically analyzes PostgreSQL functions and generates JavaScript mappings
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.analyzeFunctions = analyzeFunctions;
8
+ exports.analyzeFunctionBody = analyzeFunctionBody;
9
+ exports.generateMappingConfig = generateMappingConfig;
10
+ const pg_1 = require("pg");
11
+ /**
12
+ * Analyze all PostgreSQL functions used in RLS policies
13
+ */
14
+ async function analyzeFunctions(databaseUrl) {
15
+ if (!databaseUrl) {
16
+ return {
17
+ functionMappings: {},
18
+ sessionVariables: [],
19
+ userContextRequirements: {}
20
+ };
21
+ }
22
+ const client = new pg_1.Client({ connectionString: databaseUrl });
23
+ try {
24
+ await client.connect();
25
+ // Step 1: Find all functions used in RLS policies
26
+ const functionsQuery = await client.query(`
27
+ WITH rls_text AS (
28
+ SELECT
29
+ qual || ' ' || COALESCE(with_check, '') as policy_text
30
+ FROM pg_policies
31
+ WHERE schemaname = 'public'
32
+ ),
33
+ function_names AS (
34
+ SELECT DISTINCT
35
+ unnest(
36
+ regexp_matches(
37
+ policy_text,
38
+ '(\\w+)\\s*\\(',
39
+ 'g'
40
+ )
41
+ ) as function_name
42
+ FROM rls_text
43
+ )
44
+ SELECT function_name
45
+ FROM function_names
46
+ WHERE function_name NOT IN ('SELECT', 'EXISTS', 'ANY', 'ARRAY', 'WHERE', 'AND', 'OR', 'NOT', 'IN', 'THEN', 'ELSE', 'CASE', 'WHEN', 'END')
47
+ AND function_name NOT LIKE 'current_setting%'
48
+ `);
49
+ const functionNames = functionsQuery.rows.map(r => r.function_name);
50
+ // Step 2: Analyze each function's definition
51
+ const functionMappings = {};
52
+ const userContextRequirements = {};
53
+ const sessionVariables = new Set();
54
+ for (const funcName of functionNames) {
55
+ try {
56
+ const funcDef = await client.query(`
57
+ SELECT
58
+ proname as name,
59
+ prosrc as source,
60
+ pg_get_functiondef(oid) as full_definition,
61
+ prorettype::regtype as return_type
62
+ FROM pg_proc
63
+ WHERE proname = $1
64
+ AND pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')
65
+ `, [funcName]);
66
+ if (funcDef.rows.length > 0) {
67
+ const func = funcDef.rows[0];
68
+ const analysis = analyzeFunctionBody(func.source, func.return_type);
69
+ if (analysis.mapping) {
70
+ functionMappings[funcName] = analysis.mapping;
71
+ }
72
+ // Track what this function requires
73
+ if (analysis.requiresUserId) {
74
+ userContextRequirements.id = true;
75
+ }
76
+ if (analysis.queriesTable && analysis.returnField) {
77
+ userContextRequirements[analysis.returnField] = {
78
+ table: analysis.queriesTable,
79
+ lookupField: analysis.lookupField || 'user_id',
80
+ description: `${funcName}() queries ${analysis.queriesTable} table`
81
+ };
82
+ }
83
+ // Track session variables
84
+ analysis.sessionVars.forEach(v => sessionVariables.add(v));
85
+ }
86
+ }
87
+ catch (e) {
88
+ console.warn(`Could not analyze function ${funcName}:`, e.message);
89
+ }
90
+ }
91
+ // Step 3: Find all session variables used
92
+ const settingsQuery = await client.query(`
93
+ SELECT DISTINCT
94
+ unnest(
95
+ regexp_matches(
96
+ pg_policies.qual || ' ' || COALESCE(pg_policies.with_check, ''),
97
+ 'current_setting\\s*\\(\\s*''([^'']+)''',
98
+ 'g'
99
+ )
100
+ ) as setting_name
101
+ FROM pg_policies
102
+ WHERE schemaname = 'public'
103
+ `);
104
+ settingsQuery.rows.forEach(r => sessionVariables.add(r.setting_name));
105
+ await client.end();
106
+ return {
107
+ functionMappings,
108
+ sessionVariables: Array.from(sessionVariables),
109
+ userContextRequirements
110
+ };
111
+ }
112
+ catch (error) {
113
+ try {
114
+ await client.end();
115
+ }
116
+ catch (_e) {
117
+ // ignore
118
+ }
119
+ console.warn('Could not analyze PostgreSQL functions:', error.message);
120
+ return {
121
+ functionMappings: {},
122
+ sessionVariables: [],
123
+ userContextRequirements: {}
124
+ };
125
+ }
126
+ }
127
+ /**
128
+ * Analyze a PostgreSQL function body to understand what it does
129
+ */
130
+ function analyzeFunctionBody(functionBody, returnType) {
131
+ const analysis = {
132
+ mapping: null,
133
+ requiresUserId: false,
134
+ queriesTable: null,
135
+ returnField: null,
136
+ lookupField: null,
137
+ sessionVars: []
138
+ };
139
+ if (!functionBody)
140
+ return analysis;
141
+ // Detect session variable usage
142
+ const sessionMatches = functionBody.matchAll(/current_setting\s*\(\s*'([^']+)'/gi);
143
+ for (const match of sessionMatches) {
144
+ analysis.sessionVars.push(match[1]);
145
+ if (match[1].includes('user_id')) {
146
+ analysis.requiresUserId = true;
147
+ }
148
+ }
149
+ // Detect SELECT statements to understand what table is queried
150
+ const selectMatch = functionBody.match(/SELECT\s+(\w+)(?:\.(\w+))?\s+INTO\s+\w+\s+FROM\s+(\w+)/i);
151
+ if (selectMatch) {
152
+ const fieldOrAlias = selectMatch[1];
153
+ const fieldName = selectMatch[2] || fieldOrAlias;
154
+ const tableName = selectMatch[3];
155
+ analysis.queriesTable = tableName;
156
+ // Infer the return field name
157
+ if (fieldName === 'id' || fieldOrAlias === 'id') {
158
+ analysis.returnField = `${tableName}_id`;
159
+ }
160
+ else {
161
+ analysis.returnField = fieldName;
162
+ }
163
+ // Detect the lookup condition
164
+ const whereMatch = functionBody.match(/WHERE\s+\w+\.(\w+)\s*=\s*current_setting/i);
165
+ if (whereMatch) {
166
+ analysis.lookupField = whereMatch[1];
167
+ }
168
+ // Generate JavaScript mapping
169
+ if (returnType.includes('int')) {
170
+ analysis.mapping = {
171
+ type: 'lookup',
172
+ returns: `user?.${analysis.returnField}`,
173
+ description: `Looks up ${tableName}.id where ${tableName}.${analysis.lookupField} = current_user_id`
174
+ };
175
+ }
176
+ else if (returnType.includes('char') || returnType.includes('text')) {
177
+ // For string returns (like role), map directly
178
+ const userTableMatch = functionBody.match(/FROM\s+["']?user["']?/i);
179
+ if (userTableMatch) {
180
+ // Querying user table directly
181
+ analysis.mapping = {
182
+ type: 'direct',
183
+ returns: `user?.${analysis.returnField}`,
184
+ description: `Returns user.${analysis.returnField}`
185
+ };
186
+ }
187
+ else {
188
+ analysis.mapping = {
189
+ type: 'lookup',
190
+ returns: `user?.${analysis.returnField}`,
191
+ description: `Looks up ${tableName}.${analysis.returnField}`
192
+ };
193
+ }
194
+ }
195
+ }
196
+ // If we couldn't parse it, make a best guess based on function patterns
197
+ if (!analysis.mapping) {
198
+ const funcName = functionBody.match(/FUNCTION\s+(\w+)/i)?.[1] || '';
199
+ if (funcName.includes('role')) {
200
+ analysis.mapping = {
201
+ type: 'inferred',
202
+ returns: 'user?.role',
203
+ description: 'Inferred from function name'
204
+ };
205
+ }
206
+ else if (funcName.includes('_id')) {
207
+ const entity = funcName.replace(/get_current_|_id/gi, '');
208
+ analysis.mapping = {
209
+ type: 'inferred',
210
+ returns: `user?.${entity}_id`,
211
+ description: 'Inferred from function name'
212
+ };
213
+ }
214
+ else {
215
+ analysis.mapping = {
216
+ type: 'unknown',
217
+ returns: 'null',
218
+ description: 'Could not analyze function'
219
+ };
220
+ }
221
+ }
222
+ return analysis;
223
+ }
224
+ /**
225
+ * Generate a function mapping configuration
226
+ */
227
+ function generateMappingConfig(analysisResult) {
228
+ const config = {
229
+ // Metadata
230
+ generated: new Date().toISOString(),
231
+ source: 'PostgreSQL function analysis',
232
+ // Function mappings
233
+ functions: {},
234
+ // Session variable mappings
235
+ sessionVariables: {},
236
+ // User context requirements
237
+ userContext: {
238
+ required: [],
239
+ optional: [],
240
+ relationships: {}
241
+ }
242
+ };
243
+ // Build function mappings
244
+ for (const [funcName, mapping] of Object.entries(analysisResult.functionMappings)) {
245
+ config.functions[funcName] = {
246
+ javascript: mapping.returns,
247
+ description: mapping.description,
248
+ type: mapping.type
249
+ };
250
+ }
251
+ // Build session variable mappings
252
+ for (const varName of analysisResult.sessionVariables) {
253
+ if (varName.includes('user_id')) {
254
+ config.sessionVariables[varName] = 'user.id';
255
+ }
256
+ else {
257
+ // Infer from variable name
258
+ const key = varName.split('.').pop().replace(/_/g, '');
259
+ config.sessionVariables[varName] = `user.${key}`;
260
+ }
261
+ }
262
+ // Build user context requirements
263
+ for (const [field, requirement] of Object.entries(analysisResult.userContextRequirements)) {
264
+ if (field === 'id') {
265
+ config.userContext.required.push('id');
266
+ }
267
+ else {
268
+ config.userContext.relationships[field] = requirement;
269
+ config.userContext.optional.push(field);
270
+ }
271
+ }
272
+ return config;
273
+ }
274
+ //# sourceMappingURL=functionAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functionAnalyzer.js","sourceRoot":"","sources":["../../../src/parsers/functionAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export { parsePrismaSchema, parsePrismaDMMF } from './prismaParser';
2
+ export type { ParsedSchema } from './prismaParser';
3
+ export { parseDatasource } from './datasourceParser';
4
+ export type { DatasourceConfig } from './datasourceParser';
5
+ export { DeepSQLAnalyzer } from './deepSQLAnalyzer';
6
+ export type { SQLFilter, SQLCondition, SQLAnalysis } from './deepSQLAnalyzer';
7
+ export { PrismaFilterBuilder } from './prismaFilterBuilder';
8
+ export type { ModelField, ModelRelation, ModelInfo, RelationshipInfo } from './prismaFilterBuilder';
9
+ export { createEnhancedConverter } from './enhancedRLSConverter';
10
+ export type { EnhancedConverter } from './enhancedRLSConverter';
11
+ export { analyzeFunctions, analyzeFunctionBody, generateMappingConfig } from './functionAnalyzer';
12
+ export type { FunctionMapping, FunctionAnalysisResult, MappingConfig } from './functionAnalyzer';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEpG,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClG,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateMappingConfig = exports.analyzeFunctionBody = exports.analyzeFunctions = exports.createEnhancedConverter = exports.PrismaFilterBuilder = exports.DeepSQLAnalyzer = exports.parseDatasource = exports.parsePrismaDMMF = exports.parsePrismaSchema = void 0;
4
+ // Re-export all parsers
5
+ var prismaParser_1 = require("./prismaParser");
6
+ Object.defineProperty(exports, "parsePrismaSchema", { enumerable: true, get: function () { return prismaParser_1.parsePrismaSchema; } });
7
+ Object.defineProperty(exports, "parsePrismaDMMF", { enumerable: true, get: function () { return prismaParser_1.parsePrismaDMMF; } });
8
+ var datasourceParser_1 = require("./datasourceParser");
9
+ Object.defineProperty(exports, "parseDatasource", { enumerable: true, get: function () { return datasourceParser_1.parseDatasource; } });
10
+ var deepSQLAnalyzer_1 = require("./deepSQLAnalyzer");
11
+ Object.defineProperty(exports, "DeepSQLAnalyzer", { enumerable: true, get: function () { return deepSQLAnalyzer_1.DeepSQLAnalyzer; } });
12
+ var prismaFilterBuilder_1 = require("./prismaFilterBuilder");
13
+ Object.defineProperty(exports, "PrismaFilterBuilder", { enumerable: true, get: function () { return prismaFilterBuilder_1.PrismaFilterBuilder; } });
14
+ var enhancedRLSConverter_1 = require("./enhancedRLSConverter");
15
+ Object.defineProperty(exports, "createEnhancedConverter", { enumerable: true, get: function () { return enhancedRLSConverter_1.createEnhancedConverter; } });
16
+ var functionAnalyzer_1 = require("./functionAnalyzer");
17
+ Object.defineProperty(exports, "analyzeFunctions", { enumerable: true, get: function () { return functionAnalyzer_1.analyzeFunctions; } });
18
+ Object.defineProperty(exports, "analyzeFunctionBody", { enumerable: true, get: function () { return functionAnalyzer_1.analyzeFunctionBody; } });
19
+ Object.defineProperty(exports, "generateMappingConfig", { enumerable: true, get: function () { return functionAnalyzer_1.generateMappingConfig; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":";;;AAAA,wBAAwB;AACxB,+CAAoE;AAA3D,iHAAA,iBAAiB,OAAA;AAAE,+GAAA,eAAe,OAAA;AAG3C,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAGxB,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AAGxB,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAG5B,+DAAiE;AAAxD,+HAAA,uBAAuB,OAAA;AAGhC,uDAAkG;AAAzF,oHAAA,gBAAgB,OAAA;AAAE,uHAAA,mBAAmB,OAAA;AAAE,yHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Prisma Filter Builder for RLS
3
+ * Generates correct Prisma filter syntax based on schema relationships
4
+ */
5
+ import type { SQLAnalysis } from './deepSQLAnalyzer';
6
+ export interface ModelField {
7
+ type: string;
8
+ optional: boolean;
9
+ isArray: boolean;
10
+ isRelation: boolean;
11
+ isId?: boolean;
12
+ isUnique?: boolean;
13
+ isUpdatedAt?: boolean;
14
+ hasDefaultValue?: boolean;
15
+ attributes?: string;
16
+ kind?: string;
17
+ relationName?: string;
18
+ relationFromFields?: string[];
19
+ relationToFields?: string[];
20
+ }
21
+ export interface ModelRelation {
22
+ name: string;
23
+ type: string;
24
+ isArray: boolean;
25
+ optional: boolean;
26
+ relationName?: string;
27
+ relationFromFields?: string[];
28
+ relationToFields?: string[];
29
+ kind?: string;
30
+ }
31
+ export interface ModelInfo {
32
+ name: string;
33
+ fields: Record<string, ModelField>;
34
+ relations: ModelRelation[];
35
+ compositeKey: string[] | null;
36
+ dbName: string;
37
+ }
38
+ export interface RelationshipInfo {
39
+ object: string;
40
+ field: string;
41
+ fields?: string[];
42
+ }
43
+ export declare class PrismaFilterBuilder {
44
+ models: Record<string, ModelInfo>;
45
+ relationships: Record<string, Record<string, RelationshipInfo>>;
46
+ userModel: ModelInfo | null;
47
+ userModelName: string | null;
48
+ constructor(models: Record<string, ModelInfo>, relationships: Record<string, Record<string, RelationshipInfo>>);
49
+ /**
50
+ * Build a Prisma filter from SQL RLS analysis
51
+ */
52
+ buildFilter(modelName: string, analysis: SQLAnalysis, userVar?: string): string;
53
+ /**
54
+ * Build filter for user field comparison (handles relationships)
55
+ */
56
+ buildUserFieldFilter(modelName: string, fieldName: string, userField: string, userVar: string): string | null;
57
+ /**
58
+ * Convert user field to proper path
59
+ */
60
+ convertToUserFieldPath(userField: string, userVar: string): string;
61
+ /**
62
+ * Build Prisma relation filter
63
+ */
64
+ buildRelationFilter(relationName: string, relationInfo: RelationshipInfo, fieldName: string, value: string): string;
65
+ /**
66
+ * Infer relation type from model data
67
+ */
68
+ inferRelationType(modelInfo: ModelInfo | null, relationName: string): 'one' | 'many';
69
+ /**
70
+ * Build JavaScript equivalent of Prisma filter (for hasAccess)
71
+ */
72
+ buildJavaScriptCondition(modelName: string, analysis: SQLAnalysis, dataVar?: string, userVar?: string): string;
73
+ /**
74
+ * Build JavaScript condition for user field (handles relations)
75
+ */
76
+ buildUserFieldJavaScript(modelName: string, fieldName: string, userField: string, dataVar: string, userVar: string): string | null;
77
+ }
78
+ export default PrismaFilterBuilder;
79
+ //# sourceMappingURL=prismaFilterBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prismaFilterBuilder.d.ts","sourceRoot":"","sources":["../../../src/parsers/prismaFilterBuilder.ts"],"names":[],"mappings":"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"}