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.
- package/README.md +84 -65
- package/dist/cjs/agentic/ActionJournal.js +13 -9
- package/dist/cjs/agentic/CapabilityManager.js +35 -21
- package/dist/cjs/agentic/CognitiveRepository.js +19 -9
- package/dist/cjs/agentic/ContextBuffer.js +24 -12
- package/dist/cjs/agentic/Cortex.js +11 -4
- 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.js +30 -9
- package/dist/cjs/agentic/improvement/CuriosityEngine.js +27 -23
- package/dist/cjs/agentic/improvement/EvolutionRitual.js +4 -4
- package/dist/cjs/agentic/improvement/EvolutionaryPilot.js +16 -6
- 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.js +19 -11
- package/dist/cjs/agentic/improvement/HiveLink.js +22 -15
- package/dist/cjs/agentic/improvement/KnowledgeDistiller.js +48 -32
- package/dist/cjs/agentic/improvement/RecursiveReasoner.js +40 -17
- package/dist/cjs/agentic/improvement/ReflectionEngine.js +10 -8
- package/dist/cjs/agentic/improvement/RitualOrchestrator.js +28 -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.js +42 -27
- package/dist/cjs/agentic/improvement/SovereignMetrics.js +19 -17
- package/dist/cjs/agentic/improvement/StrategicPlanner.js +120 -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 +5 -2
- 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 +2 -0
- package/dist/cjs/helpers/postgresql.js +7 -4
- package/dist/cjs/helpers/schema-evolution.js +31 -6
- package/dist/cjs/index.d.ts +3 -3
- 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 +52 -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 +5 -2
- 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.js +35 -21
- package/dist/esm/agentic/CognitiveRepository.js +19 -9
- package/dist/esm/agentic/ContextBuffer.js +24 -12
- package/dist/esm/agentic/Cortex.js +11 -4
- 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.js +30 -9
- package/dist/esm/agentic/improvement/CuriosityEngine.js +27 -23
- package/dist/esm/agentic/improvement/EvolutionRitual.js +4 -4
- package/dist/esm/agentic/improvement/EvolutionaryPilot.js +16 -6
- 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.js +19 -11
- package/dist/esm/agentic/improvement/HiveLink.js +22 -15
- package/dist/esm/agentic/improvement/KnowledgeDistiller.js +48 -32
- package/dist/esm/agentic/improvement/RecursiveReasoner.js +40 -17
- package/dist/esm/agentic/improvement/ReflectionEngine.js +10 -8
- package/dist/esm/agentic/improvement/RitualOrchestrator.js +28 -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.js +42 -27
- package/dist/esm/agentic/improvement/SovereignMetrics.js +19 -17
- package/dist/esm/agentic/improvement/StrategicPlanner.js +120 -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 +5 -2
- 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 +2 -0
- package/dist/esm/helpers/postgresql.js +7 -4
- package/dist/esm/helpers/schema-evolution.js +31 -6
- package/dist/esm/index.d.ts +3 -3
- 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 +52 -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 +5 -2
- 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
|
@@ -5,31 +5,31 @@
|
|
|
5
5
|
export class TypeMapper {
|
|
6
6
|
static typeMapping = {
|
|
7
7
|
// SQLite types
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
bigint: 'number',
|
|
20
|
+
smallint: 'number',
|
|
21
|
+
decimal: 'number',
|
|
22
22
|
'double precision': 'number',
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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 =
|
|
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: [
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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, {});
|