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
|
@@ -18,7 +18,9 @@ class DjangoManagerImpl {
|
|
|
18
18
|
this.table = table;
|
|
19
19
|
this.primaryKey = primaryKey;
|
|
20
20
|
this.transformer = transformer;
|
|
21
|
-
this.query =
|
|
21
|
+
this.query =
|
|
22
|
+
initialQuery ||
|
|
23
|
+
this.db.selectFrom(this.table.name).selectAll();
|
|
22
24
|
}
|
|
23
25
|
async all() {
|
|
24
26
|
return this.execute();
|
|
@@ -36,33 +38,53 @@ class DjangoManagerImpl {
|
|
|
36
38
|
const result = await q.executeTakeFirst();
|
|
37
39
|
return result ? this.transformer(result) : null;
|
|
38
40
|
}
|
|
39
|
-
filter(
|
|
41
|
+
filter(filterOrColumn, operator, value) {
|
|
40
42
|
let q = this.query;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
if (typeof filterOrColumn === 'object') {
|
|
44
|
+
for (const [key, val] of Object.entries(filterOrColumn)) {
|
|
45
|
+
if (val !== undefined) {
|
|
46
|
+
q = q.where(key, '=', val);
|
|
47
|
+
}
|
|
44
48
|
}
|
|
45
49
|
}
|
|
50
|
+
else if (operator && value !== undefined) {
|
|
51
|
+
q = q.where(filterOrColumn, operator, value);
|
|
52
|
+
}
|
|
46
53
|
return new DjangoManagerImpl(this.db, this.table, this.primaryKey, this.transformer, q);
|
|
47
54
|
}
|
|
48
|
-
exclude(
|
|
55
|
+
exclude(filterOrColumn, operator, value) {
|
|
49
56
|
let q = this.query;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
57
|
+
if (typeof filterOrColumn === 'object') {
|
|
58
|
+
for (const [key, val] of Object.entries(filterOrColumn)) {
|
|
59
|
+
if (val !== undefined) {
|
|
60
|
+
q = q.where(key, '!=', val);
|
|
61
|
+
}
|
|
53
62
|
}
|
|
54
63
|
}
|
|
64
|
+
else if (operator && value !== undefined) {
|
|
65
|
+
// For simple exclude with operator, we invert the operator if possible or use !=
|
|
66
|
+
const negOperator = operator === '=' ? '!=' : operator === '!=' ? '=' : '!=';
|
|
67
|
+
q = q.where(filterOrColumn, negOperator, value);
|
|
68
|
+
}
|
|
55
69
|
return new DjangoManagerImpl(this.db, this.table, this.primaryKey, this.transformer, q);
|
|
56
70
|
}
|
|
57
71
|
order_by(...columns) {
|
|
58
72
|
let q = this.query;
|
|
59
73
|
for (const col of columns) {
|
|
60
74
|
const direction = String(col).startsWith('-') ? 'desc' : 'asc';
|
|
61
|
-
const actualCol = String(col).startsWith('-')
|
|
75
|
+
const actualCol = String(col).startsWith('-')
|
|
76
|
+
? String(col).substring(1)
|
|
77
|
+
: String(col);
|
|
62
78
|
q = q.orderBy(actualCol, direction);
|
|
63
79
|
}
|
|
64
80
|
return new DjangoManagerImpl(this.db, this.table, this.primaryKey, this.transformer, q);
|
|
65
81
|
}
|
|
82
|
+
limit(count) {
|
|
83
|
+
return new DjangoManagerImpl(this.db, this.table, this.primaryKey, this.transformer, this.query.limit(count));
|
|
84
|
+
}
|
|
85
|
+
offset(count) {
|
|
86
|
+
return new DjangoManagerImpl(this.db, this.table, this.primaryKey, this.transformer, this.query.offset(count));
|
|
87
|
+
}
|
|
66
88
|
async count() {
|
|
67
89
|
const result = await this.query
|
|
68
90
|
.clearSelect()
|
|
@@ -71,7 +93,9 @@ class DjangoManagerImpl {
|
|
|
71
93
|
return Number(result?.count || 0);
|
|
72
94
|
}
|
|
73
95
|
async exists() {
|
|
74
|
-
const result = await this.query
|
|
96
|
+
const result = await this.query
|
|
97
|
+
.select(this.primaryKey)
|
|
98
|
+
.executeTakeFirst();
|
|
75
99
|
return result !== undefined;
|
|
76
100
|
}
|
|
77
101
|
async first() {
|
|
@@ -79,7 +103,10 @@ class DjangoManagerImpl {
|
|
|
79
103
|
return result ? this.transformer(result) : null;
|
|
80
104
|
}
|
|
81
105
|
async last() {
|
|
82
|
-
const result = await this.query
|
|
106
|
+
const result = await this.query
|
|
107
|
+
.orderBy(this.primaryKey, 'desc')
|
|
108
|
+
.limit(1)
|
|
109
|
+
.executeTakeFirst();
|
|
83
110
|
return result ? this.transformer(result) : null;
|
|
84
111
|
}
|
|
85
112
|
async create(data) {
|
|
@@ -138,14 +165,17 @@ class RepositoryFactory {
|
|
|
138
165
|
*/
|
|
139
166
|
transformData(data, table) {
|
|
140
167
|
const booleanColumns = table.columns
|
|
141
|
-
.filter(col => col.type.toLowerCase() === 'boolean' ||
|
|
142
|
-
.
|
|
168
|
+
.filter((col) => col.type.toLowerCase() === 'boolean' ||
|
|
169
|
+
col.type.toLowerCase() === 'bool')
|
|
170
|
+
.map((col) => col.name);
|
|
143
171
|
const dateColumns = table.columns
|
|
144
|
-
.filter(col => {
|
|
172
|
+
.filter((col) => {
|
|
145
173
|
const type = col.type.toLowerCase();
|
|
146
|
-
return type.includes('date') ||
|
|
174
|
+
return (type.includes('date') ||
|
|
175
|
+
type.includes('timestamp') ||
|
|
176
|
+
type.includes('time'));
|
|
147
177
|
})
|
|
148
|
-
.map(col => col.name);
|
|
178
|
+
.map((col) => col.name);
|
|
149
179
|
if (booleanColumns.length === 0 && dateColumns.length === 0)
|
|
150
180
|
return data;
|
|
151
181
|
const transformRecord = (record) => {
|
|
@@ -166,7 +196,8 @@ class RepositoryFactory {
|
|
|
166
196
|
// Transform dates
|
|
167
197
|
for (const col of dateColumns) {
|
|
168
198
|
if (col in transformed && transformed[col]) {
|
|
169
|
-
if (typeof transformed[col] === 'string' ||
|
|
199
|
+
if (typeof transformed[col] === 'string' ||
|
|
200
|
+
typeof transformed[col] === 'number') {
|
|
170
201
|
const date = new Date(transformed[col]);
|
|
171
202
|
if (!isNaN(date.getTime()))
|
|
172
203
|
transformed[col] = date;
|
|
@@ -175,14 +206,16 @@ class RepositoryFactory {
|
|
|
175
206
|
}
|
|
176
207
|
return transformed;
|
|
177
208
|
};
|
|
178
|
-
return Array.isArray(data)
|
|
209
|
+
return Array.isArray(data)
|
|
210
|
+
? data.map(transformRecord)
|
|
211
|
+
: transformRecord(data);
|
|
179
212
|
}
|
|
180
213
|
/**
|
|
181
214
|
* Create a repository for the specified table
|
|
182
215
|
*/
|
|
183
216
|
createRepository(table, relationships) {
|
|
184
217
|
this.setRelationships(relationships);
|
|
185
|
-
const primaryKey = table.columns.find(c => c.isPrimaryKey)?.name || 'id';
|
|
218
|
+
const primaryKey = table.columns.find((c) => c.isPrimaryKey)?.name || 'id';
|
|
186
219
|
const transformer = (data) => this.transformData(data, table);
|
|
187
220
|
const baseRepository = {
|
|
188
221
|
objects: new DjangoManagerImpl(this.db, table, primaryKey, transformer),
|
|
@@ -195,7 +228,10 @@ class RepositoryFactory {
|
|
|
195
228
|
return result ? transformer(result) : null;
|
|
196
229
|
},
|
|
197
230
|
findAll: async () => {
|
|
198
|
-
const results = await this.db
|
|
231
|
+
const results = await this.db
|
|
232
|
+
.selectFrom(table.name)
|
|
233
|
+
.selectAll()
|
|
234
|
+
.execute();
|
|
199
235
|
return transformer(results);
|
|
200
236
|
},
|
|
201
237
|
create: async (data) => {
|
|
@@ -219,20 +255,32 @@ class RepositoryFactory {
|
|
|
219
255
|
return transformer(result);
|
|
220
256
|
},
|
|
221
257
|
delete: async (id) => {
|
|
222
|
-
const result = await this.db
|
|
258
|
+
const result = await this.db
|
|
259
|
+
.deleteFrom(table.name)
|
|
260
|
+
.where(primaryKey, '=', id)
|
|
261
|
+
.executeTakeFirst();
|
|
223
262
|
return Number(result.numDeletedRows || 0) > 0;
|
|
224
263
|
},
|
|
225
264
|
count: async () => {
|
|
226
|
-
const result = await this.db
|
|
265
|
+
const result = await this.db
|
|
266
|
+
.selectFrom(table.name)
|
|
267
|
+
.select((eb) => eb.fn.countAll().as('count'))
|
|
268
|
+
.executeTakeFirst();
|
|
227
269
|
return Number(result?.count || 0);
|
|
228
270
|
},
|
|
229
271
|
exists: async (id) => {
|
|
230
|
-
const result = await this.db
|
|
272
|
+
const result = await this.db
|
|
273
|
+
.selectFrom(table.name)
|
|
274
|
+
.select(primaryKey)
|
|
275
|
+
.where(primaryKey, '=', id)
|
|
276
|
+
.executeTakeFirst();
|
|
231
277
|
return result !== undefined;
|
|
232
278
|
},
|
|
233
279
|
paginate: async (options) => {
|
|
234
280
|
let query = this.db.selectFrom(table.name).selectAll();
|
|
235
|
-
let countQuery = this.db
|
|
281
|
+
let countQuery = this.db
|
|
282
|
+
.selectFrom(table.name)
|
|
283
|
+
.select((eb) => eb.fn.countAll().as('count'));
|
|
236
284
|
if (options.where) {
|
|
237
285
|
for (const [key, value] of Object.entries(options.where)) {
|
|
238
286
|
if (value !== undefined) {
|
|
@@ -256,8 +304,8 @@ class RepositoryFactory {
|
|
|
256
304
|
total,
|
|
257
305
|
totalPages,
|
|
258
306
|
hasNext: options.page < totalPages,
|
|
259
|
-
hasPrev: options.page > 1
|
|
260
|
-
}
|
|
307
|
+
hasPrev: options.page > 1,
|
|
308
|
+
},
|
|
261
309
|
};
|
|
262
310
|
},
|
|
263
311
|
findWithRelations: async (id, relations) => {
|
|
@@ -273,23 +321,27 @@ class RepositoryFactory {
|
|
|
273
321
|
await this.relationshipEngine.loadRelationships(entities, relations);
|
|
274
322
|
},
|
|
275
323
|
withCount: async (id, relationshipNames) => {
|
|
276
|
-
const entity = await baseRepository.findById(id);
|
|
324
|
+
const entity = (await baseRepository.findById(id));
|
|
277
325
|
if (!entity)
|
|
278
326
|
throw new Error(`Entity ${id} not found`);
|
|
279
|
-
const tableRelationships = relationships.filter(r => r.fromTable === table.name);
|
|
327
|
+
const tableRelationships = relationships.filter((r) => r.fromTable === table.name);
|
|
280
328
|
const counts = {};
|
|
281
329
|
for (const name of relationshipNames) {
|
|
282
|
-
const rel = tableRelationships.find(r => r.name === name);
|
|
330
|
+
const rel = tableRelationships.find((r) => r.name === name);
|
|
283
331
|
if (!rel)
|
|
284
|
-
throw new NoormError_js_1.RelationshipNotFoundError(name, table.name, tableRelationships.map(r => r.name));
|
|
332
|
+
throw new NoormError_js_1.RelationshipNotFoundError(name, table.name, tableRelationships.map((r) => r.name));
|
|
285
333
|
const val = entity[rel.fromColumn];
|
|
286
334
|
if (val !== undefined) {
|
|
287
|
-
const res = await this.db
|
|
335
|
+
const res = await this.db
|
|
336
|
+
.selectFrom(rel.toTable)
|
|
337
|
+
.select((eb) => eb.fn.countAll().as('count'))
|
|
338
|
+
.where(rel.toColumn, '=', val)
|
|
339
|
+
.executeTakeFirst();
|
|
288
340
|
counts[`${name}Count`] = Number(res?.count || 0);
|
|
289
341
|
}
|
|
290
342
|
}
|
|
291
343
|
return { ...entity, ...counts };
|
|
292
|
-
}
|
|
344
|
+
},
|
|
293
345
|
};
|
|
294
346
|
let repository = this.wrapWithDynamicMethods(baseRepository, table);
|
|
295
347
|
if (this.cortex)
|
|
@@ -297,7 +349,7 @@ class RepositoryFactory {
|
|
|
297
349
|
return repository;
|
|
298
350
|
}
|
|
299
351
|
wrapWithDynamicMethods(repository, table) {
|
|
300
|
-
const availableColumns = table.columns.map(c => c.name);
|
|
352
|
+
const availableColumns = table.columns.map((c) => c.name);
|
|
301
353
|
const db = this.db;
|
|
302
354
|
const transformer = (data) => this.transformData(data, table);
|
|
303
355
|
return new Proxy(repository, {
|
|
@@ -306,16 +358,23 @@ class RepositoryFactory {
|
|
|
306
358
|
return Reflect.get(target, prop, receiver);
|
|
307
359
|
if (typeof prop === 'string' && prop.startsWith('findBy')) {
|
|
308
360
|
return async (value) => {
|
|
309
|
-
const columnName = prop
|
|
310
|
-
|
|
361
|
+
const columnName = prop
|
|
362
|
+
.substring(6)
|
|
363
|
+
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
364
|
+
.toLowerCase();
|
|
365
|
+
const actualColumn = availableColumns.find((col) => col.toLowerCase() === columnName.toLowerCase());
|
|
311
366
|
if (!actualColumn)
|
|
312
367
|
throw new NoormError_js_1.ColumnNotFoundError(columnName, table.name, availableColumns);
|
|
313
|
-
const result = await db
|
|
368
|
+
const result = await db
|
|
369
|
+
.selectFrom(table.name)
|
|
370
|
+
.selectAll()
|
|
371
|
+
.where(actualColumn, '=', value)
|
|
372
|
+
.executeTakeFirst();
|
|
314
373
|
return transformer(result || null);
|
|
315
374
|
};
|
|
316
375
|
}
|
|
317
376
|
return undefined;
|
|
318
|
-
}
|
|
377
|
+
},
|
|
319
378
|
});
|
|
320
379
|
}
|
|
321
380
|
}
|
|
@@ -24,9 +24,7 @@ class SchemaDiscoveryCoordinator {
|
|
|
24
24
|
*/
|
|
25
25
|
async discoverSchema(db, config = {}, dialect) {
|
|
26
26
|
// Determine the dialect - handle both string and dialect objects
|
|
27
|
-
const dialectName = typeof dialect === 'string'
|
|
28
|
-
? dialect
|
|
29
|
-
: dialect?.name || 'sqlite';
|
|
27
|
+
const dialectName = typeof dialect === 'string' ? dialect : dialect?.name || 'sqlite';
|
|
30
28
|
this.currentDialect = dialectName;
|
|
31
29
|
// Check if dialect is supported
|
|
32
30
|
if (!this.factory.isDialectSupported(dialectName)) {
|
|
@@ -22,7 +22,7 @@ class RelationshipDiscovery {
|
|
|
22
22
|
for (const table of tables) {
|
|
23
23
|
for (const fk of table.foreignKeys) {
|
|
24
24
|
// Find the referenced table
|
|
25
|
-
const referencedTable = tables.find(t => t.name === fk.referencedTable);
|
|
25
|
+
const referencedTable = tables.find((t) => t.name === fk.referencedTable);
|
|
26
26
|
if (!referencedTable)
|
|
27
27
|
continue;
|
|
28
28
|
// Create relationship name based on column name
|
|
@@ -36,7 +36,7 @@ class RelationshipDiscovery {
|
|
|
36
36
|
fromTable: table.name,
|
|
37
37
|
fromColumn: fk.column,
|
|
38
38
|
toTable: fk.referencedTable,
|
|
39
|
-
toColumn: fk.referencedColumn
|
|
39
|
+
toColumn: fk.referencedColumn,
|
|
40
40
|
});
|
|
41
41
|
// Add reverse relationship
|
|
42
42
|
const reverseName = name_generator_js_1.NameGenerator.generateReverseRelationshipName(table.name, fk.column);
|
|
@@ -46,7 +46,7 @@ class RelationshipDiscovery {
|
|
|
46
46
|
fromTable: fk.referencedTable,
|
|
47
47
|
fromColumn: fk.referencedColumn,
|
|
48
48
|
toTable: table.name,
|
|
49
|
-
toColumn: fk.column
|
|
49
|
+
toColumn: fk.column,
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -66,7 +66,7 @@ class RelationshipDiscovery {
|
|
|
66
66
|
toColumn: fk2.referencedColumn,
|
|
67
67
|
throughTable: table.name,
|
|
68
68
|
throughFromColumn: fk1.column,
|
|
69
|
-
throughToColumn: fk2.column
|
|
69
|
+
throughToColumn: fk2.column,
|
|
70
70
|
});
|
|
71
71
|
// B -> A via Table
|
|
72
72
|
relationships.push({
|
|
@@ -78,7 +78,7 @@ class RelationshipDiscovery {
|
|
|
78
78
|
toColumn: fk1.referencedColumn,
|
|
79
79
|
throughTable: table.name,
|
|
80
80
|
throughFromColumn: fk2.column,
|
|
81
|
-
throughToColumn: fk1.column
|
|
81
|
+
throughToColumn: fk1.column,
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -93,7 +93,7 @@ class RelationshipDiscovery {
|
|
|
93
93
|
oneToMany: 0,
|
|
94
94
|
manyToMany: 0,
|
|
95
95
|
selfReferencing: 0,
|
|
96
|
-
circularReferences: []
|
|
96
|
+
circularReferences: [],
|
|
97
97
|
};
|
|
98
98
|
for (const table of tables) {
|
|
99
99
|
for (const fk of table.foreignKeys) {
|
|
@@ -102,7 +102,7 @@ class RelationshipDiscovery {
|
|
|
102
102
|
patterns.selfReferencing++;
|
|
103
103
|
}
|
|
104
104
|
// Check for many-to-many (junction tables)
|
|
105
|
-
const referencedTable = tables.find(t => t.name === fk.referencedTable);
|
|
105
|
+
const referencedTable = tables.find((t) => t.name === fk.referencedTable);
|
|
106
106
|
if (referencedTable && this.isJunctionTable(table)) {
|
|
107
107
|
patterns.manyToMany++;
|
|
108
108
|
}
|
|
@@ -124,10 +124,10 @@ class RelationshipDiscovery {
|
|
|
124
124
|
if (table.foreignKeys.length !== 2)
|
|
125
125
|
return false;
|
|
126
126
|
// 2. Mostly columns that are either PK or part of FKs
|
|
127
|
-
const fkColumns = new Set(table.foreignKeys.map(fk => fk.column));
|
|
127
|
+
const fkColumns = new Set(table.foreignKeys.map((fk) => fk.column));
|
|
128
128
|
const pkColumns = new Set(table.primaryKey || []);
|
|
129
|
-
const otherColumns = table.columns.filter(col => !fkColumns.has(col.name) && !pkColumns.has(col.name));
|
|
130
|
-
// If it has too many "data" columns, it might not be a pure junction table,
|
|
129
|
+
const otherColumns = table.columns.filter((col) => !fkColumns.has(col.name) && !pkColumns.has(col.name));
|
|
130
|
+
// If it has too many "data" columns, it might not be a pure junction table,
|
|
131
131
|
// but we can still treat it as one for M2M navigation if it has 2 FKs.
|
|
132
132
|
// Pure junction tables usually have 0-1 extra columns (like 'created_at').
|
|
133
133
|
return otherColumns.length <= 2;
|
|
@@ -150,7 +150,7 @@ class RelationshipDiscovery {
|
|
|
150
150
|
return;
|
|
151
151
|
visited.add(tableName);
|
|
152
152
|
recursionStack.add(tableName);
|
|
153
|
-
const table = tables.find(t => t.name === tableName);
|
|
153
|
+
const table = tables.find((t) => t.name === tableName);
|
|
154
154
|
if (table) {
|
|
155
155
|
for (const fk of table.foreignKeys) {
|
|
156
156
|
dfs(fk.referencedTable, [...path, tableName]);
|
|
@@ -170,7 +170,7 @@ class RelationshipDiscovery {
|
|
|
170
170
|
*/
|
|
171
171
|
validateRelationships(tables) {
|
|
172
172
|
const issues = [];
|
|
173
|
-
const tableNames = new Set(tables.map(t => t.name));
|
|
173
|
+
const tableNames = new Set(tables.map((t) => t.name));
|
|
174
174
|
for (const table of tables) {
|
|
175
175
|
for (const fk of table.foreignKeys) {
|
|
176
176
|
// Check if referenced table exists
|
|
@@ -178,15 +178,15 @@ class RelationshipDiscovery {
|
|
|
178
178
|
issues.push(`Foreign key '${fk.name}' in table '${table.name}' references non-existent table '${fk.referencedTable}'`);
|
|
179
179
|
}
|
|
180
180
|
// Check if referenced column exists in referenced table
|
|
181
|
-
const referencedTable = tables.find(t => t.name === fk.referencedTable);
|
|
181
|
+
const referencedTable = tables.find((t) => t.name === fk.referencedTable);
|
|
182
182
|
if (referencedTable) {
|
|
183
|
-
const referencedColumnExists = referencedTable.columns.some(col => col.name === fk.referencedColumn);
|
|
183
|
+
const referencedColumnExists = referencedTable.columns.some((col) => col.name === fk.referencedColumn);
|
|
184
184
|
if (!referencedColumnExists) {
|
|
185
185
|
issues.push(`Foreign key '${fk.name}' in table '${table.name}' references non-existent column '${fk.referencedColumn}' in table '${fk.referencedTable}'`);
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
// Check if foreign key column exists
|
|
189
|
-
const fkColumnExists = table.columns.some(col => col.name === fk.column);
|
|
189
|
+
const fkColumnExists = table.columns.some((col) => col.name === fk.column);
|
|
190
190
|
if (!fkColumnExists) {
|
|
191
191
|
issues.push(`Foreign key '${fk.name}' in table '${table.name}' references non-existent column '${fk.column}'`);
|
|
192
192
|
}
|
|
@@ -194,7 +194,7 @@ class RelationshipDiscovery {
|
|
|
194
194
|
}
|
|
195
195
|
return {
|
|
196
196
|
isValid: issues.length === 0,
|
|
197
|
-
issues
|
|
197
|
+
issues,
|
|
198
198
|
};
|
|
199
199
|
}
|
|
200
200
|
}
|
|
@@ -40,7 +40,7 @@ class TableMetadataDiscovery {
|
|
|
40
40
|
const [columns, indexes, foreignKeys] = await Promise.all([
|
|
41
41
|
introspector.getColumns(table.name).catch(() => []),
|
|
42
42
|
introspector.getIndexes(table.name).catch(() => []),
|
|
43
|
-
introspector.getForeignKeys(table.name).catch(() => [])
|
|
43
|
+
introspector.getForeignKeys(table.name).catch(() => []),
|
|
44
44
|
]);
|
|
45
45
|
// Find primary key columns
|
|
46
46
|
const primaryKeyColumns = columns
|
|
@@ -54,7 +54,7 @@ class TableMetadataDiscovery {
|
|
|
54
54
|
indexes: indexes.map((idx) => ({
|
|
55
55
|
name: idx.name,
|
|
56
56
|
columns: idx.columns,
|
|
57
|
-
unique: idx.unique
|
|
57
|
+
unique: idx.unique,
|
|
58
58
|
})),
|
|
59
59
|
foreignKeys: foreignKeys.map((fk) => ({
|
|
60
60
|
name: fk.name,
|
|
@@ -62,8 +62,8 @@ class TableMetadataDiscovery {
|
|
|
62
62
|
referencedTable: fk.referencedTable,
|
|
63
63
|
referencedColumn: fk.referencedColumn,
|
|
64
64
|
onDelete: fk.onDelete,
|
|
65
|
-
onUpdate: fk.onUpdate
|
|
66
|
-
}))
|
|
65
|
+
onUpdate: fk.onUpdate,
|
|
66
|
+
})),
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
69
|
catch (error) {
|
|
@@ -86,8 +86,8 @@ class TableMetadataDiscovery {
|
|
|
86
86
|
indexCount: indexes.length,
|
|
87
87
|
foreignKeyCount: foreignKeys.length,
|
|
88
88
|
lastModified: new Date(), // Fallback
|
|
89
|
-
indexes: indexes.map(idx => idx.name),
|
|
90
|
-
constraints: foreignKeys.map(fk => fk.name)
|
|
89
|
+
indexes: indexes.map((idx) => idx.name),
|
|
90
|
+
constraints: foreignKeys.map((fk) => fk.name),
|
|
91
91
|
};
|
|
92
92
|
}
|
|
93
93
|
catch (error) {
|
|
@@ -108,7 +108,7 @@ class TableMetadataDiscovery {
|
|
|
108
108
|
issues.push('Table must have at least one column');
|
|
109
109
|
}
|
|
110
110
|
// Check for duplicate column names
|
|
111
|
-
const columnNames = table.columns.map(col => col.name);
|
|
111
|
+
const columnNames = table.columns.map((col) => col.name);
|
|
112
112
|
const duplicates = columnNames.filter((name, index) => columnNames.indexOf(name) !== index);
|
|
113
113
|
if (duplicates.length > 0) {
|
|
114
114
|
issues.push(`Duplicate column names found: ${duplicates.join(', ')}`);
|
|
@@ -116,14 +116,14 @@ class TableMetadataDiscovery {
|
|
|
116
116
|
// Check for valid primary key
|
|
117
117
|
if (table.primaryKey && table.primaryKey.length > 0) {
|
|
118
118
|
const primaryKeyColumns = table.primaryKey;
|
|
119
|
-
const invalidPkColumns = primaryKeyColumns.filter(pkCol => !table.columns.some(col => col.name === pkCol));
|
|
119
|
+
const invalidPkColumns = primaryKeyColumns.filter((pkCol) => !table.columns.some((col) => col.name === pkCol));
|
|
120
120
|
if (invalidPkColumns.length > 0) {
|
|
121
121
|
issues.push(`Primary key references non-existent columns: ${invalidPkColumns.join(', ')}`);
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
return {
|
|
125
125
|
isValid: issues.length === 0,
|
|
126
|
-
issues
|
|
126
|
+
issues,
|
|
127
127
|
};
|
|
128
128
|
}
|
|
129
129
|
}
|
|
@@ -27,8 +27,9 @@ class ViewDiscovery {
|
|
|
27
27
|
views.push({
|
|
28
28
|
name: table.name,
|
|
29
29
|
schema: table.schema,
|
|
30
|
-
definition: (await this.getViewDefinition(introspector, table.name)) ??
|
|
31
|
-
|
|
30
|
+
definition: (await this.getViewDefinition(introspector, table.name)) ??
|
|
31
|
+
undefined,
|
|
32
|
+
columns: [], // Views don't have explicit columns in this context
|
|
32
33
|
});
|
|
33
34
|
}
|
|
34
35
|
}
|
|
@@ -83,7 +84,7 @@ class ViewDiscovery {
|
|
|
83
84
|
/UPDATE\s+SET/i,
|
|
84
85
|
/INSERT\s+INTO/i,
|
|
85
86
|
/TRUNCATE/i,
|
|
86
|
-
/ALTER\s+TABLE/i
|
|
87
|
+
/ALTER\s+TABLE/i,
|
|
87
88
|
];
|
|
88
89
|
if (view.definition) {
|
|
89
90
|
for (const pattern of dangerousPatterns) {
|
|
@@ -94,7 +95,7 @@ class ViewDiscovery {
|
|
|
94
95
|
}
|
|
95
96
|
return {
|
|
96
97
|
isValid: issues.length === 0,
|
|
97
|
-
issues
|
|
98
|
+
issues,
|
|
98
99
|
};
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
@@ -90,7 +90,7 @@ class DiscoveryFactory {
|
|
|
90
90
|
relationshipDiscovery: this.createRelationshipDiscovery(),
|
|
91
91
|
viewDiscovery: this.createViewDiscovery(),
|
|
92
92
|
indexDiscovery: this.createIndexDiscovery(dialect),
|
|
93
|
-
constraintDiscovery: this.createConstraintDiscovery(dialect)
|
|
93
|
+
constraintDiscovery: this.createConstraintDiscovery(dialect),
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
@@ -117,7 +117,7 @@ class DiscoveryFactory {
|
|
|
117
117
|
supportsConstraints: true,
|
|
118
118
|
supportsForeignKeys: true,
|
|
119
119
|
supportsCheckConstraints: true,
|
|
120
|
-
supportsDeferredConstraints: false
|
|
120
|
+
supportsDeferredConstraints: false,
|
|
121
121
|
};
|
|
122
122
|
case 'postgres':
|
|
123
123
|
case 'postgresql':
|
|
@@ -127,7 +127,7 @@ class DiscoveryFactory {
|
|
|
127
127
|
supportsConstraints: true,
|
|
128
128
|
supportsForeignKeys: true,
|
|
129
129
|
supportsCheckConstraints: true,
|
|
130
|
-
supportsDeferredConstraints: true
|
|
130
|
+
supportsDeferredConstraints: true,
|
|
131
131
|
};
|
|
132
132
|
default:
|
|
133
133
|
return {
|
|
@@ -136,7 +136,7 @@ class DiscoveryFactory {
|
|
|
136
136
|
supportsConstraints: false,
|
|
137
137
|
supportsForeignKeys: false,
|
|
138
138
|
supportsCheckConstraints: false,
|
|
139
|
-
supportsDeferredConstraints: false
|
|
139
|
+
supportsDeferredConstraints: false,
|
|
140
140
|
};
|
|
141
141
|
}
|
|
142
142
|
}
|
|
@@ -58,9 +58,13 @@ class NameGenerator {
|
|
|
58
58
|
}
|
|
59
59
|
// Handle words that are already plural
|
|
60
60
|
// Common plural endings that shouldn't be pluralized further
|
|
61
|
-
if (str.endsWith('ses') ||
|
|
62
|
-
str.endsWith('
|
|
63
|
-
str.endsWith('
|
|
61
|
+
if (str.endsWith('ses') ||
|
|
62
|
+
str.endsWith('xes') ||
|
|
63
|
+
str.endsWith('zes') ||
|
|
64
|
+
str.endsWith('ches') ||
|
|
65
|
+
str.endsWith('shes') ||
|
|
66
|
+
str.endsWith('ies') ||
|
|
67
|
+
str.endsWith('ves')) {
|
|
64
68
|
return str;
|
|
65
69
|
}
|
|
66
70
|
// Handle words ending in 's' - likely already plural
|
|
@@ -73,11 +77,16 @@ class NameGenerator {
|
|
|
73
77
|
return str;
|
|
74
78
|
}
|
|
75
79
|
// Handle words ending in 'y' preceded by a consonant
|
|
76
|
-
if (str.endsWith('y') &&
|
|
80
|
+
if (str.endsWith('y') &&
|
|
81
|
+
str.length > 1 &&
|
|
82
|
+
!'aeiou'.includes(str[str.length - 2])) {
|
|
77
83
|
return str.slice(0, -1) + 'ies';
|
|
78
84
|
}
|
|
79
85
|
// Handle words ending in sh, ch, x, z
|
|
80
|
-
if (str.endsWith('sh') ||
|
|
86
|
+
if (str.endsWith('sh') ||
|
|
87
|
+
str.endsWith('ch') ||
|
|
88
|
+
str.endsWith('x') ||
|
|
89
|
+
str.endsWith('z')) {
|
|
81
90
|
return str + 'es';
|
|
82
91
|
}
|
|
83
92
|
// Default: add 's'
|
|
@@ -7,31 +7,31 @@ exports.TypeMapper = void 0;
|
|
|
7
7
|
class TypeMapper {
|
|
8
8
|
static typeMapping = {
|
|
9
9
|
// SQLite types
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
10
|
+
text: 'string',
|
|
11
|
+
varchar: 'string',
|
|
12
|
+
char: 'string',
|
|
13
|
+
integer: 'number',
|
|
14
|
+
real: 'number',
|
|
15
|
+
numeric: 'number',
|
|
16
|
+
boolean: 'boolean',
|
|
17
|
+
date: 'Date',
|
|
18
|
+
datetime: 'Date',
|
|
19
|
+
blob: 'Buffer',
|
|
20
20
|
// PostgreSQL types
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
bigint: 'number',
|
|
22
|
+
smallint: 'number',
|
|
23
|
+
decimal: 'number',
|
|
24
24
|
'double precision': 'number',
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
timestamp: 'Date',
|
|
26
|
+
timestamptz: 'Date',
|
|
27
|
+
time: 'Date',
|
|
28
|
+
timetz: 'Date',
|
|
29
|
+
json: 'Record<string, unknown>',
|
|
30
|
+
jsonb: 'Record<string, unknown>',
|
|
31
|
+
uuid: 'string',
|
|
32
|
+
tsvector: 'string',
|
|
33
|
+
tsquery: 'string',
|
|
34
|
+
bytea: 'Buffer',
|
|
35
35
|
};
|
|
36
36
|
/**
|
|
37
37
|
* Map database column info to our ColumnInfo interface
|
|
@@ -46,7 +46,7 @@ class TypeMapper {
|
|
|
46
46
|
isAutoIncrement: dbColumn.isAutoIncrement ?? false,
|
|
47
47
|
maxLength: dbColumn.maxLength,
|
|
48
48
|
precision: dbColumn.precision,
|
|
49
|
-
scale: dbColumn.scale
|
|
49
|
+
scale: dbColumn.scale,
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
/**
|