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