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