noormme 1.0.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/README.md +92 -63
  2. package/dist/cjs/agentic/ActionJournal.js +13 -9
  3. package/dist/cjs/agentic/CapabilityManager.d.ts +9 -4
  4. package/dist/cjs/agentic/CapabilityManager.js +113 -17
  5. package/dist/cjs/agentic/CognitiveRepository.js +19 -9
  6. package/dist/cjs/agentic/ContextBuffer.js +24 -12
  7. package/dist/cjs/agentic/Cortex.d.ts +8 -1
  8. package/dist/cjs/agentic/Cortex.js +30 -7
  9. package/dist/cjs/agentic/EpisodicMemory.js +7 -5
  10. package/dist/cjs/agentic/PersonaManager.js +16 -8
  11. package/dist/cjs/agentic/PolicyEnforcer.js +31 -12
  12. package/dist/cjs/agentic/ResourceMonitor.js +4 -4
  13. package/dist/cjs/agentic/SessionCompressor.js +22 -14
  14. package/dist/cjs/agentic/SessionManager.js +36 -18
  15. package/dist/cjs/agentic/VectorIndexer.js +22 -18
  16. package/dist/cjs/agentic/improvement/AblationEngine.js +22 -15
  17. package/dist/cjs/agentic/improvement/ActionRefiner.js +12 -10
  18. package/dist/cjs/agentic/improvement/ConflictResolver.js +5 -5
  19. package/dist/cjs/agentic/improvement/CortexJanitor.d.ts +1 -1
  20. package/dist/cjs/agentic/improvement/CortexJanitor.js +64 -27
  21. package/dist/cjs/agentic/improvement/CuriosityEngine.d.ts +2 -2
  22. package/dist/cjs/agentic/improvement/CuriosityEngine.js +68 -59
  23. package/dist/cjs/agentic/improvement/EvolutionRitual.d.ts +24 -0
  24. package/dist/cjs/agentic/improvement/EvolutionRitual.js +91 -0
  25. package/dist/cjs/agentic/improvement/EvolutionaryPilot.d.ts +5 -0
  26. package/dist/cjs/agentic/improvement/EvolutionaryPilot.js +80 -7
  27. package/dist/cjs/agentic/improvement/GoalArchitect.d.ts +2 -2
  28. package/dist/cjs/agentic/improvement/GoalArchitect.js +20 -18
  29. package/dist/cjs/agentic/improvement/GovernanceManager.d.ts +1 -1
  30. package/dist/cjs/agentic/improvement/GovernanceManager.js +85 -49
  31. package/dist/cjs/agentic/improvement/HiveLink.d.ts +9 -0
  32. package/dist/cjs/agentic/improvement/HiveLink.js +120 -26
  33. package/dist/cjs/agentic/improvement/KnowledgeDistiller.d.ts +2 -0
  34. package/dist/cjs/agentic/improvement/KnowledgeDistiller.js +101 -47
  35. package/dist/cjs/agentic/improvement/RecursiveReasoner.d.ts +7 -1
  36. package/dist/cjs/agentic/improvement/RecursiveReasoner.js +106 -22
  37. package/dist/cjs/agentic/improvement/ReflectionEngine.js +10 -8
  38. package/dist/cjs/agentic/improvement/RitualOrchestrator.js +34 -22
  39. package/dist/cjs/agentic/improvement/RuleEngine.js +22 -17
  40. package/dist/cjs/agentic/improvement/SelfEvolution.js +24 -18
  41. package/dist/cjs/agentic/improvement/SelfTestRegistry.js +18 -15
  42. package/dist/cjs/agentic/improvement/SkillSynthesizer.d.ts +48 -0
  43. package/dist/cjs/agentic/improvement/SkillSynthesizer.js +288 -0
  44. package/dist/cjs/agentic/improvement/SovereignMetrics.js +19 -17
  45. package/dist/cjs/agentic/improvement/StrategicPlanner.d.ts +1 -1
  46. package/dist/cjs/agentic/improvement/StrategicPlanner.js +129 -55
  47. package/dist/cjs/agentic/telemetry/CognitiveSynthesizer.js +26 -12
  48. package/dist/cjs/agentic/telemetry/EventHarvester.js +3 -2
  49. package/dist/cjs/agentic/telemetry/ResearchAlchemist.js +13 -4
  50. package/dist/cjs/cache/cache-manager.js +7 -4
  51. package/dist/cjs/cli/commands/analyze.js +5 -4
  52. package/dist/cjs/cli/commands/generate.js +81 -44
  53. package/dist/cjs/cli/commands/init.js +7 -3
  54. package/dist/cjs/cli/commands/inspect.js +139 -36
  55. package/dist/cjs/cli/commands/migrate.js +5 -4
  56. package/dist/cjs/cli/commands/optimize.js +4 -4
  57. package/dist/cjs/cli/commands/status.js +9 -7
  58. package/dist/cjs/cli/commands/watch.js +7 -6
  59. package/dist/cjs/cli/index.js +2 -2
  60. package/dist/cjs/cli/ui/spinner.d.ts +15 -0
  61. package/dist/cjs/cli/ui/spinner.js +76 -0
  62. package/dist/cjs/dialect/database-introspector.js +3 -1
  63. package/dist/cjs/dialect/postgresql/postgresql-driver.js +3 -1
  64. package/dist/cjs/dialect/postgresql/postgresql-features.js +18 -8
  65. package/dist/cjs/dialect/postgresql/postgresql-introspector.js +2 -2
  66. package/dist/cjs/dialect/sqlite/sqlite-auto-indexer.js +47 -33
  67. package/dist/cjs/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
  68. package/dist/cjs/dialect/sqlite/sqlite-driver.js +2 -2
  69. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +15 -12
  70. package/dist/cjs/edge-runtime/edge-config.js +21 -19
  71. package/dist/cjs/errors/NoormError.js +22 -20
  72. package/dist/cjs/helpers/agent-schema.js +3 -0
  73. package/dist/cjs/helpers/postgresql.js +7 -4
  74. package/dist/cjs/helpers/schema-evolution.js +31 -6
  75. package/dist/cjs/index.d.ts +18 -16
  76. package/dist/cjs/logging/logger.js +8 -4
  77. package/dist/cjs/migration/data_migrator.js +12 -11
  78. package/dist/cjs/migration/database_migration_manager.js +17 -13
  79. package/dist/cjs/migration/schema_differ.js +22 -14
  80. package/dist/cjs/migration/schema_introspector.js +8 -8
  81. package/dist/cjs/migration/type_mapper.js +68 -67
  82. package/dist/cjs/noormme.js +54 -37
  83. package/dist/cjs/performance/index.js +5 -5
  84. package/dist/cjs/performance/query-optimizer.js +26 -21
  85. package/dist/cjs/performance/services/cache-service.js +26 -16
  86. package/dist/cjs/performance/services/connection-factory.js +28 -23
  87. package/dist/cjs/performance/services/metrics-collector.js +41 -36
  88. package/dist/cjs/performance/utils/query-parser.js +15 -16
  89. package/dist/cjs/relationships/relationship-engine.js +10 -8
  90. package/dist/cjs/repository/repository-factory.js +97 -38
  91. package/dist/cjs/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
  92. package/dist/cjs/schema/core/discovery/relationship-discovery.js +16 -16
  93. package/dist/cjs/schema/core/discovery/table-metadata-discovery.js +9 -9
  94. package/dist/cjs/schema/core/discovery/view-discovery.js +5 -4
  95. package/dist/cjs/schema/core/factories/discovery-factory.js +4 -4
  96. package/dist/cjs/schema/core/utils/name-generator.js +14 -5
  97. package/dist/cjs/schema/core/utils/type-mapper.js +24 -24
  98. package/dist/cjs/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
  99. package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
  100. package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
  101. package/dist/cjs/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
  102. package/dist/cjs/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
  103. package/dist/cjs/schema/test/basic-schema-test.js +11 -9
  104. package/dist/cjs/schema/test/dialect-capabilities.test.js +6 -6
  105. package/dist/cjs/schema/test/discovery-factory.test.js +2 -2
  106. package/dist/cjs/schema/test/error-handling.test.js +8 -6
  107. package/dist/cjs/schema/test/integration.test.js +24 -18
  108. package/dist/cjs/schema/test/schema-discovery-coordinator.test.js +9 -9
  109. package/dist/cjs/schema/test/simple-schema-test.js +9 -9
  110. package/dist/cjs/schema/test/sqlite-discovery-coordinator.test.js +64 -48
  111. package/dist/cjs/schema/test/test-runner.js +3 -3
  112. package/dist/cjs/sqlite-migration/index.d.ts +2 -2
  113. package/dist/cjs/sqlite-migration/sqlite-migration-manager.js +21 -17
  114. package/dist/cjs/sqlite-migration/sqlite-migration-provider.js +38 -34
  115. package/dist/cjs/testing/test-utils.js +36 -34
  116. package/dist/cjs/types/index.d.ts +61 -4
  117. package/dist/cjs/types/index.js +6 -3
  118. package/dist/cjs/types/type-generator.js +46 -42
  119. package/dist/cjs/util/safe-sql-helpers.js +1 -1
  120. package/dist/cjs/util/security-validator.js +20 -9
  121. package/dist/cjs/utils/errorHelpers.js +20 -10
  122. package/dist/cjs/watch/schema-watcher.js +22 -23
  123. package/dist/esm/agentic/ActionJournal.js +13 -9
  124. package/dist/esm/agentic/CapabilityManager.d.ts +9 -4
  125. package/dist/esm/agentic/CapabilityManager.js +113 -17
  126. package/dist/esm/agentic/CognitiveRepository.js +19 -9
  127. package/dist/esm/agentic/ContextBuffer.js +24 -12
  128. package/dist/esm/agentic/Cortex.d.ts +8 -1
  129. package/dist/esm/agentic/Cortex.js +30 -7
  130. package/dist/esm/agentic/EpisodicMemory.js +7 -5
  131. package/dist/esm/agentic/PersonaManager.js +16 -8
  132. package/dist/esm/agentic/PolicyEnforcer.js +31 -12
  133. package/dist/esm/agentic/ResourceMonitor.js +4 -4
  134. package/dist/esm/agentic/SessionCompressor.js +22 -14
  135. package/dist/esm/agentic/SessionManager.js +36 -18
  136. package/dist/esm/agentic/VectorIndexer.js +22 -18
  137. package/dist/esm/agentic/improvement/AblationEngine.js +22 -15
  138. package/dist/esm/agentic/improvement/ActionRefiner.js +12 -10
  139. package/dist/esm/agentic/improvement/ConflictResolver.js +5 -5
  140. package/dist/esm/agentic/improvement/CortexJanitor.d.ts +1 -1
  141. package/dist/esm/agentic/improvement/CortexJanitor.js +64 -27
  142. package/dist/esm/agentic/improvement/CuriosityEngine.d.ts +2 -2
  143. package/dist/esm/agentic/improvement/CuriosityEngine.js +68 -59
  144. package/dist/esm/agentic/improvement/EvolutionRitual.d.ts +24 -0
  145. package/dist/esm/agentic/improvement/EvolutionRitual.js +88 -0
  146. package/dist/esm/agentic/improvement/EvolutionaryPilot.d.ts +5 -0
  147. package/dist/esm/agentic/improvement/EvolutionaryPilot.js +80 -7
  148. package/dist/esm/agentic/improvement/GoalArchitect.d.ts +2 -2
  149. package/dist/esm/agentic/improvement/GoalArchitect.js +20 -18
  150. package/dist/esm/agentic/improvement/GovernanceManager.d.ts +1 -1
  151. package/dist/esm/agentic/improvement/GovernanceManager.js +85 -49
  152. package/dist/esm/agentic/improvement/HiveLink.d.ts +9 -0
  153. package/dist/esm/agentic/improvement/HiveLink.js +120 -26
  154. package/dist/esm/agentic/improvement/KnowledgeDistiller.d.ts +2 -0
  155. package/dist/esm/agentic/improvement/KnowledgeDistiller.js +101 -47
  156. package/dist/esm/agentic/improvement/RecursiveReasoner.d.ts +7 -1
  157. package/dist/esm/agentic/improvement/RecursiveReasoner.js +106 -22
  158. package/dist/esm/agentic/improvement/ReflectionEngine.js +10 -8
  159. package/dist/esm/agentic/improvement/RitualOrchestrator.js +34 -22
  160. package/dist/esm/agentic/improvement/RuleEngine.js +22 -17
  161. package/dist/esm/agentic/improvement/SelfEvolution.js +24 -18
  162. package/dist/esm/agentic/improvement/SelfTestRegistry.js +18 -15
  163. package/dist/esm/agentic/improvement/SkillSynthesizer.d.ts +48 -0
  164. package/dist/esm/agentic/improvement/SkillSynthesizer.js +285 -0
  165. package/dist/esm/agentic/improvement/SovereignMetrics.js +19 -17
  166. package/dist/esm/agentic/improvement/StrategicPlanner.d.ts +1 -1
  167. package/dist/esm/agentic/improvement/StrategicPlanner.js +129 -55
  168. package/dist/esm/agentic/telemetry/CognitiveSynthesizer.js +26 -12
  169. package/dist/esm/agentic/telemetry/EventHarvester.js +3 -2
  170. package/dist/esm/agentic/telemetry/ResearchAlchemist.js +13 -4
  171. package/dist/esm/cache/cache-manager.js +7 -4
  172. package/dist/esm/cli/commands/analyze.js +5 -4
  173. package/dist/esm/cli/commands/generate.js +82 -45
  174. package/dist/esm/cli/commands/init.js +8 -4
  175. package/dist/esm/cli/commands/inspect.js +140 -37
  176. package/dist/esm/cli/commands/migrate.js +5 -4
  177. package/dist/esm/cli/commands/optimize.js +4 -4
  178. package/dist/esm/cli/commands/status.js +9 -7
  179. package/dist/esm/cli/commands/watch.js +7 -6
  180. package/dist/esm/cli/index.js +2 -2
  181. package/dist/esm/cli/ui/spinner.d.ts +15 -0
  182. package/dist/esm/cli/ui/spinner.js +70 -0
  183. package/dist/esm/dialect/database-introspector.js +3 -1
  184. package/dist/esm/dialect/postgresql/postgresql-driver.js +3 -1
  185. package/dist/esm/dialect/postgresql/postgresql-features.js +18 -8
  186. package/dist/esm/dialect/postgresql/postgresql-introspector.js +2 -2
  187. package/dist/esm/dialect/sqlite/sqlite-auto-indexer.js +47 -33
  188. package/dist/esm/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
  189. package/dist/esm/dialect/sqlite/sqlite-driver.js +2 -2
  190. package/dist/esm/dialect/sqlite/sqlite-introspector.js +15 -12
  191. package/dist/esm/dynamic/dynamic.js +1 -1
  192. package/dist/esm/edge-runtime/edge-config.js +21 -19
  193. package/dist/esm/errors/NoormError.js +22 -20
  194. package/dist/esm/helpers/agent-schema.js +3 -0
  195. package/dist/esm/helpers/postgresql.js +7 -4
  196. package/dist/esm/helpers/schema-evolution.js +31 -6
  197. package/dist/esm/index.d.ts +18 -16
  198. package/dist/esm/index.js +2 -2
  199. package/dist/esm/logging/logger.js +8 -4
  200. package/dist/esm/migration/data_migrator.js +12 -11
  201. package/dist/esm/migration/database_migration_manager.js +18 -14
  202. package/dist/esm/migration/schema_differ.js +22 -14
  203. package/dist/esm/migration/schema_introspector.js +8 -8
  204. package/dist/esm/migration/type_mapper.js +68 -67
  205. package/dist/esm/noormme.js +54 -37
  206. package/dist/esm/performance/index.js +5 -5
  207. package/dist/esm/performance/query-optimizer.js +26 -21
  208. package/dist/esm/performance/services/cache-service.js +26 -16
  209. package/dist/esm/performance/services/connection-factory.js +28 -23
  210. package/dist/esm/performance/services/metrics-collector.js +41 -36
  211. package/dist/esm/performance/utils/query-parser.js +15 -16
  212. package/dist/esm/raw-builder/sql.js +1 -1
  213. package/dist/esm/relationships/relationship-engine.js +10 -8
  214. package/dist/esm/repository/repository-factory.js +98 -39
  215. package/dist/esm/schema/builders/alter-table-add-index-builder.js +1 -1
  216. package/dist/esm/schema/builders/create-index-builder.js +2 -2
  217. package/dist/esm/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
  218. package/dist/esm/schema/core/discovery/relationship-discovery.js +16 -16
  219. package/dist/esm/schema/core/discovery/table-metadata-discovery.js +9 -9
  220. package/dist/esm/schema/core/discovery/view-discovery.js +5 -4
  221. package/dist/esm/schema/core/factories/discovery-factory.js +4 -4
  222. package/dist/esm/schema/core/utils/name-generator.js +14 -5
  223. package/dist/esm/schema/core/utils/type-mapper.js +24 -24
  224. package/dist/esm/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
  225. package/dist/esm/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
  226. package/dist/esm/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
  227. package/dist/esm/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
  228. package/dist/esm/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
  229. package/dist/esm/schema/test/basic-schema-test.js +11 -9
  230. package/dist/esm/schema/test/dialect-capabilities.test.js +6 -6
  231. package/dist/esm/schema/test/discovery-factory.test.js +2 -2
  232. package/dist/esm/schema/test/error-handling.test.js +8 -6
  233. package/dist/esm/schema/test/integration.test.js +24 -18
  234. package/dist/esm/schema/test/schema-discovery-coordinator.test.js +9 -9
  235. package/dist/esm/schema/test/simple-schema-test.js +9 -9
  236. package/dist/esm/schema/test/sqlite-discovery-coordinator.test.js +64 -48
  237. package/dist/esm/schema/test/test-runner.js +3 -3
  238. package/dist/esm/sqlite-migration/index.d.ts +2 -2
  239. package/dist/esm/sqlite-migration/sqlite-migration-manager.js +21 -17
  240. package/dist/esm/sqlite-migration/sqlite-migration-provider.js +38 -34
  241. package/dist/esm/testing/test-utils.js +36 -34
  242. package/dist/esm/types/index.d.ts +61 -4
  243. package/dist/esm/types/index.js +6 -3
  244. package/dist/esm/types/type-generator.js +46 -42
  245. package/dist/esm/util/safe-sql-helpers.js +1 -1
  246. package/dist/esm/util/security-validator.js +20 -9
  247. package/dist/esm/utils/errorHelpers.js +21 -11
  248. package/dist/esm/watch/schema-watcher.js +22 -23
  249. package/package.json +40 -44
package/dist/esm/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  export * from './kysely.js';
3
3
  export * from './query-creator.js';
4
4
  export * from './expression/expression.js';
5
- export { expressionBuilder, } from './expression/expression-builder.js';
5
+ export { expressionBuilder } from './expression/expression-builder.js';
6
6
  export * from './expression/expression-wrapper.js';
7
7
  export * from './query-builder/where-interface.js';
8
8
  export * from './query-builder/returning-interface.js';
@@ -236,7 +236,7 @@ export * from './agentic/CognitiveRepository.js';
236
236
  export * from './helpers/agent-schema.js';
237
237
  export * from './helpers/schema-evolution.js';
238
238
  // Error classes
239
- export { NoormError, TableNotFoundError, ColumnNotFoundError, ConnectionError, DatabaseInitializationError, ValidationError, RelationshipNotFoundError, QueryExecutionError, SchemaDiscoveryError, MigrationError, TypeGenerationError } from './errors/NoormError.js';
239
+ export { NoormError, TableNotFoundError, ColumnNotFoundError, ConnectionError, DatabaseInitializationError, ValidationError, RelationshipNotFoundError, QueryExecutionError, SchemaDiscoveryError, MigrationError, TypeGenerationError, } from './errors/NoormError.js';
240
240
  // CLI commands (for programmatic usage)
241
241
  export * from './cli/commands/init.js';
242
242
  export * from './cli/commands/inspect.js';
@@ -70,7 +70,7 @@ export class Logger {
70
70
  sql,
71
71
  parameters,
72
72
  duration,
73
- timestamp: Date.now()
73
+ timestamp: Date.now(),
74
74
  };
75
75
  this.queryLogs.push(queryLog);
76
76
  this.queryCount++;
@@ -118,7 +118,7 @@ export class Logger {
118
118
  * Get slow queries
119
119
  */
120
120
  getSlowQueries(threshold = 1000) {
121
- return this.queryLogs.filter(log => log.duration > threshold);
121
+ return this.queryLogs.filter((log) => log.duration > threshold);
122
122
  }
123
123
  /**
124
124
  * Clear query logs
@@ -162,7 +162,11 @@ export class Logger {
162
162
  const prefix = this.getPrefix(level);
163
163
  let logMessage = `[${timestamp}] ${prefix} ${message}`;
164
164
  if (args.length > 0) {
165
- logMessage += ' ' + args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
165
+ logMessage +=
166
+ ' ' +
167
+ args
168
+ .map((arg) => typeof arg === 'object' ? JSON.stringify(arg) : String(arg))
169
+ .join(' ');
166
170
  }
167
171
  logMessage += '\n';
168
172
  fs.appendFileSync(this.config.file, logMessage);
@@ -187,7 +191,7 @@ export class Logger {
187
191
  queryCount: this.queryCount,
188
192
  averageQueryTime: this.getAverageQueryTime(),
189
193
  totalQueryTime: this.totalQueryTime,
190
- slowQueries: this.getSlowQueries().length
194
+ slowQueries: this.getSlowQueries().length,
191
195
  };
192
196
  }
193
197
  /**
@@ -22,7 +22,9 @@ export async function migrateTableData(sourceDb, targetDb, sourceTable, targetTa
22
22
  };
23
23
  }
24
24
  // Keyset pagination optimization: find a numeric primary key
25
- const pkColumn = sourceTable.columns.find(c => c.primaryKey && (c.type.toLowerCase().includes('int') || c.type.toLowerCase().includes('serial')))?.name;
25
+ const pkColumn = sourceTable.columns.find((c) => c.primaryKey &&
26
+ (c.type.toLowerCase().includes('int') ||
27
+ c.type.toLowerCase().includes('serial')))?.name;
26
28
  let lastId = null;
27
29
  // Calculate number of batches (approximate)
28
30
  const batchCount = Math.ceil(totalRows / options.batchSize);
@@ -103,7 +105,7 @@ function transformRows(rows, sourceTable, targetTable, sourceDialect, targetDial
103
105
  // Build transformation map
104
106
  const transformations = new Map();
105
107
  for (const sourceColumn of sourceTable.columns) {
106
- const targetColumn = targetTable.columns.find(c => c.name === sourceColumn.name);
108
+ const targetColumn = targetTable.columns.find((c) => c.name === sourceColumn.name);
107
109
  if (targetColumn) {
108
110
  const transform = getValueTransformation(sourceColumn.type, targetColumn.type, sourceDialect, targetDialect);
109
111
  if (transform) {
@@ -112,7 +114,7 @@ function transformRows(rows, sourceTable, targetTable, sourceDialect, targetDial
112
114
  }
113
115
  }
114
116
  // Transform rows
115
- return rows.map(row => {
117
+ return rows.map((row) => {
116
118
  const transformedRow = {};
117
119
  for (const [columnName, value] of Object.entries(row)) {
118
120
  const transform = transformations.get(columnName);
@@ -129,10 +131,7 @@ async function insertBatch(db, tableName, rows) {
129
131
  return;
130
132
  }
131
133
  // Use Kysely's batch insert
132
- await db
133
- .insertInto(tableName)
134
- .values(rows)
135
- .execute();
134
+ await db.insertInto(tableName).values(rows).execute();
136
135
  }
137
136
  /**
138
137
  * Calculate estimated time remaining
@@ -150,16 +149,16 @@ function calculateETA(startTime, completed, total) {
150
149
  * Migrate data for all tables in parallel
151
150
  */
152
151
  export async function migrateAllTablesData(sourceDb, targetDb, sourceTables, targetTables, sourceDialect, targetDialect, options) {
153
- const targetTableMap = new Map(targetTables.map(t => [t.name, t]));
152
+ const targetTableMap = new Map(targetTables.map((t) => [t.name, t]));
154
153
  const results = [];
155
154
  // Filter tables that exist in both source and target
156
- const tablesToMigrate = sourceTables.filter(st => targetTableMap.has(st.name));
155
+ const tablesToMigrate = sourceTables.filter((st) => targetTableMap.has(st.name));
157
156
  if (options.parallel && options.parallelWorkers > 1) {
158
157
  // Migrate tables in parallel batches
159
158
  const workerCount = Math.min(options.parallelWorkers, tablesToMigrate.length);
160
159
  const chunks = chunkArray(tablesToMigrate, workerCount);
161
160
  for (const chunk of chunks) {
162
- const chunkResults = await Promise.all(chunk.map(sourceTable => {
161
+ const chunkResults = await Promise.all(chunk.map((sourceTable) => {
163
162
  const targetTable = targetTableMap.get(sourceTable.name);
164
163
  return migrateTableData(sourceDb, targetDb, sourceTable, targetTable, sourceDialect, targetDialect, options);
165
164
  }));
@@ -220,6 +219,8 @@ export async function truncateTable(db, tableName, dialect) {
220
219
  else {
221
220
  await sql.raw(`DELETE FROM "${tableName}"`).execute(db);
222
221
  // Reset autoincrement counter in SQLite
223
- await sql.raw(`DELETE FROM sqlite_sequence WHERE name = '${tableName}'`).execute(db);
222
+ await sql
223
+ .raw(`DELETE FROM sqlite_sequence WHERE name = '${tableName}'`)
224
+ .execute(db);
224
225
  }
225
226
  }
@@ -8,7 +8,7 @@
8
8
  * - Schema diff and sync
9
9
  */
10
10
  import { Logger } from '../logging/logger.js';
11
- import { introspectSQLiteSchema, introspectPostgreSQLSchema } from './schema_introspector.js';
11
+ import { introspectSQLiteSchema, introspectPostgreSQLSchema, } from './schema_introspector.js';
12
12
  import { compareSchemas, generateSyncSQL, applySchemaSyncronization, } from './schema_differ.js';
13
13
  import { migrateAllTablesData, verifyDataMigration, } from './data_migrator.js';
14
14
  import { mapType } from './type_mapper.js';
@@ -87,7 +87,7 @@ export class DatabaseMigrationManager {
87
87
  this.logger.info('\n✅ Step 4: Verifying migration...');
88
88
  const verificationResult = await this.verifyMigration(filteredSourceSchema);
89
89
  result.warnings.push(...verificationResult.warnings);
90
- result.success = result.errors.filter(e => e.fatal).length === 0;
90
+ result.success = result.errors.filter((e) => e.fatal).length === 0;
91
91
  result.duration = Date.now() - startTime;
92
92
  this.logger.info('\n🎉 Migration completed!');
93
93
  this.logger.info(` Duration: ${(result.duration / 1000).toFixed(2)}s`);
@@ -143,14 +143,14 @@ export class DatabaseMigrationManager {
143
143
  this.logger.info(` Generated ${sqlStatements.length} SQL statements`);
144
144
  if (options.generateSQL) {
145
145
  this.logger.info('\nSQL Statements:');
146
- sqlStatements.forEach(stmt => this.logger.info(stmt));
146
+ sqlStatements.forEach((stmt) => this.logger.info(stmt));
147
147
  }
148
148
  if (options.apply) {
149
149
  const result = await applySchemaSyncronization(this.targetDb, sqlStatements, options);
150
150
  this.logger.info(` Applied ${result.appliedStatements} changes`);
151
151
  if (result.errors.length > 0) {
152
152
  this.logger.error(` Errors: ${result.errors.length}`);
153
- result.errors.forEach(err => {
153
+ result.errors.forEach((err) => {
154
154
  this.logger.error(` ${err.sql}`);
155
155
  this.logger.error(` ${err.error.message}`);
156
156
  });
@@ -196,11 +196,13 @@ export class DatabaseMigrationManager {
196
196
  */
197
197
  filterTables(tables) {
198
198
  let filtered = tables;
199
- if (this.config.options?.includeTables && this.config.options.includeTables.length > 0) {
200
- filtered = filtered.filter(t => this.config.options.includeTables.includes(t.name));
199
+ if (this.config.options?.includeTables &&
200
+ this.config.options.includeTables.length > 0) {
201
+ filtered = filtered.filter((t) => this.config.options.includeTables.includes(t.name));
201
202
  }
202
- if (this.config.options?.excludeTables && this.config.options.excludeTables.length > 0) {
203
- filtered = filtered.filter(t => !this.config.options.excludeTables.includes(t.name));
203
+ if (this.config.options?.excludeTables &&
204
+ this.config.options.excludeTables.length > 0) {
205
+ filtered = filtered.filter((t) => !this.config.options.excludeTables.includes(t.name));
204
206
  }
205
207
  return filtered;
206
208
  }
@@ -216,9 +218,11 @@ export class DatabaseMigrationManager {
216
218
  if (this.config.options?.dropTables) {
217
219
  this.logger.info(' Dropping existing tables...');
218
220
  for (const table of targetSchema) {
219
- if (sourceSchema.find(t => t.name === table.name)) {
221
+ if (sourceSchema.find((t) => t.name === table.name)) {
220
222
  try {
221
- await sql.raw(`DROP TABLE IF EXISTS "${table.name}" CASCADE`).execute(this.targetDb);
223
+ await sql
224
+ .raw(`DROP TABLE IF EXISTS "${table.name}" CASCADE`)
225
+ .execute(this.targetDb);
222
226
  this.logger.info(` Dropped: ${table.name}`);
223
227
  }
224
228
  catch (error) {
@@ -230,7 +234,7 @@ export class DatabaseMigrationManager {
230
234
  // Create tables
231
235
  for (const sourceTable of sourceSchema) {
232
236
  try {
233
- const targetTable = targetSchema.find(t => t.name === sourceTable.name);
237
+ const targetTable = targetSchema.find((t) => t.name === sourceTable.name);
234
238
  if (!targetTable || this.config.options?.dropTables) {
235
239
  // Create table
236
240
  await this.createTable(sourceTable);
@@ -289,8 +293,8 @@ export class DatabaseMigrationManager {
289
293
  createSQL += columnDefs.join(',\n');
290
294
  // Add foreign keys
291
295
  for (const fk of sourceTable.foreignKeys) {
292
- const fkCols = fk.columns.map(c => `"${c}"`).join(', ');
293
- const refCols = fk.referencedColumns.map(c => `"${c}"`).join(', ');
296
+ const fkCols = fk.columns.map((c) => `"${c}"`).join(', ');
297
+ const refCols = fk.referencedColumns.map((c) => `"${c}"`).join(', ');
294
298
  createSQL += `,\n FOREIGN KEY (${fkCols}) REFERENCES "${fk.referencedTable}" (${refCols})`;
295
299
  if (fk.onDelete) {
296
300
  createSQL += ` ON DELETE ${fk.onDelete}`;
@@ -329,7 +333,7 @@ export class DatabaseMigrationManager {
329
333
  const results = await migrateAllTablesData(this.sourceDb, this.targetDb, sourceSchema, targetSchema, this.config.source.dialect, this.config.target.dialect, options);
330
334
  const tablesProcessed = results.length;
331
335
  const rowsMigrated = results.reduce((sum, r) => sum + r.rowsMigrated, 0);
332
- const errors = results.flatMap(r => r.errors);
336
+ const errors = results.flatMap((r) => r.errors);
333
337
  const warnings = [];
334
338
  for (const result of results) {
335
339
  if (result.errors.length > 0) {
@@ -9,8 +9,8 @@ import { areTypesCompatible } from './type_mapper.js';
9
9
  */
10
10
  export function compareSchemas(sourceSchema, targetSchema, sourceDialect, targetDialect) {
11
11
  const differences = [];
12
- const sourceTableMap = new Map(sourceSchema.map(t => [t.name, t]));
13
- const targetTableMap = new Map(targetSchema.map(t => [t.name, t]));
12
+ const sourceTableMap = new Map(sourceSchema.map((t) => [t.name, t]));
13
+ const targetTableMap = new Map(targetSchema.map((t) => [t.name, t]));
14
14
  // Find added and modified tables
15
15
  for (const sourceTable of sourceSchema) {
16
16
  const targetTable = targetTableMap.get(sourceTable.name);
@@ -51,11 +51,17 @@ export function compareSchemas(sourceSchema, targetSchema, sourceDialect, target
51
51
  }
52
52
  }
53
53
  // Calculate summary
54
- const tablesAdded = differences.filter(d => d.type === 'table_added').length;
55
- const tablesRemoved = differences.filter(d => d.type === 'table_removed').length;
54
+ const tablesAdded = differences.filter((d) => d.type === 'table_added').length;
55
+ const tablesRemoved = differences.filter((d) => d.type === 'table_removed').length;
56
56
  const tablesModified = new Set(differences
57
- .filter(d => ['column_added', 'column_removed', 'column_modified', 'index_added', 'index_removed'].includes(d.type))
58
- .map(d => d.table)).size;
57
+ .filter((d) => [
58
+ 'column_added',
59
+ 'column_removed',
60
+ 'column_modified',
61
+ 'index_added',
62
+ 'index_removed',
63
+ ].includes(d.type))
64
+ .map((d) => d.table)).size;
59
65
  return {
60
66
  differences,
61
67
  sourceSchema,
@@ -71,8 +77,8 @@ export function compareSchemas(sourceSchema, targetSchema, sourceDialect, target
71
77
  }
72
78
  function compareColumns(sourceTable, targetTable, sourceDialect, targetDialect) {
73
79
  const differences = [];
74
- const sourceColumnMap = new Map(sourceTable.columns.map(c => [c.name, c]));
75
- const targetColumnMap = new Map(targetTable.columns.map(c => [c.name, c]));
80
+ const sourceColumnMap = new Map(sourceTable.columns.map((c) => [c.name, c]));
81
+ const targetColumnMap = new Map(targetTable.columns.map((c) => [c.name, c]));
76
82
  // Check for added and modified columns
77
83
  for (const sourceColumn of sourceTable.columns) {
78
84
  const targetColumn = targetColumnMap.get(sourceColumn.name);
@@ -136,8 +142,8 @@ function compareColumns(sourceTable, targetTable, sourceDialect, targetDialect)
136
142
  }
137
143
  function compareIndexes(sourceTable, targetTable) {
138
144
  const differences = [];
139
- const sourceIndexMap = new Map(sourceTable.indexes.map(i => [i.name, i]));
140
- const targetIndexMap = new Map(targetTable.indexes.map(i => [i.name, i]));
145
+ const sourceIndexMap = new Map(sourceTable.indexes.map((i) => [i.name, i]));
146
+ const targetIndexMap = new Map(targetTable.indexes.map((i) => [i.name, i]));
141
147
  // Check for added indexes
142
148
  for (const sourceIndex of sourceTable.indexes) {
143
149
  const targetIndex = targetIndexMap.get(sourceIndex.name);
@@ -227,7 +233,8 @@ export function generateSyncSQL(comparison, targetDialect) {
227
233
  return sqlStatements;
228
234
  }
229
235
  function generateCreateTableSQL(table, targetDialect) {
230
- const columns = table.columns.map(col => {
236
+ const columns = table.columns
237
+ .map((col) => {
231
238
  let colDef = `"${col.name}" ${col.type}`;
232
239
  if (col.primaryKey) {
233
240
  colDef += ' PRIMARY KEY';
@@ -245,13 +252,14 @@ function generateCreateTableSQL(table, targetDialect) {
245
252
  colDef += ` DEFAULT ${col.defaultValue}`;
246
253
  }
247
254
  return colDef;
248
- }).join(',\n ');
255
+ })
256
+ .join(',\n ');
249
257
  let sql = `CREATE TABLE "${table.name}" (\n ${columns}`;
250
258
  // Add foreign keys
251
259
  if (table.foreignKeys.length > 0) {
252
260
  for (const fk of table.foreignKeys) {
253
- const fkCols = fk.columns.map(c => `"${c}"`).join(', ');
254
- const refCols = fk.referencedColumns.map(c => `"${c}"`).join(', ');
261
+ const fkCols = fk.columns.map((c) => `"${c}"`).join(', ');
262
+ const refCols = fk.referencedColumns.map((c) => `"${c}"`).join(', ');
255
263
  sql += `,\n FOREIGN KEY (${fkCols}) REFERENCES "${fk.referencedTable}" (${refCols})`;
256
264
  if (fk.onDelete) {
257
265
  sql += ` ON DELETE ${fk.onDelete}`;
@@ -31,8 +31,8 @@ export async function introspectSQLiteSchema(db) {
31
31
  const rowCount = countResult.rows[0]?.count || 0;
32
32
  // Get primary key
33
33
  const primaryKey = columns
34
- .filter(col => col.primaryKey)
35
- .map(col => col.name);
34
+ .filter((col) => col.primaryKey)
35
+ .map((col) => col.name);
36
36
  tables.push({
37
37
  name: tableName,
38
38
  columns,
@@ -117,9 +117,9 @@ async function introspectSQLiteForeignKeys(db, tableName) {
117
117
  for (const rows of fkMap.values()) {
118
118
  const first = rows[0];
119
119
  foreignKeys.push({
120
- columns: rows.map(r => r.from),
120
+ columns: rows.map((r) => r.from),
121
121
  referencedTable: first.table,
122
- referencedColumns: rows.map(r => r.to),
122
+ referencedColumns: rows.map((r) => r.to),
123
123
  onDelete: first.on_delete,
124
124
  onUpdate: first.on_update,
125
125
  });
@@ -174,8 +174,8 @@ export async function introspectPostgreSQLSchema(db) {
174
174
  const rowCount = parseInt(countResult.rows[0]?.count || '0', 10);
175
175
  // Get primary key
176
176
  const primaryKey = columns
177
- .filter(col => col.primaryKey)
178
- .map(col => col.name);
177
+ .filter((col) => col.primaryKey)
178
+ .map((col) => col.name);
179
179
  tables.push({
180
180
  name: tableName,
181
181
  columns,
@@ -312,9 +312,9 @@ async function introspectPostgreSQLForeignKeys(db, tableName) {
312
312
  const first = rows[0];
313
313
  foreignKeys.push({
314
314
  name: constraintName,
315
- columns: rows.map(r => r.column_name),
315
+ columns: rows.map((r) => r.column_name),
316
316
  referencedTable: first.foreign_table_name,
317
- referencedColumns: rows.map(r => r.foreign_column_name),
317
+ referencedColumns: rows.map((r) => r.foreign_column_name),
318
318
  onDelete: first.delete_rule?.toUpperCase(),
319
319
  onUpdate: first.update_rule?.toUpperCase(),
320
320
  });
@@ -7,99 +7,99 @@
7
7
  */
8
8
  export const SQLITE_TO_POSTGRES_TYPES = {
9
9
  // Integer types
10
- 'INTEGER': 'INTEGER',
11
- 'INT': 'INTEGER',
12
- 'TINYINT': 'SMALLINT',
13
- 'SMALLINT': 'SMALLINT',
14
- 'MEDIUMINT': 'INTEGER',
15
- 'BIGINT': 'BIGINT',
10
+ INTEGER: 'INTEGER',
11
+ INT: 'INTEGER',
12
+ TINYINT: 'SMALLINT',
13
+ SMALLINT: 'SMALLINT',
14
+ MEDIUMINT: 'INTEGER',
15
+ BIGINT: 'BIGINT',
16
16
  // Real/Float types
17
- 'REAL': 'REAL',
18
- 'DOUBLE': 'DOUBLE PRECISION',
17
+ REAL: 'REAL',
18
+ DOUBLE: 'DOUBLE PRECISION',
19
19
  'DOUBLE PRECISION': 'DOUBLE PRECISION',
20
- 'FLOAT': 'REAL',
20
+ FLOAT: 'REAL',
21
21
  // Numeric/Decimal
22
- 'NUMERIC': 'NUMERIC',
23
- 'DECIMAL': 'DECIMAL',
22
+ NUMERIC: 'NUMERIC',
23
+ DECIMAL: 'DECIMAL',
24
24
  // Text types
25
- 'TEXT': 'TEXT',
26
- 'CHARACTER': 'VARCHAR',
27
- 'VARCHAR': 'VARCHAR',
25
+ TEXT: 'TEXT',
26
+ CHARACTER: 'VARCHAR',
27
+ VARCHAR: 'VARCHAR',
28
28
  'VARYING CHARACTER': 'VARCHAR',
29
- 'NCHAR': 'VARCHAR',
29
+ NCHAR: 'VARCHAR',
30
30
  'NATIVE CHARACTER': 'VARCHAR',
31
- 'NVARCHAR': 'VARCHAR',
32
- 'CLOB': 'TEXT',
31
+ NVARCHAR: 'VARCHAR',
32
+ CLOB: 'TEXT',
33
33
  // Binary types
34
- 'BLOB': 'BYTEA',
34
+ BLOB: 'BYTEA',
35
35
  // Boolean
36
- 'BOOLEAN': 'BOOLEAN',
36
+ BOOLEAN: 'BOOLEAN',
37
37
  // Date/Time types (SQLite stores as text/integer)
38
- 'DATE': 'DATE',
39
- 'DATETIME': 'TIMESTAMP',
40
- 'TIMESTAMP': 'TIMESTAMP',
41
- 'TIME': 'TIME',
38
+ DATE: 'DATE',
39
+ DATETIME: 'TIMESTAMP',
40
+ TIMESTAMP: 'TIMESTAMP',
41
+ TIME: 'TIME',
42
42
  };
43
43
  /**
44
44
  * Map PostgreSQL types to SQLite types
45
45
  */
46
46
  export const POSTGRES_TO_SQLITE_TYPES = {
47
47
  // Integer types
48
- 'INTEGER': 'INTEGER',
49
- 'INT': 'INTEGER',
50
- 'INT4': 'INTEGER',
51
- 'SMALLINT': 'INTEGER',
52
- 'INT2': 'INTEGER',
53
- 'BIGINT': 'INTEGER',
54
- 'INT8': 'INTEGER',
55
- 'SERIAL': 'INTEGER',
56
- 'BIGSERIAL': 'INTEGER',
57
- 'SMALLSERIAL': 'INTEGER',
48
+ INTEGER: 'INTEGER',
49
+ INT: 'INTEGER',
50
+ INT4: 'INTEGER',
51
+ SMALLINT: 'INTEGER',
52
+ INT2: 'INTEGER',
53
+ BIGINT: 'INTEGER',
54
+ INT8: 'INTEGER',
55
+ SERIAL: 'INTEGER',
56
+ BIGSERIAL: 'INTEGER',
57
+ SMALLSERIAL: 'INTEGER',
58
58
  // Float types
59
- 'REAL': 'REAL',
60
- 'FLOAT4': 'REAL',
59
+ REAL: 'REAL',
60
+ FLOAT4: 'REAL',
61
61
  'DOUBLE PRECISION': 'REAL',
62
- 'FLOAT8': 'REAL',
62
+ FLOAT8: 'REAL',
63
63
  // Numeric
64
- 'NUMERIC': 'NUMERIC',
65
- 'DECIMAL': 'NUMERIC',
64
+ NUMERIC: 'NUMERIC',
65
+ DECIMAL: 'NUMERIC',
66
66
  // Text types
67
- 'TEXT': 'TEXT',
68
- 'VARCHAR': 'TEXT',
67
+ TEXT: 'TEXT',
68
+ VARCHAR: 'TEXT',
69
69
  'CHARACTER VARYING': 'TEXT',
70
- 'CHAR': 'TEXT',
71
- 'CHARACTER': 'TEXT',
72
- 'BPCHAR': 'TEXT',
70
+ CHAR: 'TEXT',
71
+ CHARACTER: 'TEXT',
72
+ BPCHAR: 'TEXT',
73
73
  // Binary
74
- 'BYTEA': 'BLOB',
74
+ BYTEA: 'BLOB',
75
75
  // Boolean
76
- 'BOOLEAN': 'INTEGER',
77
- 'BOOL': 'INTEGER',
76
+ BOOLEAN: 'INTEGER',
77
+ BOOL: 'INTEGER',
78
78
  // Date/Time
79
- 'DATE': 'TEXT',
80
- 'TIME': 'TEXT',
81
- 'TIMESTAMP': 'TEXT',
82
- 'TIMESTAMPTZ': 'TEXT',
79
+ DATE: 'TEXT',
80
+ TIME: 'TEXT',
81
+ TIMESTAMP: 'TEXT',
82
+ TIMESTAMPTZ: 'TEXT',
83
83
  'TIMESTAMP WITH TIME ZONE': 'TEXT',
84
84
  'TIMESTAMP WITHOUT TIME ZONE': 'TEXT',
85
- 'INTERVAL': 'TEXT',
85
+ INTERVAL: 'TEXT',
86
86
  // JSON
87
- 'JSON': 'TEXT',
88
- 'JSONB': 'TEXT',
87
+ JSON: 'TEXT',
88
+ JSONB: 'TEXT',
89
89
  // UUID
90
- 'UUID': 'TEXT',
90
+ UUID: 'TEXT',
91
91
  // Network types
92
- 'INET': 'TEXT',
93
- 'CIDR': 'TEXT',
94
- 'MACADDR': 'TEXT',
92
+ INET: 'TEXT',
93
+ CIDR: 'TEXT',
94
+ MACADDR: 'TEXT',
95
95
  // Geometric types (simplified)
96
- 'POINT': 'TEXT',
97
- 'LINE': 'TEXT',
98
- 'LSEG': 'TEXT',
99
- 'BOX': 'TEXT',
100
- 'PATH': 'TEXT',
101
- 'POLYGON': 'TEXT',
102
- 'CIRCLE': 'TEXT',
96
+ POINT: 'TEXT',
97
+ LINE: 'TEXT',
98
+ LSEG: 'TEXT',
99
+ BOX: 'TEXT',
100
+ PATH: 'TEXT',
101
+ POLYGON: 'TEXT',
102
+ CIRCLE: 'TEXT',
103
103
  // Array types - convert to TEXT in SQLite
104
104
  'TEXT[]': 'TEXT',
105
105
  'INTEGER[]': 'TEXT',
@@ -111,8 +111,8 @@ export const POSTGRES_TO_SQLITE_TYPES = {
111
111
  'JSON[]': 'TEXT',
112
112
  'JSONB[]': 'TEXT',
113
113
  // Full-text search
114
- 'TSVECTOR': 'TEXT',
115
- 'TSQUERY': 'TEXT',
114
+ TSVECTOR: 'TEXT',
115
+ TSQUERY: 'TEXT',
116
116
  };
117
117
  /**
118
118
  * Map type from source dialect to target dialect
@@ -254,5 +254,6 @@ export function areTypesCompatible(sourceType, targetType, sourceDialect, target
254
254
  return sourceType.toUpperCase() === targetType.toUpperCase();
255
255
  }
256
256
  const mapped = mapType(sourceType, sourceDialect, targetDialect);
257
- return mapped.toUpperCase().split('(')[0] === targetType.toUpperCase().split('(')[0];
257
+ return (mapped.toUpperCase().split('(')[0] ===
258
+ targetType.toUpperCase().split('(')[0]);
258
259
  }