metal-orm 1.1.10 → 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.
- package/README.md +758 -769
- package/dist/index.cjs +106 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +106 -43
- package/dist/index.js.map +1 -1
- package/package.json +100 -96
- package/scripts/generate-entities/render.mjs +21 -12
- package/scripts/generate-entities/schema.mjs +209 -195
- package/scripts/generate-entities/tree-detection.mjs +159 -153
- package/scripts/inflection/pt-br.mjs +468 -468
- package/scripts/run-eslint.mjs +33 -34
- package/scripts/show-sql-seed.sql +102 -0
- package/scripts/show-sql.mjs +321 -325
- package/src/bulk/bulk-delete-executor.ts +3 -5
- package/src/bulk/bulk-insert-executor.ts +7 -7
- package/src/bulk/bulk-update-executor.ts +2 -2
- package/src/bulk/bulk-upsert-executor.ts +5 -7
- package/src/codegen/naming-strategy.ts +54 -54
- package/src/codegen/typescript.ts +482 -482
- package/src/core/ast/adapters.ts +1 -1
- package/src/core/ast/builders.ts +123 -123
- package/src/core/ast/expression-builders.ts +745 -745
- package/src/core/ast/expression-nodes.ts +304 -304
- package/src/core/ast/expression-visitor.ts +212 -212
- package/src/core/ast/expression.ts +20 -20
- package/src/core/ast/helpers.ts +14 -14
- package/src/core/ast/join.ts +18 -18
- package/src/core/ast/query.ts +200 -200
- package/src/core/ddl/dialects/base-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/mssql-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/mysql-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/postgres-schema-dialect.ts +1 -1
- package/src/core/ddl/dialects/render-reference.test.ts +70 -70
- package/src/core/ddl/dialects/sqlite-schema-dialect.ts +1 -1
- package/src/core/ddl/introspect/catalogs/index.ts +5 -5
- package/src/core/ddl/introspect/catalogs/postgres.ts +146 -146
- package/src/core/ddl/introspect/context.ts +15 -15
- package/src/core/ddl/introspect/functions/postgres.ts +35 -35
- package/src/core/ddl/introspect/mysql.ts +113 -36
- package/src/core/ddl/introspect/registry.ts +40 -40
- package/src/core/ddl/introspect/run-select.ts +35 -35
- package/src/core/ddl/introspect/utils.ts +56 -56
- package/src/core/ddl/naming-strategy.ts +16 -16
- package/src/core/ddl/schema-dialect.ts +56 -56
- package/src/core/ddl/schema-diff.ts +234 -234
- package/src/core/ddl/schema-generator.ts +1 -1
- package/src/core/ddl/schema-introspect.ts +25 -25
- package/src/core/ddl/sql-writing.ts +171 -171
- package/src/core/dialect/abstract.ts +541 -541
- package/src/core/dialect/base/cte-compiler.ts +33 -33
- package/src/core/dialect/base/function-table-formatter.ts +103 -103
- package/src/core/dialect/base/groupby-compiler.ts +21 -21
- package/src/core/dialect/base/join-compiler.ts +25 -25
- package/src/core/dialect/base/orderby-compiler.ts +35 -35
- package/src/core/dialect/base/pagination-strategy.ts +32 -32
- package/src/core/dialect/base/returning-strategy.ts +57 -57
- package/src/core/dialect/base/sql-dialect.ts +294 -294
- package/src/core/dialect/dialect-factory.ts +91 -91
- package/src/core/dialect/mssql/functions.ts +120 -120
- package/src/core/dialect/mssql/index.ts +317 -317
- package/src/core/dialect/mysql/functions.ts +103 -103
- package/src/core/dialect/mysql/index.ts +105 -105
- package/src/core/dialect/postgres/functions.ts +108 -108
- package/src/core/dialect/postgres/index.ts +91 -91
- package/src/core/dialect/sqlite/functions.ts +129 -129
- package/src/core/dialect/sqlite/index.ts +67 -67
- package/src/core/driver/database-driver.ts +19 -19
- package/src/core/driver/mssql-driver.ts +23 -23
- package/src/core/driver/mysql-driver.ts +23 -23
- package/src/core/driver/postgres-driver.ts +23 -23
- package/src/core/driver/sqlite-driver.ts +23 -23
- package/src/core/execution/db-executor.ts +92 -92
- package/src/core/execution/executors/better-sqlite3-executor.ts +94 -94
- package/src/core/execution/executors/mssql-executor.ts +184 -184
- package/src/core/execution/executors/mysql-executor.ts +88 -88
- package/src/core/execution/executors/postgres-executor.ts +26 -26
- package/src/core/execution/executors/sqlite-executor.ts +42 -42
- package/src/core/execution/pooling/pool-types.ts +30 -30
- package/src/core/execution/pooling/pool.ts +275 -275
- package/src/core/functions/array.ts +35 -35
- package/src/core/functions/control-flow.ts +79 -79
- package/src/core/functions/datetime.ts +237 -237
- package/src/core/functions/json.ts +70 -70
- package/src/core/functions/numeric.ts +297 -297
- package/src/core/functions/text.ts +334 -334
- package/src/core/functions/types.ts +33 -33
- package/src/core/hydration/types.ts +51 -51
- package/src/core/sql/sql-operator-config.ts +39 -39
- package/src/core/sql/sql.ts +152 -152
- package/src/decorators/column-decorator.ts +87 -87
- package/src/decorators/decorator-metadata.ts +143 -143
- package/src/decorators/entity.ts +93 -93
- package/src/decorators/index.ts +39 -39
- package/src/decorators/relations.ts +231 -231
- package/src/decorators/transformers/built-in/string-transformers.ts +231 -231
- package/src/decorators/transformers/transformer-decorators.ts +134 -134
- package/src/decorators/transformers/transformer-executor.ts +171 -171
- package/src/decorators/transformers/transformer-metadata.ts +73 -73
- package/src/decorators/validators/built-in/br-cep-validator.ts +55 -55
- package/src/decorators/validators/built-in/br-cnpj-validator.ts +105 -105
- package/src/decorators/validators/built-in/br-cpf-validator.ts +103 -103
- package/src/decorators/validators/country-validator-registry.ts +64 -64
- package/src/decorators/validators/country-validators-decorators.ts +203 -203
- package/src/decorators/validators/country-validators.ts +105 -105
- package/src/decorators/validators/validator-metadata.ts +59 -59
- package/src/dto/dto-types.ts +226 -226
- package/src/dto/filter-types.ts +141 -141
- package/src/dto/index.ts +95 -95
- package/src/dto/openapi/generators/base.ts +29 -29
- package/src/dto/openapi/generators/column.ts +37 -37
- package/src/dto/openapi/generators/dto.ts +91 -91
- package/src/dto/openapi/generators/filter.ts +75 -75
- package/src/dto/openapi/generators/nested-dto.ts +618 -618
- package/src/dto/openapi/generators/pagination.ts +111 -111
- package/src/dto/openapi/generators/relation-filter.ts +228 -228
- package/src/dto/openapi/index.ts +12 -12
- package/src/dto/openapi/types.ts +101 -101
- package/src/dto/openapi/utilities.ts +95 -95
- package/src/dto/pagination-utils.ts +150 -150
- package/src/dto/transform.ts +197 -197
- package/src/index.ts +86 -86
- package/src/orm/als.ts +58 -58
- package/src/orm/domain-event-bus.ts +119 -119
- package/src/orm/entity-context.ts +86 -86
- package/src/orm/entity-materializer.ts +159 -159
- package/src/orm/entity-meta.ts +97 -97
- package/src/orm/entity-registry.ts +39 -39
- package/src/orm/entity-relation-cache.ts +39 -39
- package/src/orm/execute.ts +194 -194
- package/src/orm/execution-context.ts +18 -18
- package/src/orm/hydration-context.ts +26 -26
- package/src/orm/hydration.ts +112 -112
- package/src/orm/identity-map.ts +61 -61
- package/src/orm/interceptor-pipeline.ts +16 -16
- package/src/orm/lazy-batch/belongs-to-many.ts +119 -119
- package/src/orm/lazy-batch/belongs-to.ts +108 -108
- package/src/orm/lazy-batch/has-many.ts +69 -69
- package/src/orm/lazy-batch/has-one.ts +68 -68
- package/src/orm/lazy-batch/shared.ts +125 -125
- package/src/orm/orm-session.ts +620 -620
- package/src/orm/orm.ts +34 -34
- package/src/orm/pooled-executor-factory.ts +121 -121
- package/src/orm/query-logger.ts +40 -40
- package/src/orm/relation-change-processor.ts +420 -420
- package/src/orm/relations/belongs-to.ts +143 -143
- package/src/orm/relations/has-many.ts +204 -204
- package/src/orm/relations/has-one.ts +174 -174
- package/src/orm/relations/many-to-many.ts +288 -288
- package/src/orm/relations/morph-many.ts +156 -156
- package/src/orm/relations/morph-one.ts +151 -151
- package/src/orm/relations/morph-to.ts +162 -162
- package/src/orm/runtime-types.ts +92 -92
- package/src/orm/save-graph.ts +561 -561
- package/src/orm/transaction-runner.ts +24 -24
- package/src/orm/unit-of-work.ts +426 -426
- package/src/query/index.ts +69 -69
- package/src/query/target.ts +46 -46
- package/src/query-builder/column-selector.ts +81 -81
- package/src/query-builder/delete.ts +141 -141
- package/src/query-builder/insert-query-state.ts +149 -149
- package/src/query-builder/insert.ts +117 -117
- package/src/query-builder/query-ast-service.ts +287 -287
- package/src/query-builder/query-resolution.ts +78 -78
- package/src/query-builder/raw-column-parser.ts +38 -38
- package/src/query-builder/relation-filter-utils.ts +153 -153
- package/src/query-builder/relation-join-planner.ts +10 -10
- package/src/query-builder/relation-manager.ts +87 -87
- package/src/query-builder/relation-projection-helper.ts +102 -102
- package/src/query-builder/relation-types.ts +9 -9
- package/src/query-builder/relation-utils.ts +15 -15
- package/src/query-builder/select/cte-facet.ts +40 -40
- package/src/query-builder/select/from-facet.ts +80 -80
- package/src/query-builder/select/join-facet.ts +62 -62
- package/src/query-builder/select/predicate-facet.ts +104 -104
- package/src/query-builder/select/projection-facet.ts +70 -70
- package/src/query-builder/select/relation-facet.ts +81 -81
- package/src/query-builder/select/setop-facet.ts +36 -36
- package/src/query-builder/select-helpers.ts +1 -1
- package/src/query-builder/select-query-builder-deps.ts +130 -130
- package/src/query-builder/select-query-state.ts +207 -207
- package/src/query-builder/update.ts +151 -151
- package/src/schema/column-types.ts +322 -322
- package/src/schema/table-guards.ts +37 -37
- package/src/schema/table.ts +281 -281
- package/src/tree/index.ts +13 -13
- package/src/tree/nested-set-strategy.ts +545 -545
- package/src/tree/tree-decorator.ts +397 -397
- package/src/tree/tree-manager.ts +754 -754
- package/src/tree/tree-query.ts +427 -427
- package/src/tree/tree-types.ts +299 -299
package/src/dto/transform.ts
CHANGED
|
@@ -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';
|