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
|
@@ -7,7 +7,7 @@ const mockKysely = {
|
|
|
7
7
|
selectFrom: jest.fn(),
|
|
8
8
|
select: jest.fn(),
|
|
9
9
|
where: jest.fn(),
|
|
10
|
-
execute: jest.fn()
|
|
10
|
+
execute: jest.fn(),
|
|
11
11
|
};
|
|
12
12
|
// Mock DiscoveryFactory
|
|
13
13
|
const mockFactory = {
|
|
@@ -20,7 +20,7 @@ const mockFactory = {
|
|
|
20
20
|
createDiscoveryServices: jest.fn(),
|
|
21
21
|
getDialectCapabilities: jest.fn(),
|
|
22
22
|
isDialectSupported: jest.fn(),
|
|
23
|
-
getSupportedDialects: jest.fn()
|
|
23
|
+
getSupportedDialects: jest.fn(),
|
|
24
24
|
};
|
|
25
25
|
// Mock SQLite coordinator
|
|
26
26
|
const mockSQLiteCoordinator = {
|
|
@@ -33,7 +33,7 @@ const mockSQLiteCoordinator = {
|
|
|
33
33
|
viewDiscovery: {},
|
|
34
34
|
indexDiscovery: {},
|
|
35
35
|
constraintDiscovery: {},
|
|
36
|
-
enhanceTablesWithSQLiteMetadata: jest.fn()
|
|
36
|
+
enhanceTablesWithSQLiteMetadata: jest.fn(),
|
|
37
37
|
};
|
|
38
38
|
(0, globals_1.describe)('SchemaDiscoveryCoordinator', () => {
|
|
39
39
|
let coordinator;
|
|
@@ -48,7 +48,7 @@ const mockSQLiteCoordinator = {
|
|
|
48
48
|
relationshipDiscovery: {},
|
|
49
49
|
viewDiscovery: {},
|
|
50
50
|
indexDiscovery: {},
|
|
51
|
-
constraintDiscovery: {}
|
|
51
|
+
constraintDiscovery: {},
|
|
52
52
|
});
|
|
53
53
|
mockFactory.getDialectCapabilities.mockReturnValue({
|
|
54
54
|
supportsViews: true,
|
|
@@ -56,7 +56,7 @@ const mockSQLiteCoordinator = {
|
|
|
56
56
|
supportsConstraints: true,
|
|
57
57
|
supportsForeignKeys: true,
|
|
58
58
|
supportsCheckConstraints: true,
|
|
59
|
-
supportsDeferredConstraints: false
|
|
59
|
+
supportsDeferredConstraints: false,
|
|
60
60
|
});
|
|
61
61
|
mockFactory.isDialectSupported.mockReturnValue(true);
|
|
62
62
|
coordinator = schema_discovery_coordinator_js_1.SchemaDiscoveryCoordinator.getInstance();
|
|
@@ -79,7 +79,7 @@ const mockSQLiteCoordinator = {
|
|
|
79
79
|
views: [],
|
|
80
80
|
indexes: [],
|
|
81
81
|
constraints: [],
|
|
82
|
-
relationships: []
|
|
82
|
+
relationships: [],
|
|
83
83
|
};
|
|
84
84
|
mockSQLiteCoordinator.discoverSchema.mockResolvedValue(mockSchemaInfo);
|
|
85
85
|
const result = await coordinator.discoverSchema(mockKysely, {}, 'sqlite');
|
|
@@ -113,7 +113,7 @@ const mockSQLiteCoordinator = {
|
|
|
113
113
|
supportsConstraints: true,
|
|
114
114
|
supportsForeignKeys: true,
|
|
115
115
|
supportsCheckConstraints: true,
|
|
116
|
-
supportsDeferredConstraints: false
|
|
116
|
+
supportsDeferredConstraints: false,
|
|
117
117
|
});
|
|
118
118
|
});
|
|
119
119
|
});
|
|
@@ -122,14 +122,14 @@ const mockSQLiteCoordinator = {
|
|
|
122
122
|
const config = {
|
|
123
123
|
excludeTables: ['migrations'],
|
|
124
124
|
includeViews: true,
|
|
125
|
-
customTypeMappings: {
|
|
125
|
+
customTypeMappings: { jsonb: 'Record<string, any>' },
|
|
126
126
|
};
|
|
127
127
|
const mockSchemaInfo = {
|
|
128
128
|
tables: [],
|
|
129
129
|
views: [],
|
|
130
130
|
indexes: [],
|
|
131
131
|
constraints: [],
|
|
132
|
-
relationships: []
|
|
132
|
+
relationships: [],
|
|
133
133
|
};
|
|
134
134
|
mockSQLiteCoordinator.discoverSchema.mockResolvedValue(mockSchemaInfo);
|
|
135
135
|
await coordinator.discoverSchema(mockKysely, config, 'sqlite');
|
|
@@ -8,52 +8,52 @@ describe('Schema Strategy - Basic Tests', () => {
|
|
|
8
8
|
test('should verify DiscoveryFactory exists', () => {
|
|
9
9
|
// Test that we can import the DiscoveryFactory
|
|
10
10
|
expect(() => {
|
|
11
|
-
const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
|
|
11
|
+
const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
|
|
12
12
|
return DiscoveryFactory;
|
|
13
13
|
}).not.toThrow();
|
|
14
14
|
});
|
|
15
15
|
test('should verify SchemaDiscoveryCoordinator exists', () => {
|
|
16
16
|
// Test that we can import the SchemaDiscoveryCoordinator
|
|
17
17
|
expect(() => {
|
|
18
|
-
const { SchemaDiscoveryCoordinator } = require('../core/coordinators/schema-discovery.coordinator.js');
|
|
18
|
+
const { SchemaDiscoveryCoordinator, } = require('../core/coordinators/schema-discovery.coordinator.js');
|
|
19
19
|
return SchemaDiscoveryCoordinator;
|
|
20
20
|
}).not.toThrow();
|
|
21
21
|
});
|
|
22
22
|
test('should verify SQLite coordinator exists', () => {
|
|
23
23
|
// Test that we can import the SQLite coordinator
|
|
24
24
|
expect(() => {
|
|
25
|
-
const { SQLiteDiscoveryCoordinator } = require('../dialects/sqlite/sqlite-discovery.coordinator.js');
|
|
25
|
+
const { SQLiteDiscoveryCoordinator, } = require('../dialects/sqlite/sqlite-discovery.coordinator.js');
|
|
26
26
|
return SQLiteDiscoveryCoordinator;
|
|
27
27
|
}).not.toThrow();
|
|
28
28
|
});
|
|
29
29
|
test('should verify singleton pattern works for DiscoveryFactory', () => {
|
|
30
|
-
const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
|
|
30
|
+
const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
|
|
31
31
|
const instance1 = DiscoveryFactory.getInstance();
|
|
32
32
|
const instance2 = DiscoveryFactory.getInstance();
|
|
33
33
|
expect(instance1).toBe(instance2);
|
|
34
34
|
});
|
|
35
35
|
test('should verify singleton pattern works for SchemaDiscoveryCoordinator', () => {
|
|
36
|
-
const { SchemaDiscoveryCoordinator } = require('../core/coordinators/schema-discovery.coordinator.js');
|
|
36
|
+
const { SchemaDiscoveryCoordinator, } = require('../core/coordinators/schema-discovery.coordinator.js');
|
|
37
37
|
const instance1 = SchemaDiscoveryCoordinator.getInstance();
|
|
38
38
|
const instance2 = SchemaDiscoveryCoordinator.getInstance();
|
|
39
39
|
expect(instance1).toBe(instance2);
|
|
40
40
|
});
|
|
41
41
|
test('should verify dialect support', () => {
|
|
42
|
-
const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
|
|
42
|
+
const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
|
|
43
43
|
const factory = DiscoveryFactory.getInstance();
|
|
44
44
|
expect(factory.isDialectSupported('postgresql')).toBe(true);
|
|
45
45
|
expect(factory.isDialectSupported('sqlite')).toBe(true);
|
|
46
46
|
expect(factory.isDialectSupported('mysql')).toBe(false);
|
|
47
47
|
});
|
|
48
48
|
test('should verify error handling for unsupported dialects', () => {
|
|
49
|
-
const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
|
|
49
|
+
const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
|
|
50
50
|
const factory = DiscoveryFactory.getInstance();
|
|
51
51
|
expect(() => {
|
|
52
52
|
factory.createIndexDiscovery('oracle');
|
|
53
53
|
}).toThrow('Unsupported dialect');
|
|
54
54
|
});
|
|
55
55
|
test('should verify PostgreSQL capabilities', () => {
|
|
56
|
-
const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
|
|
56
|
+
const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
|
|
57
57
|
const factory = DiscoveryFactory.getInstance();
|
|
58
58
|
const capabilities = factory.getDialectCapabilities('postgresql');
|
|
59
59
|
expect(capabilities.supportsViews).toBe(true);
|
|
@@ -64,7 +64,7 @@ describe('Schema Strategy - Basic Tests', () => {
|
|
|
64
64
|
expect(capabilities.supportsDeferredConstraints).toBe(true);
|
|
65
65
|
});
|
|
66
66
|
test('should verify SQLite capabilities', () => {
|
|
67
|
-
const { DiscoveryFactory } = require('../core/factories/discovery-factory.js');
|
|
67
|
+
const { DiscoveryFactory, } = require('../core/factories/discovery-factory.js');
|
|
68
68
|
const factory = DiscoveryFactory.getInstance();
|
|
69
69
|
const capabilities = factory.getDialectCapabilities('sqlite');
|
|
70
70
|
expect(capabilities.supportsViews).toBe(true);
|
|
@@ -11,15 +11,15 @@ const sqlite_constraint_discovery_js_1 = require("../dialects/sqlite/discovery/s
|
|
|
11
11
|
const mockKysely = {
|
|
12
12
|
selectFrom: jest.fn(),
|
|
13
13
|
select: jest.fn(),
|
|
14
|
-
execute: jest.fn()
|
|
14
|
+
execute: jest.fn(),
|
|
15
15
|
};
|
|
16
16
|
// Mock DatabaseIntrospector
|
|
17
17
|
jest.mock('../../dialect/database-introspector.js', () => ({
|
|
18
18
|
DatabaseIntrospector: jest.fn().mockImplementation(() => ({
|
|
19
19
|
getTables: jest.fn(),
|
|
20
20
|
getTableMetadata: jest.fn(),
|
|
21
|
-
getViews: jest.fn()
|
|
22
|
-
}))
|
|
21
|
+
getViews: jest.fn(),
|
|
22
|
+
})),
|
|
23
23
|
}));
|
|
24
24
|
const mockTableData = [
|
|
25
25
|
{
|
|
@@ -27,19 +27,19 @@ const mockTableData = [
|
|
|
27
27
|
columns: [
|
|
28
28
|
{ name: 'id', type: 'INTEGER', isPrimaryKey: true, isNullable: false },
|
|
29
29
|
{ name: 'email', type: 'TEXT', isNullable: false },
|
|
30
|
-
{ name: 'created_at', type: 'DATETIME', isNullable: false }
|
|
30
|
+
{ name: 'created_at', type: 'DATETIME', isNullable: false },
|
|
31
31
|
],
|
|
32
|
-
primaryKey: ['id']
|
|
32
|
+
primaryKey: ['id'],
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
name: 'posts',
|
|
36
36
|
columns: [
|
|
37
37
|
{ name: 'id', type: 'INTEGER', isPrimaryKey: true, isNullable: false },
|
|
38
38
|
{ name: 'user_id', type: 'INTEGER', isNullable: false },
|
|
39
|
-
{ name: 'title', type: 'TEXT', isNullable: false }
|
|
39
|
+
{ name: 'title', type: 'TEXT', isNullable: false },
|
|
40
40
|
],
|
|
41
|
-
primaryKey: ['id']
|
|
42
|
-
}
|
|
41
|
+
primaryKey: ['id'],
|
|
42
|
+
},
|
|
43
43
|
];
|
|
44
44
|
const mockIndexData = [
|
|
45
45
|
{
|
|
@@ -47,23 +47,23 @@ const mockIndexData = [
|
|
|
47
47
|
columns: ['email'],
|
|
48
48
|
unique: true,
|
|
49
49
|
isPrimary: false,
|
|
50
|
-
definition: 'CREATE UNIQUE INDEX users_email_idx ON users(email)'
|
|
50
|
+
definition: 'CREATE UNIQUE INDEX users_email_idx ON users(email)',
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
name: 'posts_user_id_idx',
|
|
54
54
|
columns: ['user_id'],
|
|
55
55
|
unique: false,
|
|
56
56
|
isPrimary: false,
|
|
57
|
-
definition: 'CREATE INDEX posts_user_id_idx ON posts(user_id)'
|
|
58
|
-
}
|
|
57
|
+
definition: 'CREATE INDEX posts_user_id_idx ON posts(user_id)',
|
|
58
|
+
},
|
|
59
59
|
];
|
|
60
60
|
const mockConstraintData = [
|
|
61
61
|
{
|
|
62
62
|
name: 'users_email_check',
|
|
63
63
|
type: 'CHECK',
|
|
64
64
|
definition: "email LIKE '%@%'",
|
|
65
|
-
valid: true
|
|
66
|
-
}
|
|
65
|
+
valid: true,
|
|
66
|
+
},
|
|
67
67
|
];
|
|
68
68
|
const mockForeignKeyData = [
|
|
69
69
|
{
|
|
@@ -72,8 +72,8 @@ const mockForeignKeyData = [
|
|
|
72
72
|
referencedTable: 'users',
|
|
73
73
|
referencedColumn: 'id',
|
|
74
74
|
onDelete: 'CASCADE',
|
|
75
|
-
onUpdate: 'NO ACTION'
|
|
76
|
-
}
|
|
75
|
+
onUpdate: 'NO ACTION',
|
|
76
|
+
},
|
|
77
77
|
];
|
|
78
78
|
const mockViewData = [
|
|
79
79
|
{
|
|
@@ -81,9 +81,9 @@ const mockViewData = [
|
|
|
81
81
|
definition: 'SELECT u.email, p.title FROM users u JOIN posts p ON u.id = p.user_id',
|
|
82
82
|
columns: [
|
|
83
83
|
{ name: 'email', type: 'TEXT' },
|
|
84
|
-
{ name: 'title', type: 'TEXT' }
|
|
85
|
-
]
|
|
86
|
-
}
|
|
84
|
+
{ name: 'title', type: 'TEXT' },
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
87
|
];
|
|
88
88
|
const mockRelationshipData = [
|
|
89
89
|
{
|
|
@@ -91,13 +91,13 @@ const mockRelationshipData = [
|
|
|
91
91
|
fromColumn: 'user_id',
|
|
92
92
|
toTable: 'users',
|
|
93
93
|
toColumn: 'id',
|
|
94
|
-
type: 'many-to-one'
|
|
95
|
-
}
|
|
94
|
+
type: 'many-to-one',
|
|
95
|
+
},
|
|
96
96
|
];
|
|
97
97
|
const mockTableSize = {
|
|
98
98
|
pages: 10,
|
|
99
99
|
size: 40960,
|
|
100
|
-
estimatedRows: 100
|
|
100
|
+
estimatedRows: 100,
|
|
101
101
|
};
|
|
102
102
|
(0, globals_1.describe)('SQLiteDiscoveryCoordinator', () => {
|
|
103
103
|
let coordinator;
|
|
@@ -112,35 +112,45 @@ const mockTableSize = {
|
|
|
112
112
|
sqlite_discovery_coordinator_js_1.SQLiteDiscoveryCoordinator.instance = undefined;
|
|
113
113
|
// Create mocks
|
|
114
114
|
mockTableDiscovery = {
|
|
115
|
-
discoverTables: jest.fn().mockResolvedValue(mockTableData)
|
|
115
|
+
discoverTables: jest.fn().mockResolvedValue(mockTableData),
|
|
116
116
|
};
|
|
117
117
|
mockRelationshipDiscovery = {
|
|
118
|
-
discoverRelationships: jest.fn().mockResolvedValue(mockRelationshipData)
|
|
118
|
+
discoverRelationships: jest.fn().mockResolvedValue(mockRelationshipData),
|
|
119
119
|
};
|
|
120
120
|
mockViewDiscovery = {
|
|
121
|
-
discoverViews: jest.fn().mockResolvedValue(mockViewData)
|
|
121
|
+
discoverViews: jest.fn().mockResolvedValue(mockViewData),
|
|
122
122
|
};
|
|
123
123
|
mockIndexDiscovery = {
|
|
124
124
|
discoverTableIndexes: jest.fn().mockResolvedValue(mockIndexData),
|
|
125
125
|
getTableSize: jest.fn().mockResolvedValue(mockTableSize),
|
|
126
126
|
analyzeIndexEfficiency: jest.fn().mockReturnValue({
|
|
127
|
-
recommendations: [
|
|
128
|
-
|
|
127
|
+
recommendations: [
|
|
128
|
+
'Consider using covering indexes for better performance',
|
|
129
|
+
],
|
|
130
|
+
}),
|
|
129
131
|
};
|
|
130
132
|
mockConstraintDiscovery = {
|
|
131
133
|
isForeignKeySupportEnabled: jest.fn().mockResolvedValue(true),
|
|
132
134
|
discoverTableConstraints: jest.fn().mockResolvedValue(mockConstraintData),
|
|
133
135
|
getForeignKeyInfo: jest.fn().mockResolvedValue(mockForeignKeyData),
|
|
134
136
|
analyzeConstraintCompatibility: jest.fn().mockReturnValue({
|
|
135
|
-
recommendations: ['Consider optimizing constraint definitions']
|
|
136
|
-
})
|
|
137
|
+
recommendations: ['Consider optimizing constraint definitions'],
|
|
138
|
+
}),
|
|
137
139
|
};
|
|
138
140
|
// Mock static methods
|
|
139
|
-
jest
|
|
140
|
-
|
|
141
|
+
jest
|
|
142
|
+
.spyOn(table_metadata_discovery_js_1.TableMetadataDiscovery, 'getInstance')
|
|
143
|
+
.mockReturnValue(mockTableDiscovery);
|
|
144
|
+
jest
|
|
145
|
+
.spyOn(relationship_discovery_js_1.RelationshipDiscovery, 'getInstance')
|
|
146
|
+
.mockReturnValue(mockRelationshipDiscovery);
|
|
141
147
|
jest.spyOn(view_discovery_js_1.ViewDiscovery, 'getInstance').mockReturnValue(mockViewDiscovery);
|
|
142
|
-
jest
|
|
143
|
-
|
|
148
|
+
jest
|
|
149
|
+
.spyOn(sqlite_index_discovery_js_1.SQLiteIndexDiscovery, 'getInstance')
|
|
150
|
+
.mockReturnValue(mockIndexDiscovery);
|
|
151
|
+
jest
|
|
152
|
+
.spyOn(sqlite_constraint_discovery_js_1.SQLiteConstraintDiscovery, 'getInstance')
|
|
153
|
+
.mockReturnValue(mockConstraintDiscovery);
|
|
144
154
|
coordinator = sqlite_discovery_coordinator_js_1.SQLiteDiscoveryCoordinator.getInstance();
|
|
145
155
|
});
|
|
146
156
|
(0, globals_1.afterEach)(() => {
|
|
@@ -190,8 +200,8 @@ const mockTableSize = {
|
|
|
190
200
|
name: 'users_email_idx',
|
|
191
201
|
columns: ['email'],
|
|
192
202
|
unique: true,
|
|
193
|
-
definition: 'CREATE UNIQUE INDEX users_email_idx ON users(email)'
|
|
194
|
-
})
|
|
203
|
+
definition: 'CREATE UNIQUE INDEX users_email_idx ON users(email)',
|
|
204
|
+
}),
|
|
195
205
|
]),
|
|
196
206
|
constraints: mockConstraintData,
|
|
197
207
|
foreignKeys: globals_1.expect.arrayContaining([
|
|
@@ -200,10 +210,10 @@ const mockTableSize = {
|
|
|
200
210
|
column: 'user_id',
|
|
201
211
|
referencedTable: 'users',
|
|
202
212
|
referencedColumn: 'id',
|
|
203
|
-
onDelete: 'CASCADE'
|
|
204
|
-
})
|
|
213
|
+
onDelete: 'CASCADE',
|
|
214
|
+
}),
|
|
205
215
|
]),
|
|
206
|
-
tableSize: mockTableSize
|
|
216
|
+
tableSize: mockTableSize,
|
|
207
217
|
});
|
|
208
218
|
});
|
|
209
219
|
(0, globals_1.it)('should skip views when includeViews is false', async () => {
|
|
@@ -219,7 +229,7 @@ const mockTableSize = {
|
|
|
219
229
|
name: 'users',
|
|
220
230
|
indexes: [],
|
|
221
231
|
foreignKeys: [],
|
|
222
|
-
tableSize: undefined
|
|
232
|
+
tableSize: undefined,
|
|
223
233
|
});
|
|
224
234
|
});
|
|
225
235
|
(0, globals_1.it)('should handle constraint discovery errors gracefully', async () => {
|
|
@@ -249,7 +259,7 @@ const mockTableSize = {
|
|
|
249
259
|
supportsAutoIncrement: true,
|
|
250
260
|
supportsRowId: true,
|
|
251
261
|
supportsTriggers: true,
|
|
252
|
-
supportsFullTextSearch: true
|
|
262
|
+
supportsFullTextSearch: true,
|
|
253
263
|
});
|
|
254
264
|
});
|
|
255
265
|
});
|
|
@@ -258,7 +268,7 @@ const mockTableSize = {
|
|
|
258
268
|
mockConstraintDiscovery.isForeignKeySupportEnabled.mockResolvedValue(false);
|
|
259
269
|
const tables = [
|
|
260
270
|
{ name: 'users', primaryKey: ['id'], indexes: [], foreignKeys: [] },
|
|
261
|
-
{ name: 'posts', primaryKey: ['id'], indexes: [], foreignKeys: [] }
|
|
271
|
+
{ name: 'posts', primaryKey: ['id'], indexes: [], foreignKeys: [] },
|
|
262
272
|
];
|
|
263
273
|
const recommendations = await coordinator.getRecommendations(mockKysely, tables);
|
|
264
274
|
(0, globals_1.expect)(mockConstraintDiscovery.isForeignKeySupportEnabled).toHaveBeenCalled();
|
|
@@ -272,14 +282,16 @@ const mockTableSize = {
|
|
|
272
282
|
});
|
|
273
283
|
(0, globals_1.it)('should recommend enabling foreign keys when disabled', async () => {
|
|
274
284
|
mockConstraintDiscovery.isForeignKeySupportEnabled.mockResolvedValue(false);
|
|
275
|
-
const tables = [
|
|
285
|
+
const tables = [
|
|
286
|
+
{ name: 'users', primaryKey: ['id'], indexes: [], foreignKeys: [] },
|
|
287
|
+
];
|
|
276
288
|
const recommendations = await coordinator.getRecommendations(mockKysely, tables);
|
|
277
289
|
(0, globals_1.expect)(recommendations).toContain('Consider enabling foreign key support with PRAGMA foreign_keys = ON for better data integrity');
|
|
278
290
|
});
|
|
279
291
|
(0, globals_1.it)('should recommend primary key for tables without one', async () => {
|
|
280
292
|
const tables = [
|
|
281
293
|
{ name: 'users', primaryKey: [], indexes: [], foreignKeys: [] },
|
|
282
|
-
{ name: 'posts', primaryKey: ['id'], indexes: [], foreignKeys: [] }
|
|
294
|
+
{ name: 'posts', primaryKey: ['id'], indexes: [], foreignKeys: [] },
|
|
283
295
|
];
|
|
284
296
|
const recommendations = await coordinator.getRecommendations(mockKysely, tables);
|
|
285
297
|
(0, globals_1.expect)(recommendations).toContain('Table users should have a primary key for better performance');
|
|
@@ -287,9 +299,13 @@ const mockTableSize = {
|
|
|
287
299
|
(0, globals_1.it)('should handle recommendation errors gracefully', async () => {
|
|
288
300
|
mockConstraintDiscovery.isForeignKeySupportEnabled.mockResolvedValue(false);
|
|
289
301
|
mockIndexDiscovery.discoverTableIndexes.mockRejectedValue(new Error('Index analysis failed'));
|
|
290
|
-
const tables = [
|
|
302
|
+
const tables = [
|
|
303
|
+
{ name: 'users', primaryKey: ['id'], indexes: [], foreignKeys: [] },
|
|
304
|
+
];
|
|
291
305
|
const recommendations = await coordinator.getRecommendations(mockKysely, tables);
|
|
292
|
-
(0, globals_1.expect)(recommendations).toEqual([
|
|
306
|
+
(0, globals_1.expect)(recommendations).toEqual([
|
|
307
|
+
'Consider enabling foreign key support with PRAGMA foreign_keys = ON for better data integrity',
|
|
308
|
+
]);
|
|
293
309
|
});
|
|
294
310
|
(0, globals_1.it)('should handle empty tables array', async () => {
|
|
295
311
|
const recommendations = await coordinator.getRecommendations(mockKysely, []);
|
|
@@ -305,7 +321,7 @@ const mockTableSize = {
|
|
|
305
321
|
'Use WAL mode for better concurrency: PRAGMA journal_mode = WAL',
|
|
306
322
|
'Set appropriate cache size: PRAGMA cache_size = -64000',
|
|
307
323
|
'Enable query optimization: PRAGMA optimize',
|
|
308
|
-
'Consider using prepared statements for better performance'
|
|
324
|
+
'Consider using prepared statements for better performance',
|
|
309
325
|
]);
|
|
310
326
|
});
|
|
311
327
|
});
|
|
@@ -351,14 +367,14 @@ const mockTableSize = {
|
|
|
351
367
|
const config = {
|
|
352
368
|
excludeTables: ['temp_*'],
|
|
353
369
|
includeViews: true,
|
|
354
|
-
customTypeMappings: {
|
|
370
|
+
customTypeMappings: { INTEGER: 'number' },
|
|
355
371
|
};
|
|
356
372
|
await coordinator.discoverSchema(mockKysely, config);
|
|
357
373
|
(0, globals_1.expect)(mockTableDiscovery.discoverTables).toHaveBeenCalledWith(globals_1.expect.any(Object), // DatabaseIntrospector
|
|
358
374
|
{
|
|
359
375
|
excludeTables: ['temp_*'],
|
|
360
376
|
includeViews: true,
|
|
361
|
-
customTypeMappings: {
|
|
377
|
+
customTypeMappings: { INTEGER: 'number' },
|
|
362
378
|
});
|
|
363
379
|
});
|
|
364
380
|
(0, globals_1.it)('should use default configuration when none provided', async () => {
|
|
@@ -366,7 +382,7 @@ const mockTableSize = {
|
|
|
366
382
|
(0, globals_1.expect)(mockTableDiscovery.discoverTables).toHaveBeenCalledWith(globals_1.expect.any(Object), {
|
|
367
383
|
excludeTables: undefined,
|
|
368
384
|
includeViews: undefined,
|
|
369
|
-
customTypeMappings: undefined
|
|
385
|
+
customTypeMappings: undefined,
|
|
370
386
|
});
|
|
371
387
|
});
|
|
372
388
|
});
|
|
@@ -77,7 +77,7 @@ exports.default = {
|
|
|
77
77
|
'sqlite-discovery-coordinator.test.ts',
|
|
78
78
|
'dialect-capabilities.test.ts',
|
|
79
79
|
'error-handling.test.ts',
|
|
80
|
-
'integration.test.ts'
|
|
80
|
+
'integration.test.ts',
|
|
81
81
|
],
|
|
82
82
|
coverage: {
|
|
83
83
|
factory: '100%',
|
|
@@ -85,6 +85,6 @@ exports.default = {
|
|
|
85
85
|
sqlite: '100%',
|
|
86
86
|
capabilities: '100%',
|
|
87
87
|
errorHandling: '100%',
|
|
88
|
-
integration: '100%'
|
|
89
|
-
}
|
|
88
|
+
integration: '100%',
|
|
89
|
+
},
|
|
90
90
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { SQLiteMigrationManager } from './sqlite-migration-manager.js';
|
|
2
2
|
export { SQLiteMigrationProvider } from './sqlite-migration-provider.js';
|
|
3
|
-
export type { SQLiteMigrationConfig, SQLiteMigrationResult, SQLiteMigrationPlan } from './sqlite-migration-manager.js';
|
|
4
|
-
export type { SQLiteMigrationFile, SQLiteMigrationProviderConfig } from './sqlite-migration-provider.js';
|
|
3
|
+
export type { SQLiteMigrationConfig, SQLiteMigrationResult, SQLiteMigrationPlan, } from './sqlite-migration-manager.js';
|
|
4
|
+
export type { SQLiteMigrationFile, SQLiteMigrationProviderConfig, } from './sqlite-migration-provider.js';
|
|
5
5
|
export declare function createSQLiteMigrationManager(db: any, config?: Partial<import('./sqlite-migration-manager.js').SQLiteMigrationConfig>, logger?: import('../logging/logger.js').Logger): Promise<import('./sqlite-migration-manager.js').SQLiteMigrationManager>;
|
|
6
6
|
export declare function createSQLiteMigrationProvider(config?: Partial<import('./sqlite-migration-provider.js').SQLiteMigrationProviderConfig>, logger?: import('../logging/logger.js').Logger): Promise<import('./sqlite-migration-provider.js').SQLiteMigrationProvider>;
|
|
@@ -66,12 +66,12 @@ class SQLiteMigrationManager {
|
|
|
66
66
|
migrationDirectory: './migrations',
|
|
67
67
|
backupBeforeMigration: true,
|
|
68
68
|
dryRun: false,
|
|
69
|
-
...config
|
|
69
|
+
...config,
|
|
70
70
|
};
|
|
71
71
|
this.optimizer = sqlite_auto_optimizer_js_1.SQLiteAutoOptimizer.getInstance(logger);
|
|
72
72
|
this.indexer = sqlite_auto_indexer_js_1.SQLiteAutoIndexer.getInstance(logger);
|
|
73
73
|
this.provider = sqlite_migration_provider_js_1.SQLiteMigrationProvider.getInstance({
|
|
74
|
-
migrationDirectory: this.config.migrationDirectory
|
|
74
|
+
migrationDirectory: this.config.migrationDirectory,
|
|
75
75
|
}, logger);
|
|
76
76
|
}
|
|
77
77
|
static getInstance(db, config, logger) {
|
|
@@ -143,7 +143,7 @@ class SQLiteMigrationManager {
|
|
|
143
143
|
journalMode: 'WAL',
|
|
144
144
|
synchronous: 'NORMAL',
|
|
145
145
|
cacheSize: -64000, // 64MB
|
|
146
|
-
tempStore: 'MEMORY'
|
|
146
|
+
tempStore: 'MEMORY',
|
|
147
147
|
});
|
|
148
148
|
this.logger.info(`✅ Applied ${optimizations.appliedOptimizations.length} optimizations`);
|
|
149
149
|
if (optimizations.warnings.length > 0) {
|
|
@@ -169,14 +169,14 @@ class SQLiteMigrationManager {
|
|
|
169
169
|
const indexRecs = await this.indexer.analyzeAndRecommend(this.db, {
|
|
170
170
|
minFrequency: 3,
|
|
171
171
|
slowQueryThreshold: 1000,
|
|
172
|
-
maxRecommendations: 10
|
|
172
|
+
maxRecommendations: 10,
|
|
173
173
|
});
|
|
174
174
|
const plan = {
|
|
175
175
|
migrations: pendingMigrations,
|
|
176
176
|
optimizations: optimizationRecs.recommendations || [],
|
|
177
|
-
indexRecommendations: indexRecs.recommendations.map(r => r.sql),
|
|
177
|
+
indexRecommendations: indexRecs.recommendations.map((r) => r.sql),
|
|
178
178
|
estimatedImpact: this.calculateImpact(pendingMigrations.length, optimizationRecs.recommendations?.length || 0),
|
|
179
|
-
dryRun: this.config.dryRun
|
|
179
|
+
dryRun: this.config.dryRun,
|
|
180
180
|
};
|
|
181
181
|
this.logger.info(`📊 Migration plan: ${plan.migrations.length} migrations, ${plan.optimizations.length} optimizations, ${plan.indexRecommendations.length} index recommendations`);
|
|
182
182
|
return plan;
|
|
@@ -203,7 +203,7 @@ class SQLiteMigrationManager {
|
|
|
203
203
|
indexRecommendations: [],
|
|
204
204
|
performanceImpact: 'low',
|
|
205
205
|
duration: Date.now() - startTime,
|
|
206
|
-
warnings: []
|
|
206
|
+
warnings: [],
|
|
207
207
|
};
|
|
208
208
|
}
|
|
209
209
|
const result = {
|
|
@@ -213,7 +213,7 @@ class SQLiteMigrationManager {
|
|
|
213
213
|
indexRecommendations: [],
|
|
214
214
|
performanceImpact: 'low',
|
|
215
215
|
duration: 0,
|
|
216
|
-
warnings: []
|
|
216
|
+
warnings: [],
|
|
217
217
|
};
|
|
218
218
|
// Execute migrations in transaction
|
|
219
219
|
await this.db.transaction().execute(async (trx) => {
|
|
@@ -222,7 +222,8 @@ class SQLiteMigrationManager {
|
|
|
222
222
|
result.migrationsApplied++;
|
|
223
223
|
}
|
|
224
224
|
// Apply optimizations after migrations
|
|
225
|
-
if (this.config.enableAutoOptimization &&
|
|
225
|
+
if (this.config.enableAutoOptimization &&
|
|
226
|
+
plan.optimizations.length > 0) {
|
|
226
227
|
const optimizationResult = await this.optimizer.optimizeDatabase(trx, {
|
|
227
228
|
enableAutoPragma: true,
|
|
228
229
|
enableAutoIndexing: false,
|
|
@@ -233,7 +234,7 @@ class SQLiteMigrationManager {
|
|
|
233
234
|
journalMode: 'WAL',
|
|
234
235
|
synchronous: 'NORMAL',
|
|
235
236
|
cacheSize: -64000,
|
|
236
|
-
tempStore: 'MEMORY'
|
|
237
|
+
tempStore: 'MEMORY',
|
|
237
238
|
});
|
|
238
239
|
result.optimizationsApplied = optimizationResult.appliedOptimizations;
|
|
239
240
|
result.warnings.push(...optimizationResult.warnings);
|
|
@@ -259,7 +260,7 @@ class SQLiteMigrationManager {
|
|
|
259
260
|
indexRecommendations: [],
|
|
260
261
|
performanceImpact: 'low',
|
|
261
262
|
duration,
|
|
262
|
-
warnings: [error instanceof Error ? error.message : 'Unknown error']
|
|
263
|
+
warnings: [error instanceof Error ? error.message : 'Unknown error'],
|
|
263
264
|
};
|
|
264
265
|
}
|
|
265
266
|
}
|
|
@@ -283,7 +284,7 @@ class SQLiteMigrationManager {
|
|
|
283
284
|
applied_at: new Date(),
|
|
284
285
|
checksum: migration.checksum,
|
|
285
286
|
optimization_applied: true,
|
|
286
|
-
performance_impact: 'medium'
|
|
287
|
+
performance_impact: 'medium',
|
|
287
288
|
})
|
|
288
289
|
.execute();
|
|
289
290
|
this.logger.info(`✅ Migration ${migrationName} applied successfully`);
|
|
@@ -304,17 +305,20 @@ class SQLiteMigrationManager {
|
|
|
304
305
|
.selectFrom('sqlite_migrations')
|
|
305
306
|
.select('name')
|
|
306
307
|
.execute();
|
|
307
|
-
const appliedNames = new Set(appliedMigrations.map(m => m.name));
|
|
308
|
+
const appliedNames = new Set(appliedMigrations.map((m) => m.name));
|
|
308
309
|
// Filter out applied migrations
|
|
309
310
|
return availableMigrations
|
|
310
|
-
.filter(m => !appliedNames.has(m.name))
|
|
311
|
-
.map(m => m.name);
|
|
311
|
+
.filter((m) => !appliedNames.has(m.name))
|
|
312
|
+
.map((m) => m.name);
|
|
312
313
|
}
|
|
313
314
|
/**
|
|
314
315
|
* Generate a new migration file
|
|
315
316
|
*/
|
|
316
317
|
async generateMigration(description, operation = 'create_table', options = {}) {
|
|
317
|
-
const timestamp = new Date()
|
|
318
|
+
const timestamp = new Date()
|
|
319
|
+
.toISOString()
|
|
320
|
+
.replace(/[-:T]/g, '')
|
|
321
|
+
.slice(0, 14);
|
|
318
322
|
const fileName = `${timestamp}_${description.toLowerCase().replace(/\s+/g, '_')}.sql`;
|
|
319
323
|
const filePath = path.join(this.config.migrationDirectory, fileName);
|
|
320
324
|
const content = this.provider.generateOptimizedMigration(operation, options.tableName || 'new_table', options);
|
|
@@ -376,7 +380,7 @@ class SQLiteMigrationManager {
|
|
|
376
380
|
pendingMigrations: pending.length,
|
|
377
381
|
lastMigration: migrations[0]?.name,
|
|
378
382
|
lastAppliedAt: migrations[0]?.applied_at,
|
|
379
|
-
appliedList: migrations
|
|
383
|
+
appliedList: migrations,
|
|
380
384
|
};
|
|
381
385
|
}
|
|
382
386
|
/**
|