@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.
- 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 +172 -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,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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"}
|