@rapidd/build 2.0.3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -165
- package/dist/bin/cli.js +0 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/index.d.ts +2 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -12
- package/dist/index.js.map +1 -1
- package/dist/src/commands/build.d.ts +1 -3
- package/dist/src/commands/build.d.ts.map +1 -1
- package/dist/src/commands/build.js +1 -106
- package/dist/src/commands/build.js.map +1 -1
- package/dist/src/generators/aclGenerator.d.ts +2 -2
- package/dist/src/generators/aclGenerator.d.ts.map +1 -1
- package/dist/src/generators/aclGenerator.js +11 -304
- package/dist/src/generators/aclGenerator.js.map +1 -1
- package/dist/src/generators/modelGenerator.d.ts +1 -1
- package/dist/src/generators/modelGenerator.d.ts.map +1 -1
- package/dist/src/generators/modelGenerator.js +46 -16
- package/dist/src/generators/modelGenerator.js.map +1 -1
- package/dist/src/generators/routeGenerator.d.ts +1 -1
- package/dist/src/generators/routeGenerator.d.ts.map +1 -1
- package/dist/src/generators/routeGenerator.js +6 -2
- package/dist/src/generators/routeGenerator.js.map +1 -1
- package/dist/src/parsers/index.d.ts +1 -10
- package/dist/src/parsers/index.d.ts.map +1 -1
- package/dist/src/parsers/index.js +1 -14
- package/dist/src/parsers/index.js.map +1 -1
- package/dist/src/parsers/prismaParser.d.ts +1 -1
- package/dist/src/parsers/prismaParser.d.ts.map +1 -1
- package/dist/src/parsers/prismaParser.js +7 -7
- package/dist/src/parsers/prismaParser.js.map +1 -1
- package/dist/src/parsers/types.d.ts +33 -0
- package/dist/src/parsers/types.d.ts.map +1 -0
- package/dist/src/parsers/types.js +3 -0
- package/dist/src/parsers/types.js.map +1 -0
- package/package.json +14 -19
- package/dist/src/parsers/datasourceParser.d.ts +0 -11
- package/dist/src/parsers/datasourceParser.d.ts.map +0 -1
- package/dist/src/parsers/datasourceParser.js +0 -131
- package/dist/src/parsers/datasourceParser.js.map +0 -1
- package/dist/src/parsers/deepSQLAnalyzer.d.ts +0 -85
- package/dist/src/parsers/deepSQLAnalyzer.d.ts.map +0 -1
- package/dist/src/parsers/deepSQLAnalyzer.js +0 -482
- package/dist/src/parsers/deepSQLAnalyzer.js.map +0 -1
- package/dist/src/parsers/enhancedRLSConverter.d.ts +0 -14
- package/dist/src/parsers/enhancedRLSConverter.d.ts.map +0 -1
- package/dist/src/parsers/enhancedRLSConverter.js +0 -168
- package/dist/src/parsers/enhancedRLSConverter.js.map +0 -1
- package/dist/src/parsers/functionAnalyzer.d.ts +0 -55
- package/dist/src/parsers/functionAnalyzer.d.ts.map +0 -1
- package/dist/src/parsers/functionAnalyzer.js +0 -274
- package/dist/src/parsers/functionAnalyzer.js.map +0 -1
- package/dist/src/parsers/prismaFilterBuilder.d.ts +0 -79
- package/dist/src/parsers/prismaFilterBuilder.d.ts.map +0 -1
- package/dist/src/parsers/prismaFilterBuilder.js +0 -322
- package/dist/src/parsers/prismaFilterBuilder.js.map +0 -1
|
@@ -36,91 +36,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.generateACL = generateACL;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
-
const pg_1 = require("pg");
|
|
40
|
-
const enhancedRLSConverter_1 = require("../parsers/enhancedRLSConverter");
|
|
41
|
-
const functionAnalyzer_1 = require("../parsers/functionAnalyzer");
|
|
42
39
|
/**
|
|
43
|
-
*
|
|
40
|
+
* Generate permissive ACL entry for a single model
|
|
44
41
|
*/
|
|
45
|
-
function
|
|
46
|
-
|
|
47
|
-
return userTableOption;
|
|
48
|
-
}
|
|
49
|
-
const modelNames = Object.keys(models);
|
|
50
|
-
const userTables = modelNames.filter(name => name.toLowerCase() === 'user' || name.toLowerCase() === 'users');
|
|
51
|
-
if (userTables.length === 0) {
|
|
52
|
-
throw new Error('No user table found (user/users). Please specify --user-table option.');
|
|
53
|
-
}
|
|
54
|
-
if (userTables.length > 1) {
|
|
55
|
-
throw new Error(`Multiple user tables found: ${userTables.join(', ')}. Please specify --user-table option.`);
|
|
56
|
-
}
|
|
57
|
-
return userTables[0];
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Extract ACL policies from PostgreSQL RLS
|
|
61
|
-
*/
|
|
62
|
-
async function extractPostgreSQLPolicies(databaseUrl, models) {
|
|
63
|
-
const client = new pg_1.Client({ connectionString: databaseUrl });
|
|
64
|
-
try {
|
|
65
|
-
await client.connect();
|
|
66
|
-
const policies = {};
|
|
67
|
-
// Create mapping from database table name to model name
|
|
68
|
-
const tableToModelMap = {};
|
|
69
|
-
for (const [modelName, modelData] of Object.entries(models)) {
|
|
70
|
-
const dbName = modelData.dbName || modelName.toLowerCase();
|
|
71
|
-
tableToModelMap[dbName] = modelName;
|
|
72
|
-
policies[modelName] = [];
|
|
73
|
-
}
|
|
74
|
-
// Query all policies from PostgreSQL RLS (pg_policies)
|
|
75
|
-
const result = await client.query(`
|
|
76
|
-
SELECT
|
|
77
|
-
tablename,
|
|
78
|
-
policyname,
|
|
79
|
-
permissive,
|
|
80
|
-
roles,
|
|
81
|
-
cmd,
|
|
82
|
-
qual,
|
|
83
|
-
with_check
|
|
84
|
-
FROM pg_policies
|
|
85
|
-
WHERE schemaname = 'public'
|
|
86
|
-
ORDER BY tablename, policyname
|
|
87
|
-
`);
|
|
88
|
-
// Group policies by model (using table to model mapping)
|
|
89
|
-
for (const row of result.rows) {
|
|
90
|
-
const tableName = row.tablename;
|
|
91
|
-
const modelName = tableToModelMap[tableName];
|
|
92
|
-
if (modelName && policies[modelName] !== undefined) {
|
|
93
|
-
policies[modelName].push({
|
|
94
|
-
name: row.policyname,
|
|
95
|
-
permissive: row.permissive === 'PERMISSIVE',
|
|
96
|
-
roles: row.roles,
|
|
97
|
-
command: row.cmd,
|
|
98
|
-
using: row.qual,
|
|
99
|
-
withCheck: row.with_check
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
await client.end();
|
|
104
|
-
return policies;
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
try {
|
|
108
|
-
await client.end();
|
|
109
|
-
}
|
|
110
|
-
catch (_e) {
|
|
111
|
-
// ignore
|
|
112
|
-
}
|
|
113
|
-
throw error;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Generate ACL functions for a single model from PostgreSQL policies
|
|
118
|
-
*/
|
|
119
|
-
function generateModelACL(modelName, policies, converter) {
|
|
120
|
-
const hasPolicies = policies && policies.length > 0;
|
|
121
|
-
if (!hasPolicies) {
|
|
122
|
-
// No policies - generate permissive access
|
|
123
|
-
return ` ${modelName}: {
|
|
42
|
+
function generateModelACL(modelName) {
|
|
43
|
+
return ` ${modelName}: {
|
|
124
44
|
canCreate(_user: RapiddUser): boolean {
|
|
125
45
|
return true;
|
|
126
46
|
},
|
|
@@ -137,248 +57,35 @@ function generateModelACL(modelName, policies, converter) {
|
|
|
137
57
|
return [];
|
|
138
58
|
},
|
|
139
59
|
}`;
|
|
140
|
-
}
|
|
141
|
-
// Find policies by command type
|
|
142
|
-
const selectPolicies = policies.filter(p => p.command === 'SELECT' || p.command === 'ALL');
|
|
143
|
-
const insertPolicies = policies.filter(p => p.command === 'INSERT' || p.command === 'ALL');
|
|
144
|
-
const updatePolicies = policies.filter(p => p.command === 'UPDATE' || p.command === 'ALL');
|
|
145
|
-
const deletePolicies = policies.filter(p => p.command === 'DELETE' || p.command === 'ALL');
|
|
146
|
-
// Generate each function
|
|
147
|
-
const canCreateCode = generateFunction(insertPolicies, 'withCheck', converter, modelName);
|
|
148
|
-
const accessFilterCode = generateFilter(selectPolicies, 'using', converter, modelName);
|
|
149
|
-
let updateFilterCode = generateFilter(updatePolicies, 'using', converter, modelName);
|
|
150
|
-
let deleteFilterCode = generateFilter(deletePolicies, 'using', converter, modelName);
|
|
151
|
-
// If update/delete filters are empty/false but access filter is not, copy access filter
|
|
152
|
-
if ((updateFilterCode === 'return false;' || updateFilterCode === 'return {};') &&
|
|
153
|
-
accessFilterCode !== 'return false;' && accessFilterCode !== 'return {};') {
|
|
154
|
-
updateFilterCode = accessFilterCode;
|
|
155
|
-
}
|
|
156
|
-
if ((deleteFilterCode === 'return false;' || deleteFilterCode === 'return {};') &&
|
|
157
|
-
accessFilterCode !== 'return false;' && accessFilterCode !== 'return {};') {
|
|
158
|
-
deleteFilterCode = accessFilterCode;
|
|
159
|
-
}
|
|
160
|
-
return ` ${modelName}: {
|
|
161
|
-
canCreate(user: RapiddUser): boolean {
|
|
162
|
-
${canCreateCode}
|
|
163
|
-
},
|
|
164
|
-
getAccessFilter(user: RapiddUser): Record<string, unknown> | boolean {
|
|
165
|
-
${accessFilterCode}
|
|
166
|
-
},
|
|
167
|
-
getUpdateFilter(user: RapiddUser): Record<string, unknown> | boolean | false {
|
|
168
|
-
${updateFilterCode}
|
|
169
|
-
},
|
|
170
|
-
getDeleteFilter(user: RapiddUser): Record<string, unknown> | boolean | false {
|
|
171
|
-
${deleteFilterCode}
|
|
172
|
-
},
|
|
173
|
-
getOmitFields(_user: RapiddUser): string[] {
|
|
174
|
-
return [];
|
|
175
|
-
},
|
|
176
|
-
}`;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Generate JavaScript function from policies
|
|
180
|
-
*/
|
|
181
|
-
function generateFunction(policies, expressionField, converter, modelName) {
|
|
182
|
-
if (policies.length === 0) {
|
|
183
|
-
return 'return true;';
|
|
184
|
-
}
|
|
185
|
-
const conditions = [];
|
|
186
|
-
for (const policy of policies) {
|
|
187
|
-
const expr = expressionField === 'withCheck'
|
|
188
|
-
? (policy.withCheck || policy.using)
|
|
189
|
-
: policy[expressionField];
|
|
190
|
-
if (expr) {
|
|
191
|
-
try {
|
|
192
|
-
const jsExpr = converter.convertToJavaScript(expr, 'data', 'user', modelName);
|
|
193
|
-
console.log(` Policy '${policy.name}': ${expr.substring(0, 50)}... -> ${jsExpr.substring(0, 80)}`);
|
|
194
|
-
conditions.push(jsExpr);
|
|
195
|
-
}
|
|
196
|
-
catch (e) {
|
|
197
|
-
console.warn(` Failed to convert policy '${policy.name}' for ${modelName}: ${e.message}`);
|
|
198
|
-
console.warn(` SQL: ${expr}`);
|
|
199
|
-
conditions.push(`true /* TODO: Manual conversion needed for policy '${policy.name}' */`);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
if (conditions.length === 0) {
|
|
204
|
-
return 'return true;';
|
|
205
|
-
}
|
|
206
|
-
// If any condition is 'true', the entire expression is true
|
|
207
|
-
if (conditions.some(c => c === 'true' || c.startsWith('true /*'))) {
|
|
208
|
-
return 'return true;';
|
|
209
|
-
}
|
|
210
|
-
// Policies are OR'd together (any policy allows)
|
|
211
|
-
return `return ${conditions.join(' || ')};`;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Generate Prisma filter function
|
|
215
|
-
*/
|
|
216
|
-
function generateFilter(policies, expressionField, converter, modelName) {
|
|
217
|
-
if (policies.length === 0) {
|
|
218
|
-
return 'return false;';
|
|
219
|
-
}
|
|
220
|
-
const filtersWithRoles = [];
|
|
221
|
-
for (const policy of policies) {
|
|
222
|
-
const expr = policy[expressionField];
|
|
223
|
-
if (expr) {
|
|
224
|
-
try {
|
|
225
|
-
const prismaFilter = converter.convertToPrismaFilter(expr, 'user', modelName);
|
|
226
|
-
const analysis = converter.analyzer ? converter.analyzer.analyzeSQLForFilters(expr) : null;
|
|
227
|
-
// Track role conditions and data filters separately
|
|
228
|
-
const roleConditions = analysis?.conditions?.filter(c => c.type === 'role_any' || c.type === 'role_equal') || [];
|
|
229
|
-
filtersWithRoles.push({
|
|
230
|
-
filter: prismaFilter,
|
|
231
|
-
roleConditions,
|
|
232
|
-
hasDataFilter: prismaFilter !== '{}'
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
catch (e) {
|
|
236
|
-
console.warn(` Failed to convert filter policy '${policy.name}' for ${modelName}: ${e.message}`);
|
|
237
|
-
console.warn(` SQL: ${expr}`);
|
|
238
|
-
// On error, skip filter (fail-safe - no access)
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
if (filtersWithRoles.length === 0) {
|
|
243
|
-
return 'return false;';
|
|
244
|
-
}
|
|
245
|
-
// Build conditional filter logic
|
|
246
|
-
return buildConditionalFilter(filtersWithRoles);
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Build conditional filter with role checks
|
|
250
|
-
*/
|
|
251
|
-
function buildConditionalFilter(filtersWithRoles) {
|
|
252
|
-
const roleOnlyFilters = [];
|
|
253
|
-
const dataFilters = [];
|
|
254
|
-
for (const item of filtersWithRoles) {
|
|
255
|
-
if (item.roleConditions.length > 0 && !item.hasDataFilter) {
|
|
256
|
-
// Pure role check - return {} if role matches
|
|
257
|
-
roleOnlyFilters.push(...item.roleConditions);
|
|
258
|
-
}
|
|
259
|
-
else if (item.roleConditions.length > 0 && item.hasDataFilter) {
|
|
260
|
-
// Has both role and data filter - already handled with if statement
|
|
261
|
-
if (item.filter.includes('if (')) {
|
|
262
|
-
return item.filter;
|
|
263
|
-
}
|
|
264
|
-
dataFilters.push(item.filter);
|
|
265
|
-
}
|
|
266
|
-
else if (item.hasDataFilter) {
|
|
267
|
-
// Data filter only
|
|
268
|
-
dataFilters.push(item.filter);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
// Generate conditional code
|
|
272
|
-
const conditions = [];
|
|
273
|
-
// Collect all roles that grant full access
|
|
274
|
-
const rolesWithFullAccess = new Set();
|
|
275
|
-
for (const roleCond of roleOnlyFilters) {
|
|
276
|
-
if (roleCond.type === 'role_any' && roleCond.roles) {
|
|
277
|
-
roleCond.roles.forEach(r => rolesWithFullAccess.add(r));
|
|
278
|
-
}
|
|
279
|
-
else if (roleCond.type === 'role_equal' && roleCond.role) {
|
|
280
|
-
rolesWithFullAccess.add(roleCond.role);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
// Add single consolidated role check if needed
|
|
284
|
-
if (rolesWithFullAccess.size > 0) {
|
|
285
|
-
const roleArray = Array.from(rolesWithFullAccess);
|
|
286
|
-
if (roleArray.length === 1) {
|
|
287
|
-
conditions.push(`if (user?.role === '${roleArray[0]}') return {};`);
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
conditions.push(`if ([${roleArray.map(r => `'${r}'`).join(', ')}].includes(user?.role)) return {};`);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
// Deduplicate data filters
|
|
294
|
-
const uniqueDataFilters = [...new Set(dataFilters)];
|
|
295
|
-
// Add final return with data filters
|
|
296
|
-
if (uniqueDataFilters.length === 0) {
|
|
297
|
-
conditions.push('return false;');
|
|
298
|
-
}
|
|
299
|
-
else if (uniqueDataFilters.length === 1) {
|
|
300
|
-
conditions.push(`return ${uniqueDataFilters[0]};`);
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
conditions.push(`return { OR: [${uniqueDataFilters.join(', ')}] };`);
|
|
304
|
-
}
|
|
305
|
-
return conditions.join(' ');
|
|
306
60
|
}
|
|
307
61
|
/**
|
|
308
62
|
* Generate complete acl.ts file (TypeScript)
|
|
309
63
|
*/
|
|
310
|
-
|
|
311
|
-
// Use allModels for user table detection if provided (when filtering by model)
|
|
312
|
-
const modelsForUserDetection = allModels || models;
|
|
313
|
-
const _userTable = detectUserTable(modelsForUserDetection, userTableOption);
|
|
64
|
+
function generateACL(models, outputPath) {
|
|
314
65
|
const modelNames = Object.keys(models);
|
|
315
|
-
let policies = {};
|
|
316
|
-
// Create enhanced converter with analyzed functions, models, and relationships
|
|
317
|
-
let converter = (0, enhancedRLSConverter_1.createEnhancedConverter)({}, {}, models, relationships);
|
|
318
|
-
if (isPostgreSQL && databaseUrl) {
|
|
319
|
-
console.log('PostgreSQL detected - analyzing database...');
|
|
320
|
-
// Step 1: Analyze functions
|
|
321
|
-
try {
|
|
322
|
-
const functionAnalysis = await (0, functionAnalyzer_1.analyzeFunctions)(databaseUrl);
|
|
323
|
-
console.log(`Analyzed ${Object.keys(functionAnalysis.functionMappings).length} PostgreSQL functions`);
|
|
324
|
-
// Create enhanced converter with analyzed mappings, models, and relationships
|
|
325
|
-
converter = (0, enhancedRLSConverter_1.createEnhancedConverter)(functionAnalysis.functionMappings, functionAnalysis.sessionVariables, models, relationships);
|
|
326
|
-
// Save function analysis for debugging (only if --debug flag is set)
|
|
327
|
-
if (debug) {
|
|
328
|
-
const configPath = path.join(path.dirname(outputPath), 'acl-mappings.json');
|
|
329
|
-
const mappingConfig = (0, functionAnalyzer_1.generateMappingConfig)(functionAnalysis);
|
|
330
|
-
fs.writeFileSync(configPath, JSON.stringify(mappingConfig, null, 2));
|
|
331
|
-
console.log(`Function mappings saved to ${configPath}`);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
catch (error) {
|
|
335
|
-
console.warn(`Could not analyze functions: ${error.message}`);
|
|
336
|
-
}
|
|
337
|
-
// Step 2: Extract policies
|
|
338
|
-
try {
|
|
339
|
-
policies = await extractPostgreSQLPolicies(databaseUrl, models);
|
|
340
|
-
const totalPolicies = Object.values(policies).reduce((sum, p) => sum + p.length, 0);
|
|
341
|
-
console.log(`Extracted ${totalPolicies} policies from PostgreSQL RLS`);
|
|
342
|
-
}
|
|
343
|
-
catch (error) {
|
|
344
|
-
console.warn(`Failed to extract PostgreSQL policies: ${error.message}`);
|
|
345
|
-
console.log('Generating permissive ACL for all models...');
|
|
346
|
-
for (const modelName of modelNames) {
|
|
347
|
-
policies[modelName] = [];
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
else {
|
|
352
|
-
if (!isPostgreSQL) {
|
|
353
|
-
console.log('Non-PostgreSQL database detected - generating permissive ACL');
|
|
354
|
-
}
|
|
355
|
-
console.log('Generating permissive ACL for all models...');
|
|
356
|
-
for (const modelName of modelNames) {
|
|
357
|
-
policies[modelName] = [];
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
// Generate ACL TypeScript code
|
|
361
66
|
let aclCode = `import type { AclConfig, RapiddUser } from '../types';
|
|
362
67
|
|
|
363
68
|
const acl: AclConfig = {
|
|
364
69
|
model: {
|
|
365
70
|
`;
|
|
366
|
-
|
|
367
|
-
return generateModelACL(modelName, policies[modelName], converter);
|
|
368
|
-
});
|
|
369
|
-
aclCode += modelACLCode.join(',\n');
|
|
71
|
+
aclCode += modelNames.map(modelName => generateModelACL(modelName)).join(',\n');
|
|
370
72
|
aclCode += `
|
|
371
73
|
},
|
|
372
74
|
};
|
|
373
75
|
|
|
374
76
|
export default acl;
|
|
375
77
|
`;
|
|
78
|
+
// Skip if file already exists
|
|
79
|
+
if (fs.existsSync(outputPath)) {
|
|
80
|
+
console.log('Skipped acl.ts (exists)');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
376
83
|
// Ensure output directory exists
|
|
377
84
|
const outputDir = path.dirname(outputPath);
|
|
378
85
|
if (!fs.existsSync(outputDir)) {
|
|
379
86
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
380
87
|
}
|
|
381
88
|
fs.writeFileSync(outputPath, aclCode);
|
|
382
|
-
console.log('Generated acl.ts
|
|
89
|
+
console.log('Generated acl.ts');
|
|
383
90
|
}
|
|
384
91
|
//# sourceMappingURL=aclGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aclGenerator.js","sourceRoot":"","sources":["../../../src/generators/aclGenerator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aclGenerator.js","sourceRoot":"","sources":["../../../src/generators/aclGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,kCAmCC;AAjED,uCAAyB;AACzB,2CAA6B;AAG7B;;GAEG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,WAAW,SAAS;;;;;;;;;;;;;;;;UAgBnB,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CACzB,MAAiC,EACjC,UAAkB;IAElB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,OAAO,GAAG;;;;CAIf,CAAC;IAEA,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEhF,OAAO,IAAI;;;;;CAKZ,CAAC;IAEA,8BAA8B;IAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/modelGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"modelGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/modelGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAalD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,GAAG,MAAM,CAkFlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAkB3F"}
|
|
@@ -54,7 +54,7 @@ function generateModelFile(modelName, _modelInfo) {
|
|
|
54
54
|
const className = toClassName(modelName);
|
|
55
55
|
return `import { Model } from '../orm/Model';
|
|
56
56
|
import { QueryBuilder, prisma } from '../orm/QueryBuilder';
|
|
57
|
-
import type { ModelOptions, GetManyResult } from '../types';
|
|
57
|
+
import type { ModelOptions, GetManyResult, UpsertManyOptions, UpsertManyResult } from '../types';
|
|
58
58
|
|
|
59
59
|
export class ${className} extends Model {
|
|
60
60
|
constructor(options?: ModelOptions) {
|
|
@@ -62,30 +62,56 @@ export class ${className} extends Model {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
async getMany(
|
|
65
|
-
q: Record<string,
|
|
66
|
-
include: string | Record<string,
|
|
65
|
+
q: Record<string, any> = {},
|
|
66
|
+
include: string | Record<string, any> = "",
|
|
67
67
|
limit: number = 25,
|
|
68
68
|
offset: number = 0,
|
|
69
|
-
sortBy: string =
|
|
70
|
-
sortOrder:
|
|
69
|
+
sortBy: string = this.defaultSortField,
|
|
70
|
+
sortOrder: string = "asc",
|
|
71
|
+
fields: string | null = null
|
|
71
72
|
): Promise<GetManyResult> {
|
|
72
|
-
return await this._getMany(q, include, Number(limit), Number(offset), sortBy, sortOrder);
|
|
73
|
+
return await this._getMany(q, include, Number(limit), Number(offset), sortBy, sortOrder, {}, fields);
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Fetch a single record by primary key
|
|
78
|
+
*/
|
|
79
|
+
async get(id: string | number | Record<string, any>, include?: string | Record<string, any>, options: Record<string, any> = {}, fields: string | null = null): Promise<any> {
|
|
80
|
+
return await this._get(id, include, options, fields);
|
|
77
81
|
}
|
|
78
82
|
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Create a new record
|
|
85
|
+
*/
|
|
86
|
+
async create(data: Record<string, any>, options: Record<string, any> = {}): Promise<any> {
|
|
87
|
+
return await this._create(data, options);
|
|
81
88
|
}
|
|
82
89
|
|
|
83
|
-
|
|
84
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Update an existing record by primary key
|
|
92
|
+
*/
|
|
93
|
+
async update(id: string | number | Record<string, any>, data: Record<string, any>, options: Record<string, any> = {}): Promise<any> {
|
|
94
|
+
return await this._update(id, data, options);
|
|
85
95
|
}
|
|
86
96
|
|
|
87
|
-
|
|
88
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Create or update a record based on unique key
|
|
99
|
+
*/
|
|
100
|
+
async upsert(data: Record<string, any>, unique_key: string | string[] = this.primaryKey, options: Record<string, any> = {}): Promise<any> {
|
|
101
|
+
return await this._upsert(data, unique_key, options);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Create or update multiple records based on unique key
|
|
106
|
+
* Performs atomic batch operations with optional transaction support
|
|
107
|
+
*/
|
|
108
|
+
async upsertMany(
|
|
109
|
+
data: Record<string, any>[],
|
|
110
|
+
unique_key: string | string[] = this.primaryKey,
|
|
111
|
+
prismaOptions: Record<string, any> = {},
|
|
112
|
+
options: UpsertManyOptions = {}
|
|
113
|
+
): Promise<UpsertManyResult> {
|
|
114
|
+
return await this._upsertMany(data, unique_key, prismaOptions, options);
|
|
89
115
|
}
|
|
90
116
|
|
|
91
117
|
async delete(id: string | number): Promise<Record<string, unknown>> {
|
|
@@ -114,11 +140,15 @@ function generateAllModels(models, modelDir) {
|
|
|
114
140
|
if (!fs.existsSync(modelDir)) {
|
|
115
141
|
fs.mkdirSync(modelDir, { recursive: true });
|
|
116
142
|
}
|
|
117
|
-
// Generate individual model files
|
|
143
|
+
// Generate individual model files (skip existing)
|
|
118
144
|
for (const [modelName, modelInfo] of Object.entries(models)) {
|
|
119
|
-
const modelCode = generateModelFile(modelName, modelInfo);
|
|
120
145
|
const className = toClassName(modelName);
|
|
121
146
|
const modelPath = path.join(modelDir, `${className}.ts`);
|
|
147
|
+
if (fs.existsSync(modelPath)) {
|
|
148
|
+
console.log(`Skipped model (exists): ${className}.ts`);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const modelCode = generateModelFile(modelName, modelInfo);
|
|
122
152
|
fs.writeFileSync(modelPath, modelCode);
|
|
123
153
|
console.log(`Generated model: ${className}.ts`);
|
|
124
154
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelGenerator.js","sourceRoot":"","sources":["../../../src/generators/modelGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,
|
|
1
|
+
{"version":3,"file":"modelGenerator.js","sourceRoot":"","sources":["../../../src/generators/modelGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,8CAkFC;AAKD,8CAkBC;AA3HD,uCAAyB;AACzB,2CAA6B;AAG7B;;GAEG;AACH,SAAS,WAAW,CAAC,SAAiB;IACpC,OAAO,SAAS;SACb,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACzD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,UAAqB;IACxE,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAEzC,OAAO;;;;eAIM,SAAS;;iBAEP,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAoE6B,SAAS;;;;CAI/D,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,MAAiC,EAAE,QAAgB;IACnF,6CAA6C;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,kDAAkD;IAClD,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;QACzD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,KAAK,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,KAAK,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"routeGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAalD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA+E3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAiB5F"}
|
|
@@ -137,10 +137,14 @@ function generateAllRoutes(models, routesDir) {
|
|
|
137
137
|
if (!fs.existsSync(routesDir)) {
|
|
138
138
|
fs.mkdirSync(routesDir, { recursive: true });
|
|
139
139
|
}
|
|
140
|
-
// Generate individual route files
|
|
140
|
+
// Generate individual route files (skip existing)
|
|
141
141
|
for (const modelName of Object.keys(models)) {
|
|
142
|
-
const routeCode = generateRouteFile(modelName);
|
|
143
142
|
const routePath = path.join(routesDir, `${modelName}.ts`);
|
|
143
|
+
if (fs.existsSync(routePath)) {
|
|
144
|
+
console.log(`Skipped route (exists): ${modelName}.ts`);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const routeCode = generateRouteFile(modelName);
|
|
144
148
|
fs.writeFileSync(routePath, routeCode);
|
|
145
149
|
console.log(`Generated route: ${modelName}.ts`);
|
|
146
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeGenerator.js","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,8CA+EC;AAKD,
|
|
1
|
+
{"version":3,"file":"routeGenerator.js","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,8CA+EC;AAKD,8CAiBC;AAvHD,uCAAyB;AACzB,2CAA6B;AAG7B;;GAEG;AACH,SAAS,WAAW,CAAC,SAAiB;IACpC,OAAO,SAAS;SACb,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACzD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAEzC,OAAO;WACE,SAAS,8CAA8C,SAAS;;QAEnE,SAAS;;;;;2BAKU,SAAS,UAAU,SAAS;;;;;;6CAMV,SAAS,OAAO,SAAS;;;;;;;;;;;;;6CAazB,SAAS,OAAO,SAAS;;;;;;;;;;;;6CAYzB,SAAS,OAAO,SAAS;;;;;;;;;;;;;6CAazB,SAAS,OAAO,SAAS;;;;;;;;;;;;6CAYzB,SAAS,OAAO,SAAS;;0FAEoB,SAAS;;;;;;;;iBAQlF,SAAS;CACzB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,MAAiC,EAAE,SAAiB;IACpF,8CAA8C;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,kDAAkD;IAClD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;QAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,KAAK,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,KAAK,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
export { parsePrismaSchema, parsePrismaDMMF } from './prismaParser';
|
|
2
2
|
export type { ParsedSchema } from './prismaParser';
|
|
3
|
-
export {
|
|
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';
|
|
3
|
+
export type { ModelField, ModelRelation, ModelInfo } from './types';
|
|
13
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
// Re-export all parsers
|
|
3
|
+
exports.parsePrismaDMMF = exports.parsePrismaSchema = void 0;
|
|
5
4
|
var prismaParser_1 = require("./prismaParser");
|
|
6
5
|
Object.defineProperty(exports, "parsePrismaSchema", { enumerable: true, get: function () { return prismaParser_1.parsePrismaSchema; } });
|
|
7
6
|
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
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":";;;AAAA,+CAAoE;AAA3D,iHAAA,iBAAiB,OAAA;AAAE,+GAAA,eAAe,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prismaParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/prismaParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAA6B,MAAM,
|
|
1
|
+
{"version":3,"file":"prismaParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/prismaParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAA6B,MAAM,SAAS,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACjC;AA8BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAqClE;AAuHD;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAqEtF"}
|
|
@@ -200,14 +200,14 @@ function parseEnumValues(enumBody) {
|
|
|
200
200
|
*/
|
|
201
201
|
async function parsePrismaDMMF(schemaPath) {
|
|
202
202
|
try {
|
|
203
|
-
|
|
204
|
-
//
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
//
|
|
203
|
+
const { getDMMF, getSchemaWithPath } = require('@prisma/internals');
|
|
204
|
+
// Use Prisma 7's schema loader (handles prisma.config.ts and multi-file schemas)
|
|
205
|
+
const schemaResult = await getSchemaWithPath({
|
|
206
|
+
schemaPath: { cliProvidedPath: schemaPath }
|
|
207
|
+
});
|
|
208
|
+
// Pass schemas as [filePath, content] tuples for Prisma 7 compatibility
|
|
209
209
|
const dmmf = await getDMMF({
|
|
210
|
-
datamodel:
|
|
210
|
+
datamodel: schemaResult.schemas
|
|
211
211
|
});
|
|
212
212
|
const models = {};
|
|
213
213
|
for (const model of dmmf.datamodel.models) {
|