noormme 1.1.0 → 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 (225) hide show
  1. package/README.md +84 -65
  2. package/dist/cjs/agentic/ActionJournal.js +13 -9
  3. package/dist/cjs/agentic/CapabilityManager.js +35 -21
  4. package/dist/cjs/agentic/CognitiveRepository.js +19 -9
  5. package/dist/cjs/agentic/ContextBuffer.js +24 -12
  6. package/dist/cjs/agentic/Cortex.js +11 -4
  7. package/dist/cjs/agentic/EpisodicMemory.js +7 -5
  8. package/dist/cjs/agentic/PersonaManager.js +16 -8
  9. package/dist/cjs/agentic/PolicyEnforcer.js +31 -12
  10. package/dist/cjs/agentic/ResourceMonitor.js +4 -4
  11. package/dist/cjs/agentic/SessionCompressor.js +22 -14
  12. package/dist/cjs/agentic/SessionManager.js +36 -18
  13. package/dist/cjs/agentic/VectorIndexer.js +22 -18
  14. package/dist/cjs/agentic/improvement/AblationEngine.js +22 -15
  15. package/dist/cjs/agentic/improvement/ActionRefiner.js +12 -10
  16. package/dist/cjs/agentic/improvement/ConflictResolver.js +5 -5
  17. package/dist/cjs/agentic/improvement/CortexJanitor.js +30 -9
  18. package/dist/cjs/agentic/improvement/CuriosityEngine.js +27 -23
  19. package/dist/cjs/agentic/improvement/EvolutionRitual.js +4 -4
  20. package/dist/cjs/agentic/improvement/EvolutionaryPilot.js +16 -6
  21. package/dist/cjs/agentic/improvement/GoalArchitect.d.ts +2 -2
  22. package/dist/cjs/agentic/improvement/GoalArchitect.js +20 -18
  23. package/dist/cjs/agentic/improvement/GovernanceManager.js +19 -11
  24. package/dist/cjs/agentic/improvement/HiveLink.js +22 -15
  25. package/dist/cjs/agentic/improvement/KnowledgeDistiller.js +48 -32
  26. package/dist/cjs/agentic/improvement/RecursiveReasoner.js +40 -17
  27. package/dist/cjs/agentic/improvement/ReflectionEngine.js +10 -8
  28. package/dist/cjs/agentic/improvement/RitualOrchestrator.js +28 -22
  29. package/dist/cjs/agentic/improvement/RuleEngine.js +22 -17
  30. package/dist/cjs/agentic/improvement/SelfEvolution.js +24 -18
  31. package/dist/cjs/agentic/improvement/SelfTestRegistry.js +18 -15
  32. package/dist/cjs/agentic/improvement/SkillSynthesizer.js +42 -27
  33. package/dist/cjs/agentic/improvement/SovereignMetrics.js +19 -17
  34. package/dist/cjs/agentic/improvement/StrategicPlanner.js +120 -55
  35. package/dist/cjs/agentic/telemetry/CognitiveSynthesizer.js +26 -12
  36. package/dist/cjs/agentic/telemetry/EventHarvester.js +3 -2
  37. package/dist/cjs/agentic/telemetry/ResearchAlchemist.js +5 -2
  38. package/dist/cjs/cache/cache-manager.js +7 -4
  39. package/dist/cjs/cli/commands/analyze.js +5 -4
  40. package/dist/cjs/cli/commands/generate.js +81 -44
  41. package/dist/cjs/cli/commands/init.js +7 -3
  42. package/dist/cjs/cli/commands/inspect.js +139 -36
  43. package/dist/cjs/cli/commands/migrate.js +5 -4
  44. package/dist/cjs/cli/commands/optimize.js +4 -4
  45. package/dist/cjs/cli/commands/status.js +9 -7
  46. package/dist/cjs/cli/commands/watch.js +7 -6
  47. package/dist/cjs/cli/index.js +2 -2
  48. package/dist/cjs/cli/ui/spinner.d.ts +15 -0
  49. package/dist/cjs/cli/ui/spinner.js +76 -0
  50. package/dist/cjs/dialect/database-introspector.js +3 -1
  51. package/dist/cjs/dialect/postgresql/postgresql-driver.js +3 -1
  52. package/dist/cjs/dialect/postgresql/postgresql-features.js +18 -8
  53. package/dist/cjs/dialect/postgresql/postgresql-introspector.js +2 -2
  54. package/dist/cjs/dialect/sqlite/sqlite-auto-indexer.js +47 -33
  55. package/dist/cjs/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
  56. package/dist/cjs/dialect/sqlite/sqlite-driver.js +2 -2
  57. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +15 -12
  58. package/dist/cjs/edge-runtime/edge-config.js +21 -19
  59. package/dist/cjs/errors/NoormError.js +22 -20
  60. package/dist/cjs/helpers/agent-schema.js +2 -0
  61. package/dist/cjs/helpers/postgresql.js +7 -4
  62. package/dist/cjs/helpers/schema-evolution.js +31 -6
  63. package/dist/cjs/index.d.ts +3 -3
  64. package/dist/cjs/logging/logger.js +8 -4
  65. package/dist/cjs/migration/data_migrator.js +12 -11
  66. package/dist/cjs/migration/database_migration_manager.js +17 -13
  67. package/dist/cjs/migration/schema_differ.js +22 -14
  68. package/dist/cjs/migration/schema_introspector.js +8 -8
  69. package/dist/cjs/migration/type_mapper.js +68 -67
  70. package/dist/cjs/noormme.js +52 -37
  71. package/dist/cjs/performance/index.js +5 -5
  72. package/dist/cjs/performance/query-optimizer.js +26 -21
  73. package/dist/cjs/performance/services/cache-service.js +26 -16
  74. package/dist/cjs/performance/services/connection-factory.js +28 -23
  75. package/dist/cjs/performance/services/metrics-collector.js +41 -36
  76. package/dist/cjs/performance/utils/query-parser.js +15 -16
  77. package/dist/cjs/relationships/relationship-engine.js +10 -8
  78. package/dist/cjs/repository/repository-factory.js +97 -38
  79. package/dist/cjs/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
  80. package/dist/cjs/schema/core/discovery/relationship-discovery.js +16 -16
  81. package/dist/cjs/schema/core/discovery/table-metadata-discovery.js +9 -9
  82. package/dist/cjs/schema/core/discovery/view-discovery.js +5 -4
  83. package/dist/cjs/schema/core/factories/discovery-factory.js +4 -4
  84. package/dist/cjs/schema/core/utils/name-generator.js +14 -5
  85. package/dist/cjs/schema/core/utils/type-mapper.js +24 -24
  86. package/dist/cjs/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
  87. package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
  88. package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
  89. package/dist/cjs/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
  90. package/dist/cjs/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
  91. package/dist/cjs/schema/test/basic-schema-test.js +11 -9
  92. package/dist/cjs/schema/test/dialect-capabilities.test.js +6 -6
  93. package/dist/cjs/schema/test/discovery-factory.test.js +2 -2
  94. package/dist/cjs/schema/test/error-handling.test.js +8 -6
  95. package/dist/cjs/schema/test/integration.test.js +24 -18
  96. package/dist/cjs/schema/test/schema-discovery-coordinator.test.js +9 -9
  97. package/dist/cjs/schema/test/simple-schema-test.js +9 -9
  98. package/dist/cjs/schema/test/sqlite-discovery-coordinator.test.js +64 -48
  99. package/dist/cjs/schema/test/test-runner.js +3 -3
  100. package/dist/cjs/sqlite-migration/index.d.ts +2 -2
  101. package/dist/cjs/sqlite-migration/sqlite-migration-manager.js +21 -17
  102. package/dist/cjs/sqlite-migration/sqlite-migration-provider.js +38 -34
  103. package/dist/cjs/testing/test-utils.js +36 -34
  104. package/dist/cjs/types/index.d.ts +5 -2
  105. package/dist/cjs/types/index.js +6 -3
  106. package/dist/cjs/types/type-generator.js +46 -42
  107. package/dist/cjs/util/safe-sql-helpers.js +1 -1
  108. package/dist/cjs/util/security-validator.js +20 -9
  109. package/dist/cjs/utils/errorHelpers.js +20 -10
  110. package/dist/cjs/watch/schema-watcher.js +22 -23
  111. package/dist/esm/agentic/ActionJournal.js +13 -9
  112. package/dist/esm/agentic/CapabilityManager.js +35 -21
  113. package/dist/esm/agentic/CognitiveRepository.js +19 -9
  114. package/dist/esm/agentic/ContextBuffer.js +24 -12
  115. package/dist/esm/agentic/Cortex.js +11 -4
  116. package/dist/esm/agentic/EpisodicMemory.js +7 -5
  117. package/dist/esm/agentic/PersonaManager.js +16 -8
  118. package/dist/esm/agentic/PolicyEnforcer.js +31 -12
  119. package/dist/esm/agentic/ResourceMonitor.js +4 -4
  120. package/dist/esm/agentic/SessionCompressor.js +22 -14
  121. package/dist/esm/agentic/SessionManager.js +36 -18
  122. package/dist/esm/agentic/VectorIndexer.js +22 -18
  123. package/dist/esm/agentic/improvement/AblationEngine.js +22 -15
  124. package/dist/esm/agentic/improvement/ActionRefiner.js +12 -10
  125. package/dist/esm/agentic/improvement/ConflictResolver.js +5 -5
  126. package/dist/esm/agentic/improvement/CortexJanitor.js +30 -9
  127. package/dist/esm/agentic/improvement/CuriosityEngine.js +27 -23
  128. package/dist/esm/agentic/improvement/EvolutionRitual.js +4 -4
  129. package/dist/esm/agentic/improvement/EvolutionaryPilot.js +16 -6
  130. package/dist/esm/agentic/improvement/GoalArchitect.d.ts +2 -2
  131. package/dist/esm/agentic/improvement/GoalArchitect.js +20 -18
  132. package/dist/esm/agentic/improvement/GovernanceManager.js +19 -11
  133. package/dist/esm/agentic/improvement/HiveLink.js +22 -15
  134. package/dist/esm/agentic/improvement/KnowledgeDistiller.js +48 -32
  135. package/dist/esm/agentic/improvement/RecursiveReasoner.js +40 -17
  136. package/dist/esm/agentic/improvement/ReflectionEngine.js +10 -8
  137. package/dist/esm/agentic/improvement/RitualOrchestrator.js +28 -22
  138. package/dist/esm/agentic/improvement/RuleEngine.js +22 -17
  139. package/dist/esm/agentic/improvement/SelfEvolution.js +24 -18
  140. package/dist/esm/agentic/improvement/SelfTestRegistry.js +18 -15
  141. package/dist/esm/agentic/improvement/SkillSynthesizer.js +42 -27
  142. package/dist/esm/agentic/improvement/SovereignMetrics.js +19 -17
  143. package/dist/esm/agentic/improvement/StrategicPlanner.js +120 -55
  144. package/dist/esm/agentic/telemetry/CognitiveSynthesizer.js +26 -12
  145. package/dist/esm/agentic/telemetry/EventHarvester.js +3 -2
  146. package/dist/esm/agentic/telemetry/ResearchAlchemist.js +5 -2
  147. package/dist/esm/cache/cache-manager.js +7 -4
  148. package/dist/esm/cli/commands/analyze.js +5 -4
  149. package/dist/esm/cli/commands/generate.js +82 -45
  150. package/dist/esm/cli/commands/init.js +8 -4
  151. package/dist/esm/cli/commands/inspect.js +140 -37
  152. package/dist/esm/cli/commands/migrate.js +5 -4
  153. package/dist/esm/cli/commands/optimize.js +4 -4
  154. package/dist/esm/cli/commands/status.js +9 -7
  155. package/dist/esm/cli/commands/watch.js +7 -6
  156. package/dist/esm/cli/index.js +2 -2
  157. package/dist/esm/cli/ui/spinner.d.ts +15 -0
  158. package/dist/esm/cli/ui/spinner.js +70 -0
  159. package/dist/esm/dialect/database-introspector.js +3 -1
  160. package/dist/esm/dialect/postgresql/postgresql-driver.js +3 -1
  161. package/dist/esm/dialect/postgresql/postgresql-features.js +18 -8
  162. package/dist/esm/dialect/postgresql/postgresql-introspector.js +2 -2
  163. package/dist/esm/dialect/sqlite/sqlite-auto-indexer.js +47 -33
  164. package/dist/esm/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
  165. package/dist/esm/dialect/sqlite/sqlite-driver.js +2 -2
  166. package/dist/esm/dialect/sqlite/sqlite-introspector.js +15 -12
  167. package/dist/esm/dynamic/dynamic.js +1 -1
  168. package/dist/esm/edge-runtime/edge-config.js +21 -19
  169. package/dist/esm/errors/NoormError.js +22 -20
  170. package/dist/esm/helpers/agent-schema.js +2 -0
  171. package/dist/esm/helpers/postgresql.js +7 -4
  172. package/dist/esm/helpers/schema-evolution.js +31 -6
  173. package/dist/esm/index.d.ts +3 -3
  174. package/dist/esm/index.js +2 -2
  175. package/dist/esm/logging/logger.js +8 -4
  176. package/dist/esm/migration/data_migrator.js +12 -11
  177. package/dist/esm/migration/database_migration_manager.js +18 -14
  178. package/dist/esm/migration/schema_differ.js +22 -14
  179. package/dist/esm/migration/schema_introspector.js +8 -8
  180. package/dist/esm/migration/type_mapper.js +68 -67
  181. package/dist/esm/noormme.js +52 -37
  182. package/dist/esm/performance/index.js +5 -5
  183. package/dist/esm/performance/query-optimizer.js +26 -21
  184. package/dist/esm/performance/services/cache-service.js +26 -16
  185. package/dist/esm/performance/services/connection-factory.js +28 -23
  186. package/dist/esm/performance/services/metrics-collector.js +41 -36
  187. package/dist/esm/performance/utils/query-parser.js +15 -16
  188. package/dist/esm/raw-builder/sql.js +1 -1
  189. package/dist/esm/relationships/relationship-engine.js +10 -8
  190. package/dist/esm/repository/repository-factory.js +98 -39
  191. package/dist/esm/schema/builders/alter-table-add-index-builder.js +1 -1
  192. package/dist/esm/schema/builders/create-index-builder.js +2 -2
  193. package/dist/esm/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
  194. package/dist/esm/schema/core/discovery/relationship-discovery.js +16 -16
  195. package/dist/esm/schema/core/discovery/table-metadata-discovery.js +9 -9
  196. package/dist/esm/schema/core/discovery/view-discovery.js +5 -4
  197. package/dist/esm/schema/core/factories/discovery-factory.js +4 -4
  198. package/dist/esm/schema/core/utils/name-generator.js +14 -5
  199. package/dist/esm/schema/core/utils/type-mapper.js +24 -24
  200. package/dist/esm/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
  201. package/dist/esm/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
  202. package/dist/esm/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
  203. package/dist/esm/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
  204. package/dist/esm/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
  205. package/dist/esm/schema/test/basic-schema-test.js +11 -9
  206. package/dist/esm/schema/test/dialect-capabilities.test.js +6 -6
  207. package/dist/esm/schema/test/discovery-factory.test.js +2 -2
  208. package/dist/esm/schema/test/error-handling.test.js +8 -6
  209. package/dist/esm/schema/test/integration.test.js +24 -18
  210. package/dist/esm/schema/test/schema-discovery-coordinator.test.js +9 -9
  211. package/dist/esm/schema/test/simple-schema-test.js +9 -9
  212. package/dist/esm/schema/test/sqlite-discovery-coordinator.test.js +64 -48
  213. package/dist/esm/schema/test/test-runner.js +3 -3
  214. package/dist/esm/sqlite-migration/index.d.ts +2 -2
  215. package/dist/esm/sqlite-migration/sqlite-migration-manager.js +21 -17
  216. package/dist/esm/sqlite-migration/sqlite-migration-provider.js +38 -34
  217. package/dist/esm/testing/test-utils.js +36 -34
  218. package/dist/esm/types/index.d.ts +5 -2
  219. package/dist/esm/types/index.js +6 -3
  220. package/dist/esm/types/type-generator.js +46 -42
  221. package/dist/esm/util/safe-sql-helpers.js +1 -1
  222. package/dist/esm/util/security-validator.js +20 -9
  223. package/dist/esm/utils/errorHelpers.js +21 -11
  224. package/dist/esm/watch/schema-watcher.js +22 -23
  225. package/package.json +40 -44
@@ -5,31 +5,31 @@
5
5
  export class TypeMapper {
6
6
  static typeMapping = {
7
7
  // SQLite types
8
- 'text': 'string',
9
- 'varchar': 'string',
10
- 'char': 'string',
11
- 'integer': 'number',
12
- 'real': 'number',
13
- 'numeric': 'number',
14
- 'boolean': 'boolean',
15
- 'date': 'Date',
16
- 'datetime': 'Date',
17
- 'blob': 'Buffer',
8
+ text: 'string',
9
+ varchar: 'string',
10
+ char: 'string',
11
+ integer: 'number',
12
+ real: 'number',
13
+ numeric: 'number',
14
+ boolean: 'boolean',
15
+ date: 'Date',
16
+ datetime: 'Date',
17
+ blob: 'Buffer',
18
18
  // PostgreSQL types
19
- 'bigint': 'number',
20
- 'smallint': 'number',
21
- 'decimal': 'number',
19
+ bigint: 'number',
20
+ smallint: 'number',
21
+ decimal: 'number',
22
22
  'double precision': 'number',
23
- 'timestamp': 'Date',
24
- 'timestamptz': 'Date',
25
- 'time': 'Date',
26
- 'timetz': 'Date',
27
- 'json': 'Record<string, unknown>',
28
- 'jsonb': 'Record<string, unknown>',
29
- 'uuid': 'string',
30
- 'tsvector': 'string',
31
- 'tsquery': 'string',
32
- 'bytea': 'Buffer',
23
+ timestamp: 'Date',
24
+ timestamptz: 'Date',
25
+ time: 'Date',
26
+ timetz: 'Date',
27
+ json: 'Record<string, unknown>',
28
+ jsonb: 'Record<string, unknown>',
29
+ uuid: 'string',
30
+ tsvector: 'string',
31
+ tsquery: 'string',
32
+ bytea: 'Buffer',
33
33
  };
34
34
  /**
35
35
  * Map database column info to our ColumnInfo interface
@@ -44,7 +44,7 @@ export class TypeMapper {
44
44
  isAutoIncrement: dbColumn.isAutoIncrement ?? false,
45
45
  maxLength: dbColumn.maxLength,
46
46
  precision: dbColumn.precision,
47
- scale: dbColumn.scale
47
+ scale: dbColumn.scale,
48
48
  };
49
49
  }
50
50
  /**
@@ -31,7 +31,7 @@ export class PostgresDiscoveryCoordinator {
31
31
  const discoveryConfig = {
32
32
  excludeTables: config.excludeTables,
33
33
  includeViews: config.includeViews,
34
- customTypeMappings: config.customTypeMappings
34
+ customTypeMappings: config.customTypeMappings,
35
35
  };
36
36
  // Discover tables
37
37
  let tables = [];
@@ -45,7 +45,8 @@ export class PostgresDiscoveryCoordinator {
45
45
  // Discover relationships
46
46
  let relationships = [];
47
47
  try {
48
- relationships = await this.relationshipDiscovery.discoverRelationships(tables);
48
+ relationships =
49
+ await this.relationshipDiscovery.discoverRelationships(tables);
49
50
  }
50
51
  catch (error) {
51
52
  console.warn('PostgreSQL relationship discovery failed:', error);
@@ -56,11 +57,11 @@ export class PostgresDiscoveryCoordinator {
56
57
  if (discoveryConfig.includeViews) {
57
58
  try {
58
59
  const viewMetadata = await this.viewDiscovery.discoverViews(introspector);
59
- views = viewMetadata.map(view => ({
60
+ views = viewMetadata.map((view) => ({
60
61
  name: view.name,
61
62
  schema: view.schema,
62
63
  definition: view.definition || '',
63
- columns: view.columns || []
64
+ columns: view.columns || [],
64
65
  }));
65
66
  }
66
67
  catch (error) {
@@ -71,7 +72,7 @@ export class PostgresDiscoveryCoordinator {
71
72
  return {
72
73
  tables,
73
74
  relationships,
74
- views
75
+ views,
75
76
  };
76
77
  }
77
78
  /**
@@ -95,7 +96,7 @@ export class PostgresDiscoveryCoordinator {
95
96
  supportsAutoIncrement: true, // via serial or identity
96
97
  supportsRowId: false,
97
98
  supportsTriggers: true,
98
- supportsFullTextSearch: true
99
+ supportsFullTextSearch: true,
99
100
  };
100
101
  }
101
102
  /**
@@ -107,7 +108,7 @@ export class PostgresDiscoveryCoordinator {
107
108
  'Enable SSL for secure database connections',
108
109
  'Consider using JSONB for unstructured data',
109
110
  'Use appropriate isolation levels for transactions',
110
- 'Monitor slow queries using pg_stat_statements'
111
+ 'Monitor slow queries using pg_stat_statements',
111
112
  ];
112
113
  }
113
114
  }
@@ -42,7 +42,7 @@ export class SQLiteConstraintDiscovery {
42
42
  const columnMatches = sql.match(/CREATE TABLE[^(]*\(([^)]+)\)/i);
43
43
  if (!columnMatches)
44
44
  return constraints;
45
- const definitions = columnMatches[1].split(',').map(def => def.trim());
45
+ const definitions = columnMatches[1].split(',').map((def) => def.trim());
46
46
  for (const definition of definitions) {
47
47
  // Primary key constraints
48
48
  if (definition.toUpperCase().includes('PRIMARY KEY')) {
@@ -52,7 +52,7 @@ export class SQLiteConstraintDiscovery {
52
52
  name: `${tableName}_pk`,
53
53
  type: 'p',
54
54
  columns: [pkMatch[1]],
55
- definition: definition
55
+ definition: definition,
56
56
  });
57
57
  }
58
58
  }
@@ -66,7 +66,7 @@ export class SQLiteConstraintDiscovery {
66
66
  column: fkMatch[1],
67
67
  referencedTable: fkMatch[2],
68
68
  referencedColumn: fkMatch[3],
69
- definition: definition
69
+ definition: definition,
70
70
  });
71
71
  }
72
72
  }
@@ -78,7 +78,7 @@ export class SQLiteConstraintDiscovery {
78
78
  name: `${tableName}_check_${constraints.length + 1}`,
79
79
  type: 'c',
80
80
  definition: checkMatch[1],
81
- fullDefinition: definition
81
+ fullDefinition: definition,
82
82
  });
83
83
  }
84
84
  }
@@ -89,8 +89,8 @@ export class SQLiteConstraintDiscovery {
89
89
  constraints.push({
90
90
  name: `${tableName}_unique_${constraints.length + 1}`,
91
91
  type: 'u',
92
- columns: uniqueMatch[1].split(',').map(col => col.trim()),
93
- definition: definition
92
+ columns: uniqueMatch[1].split(',').map((col) => col.trim()),
93
+ definition: definition,
94
94
  });
95
95
  }
96
96
  }
@@ -102,7 +102,7 @@ export class SQLiteConstraintDiscovery {
102
102
  name: `${tableName}_nn_${notNullMatch[1]}`,
103
103
  type: 'n',
104
104
  column: notNullMatch[1],
105
- definition: definition
105
+ definition: definition,
106
106
  });
107
107
  }
108
108
  }
@@ -123,7 +123,7 @@ export class SQLiteConstraintDiscovery {
123
123
  // If 'to' is null/undefined, the FK references the primary key (default to 'id')
124
124
  referencedColumn: row.to || 'id',
125
125
  onDelete: row.on_delete || 'NO ACTION',
126
- onUpdate: row.on_update || 'NO ACTION'
126
+ onUpdate: row.on_update || 'NO ACTION',
127
127
  }));
128
128
  }
129
129
  catch (error) {
@@ -175,7 +175,7 @@ export class SQLiteConstraintDiscovery {
175
175
  }
176
176
  return {
177
177
  isValid: issues.length === 0,
178
- issues
178
+ issues,
179
179
  };
180
180
  }
181
181
  /**
@@ -203,7 +203,7 @@ export class SQLiteConstraintDiscovery {
203
203
  }
204
204
  return {
205
205
  recommendations,
206
- compatibilityIssues
206
+ compatibilityIssues,
207
207
  };
208
208
  }
209
209
  /**
@@ -260,7 +260,7 @@ export class SQLiteConstraintDiscovery {
260
260
  issues,
261
261
  recommendations,
262
262
  orphanedRecords,
263
- performanceImpact
263
+ performanceImpact,
264
264
  };
265
265
  }
266
266
  catch (error) {
@@ -270,7 +270,7 @@ export class SQLiteConstraintDiscovery {
270
270
  issues,
271
271
  recommendations: ['Check database connection and permissions'],
272
272
  orphanedRecords: [],
273
- performanceImpact: 'high'
273
+ performanceImpact: 'high',
274
274
  };
275
275
  }
276
276
  }
@@ -437,7 +437,7 @@ export class SQLiteConstraintDiscovery {
437
437
  indexRecommendations,
438
438
  constraintRecommendations,
439
439
  cleanupRecommendations,
440
- performanceRecommendations
440
+ performanceRecommendations,
441
441
  };
442
442
  }
443
443
  catch (error) {
@@ -445,7 +445,9 @@ export class SQLiteConstraintDiscovery {
445
445
  indexRecommendations: [],
446
446
  constraintRecommendations: [],
447
447
  cleanupRecommendations: [],
448
- performanceRecommendations: [`Error generating recommendations: ${error}`]
448
+ performanceRecommendations: [
449
+ `Error generating recommendations: ${error}`,
450
+ ],
449
451
  };
450
452
  }
451
453
  }
@@ -453,7 +455,7 @@ export class SQLiteConstraintDiscovery {
453
455
  * Auto-fix common foreign key issues
454
456
  */
455
457
  async autoFixForeignKeyIssues(db, options = {}) {
456
- const { createMissingIndexes = true, enableForeignKeys = true, cleanupOrphanedRecords = false, dryRun = true } = options;
458
+ const { createMissingIndexes = true, enableForeignKeys = true, cleanupOrphanedRecords = false, dryRun = true, } = options;
457
459
  const applied = [];
458
460
  const failed = [];
459
461
  const skipped = [];
@@ -22,7 +22,7 @@ export class SQLiteIndexDiscovery {
22
22
  'name',
23
23
  'sql as definition',
24
24
  sql `type = 'index'`.as('isIndex'),
25
- sql `sql LIKE '%UNIQUE%'`.as('unique')
25
+ sql `sql LIKE '%UNIQUE%'`.as('unique'),
26
26
  ])
27
27
  .where('type', '=', 'index')
28
28
  .where('tbl_name', '=', tableName)
@@ -32,7 +32,7 @@ export class SQLiteIndexDiscovery {
32
32
  ...index,
33
33
  columns: this.extractColumnsFromSQL(index.definition),
34
34
  isPrimary: index.name.includes('sqlite_autoindex'),
35
- comment: null // SQLite doesn't support index comments
35
+ comment: null, // SQLite doesn't support index comments
36
36
  }));
37
37
  return processedIndexes;
38
38
  }
@@ -53,8 +53,8 @@ export class SQLiteIndexDiscovery {
53
53
  if (match) {
54
54
  return match[1]
55
55
  .split(',')
56
- .map(col => col.trim().replace(/^\s*["']?|["']?\s*$/g, ''))
57
- .filter(col => col.length > 0);
56
+ .map((col) => col.trim().replace(/^\s*["']?|["']?\s*$/g, ''))
57
+ .filter((col) => col.length > 0);
58
58
  }
59
59
  return [];
60
60
  }
@@ -80,12 +80,12 @@ export class SQLiteIndexDiscovery {
80
80
  const missingIndexes = [];
81
81
  const redundantIndexes = [];
82
82
  // Check for auto-generated indexes that might be redundant
83
- const autoIndexes = indexes.filter(idx => idx.isPrimary);
83
+ const autoIndexes = indexes.filter((idx) => idx.isPrimary);
84
84
  if (autoIndexes.length > 1) {
85
85
  recommendations.push('Multiple auto-generated indexes found - review table structure');
86
86
  }
87
87
  // Check for indexes with no columns (invalid)
88
- const invalidIndexes = indexes.filter(idx => !idx.columns || idx.columns.length === 0);
88
+ const invalidIndexes = indexes.filter((idx) => !idx.columns || idx.columns.length === 0);
89
89
  for (const idx of invalidIndexes) {
90
90
  recommendations.push(`Invalid index found: ${idx.name} (no columns)`);
91
91
  }
@@ -107,7 +107,7 @@ export class SQLiteIndexDiscovery {
107
107
  return {
108
108
  recommendations,
109
109
  missingIndexes,
110
- redundantIndexes
110
+ redundantIndexes,
111
111
  };
112
112
  }
113
113
  /**
@@ -119,7 +119,7 @@ export class SQLiteIndexDiscovery {
119
119
  return {
120
120
  rowCount: result.rows?.[0]?.rowCount || 0,
121
121
  size: 0, // SQLite doesn't provide direct size info
122
- lastModified: new Date()
122
+ lastModified: new Date(),
123
123
  };
124
124
  }
125
125
  catch (error) {
@@ -15,13 +15,7 @@ export class SQLiteSchemaIntrospector extends DatabaseIntrospector {
15
15
  try {
16
16
  const tables = await this.db
17
17
  .selectFrom('sqlite_master')
18
- .select([
19
- 'name',
20
- 'type',
21
- 'tbl_name',
22
- 'rootpage',
23
- 'sql'
24
- ])
18
+ .select(['name', 'type', 'tbl_name', 'rootpage', 'sql'])
25
19
  .where('type', '=', 'table')
26
20
  .execute();
27
21
  const enhancedTables = [];
@@ -39,7 +33,7 @@ export class SQLiteSchemaIntrospector extends DatabaseIntrospector {
39
33
  hasTriggers: false, // Will be determined separately
40
34
  tableType: 'table',
41
35
  lastAnalyzed: null,
42
- lastAutoAnalyzed: null
36
+ lastAutoAnalyzed: null,
43
37
  });
44
38
  }
45
39
  catch (error) {
@@ -71,7 +65,7 @@ export class SQLiteSchemaIntrospector extends DatabaseIntrospector {
71
65
  'synchronous',
72
66
  'journal_mode',
73
67
  'auto_vacuum',
74
- 'integrity_check'
68
+ 'integrity_check',
75
69
  ];
76
70
  for (const pragma of pragmas) {
77
71
  try {
@@ -98,7 +92,7 @@ export class SQLiteSchemaIntrospector extends DatabaseIntrospector {
98
92
  pageSize: stats.page_size,
99
93
  journalMode: stats.journal_mode,
100
94
  autoVacuum: stats.auto_vacuum,
101
- synchronous: stats.synchronous
95
+ synchronous: stats.synchronous,
102
96
  };
103
97
  }
104
98
  catch (error) {
@@ -117,7 +111,8 @@ export class SQLiteSchemaIntrospector extends DatabaseIntrospector {
117
111
  info.version = versionResult.rows?.[0]?.version;
118
112
  // Get compile options
119
113
  const compileOptionsResult = await sql `PRAGMA compile_options`.execute(this.db);
120
- info.compileOptions = compileOptionsResult.rows?.map((row) => row.compile_options) || [];
114
+ info.compileOptions =
115
+ compileOptionsResult.rows?.map((row) => row.compile_options) || [];
121
116
  // Get foreign key status
122
117
  const fkResult = await sql `PRAGMA foreign_keys`.execute(this.db);
123
118
  info.foreignKeysEnabled = fkResult.rows?.[0]?.foreign_keys === 1;
@@ -36,7 +36,7 @@ export class SQLiteDiscoveryCoordinator {
36
36
  const discoveryConfig = {
37
37
  excludeTables: config.excludeTables,
38
38
  includeViews: config.includeViews,
39
- customTypeMappings: config.customTypeMappings
39
+ customTypeMappings: config.customTypeMappings,
40
40
  };
41
41
  // Check if foreign keys are enabled
42
42
  let fkEnabled = false;
@@ -62,7 +62,8 @@ export class SQLiteDiscoveryCoordinator {
62
62
  let relationships = [];
63
63
  if (fkEnabled) {
64
64
  try {
65
- relationships = await this.relationshipDiscovery.discoverRelationships(enhancedTables);
65
+ relationships =
66
+ await this.relationshipDiscovery.discoverRelationships(enhancedTables);
66
67
  }
67
68
  catch (error) {
68
69
  console.warn('Relationship discovery failed:', error);
@@ -80,16 +81,16 @@ export class SQLiteDiscoveryCoordinator {
80
81
  viewMetadata = [];
81
82
  }
82
83
  }
83
- const views = viewMetadata.map(view => ({
84
+ const views = viewMetadata.map((view) => ({
84
85
  name: view.name,
85
86
  schema: view.schema,
86
87
  definition: view.definition || '',
87
- columns: view.columns || []
88
+ columns: view.columns || [],
88
89
  }));
89
90
  return {
90
91
  tables: enhancedTables,
91
92
  relationships,
92
- views
93
+ views,
93
94
  };
94
95
  }
95
96
  /**
@@ -111,23 +112,23 @@ export class SQLiteDiscoveryCoordinator {
111
112
  const tableSize = await this.indexDiscovery.getTableSize(db, table.name);
112
113
  enhancedTables.push({
113
114
  ...table,
114
- indexes: indexes.map(idx => ({
115
+ indexes: indexes.map((idx) => ({
115
116
  name: idx.name,
116
117
  columns: idx.columns,
117
118
  unique: idx.unique,
118
119
  isPrimary: idx.isPrimary,
119
- definition: idx.definition
120
+ definition: idx.definition,
120
121
  })),
121
122
  constraints: constraints,
122
- foreignKeys: foreignKeys.map(fk => ({
123
+ foreignKeys: foreignKeys.map((fk) => ({
123
124
  name: fk.name,
124
125
  column: fk.column,
125
126
  referencedTable: fk.referencedTable,
126
127
  referencedColumn: fk.referencedColumn,
127
128
  onDelete: fk.onDelete,
128
- onUpdate: fk.onUpdate
129
+ onUpdate: fk.onUpdate,
129
130
  })),
130
- tableSize: tableSize
131
+ tableSize: tableSize,
131
132
  });
132
133
  }
133
134
  catch (error) {
@@ -137,7 +138,7 @@ export class SQLiteDiscoveryCoordinator {
137
138
  indexes: [],
138
139
  constraints: [],
139
140
  foreignKeys: [],
140
- tableSize: undefined
141
+ tableSize: undefined,
141
142
  });
142
143
  }
143
144
  }
@@ -164,7 +165,7 @@ export class SQLiteDiscoveryCoordinator {
164
165
  supportsAutoIncrement: true,
165
166
  supportsRowId: true,
166
167
  supportsTriggers: true,
167
- supportsFullTextSearch: true
168
+ supportsFullTextSearch: true,
168
169
  };
169
170
  }
170
171
  /**
@@ -213,7 +214,7 @@ export class SQLiteDiscoveryCoordinator {
213
214
  'Use WAL mode for better concurrency: PRAGMA journal_mode = WAL',
214
215
  'Set appropriate cache size: PRAGMA cache_size = -64000',
215
216
  'Enable query optimization: PRAGMA optimize',
216
- 'Consider using prepared statements for better performance'
217
+ 'Consider using prepared statements for better performance',
217
218
  ];
218
219
  }
219
220
  }
@@ -54,7 +54,7 @@ class SimpleTest {
54
54
  console.log(`❌ Expected error containing "${expectedError}", got: ${errorMessage}`);
55
55
  }
56
56
  }
57
- }
57
+ },
58
58
  };
59
59
  }
60
60
  async run() {
@@ -88,7 +88,7 @@ async function runTests() {
88
88
  // Test 1: DiscoveryFactory Singleton
89
89
  test.test('DiscoveryFactory should be a singleton', () => {
90
90
  try {
91
- const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
91
+ const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
92
92
  const instance1 = DiscoveryFactory.getInstance();
93
93
  const instance2 = DiscoveryFactory.getInstance();
94
94
  test.expect(instance1).toBe(instance2);
@@ -100,7 +100,7 @@ async function runTests() {
100
100
  // Test 2: SchemaDiscoveryCoordinator Singleton
101
101
  test.test('SchemaDiscoveryCoordinator should be a singleton', () => {
102
102
  try {
103
- const { SchemaDiscoveryCoordinator } = require('../core/coordinators/schema-discovery.coordinator.js');
103
+ const { SchemaDiscoveryCoordinator, } = require('../core/coordinators/schema-discovery.coordinator.js');
104
104
  const instance1 = SchemaDiscoveryCoordinator.getInstance();
105
105
  const instance2 = SchemaDiscoveryCoordinator.getInstance();
106
106
  test.expect(instance1).toBe(instance2);
@@ -112,7 +112,7 @@ async function runTests() {
112
112
  // Test 4: SQLite Coordinator Singleton
113
113
  test.test('SQLiteDiscoveryCoordinator should be a singleton', () => {
114
114
  try {
115
- const { SQLiteDiscoveryCoordinator } = require('../dialects/sqlite/sqlite-discovery.coordinator.js');
115
+ const { SQLiteDiscoveryCoordinator, } = require('../dialects/sqlite/sqlite-discovery.coordinator.js');
116
116
  const instance1 = SQLiteDiscoveryCoordinator.getInstance();
117
117
  const instance2 = SQLiteDiscoveryCoordinator.getInstance();
118
118
  test.expect(instance1).toBe(instance2);
@@ -124,7 +124,7 @@ async function runTests() {
124
124
  // Test 5: Factory Dialect Support
125
125
  test.test('DiscoveryFactory should support PostgreSQL and SQLite', () => {
126
126
  try {
127
- const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
127
+ const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
128
128
  const factory = DiscoveryFactory.getInstance();
129
129
  test.expect(factory.isDialectSupported('postgresql')).toBe(true);
130
130
  test.expect(factory.isDialectSupported('sqlite')).toBe(true);
@@ -137,9 +137,11 @@ async function runTests() {
137
137
  // Test 6: Error Handling
138
138
  test.test('DiscoveryFactory should throw error for unsupported dialects', () => {
139
139
  try {
140
- const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
140
+ const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
141
141
  const factory = DiscoveryFactory.getInstance();
142
- test.expect(() => factory.createIndexDiscovery('oracle')).toThrow('Unsupported dialect');
142
+ test
143
+ .expect(() => factory.createIndexDiscovery('oracle'))
144
+ .toThrow('Unsupported dialect');
143
145
  }
144
146
  catch (error) {
145
147
  console.log('⚠️ Error handling test skipped (module not available)');
@@ -148,7 +150,7 @@ async function runTests() {
148
150
  // Test 7: Capabilities
149
151
  test.test('PostgreSQL should have correct capabilities', () => {
150
152
  try {
151
- const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
153
+ const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
152
154
  const factory = DiscoveryFactory.getInstance();
153
155
  const capabilities = factory.getDialectCapabilities('postgresql');
154
156
  test.expect(capabilities.supportsViews).toBe(true);
@@ -162,7 +164,7 @@ async function runTests() {
162
164
  // Test 8: SQLite Capabilities
163
165
  test.test('SQLite should have correct capabilities', () => {
164
166
  try {
165
- const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
167
+ const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
166
168
  const factory = DiscoveryFactory.getInstance();
167
169
  const capabilities = factory.getDialectCapabilities('sqlite');
168
170
  test.expect(capabilities.supportsViews).toBe(true);
@@ -23,7 +23,7 @@ describe('Dialect Capabilities', () => {
23
23
  supportsConstraints: true,
24
24
  supportsForeignKeys: true,
25
25
  supportsCheckConstraints: true,
26
- supportsDeferredConstraints: false
26
+ supportsDeferredConstraints: false,
27
27
  });
28
28
  });
29
29
  it('should handle case insensitive dialect names', () => {
@@ -34,7 +34,7 @@ describe('Dialect Capabilities', () => {
34
34
  supportsConstraints: true,
35
35
  supportsForeignKeys: true,
36
36
  supportsCheckConstraints: true,
37
- supportsDeferredConstraints: false
37
+ supportsDeferredConstraints: false,
38
38
  });
39
39
  });
40
40
  });
@@ -46,7 +46,7 @@ describe('Dialect Capabilities', () => {
46
46
  supportsConstraints: false,
47
47
  supportsForeignKeys: false,
48
48
  supportsCheckConstraints: false,
49
- supportsDeferredConstraints: false
49
+ supportsDeferredConstraints: false,
50
50
  });
51
51
  });
52
52
  it('should handle dialect name with whitespace', () => {
@@ -57,7 +57,7 @@ describe('Dialect Capabilities', () => {
57
57
  supportsConstraints: true,
58
58
  supportsForeignKeys: true,
59
59
  supportsCheckConstraints: true,
60
- supportsDeferredConstraints: false
60
+ supportsDeferredConstraints: false,
61
61
  });
62
62
  });
63
63
  it('should handle mixed case dialect names', () => {
@@ -68,7 +68,7 @@ describe('Dialect Capabilities', () => {
68
68
  supportsConstraints: true,
69
69
  supportsForeignKeys: true,
70
70
  supportsCheckConstraints: true,
71
- supportsDeferredConstraints: false
71
+ supportsDeferredConstraints: false,
72
72
  });
73
73
  });
74
74
  });
@@ -93,7 +93,7 @@ describe('Dialect Capabilities', () => {
93
93
  supportsAutoIncrement: true,
94
94
  supportsRowId: true,
95
95
  supportsTriggers: true,
96
- supportsFullTextSearch: true
96
+ supportsFullTextSearch: true,
97
97
  });
98
98
  });
99
99
  it('should support all SQLite features', () => {
@@ -132,7 +132,7 @@ describe('DiscoveryFactory', () => {
132
132
  supportsConstraints: true,
133
133
  supportsForeignKeys: true,
134
134
  supportsCheckConstraints: true,
135
- supportsDeferredConstraints: false
135
+ supportsDeferredConstraints: false,
136
136
  });
137
137
  });
138
138
  it('should return false capabilities for unsupported dialects', () => {
@@ -143,7 +143,7 @@ describe('DiscoveryFactory', () => {
143
143
  supportsConstraints: false,
144
144
  supportsForeignKeys: false,
145
145
  supportsCheckConstraints: false,
146
- supportsDeferredConstraints: false
146
+ supportsDeferredConstraints: false,
147
147
  });
148
148
  });
149
149
  });
@@ -77,7 +77,7 @@ describe('Error Handling', () => {
77
77
  getPlugin: jest.fn(),
78
78
  withPlugin: jest.fn(),
79
79
  withoutPlugins: jest.fn(),
80
- freeze: jest.fn()
80
+ freeze: jest.fn(),
81
81
  };
82
82
  it('should handle table discovery service errors', async () => {
83
83
  // The coordinator handles errors gracefully by returning empty results
@@ -89,11 +89,13 @@ describe('Error Handling', () => {
89
89
  return {
90
90
  select: jest.fn().mockReturnThis(),
91
91
  where: jest.fn().mockReturnThis(),
92
- execute: jest.fn().mockRejectedValue(new Error('Table discovery service failed'))
92
+ execute: jest
93
+ .fn()
94
+ .mockRejectedValue(new Error('Table discovery service failed')),
93
95
  };
94
96
  }
95
97
  return mockKysely.selectFrom(table);
96
- })
98
+ }),
97
99
  };
98
100
  // Should return empty result instead of throwing
99
101
  const result = await sqliteCoordinator.discoverSchema(failingMockKysely, {});
@@ -108,9 +110,9 @@ describe('Error Handling', () => {
108
110
  return {
109
111
  select: jest.fn().mockReturnThis(),
110
112
  where: jest.fn().mockReturnThis(),
111
- execute: jest.fn().mockResolvedValue([])
113
+ execute: jest.fn().mockResolvedValue([]),
112
114
  };
113
- })
115
+ }),
114
116
  };
115
117
  // This test validates the coordinator can handle errors gracefully
116
118
  const result = await sqliteCoordinator.discoverSchema(failingMockKysely, {});
@@ -140,7 +142,7 @@ describe('Error Handling', () => {
140
142
  }),
141
143
  // Add minimal required properties
142
144
  schema: null,
143
- dynamic: null
145
+ dynamic: null,
144
146
  };
145
147
  // Should return empty result instead of throwing
146
148
  const result = await sqliteCoordinator.discoverSchema(mockKyselyWithError, {});