@slingr/cli 0.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 +320 -0
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +5 -0
- package/dist/commands/cli-build.d.ts +9 -0
- package/dist/commands/cli-build.d.ts.map +1 -0
- package/dist/commands/cli-build.js +36 -0
- package/dist/commands/cli-build.js.map +1 -0
- package/dist/commands/create-app.d.ts +20 -0
- package/dist/commands/create-app.d.ts.map +1 -0
- package/dist/commands/create-app.js +246 -0
- package/dist/commands/create-app.js.map +1 -0
- package/dist/commands/ds.d.ts +28 -0
- package/dist/commands/ds.d.ts.map +1 -0
- package/dist/commands/ds.js +529 -0
- package/dist/commands/ds.js.map +1 -0
- package/dist/commands/gql.d.ts +22 -0
- package/dist/commands/gql.d.ts.map +1 -0
- package/dist/commands/gql.js +340 -0
- package/dist/commands/gql.js.map +1 -0
- package/dist/commands/infra/down.d.ts +13 -0
- package/dist/commands/infra/down.d.ts.map +1 -0
- package/dist/commands/infra/down.js +80 -0
- package/dist/commands/infra/down.js.map +1 -0
- package/dist/commands/infra/up.d.ts +13 -0
- package/dist/commands/infra/up.d.ts.map +1 -0
- package/dist/commands/infra/up.js +69 -0
- package/dist/commands/infra/up.js.map +1 -0
- package/dist/commands/infra/update.d.ts +14 -0
- package/dist/commands/infra/update.d.ts.map +1 -0
- package/dist/commands/infra/update.js +321 -0
- package/dist/commands/infra/update.js.map +1 -0
- package/dist/commands/run.d.ts +19 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +315 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/setup.d.ts +18 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +189 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/projectStructure.d.ts +10 -0
- package/dist/projectStructure.d.ts.map +1 -0
- package/dist/projectStructure.js +153 -0
- package/dist/projectStructure.js.map +1 -0
- package/dist/scripts/generate-schema.d.ts +10 -0
- package/dist/scripts/generate-schema.d.ts.map +1 -0
- package/dist/scripts/generate-schema.js +130 -0
- package/dist/scripts/generate-schema.js.map +1 -0
- package/dist/scripts/generate-schema.ts +143 -0
- package/dist/templates/.github/copilot-instructions.md.template +17 -0
- package/dist/templates/config/datasource.ts.template +9 -0
- package/dist/templates/config/jest.config.ts +30 -0
- package/dist/templates/config/jest.setup.ts +1 -0
- package/dist/templates/config/tsconfig.json.template +30 -0
- package/dist/templates/dataSources/mysql.ts.template +13 -0
- package/dist/templates/dataSources/postgres.ts.template +13 -0
- package/dist/templates/dataset-generator-script.ts.template +140 -0
- package/dist/templates/datasets/mysql-default/Address.jsonl.template +4 -0
- package/dist/templates/datasets/mysql-default/App.jsonl.template +5 -0
- package/dist/templates/datasets/mysql-default/Company.jsonl.template +4 -0
- package/dist/templates/datasets/mysql-default/Person.jsonl.template +3 -0
- package/dist/templates/datasets/postgres-default/Address.jsonl.template +4 -0
- package/dist/templates/datasets/postgres-default/App.jsonl.template +5 -0
- package/dist/templates/datasets/postgres-default/Company.jsonl.template +4 -0
- package/dist/templates/datasets/postgres-default/Person.jsonl.template +3 -0
- package/dist/templates/docs/app-description.md.template +34 -0
- package/dist/templates/gql/codegen.yml.template +25 -0
- package/dist/templates/gql/index.ts.template +24 -0
- package/dist/templates/gql/operations.graphql.template +30 -0
- package/dist/templates/package.json.template +38 -0
- package/dist/templates/prompt-analysis.md.template +111 -0
- package/dist/templates/prompt-script-generation.md.template +259 -0
- package/dist/templates/src/Address.ts.template +31 -0
- package/dist/templates/src/App.ts.template +61 -0
- package/dist/templates/src/Company.ts.template +48 -0
- package/dist/templates/src/Models.test.ts.template +655 -0
- package/dist/templates/src/Person.test.ts.template +289 -0
- package/dist/templates/src/Person.ts.template +105 -0
- package/dist/templates/src/actions/index.ts.template +12 -0
- package/dist/templates/src/index.ts +66 -0
- package/dist/templates/src/types/gql.d.ts.template +18 -0
- package/dist/templates/vscode/extensions.json +3 -0
- package/dist/templates/vscode/settings.json +11 -0
- package/dist/utils/datasourceParser.d.ts +12 -0
- package/dist/utils/datasourceParser.d.ts.map +1 -0
- package/dist/utils/datasourceParser.js +91 -0
- package/dist/utils/datasourceParser.js.map +1 -0
- package/dist/utils/jsonlLoader.d.ts +140 -0
- package/dist/utils/jsonlLoader.d.ts.map +1 -0
- package/dist/utils/jsonlLoader.js +583 -0
- package/dist/utils/jsonlLoader.js.map +1 -0
- package/dist/utils/model-analyzer.d.ts +86 -0
- package/dist/utils/model-analyzer.d.ts.map +1 -0
- package/dist/utils/model-analyzer.js +458 -0
- package/dist/utils/model-analyzer.js.map +1 -0
- package/dist/utils/portChecker.d.ts +36 -0
- package/dist/utils/portChecker.d.ts.map +1 -0
- package/dist/utils/portChecker.js +308 -0
- package/dist/utils/portChecker.js.map +1 -0
- package/dist/utils/synthetic-data-generator.d.ts +74 -0
- package/dist/utils/synthetic-data-generator.d.ts.map +1 -0
- package/dist/utils/synthetic-data-generator.js +443 -0
- package/dist/utils/synthetic-data-generator.js.map +1 -0
- package/oclif.manifest.json +435 -0
- package/package.json +118 -0
- package/src/templates/.github/copilot-instructions.md.template +17 -0
- package/src/templates/config/datasource.ts.template +9 -0
- package/src/templates/config/jest.config.ts +30 -0
- package/src/templates/config/jest.setup.ts +1 -0
- package/src/templates/config/tsconfig.json.template +30 -0
- package/src/templates/dataSources/mysql.ts.template +13 -0
- package/src/templates/dataSources/postgres.ts.template +13 -0
- package/src/templates/dataset-generator-script.ts.template +140 -0
- package/src/templates/datasets/mysql-default/Address.jsonl.template +4 -0
- package/src/templates/datasets/mysql-default/App.jsonl.template +5 -0
- package/src/templates/datasets/mysql-default/Company.jsonl.template +4 -0
- package/src/templates/datasets/mysql-default/Person.jsonl.template +3 -0
- package/src/templates/datasets/postgres-default/Address.jsonl.template +4 -0
- package/src/templates/datasets/postgres-default/App.jsonl.template +5 -0
- package/src/templates/datasets/postgres-default/Company.jsonl.template +4 -0
- package/src/templates/datasets/postgres-default/Person.jsonl.template +3 -0
- package/src/templates/docs/app-description.md.template +34 -0
- package/src/templates/gql/codegen.yml.template +25 -0
- package/src/templates/gql/index.ts.template +24 -0
- package/src/templates/gql/operations.graphql.template +30 -0
- package/src/templates/package.json.template +38 -0
- package/src/templates/prompt-analysis.md.template +111 -0
- package/src/templates/prompt-script-generation.md.template +259 -0
- package/src/templates/src/Address.ts.template +31 -0
- package/src/templates/src/App.ts.template +61 -0
- package/src/templates/src/Company.ts.template +48 -0
- package/src/templates/src/Models.test.ts.template +655 -0
- package/src/templates/src/Person.test.ts.template +289 -0
- package/src/templates/src/Person.ts.template +105 -0
- package/src/templates/src/actions/index.ts.template +12 -0
- package/src/templates/src/index.ts +66 -0
- package/src/templates/src/types/gql.d.ts.template +18 -0
- package/src/templates/vscode/extensions.json +3 -0
- package/src/templates/vscode/settings.json +11 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.JsonlDatasetLoader = void 0;
|
|
7
|
+
exports.discoverModels = discoverModels;
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
require("reflect-metadata");
|
|
11
|
+
/**
|
|
12
|
+
* Utility class for loading datasets from JSONL files using Slingr model fromJSON() functionality
|
|
13
|
+
*/
|
|
14
|
+
class JsonlDatasetLoader {
|
|
15
|
+
/**
|
|
16
|
+
* Analyze model dependencies to determine the correct loading order
|
|
17
|
+
*/
|
|
18
|
+
analyzeDependencies(modelMap, verbose = false) {
|
|
19
|
+
const dependencies = {};
|
|
20
|
+
// Initialize dependency tracking for all models
|
|
21
|
+
for (const modelName of Object.keys(modelMap)) {
|
|
22
|
+
dependencies[modelName] = {
|
|
23
|
+
modelName,
|
|
24
|
+
dependencies: [],
|
|
25
|
+
dependents: [],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Analyze each model for dependencies
|
|
29
|
+
for (const [modelName, ModelClass] of Object.entries(modelMap)) {
|
|
30
|
+
const modelDeps = this.extractModelDependencies(ModelClass, verbose);
|
|
31
|
+
dependencies[modelName].dependencies = modelDeps;
|
|
32
|
+
// Update dependents for referenced models
|
|
33
|
+
for (const depName of modelDeps) {
|
|
34
|
+
if (dependencies[depName]) {
|
|
35
|
+
dependencies[depName].dependents.push(modelName);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Determine load order using topological sort
|
|
40
|
+
const loadOrder = this.topologicalSort(dependencies, verbose);
|
|
41
|
+
if (verbose) {
|
|
42
|
+
console.log('📋 Dependency Analysis:');
|
|
43
|
+
for (const [modelName, deps] of Object.entries(dependencies)) {
|
|
44
|
+
console.log(` ${modelName}: depends on [${deps.dependencies.join(', ')}], depended by [${deps.dependents.join(', ')}]`);
|
|
45
|
+
}
|
|
46
|
+
console.log(`🔄 Load Order: ${loadOrder.join(' → ')}`);
|
|
47
|
+
}
|
|
48
|
+
return { dependencies, loadOrder };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Extract dependencies from a model class by analyzing its decorators/metadata
|
|
52
|
+
*/
|
|
53
|
+
extractModelDependencies(ModelClass, verbose = false) {
|
|
54
|
+
const dependencies = [];
|
|
55
|
+
if (verbose) {
|
|
56
|
+
console.log(` 🔍 Analyzing ${ModelClass.name} for dependencies...`);
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
// Create a temporary instance to access metadata
|
|
60
|
+
const instance = new ModelClass();
|
|
61
|
+
// Get all property descriptors from the prototype and instance
|
|
62
|
+
const proto = Object.getPrototypeOf(instance);
|
|
63
|
+
const propertyNames = Object.getOwnPropertyNames(proto).concat(Object.getOwnPropertyNames(instance));
|
|
64
|
+
if (verbose) {
|
|
65
|
+
console.log(` Properties found:`, propertyNames.filter(p => p !== 'constructor'));
|
|
66
|
+
}
|
|
67
|
+
for (const propertyName of propertyNames) {
|
|
68
|
+
if (propertyName === 'constructor') {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
// Try to get all available metadata keys first
|
|
73
|
+
const availableKeys = Reflect.getMetadataKeys?.(instance, propertyName) || [];
|
|
74
|
+
if (verbose && availableKeys.length > 0) {
|
|
75
|
+
console.log(` Metadata keys for ${propertyName}:`, availableKeys);
|
|
76
|
+
}
|
|
77
|
+
// Try to get Slingr-specific metadata using the correct keys
|
|
78
|
+
const fieldType = Reflect.getMetadata?.('field:type', instance, propertyName);
|
|
79
|
+
const relationshipType = Reflect.getMetadata?.('field:relationship:type', instance, propertyName);
|
|
80
|
+
const designType = Reflect.getMetadata?.('design:type', instance, propertyName);
|
|
81
|
+
if (verbose && (fieldType || relationshipType)) {
|
|
82
|
+
console.log(` Property ${propertyName}:`, {
|
|
83
|
+
fieldType,
|
|
84
|
+
relationshipType,
|
|
85
|
+
designType: designType?.name,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// Check for Reference and Composition relationships
|
|
89
|
+
if (fieldType === 'relationship' && relationshipType && designType) {
|
|
90
|
+
// For relationships, designType contains the name of the referenced model
|
|
91
|
+
if (typeof designType === 'string') {
|
|
92
|
+
dependencies.push(designType);
|
|
93
|
+
if (verbose) {
|
|
94
|
+
console.log(` ✅ Found dependency: ${ModelClass.name}.${propertyName} → ${designType} (${relationshipType})`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (typeof designType === 'function' && designType.name) {
|
|
98
|
+
dependencies.push(designType.name);
|
|
99
|
+
if (verbose) {
|
|
100
|
+
console.log(` ✅ Found dependency: ${ModelClass.name}.${propertyName} → ${designType.name} (${relationshipType})`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Also check property getter/setter for reference information
|
|
105
|
+
const descriptor = Object.getOwnPropertyDescriptor(instance, propertyName) ||
|
|
106
|
+
Object.getOwnPropertyDescriptor(proto, propertyName);
|
|
107
|
+
if (descriptor) {
|
|
108
|
+
// Check if the property has reference metadata
|
|
109
|
+
const refMetadata = Reflect.getMetadata?.('slingr:reference', instance, propertyName);
|
|
110
|
+
if (refMetadata && refMetadata.elementType) {
|
|
111
|
+
const referencedType = refMetadata.elementType();
|
|
112
|
+
if (referencedType && referencedType.name) {
|
|
113
|
+
dependencies.push(referencedType.name);
|
|
114
|
+
if (verbose) {
|
|
115
|
+
console.log(` Found reference dependency: ${ModelClass.name}.${propertyName} → ${referencedType.name}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Check composition metadata
|
|
120
|
+
const compMetadata = Reflect.getMetadata?.('slingr:composition', instance, propertyName);
|
|
121
|
+
if (compMetadata && compMetadata.elementType) {
|
|
122
|
+
const composedType = compMetadata.elementType();
|
|
123
|
+
if (composedType && composedType.name) {
|
|
124
|
+
dependencies.push(composedType.name);
|
|
125
|
+
if (verbose) {
|
|
126
|
+
console.log(` Found composition dependency: ${ModelClass.name}.${propertyName} → ${composedType.name}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
// Ignore property analysis errors, continue with next property
|
|
134
|
+
if (verbose) {
|
|
135
|
+
console.log(` Skipped property ${propertyName} due to error:`, error.message);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (verbose) {
|
|
142
|
+
console.warn(`Failed to analyze dependencies for ${ModelClass.name}:`, error.message);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Remove duplicates and self-references
|
|
146
|
+
return Array.from(new Set(dependencies)).filter(dep => dep !== ModelClass.name);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Perform topological sort to determine loading order
|
|
150
|
+
*/
|
|
151
|
+
topologicalSort(dependencies, verbose = false) {
|
|
152
|
+
const visited = new Set();
|
|
153
|
+
const visiting = new Set();
|
|
154
|
+
const result = [];
|
|
155
|
+
const visit = (modelName) => {
|
|
156
|
+
if (visiting.has(modelName)) {
|
|
157
|
+
throw new Error(`Circular dependency detected involving: ${modelName}`);
|
|
158
|
+
}
|
|
159
|
+
if (visited.has(modelName)) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
visiting.add(modelName);
|
|
163
|
+
// Visit all dependencies first
|
|
164
|
+
const modelDeps = dependencies[modelName]?.dependencies || [];
|
|
165
|
+
for (const depName of modelDeps) {
|
|
166
|
+
if (dependencies[depName]) {
|
|
167
|
+
visit(depName);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
visiting.delete(modelName);
|
|
171
|
+
visited.add(modelName);
|
|
172
|
+
result.push(modelName);
|
|
173
|
+
};
|
|
174
|
+
// Visit all models
|
|
175
|
+
for (const modelName of Object.keys(dependencies)) {
|
|
176
|
+
if (!visited.has(modelName)) {
|
|
177
|
+
visit(modelName);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Load all JSONL files from a dataset directory
|
|
184
|
+
*/
|
|
185
|
+
async loadDataset(options) {
|
|
186
|
+
const { datasetPath, modelMap, validateRecords = true, verbose = false } = options;
|
|
187
|
+
if (!(await fs_extra_1.default.pathExists(datasetPath))) {
|
|
188
|
+
throw new Error(`Dataset directory not found: ${datasetPath}`);
|
|
189
|
+
}
|
|
190
|
+
// Analyze dependencies first to determine correct loading order
|
|
191
|
+
const dependencyAnalysis = this.analyzeDependencies(modelMap, verbose);
|
|
192
|
+
// Find all JSONL files in the dataset directory
|
|
193
|
+
const files = await fs_extra_1.default.readdir(datasetPath);
|
|
194
|
+
const jsonlFiles = files.filter(f => f.endsWith('.jsonl'));
|
|
195
|
+
if (jsonlFiles.length === 0) {
|
|
196
|
+
throw new Error(`No JSONL files found in dataset directory: ${datasetPath}`);
|
|
197
|
+
}
|
|
198
|
+
if (verbose) {
|
|
199
|
+
console.log(`Found ${jsonlFiles.length} JSONL files to process:`, jsonlFiles);
|
|
200
|
+
}
|
|
201
|
+
const results = [];
|
|
202
|
+
const loadedEntities = {};
|
|
203
|
+
// Process files in dependency order instead of arbitrary order
|
|
204
|
+
for (const modelName of dependencyAnalysis.loadOrder) {
|
|
205
|
+
const fileName = `${modelName}.jsonl`;
|
|
206
|
+
if (!jsonlFiles.includes(fileName)) {
|
|
207
|
+
if (verbose) {
|
|
208
|
+
console.log(`📄 No JSONL file found for model: ${modelName} (expected: ${fileName}). Skipping...`);
|
|
209
|
+
}
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const ModelClass = modelMap[modelName];
|
|
213
|
+
if (!ModelClass) {
|
|
214
|
+
if (verbose) {
|
|
215
|
+
console.warn(`No model mapping found for: ${modelName}. Skipping...`);
|
|
216
|
+
}
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const filePath = node_path_1.default.join(datasetPath, fileName);
|
|
220
|
+
const result = await this.loadJsonlFile(filePath, ModelClass, modelName, loadedEntities, validateRecords, verbose);
|
|
221
|
+
// Store successfully loaded entities for future reference resolution
|
|
222
|
+
if (result.records.length > 0) {
|
|
223
|
+
loadedEntities[modelName] = {};
|
|
224
|
+
for (const record of result.records) {
|
|
225
|
+
const id = record.id;
|
|
226
|
+
if (id) {
|
|
227
|
+
loadedEntities[modelName][id] = record;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
results.push(result);
|
|
232
|
+
}
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Load a single JSONL file and convert records using the model's fromJSON method
|
|
237
|
+
*/
|
|
238
|
+
/**
|
|
239
|
+
* Resolves simple references in format {"id": "uuid"} to full objects from loaded entities
|
|
240
|
+
*/
|
|
241
|
+
async resolveSimpleReferences(data, ModelClass, loadedEntities, verbose = false) {
|
|
242
|
+
if (!data || typeof data !== 'object') {
|
|
243
|
+
return data;
|
|
244
|
+
}
|
|
245
|
+
const resolvedData = { ...data };
|
|
246
|
+
const metadata = Reflect.getMetadata('custom:fields', ModelClass.prototype) || {};
|
|
247
|
+
// Get relationship metadata using the correct keys
|
|
248
|
+
for (const fieldName of Object.keys(resolvedData)) {
|
|
249
|
+
const fieldType = Reflect.getMetadata('field:type', ModelClass.prototype, fieldName);
|
|
250
|
+
const relationshipType = Reflect.getMetadata('field:relationship:type', ModelClass.prototype, fieldName);
|
|
251
|
+
const designType = Reflect.getMetadata('design:type', ModelClass.prototype, fieldName);
|
|
252
|
+
// If it's a reference/composition and has simple format {"id": "uuid"}
|
|
253
|
+
if ((fieldType === 'reference' || fieldType === 'composition' || relationshipType) &&
|
|
254
|
+
resolvedData[fieldName] &&
|
|
255
|
+
typeof resolvedData[fieldName] === 'object' &&
|
|
256
|
+
resolvedData[fieldName].id &&
|
|
257
|
+
Object.keys(resolvedData[fieldName]).length === 1) {
|
|
258
|
+
const refId = resolvedData[fieldName].id;
|
|
259
|
+
// Determine the referenced model type from metadata
|
|
260
|
+
let refModelName = null;
|
|
261
|
+
// Try to get the model name from designType
|
|
262
|
+
if (designType && designType.name) {
|
|
263
|
+
refModelName = designType.name;
|
|
264
|
+
}
|
|
265
|
+
else if (designType && typeof designType === 'function') {
|
|
266
|
+
refModelName = designType.name;
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
// Fallback: search in all available metadata keys
|
|
270
|
+
const allMetadataKeys = Reflect.getMetadataKeys?.(ModelClass.prototype, fieldName) || [];
|
|
271
|
+
for (const key of allMetadataKeys) {
|
|
272
|
+
const value = Reflect.getMetadata(key, ModelClass.prototype, fieldName);
|
|
273
|
+
// Search for referenced type information in any metadata
|
|
274
|
+
if (value && typeof value === 'object') {
|
|
275
|
+
if (value.type && typeof value.type === 'function' && value.type.name) {
|
|
276
|
+
refModelName = value.type.name;
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
else if (value.target && typeof value.target === 'function' && value.target.name) {
|
|
280
|
+
refModelName = value.target.name;
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
else if (value.elementType && typeof value.elementType === 'function') {
|
|
284
|
+
const elementType = value.elementType();
|
|
285
|
+
if (elementType && elementType.name) {
|
|
286
|
+
refModelName = elementType.name;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else if (typeof value === 'function' && value.name) {
|
|
292
|
+
refModelName = value.name;
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (verbose && !refModelName && allMetadataKeys.length > 0) {
|
|
297
|
+
console.log(` Could not determine reference type for ${fieldName}, available metadata:`, allMetadataKeys.map(key => ({
|
|
298
|
+
key,
|
|
299
|
+
value: Reflect.getMetadata(key, ModelClass.prototype, fieldName),
|
|
300
|
+
})));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Search for the complete object in loadedEntities
|
|
304
|
+
if (refModelName && loadedEntities[refModelName] && loadedEntities[refModelName][refId]) {
|
|
305
|
+
resolvedData[fieldName] = loadedEntities[refModelName][refId];
|
|
306
|
+
if (verbose) {
|
|
307
|
+
console.log(` Resolved ${fieldName}.id=${refId} → ${refModelName} object`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
else if (verbose && refModelName) {
|
|
311
|
+
console.log(` Warning: Could not resolve ${fieldName}.id=${refId} (${refModelName} not found)`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return resolvedData;
|
|
316
|
+
}
|
|
317
|
+
async loadJsonlFile(filePath, ModelClass, modelName, loadedEntities, validateRecords = true, verbose = false) {
|
|
318
|
+
if (verbose) {
|
|
319
|
+
console.log(`Loading JSONL file: ${filePath} for model: ${modelName}`);
|
|
320
|
+
}
|
|
321
|
+
const content = await fs_extra_1.default.readFile(filePath, 'utf8');
|
|
322
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
323
|
+
const result = {
|
|
324
|
+
modelName,
|
|
325
|
+
records: [],
|
|
326
|
+
successCount: 0,
|
|
327
|
+
errorCount: 0,
|
|
328
|
+
errors: [],
|
|
329
|
+
};
|
|
330
|
+
for (let i = 0; i < lines.length; i++) {
|
|
331
|
+
try {
|
|
332
|
+
const rawData = JSON.parse(lines[i]);
|
|
333
|
+
if (verbose) {
|
|
334
|
+
console.log(`Processing record ${i + 1}:`, rawData);
|
|
335
|
+
}
|
|
336
|
+
// Resolve simple references before creating the model instance
|
|
337
|
+
const resolvedData = await this.resolveSimpleReferences(rawData, ModelClass, loadedEntities, verbose);
|
|
338
|
+
// Use the model's fromJSON method to create the instance
|
|
339
|
+
const modelInstance = ModelClass.fromJSON(resolvedData);
|
|
340
|
+
// Validate the instance if requested
|
|
341
|
+
if (validateRecords) {
|
|
342
|
+
const validationErrors = await modelInstance.validate();
|
|
343
|
+
if (validationErrors && validationErrors.length > 0) {
|
|
344
|
+
result.errors.push({
|
|
345
|
+
recordIndex: i,
|
|
346
|
+
recordData: rawData,
|
|
347
|
+
validationErrors,
|
|
348
|
+
});
|
|
349
|
+
result.errorCount++;
|
|
350
|
+
if (verbose) {
|
|
351
|
+
console.warn(`Validation failed for record ${i + 1}:`, validationErrors);
|
|
352
|
+
}
|
|
353
|
+
continue; // Skip this record
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
result.records.push(modelInstance);
|
|
357
|
+
result.successCount++;
|
|
358
|
+
if (verbose) {
|
|
359
|
+
console.log(`Successfully loaded record ${i + 1}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
result.errorCount++;
|
|
364
|
+
result.errors.push({
|
|
365
|
+
recordIndex: i,
|
|
366
|
+
recordData: lines[i],
|
|
367
|
+
validationErrors: [
|
|
368
|
+
{
|
|
369
|
+
property: 'parsing',
|
|
370
|
+
constraints: { parseError: error.message },
|
|
371
|
+
},
|
|
372
|
+
],
|
|
373
|
+
});
|
|
374
|
+
if (verbose) {
|
|
375
|
+
console.error(`Failed to parse record ${i + 1}:`, error);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (verbose) {
|
|
380
|
+
console.log(`Completed loading ${modelName}: ${result.successCount} success, ${result.errorCount} errors`);
|
|
381
|
+
}
|
|
382
|
+
return result;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Convert loaded model instances to database-friendly format
|
|
386
|
+
* This method respects the model's field availability settings and converts camelCase to snake_case
|
|
387
|
+
*/
|
|
388
|
+
convertToDbFormat(records, verbose = false) {
|
|
389
|
+
return records.map(record => {
|
|
390
|
+
// Use the model's toJSON method to get the proper serialization
|
|
391
|
+
const jsonData = record.toJSON();
|
|
392
|
+
// Convert camelCase to snake_case for database column names
|
|
393
|
+
const dbRecord = {};
|
|
394
|
+
// Ensure id is always included if it exists in the original data
|
|
395
|
+
if (record.id !== undefined) {
|
|
396
|
+
dbRecord.id = record.id;
|
|
397
|
+
}
|
|
398
|
+
for (const [key, value] of Object.entries(jsonData)) {
|
|
399
|
+
const snakeCaseKey = this.camelToSnakeCase(key);
|
|
400
|
+
dbRecord[snakeCaseKey] = value;
|
|
401
|
+
}
|
|
402
|
+
if (verbose) {
|
|
403
|
+
console.log('Converted record:', jsonData, '→', dbRecord);
|
|
404
|
+
}
|
|
405
|
+
return dbRecord;
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Convert camelCase string to snake_case
|
|
410
|
+
*/
|
|
411
|
+
camelToSnakeCase(str) {
|
|
412
|
+
return str.replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Load dataset into database using TypeORM with dynamic table creation
|
|
416
|
+
* This method creates tables dynamically and uses TypeORM for data insertion
|
|
417
|
+
* Note: Results should already be in dependency order from loadDataset()
|
|
418
|
+
*/
|
|
419
|
+
async loadDatasetToDatabase(results, dataSource, verbose = false) {
|
|
420
|
+
const typeormDataSource = dataSource.getTypeOrmDataSource();
|
|
421
|
+
if (!typeormDataSource || !typeormDataSource.isInitialized) {
|
|
422
|
+
throw new Error('TypeORM DataSource is not initialized');
|
|
423
|
+
}
|
|
424
|
+
// Process results in the order they were provided (which should be dependency order)
|
|
425
|
+
for (const result of results) {
|
|
426
|
+
if (result.errorCount > 0 && verbose) {
|
|
427
|
+
console.log(`⚠️ Model ${result.modelName} has ${result.errorCount} validation errors:`);
|
|
428
|
+
for (const error of result.errors) {
|
|
429
|
+
console.log(` Record ${error.recordIndex + 1}: ${JSON.stringify(error.validationErrors)}`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (result.successCount === 0) {
|
|
433
|
+
if (verbose) {
|
|
434
|
+
console.log(`⚠️ No valid records found for ${result.modelName}, skipping.`);
|
|
435
|
+
}
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
if (verbose) {
|
|
439
|
+
console.log(`📊 Processing ${result.modelName}: ${result.successCount} valid records`);
|
|
440
|
+
}
|
|
441
|
+
try {
|
|
442
|
+
// Save records using the framework's save method which respects relationships
|
|
443
|
+
for (const record of result.records) {
|
|
444
|
+
await dataSource.save(record);
|
|
445
|
+
}
|
|
446
|
+
if (verbose) {
|
|
447
|
+
console.log(`✅ Successfully loaded ${result.successCount} records for ${result.modelName}`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
console.error(`❌ Failed to load ${result.modelName}:`, error);
|
|
452
|
+
throw error;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Create table dynamically using TypeORM (database-agnostic)
|
|
458
|
+
*/
|
|
459
|
+
async createTableDynamically(dataSource, tableName, schema, verbose = false) {
|
|
460
|
+
const typeormDataSource = dataSource.getTypeOrmDataSource();
|
|
461
|
+
const queryRunner = typeormDataSource.createQueryRunner();
|
|
462
|
+
try {
|
|
463
|
+
// Drop table if exists
|
|
464
|
+
await queryRunner.dropTable(tableName, true);
|
|
465
|
+
// Create new table with proper schema
|
|
466
|
+
const columns = Object.entries(schema).map(([columnName, sqlType]) => {
|
|
467
|
+
let typeormType;
|
|
468
|
+
let isPrimary = columnName === 'id';
|
|
469
|
+
switch (sqlType) {
|
|
470
|
+
case 'INTEGER':
|
|
471
|
+
typeormType = isPrimary ? 'int' : 'int';
|
|
472
|
+
break;
|
|
473
|
+
case 'REAL':
|
|
474
|
+
typeormType = 'float';
|
|
475
|
+
break;
|
|
476
|
+
case 'BOOLEAN':
|
|
477
|
+
typeormType = 'boolean';
|
|
478
|
+
break;
|
|
479
|
+
default:
|
|
480
|
+
typeormType = 'varchar';
|
|
481
|
+
}
|
|
482
|
+
return {
|
|
483
|
+
name: columnName,
|
|
484
|
+
type: typeormType,
|
|
485
|
+
isPrimary,
|
|
486
|
+
isNullable: !isPrimary,
|
|
487
|
+
...(typeormType === 'varchar' && { length: '500' }),
|
|
488
|
+
};
|
|
489
|
+
});
|
|
490
|
+
const table = new (require('typeorm').Table)({
|
|
491
|
+
name: tableName,
|
|
492
|
+
columns,
|
|
493
|
+
});
|
|
494
|
+
await queryRunner.createTable(table);
|
|
495
|
+
if (verbose) {
|
|
496
|
+
console.log(`✅ Created table "${tableName}" with ${columns.length} columns`);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
finally {
|
|
500
|
+
await queryRunner.release();
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Insert data dynamically using TypeORM (database-agnostic)
|
|
505
|
+
*/
|
|
506
|
+
async insertDataDynamically(dataSource, tableName, records, verbose = false) {
|
|
507
|
+
if (records.length === 0) {
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
const typeormDataSource = dataSource.getTypeOrmDataSource();
|
|
511
|
+
const queryRunner = typeormDataSource.createQueryRunner();
|
|
512
|
+
try {
|
|
513
|
+
// Use TypeORM's query builder for database-agnostic insertion
|
|
514
|
+
const columns = Object.keys(records[0]);
|
|
515
|
+
for (const record of records) {
|
|
516
|
+
await queryRunner.manager.createQueryBuilder().insert().into(tableName).values(record).execute();
|
|
517
|
+
}
|
|
518
|
+
if (verbose) {
|
|
519
|
+
console.log(`✅ Inserted ${records.length} records into "${tableName}"`);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
finally {
|
|
523
|
+
await queryRunner.release();
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Get the database column schema based on ALL records to capture all possible fields
|
|
528
|
+
*/
|
|
529
|
+
inferDbSchemaFromAllRecords(records) {
|
|
530
|
+
const schema = {};
|
|
531
|
+
// Examine all records to find all possible fields
|
|
532
|
+
for (const record of records) {
|
|
533
|
+
for (const [key, value] of Object.entries(record)) {
|
|
534
|
+
if (schema[key]) {
|
|
535
|
+
// Field already exists, keep the existing type or upgrade if needed
|
|
536
|
+
continue;
|
|
537
|
+
}
|
|
538
|
+
let sqlType = 'TEXT';
|
|
539
|
+
if (typeof value === 'number') {
|
|
540
|
+
sqlType = Number.isInteger(value) ? 'INTEGER' : 'REAL';
|
|
541
|
+
}
|
|
542
|
+
else if (typeof value === 'boolean') {
|
|
543
|
+
sqlType = 'BOOLEAN';
|
|
544
|
+
}
|
|
545
|
+
schema[key] = sqlType;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return schema;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
exports.JsonlDatasetLoader = JsonlDatasetLoader;
|
|
552
|
+
/**
|
|
553
|
+
* Auto-discover models from the compiled JavaScript files
|
|
554
|
+
*/
|
|
555
|
+
async function discoverModels(distPath) {
|
|
556
|
+
const modelMap = {};
|
|
557
|
+
if (!(await fs_extra_1.default.pathExists(distPath))) {
|
|
558
|
+
throw new Error(`Dist directory not found: ${distPath}. Please run 'npm run build' first.`);
|
|
559
|
+
}
|
|
560
|
+
// Import glob dynamically since it might be ESM
|
|
561
|
+
const { glob } = await import('glob');
|
|
562
|
+
// Only look for model files, not test files
|
|
563
|
+
const entityFiles = await glob(node_path_1.default.join(distPath, 'data', '**', '*.js').replace(/\\/g, '/')).then((files) => files.filter((file) => !file.includes('.test.js')));
|
|
564
|
+
for (const file of entityFiles) {
|
|
565
|
+
try {
|
|
566
|
+
// Clear the require cache to ensure fresh loading
|
|
567
|
+
delete require.cache[node_path_1.default.resolve(file)];
|
|
568
|
+
const module = require(node_path_1.default.resolve(file));
|
|
569
|
+
const exports = Object.values(module);
|
|
570
|
+
for (const exp of exports) {
|
|
571
|
+
if (typeof exp === 'function' && exp.prototype && exp.name && typeof exp.fromJSON === 'function') {
|
|
572
|
+
console.log(`✅ Found model: ${exp.name} in ${file}`);
|
|
573
|
+
modelMap[exp.name] = exp;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
catch (error) {
|
|
578
|
+
console.warn(`Failed to load entity from file: ${file}:`, error);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
return modelMap;
|
|
582
|
+
}
|
|
583
|
+
//# sourceMappingURL=jsonlLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonlLoader.js","sourceRoot":"","sources":["../../src/utils/jsonlLoader.ts"],"names":[],"mappings":"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"}
|