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
|
@@ -27,7 +27,9 @@ async function migrateTableData(sourceDb, targetDb, sourceTable, targetTable, so
|
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
29
|
// Keyset pagination optimization: find a numeric primary key
|
|
30
|
-
const pkColumn = sourceTable.columns.find(c => c.primaryKey &&
|
|
30
|
+
const pkColumn = sourceTable.columns.find((c) => c.primaryKey &&
|
|
31
|
+
(c.type.toLowerCase().includes('int') ||
|
|
32
|
+
c.type.toLowerCase().includes('serial')))?.name;
|
|
31
33
|
let lastId = null;
|
|
32
34
|
// Calculate number of batches (approximate)
|
|
33
35
|
const batchCount = Math.ceil(totalRows / options.batchSize);
|
|
@@ -108,7 +110,7 @@ function transformRows(rows, sourceTable, targetTable, sourceDialect, targetDial
|
|
|
108
110
|
// Build transformation map
|
|
109
111
|
const transformations = new Map();
|
|
110
112
|
for (const sourceColumn of sourceTable.columns) {
|
|
111
|
-
const targetColumn = targetTable.columns.find(c => c.name === sourceColumn.name);
|
|
113
|
+
const targetColumn = targetTable.columns.find((c) => c.name === sourceColumn.name);
|
|
112
114
|
if (targetColumn) {
|
|
113
115
|
const transform = (0, type_mapper_js_1.getValueTransformation)(sourceColumn.type, targetColumn.type, sourceDialect, targetDialect);
|
|
114
116
|
if (transform) {
|
|
@@ -117,7 +119,7 @@ function transformRows(rows, sourceTable, targetTable, sourceDialect, targetDial
|
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
// Transform rows
|
|
120
|
-
return rows.map(row => {
|
|
122
|
+
return rows.map((row) => {
|
|
121
123
|
const transformedRow = {};
|
|
122
124
|
for (const [columnName, value] of Object.entries(row)) {
|
|
123
125
|
const transform = transformations.get(columnName);
|
|
@@ -134,10 +136,7 @@ async function insertBatch(db, tableName, rows) {
|
|
|
134
136
|
return;
|
|
135
137
|
}
|
|
136
138
|
// Use Kysely's batch insert
|
|
137
|
-
await db
|
|
138
|
-
.insertInto(tableName)
|
|
139
|
-
.values(rows)
|
|
140
|
-
.execute();
|
|
139
|
+
await db.insertInto(tableName).values(rows).execute();
|
|
141
140
|
}
|
|
142
141
|
/**
|
|
143
142
|
* Calculate estimated time remaining
|
|
@@ -155,16 +154,16 @@ function calculateETA(startTime, completed, total) {
|
|
|
155
154
|
* Migrate data for all tables in parallel
|
|
156
155
|
*/
|
|
157
156
|
async function migrateAllTablesData(sourceDb, targetDb, sourceTables, targetTables, sourceDialect, targetDialect, options) {
|
|
158
|
-
const targetTableMap = new Map(targetTables.map(t => [t.name, t]));
|
|
157
|
+
const targetTableMap = new Map(targetTables.map((t) => [t.name, t]));
|
|
159
158
|
const results = [];
|
|
160
159
|
// Filter tables that exist in both source and target
|
|
161
|
-
const tablesToMigrate = sourceTables.filter(st => targetTableMap.has(st.name));
|
|
160
|
+
const tablesToMigrate = sourceTables.filter((st) => targetTableMap.has(st.name));
|
|
162
161
|
if (options.parallel && options.parallelWorkers > 1) {
|
|
163
162
|
// Migrate tables in parallel batches
|
|
164
163
|
const workerCount = Math.min(options.parallelWorkers, tablesToMigrate.length);
|
|
165
164
|
const chunks = chunkArray(tablesToMigrate, workerCount);
|
|
166
165
|
for (const chunk of chunks) {
|
|
167
|
-
const chunkResults = await Promise.all(chunk.map(sourceTable => {
|
|
166
|
+
const chunkResults = await Promise.all(chunk.map((sourceTable) => {
|
|
168
167
|
const targetTable = targetTableMap.get(sourceTable.name);
|
|
169
168
|
return migrateTableData(sourceDb, targetDb, sourceTable, targetTable, sourceDialect, targetDialect, options);
|
|
170
169
|
}));
|
|
@@ -225,6 +224,8 @@ async function truncateTable(db, tableName, dialect) {
|
|
|
225
224
|
else {
|
|
226
225
|
await sql_js_1.sql.raw(`DELETE FROM "${tableName}"`).execute(db);
|
|
227
226
|
// Reset autoincrement counter in SQLite
|
|
228
|
-
await sql_js_1.sql
|
|
227
|
+
await sql_js_1.sql
|
|
228
|
+
.raw(`DELETE FROM sqlite_sequence WHERE name = '${tableName}'`)
|
|
229
|
+
.execute(db);
|
|
229
230
|
}
|
|
230
231
|
}
|
|
@@ -90,7 +90,7 @@ class DatabaseMigrationManager {
|
|
|
90
90
|
this.logger.info('\n✅ Step 4: Verifying migration...');
|
|
91
91
|
const verificationResult = await this.verifyMigration(filteredSourceSchema);
|
|
92
92
|
result.warnings.push(...verificationResult.warnings);
|
|
93
|
-
result.success = result.errors.filter(e => e.fatal).length === 0;
|
|
93
|
+
result.success = result.errors.filter((e) => e.fatal).length === 0;
|
|
94
94
|
result.duration = Date.now() - startTime;
|
|
95
95
|
this.logger.info('\n🎉 Migration completed!');
|
|
96
96
|
this.logger.info(` Duration: ${(result.duration / 1000).toFixed(2)}s`);
|
|
@@ -146,14 +146,14 @@ class DatabaseMigrationManager {
|
|
|
146
146
|
this.logger.info(` Generated ${sqlStatements.length} SQL statements`);
|
|
147
147
|
if (options.generateSQL) {
|
|
148
148
|
this.logger.info('\nSQL Statements:');
|
|
149
|
-
sqlStatements.forEach(stmt => this.logger.info(stmt));
|
|
149
|
+
sqlStatements.forEach((stmt) => this.logger.info(stmt));
|
|
150
150
|
}
|
|
151
151
|
if (options.apply) {
|
|
152
152
|
const result = await (0, schema_differ_js_1.applySchemaSyncronization)(this.targetDb, sqlStatements, options);
|
|
153
153
|
this.logger.info(` Applied ${result.appliedStatements} changes`);
|
|
154
154
|
if (result.errors.length > 0) {
|
|
155
155
|
this.logger.error(` Errors: ${result.errors.length}`);
|
|
156
|
-
result.errors.forEach(err => {
|
|
156
|
+
result.errors.forEach((err) => {
|
|
157
157
|
this.logger.error(` ${err.sql}`);
|
|
158
158
|
this.logger.error(` ${err.error.message}`);
|
|
159
159
|
});
|
|
@@ -199,11 +199,13 @@ class DatabaseMigrationManager {
|
|
|
199
199
|
*/
|
|
200
200
|
filterTables(tables) {
|
|
201
201
|
let filtered = tables;
|
|
202
|
-
if (this.config.options?.includeTables &&
|
|
203
|
-
|
|
202
|
+
if (this.config.options?.includeTables &&
|
|
203
|
+
this.config.options.includeTables.length > 0) {
|
|
204
|
+
filtered = filtered.filter((t) => this.config.options.includeTables.includes(t.name));
|
|
204
205
|
}
|
|
205
|
-
if (this.config.options?.excludeTables &&
|
|
206
|
-
|
|
206
|
+
if (this.config.options?.excludeTables &&
|
|
207
|
+
this.config.options.excludeTables.length > 0) {
|
|
208
|
+
filtered = filtered.filter((t) => !this.config.options.excludeTables.includes(t.name));
|
|
207
209
|
}
|
|
208
210
|
return filtered;
|
|
209
211
|
}
|
|
@@ -219,9 +221,11 @@ class DatabaseMigrationManager {
|
|
|
219
221
|
if (this.config.options?.dropTables) {
|
|
220
222
|
this.logger.info(' Dropping existing tables...');
|
|
221
223
|
for (const table of targetSchema) {
|
|
222
|
-
if (sourceSchema.find(t => t.name === table.name)) {
|
|
224
|
+
if (sourceSchema.find((t) => t.name === table.name)) {
|
|
223
225
|
try {
|
|
224
|
-
await sql_js_1.sql
|
|
226
|
+
await sql_js_1.sql
|
|
227
|
+
.raw(`DROP TABLE IF EXISTS "${table.name}" CASCADE`)
|
|
228
|
+
.execute(this.targetDb);
|
|
225
229
|
this.logger.info(` Dropped: ${table.name}`);
|
|
226
230
|
}
|
|
227
231
|
catch (error) {
|
|
@@ -233,7 +237,7 @@ class DatabaseMigrationManager {
|
|
|
233
237
|
// Create tables
|
|
234
238
|
for (const sourceTable of sourceSchema) {
|
|
235
239
|
try {
|
|
236
|
-
const targetTable = targetSchema.find(t => t.name === sourceTable.name);
|
|
240
|
+
const targetTable = targetSchema.find((t) => t.name === sourceTable.name);
|
|
237
241
|
if (!targetTable || this.config.options?.dropTables) {
|
|
238
242
|
// Create table
|
|
239
243
|
await this.createTable(sourceTable);
|
|
@@ -292,8 +296,8 @@ class DatabaseMigrationManager {
|
|
|
292
296
|
createSQL += columnDefs.join(',\n');
|
|
293
297
|
// Add foreign keys
|
|
294
298
|
for (const fk of sourceTable.foreignKeys) {
|
|
295
|
-
const fkCols = fk.columns.map(c => `"${c}"`).join(', ');
|
|
296
|
-
const refCols = fk.referencedColumns.map(c => `"${c}"`).join(', ');
|
|
299
|
+
const fkCols = fk.columns.map((c) => `"${c}"`).join(', ');
|
|
300
|
+
const refCols = fk.referencedColumns.map((c) => `"${c}"`).join(', ');
|
|
297
301
|
createSQL += `,\n FOREIGN KEY (${fkCols}) REFERENCES "${fk.referencedTable}" (${refCols})`;
|
|
298
302
|
if (fk.onDelete) {
|
|
299
303
|
createSQL += ` ON DELETE ${fk.onDelete}`;
|
|
@@ -332,7 +336,7 @@ class DatabaseMigrationManager {
|
|
|
332
336
|
const results = await (0, data_migrator_js_1.migrateAllTablesData)(this.sourceDb, this.targetDb, sourceSchema, targetSchema, this.config.source.dialect, this.config.target.dialect, options);
|
|
333
337
|
const tablesProcessed = results.length;
|
|
334
338
|
const rowsMigrated = results.reduce((sum, r) => sum + r.rowsMigrated, 0);
|
|
335
|
-
const errors = results.flatMap(r => r.errors);
|
|
339
|
+
const errors = results.flatMap((r) => r.errors);
|
|
336
340
|
const warnings = [];
|
|
337
341
|
for (const result of results) {
|
|
338
342
|
if (result.errors.length > 0) {
|
|
@@ -13,8 +13,8 @@ const type_mapper_js_1 = require("./type_mapper.js");
|
|
|
13
13
|
*/
|
|
14
14
|
function compareSchemas(sourceSchema, targetSchema, sourceDialect, targetDialect) {
|
|
15
15
|
const differences = [];
|
|
16
|
-
const sourceTableMap = new Map(sourceSchema.map(t => [t.name, t]));
|
|
17
|
-
const targetTableMap = new Map(targetSchema.map(t => [t.name, t]));
|
|
16
|
+
const sourceTableMap = new Map(sourceSchema.map((t) => [t.name, t]));
|
|
17
|
+
const targetTableMap = new Map(targetSchema.map((t) => [t.name, t]));
|
|
18
18
|
// Find added and modified tables
|
|
19
19
|
for (const sourceTable of sourceSchema) {
|
|
20
20
|
const targetTable = targetTableMap.get(sourceTable.name);
|
|
@@ -55,11 +55,17 @@ function compareSchemas(sourceSchema, targetSchema, sourceDialect, targetDialect
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
// Calculate summary
|
|
58
|
-
const tablesAdded = differences.filter(d => d.type === 'table_added').length;
|
|
59
|
-
const tablesRemoved = differences.filter(d => d.type === 'table_removed').length;
|
|
58
|
+
const tablesAdded = differences.filter((d) => d.type === 'table_added').length;
|
|
59
|
+
const tablesRemoved = differences.filter((d) => d.type === 'table_removed').length;
|
|
60
60
|
const tablesModified = new Set(differences
|
|
61
|
-
.filter(d => [
|
|
62
|
-
|
|
61
|
+
.filter((d) => [
|
|
62
|
+
'column_added',
|
|
63
|
+
'column_removed',
|
|
64
|
+
'column_modified',
|
|
65
|
+
'index_added',
|
|
66
|
+
'index_removed',
|
|
67
|
+
].includes(d.type))
|
|
68
|
+
.map((d) => d.table)).size;
|
|
63
69
|
return {
|
|
64
70
|
differences,
|
|
65
71
|
sourceSchema,
|
|
@@ -75,8 +81,8 @@ function compareSchemas(sourceSchema, targetSchema, sourceDialect, targetDialect
|
|
|
75
81
|
}
|
|
76
82
|
function compareColumns(sourceTable, targetTable, sourceDialect, targetDialect) {
|
|
77
83
|
const differences = [];
|
|
78
|
-
const sourceColumnMap = new Map(sourceTable.columns.map(c => [c.name, c]));
|
|
79
|
-
const targetColumnMap = new Map(targetTable.columns.map(c => [c.name, c]));
|
|
84
|
+
const sourceColumnMap = new Map(sourceTable.columns.map((c) => [c.name, c]));
|
|
85
|
+
const targetColumnMap = new Map(targetTable.columns.map((c) => [c.name, c]));
|
|
80
86
|
// Check for added and modified columns
|
|
81
87
|
for (const sourceColumn of sourceTable.columns) {
|
|
82
88
|
const targetColumn = targetColumnMap.get(sourceColumn.name);
|
|
@@ -140,8 +146,8 @@ function compareColumns(sourceTable, targetTable, sourceDialect, targetDialect)
|
|
|
140
146
|
}
|
|
141
147
|
function compareIndexes(sourceTable, targetTable) {
|
|
142
148
|
const differences = [];
|
|
143
|
-
const sourceIndexMap = new Map(sourceTable.indexes.map(i => [i.name, i]));
|
|
144
|
-
const targetIndexMap = new Map(targetTable.indexes.map(i => [i.name, i]));
|
|
149
|
+
const sourceIndexMap = new Map(sourceTable.indexes.map((i) => [i.name, i]));
|
|
150
|
+
const targetIndexMap = new Map(targetTable.indexes.map((i) => [i.name, i]));
|
|
145
151
|
// Check for added indexes
|
|
146
152
|
for (const sourceIndex of sourceTable.indexes) {
|
|
147
153
|
const targetIndex = targetIndexMap.get(sourceIndex.name);
|
|
@@ -231,7 +237,8 @@ function generateSyncSQL(comparison, targetDialect) {
|
|
|
231
237
|
return sqlStatements;
|
|
232
238
|
}
|
|
233
239
|
function generateCreateTableSQL(table, targetDialect) {
|
|
234
|
-
const columns = table.columns
|
|
240
|
+
const columns = table.columns
|
|
241
|
+
.map((col) => {
|
|
235
242
|
let colDef = `"${col.name}" ${col.type}`;
|
|
236
243
|
if (col.primaryKey) {
|
|
237
244
|
colDef += ' PRIMARY KEY';
|
|
@@ -249,13 +256,14 @@ function generateCreateTableSQL(table, targetDialect) {
|
|
|
249
256
|
colDef += ` DEFAULT ${col.defaultValue}`;
|
|
250
257
|
}
|
|
251
258
|
return colDef;
|
|
252
|
-
})
|
|
259
|
+
})
|
|
260
|
+
.join(',\n ');
|
|
253
261
|
let sql = `CREATE TABLE "${table.name}" (\n ${columns}`;
|
|
254
262
|
// Add foreign keys
|
|
255
263
|
if (table.foreignKeys.length > 0) {
|
|
256
264
|
for (const fk of table.foreignKeys) {
|
|
257
|
-
const fkCols = fk.columns.map(c => `"${c}"`).join(', ');
|
|
258
|
-
const refCols = fk.referencedColumns.map(c => `"${c}"`).join(', ');
|
|
265
|
+
const fkCols = fk.columns.map((c) => `"${c}"`).join(', ');
|
|
266
|
+
const refCols = fk.referencedColumns.map((c) => `"${c}"`).join(', ');
|
|
259
267
|
sql += `,\n FOREIGN KEY (${fkCols}) REFERENCES "${fk.referencedTable}" (${refCols})`;
|
|
260
268
|
if (fk.onDelete) {
|
|
261
269
|
sql += ` ON DELETE ${fk.onDelete}`;
|
|
@@ -34,8 +34,8 @@ async function introspectSQLiteSchema(db) {
|
|
|
34
34
|
const rowCount = countResult.rows[0]?.count || 0;
|
|
35
35
|
// Get primary key
|
|
36
36
|
const primaryKey = columns
|
|
37
|
-
.filter(col => col.primaryKey)
|
|
38
|
-
.map(col => col.name);
|
|
37
|
+
.filter((col) => col.primaryKey)
|
|
38
|
+
.map((col) => col.name);
|
|
39
39
|
tables.push({
|
|
40
40
|
name: tableName,
|
|
41
41
|
columns,
|
|
@@ -120,9 +120,9 @@ async function introspectSQLiteForeignKeys(db, tableName) {
|
|
|
120
120
|
for (const rows of fkMap.values()) {
|
|
121
121
|
const first = rows[0];
|
|
122
122
|
foreignKeys.push({
|
|
123
|
-
columns: rows.map(r => r.from),
|
|
123
|
+
columns: rows.map((r) => r.from),
|
|
124
124
|
referencedTable: first.table,
|
|
125
|
-
referencedColumns: rows.map(r => r.to),
|
|
125
|
+
referencedColumns: rows.map((r) => r.to),
|
|
126
126
|
onDelete: first.on_delete,
|
|
127
127
|
onUpdate: first.on_update,
|
|
128
128
|
});
|
|
@@ -177,8 +177,8 @@ async function introspectPostgreSQLSchema(db) {
|
|
|
177
177
|
const rowCount = parseInt(countResult.rows[0]?.count || '0', 10);
|
|
178
178
|
// Get primary key
|
|
179
179
|
const primaryKey = columns
|
|
180
|
-
.filter(col => col.primaryKey)
|
|
181
|
-
.map(col => col.name);
|
|
180
|
+
.filter((col) => col.primaryKey)
|
|
181
|
+
.map((col) => col.name);
|
|
182
182
|
tables.push({
|
|
183
183
|
name: tableName,
|
|
184
184
|
columns,
|
|
@@ -315,9 +315,9 @@ async function introspectPostgreSQLForeignKeys(db, tableName) {
|
|
|
315
315
|
const first = rows[0];
|
|
316
316
|
foreignKeys.push({
|
|
317
317
|
name: constraintName,
|
|
318
|
-
columns: rows.map(r => r.column_name),
|
|
318
|
+
columns: rows.map((r) => r.column_name),
|
|
319
319
|
referencedTable: first.foreign_table_name,
|
|
320
|
-
referencedColumns: rows.map(r => r.foreign_column_name),
|
|
320
|
+
referencedColumns: rows.map((r) => r.foreign_column_name),
|
|
321
321
|
onDelete: first.delete_rule?.toUpperCase(),
|
|
322
322
|
onUpdate: first.update_rule?.toUpperCase(),
|
|
323
323
|
});
|
|
@@ -12,99 +12,99 @@ exports.areTypesCompatible = areTypesCompatible;
|
|
|
12
12
|
*/
|
|
13
13
|
exports.SQLITE_TO_POSTGRES_TYPES = {
|
|
14
14
|
// Integer types
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
INTEGER: 'INTEGER',
|
|
16
|
+
INT: 'INTEGER',
|
|
17
|
+
TINYINT: 'SMALLINT',
|
|
18
|
+
SMALLINT: 'SMALLINT',
|
|
19
|
+
MEDIUMINT: 'INTEGER',
|
|
20
|
+
BIGINT: 'BIGINT',
|
|
21
21
|
// Real/Float types
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
REAL: 'REAL',
|
|
23
|
+
DOUBLE: 'DOUBLE PRECISION',
|
|
24
24
|
'DOUBLE PRECISION': 'DOUBLE PRECISION',
|
|
25
|
-
|
|
25
|
+
FLOAT: 'REAL',
|
|
26
26
|
// Numeric/Decimal
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
NUMERIC: 'NUMERIC',
|
|
28
|
+
DECIMAL: 'DECIMAL',
|
|
29
29
|
// Text types
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
TEXT: 'TEXT',
|
|
31
|
+
CHARACTER: 'VARCHAR',
|
|
32
|
+
VARCHAR: 'VARCHAR',
|
|
33
33
|
'VARYING CHARACTER': 'VARCHAR',
|
|
34
|
-
|
|
34
|
+
NCHAR: 'VARCHAR',
|
|
35
35
|
'NATIVE CHARACTER': 'VARCHAR',
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
NVARCHAR: 'VARCHAR',
|
|
37
|
+
CLOB: 'TEXT',
|
|
38
38
|
// Binary types
|
|
39
|
-
|
|
39
|
+
BLOB: 'BYTEA',
|
|
40
40
|
// Boolean
|
|
41
|
-
|
|
41
|
+
BOOLEAN: 'BOOLEAN',
|
|
42
42
|
// Date/Time types (SQLite stores as text/integer)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
DATE: 'DATE',
|
|
44
|
+
DATETIME: 'TIMESTAMP',
|
|
45
|
+
TIMESTAMP: 'TIMESTAMP',
|
|
46
|
+
TIME: 'TIME',
|
|
47
47
|
};
|
|
48
48
|
/**
|
|
49
49
|
* Map PostgreSQL types to SQLite types
|
|
50
50
|
*/
|
|
51
51
|
exports.POSTGRES_TO_SQLITE_TYPES = {
|
|
52
52
|
// Integer types
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
53
|
+
INTEGER: 'INTEGER',
|
|
54
|
+
INT: 'INTEGER',
|
|
55
|
+
INT4: 'INTEGER',
|
|
56
|
+
SMALLINT: 'INTEGER',
|
|
57
|
+
INT2: 'INTEGER',
|
|
58
|
+
BIGINT: 'INTEGER',
|
|
59
|
+
INT8: 'INTEGER',
|
|
60
|
+
SERIAL: 'INTEGER',
|
|
61
|
+
BIGSERIAL: 'INTEGER',
|
|
62
|
+
SMALLSERIAL: 'INTEGER',
|
|
63
63
|
// Float types
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
REAL: 'REAL',
|
|
65
|
+
FLOAT4: 'REAL',
|
|
66
66
|
'DOUBLE PRECISION': 'REAL',
|
|
67
|
-
|
|
67
|
+
FLOAT8: 'REAL',
|
|
68
68
|
// Numeric
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
NUMERIC: 'NUMERIC',
|
|
70
|
+
DECIMAL: 'NUMERIC',
|
|
71
71
|
// Text types
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
TEXT: 'TEXT',
|
|
73
|
+
VARCHAR: 'TEXT',
|
|
74
74
|
'CHARACTER VARYING': 'TEXT',
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
CHAR: 'TEXT',
|
|
76
|
+
CHARACTER: 'TEXT',
|
|
77
|
+
BPCHAR: 'TEXT',
|
|
78
78
|
// Binary
|
|
79
|
-
|
|
79
|
+
BYTEA: 'BLOB',
|
|
80
80
|
// Boolean
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
BOOLEAN: 'INTEGER',
|
|
82
|
+
BOOL: 'INTEGER',
|
|
83
83
|
// Date/Time
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
DATE: 'TEXT',
|
|
85
|
+
TIME: 'TEXT',
|
|
86
|
+
TIMESTAMP: 'TEXT',
|
|
87
|
+
TIMESTAMPTZ: 'TEXT',
|
|
88
88
|
'TIMESTAMP WITH TIME ZONE': 'TEXT',
|
|
89
89
|
'TIMESTAMP WITHOUT TIME ZONE': 'TEXT',
|
|
90
|
-
|
|
90
|
+
INTERVAL: 'TEXT',
|
|
91
91
|
// JSON
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
JSON: 'TEXT',
|
|
93
|
+
JSONB: 'TEXT',
|
|
94
94
|
// UUID
|
|
95
|
-
|
|
95
|
+
UUID: 'TEXT',
|
|
96
96
|
// Network types
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
INET: 'TEXT',
|
|
98
|
+
CIDR: 'TEXT',
|
|
99
|
+
MACADDR: 'TEXT',
|
|
100
100
|
// Geometric types (simplified)
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
101
|
+
POINT: 'TEXT',
|
|
102
|
+
LINE: 'TEXT',
|
|
103
|
+
LSEG: 'TEXT',
|
|
104
|
+
BOX: 'TEXT',
|
|
105
|
+
PATH: 'TEXT',
|
|
106
|
+
POLYGON: 'TEXT',
|
|
107
|
+
CIRCLE: 'TEXT',
|
|
108
108
|
// Array types - convert to TEXT in SQLite
|
|
109
109
|
'TEXT[]': 'TEXT',
|
|
110
110
|
'INTEGER[]': 'TEXT',
|
|
@@ -116,8 +116,8 @@ exports.POSTGRES_TO_SQLITE_TYPES = {
|
|
|
116
116
|
'JSON[]': 'TEXT',
|
|
117
117
|
'JSONB[]': 'TEXT',
|
|
118
118
|
// Full-text search
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
TSVECTOR: 'TEXT',
|
|
120
|
+
TSQUERY: 'TEXT',
|
|
121
121
|
};
|
|
122
122
|
/**
|
|
123
123
|
* Map type from source dialect to target dialect
|
|
@@ -259,5 +259,6 @@ function areTypesCompatible(sourceType, targetType, sourceDialect, targetDialect
|
|
|
259
259
|
return sourceType.toUpperCase() === targetType.toUpperCase();
|
|
260
260
|
}
|
|
261
261
|
const mapped = mapType(sourceType, sourceDialect, targetDialect);
|
|
262
|
-
return mapped.toUpperCase().split('(')[0] ===
|
|
262
|
+
return (mapped.toUpperCase().split('(')[0] ===
|
|
263
|
+
targetType.toUpperCase().split('(')[0]);
|
|
263
264
|
}
|