metal-orm 1.1.11 → 1.1.16

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 (182) hide show
  1. package/README.md +758 -769
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/package.json +100 -96
  5. package/scripts/generate-entities/schema.mjs +122 -122
  6. package/scripts/generate-entities/tree-detection.mjs +92 -92
  7. package/scripts/inflection/pt-br.mjs +468 -468
  8. package/scripts/run-eslint.mjs +33 -34
  9. package/scripts/show-sql-seed.sql +102 -0
  10. package/scripts/show-sql.mjs +321 -325
  11. package/src/codegen/naming-strategy.ts +54 -54
  12. package/src/codegen/typescript.ts +482 -482
  13. package/src/core/ast/adapters.ts +1 -1
  14. package/src/core/ast/builders.ts +123 -123
  15. package/src/core/ast/expression-builders.ts +745 -745
  16. package/src/core/ast/expression-nodes.ts +304 -304
  17. package/src/core/ast/expression-visitor.ts +212 -212
  18. package/src/core/ast/expression.ts +20 -20
  19. package/src/core/ast/helpers.ts +14 -14
  20. package/src/core/ast/join.ts +18 -18
  21. package/src/core/ast/query.ts +200 -200
  22. package/src/core/ddl/dialects/base-schema-dialect.ts +1 -1
  23. package/src/core/ddl/dialects/mssql-schema-dialect.ts +1 -1
  24. package/src/core/ddl/dialects/mysql-schema-dialect.ts +1 -1
  25. package/src/core/ddl/dialects/postgres-schema-dialect.ts +1 -1
  26. package/src/core/ddl/dialects/render-reference.test.ts +70 -70
  27. package/src/core/ddl/dialects/sqlite-schema-dialect.ts +1 -1
  28. package/src/core/ddl/introspect/catalogs/index.ts +5 -5
  29. package/src/core/ddl/introspect/catalogs/postgres.ts +146 -146
  30. package/src/core/ddl/introspect/context.ts +15 -15
  31. package/src/core/ddl/introspect/functions/postgres.ts +35 -35
  32. package/src/core/ddl/introspect/registry.ts +40 -40
  33. package/src/core/ddl/introspect/run-select.ts +35 -35
  34. package/src/core/ddl/introspect/utils.ts +56 -56
  35. package/src/core/ddl/naming-strategy.ts +16 -16
  36. package/src/core/ddl/schema-dialect.ts +56 -56
  37. package/src/core/ddl/schema-diff.ts +234 -234
  38. package/src/core/ddl/schema-generator.ts +1 -1
  39. package/src/core/ddl/schema-introspect.ts +25 -25
  40. package/src/core/ddl/sql-writing.ts +171 -171
  41. package/src/core/dialect/abstract.ts +541 -541
  42. package/src/core/dialect/base/cte-compiler.ts +33 -33
  43. package/src/core/dialect/base/function-table-formatter.ts +103 -103
  44. package/src/core/dialect/base/groupby-compiler.ts +21 -21
  45. package/src/core/dialect/base/join-compiler.ts +25 -25
  46. package/src/core/dialect/base/orderby-compiler.ts +35 -35
  47. package/src/core/dialect/base/pagination-strategy.ts +32 -32
  48. package/src/core/dialect/base/returning-strategy.ts +57 -57
  49. package/src/core/dialect/base/sql-dialect.ts +294 -294
  50. package/src/core/dialect/dialect-factory.ts +91 -91
  51. package/src/core/dialect/mssql/functions.ts +120 -120
  52. package/src/core/dialect/mssql/index.ts +317 -317
  53. package/src/core/dialect/mysql/functions.ts +103 -103
  54. package/src/core/dialect/mysql/index.ts +105 -105
  55. package/src/core/dialect/postgres/functions.ts +108 -108
  56. package/src/core/dialect/postgres/index.ts +91 -91
  57. package/src/core/dialect/sqlite/functions.ts +129 -129
  58. package/src/core/dialect/sqlite/index.ts +67 -67
  59. package/src/core/driver/database-driver.ts +19 -19
  60. package/src/core/driver/mssql-driver.ts +23 -23
  61. package/src/core/driver/mysql-driver.ts +23 -23
  62. package/src/core/driver/postgres-driver.ts +23 -23
  63. package/src/core/driver/sqlite-driver.ts +23 -23
  64. package/src/core/execution/db-executor.ts +92 -92
  65. package/src/core/execution/executors/better-sqlite3-executor.ts +90 -90
  66. package/src/core/execution/executors/mssql-executor.ts +184 -184
  67. package/src/core/execution/executors/mysql-executor.ts +88 -88
  68. package/src/core/execution/executors/postgres-executor.ts +26 -26
  69. package/src/core/execution/executors/sqlite-executor.ts +42 -42
  70. package/src/core/execution/pooling/pool-types.ts +30 -30
  71. package/src/core/execution/pooling/pool.ts +275 -275
  72. package/src/core/functions/array.ts +35 -35
  73. package/src/core/functions/control-flow.ts +79 -79
  74. package/src/core/functions/datetime.ts +237 -237
  75. package/src/core/functions/json.ts +70 -70
  76. package/src/core/functions/numeric.ts +297 -297
  77. package/src/core/functions/text.ts +334 -334
  78. package/src/core/functions/types.ts +33 -33
  79. package/src/core/hydration/types.ts +51 -51
  80. package/src/core/sql/sql-operator-config.ts +39 -39
  81. package/src/core/sql/sql.ts +152 -152
  82. package/src/decorators/column-decorator.ts +87 -87
  83. package/src/decorators/decorator-metadata.ts +143 -143
  84. package/src/decorators/entity.ts +93 -93
  85. package/src/decorators/index.ts +39 -39
  86. package/src/decorators/relations.ts +231 -231
  87. package/src/decorators/transformers/built-in/string-transformers.ts +231 -231
  88. package/src/decorators/transformers/transformer-decorators.ts +134 -134
  89. package/src/decorators/transformers/transformer-executor.ts +171 -171
  90. package/src/decorators/transformers/transformer-metadata.ts +73 -73
  91. package/src/decorators/validators/built-in/br-cep-validator.ts +55 -55
  92. package/src/decorators/validators/built-in/br-cnpj-validator.ts +105 -105
  93. package/src/decorators/validators/built-in/br-cpf-validator.ts +103 -103
  94. package/src/decorators/validators/country-validator-registry.ts +64 -64
  95. package/src/decorators/validators/country-validators-decorators.ts +203 -203
  96. package/src/decorators/validators/country-validators.ts +105 -105
  97. package/src/decorators/validators/validator-metadata.ts +59 -59
  98. package/src/dto/dto-types.ts +226 -226
  99. package/src/dto/filter-types.ts +141 -141
  100. package/src/dto/index.ts +95 -95
  101. package/src/dto/openapi/generators/base.ts +29 -29
  102. package/src/dto/openapi/generators/column.ts +37 -37
  103. package/src/dto/openapi/generators/dto.ts +91 -91
  104. package/src/dto/openapi/generators/filter.ts +75 -75
  105. package/src/dto/openapi/generators/nested-dto.ts +618 -618
  106. package/src/dto/openapi/generators/pagination.ts +111 -111
  107. package/src/dto/openapi/generators/relation-filter.ts +228 -228
  108. package/src/dto/openapi/index.ts +12 -12
  109. package/src/dto/openapi/types.ts +101 -101
  110. package/src/dto/openapi/utilities.ts +95 -95
  111. package/src/dto/pagination-utils.ts +150 -150
  112. package/src/dto/transform.ts +197 -197
  113. package/src/index.ts +86 -86
  114. package/src/orm/als.ts +58 -58
  115. package/src/orm/domain-event-bus.ts +119 -119
  116. package/src/orm/entity-context.ts +86 -86
  117. package/src/orm/entity-materializer.ts +159 -159
  118. package/src/orm/entity-meta.ts +97 -97
  119. package/src/orm/entity-registry.ts +39 -39
  120. package/src/orm/entity-relation-cache.ts +39 -39
  121. package/src/orm/execute.ts +194 -194
  122. package/src/orm/execution-context.ts +18 -18
  123. package/src/orm/hydration-context.ts +26 -26
  124. package/src/orm/hydration.ts +112 -112
  125. package/src/orm/identity-map.ts +61 -61
  126. package/src/orm/interceptor-pipeline.ts +16 -16
  127. package/src/orm/lazy-batch/belongs-to-many.ts +119 -119
  128. package/src/orm/lazy-batch/belongs-to.ts +108 -108
  129. package/src/orm/lazy-batch/has-many.ts +69 -69
  130. package/src/orm/lazy-batch/has-one.ts +68 -68
  131. package/src/orm/lazy-batch/shared.ts +125 -125
  132. package/src/orm/orm-session.ts +620 -620
  133. package/src/orm/orm.ts +34 -34
  134. package/src/orm/pooled-executor-factory.ts +121 -121
  135. package/src/orm/query-logger.ts +40 -40
  136. package/src/orm/relation-change-processor.ts +420 -420
  137. package/src/orm/relations/belongs-to.ts +143 -143
  138. package/src/orm/relations/has-many.ts +204 -204
  139. package/src/orm/relations/has-one.ts +174 -174
  140. package/src/orm/relations/many-to-many.ts +288 -288
  141. package/src/orm/relations/morph-many.ts +156 -156
  142. package/src/orm/relations/morph-one.ts +151 -151
  143. package/src/orm/relations/morph-to.ts +162 -162
  144. package/src/orm/runtime-types.ts +92 -92
  145. package/src/orm/save-graph.ts +561 -561
  146. package/src/orm/transaction-runner.ts +24 -24
  147. package/src/orm/unit-of-work.ts +426 -426
  148. package/src/query/index.ts +69 -69
  149. package/src/query/target.ts +46 -46
  150. package/src/query-builder/column-selector.ts +81 -81
  151. package/src/query-builder/delete.ts +141 -141
  152. package/src/query-builder/insert-query-state.ts +149 -149
  153. package/src/query-builder/insert.ts +117 -117
  154. package/src/query-builder/query-ast-service.ts +287 -287
  155. package/src/query-builder/query-resolution.ts +78 -78
  156. package/src/query-builder/raw-column-parser.ts +38 -38
  157. package/src/query-builder/relation-filter-utils.ts +153 -153
  158. package/src/query-builder/relation-join-planner.ts +10 -10
  159. package/src/query-builder/relation-manager.ts +87 -87
  160. package/src/query-builder/relation-projection-helper.ts +102 -102
  161. package/src/query-builder/relation-types.ts +9 -9
  162. package/src/query-builder/relation-utils.ts +15 -15
  163. package/src/query-builder/select/cte-facet.ts +40 -40
  164. package/src/query-builder/select/from-facet.ts +80 -80
  165. package/src/query-builder/select/join-facet.ts +62 -62
  166. package/src/query-builder/select/predicate-facet.ts +104 -104
  167. package/src/query-builder/select/projection-facet.ts +70 -70
  168. package/src/query-builder/select/relation-facet.ts +81 -81
  169. package/src/query-builder/select/setop-facet.ts +36 -36
  170. package/src/query-builder/select-helpers.ts +1 -1
  171. package/src/query-builder/select-query-builder-deps.ts +130 -130
  172. package/src/query-builder/select-query-state.ts +207 -207
  173. package/src/query-builder/update.ts +151 -151
  174. package/src/schema/column-types.ts +322 -322
  175. package/src/schema/table-guards.ts +37 -37
  176. package/src/schema/table.ts +281 -281
  177. package/src/tree/index.ts +13 -13
  178. package/src/tree/nested-set-strategy.ts +545 -545
  179. package/src/tree/tree-decorator.ts +397 -397
  180. package/src/tree/tree-manager.ts +754 -754
  181. package/src/tree/tree-query.ts +427 -427
  182. package/src/tree/tree-types.ts +299 -299
@@ -1,197 +1,197 @@
1
- /**
2
- * DTO transformation utilities for working with DTO instances.
3
- *
4
- * These helpers make it easier to convert between DTO types, apply defaults,
5
- * and handle auto-generated fields without manual object construction.
6
- */
7
-
8
- // ─────────────────────────────────────────────────────────────────────────────
9
- // Transform utilities
10
- // ─────────────────────────────────────────────────────────────────────────────
11
-
12
- /**
13
- * Transforms a CreateDto or UpdateDto into a ResponseDto by merging with auto-generated fields.
14
- *
15
- * @example
16
- * ```ts
17
- * const newUser: UserResponse = toResponse(body, {
18
- * id: newId,
19
- * createdAt: new Date().toISOString()
20
- * });
21
- *
22
- * // Or use the curried form for reuse
23
- * const createUserResponse = toResponseBuilder<UserCreateDto, UserResponse>({
24
- * id: () => nextId++,
25
- * createdAt: () => new Date().toISOString()
26
- * });
27
- * const user = createUserResponse(body);
28
- * ```
29
- */
30
- export function toResponse<TInput, TOutput>(
31
- input: TInput,
32
- autoFields: Partial<TOutput>
33
- ): TOutput {
34
- return {
35
- ...input,
36
- ...autoFields
37
- } as unknown as TOutput;
38
- }
39
-
40
- /**
41
- * Creates a toResponse function with pre-configured auto-fields.
42
- * Useful for reusing same transformation logic across multiple endpoints.
43
- *
44
- * @example
45
- * ```ts
46
- * const userResponseBuilder = toResponseBuilder<CreateUserDto, UserResponse>({
47
- * id: () => generateId(),
48
- * createdAt: () => new Date().toISOString(),
49
- * active: true
50
- * });
51
- *
52
- * app.post('/users', (req, res) => {
53
- * const user = userResponseBuilder(req.body);
54
- * res.status(201).json(user);
55
- * });
56
- * ```
57
- */
58
- export function toResponseBuilder<TInput, TOutput>(
59
- autoFields: Partial<TOutput> | (() => Partial<TOutput>)
60
- ): (input: TInput) => TOutput {
61
- return (input: TInput) => {
62
- const fields: Partial<TOutput> =
63
- typeof autoFields === 'function' ? (autoFields as () => Partial<TOutput>)() : autoFields;
64
- return {
65
- ...input,
66
- ...fields
67
- } as unknown as TOutput;
68
- };
69
- }
70
-
71
- /**
72
- * Merges default values into a DTO. Returns a complete object with all defaults applied.
73
- *
74
- * @example
75
- * ```ts
76
- * const user = withDefaults(body, {
77
- * active: true,
78
- * createdAt: new Date().toISOString()
79
- * });
80
- * ```
81
- */
82
- export function withDefaults<T>(dto: Partial<T>, defaults: T): T {
83
- return {
84
- ...defaults,
85
- ...dto
86
- };
87
- }
88
-
89
- /**
90
- * Creates a withDefaults function with pre-configured defaults.
91
- *
92
- * @example
93
- * ```ts
94
- * const userWithDefaults = withDefaultsBuilder<CreateUserDto>({
95
- * active: true
96
- * });
97
- *
98
- * app.post('/users', (req, res) => {
99
- * const userInput = userWithDefaults(req.body);
100
- * // ...
101
- * });
102
- * ```
103
- */
104
- export function withDefaultsBuilder<T>(
105
- defaults: T | (() => T)
106
- ): (dto: Partial<T>) => T {
107
- return (dto: Partial<T>) => {
108
- const resolvedDefaults: T =
109
- typeof defaults === 'function' ? (defaults as () => T)() : defaults;
110
- return {
111
- ...resolvedDefaults,
112
- ...dto
113
- };
114
- };
115
- }
116
-
117
- /**
118
- * Excludes specified fields from an object. Useful for removing sensitive fields
119
- * from database results before sending to the client.
120
- *
121
- * @example
122
- * ```ts
123
- * const userFromDb = await db.select().from(users).where(...).first();
124
- * const userResponse = exclude(userFromDb, 'passwordHash', 'apiKey');
125
- * ```
126
- */
127
- export function exclude<T extends object, K extends keyof T>(
128
- obj: T,
129
- ...keys: K[]
130
- ): Omit<T, K> {
131
- const result = { ...obj };
132
- for (const key of keys) {
133
- delete result[key];
134
- }
135
- return result as Omit<T, K>;
136
- }
137
-
138
- /**
139
- * Picks only specified fields from an object. Useful for creating DTOs from
140
- * larger database entities.
141
- *
142
- * @example
143
- * ```ts
144
- * const userFromDb = await db.select().from(users).where(...).first();
145
- * const userResponse = pick(userFromDb, 'id', 'name', 'email');
146
- * ```
147
- */
148
- export function pick<T extends object, K extends keyof T>(
149
- obj: T,
150
- ...keys: K[]
151
- ): Pick<T, K> {
152
- const result = {} as Pick<T, K>;
153
- for (const key of keys) {
154
- result[key] = obj[key];
155
- }
156
- return result;
157
- }
158
-
159
- /**
160
- * Maps field names from one DTO to another. Useful when your DTO has different
161
- * field names than your entity (e.g., camelCase vs snake_case).
162
- *
163
- * @example
164
- * ```ts
165
- * type ApiUser = { firstName: string; lastName: string };
166
- * type DbUser = { first_name: string; last_name: string };
167
- *
168
- * const dbUser = mapFields(apiUser, {
169
- * firstName: 'first_name',
170
- * lastName: 'last_name'
171
- * });
172
- * ```
173
- */
174
- type MappedFields<T, M extends Partial<Record<keyof T, string>>> = {
175
- [K in keyof M as M[K] extends string ? M[K] : never]: K extends keyof T ? T[K] : never;
176
- };
177
-
178
- export function mapFields<T extends object, M extends Partial<Record<keyof T, string>>>(
179
- obj: T,
180
- fieldMap: M
181
- ): Omit<T, keyof M> & MappedFields<T, M> {
182
- const result: Record<string, unknown> = {};
183
- const keys = Object.keys(fieldMap) as (keyof T)[];
184
- for (const sourceKey of keys) {
185
- const targetKey = fieldMap[sourceKey];
186
- if (targetKey) {
187
- result[targetKey] = obj[sourceKey];
188
- }
189
- }
190
- // Copy any unmapped fields
191
- for (const [key, value] of Object.entries(obj)) {
192
- if (!(key in fieldMap)) {
193
- result[key] = value;
194
- }
195
- }
196
- return result as Omit<T, keyof M> & MappedFields<T, M>;
197
- }
1
+ /**
2
+ * DTO transformation utilities for working with DTO instances.
3
+ *
4
+ * These helpers make it easier to convert between DTO types, apply defaults,
5
+ * and handle auto-generated fields without manual object construction.
6
+ */
7
+
8
+ // ─────────────────────────────────────────────────────────────────────────────
9
+ // Transform utilities
10
+ // ─────────────────────────────────────────────────────────────────────────────
11
+
12
+ /**
13
+ * Transforms a CreateDto or UpdateDto into a ResponseDto by merging with auto-generated fields.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const newUser: UserResponse = toResponse(body, {
18
+ * id: newId,
19
+ * createdAt: new Date().toISOString()
20
+ * });
21
+ *
22
+ * // Or use the curried form for reuse
23
+ * const createUserResponse = toResponseBuilder<UserCreateDto, UserResponse>({
24
+ * id: () => nextId++,
25
+ * createdAt: () => new Date().toISOString()
26
+ * });
27
+ * const user = createUserResponse(body);
28
+ * ```
29
+ */
30
+ export function toResponse<TInput, TOutput>(
31
+ input: TInput,
32
+ autoFields: Partial<TOutput>
33
+ ): TOutput {
34
+ return {
35
+ ...input,
36
+ ...autoFields
37
+ } as unknown as TOutput;
38
+ }
39
+
40
+ /**
41
+ * Creates a toResponse function with pre-configured auto-fields.
42
+ * Useful for reusing same transformation logic across multiple endpoints.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * const userResponseBuilder = toResponseBuilder<CreateUserDto, UserResponse>({
47
+ * id: () => generateId(),
48
+ * createdAt: () => new Date().toISOString(),
49
+ * active: true
50
+ * });
51
+ *
52
+ * app.post('/users', (req, res) => {
53
+ * const user = userResponseBuilder(req.body);
54
+ * res.status(201).json(user);
55
+ * });
56
+ * ```
57
+ */
58
+ export function toResponseBuilder<TInput, TOutput>(
59
+ autoFields: Partial<TOutput> | (() => Partial<TOutput>)
60
+ ): (input: TInput) => TOutput {
61
+ return (input: TInput) => {
62
+ const fields: Partial<TOutput> =
63
+ typeof autoFields === 'function' ? (autoFields as () => Partial<TOutput>)() : autoFields;
64
+ return {
65
+ ...input,
66
+ ...fields
67
+ } as unknown as TOutput;
68
+ };
69
+ }
70
+
71
+ /**
72
+ * Merges default values into a DTO. Returns a complete object with all defaults applied.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * const user = withDefaults(body, {
77
+ * active: true,
78
+ * createdAt: new Date().toISOString()
79
+ * });
80
+ * ```
81
+ */
82
+ export function withDefaults<T>(dto: Partial<T>, defaults: T): T {
83
+ return {
84
+ ...defaults,
85
+ ...dto
86
+ };
87
+ }
88
+
89
+ /**
90
+ * Creates a withDefaults function with pre-configured defaults.
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * const userWithDefaults = withDefaultsBuilder<CreateUserDto>({
95
+ * active: true
96
+ * });
97
+ *
98
+ * app.post('/users', (req, res) => {
99
+ * const userInput = userWithDefaults(req.body);
100
+ * // ...
101
+ * });
102
+ * ```
103
+ */
104
+ export function withDefaultsBuilder<T>(
105
+ defaults: T | (() => T)
106
+ ): (dto: Partial<T>) => T {
107
+ return (dto: Partial<T>) => {
108
+ const resolvedDefaults: T =
109
+ typeof defaults === 'function' ? (defaults as () => T)() : defaults;
110
+ return {
111
+ ...resolvedDefaults,
112
+ ...dto
113
+ };
114
+ };
115
+ }
116
+
117
+ /**
118
+ * Excludes specified fields from an object. Useful for removing sensitive fields
119
+ * from database results before sending to the client.
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * const userFromDb = await db.select().from(users).where(...).first();
124
+ * const userResponse = exclude(userFromDb, 'passwordHash', 'apiKey');
125
+ * ```
126
+ */
127
+ export function exclude<T extends object, K extends keyof T>(
128
+ obj: T,
129
+ ...keys: K[]
130
+ ): Omit<T, K> {
131
+ const result = { ...obj };
132
+ for (const key of keys) {
133
+ delete result[key];
134
+ }
135
+ return result as Omit<T, K>;
136
+ }
137
+
138
+ /**
139
+ * Picks only specified fields from an object. Useful for creating DTOs from
140
+ * larger database entities.
141
+ *
142
+ * @example
143
+ * ```ts
144
+ * const userFromDb = await db.select().from(users).where(...).first();
145
+ * const userResponse = pick(userFromDb, 'id', 'name', 'email');
146
+ * ```
147
+ */
148
+ export function pick<T extends object, K extends keyof T>(
149
+ obj: T,
150
+ ...keys: K[]
151
+ ): Pick<T, K> {
152
+ const result = {} as Pick<T, K>;
153
+ for (const key of keys) {
154
+ result[key] = obj[key];
155
+ }
156
+ return result;
157
+ }
158
+
159
+ /**
160
+ * Maps field names from one DTO to another. Useful when your DTO has different
161
+ * field names than your entity (e.g., camelCase vs snake_case).
162
+ *
163
+ * @example
164
+ * ```ts
165
+ * type ApiUser = { firstName: string; lastName: string };
166
+ * type DbUser = { first_name: string; last_name: string };
167
+ *
168
+ * const dbUser = mapFields(apiUser, {
169
+ * firstName: 'first_name',
170
+ * lastName: 'last_name'
171
+ * });
172
+ * ```
173
+ */
174
+ type MappedFields<T, M extends Partial<Record<keyof T, string>>> = {
175
+ [K in keyof M as M[K] extends string ? M[K] : never]: K extends keyof T ? T[K] : never;
176
+ };
177
+
178
+ export function mapFields<T extends object, M extends Partial<Record<keyof T, string>>>(
179
+ obj: T,
180
+ fieldMap: M
181
+ ): Omit<T, keyof M> & MappedFields<T, M> {
182
+ const result: Record<string, unknown> = {};
183
+ const keys = Object.keys(fieldMap) as (keyof T)[];
184
+ for (const sourceKey of keys) {
185
+ const targetKey = fieldMap[sourceKey];
186
+ if (targetKey) {
187
+ result[targetKey] = obj[sourceKey];
188
+ }
189
+ }
190
+ // Copy any unmapped fields
191
+ for (const [key, value] of Object.entries(obj)) {
192
+ if (!(key in fieldMap)) {
193
+ result[key] = value;
194
+ }
195
+ }
196
+ return result as Omit<T, keyof M> & MappedFields<T, M>;
197
+ }
package/src/index.ts CHANGED
@@ -1,86 +1,86 @@
1
- /**
2
- * MetalORM core exports.
3
- * Provides schema definition, query building, and ORM capabilities.
4
- */
5
- export * from './schema/table.js';
6
- export * from './schema/column-types.js';
7
- export * from './schema/relation.js';
8
- export * from './schema/types.js';
9
- export * from './query-builder/select.js';
10
- export * from './query-builder/select-helpers.js';
11
- export * from './query-builder/insert.js';
12
- export * from './query-builder/update.js';
13
- export * from './query-builder/delete.js';
14
- export * from './query-builder/procedure-call.js';
15
- export * from './query/index.js';
16
- export * from './core/ast/expression.js';
17
- export * from './core/ast/procedure.js';
18
- export * from './core/ast/window-functions.js';
19
- export * from './core/hydration/types.js';
20
- export * from './core/dialect/mysql/index.js';
21
- export * from './core/dialect/mssql/index.js';
22
- export * from './core/dialect/sqlite/index.js';
23
- export * from './core/dialect/postgres/index.js';
24
- export * from './core/ddl/schema-generator.js';
25
- export * from './core/ddl/schema-types.js';
26
- export * from './core/ddl/schema-diff.js';
27
- export * from './core/ddl/schema-introspect.js';
28
- export * from './core/ddl/introspect/registry.js';
29
- export * from './core/functions/text.js';
30
- export * from './core/functions/numeric.js';
31
- export * from './core/functions/datetime.js';
32
- export * from './core/functions/control-flow.js';
33
- export * from './core/functions/json.js';
34
- export * from './core/functions/array.js';
35
- export * from './orm/als.js';
36
- export * from './orm/hydration.js';
37
- export * from './codegen/typescript.js';
38
- export * from './orm/orm-session.js';
39
- export * from './orm/orm.js';
40
- export * from './orm/column-introspection.js';
41
- export * from './orm/entity.js';
42
- export * from './orm/lazy-batch.js';
43
- export * from './orm/relations/has-many.js';
44
- export * from './orm/relations/belongs-to.js';
45
- export * from './orm/relations/many-to-many.js';
46
- export * from './orm/relations/morph-one.js';
47
- export * from './orm/relations/morph-many.js';
48
- export * from './orm/relations/morph-to.js';
49
- export * from './orm/execute.js';
50
- export * from './orm/execute-procedure.js';
51
- export type { EntityContext } from './orm/entity-context.js';
52
- export type { PrimaryKey as EntityPrimaryKey } from './orm/entity-context.js';
53
- export * from './orm/execution-context.js';
54
- export * from './orm/hydration-context.js';
55
- export * from './orm/domain-event-bus.js';
56
- export * from './orm/runtime-types.js';
57
- export * from './orm/query-logger.js';
58
- export * from './orm/interceptor-pipeline.js';
59
- export * from './orm/jsonify.js';
60
- export * from './orm/save-graph-types.js';
61
- export * from './decorators/index.js';
62
-
63
- // NEW: execution abstraction + helpers
64
- export * from './core/execution/db-executor.js';
65
- export * from './core/execution/pooling/pool-types.js';
66
- export * from './core/execution/pooling/pool.js';
67
- export * from './core/execution/executors/postgres-executor.js';
68
- export * from './core/execution/executors/mysql-executor.js';
69
- export * from './core/execution/executors/sqlite-executor.js';
70
- export * from './core/execution/executors/better-sqlite3-executor.js';
71
- export * from './core/execution/executors/mssql-executor.js';
72
-
73
- // NEW: first-class pooling integration
74
- export * from './orm/pooled-executor-factory.js';
75
-
76
- // DTO module for REST API integration
77
- export * from './dto/index.js';
78
-
79
- // Tree behavior (Nested Set / MPTT)
80
- export * from './tree/index.js';
81
-
82
- // Cache module
83
- export * from './cache/index.js';
84
-
85
- // Bulk operations module
86
- export * from './bulk/index.js';
1
+ /**
2
+ * MetalORM core exports.
3
+ * Provides schema definition, query building, and ORM capabilities.
4
+ */
5
+ export * from './schema/table.js';
6
+ export * from './schema/column-types.js';
7
+ export * from './schema/relation.js';
8
+ export * from './schema/types.js';
9
+ export * from './query-builder/select.js';
10
+ export * from './query-builder/select-helpers.js';
11
+ export * from './query-builder/insert.js';
12
+ export * from './query-builder/update.js';
13
+ export * from './query-builder/delete.js';
14
+ export * from './query-builder/procedure-call.js';
15
+ export * from './query/index.js';
16
+ export * from './core/ast/expression.js';
17
+ export * from './core/ast/procedure.js';
18
+ export * from './core/ast/window-functions.js';
19
+ export * from './core/hydration/types.js';
20
+ export * from './core/dialect/mysql/index.js';
21
+ export * from './core/dialect/mssql/index.js';
22
+ export * from './core/dialect/sqlite/index.js';
23
+ export * from './core/dialect/postgres/index.js';
24
+ export * from './core/ddl/schema-generator.js';
25
+ export * from './core/ddl/schema-types.js';
26
+ export * from './core/ddl/schema-diff.js';
27
+ export * from './core/ddl/schema-introspect.js';
28
+ export * from './core/ddl/introspect/registry.js';
29
+ export * from './core/functions/text.js';
30
+ export * from './core/functions/numeric.js';
31
+ export * from './core/functions/datetime.js';
32
+ export * from './core/functions/control-flow.js';
33
+ export * from './core/functions/json.js';
34
+ export * from './core/functions/array.js';
35
+ export * from './orm/als.js';
36
+ export * from './orm/hydration.js';
37
+ export * from './codegen/typescript.js';
38
+ export * from './orm/orm-session.js';
39
+ export * from './orm/orm.js';
40
+ export * from './orm/column-introspection.js';
41
+ export * from './orm/entity.js';
42
+ export * from './orm/lazy-batch.js';
43
+ export * from './orm/relations/has-many.js';
44
+ export * from './orm/relations/belongs-to.js';
45
+ export * from './orm/relations/many-to-many.js';
46
+ export * from './orm/relations/morph-one.js';
47
+ export * from './orm/relations/morph-many.js';
48
+ export * from './orm/relations/morph-to.js';
49
+ export * from './orm/execute.js';
50
+ export * from './orm/execute-procedure.js';
51
+ export type { EntityContext } from './orm/entity-context.js';
52
+ export type { PrimaryKey as EntityPrimaryKey } from './orm/entity-context.js';
53
+ export * from './orm/execution-context.js';
54
+ export * from './orm/hydration-context.js';
55
+ export * from './orm/domain-event-bus.js';
56
+ export * from './orm/runtime-types.js';
57
+ export * from './orm/query-logger.js';
58
+ export * from './orm/interceptor-pipeline.js';
59
+ export * from './orm/jsonify.js';
60
+ export * from './orm/save-graph-types.js';
61
+ export * from './decorators/index.js';
62
+
63
+ // NEW: execution abstraction + helpers
64
+ export * from './core/execution/db-executor.js';
65
+ export * from './core/execution/pooling/pool-types.js';
66
+ export * from './core/execution/pooling/pool.js';
67
+ export * from './core/execution/executors/postgres-executor.js';
68
+ export * from './core/execution/executors/mysql-executor.js';
69
+ export * from './core/execution/executors/sqlite-executor.js';
70
+ export * from './core/execution/executors/better-sqlite3-executor.js';
71
+ export * from './core/execution/executors/mssql-executor.js';
72
+
73
+ // NEW: first-class pooling integration
74
+ export * from './orm/pooled-executor-factory.js';
75
+
76
+ // DTO module for REST API integration
77
+ export * from './dto/index.js';
78
+
79
+ // Tree behavior (Nested Set / MPTT)
80
+ export * from './tree/index.js';
81
+
82
+ // Cache module
83
+ export * from './cache/index.js';
84
+
85
+ // Bulk operations module
86
+ export * from './bulk/index.js';