@rapidd/build 1.2.3 → 2.0.1
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 +148 -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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateACL = exports.generateAllRoutes = exports.generateRouteFile = exports.generateAllModels = exports.generateModelFile = void 0;
|
|
4
|
+
// Re-export all generators
|
|
5
|
+
var modelGenerator_1 = require("./modelGenerator");
|
|
6
|
+
Object.defineProperty(exports, "generateModelFile", { enumerable: true, get: function () { return modelGenerator_1.generateModelFile; } });
|
|
7
|
+
Object.defineProperty(exports, "generateAllModels", { enumerable: true, get: function () { return modelGenerator_1.generateAllModels; } });
|
|
8
|
+
var routeGenerator_1 = require("./routeGenerator");
|
|
9
|
+
Object.defineProperty(exports, "generateRouteFile", { enumerable: true, get: function () { return routeGenerator_1.generateRouteFile; } });
|
|
10
|
+
Object.defineProperty(exports, "generateAllRoutes", { enumerable: true, get: function () { return routeGenerator_1.generateAllRoutes; } });
|
|
11
|
+
var aclGenerator_1 = require("./aclGenerator");
|
|
12
|
+
Object.defineProperty(exports, "generateACL", { enumerable: true, get: function () { return aclGenerator_1.generateACL; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generators/index.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AAC3B,mDAAwE;AAA/D,mHAAA,iBAAiB,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAC7C,mDAAwE;AAA/D,mHAAA,iBAAiB,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAC7C,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ModelInfo } from '../parsers/prismaFilterBuilder';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a single model file (TypeScript)
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateModelFile(modelName: string, _modelInfo: ModelInfo): string;
|
|
6
|
+
/**
|
|
7
|
+
* Generate all model files
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateAllModels(models: Record<string, ModelInfo>, modelDir: string): void;
|
|
10
|
+
//# sourceMappingURL=modelGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/modelGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAahE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,GAAG,MAAM,CAwDlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAmB3F"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateModelFile = generateModelFile;
|
|
37
|
+
exports.generateAllModels = generateAllModels;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
/**
|
|
41
|
+
* Convert model name to PascalCase class name
|
|
42
|
+
*/
|
|
43
|
+
function toClassName(modelName) {
|
|
44
|
+
return modelName
|
|
45
|
+
.split(/[^a-zA-Z0-9]+/)
|
|
46
|
+
.filter(Boolean)
|
|
47
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
48
|
+
.join('');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate a single model file (TypeScript)
|
|
52
|
+
*/
|
|
53
|
+
function generateModelFile(modelName, _modelInfo) {
|
|
54
|
+
const className = toClassName(modelName);
|
|
55
|
+
return `import { Model } from '../orm/Model';
|
|
56
|
+
import { QueryBuilder, prisma } from '../orm/QueryBuilder';
|
|
57
|
+
import type { ModelOptions, GetManyResult } from '../types';
|
|
58
|
+
|
|
59
|
+
export class ${className} extends Model {
|
|
60
|
+
constructor(options?: ModelOptions) {
|
|
61
|
+
super('${modelName}', options);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async getMany(
|
|
65
|
+
q: Record<string, unknown> = {},
|
|
66
|
+
include: string | Record<string, unknown> = '',
|
|
67
|
+
limit: number = 25,
|
|
68
|
+
offset: number = 0,
|
|
69
|
+
sortBy: string = 'id',
|
|
70
|
+
sortOrder: 'asc' | 'desc' = 'asc'
|
|
71
|
+
): Promise<GetManyResult> {
|
|
72
|
+
return await this._getMany(q, include, Number(limit), Number(offset), sortBy, sortOrder);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async get(id: string | number, include?: string | Record<string, unknown>): Promise<Record<string, unknown>> {
|
|
76
|
+
return await this._get(id, include);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async create(data: Record<string, unknown>): Promise<Record<string, unknown>> {
|
|
80
|
+
return await this._create(data);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async update(id: string | number, data: Record<string, unknown>): Promise<Record<string, unknown>> {
|
|
84
|
+
return await this._update(id, data);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async upsert(data: Record<string, unknown>, unique_key: string = this.primaryKey): Promise<Record<string, unknown>> {
|
|
88
|
+
return await this._upsert(data, unique_key);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async delete(id: string | number): Promise<Record<string, unknown>> {
|
|
92
|
+
return await this._delete(id);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
filter(include: string | Record<string, unknown>): Record<string, unknown> {
|
|
96
|
+
return { ...this._filter(include), ...this.getAccessFilter() };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
include(include: string | Record<string, unknown>): Record<string, unknown> {
|
|
100
|
+
return this._include(include);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static override QueryBuilder = new QueryBuilder('${modelName}');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { QueryBuilder, prisma };
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Generate all model files
|
|
111
|
+
*/
|
|
112
|
+
function generateAllModels(models, modelDir) {
|
|
113
|
+
// Create model directory if it doesn't exist
|
|
114
|
+
if (!fs.existsSync(modelDir)) {
|
|
115
|
+
fs.mkdirSync(modelDir, { recursive: true });
|
|
116
|
+
}
|
|
117
|
+
// Generate individual model files
|
|
118
|
+
for (const [modelName, modelInfo] of Object.entries(models)) {
|
|
119
|
+
const modelCode = generateModelFile(modelName, modelInfo);
|
|
120
|
+
const className = toClassName(modelName);
|
|
121
|
+
const modelPath = path.join(modelDir, `${className}.ts`);
|
|
122
|
+
fs.writeFileSync(modelPath, modelCode);
|
|
123
|
+
console.log(`Generated model: ${className}.ts`);
|
|
124
|
+
}
|
|
125
|
+
// Generate index.ts for models
|
|
126
|
+
const indexContent = generateModelsIndex(models);
|
|
127
|
+
fs.writeFileSync(path.join(modelDir, 'index.ts'), indexContent);
|
|
128
|
+
console.log('Generated models/index.ts');
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Generate index.ts that exports all models
|
|
132
|
+
*/
|
|
133
|
+
function generateModelsIndex(models) {
|
|
134
|
+
const exports = [];
|
|
135
|
+
for (const modelName of Object.keys(models)) {
|
|
136
|
+
const className = toClassName(modelName);
|
|
137
|
+
exports.push(`export { ${className} } from './${className}';`);
|
|
138
|
+
}
|
|
139
|
+
exports.push('');
|
|
140
|
+
exports.push("export { QueryBuilder, prisma } from '../orm/QueryBuilder';");
|
|
141
|
+
return exports.join('\n');
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=modelGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelGenerator.js","sourceRoot":"","sources":["../../../src/generators/modelGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,8CAwDC;AAKD,8CAmBC;AAlGD,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDA0C6B,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,kCAAkC;IAClC,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;QACzD,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,+BAA+B;IAC/B,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACjD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAiC;IAC5D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,YAAY,SAAS,cAAc,SAAS,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAE5E,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ModelInfo } from '../parsers/prismaFilterBuilder';
|
|
2
|
+
/**
|
|
3
|
+
* Generate Fastify route for a single model (TypeScript)
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateRouteFile(modelName: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Generate all route files
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateAllRoutes(models: Record<string, ModelInfo>, routesDir: string): void;
|
|
10
|
+
//# sourceMappingURL=routeGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAahE;;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,CAa5F"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateRouteFile = generateRouteFile;
|
|
37
|
+
exports.generateAllRoutes = generateAllRoutes;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
/**
|
|
41
|
+
* Convert model name to PascalCase class name
|
|
42
|
+
*/
|
|
43
|
+
function toClassName(modelName) {
|
|
44
|
+
return modelName
|
|
45
|
+
.split(/[^a-zA-Z0-9]+/)
|
|
46
|
+
.filter(Boolean)
|
|
47
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
48
|
+
.join('');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate Fastify route for a single model (TypeScript)
|
|
52
|
+
*/
|
|
53
|
+
function generateRouteFile(modelName) {
|
|
54
|
+
const className = toClassName(modelName);
|
|
55
|
+
return `import { FastifyPluginAsync, FastifyRequest, FastifyReply } from 'fastify';
|
|
56
|
+
import { ${className}, QueryBuilder } from '../../../src/models/${className}';
|
|
57
|
+
|
|
58
|
+
const ${modelName}Routes: FastifyPluginAsync = async (fastify) => {
|
|
59
|
+
fastify.addHook('preHandler', async (request, reply) => {
|
|
60
|
+
if (!request.user) {
|
|
61
|
+
return reply.sendError(401, 'no_valid_session');
|
|
62
|
+
}
|
|
63
|
+
(request as any).${className} = new ${className}({ user: request.user });
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
fastify.get('/', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
67
|
+
try {
|
|
68
|
+
const { q = {}, include = '', limit = '25', offset = '0', sortBy = 'id', sortOrder = 'asc' } = request.query as Record<string, string>;
|
|
69
|
+
const model = (request as any).${className} as ${className};
|
|
70
|
+
const results = await model.getMany(q, include, Number(limit), Number(offset), sortBy, sortOrder as 'asc' | 'desc');
|
|
71
|
+
return reply.sendList(results.data, results.meta);
|
|
72
|
+
} catch (error: any) {
|
|
73
|
+
const response = QueryBuilder.errorHandler(error);
|
|
74
|
+
return reply.code(response.status_code).send(response);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
fastify.get('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
79
|
+
try {
|
|
80
|
+
const { id } = request.params as { id: string };
|
|
81
|
+
const { include = '' } = request.query as { include?: string };
|
|
82
|
+
const model = (request as any).${className} as ${className};
|
|
83
|
+
const response = await model.get(id, include);
|
|
84
|
+
return reply.send(response);
|
|
85
|
+
} catch (error: any) {
|
|
86
|
+
const response = QueryBuilder.errorHandler(error);
|
|
87
|
+
return reply.code(response.status_code).send(response);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
fastify.post('/', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
92
|
+
const payload = request.body as Record<string, unknown>;
|
|
93
|
+
try {
|
|
94
|
+
const model = (request as any).${className} as ${className};
|
|
95
|
+
const response = await model.create(payload);
|
|
96
|
+
return reply.code(201).send(response);
|
|
97
|
+
} catch (error: any) {
|
|
98
|
+
const response = QueryBuilder.errorHandler(error, payload);
|
|
99
|
+
return reply.code(response.status_code).send(response);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
fastify.patch('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
104
|
+
const { id } = request.params as { id: string };
|
|
105
|
+
const payload = request.body as Record<string, unknown>;
|
|
106
|
+
try {
|
|
107
|
+
const model = (request as any).${className} as ${className};
|
|
108
|
+
const response = await model.update(id, payload);
|
|
109
|
+
return reply.send(response);
|
|
110
|
+
} catch (error: any) {
|
|
111
|
+
const response = QueryBuilder.errorHandler(error, payload);
|
|
112
|
+
return reply.code(response.status_code).send(response);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
fastify.delete('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
117
|
+
try {
|
|
118
|
+
const { id } = request.params as { id: string };
|
|
119
|
+
const model = (request as any).${className} as ${className};
|
|
120
|
+
await model.delete(id);
|
|
121
|
+
return reply.sendResponse(200, 'object_deleted_successfully', { modelName: '${className}' });
|
|
122
|
+
} catch (error: any) {
|
|
123
|
+
const response = QueryBuilder.errorHandler(error);
|
|
124
|
+
return reply.code(response.status_code).send(response);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export default ${modelName}Routes;
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Generate all route files
|
|
134
|
+
*/
|
|
135
|
+
function generateAllRoutes(models, routesDir) {
|
|
136
|
+
// Create routes directory if it doesn't exist
|
|
137
|
+
if (!fs.existsSync(routesDir)) {
|
|
138
|
+
fs.mkdirSync(routesDir, { recursive: true });
|
|
139
|
+
}
|
|
140
|
+
// Generate individual route files
|
|
141
|
+
for (const modelName of Object.keys(models)) {
|
|
142
|
+
const routeCode = generateRouteFile(modelName);
|
|
143
|
+
const routePath = path.join(routesDir, `${modelName}.ts`);
|
|
144
|
+
fs.writeFileSync(routePath, routeCode);
|
|
145
|
+
console.log(`Generated route: ${modelName}.ts`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=routeGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeGenerator.js","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,8CA+EC;AAKD,8CAaC;AAnHD,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,kCAAkC;IAClC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,KAAK,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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface DatasourceConfig {
|
|
2
|
+
provider: string | null;
|
|
3
|
+
url: string | null;
|
|
4
|
+
isPostgreSQL: boolean;
|
|
5
|
+
isMySQL: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Parse datasource configuration from Prisma schema
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseDatasource(schemaPath: string): DatasourceConfig;
|
|
11
|
+
//# sourceMappingURL=datasourceParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasourceParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/datasourceParser.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAkCD;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAmEpE"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseDatasource = parseDatasource;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
// Load .env file if it exists
|
|
40
|
+
try {
|
|
41
|
+
require('dotenv').config({ path: path.join(process.cwd(), '.env') });
|
|
42
|
+
}
|
|
43
|
+
catch (_e) {
|
|
44
|
+
// dotenv not available, skip
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Try to load DATABASE_URL from prisma.config.ts (Prisma 7)
|
|
48
|
+
*/
|
|
49
|
+
function loadUrlFromPrismaConfig() {
|
|
50
|
+
const configPath = path.join(process.cwd(), 'prisma.config.ts');
|
|
51
|
+
if (!fs.existsSync(configPath)) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const configContent = fs.readFileSync(configPath, 'utf-8');
|
|
56
|
+
// Look for env('DATABASE_URL') or similar patterns
|
|
57
|
+
const envMatch = configContent.match(/env\(['"]([^'"]+)['"]\)/);
|
|
58
|
+
if (envMatch) {
|
|
59
|
+
const envVar = envMatch[1];
|
|
60
|
+
return process.env[envVar] || null;
|
|
61
|
+
}
|
|
62
|
+
// Look for direct URL assignment
|
|
63
|
+
const urlMatch = configContent.match(/url:\s*['"]([^'"]+)['"]/);
|
|
64
|
+
if (urlMatch) {
|
|
65
|
+
return urlMatch[1];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (_e) {
|
|
69
|
+
// Failed to read config, return null
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Parse datasource configuration from Prisma schema
|
|
75
|
+
*/
|
|
76
|
+
function parseDatasource(schemaPath) {
|
|
77
|
+
const schemaContent = fs.readFileSync(schemaPath, 'utf-8');
|
|
78
|
+
// Extract datasource block
|
|
79
|
+
const datasourceRegex = /datasource\s+\w+\s*{([^}]*)}/;
|
|
80
|
+
const match = schemaContent.match(datasourceRegex);
|
|
81
|
+
if (!match) {
|
|
82
|
+
throw new Error('No datasource block found in Prisma schema');
|
|
83
|
+
}
|
|
84
|
+
const datasourceBlock = match[1];
|
|
85
|
+
// Extract provider
|
|
86
|
+
const providerMatch = datasourceBlock.match(/provider\s*=\s*"([^"]+)"/);
|
|
87
|
+
const provider = providerMatch ? providerMatch[1] : null;
|
|
88
|
+
// Try to extract url from schema first
|
|
89
|
+
let url = null;
|
|
90
|
+
const urlMatch = datasourceBlock.match(/url\s*=\s*(.+)/);
|
|
91
|
+
if (urlMatch) {
|
|
92
|
+
url = urlMatch[1].trim();
|
|
93
|
+
// Handle env() function
|
|
94
|
+
const envMatch = url.match(/env\(["']([^"']+)["']\)/);
|
|
95
|
+
if (envMatch) {
|
|
96
|
+
const envVar = envMatch[1];
|
|
97
|
+
url = process.env[envVar] || null;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Remove quotes if present
|
|
101
|
+
url = url.replace(/^["']|["']$/g, '');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// If no URL in schema, try prisma.config.ts (Prisma 7)
|
|
105
|
+
if (!url) {
|
|
106
|
+
url = loadUrlFromPrismaConfig();
|
|
107
|
+
}
|
|
108
|
+
// If still no URL, check DATABASE_URL environment variable directly
|
|
109
|
+
if (!url) {
|
|
110
|
+
url = process.env.DATABASE_URL || null;
|
|
111
|
+
}
|
|
112
|
+
// Detect PostgreSQL from provider OR from the actual connection URL
|
|
113
|
+
let isPostgreSQL = provider === 'postgresql' || provider === 'postgres';
|
|
114
|
+
if (!isPostgreSQL && url) {
|
|
115
|
+
// Check if URL starts with postgresql:// or postgres://
|
|
116
|
+
isPostgreSQL = url.startsWith('postgresql://') || url.startsWith('postgres://');
|
|
117
|
+
}
|
|
118
|
+
// Explicitly detect MySQL to avoid false PostgreSQL detection
|
|
119
|
+
const isMySQL = provider === 'mysql' || (!!url && url.startsWith('mysql://'));
|
|
120
|
+
// If it's MySQL, ensure isPostgreSQL is false
|
|
121
|
+
if (isMySQL) {
|
|
122
|
+
isPostgreSQL = false;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
provider,
|
|
126
|
+
url,
|
|
127
|
+
isPostgreSQL,
|
|
128
|
+
isMySQL
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=datasourceParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasourceParser.js","sourceRoot":"","sources":["../../../src/parsers/datasourceParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep SQL Analyzer for PostgreSQL RLS Policies
|
|
3
|
+
* Uses extensive regex patterns to extract meaning from SQL expressions
|
|
4
|
+
*/
|
|
5
|
+
export interface SQLFilter {
|
|
6
|
+
type: string;
|
|
7
|
+
field?: string;
|
|
8
|
+
value?: string;
|
|
9
|
+
values?: string[];
|
|
10
|
+
userField?: string;
|
|
11
|
+
prisma: string;
|
|
12
|
+
subquery?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SQLCondition {
|
|
15
|
+
type: string;
|
|
16
|
+
roles?: string[];
|
|
17
|
+
role?: string;
|
|
18
|
+
javascript?: string;
|
|
19
|
+
table?: string;
|
|
20
|
+
field?: string;
|
|
21
|
+
condition?: string;
|
|
22
|
+
conditions?: Array<{
|
|
23
|
+
condition: string;
|
|
24
|
+
result: string;
|
|
25
|
+
}>;
|
|
26
|
+
subquery?: string;
|
|
27
|
+
prisma?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SQLAnalysis {
|
|
30
|
+
filters: SQLFilter[];
|
|
31
|
+
conditions: SQLCondition[];
|
|
32
|
+
userContext: Record<string, boolean>;
|
|
33
|
+
sql?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare class DeepSQLAnalyzer {
|
|
36
|
+
functionMappings: Record<string, string>;
|
|
37
|
+
sessionMappings: Record<string, string>;
|
|
38
|
+
constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Analyze SQL expression and extract Prisma filters
|
|
41
|
+
*/
|
|
42
|
+
analyzeSQLForFilters(sql: string): SQLAnalysis;
|
|
43
|
+
/**
|
|
44
|
+
* Normalize SQL for easier parsing
|
|
45
|
+
*/
|
|
46
|
+
normalizeSql(sql: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Remove EXISTS subqueries with proper parentheses matching
|
|
49
|
+
*/
|
|
50
|
+
removeExistsSubqueries(sql: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Extract direct field comparisons
|
|
53
|
+
*/
|
|
54
|
+
extractDirectComparisons(sql: string, analysis: SQLAnalysis): void;
|
|
55
|
+
/**
|
|
56
|
+
* Extract function-based comparisons
|
|
57
|
+
*/
|
|
58
|
+
extractFunctionComparisons(sql: string, analysis: SQLAnalysis): void;
|
|
59
|
+
/**
|
|
60
|
+
* Extract session variable comparisons
|
|
61
|
+
*/
|
|
62
|
+
extractSessionVariableComparisons(sql: string, analysis: SQLAnalysis): void;
|
|
63
|
+
/**
|
|
64
|
+
* Extract IN clauses
|
|
65
|
+
*/
|
|
66
|
+
extractInClauses(sql: string, analysis: SQLAnalysis): void;
|
|
67
|
+
/**
|
|
68
|
+
* Extract EXISTS subqueries
|
|
69
|
+
*/
|
|
70
|
+
extractExistsSubqueries(sql: string, analysis: SQLAnalysis): void;
|
|
71
|
+
/**
|
|
72
|
+
* Extract CASE WHEN conditions
|
|
73
|
+
*/
|
|
74
|
+
extractCaseWhenConditions(sql: string, analysis: SQLAnalysis): void;
|
|
75
|
+
/**
|
|
76
|
+
* Extract role-based checks
|
|
77
|
+
*/
|
|
78
|
+
extractRoleChecks(sql: string, analysis: SQLAnalysis): void;
|
|
79
|
+
/**
|
|
80
|
+
* Extract complex JOIN conditions
|
|
81
|
+
*/
|
|
82
|
+
extractComplexJoins(sql: string, analysis: SQLAnalysis): void;
|
|
83
|
+
}
|
|
84
|
+
export default DeepSQLAnalyzer;
|
|
85
|
+
//# sourceMappingURL=deepSQLAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepSQLAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/parsers/deepSQLAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,eAAe;IAC1B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;IAiExC;;OAEG;IACH,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAkC9C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAoCjC;;OAEG;IACH,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA8B3C;;OAEG;IACH,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IA2ElE;;OAEG;IACH,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAiFpE;;OAEG;IACH,iCAAiC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IA4C3E;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IA2C1D;;OAEG;IACH,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAyBjE;;OAEG;IACH,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IA+BnE;;OAEG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IA2B3D;;OAEG;IACH,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;CAuB9D;AAED,eAAe,eAAe,CAAC"}
|