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
|
@@ -1,153 +1,159 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tree Detection for Entity Generation
|
|
3
|
-
*
|
|
4
|
-
* Detects if a table is a tree table based on column patterns and relationships.
|
|
5
|
-
* A tree table typically has:
|
|
6
|
-
* - Parent column (nullable self-referencing foreign key)
|
|
7
|
-
* - Left boundary column (integer)
|
|
8
|
-
* - Right boundary column (integer)
|
|
9
|
-
* - Optional depth column (integer)
|
|
10
|
-
* - Optional scope columns for multi-tree tables
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Detects if a table is a tree table based on column patterns.
|
|
15
|
-
* @param {Object} table - The table schema
|
|
16
|
-
* @param {Object} naming - Naming strategy instance
|
|
17
|
-
* @returns {Object|null} Tree configuration if detected, null otherwise
|
|
18
|
-
*/
|
|
19
|
-
export const detectTreeTable = (table, naming) => {
|
|
20
|
-
const columns = table.columns
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Tree Detection for Entity Generation
|
|
3
|
+
*
|
|
4
|
+
* Detects if a table is a tree table based on column patterns and relationships.
|
|
5
|
+
* A tree table typically has:
|
|
6
|
+
* - Parent column (nullable self-referencing foreign key)
|
|
7
|
+
* - Left boundary column (integer)
|
|
8
|
+
* - Right boundary column (integer)
|
|
9
|
+
* - Optional depth column (integer)
|
|
10
|
+
* - Optional scope columns for multi-tree tables
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Detects if a table is a tree table based on column patterns.
|
|
15
|
+
* @param {Object} table - The table schema
|
|
16
|
+
* @param {Object} naming - Naming strategy instance
|
|
17
|
+
* @returns {Object|null} Tree configuration if detected, null otherwise
|
|
18
|
+
*/
|
|
19
|
+
export const detectTreeTable = (table, naming) => {
|
|
20
|
+
const columns = Array.isArray(table?.columns) ? table.columns : [];
|
|
21
|
+
const getColumnName = column =>
|
|
22
|
+
column && typeof column.name === 'string' && column.name.trim().length > 0 ? column.name : undefined;
|
|
23
|
+
|
|
24
|
+
// Common patterns for tree columns
|
|
25
|
+
const parentPatterns = ['parentId', 'parent_id', 'parent'];
|
|
26
|
+
const leftPatterns = ['lft', 'left', 'leftValue', 'left_value'];
|
|
27
|
+
const rightPatterns = ['rght', 'right', 'rightValue', 'right_value'];
|
|
28
|
+
const depthPatterns = ['depth', 'level', 'treeLevel', 'tree_level', 'cod_nivel'];
|
|
29
|
+
|
|
30
|
+
const matchesTreePattern = (column, patterns, term) => {
|
|
31
|
+
const name = getColumnName(column);
|
|
32
|
+
if (!name) return false;
|
|
33
|
+
return patterns.includes(name) || name.toLowerCase().includes(term);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Find matching columns
|
|
37
|
+
const parentCol = columns.find(c => matchesTreePattern(c, parentPatterns, 'parent'));
|
|
38
|
+
|
|
39
|
+
const leftCol = columns.find(c => matchesTreePattern(c, leftPatterns, 'left'));
|
|
40
|
+
|
|
41
|
+
const rightCol = columns.find(c => matchesTreePattern(c, rightPatterns, 'right'));
|
|
42
|
+
|
|
43
|
+
const depthCol = columns.find(c => {
|
|
44
|
+
const name = getColumnName(c);
|
|
45
|
+
if (!name) return false;
|
|
46
|
+
return (
|
|
47
|
+
depthPatterns.includes(name) ||
|
|
48
|
+
name.toLowerCase().includes('depth') ||
|
|
49
|
+
name.toLowerCase().includes('level') ||
|
|
50
|
+
name.toLowerCase().includes('nivel')
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Validate: must have parent, left, and right columns
|
|
55
|
+
if (!parentCol || !leftCol || !rightCol) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Validate: parent should be nullable and reference the same table
|
|
60
|
+
const isSelfReferencing = parentCol.references?.table === table.name ||
|
|
61
|
+
parentCol.references?.table === `dbo.${table.name}` ||
|
|
62
|
+
parentCol.references?.table === `[dbo].[${table.name}]`;
|
|
63
|
+
const isNullable = !parentCol.notNull;
|
|
64
|
+
|
|
65
|
+
if (!isSelfReferencing || !isNullable) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Validate: left and right should be integer types
|
|
70
|
+
const leftType = (leftCol.type || '').toLowerCase();
|
|
71
|
+
const rightType = (rightCol.type || '').toLowerCase();
|
|
72
|
+
const isLeftInt = leftType.includes('int');
|
|
73
|
+
const isRightInt = rightType.includes('int');
|
|
74
|
+
|
|
75
|
+
if (!isLeftInt || !isRightInt) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Build tree configuration
|
|
80
|
+
const config = {
|
|
81
|
+
parentKey: parentCol.name,
|
|
82
|
+
leftKey: leftCol.name,
|
|
83
|
+
rightKey: rightCol.name,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// Add depth column if found
|
|
87
|
+
if (depthCol) {
|
|
88
|
+
config.depthKey = depthCol.name;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Detect scope columns (columns that might be used for multi-tree scoping)
|
|
92
|
+
const scopeColumns = columns.filter(c => {
|
|
93
|
+
const name = getColumnName(c);
|
|
94
|
+
if (!name) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
// Skip tree columns and primary key
|
|
98
|
+
if (name === config.parentKey || name === config.leftKey ||
|
|
99
|
+
name === config.rightKey || name === config.depthKey) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
// Skip if it's the primary key
|
|
103
|
+
if (table.primaryKey?.includes(name)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
// Skip if it has a foreign key to another table
|
|
107
|
+
if (c.references && c.references.table !== table.name) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Look for columns that might be scope columns (e.g., tenantId, organizationId)
|
|
111
|
+
const scopePatterns = ['tenant', 'organization', 'company', 'site', 'workspace'];
|
|
112
|
+
return scopePatterns.some(pattern => name.toLowerCase().includes(pattern));
|
|
113
|
+
}).map(c => getColumnName(c)).filter(Boolean);
|
|
114
|
+
|
|
115
|
+
if (scopeColumns.length > 0) {
|
|
116
|
+
config.scope = scopeColumns;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return config;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Maps all tree tables in the schema.
|
|
124
|
+
* @param {Array} tables - Array of table schemas
|
|
125
|
+
* @param {Object} naming - Naming strategy instance
|
|
126
|
+
* @returns {Map} Map of table name to tree configuration
|
|
127
|
+
*/
|
|
128
|
+
export const mapTreeTables = (tables, naming) => {
|
|
129
|
+
const treeMap = new Map();
|
|
130
|
+
|
|
131
|
+
for (const table of Array.isArray(tables) ? tables : []) {
|
|
132
|
+
const treeConfig = detectTreeTable(table, naming);
|
|
133
|
+
if (treeConfig && table && typeof table.name === 'string' && table.name.trim().length > 0) {
|
|
134
|
+
treeMap.set(table.name, treeConfig);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return treeMap;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Gets tree configuration for a specific table.
|
|
143
|
+
* @param {string} tableName - The table name
|
|
144
|
+
* @param {Map} treeMap - The tree configuration map
|
|
145
|
+
* @returns {Object|null} Tree configuration if the table is a tree, null otherwise
|
|
146
|
+
*/
|
|
147
|
+
export const getTreeConfig = (tableName, treeMap) => {
|
|
148
|
+
return treeMap.get(tableName) || null;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Checks if a table is a tree table.
|
|
153
|
+
* @param {string} tableName - The table name
|
|
154
|
+
* @param {Map} treeMap - The tree configuration map
|
|
155
|
+
* @returns {boolean} True if the table is a tree table
|
|
156
|
+
*/
|
|
157
|
+
export const isTreeTable = (tableName, treeMap) => {
|
|
158
|
+
return treeMap.has(tableName);
|
|
159
|
+
};
|