noormme 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -65
- package/dist/cjs/agentic/ActionJournal.js +13 -9
- package/dist/cjs/agentic/CapabilityManager.js +35 -21
- package/dist/cjs/agentic/CognitiveRepository.js +19 -9
- package/dist/cjs/agentic/ContextBuffer.js +24 -12
- package/dist/cjs/agentic/Cortex.js +11 -4
- package/dist/cjs/agentic/EpisodicMemory.js +7 -5
- package/dist/cjs/agentic/PersonaManager.js +16 -8
- package/dist/cjs/agentic/PolicyEnforcer.js +31 -12
- package/dist/cjs/agentic/ResourceMonitor.js +4 -4
- package/dist/cjs/agentic/SessionCompressor.js +22 -14
- package/dist/cjs/agentic/SessionManager.js +36 -18
- package/dist/cjs/agentic/VectorIndexer.js +22 -18
- package/dist/cjs/agentic/improvement/AblationEngine.js +22 -15
- package/dist/cjs/agentic/improvement/ActionRefiner.js +12 -10
- package/dist/cjs/agentic/improvement/ConflictResolver.js +5 -5
- package/dist/cjs/agentic/improvement/CortexJanitor.js +30 -9
- package/dist/cjs/agentic/improvement/CuriosityEngine.js +27 -23
- package/dist/cjs/agentic/improvement/EvolutionRitual.js +4 -4
- package/dist/cjs/agentic/improvement/EvolutionaryPilot.js +16 -6
- package/dist/cjs/agentic/improvement/GoalArchitect.d.ts +2 -2
- package/dist/cjs/agentic/improvement/GoalArchitect.js +20 -18
- package/dist/cjs/agentic/improvement/GovernanceManager.js +19 -11
- package/dist/cjs/agentic/improvement/HiveLink.js +22 -15
- package/dist/cjs/agentic/improvement/KnowledgeDistiller.js +48 -32
- package/dist/cjs/agentic/improvement/RecursiveReasoner.js +40 -17
- package/dist/cjs/agentic/improvement/ReflectionEngine.js +10 -8
- package/dist/cjs/agentic/improvement/RitualOrchestrator.js +28 -22
- package/dist/cjs/agentic/improvement/RuleEngine.js +22 -17
- package/dist/cjs/agentic/improvement/SelfEvolution.js +24 -18
- package/dist/cjs/agentic/improvement/SelfTestRegistry.js +18 -15
- package/dist/cjs/agentic/improvement/SkillSynthesizer.js +42 -27
- package/dist/cjs/agentic/improvement/SovereignMetrics.js +19 -17
- package/dist/cjs/agentic/improvement/StrategicPlanner.js +120 -55
- package/dist/cjs/agentic/telemetry/CognitiveSynthesizer.js +26 -12
- package/dist/cjs/agentic/telemetry/EventHarvester.js +3 -2
- package/dist/cjs/agentic/telemetry/ResearchAlchemist.js +5 -2
- package/dist/cjs/cache/cache-manager.js +7 -4
- package/dist/cjs/cli/commands/analyze.js +5 -4
- package/dist/cjs/cli/commands/generate.js +81 -44
- package/dist/cjs/cli/commands/init.js +7 -3
- package/dist/cjs/cli/commands/inspect.js +139 -36
- package/dist/cjs/cli/commands/migrate.js +5 -4
- package/dist/cjs/cli/commands/optimize.js +4 -4
- package/dist/cjs/cli/commands/status.js +9 -7
- package/dist/cjs/cli/commands/watch.js +7 -6
- package/dist/cjs/cli/index.js +2 -2
- package/dist/cjs/cli/ui/spinner.d.ts +15 -0
- package/dist/cjs/cli/ui/spinner.js +76 -0
- package/dist/cjs/dialect/database-introspector.js +3 -1
- package/dist/cjs/dialect/postgresql/postgresql-driver.js +3 -1
- package/dist/cjs/dialect/postgresql/postgresql-features.js +18 -8
- package/dist/cjs/dialect/postgresql/postgresql-introspector.js +2 -2
- package/dist/cjs/dialect/sqlite/sqlite-auto-indexer.js +47 -33
- package/dist/cjs/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
- package/dist/cjs/dialect/sqlite/sqlite-driver.js +2 -2
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +15 -12
- package/dist/cjs/edge-runtime/edge-config.js +21 -19
- package/dist/cjs/errors/NoormError.js +22 -20
- package/dist/cjs/helpers/agent-schema.js +2 -0
- package/dist/cjs/helpers/postgresql.js +7 -4
- package/dist/cjs/helpers/schema-evolution.js +31 -6
- package/dist/cjs/index.d.ts +3 -3
- package/dist/cjs/logging/logger.js +8 -4
- package/dist/cjs/migration/data_migrator.js +12 -11
- package/dist/cjs/migration/database_migration_manager.js +17 -13
- package/dist/cjs/migration/schema_differ.js +22 -14
- package/dist/cjs/migration/schema_introspector.js +8 -8
- package/dist/cjs/migration/type_mapper.js +68 -67
- package/dist/cjs/noormme.js +52 -37
- package/dist/cjs/performance/index.js +5 -5
- package/dist/cjs/performance/query-optimizer.js +26 -21
- package/dist/cjs/performance/services/cache-service.js +26 -16
- package/dist/cjs/performance/services/connection-factory.js +28 -23
- package/dist/cjs/performance/services/metrics-collector.js +41 -36
- package/dist/cjs/performance/utils/query-parser.js +15 -16
- package/dist/cjs/relationships/relationship-engine.js +10 -8
- package/dist/cjs/repository/repository-factory.js +97 -38
- package/dist/cjs/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
- package/dist/cjs/schema/core/discovery/relationship-discovery.js +16 -16
- package/dist/cjs/schema/core/discovery/table-metadata-discovery.js +9 -9
- package/dist/cjs/schema/core/discovery/view-discovery.js +5 -4
- package/dist/cjs/schema/core/factories/discovery-factory.js +4 -4
- package/dist/cjs/schema/core/utils/name-generator.js +14 -5
- package/dist/cjs/schema/core/utils/type-mapper.js +24 -24
- package/dist/cjs/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
- package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
- package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
- package/dist/cjs/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
- package/dist/cjs/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
- package/dist/cjs/schema/test/basic-schema-test.js +11 -9
- package/dist/cjs/schema/test/dialect-capabilities.test.js +6 -6
- package/dist/cjs/schema/test/discovery-factory.test.js +2 -2
- package/dist/cjs/schema/test/error-handling.test.js +8 -6
- package/dist/cjs/schema/test/integration.test.js +24 -18
- package/dist/cjs/schema/test/schema-discovery-coordinator.test.js +9 -9
- package/dist/cjs/schema/test/simple-schema-test.js +9 -9
- package/dist/cjs/schema/test/sqlite-discovery-coordinator.test.js +64 -48
- package/dist/cjs/schema/test/test-runner.js +3 -3
- package/dist/cjs/sqlite-migration/index.d.ts +2 -2
- package/dist/cjs/sqlite-migration/sqlite-migration-manager.js +21 -17
- package/dist/cjs/sqlite-migration/sqlite-migration-provider.js +38 -34
- package/dist/cjs/testing/test-utils.js +36 -34
- package/dist/cjs/types/index.d.ts +5 -2
- package/dist/cjs/types/index.js +6 -3
- package/dist/cjs/types/type-generator.js +46 -42
- package/dist/cjs/util/safe-sql-helpers.js +1 -1
- package/dist/cjs/util/security-validator.js +20 -9
- package/dist/cjs/utils/errorHelpers.js +20 -10
- package/dist/cjs/watch/schema-watcher.js +22 -23
- package/dist/esm/agentic/ActionJournal.js +13 -9
- package/dist/esm/agentic/CapabilityManager.js +35 -21
- package/dist/esm/agentic/CognitiveRepository.js +19 -9
- package/dist/esm/agentic/ContextBuffer.js +24 -12
- package/dist/esm/agentic/Cortex.js +11 -4
- package/dist/esm/agentic/EpisodicMemory.js +7 -5
- package/dist/esm/agentic/PersonaManager.js +16 -8
- package/dist/esm/agentic/PolicyEnforcer.js +31 -12
- package/dist/esm/agentic/ResourceMonitor.js +4 -4
- package/dist/esm/agentic/SessionCompressor.js +22 -14
- package/dist/esm/agentic/SessionManager.js +36 -18
- package/dist/esm/agentic/VectorIndexer.js +22 -18
- package/dist/esm/agentic/improvement/AblationEngine.js +22 -15
- package/dist/esm/agentic/improvement/ActionRefiner.js +12 -10
- package/dist/esm/agentic/improvement/ConflictResolver.js +5 -5
- package/dist/esm/agentic/improvement/CortexJanitor.js +30 -9
- package/dist/esm/agentic/improvement/CuriosityEngine.js +27 -23
- package/dist/esm/agentic/improvement/EvolutionRitual.js +4 -4
- package/dist/esm/agentic/improvement/EvolutionaryPilot.js +16 -6
- package/dist/esm/agentic/improvement/GoalArchitect.d.ts +2 -2
- package/dist/esm/agentic/improvement/GoalArchitect.js +20 -18
- package/dist/esm/agentic/improvement/GovernanceManager.js +19 -11
- package/dist/esm/agentic/improvement/HiveLink.js +22 -15
- package/dist/esm/agentic/improvement/KnowledgeDistiller.js +48 -32
- package/dist/esm/agentic/improvement/RecursiveReasoner.js +40 -17
- package/dist/esm/agentic/improvement/ReflectionEngine.js +10 -8
- package/dist/esm/agentic/improvement/RitualOrchestrator.js +28 -22
- package/dist/esm/agentic/improvement/RuleEngine.js +22 -17
- package/dist/esm/agentic/improvement/SelfEvolution.js +24 -18
- package/dist/esm/agentic/improvement/SelfTestRegistry.js +18 -15
- package/dist/esm/agentic/improvement/SkillSynthesizer.js +42 -27
- package/dist/esm/agentic/improvement/SovereignMetrics.js +19 -17
- package/dist/esm/agentic/improvement/StrategicPlanner.js +120 -55
- package/dist/esm/agentic/telemetry/CognitiveSynthesizer.js +26 -12
- package/dist/esm/agentic/telemetry/EventHarvester.js +3 -2
- package/dist/esm/agentic/telemetry/ResearchAlchemist.js +5 -2
- package/dist/esm/cache/cache-manager.js +7 -4
- package/dist/esm/cli/commands/analyze.js +5 -4
- package/dist/esm/cli/commands/generate.js +82 -45
- package/dist/esm/cli/commands/init.js +8 -4
- package/dist/esm/cli/commands/inspect.js +140 -37
- package/dist/esm/cli/commands/migrate.js +5 -4
- package/dist/esm/cli/commands/optimize.js +4 -4
- package/dist/esm/cli/commands/status.js +9 -7
- package/dist/esm/cli/commands/watch.js +7 -6
- package/dist/esm/cli/index.js +2 -2
- package/dist/esm/cli/ui/spinner.d.ts +15 -0
- package/dist/esm/cli/ui/spinner.js +70 -0
- package/dist/esm/dialect/database-introspector.js +3 -1
- package/dist/esm/dialect/postgresql/postgresql-driver.js +3 -1
- package/dist/esm/dialect/postgresql/postgresql-features.js +18 -8
- package/dist/esm/dialect/postgresql/postgresql-introspector.js +2 -2
- package/dist/esm/dialect/sqlite/sqlite-auto-indexer.js +47 -33
- package/dist/esm/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
- package/dist/esm/dialect/sqlite/sqlite-driver.js +2 -2
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +15 -12
- package/dist/esm/dynamic/dynamic.js +1 -1
- package/dist/esm/edge-runtime/edge-config.js +21 -19
- package/dist/esm/errors/NoormError.js +22 -20
- package/dist/esm/helpers/agent-schema.js +2 -0
- package/dist/esm/helpers/postgresql.js +7 -4
- package/dist/esm/helpers/schema-evolution.js +31 -6
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +2 -2
- package/dist/esm/logging/logger.js +8 -4
- package/dist/esm/migration/data_migrator.js +12 -11
- package/dist/esm/migration/database_migration_manager.js +18 -14
- package/dist/esm/migration/schema_differ.js +22 -14
- package/dist/esm/migration/schema_introspector.js +8 -8
- package/dist/esm/migration/type_mapper.js +68 -67
- package/dist/esm/noormme.js +52 -37
- package/dist/esm/performance/index.js +5 -5
- package/dist/esm/performance/query-optimizer.js +26 -21
- package/dist/esm/performance/services/cache-service.js +26 -16
- package/dist/esm/performance/services/connection-factory.js +28 -23
- package/dist/esm/performance/services/metrics-collector.js +41 -36
- package/dist/esm/performance/utils/query-parser.js +15 -16
- package/dist/esm/raw-builder/sql.js +1 -1
- package/dist/esm/relationships/relationship-engine.js +10 -8
- package/dist/esm/repository/repository-factory.js +98 -39
- package/dist/esm/schema/builders/alter-table-add-index-builder.js +1 -1
- package/dist/esm/schema/builders/create-index-builder.js +2 -2
- package/dist/esm/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
- package/dist/esm/schema/core/discovery/relationship-discovery.js +16 -16
- package/dist/esm/schema/core/discovery/table-metadata-discovery.js +9 -9
- package/dist/esm/schema/core/discovery/view-discovery.js +5 -4
- package/dist/esm/schema/core/factories/discovery-factory.js +4 -4
- package/dist/esm/schema/core/utils/name-generator.js +14 -5
- package/dist/esm/schema/core/utils/type-mapper.js +24 -24
- package/dist/esm/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
- package/dist/esm/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
- package/dist/esm/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
- package/dist/esm/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
- package/dist/esm/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
- package/dist/esm/schema/test/basic-schema-test.js +11 -9
- package/dist/esm/schema/test/dialect-capabilities.test.js +6 -6
- package/dist/esm/schema/test/discovery-factory.test.js +2 -2
- package/dist/esm/schema/test/error-handling.test.js +8 -6
- package/dist/esm/schema/test/integration.test.js +24 -18
- package/dist/esm/schema/test/schema-discovery-coordinator.test.js +9 -9
- package/dist/esm/schema/test/simple-schema-test.js +9 -9
- package/dist/esm/schema/test/sqlite-discovery-coordinator.test.js +64 -48
- package/dist/esm/schema/test/test-runner.js +3 -3
- package/dist/esm/sqlite-migration/index.d.ts +2 -2
- package/dist/esm/sqlite-migration/sqlite-migration-manager.js +21 -17
- package/dist/esm/sqlite-migration/sqlite-migration-provider.js +38 -34
- package/dist/esm/testing/test-utils.js +36 -34
- package/dist/esm/types/index.d.ts +5 -2
- package/dist/esm/types/index.js +6 -3
- package/dist/esm/types/type-generator.js +46 -42
- package/dist/esm/util/safe-sql-helpers.js +1 -1
- package/dist/esm/util/security-validator.js +20 -9
- package/dist/esm/utils/errorHelpers.js +21 -11
- package/dist/esm/watch/schema-watcher.js +22 -23
- package/package.json +40 -44
|
@@ -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
|
}
|
package/dist/cjs/noormme.js
CHANGED
|
@@ -86,7 +86,9 @@ class NOORMME {
|
|
|
86
86
|
this.dialect = this.createDialect();
|
|
87
87
|
this.db = new kysely_js_1.Kysely({
|
|
88
88
|
dialect: this.dialect,
|
|
89
|
-
log: this.config.logging?.enabled
|
|
89
|
+
log: this.config.logging?.enabled
|
|
90
|
+
? this.logger.createKyselyLogger()
|
|
91
|
+
: undefined,
|
|
90
92
|
});
|
|
91
93
|
// Initialize core components
|
|
92
94
|
this.schemaDiscovery = new schema_discovery_js_1.SchemaDiscovery(this.db, this.config.introspection, this.dialect);
|
|
@@ -100,7 +102,7 @@ class NOORMME {
|
|
|
100
102
|
: null,
|
|
101
103
|
schema: new agent_schema_js_1.AgentSchemaHelper(this.db, agenticConfig),
|
|
102
104
|
cortex: new Cortex_js_1.Cortex(this.db, this.config),
|
|
103
|
-
evolution: new schema_evolution_js_1.SchemaEvolutionHelper(this.db)
|
|
105
|
+
evolution: new schema_evolution_js_1.SchemaEvolutionHelper(this.db),
|
|
104
106
|
};
|
|
105
107
|
this.repositoryFactory = new repository_factory_js_1.RepositoryFactory(this.db, this.config.performance, this.agent.cortex);
|
|
106
108
|
this.relationshipEngine = new relationship_engine_js_1.RelationshipEngine(this.db, this.config.performance);
|
|
@@ -167,7 +169,7 @@ class NOORMME {
|
|
|
167
169
|
schemaInfo = {
|
|
168
170
|
tables: [],
|
|
169
171
|
relationships: [],
|
|
170
|
-
views: []
|
|
172
|
+
views: [],
|
|
171
173
|
};
|
|
172
174
|
}
|
|
173
175
|
// Generate types - handle empty schema gracefully
|
|
@@ -183,7 +185,7 @@ class NOORMME {
|
|
|
183
185
|
generatedTypes = {
|
|
184
186
|
entities: [],
|
|
185
187
|
relationships: [],
|
|
186
|
-
types: {}
|
|
188
|
+
types: {},
|
|
187
189
|
};
|
|
188
190
|
}
|
|
189
191
|
// Cache schema and types - handle caching errors gracefully
|
|
@@ -207,7 +209,7 @@ class NOORMME {
|
|
|
207
209
|
slowQueryThreshold: 1000,
|
|
208
210
|
nPlusOneDetection: true,
|
|
209
211
|
missingIndexDetection: true,
|
|
210
|
-
persistPath: process.env.NOORMME_METRICS_PATH || '.noormme/metrics.json'
|
|
212
|
+
persistPath: process.env.NOORMME_METRICS_PATH || '.noormme/metrics.json',
|
|
211
213
|
}, this.logger);
|
|
212
214
|
// Initialize SQLite-specific auto-optimization features
|
|
213
215
|
if (this.config.dialect === 'sqlite') {
|
|
@@ -245,15 +247,15 @@ class NOORMME {
|
|
|
245
247
|
const result = await this.sqliteAutoOptimizer.optimizeDatabase(this.db, config);
|
|
246
248
|
if (result.appliedOptimizations.length > 0) {
|
|
247
249
|
this.logger.info(`Applied ${result.appliedOptimizations.length} SQLite optimizations`);
|
|
248
|
-
result.appliedOptimizations.forEach(opt => this.logger.debug(` ✓ ${opt}`));
|
|
250
|
+
result.appliedOptimizations.forEach((opt) => this.logger.debug(` ✓ ${opt}`));
|
|
249
251
|
}
|
|
250
252
|
if (result.recommendations.length > 0) {
|
|
251
253
|
this.logger.info(`Generated ${result.recommendations.length} recommendations`);
|
|
252
|
-
result.recommendations.forEach(rec => this.logger.debug(` 💡 ${rec}`));
|
|
254
|
+
result.recommendations.forEach((rec) => this.logger.debug(` 💡 ${rec}`));
|
|
253
255
|
}
|
|
254
256
|
if (result.warnings.length > 0) {
|
|
255
257
|
this.logger.warn(`Found ${result.warnings.length} warnings`);
|
|
256
|
-
result.warnings.forEach(warning => this.logger.warn(` ⚠️ ${warning}`));
|
|
258
|
+
result.warnings.forEach((warning) => this.logger.warn(` ⚠️ ${warning}`));
|
|
257
259
|
}
|
|
258
260
|
}
|
|
259
261
|
catch (error) {
|
|
@@ -338,9 +340,9 @@ class NOORMME {
|
|
|
338
340
|
if (!schemaInfo) {
|
|
339
341
|
throw new Error('Schema not found. Please reinitialize NOORMME.');
|
|
340
342
|
}
|
|
341
|
-
const table = schemaInfo.tables.find(t => t.name === tableName);
|
|
343
|
+
const table = schemaInfo.tables.find((t) => t.name === tableName);
|
|
342
344
|
if (!table) {
|
|
343
|
-
const availableTables = schemaInfo.tables.map(t => t.name);
|
|
345
|
+
const availableTables = schemaInfo.tables.map((t) => t.name);
|
|
344
346
|
throw new NoormError_js_1.TableNotFoundError(tableName, availableTables);
|
|
345
347
|
}
|
|
346
348
|
const repository = this.repositoryFactory.createRepository(table, schemaInfo.relationships);
|
|
@@ -411,7 +413,7 @@ class NOORMME {
|
|
|
411
413
|
// Auto-refresh schema when changes detected
|
|
412
414
|
this.schemaWatcher.onSchemaChange(async (changes) => {
|
|
413
415
|
this.logger.info(`Schema changes detected: ${changes.length} changes`);
|
|
414
|
-
changes.forEach(change => {
|
|
416
|
+
changes.forEach((change) => {
|
|
415
417
|
this.logger.info(` - ${change.type}: ${change.table}`);
|
|
416
418
|
});
|
|
417
419
|
try {
|
|
@@ -452,12 +454,12 @@ class NOORMME {
|
|
|
452
454
|
queryCount: this.logger.getQueryCount(),
|
|
453
455
|
averageQueryTime: this.logger.getAverageQueryTime(),
|
|
454
456
|
cacheHitRate: this.cacheManager.getHitRate(),
|
|
455
|
-
repositoryCount: this.repositories.size
|
|
457
|
+
repositoryCount: this.repositories.size,
|
|
456
458
|
};
|
|
457
459
|
if (this.metricsCollector) {
|
|
458
460
|
return {
|
|
459
461
|
...baseMetrics,
|
|
460
|
-
...this.metricsCollector.getPerformanceStats()
|
|
462
|
+
...this.metricsCollector.getPerformanceStats(),
|
|
461
463
|
};
|
|
462
464
|
}
|
|
463
465
|
return baseMetrics;
|
|
@@ -477,7 +479,7 @@ class NOORMME {
|
|
|
477
479
|
enabled: true,
|
|
478
480
|
slowQueryThreshold: options?.slowQueryThreshold || 1000,
|
|
479
481
|
nPlusOneDetection: true,
|
|
480
|
-
missingIndexDetection: true
|
|
482
|
+
missingIndexDetection: true,
|
|
481
483
|
}, this.logger);
|
|
482
484
|
this.logger.info('Query performance monitoring enabled');
|
|
483
485
|
}
|
|
@@ -537,27 +539,27 @@ class NOORMME {
|
|
|
537
539
|
includeViews: false,
|
|
538
540
|
excludeTables: [],
|
|
539
541
|
customTypeMappings: {},
|
|
540
|
-
...config.introspection
|
|
542
|
+
...config.introspection,
|
|
541
543
|
},
|
|
542
544
|
cache: {
|
|
543
545
|
ttl: 300000, // 5 minutes
|
|
544
546
|
maxSize: 1000,
|
|
545
547
|
strategy: 'lru',
|
|
546
|
-
...config.cache
|
|
548
|
+
...config.cache,
|
|
547
549
|
},
|
|
548
550
|
logging: {
|
|
549
551
|
level: 'info',
|
|
550
552
|
enabled: true,
|
|
551
|
-
...config.logging
|
|
553
|
+
...config.logging,
|
|
552
554
|
},
|
|
553
555
|
performance: {
|
|
554
556
|
enableQueryOptimization: true,
|
|
555
557
|
enableBatchLoading: true,
|
|
556
558
|
maxBatchSize: 100,
|
|
557
|
-
...config.performance
|
|
559
|
+
...config.performance,
|
|
558
560
|
},
|
|
559
561
|
agentic: config.agentic,
|
|
560
|
-
automation: config.automation
|
|
562
|
+
automation: config.automation,
|
|
561
563
|
};
|
|
562
564
|
}
|
|
563
565
|
/**
|
|
@@ -581,7 +583,7 @@ class NOORMME {
|
|
|
581
583
|
default:
|
|
582
584
|
throw new NoormError_js_1.NoormError(`Unsupported database protocol: ${url.protocol}`, {
|
|
583
585
|
operation: 'connection_string_parsing',
|
|
584
|
-
suggestion: 'Supported protocols: sqlite, postgresql, postgres, mysql'
|
|
586
|
+
suggestion: 'Supported protocols: sqlite, postgresql, postgres, mysql',
|
|
585
587
|
});
|
|
586
588
|
}
|
|
587
589
|
if (dialect === 'sqlite') {
|
|
@@ -592,8 +594,8 @@ class NOORMME {
|
|
|
592
594
|
host: '',
|
|
593
595
|
port: 0,
|
|
594
596
|
username: '',
|
|
595
|
-
password: ''
|
|
596
|
-
}
|
|
597
|
+
password: '',
|
|
598
|
+
},
|
|
597
599
|
};
|
|
598
600
|
}
|
|
599
601
|
if (dialect === 'postgresql' || dialect === 'mysql') {
|
|
@@ -610,23 +612,31 @@ class NOORMME {
|
|
|
610
612
|
}
|
|
611
613
|
else {
|
|
612
614
|
// For other SSL modes, we'll need more configuration
|
|
613
|
-
ssl = {
|
|
615
|
+
ssl = {
|
|
616
|
+
rejectUnauthorized: sslParam !== 'allow' && sslParam !== 'prefer',
|
|
617
|
+
};
|
|
614
618
|
}
|
|
615
619
|
}
|
|
616
620
|
return {
|
|
617
621
|
dialect,
|
|
618
622
|
connection: {
|
|
619
623
|
host: url.hostname || 'localhost',
|
|
620
|
-
port: url.port
|
|
624
|
+
port: url.port
|
|
625
|
+
? parseInt(url.port, 10)
|
|
626
|
+
: this.getDefaultPort(dialect),
|
|
621
627
|
database: url.pathname.replace(/^\//, ''),
|
|
622
628
|
username: url.username || undefined,
|
|
623
629
|
password: url.password || undefined,
|
|
624
630
|
ssl,
|
|
625
631
|
pool: {
|
|
626
|
-
max: searchParams.get('pool_max')
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
632
|
+
max: searchParams.get('pool_max')
|
|
633
|
+
? parseInt(searchParams.get('pool_max'), 10)
|
|
634
|
+
: 10,
|
|
635
|
+
min: searchParams.get('pool_min')
|
|
636
|
+
? parseInt(searchParams.get('pool_min'), 10)
|
|
637
|
+
: 0,
|
|
638
|
+
},
|
|
639
|
+
},
|
|
630
640
|
};
|
|
631
641
|
}
|
|
632
642
|
return {
|
|
@@ -637,14 +647,15 @@ class NOORMME {
|
|
|
637
647
|
database: url.pathname.slice(1), // Remove leading slash
|
|
638
648
|
username: url.username || '',
|
|
639
649
|
password: url.password || '',
|
|
640
|
-
ssl: url.searchParams.get('ssl') === 'true' ||
|
|
641
|
-
|
|
650
|
+
ssl: url.searchParams.get('ssl') === 'true' ||
|
|
651
|
+
url.searchParams.get('sslmode') === 'require',
|
|
652
|
+
},
|
|
642
653
|
};
|
|
643
654
|
}
|
|
644
655
|
catch (error) {
|
|
645
656
|
throw new NoormError_js_1.NoormError(`Failed to parse connection string: ${error instanceof Error ? error.message : String(error)}`, {
|
|
646
657
|
operation: 'connection_string_parsing',
|
|
647
|
-
suggestion: 'Ensure connection string format is: protocol://username:password@host:port/database'
|
|
658
|
+
suggestion: 'Ensure connection string format is: protocol://username:password@host:port/database',
|
|
648
659
|
});
|
|
649
660
|
}
|
|
650
661
|
}
|
|
@@ -653,10 +664,14 @@ class NOORMME {
|
|
|
653
664
|
*/
|
|
654
665
|
getDefaultPort(dialect) {
|
|
655
666
|
switch (dialect) {
|
|
656
|
-
case 'sqlite':
|
|
657
|
-
|
|
658
|
-
case '
|
|
659
|
-
|
|
667
|
+
case 'sqlite':
|
|
668
|
+
return 0;
|
|
669
|
+
case 'postgresql':
|
|
670
|
+
return 5432;
|
|
671
|
+
case 'mysql':
|
|
672
|
+
return 3306;
|
|
673
|
+
default:
|
|
674
|
+
return 0;
|
|
660
675
|
}
|
|
661
676
|
}
|
|
662
677
|
createDialect() {
|
|
@@ -664,7 +679,7 @@ class NOORMME {
|
|
|
664
679
|
switch (dialect) {
|
|
665
680
|
case 'sqlite':
|
|
666
681
|
return new sqlite_dialect_js_1.SqliteDialect({
|
|
667
|
-
database: new better_sqlite3_1.default(connection.database)
|
|
682
|
+
database: new better_sqlite3_1.default(connection.database),
|
|
668
683
|
});
|
|
669
684
|
case 'postgresql':
|
|
670
685
|
return new postgresql_dialect_js_1.PostgresDialect({
|
|
@@ -678,7 +693,7 @@ class NOORMME {
|
|
|
678
693
|
max: connection.pool?.max ?? 10,
|
|
679
694
|
min: connection.pool?.min ?? 0,
|
|
680
695
|
idleTimeoutMillis: connection.pool?.idleTimeoutMillis ?? 10000,
|
|
681
|
-
}
|
|
696
|
+
},
|
|
682
697
|
});
|
|
683
698
|
default:
|
|
684
699
|
throw new Error(`Unsupported dialect: ${dialect}`);
|