@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.
Files changed (144) hide show
  1. package/README.md +320 -0
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +5 -0
  6. package/dist/commands/cli-build.d.ts +9 -0
  7. package/dist/commands/cli-build.d.ts.map +1 -0
  8. package/dist/commands/cli-build.js +36 -0
  9. package/dist/commands/cli-build.js.map +1 -0
  10. package/dist/commands/create-app.d.ts +20 -0
  11. package/dist/commands/create-app.d.ts.map +1 -0
  12. package/dist/commands/create-app.js +246 -0
  13. package/dist/commands/create-app.js.map +1 -0
  14. package/dist/commands/ds.d.ts +28 -0
  15. package/dist/commands/ds.d.ts.map +1 -0
  16. package/dist/commands/ds.js +529 -0
  17. package/dist/commands/ds.js.map +1 -0
  18. package/dist/commands/gql.d.ts +22 -0
  19. package/dist/commands/gql.d.ts.map +1 -0
  20. package/dist/commands/gql.js +340 -0
  21. package/dist/commands/gql.js.map +1 -0
  22. package/dist/commands/infra/down.d.ts +13 -0
  23. package/dist/commands/infra/down.d.ts.map +1 -0
  24. package/dist/commands/infra/down.js +80 -0
  25. package/dist/commands/infra/down.js.map +1 -0
  26. package/dist/commands/infra/up.d.ts +13 -0
  27. package/dist/commands/infra/up.d.ts.map +1 -0
  28. package/dist/commands/infra/up.js +69 -0
  29. package/dist/commands/infra/up.js.map +1 -0
  30. package/dist/commands/infra/update.d.ts +14 -0
  31. package/dist/commands/infra/update.d.ts.map +1 -0
  32. package/dist/commands/infra/update.js +321 -0
  33. package/dist/commands/infra/update.js.map +1 -0
  34. package/dist/commands/run.d.ts +19 -0
  35. package/dist/commands/run.d.ts.map +1 -0
  36. package/dist/commands/run.js +315 -0
  37. package/dist/commands/run.js.map +1 -0
  38. package/dist/commands/setup.d.ts +18 -0
  39. package/dist/commands/setup.d.ts.map +1 -0
  40. package/dist/commands/setup.js +189 -0
  41. package/dist/commands/setup.js.map +1 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +8 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/projectStructure.d.ts +10 -0
  47. package/dist/projectStructure.d.ts.map +1 -0
  48. package/dist/projectStructure.js +153 -0
  49. package/dist/projectStructure.js.map +1 -0
  50. package/dist/scripts/generate-schema.d.ts +10 -0
  51. package/dist/scripts/generate-schema.d.ts.map +1 -0
  52. package/dist/scripts/generate-schema.js +130 -0
  53. package/dist/scripts/generate-schema.js.map +1 -0
  54. package/dist/scripts/generate-schema.ts +143 -0
  55. package/dist/templates/.github/copilot-instructions.md.template +17 -0
  56. package/dist/templates/config/datasource.ts.template +9 -0
  57. package/dist/templates/config/jest.config.ts +30 -0
  58. package/dist/templates/config/jest.setup.ts +1 -0
  59. package/dist/templates/config/tsconfig.json.template +30 -0
  60. package/dist/templates/dataSources/mysql.ts.template +13 -0
  61. package/dist/templates/dataSources/postgres.ts.template +13 -0
  62. package/dist/templates/dataset-generator-script.ts.template +140 -0
  63. package/dist/templates/datasets/mysql-default/Address.jsonl.template +4 -0
  64. package/dist/templates/datasets/mysql-default/App.jsonl.template +5 -0
  65. package/dist/templates/datasets/mysql-default/Company.jsonl.template +4 -0
  66. package/dist/templates/datasets/mysql-default/Person.jsonl.template +3 -0
  67. package/dist/templates/datasets/postgres-default/Address.jsonl.template +4 -0
  68. package/dist/templates/datasets/postgres-default/App.jsonl.template +5 -0
  69. package/dist/templates/datasets/postgres-default/Company.jsonl.template +4 -0
  70. package/dist/templates/datasets/postgres-default/Person.jsonl.template +3 -0
  71. package/dist/templates/docs/app-description.md.template +34 -0
  72. package/dist/templates/gql/codegen.yml.template +25 -0
  73. package/dist/templates/gql/index.ts.template +24 -0
  74. package/dist/templates/gql/operations.graphql.template +30 -0
  75. package/dist/templates/package.json.template +38 -0
  76. package/dist/templates/prompt-analysis.md.template +111 -0
  77. package/dist/templates/prompt-script-generation.md.template +259 -0
  78. package/dist/templates/src/Address.ts.template +31 -0
  79. package/dist/templates/src/App.ts.template +61 -0
  80. package/dist/templates/src/Company.ts.template +48 -0
  81. package/dist/templates/src/Models.test.ts.template +655 -0
  82. package/dist/templates/src/Person.test.ts.template +289 -0
  83. package/dist/templates/src/Person.ts.template +105 -0
  84. package/dist/templates/src/actions/index.ts.template +12 -0
  85. package/dist/templates/src/index.ts +66 -0
  86. package/dist/templates/src/types/gql.d.ts.template +18 -0
  87. package/dist/templates/vscode/extensions.json +3 -0
  88. package/dist/templates/vscode/settings.json +11 -0
  89. package/dist/utils/datasourceParser.d.ts +12 -0
  90. package/dist/utils/datasourceParser.d.ts.map +1 -0
  91. package/dist/utils/datasourceParser.js +91 -0
  92. package/dist/utils/datasourceParser.js.map +1 -0
  93. package/dist/utils/jsonlLoader.d.ts +140 -0
  94. package/dist/utils/jsonlLoader.d.ts.map +1 -0
  95. package/dist/utils/jsonlLoader.js +583 -0
  96. package/dist/utils/jsonlLoader.js.map +1 -0
  97. package/dist/utils/model-analyzer.d.ts +86 -0
  98. package/dist/utils/model-analyzer.d.ts.map +1 -0
  99. package/dist/utils/model-analyzer.js +458 -0
  100. package/dist/utils/model-analyzer.js.map +1 -0
  101. package/dist/utils/portChecker.d.ts +36 -0
  102. package/dist/utils/portChecker.d.ts.map +1 -0
  103. package/dist/utils/portChecker.js +308 -0
  104. package/dist/utils/portChecker.js.map +1 -0
  105. package/dist/utils/synthetic-data-generator.d.ts +74 -0
  106. package/dist/utils/synthetic-data-generator.d.ts.map +1 -0
  107. package/dist/utils/synthetic-data-generator.js +443 -0
  108. package/dist/utils/synthetic-data-generator.js.map +1 -0
  109. package/oclif.manifest.json +435 -0
  110. package/package.json +118 -0
  111. package/src/templates/.github/copilot-instructions.md.template +17 -0
  112. package/src/templates/config/datasource.ts.template +9 -0
  113. package/src/templates/config/jest.config.ts +30 -0
  114. package/src/templates/config/jest.setup.ts +1 -0
  115. package/src/templates/config/tsconfig.json.template +30 -0
  116. package/src/templates/dataSources/mysql.ts.template +13 -0
  117. package/src/templates/dataSources/postgres.ts.template +13 -0
  118. package/src/templates/dataset-generator-script.ts.template +140 -0
  119. package/src/templates/datasets/mysql-default/Address.jsonl.template +4 -0
  120. package/src/templates/datasets/mysql-default/App.jsonl.template +5 -0
  121. package/src/templates/datasets/mysql-default/Company.jsonl.template +4 -0
  122. package/src/templates/datasets/mysql-default/Person.jsonl.template +3 -0
  123. package/src/templates/datasets/postgres-default/Address.jsonl.template +4 -0
  124. package/src/templates/datasets/postgres-default/App.jsonl.template +5 -0
  125. package/src/templates/datasets/postgres-default/Company.jsonl.template +4 -0
  126. package/src/templates/datasets/postgres-default/Person.jsonl.template +3 -0
  127. package/src/templates/docs/app-description.md.template +34 -0
  128. package/src/templates/gql/codegen.yml.template +25 -0
  129. package/src/templates/gql/index.ts.template +24 -0
  130. package/src/templates/gql/operations.graphql.template +30 -0
  131. package/src/templates/package.json.template +38 -0
  132. package/src/templates/prompt-analysis.md.template +111 -0
  133. package/src/templates/prompt-script-generation.md.template +259 -0
  134. package/src/templates/src/Address.ts.template +31 -0
  135. package/src/templates/src/App.ts.template +61 -0
  136. package/src/templates/src/Company.ts.template +48 -0
  137. package/src/templates/src/Models.test.ts.template +655 -0
  138. package/src/templates/src/Person.test.ts.template +289 -0
  139. package/src/templates/src/Person.ts.template +105 -0
  140. package/src/templates/src/actions/index.ts.template +12 -0
  141. package/src/templates/src/index.ts +66 -0
  142. package/src/templates/src/types/gql.d.ts.template +18 -0
  143. package/src/templates/vscode/extensions.json +3 -0
  144. 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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"}