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.
Files changed (225) hide show
  1. package/README.md +84 -65
  2. package/dist/cjs/agentic/ActionJournal.js +13 -9
  3. package/dist/cjs/agentic/CapabilityManager.js +35 -21
  4. package/dist/cjs/agentic/CognitiveRepository.js +19 -9
  5. package/dist/cjs/agentic/ContextBuffer.js +24 -12
  6. package/dist/cjs/agentic/Cortex.js +11 -4
  7. package/dist/cjs/agentic/EpisodicMemory.js +7 -5
  8. package/dist/cjs/agentic/PersonaManager.js +16 -8
  9. package/dist/cjs/agentic/PolicyEnforcer.js +31 -12
  10. package/dist/cjs/agentic/ResourceMonitor.js +4 -4
  11. package/dist/cjs/agentic/SessionCompressor.js +22 -14
  12. package/dist/cjs/agentic/SessionManager.js +36 -18
  13. package/dist/cjs/agentic/VectorIndexer.js +22 -18
  14. package/dist/cjs/agentic/improvement/AblationEngine.js +22 -15
  15. package/dist/cjs/agentic/improvement/ActionRefiner.js +12 -10
  16. package/dist/cjs/agentic/improvement/ConflictResolver.js +5 -5
  17. package/dist/cjs/agentic/improvement/CortexJanitor.js +30 -9
  18. package/dist/cjs/agentic/improvement/CuriosityEngine.js +27 -23
  19. package/dist/cjs/agentic/improvement/EvolutionRitual.js +4 -4
  20. package/dist/cjs/agentic/improvement/EvolutionaryPilot.js +16 -6
  21. package/dist/cjs/agentic/improvement/GoalArchitect.d.ts +2 -2
  22. package/dist/cjs/agentic/improvement/GoalArchitect.js +20 -18
  23. package/dist/cjs/agentic/improvement/GovernanceManager.js +19 -11
  24. package/dist/cjs/agentic/improvement/HiveLink.js +22 -15
  25. package/dist/cjs/agentic/improvement/KnowledgeDistiller.js +48 -32
  26. package/dist/cjs/agentic/improvement/RecursiveReasoner.js +40 -17
  27. package/dist/cjs/agentic/improvement/ReflectionEngine.js +10 -8
  28. package/dist/cjs/agentic/improvement/RitualOrchestrator.js +28 -22
  29. package/dist/cjs/agentic/improvement/RuleEngine.js +22 -17
  30. package/dist/cjs/agentic/improvement/SelfEvolution.js +24 -18
  31. package/dist/cjs/agentic/improvement/SelfTestRegistry.js +18 -15
  32. package/dist/cjs/agentic/improvement/SkillSynthesizer.js +42 -27
  33. package/dist/cjs/agentic/improvement/SovereignMetrics.js +19 -17
  34. package/dist/cjs/agentic/improvement/StrategicPlanner.js +120 -55
  35. package/dist/cjs/agentic/telemetry/CognitiveSynthesizer.js +26 -12
  36. package/dist/cjs/agentic/telemetry/EventHarvester.js +3 -2
  37. package/dist/cjs/agentic/telemetry/ResearchAlchemist.js +5 -2
  38. package/dist/cjs/cache/cache-manager.js +7 -4
  39. package/dist/cjs/cli/commands/analyze.js +5 -4
  40. package/dist/cjs/cli/commands/generate.js +81 -44
  41. package/dist/cjs/cli/commands/init.js +7 -3
  42. package/dist/cjs/cli/commands/inspect.js +139 -36
  43. package/dist/cjs/cli/commands/migrate.js +5 -4
  44. package/dist/cjs/cli/commands/optimize.js +4 -4
  45. package/dist/cjs/cli/commands/status.js +9 -7
  46. package/dist/cjs/cli/commands/watch.js +7 -6
  47. package/dist/cjs/cli/index.js +2 -2
  48. package/dist/cjs/cli/ui/spinner.d.ts +15 -0
  49. package/dist/cjs/cli/ui/spinner.js +76 -0
  50. package/dist/cjs/dialect/database-introspector.js +3 -1
  51. package/dist/cjs/dialect/postgresql/postgresql-driver.js +3 -1
  52. package/dist/cjs/dialect/postgresql/postgresql-features.js +18 -8
  53. package/dist/cjs/dialect/postgresql/postgresql-introspector.js +2 -2
  54. package/dist/cjs/dialect/sqlite/sqlite-auto-indexer.js +47 -33
  55. package/dist/cjs/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
  56. package/dist/cjs/dialect/sqlite/sqlite-driver.js +2 -2
  57. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +15 -12
  58. package/dist/cjs/edge-runtime/edge-config.js +21 -19
  59. package/dist/cjs/errors/NoormError.js +22 -20
  60. package/dist/cjs/helpers/agent-schema.js +2 -0
  61. package/dist/cjs/helpers/postgresql.js +7 -4
  62. package/dist/cjs/helpers/schema-evolution.js +31 -6
  63. package/dist/cjs/index.d.ts +3 -3
  64. package/dist/cjs/logging/logger.js +8 -4
  65. package/dist/cjs/migration/data_migrator.js +12 -11
  66. package/dist/cjs/migration/database_migration_manager.js +17 -13
  67. package/dist/cjs/migration/schema_differ.js +22 -14
  68. package/dist/cjs/migration/schema_introspector.js +8 -8
  69. package/dist/cjs/migration/type_mapper.js +68 -67
  70. package/dist/cjs/noormme.js +52 -37
  71. package/dist/cjs/performance/index.js +5 -5
  72. package/dist/cjs/performance/query-optimizer.js +26 -21
  73. package/dist/cjs/performance/services/cache-service.js +26 -16
  74. package/dist/cjs/performance/services/connection-factory.js +28 -23
  75. package/dist/cjs/performance/services/metrics-collector.js +41 -36
  76. package/dist/cjs/performance/utils/query-parser.js +15 -16
  77. package/dist/cjs/relationships/relationship-engine.js +10 -8
  78. package/dist/cjs/repository/repository-factory.js +97 -38
  79. package/dist/cjs/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
  80. package/dist/cjs/schema/core/discovery/relationship-discovery.js +16 -16
  81. package/dist/cjs/schema/core/discovery/table-metadata-discovery.js +9 -9
  82. package/dist/cjs/schema/core/discovery/view-discovery.js +5 -4
  83. package/dist/cjs/schema/core/factories/discovery-factory.js +4 -4
  84. package/dist/cjs/schema/core/utils/name-generator.js +14 -5
  85. package/dist/cjs/schema/core/utils/type-mapper.js +24 -24
  86. package/dist/cjs/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
  87. package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
  88. package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
  89. package/dist/cjs/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
  90. package/dist/cjs/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
  91. package/dist/cjs/schema/test/basic-schema-test.js +11 -9
  92. package/dist/cjs/schema/test/dialect-capabilities.test.js +6 -6
  93. package/dist/cjs/schema/test/discovery-factory.test.js +2 -2
  94. package/dist/cjs/schema/test/error-handling.test.js +8 -6
  95. package/dist/cjs/schema/test/integration.test.js +24 -18
  96. package/dist/cjs/schema/test/schema-discovery-coordinator.test.js +9 -9
  97. package/dist/cjs/schema/test/simple-schema-test.js +9 -9
  98. package/dist/cjs/schema/test/sqlite-discovery-coordinator.test.js +64 -48
  99. package/dist/cjs/schema/test/test-runner.js +3 -3
  100. package/dist/cjs/sqlite-migration/index.d.ts +2 -2
  101. package/dist/cjs/sqlite-migration/sqlite-migration-manager.js +21 -17
  102. package/dist/cjs/sqlite-migration/sqlite-migration-provider.js +38 -34
  103. package/dist/cjs/testing/test-utils.js +36 -34
  104. package/dist/cjs/types/index.d.ts +5 -2
  105. package/dist/cjs/types/index.js +6 -3
  106. package/dist/cjs/types/type-generator.js +46 -42
  107. package/dist/cjs/util/safe-sql-helpers.js +1 -1
  108. package/dist/cjs/util/security-validator.js +20 -9
  109. package/dist/cjs/utils/errorHelpers.js +20 -10
  110. package/dist/cjs/watch/schema-watcher.js +22 -23
  111. package/dist/esm/agentic/ActionJournal.js +13 -9
  112. package/dist/esm/agentic/CapabilityManager.js +35 -21
  113. package/dist/esm/agentic/CognitiveRepository.js +19 -9
  114. package/dist/esm/agentic/ContextBuffer.js +24 -12
  115. package/dist/esm/agentic/Cortex.js +11 -4
  116. package/dist/esm/agentic/EpisodicMemory.js +7 -5
  117. package/dist/esm/agentic/PersonaManager.js +16 -8
  118. package/dist/esm/agentic/PolicyEnforcer.js +31 -12
  119. package/dist/esm/agentic/ResourceMonitor.js +4 -4
  120. package/dist/esm/agentic/SessionCompressor.js +22 -14
  121. package/dist/esm/agentic/SessionManager.js +36 -18
  122. package/dist/esm/agentic/VectorIndexer.js +22 -18
  123. package/dist/esm/agentic/improvement/AblationEngine.js +22 -15
  124. package/dist/esm/agentic/improvement/ActionRefiner.js +12 -10
  125. package/dist/esm/agentic/improvement/ConflictResolver.js +5 -5
  126. package/dist/esm/agentic/improvement/CortexJanitor.js +30 -9
  127. package/dist/esm/agentic/improvement/CuriosityEngine.js +27 -23
  128. package/dist/esm/agentic/improvement/EvolutionRitual.js +4 -4
  129. package/dist/esm/agentic/improvement/EvolutionaryPilot.js +16 -6
  130. package/dist/esm/agentic/improvement/GoalArchitect.d.ts +2 -2
  131. package/dist/esm/agentic/improvement/GoalArchitect.js +20 -18
  132. package/dist/esm/agentic/improvement/GovernanceManager.js +19 -11
  133. package/dist/esm/agentic/improvement/HiveLink.js +22 -15
  134. package/dist/esm/agentic/improvement/KnowledgeDistiller.js +48 -32
  135. package/dist/esm/agentic/improvement/RecursiveReasoner.js +40 -17
  136. package/dist/esm/agentic/improvement/ReflectionEngine.js +10 -8
  137. package/dist/esm/agentic/improvement/RitualOrchestrator.js +28 -22
  138. package/dist/esm/agentic/improvement/RuleEngine.js +22 -17
  139. package/dist/esm/agentic/improvement/SelfEvolution.js +24 -18
  140. package/dist/esm/agentic/improvement/SelfTestRegistry.js +18 -15
  141. package/dist/esm/agentic/improvement/SkillSynthesizer.js +42 -27
  142. package/dist/esm/agentic/improvement/SovereignMetrics.js +19 -17
  143. package/dist/esm/agentic/improvement/StrategicPlanner.js +120 -55
  144. package/dist/esm/agentic/telemetry/CognitiveSynthesizer.js +26 -12
  145. package/dist/esm/agentic/telemetry/EventHarvester.js +3 -2
  146. package/dist/esm/agentic/telemetry/ResearchAlchemist.js +5 -2
  147. package/dist/esm/cache/cache-manager.js +7 -4
  148. package/dist/esm/cli/commands/analyze.js +5 -4
  149. package/dist/esm/cli/commands/generate.js +82 -45
  150. package/dist/esm/cli/commands/init.js +8 -4
  151. package/dist/esm/cli/commands/inspect.js +140 -37
  152. package/dist/esm/cli/commands/migrate.js +5 -4
  153. package/dist/esm/cli/commands/optimize.js +4 -4
  154. package/dist/esm/cli/commands/status.js +9 -7
  155. package/dist/esm/cli/commands/watch.js +7 -6
  156. package/dist/esm/cli/index.js +2 -2
  157. package/dist/esm/cli/ui/spinner.d.ts +15 -0
  158. package/dist/esm/cli/ui/spinner.js +70 -0
  159. package/dist/esm/dialect/database-introspector.js +3 -1
  160. package/dist/esm/dialect/postgresql/postgresql-driver.js +3 -1
  161. package/dist/esm/dialect/postgresql/postgresql-features.js +18 -8
  162. package/dist/esm/dialect/postgresql/postgresql-introspector.js +2 -2
  163. package/dist/esm/dialect/sqlite/sqlite-auto-indexer.js +47 -33
  164. package/dist/esm/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
  165. package/dist/esm/dialect/sqlite/sqlite-driver.js +2 -2
  166. package/dist/esm/dialect/sqlite/sqlite-introspector.js +15 -12
  167. package/dist/esm/dynamic/dynamic.js +1 -1
  168. package/dist/esm/edge-runtime/edge-config.js +21 -19
  169. package/dist/esm/errors/NoormError.js +22 -20
  170. package/dist/esm/helpers/agent-schema.js +2 -0
  171. package/dist/esm/helpers/postgresql.js +7 -4
  172. package/dist/esm/helpers/schema-evolution.js +31 -6
  173. package/dist/esm/index.d.ts +3 -3
  174. package/dist/esm/index.js +2 -2
  175. package/dist/esm/logging/logger.js +8 -4
  176. package/dist/esm/migration/data_migrator.js +12 -11
  177. package/dist/esm/migration/database_migration_manager.js +18 -14
  178. package/dist/esm/migration/schema_differ.js +22 -14
  179. package/dist/esm/migration/schema_introspector.js +8 -8
  180. package/dist/esm/migration/type_mapper.js +68 -67
  181. package/dist/esm/noormme.js +52 -37
  182. package/dist/esm/performance/index.js +5 -5
  183. package/dist/esm/performance/query-optimizer.js +26 -21
  184. package/dist/esm/performance/services/cache-service.js +26 -16
  185. package/dist/esm/performance/services/connection-factory.js +28 -23
  186. package/dist/esm/performance/services/metrics-collector.js +41 -36
  187. package/dist/esm/performance/utils/query-parser.js +15 -16
  188. package/dist/esm/raw-builder/sql.js +1 -1
  189. package/dist/esm/relationships/relationship-engine.js +10 -8
  190. package/dist/esm/repository/repository-factory.js +98 -39
  191. package/dist/esm/schema/builders/alter-table-add-index-builder.js +1 -1
  192. package/dist/esm/schema/builders/create-index-builder.js +2 -2
  193. package/dist/esm/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
  194. package/dist/esm/schema/core/discovery/relationship-discovery.js +16 -16
  195. package/dist/esm/schema/core/discovery/table-metadata-discovery.js +9 -9
  196. package/dist/esm/schema/core/discovery/view-discovery.js +5 -4
  197. package/dist/esm/schema/core/factories/discovery-factory.js +4 -4
  198. package/dist/esm/schema/core/utils/name-generator.js +14 -5
  199. package/dist/esm/schema/core/utils/type-mapper.js +24 -24
  200. package/dist/esm/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
  201. package/dist/esm/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
  202. package/dist/esm/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
  203. package/dist/esm/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
  204. package/dist/esm/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
  205. package/dist/esm/schema/test/basic-schema-test.js +11 -9
  206. package/dist/esm/schema/test/dialect-capabilities.test.js +6 -6
  207. package/dist/esm/schema/test/discovery-factory.test.js +2 -2
  208. package/dist/esm/schema/test/error-handling.test.js +8 -6
  209. package/dist/esm/schema/test/integration.test.js +24 -18
  210. package/dist/esm/schema/test/schema-discovery-coordinator.test.js +9 -9
  211. package/dist/esm/schema/test/simple-schema-test.js +9 -9
  212. package/dist/esm/schema/test/sqlite-discovery-coordinator.test.js +64 -48
  213. package/dist/esm/schema/test/test-runner.js +3 -3
  214. package/dist/esm/sqlite-migration/index.d.ts +2 -2
  215. package/dist/esm/sqlite-migration/sqlite-migration-manager.js +21 -17
  216. package/dist/esm/sqlite-migration/sqlite-migration-provider.js +38 -34
  217. package/dist/esm/testing/test-utils.js +36 -34
  218. package/dist/esm/types/index.d.ts +5 -2
  219. package/dist/esm/types/index.js +6 -3
  220. package/dist/esm/types/type-generator.js +46 -42
  221. package/dist/esm/util/safe-sql-helpers.js +1 -1
  222. package/dist/esm/util/security-validator.js +20 -9
  223. package/dist/esm/utils/errorHelpers.js +21 -11
  224. package/dist/esm/watch/schema-watcher.js +22 -23
  225. 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 = initialQuery || this.db.selectFrom(this.table.name).selectAll();
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(filter) {
41
+ filter(filterOrColumn, operator, value) {
40
42
  let q = this.query;
41
- for (const [key, value] of Object.entries(filter)) {
42
- if (value !== undefined) {
43
- q = q.where(key, '=', value);
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(filter) {
55
+ exclude(filterOrColumn, operator, value) {
49
56
  let q = this.query;
50
- for (const [key, value] of Object.entries(filter)) {
51
- if (value !== undefined) {
52
- q = q.where(key, '!=', value);
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('-') ? String(col).substring(1) : String(col);
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.select(this.primaryKey).executeTakeFirst();
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.orderBy(this.primaryKey, 'desc').limit(1).executeTakeFirst();
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' || col.type.toLowerCase() === 'bool')
142
- .map(col => col.name);
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') || type.includes('timestamp') || type.includes('time');
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' || typeof transformed[col] === 'number') {
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) ? data.map(transformRecord) : transformRecord(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.selectFrom(table.name).selectAll().execute();
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.deleteFrom(table.name).where(primaryKey, '=', id).executeTakeFirst();
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.selectFrom(table.name).select((eb) => eb.fn.countAll().as('count')).executeTakeFirst();
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.selectFrom(table.name).select(primaryKey).where(primaryKey, '=', id).executeTakeFirst();
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.selectFrom(table.name).select((eb) => eb.fn.countAll().as('count'));
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.selectFrom(rel.toTable).select((eb) => eb.fn.countAll().as('count')).where(rel.toColumn, '=', val).executeTakeFirst();
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.substring(6).replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
310
- const actualColumn = availableColumns.find(col => col.toLowerCase() === columnName.toLowerCase());
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.selectFrom(table.name).selectAll().where(actualColumn, '=', value).executeTakeFirst();
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)) ?? undefined,
31
- columns: [] // Views don't have explicit columns in this context
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') || str.endsWith('xes') || str.endsWith('zes') ||
62
- str.endsWith('ches') || str.endsWith('shes') ||
63
- str.endsWith('ies') || str.endsWith('ves')) {
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') && str.length > 1 && !'aeiou'.includes(str[str.length - 2])) {
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') || str.endsWith('ch') || str.endsWith('x') || str.endsWith('z')) {
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
- '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',
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
- 'bigint': 'number',
22
- 'smallint': 'number',
23
- 'decimal': 'number',
21
+ bigint: 'number',
22
+ smallint: 'number',
23
+ decimal: 'number',
24
24
  'double precision': 'number',
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',
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
  /**