metal-orm 1.1.11 → 1.1.18
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.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +100 -96
- package/scripts/generate-entities/schema.mjs +122 -122
- package/scripts/generate-entities/tree-detection.mjs +92 -92
- 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/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/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 +90 -90
- 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/core/ast/query.ts
CHANGED
|
@@ -1,166 +1,166 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AliasRefNode,
|
|
3
|
-
CaseExpressionNode,
|
|
4
|
-
CastExpressionNode,
|
|
5
|
-
ColumnNode,
|
|
6
|
-
ExpressionNode,
|
|
7
|
-
FunctionNode,
|
|
8
|
-
OperandNode,
|
|
9
|
-
ScalarSubqueryNode,
|
|
10
|
-
WindowFunctionNode
|
|
11
|
-
} from './expression.js';
|
|
12
|
-
import { JoinNode } from './join.js';
|
|
13
|
-
import { OrderDirection } from '../sql/sql.js';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* AST node representing a table reference in a query
|
|
17
|
-
*/
|
|
18
|
-
export interface TableNode {
|
|
19
|
-
type: 'Table';
|
|
20
|
-
/** Table name */
|
|
21
|
-
name: string;
|
|
22
|
-
/** Optional schema name */
|
|
23
|
-
schema?: string;
|
|
24
|
-
/** Optional table alias */
|
|
25
|
-
alias?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* AST node representing a function used as a table source (table-valued function)
|
|
30
|
-
*/
|
|
31
|
-
export interface FunctionTableNode {
|
|
32
|
-
type: 'FunctionTable';
|
|
33
|
-
// Canonical "intent" for dialect-aware table functions (tvf).
|
|
34
|
-
// If set, compiler resolves via TableFunctionStrategy and can fail fast.
|
|
35
|
-
key?: string;
|
|
36
|
-
/** Function name */
|
|
37
|
-
name: string;
|
|
38
|
-
/** Optional schema for the function (some dialects) */
|
|
39
|
-
schema?: string;
|
|
40
|
-
/** Function arguments as operand nodes */
|
|
41
|
-
args?: OperandNode[];
|
|
42
|
-
/** Optional alias for the function table */
|
|
43
|
-
alias?: string;
|
|
44
|
-
/** LATERAL flag */
|
|
45
|
-
lateral?: boolean;
|
|
46
|
-
/** WITH ORDINALITY flag */
|
|
47
|
-
withOrdinality?: boolean;
|
|
48
|
-
/** Optional column aliases */
|
|
49
|
-
columnAliases?: string[];
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* AST node representing a derived table (subquery with an alias)
|
|
54
|
-
*/
|
|
55
|
-
export interface DerivedTableNode {
|
|
56
|
-
type: 'DerivedTable';
|
|
57
|
-
/** Subquery providing the rows */
|
|
58
|
-
query: SelectQueryNode;
|
|
59
|
-
/** Required alias for the derived table */
|
|
60
|
-
alias: string;
|
|
61
|
-
/** Optional column aliases */
|
|
62
|
-
columnAliases?: string[];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export type TableSourceNode = TableNode | FunctionTableNode | DerivedTableNode;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Any expression that can appear in ORDER BY / GROUP BY terms.
|
|
69
|
-
*/
|
|
70
|
-
export type OrderingTerm = OperandNode | ExpressionNode | AliasRefNode;
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* AST node representing an ORDER BY clause
|
|
74
|
-
*/
|
|
75
|
-
export interface OrderByNode {
|
|
76
|
-
type: 'OrderBy';
|
|
77
|
-
/** Expression/operand/alias to order by */
|
|
78
|
-
term: OrderingTerm;
|
|
79
|
-
/** Order direction (ASC or DESC) */
|
|
80
|
-
direction: OrderDirection;
|
|
81
|
-
/** Optional nulls ordering (NULLS FIRST/LAST) */
|
|
82
|
-
nulls?: 'FIRST' | 'LAST';
|
|
83
|
-
/** Optional collation */
|
|
84
|
-
collation?: string;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* AST node representing a Common Table Expression (CTE)
|
|
89
|
-
*/
|
|
90
|
-
export interface CommonTableExpressionNode {
|
|
91
|
-
type: 'CommonTableExpression';
|
|
92
|
-
/** CTE name */
|
|
93
|
-
name: string;
|
|
94
|
-
/** Optional column names */
|
|
95
|
-
columns?: string[];
|
|
96
|
-
/** CTE query */
|
|
97
|
-
query: SelectQueryNode;
|
|
98
|
-
/** Whether the CTE is recursive */
|
|
99
|
-
recursive: boolean;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Supported set operation kinds for compound SELECT queries
|
|
104
|
-
*/
|
|
105
|
-
export type SetOperationKind = 'UNION' | 'UNION ALL' | 'INTERSECT' | 'EXCEPT';
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* AST node representing a set operation (UNION, INTERSECT, etc.)
|
|
109
|
-
*/
|
|
110
|
-
export interface SetOperationNode {
|
|
111
|
-
type: 'SetOperation';
|
|
112
|
-
/** Operator to combine queries */
|
|
113
|
-
operator: SetOperationKind;
|
|
114
|
-
/** Right-hand query in the compound expression */
|
|
115
|
-
query: SelectQueryNode;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* AST node representing a complete SELECT query
|
|
120
|
-
*/
|
|
121
|
-
export interface SelectQueryNode {
|
|
122
|
-
type: 'SelectQuery';
|
|
123
|
-
/** Optional CTEs (WITH clauses) */
|
|
124
|
-
ctes?: CommonTableExpressionNode[];
|
|
125
|
-
/** FROM clause table (either a Table or a FunctionTable) */
|
|
126
|
-
from: TableSourceNode;
|
|
127
|
-
/** SELECT clause columns */
|
|
128
|
-
columns: (
|
|
129
|
-
ColumnNode |
|
|
130
|
-
FunctionNode |
|
|
131
|
-
ScalarSubqueryNode |
|
|
132
|
-
CaseExpressionNode |
|
|
133
|
-
CastExpressionNode |
|
|
134
|
-
WindowFunctionNode
|
|
135
|
-
)[];
|
|
136
|
-
/** JOIN clauses */
|
|
137
|
-
joins: JoinNode[];
|
|
138
|
-
/** Optional WHERE clause */
|
|
139
|
-
where?: ExpressionNode;
|
|
140
|
-
/** Optional GROUP BY clause */
|
|
141
|
-
groupBy?: OrderingTerm[];
|
|
142
|
-
/** Optional HAVING clause */
|
|
143
|
-
having?: ExpressionNode;
|
|
144
|
-
/** Optional ORDER BY clause */
|
|
145
|
-
orderBy?: OrderByNode[];
|
|
146
|
-
/** Optional LIMIT clause */
|
|
147
|
-
limit?: number;
|
|
148
|
-
/** Optional OFFSET clause */
|
|
149
|
-
offset?: number;
|
|
150
|
-
/** Optional query metadata */
|
|
151
|
-
meta?: Record<string, unknown>;
|
|
152
|
-
/** Optional DISTINCT clause */
|
|
153
|
-
distinct?: ColumnNode[];
|
|
154
|
-
/** Optional set operations chaining this query with others */
|
|
155
|
-
setOps?: SetOperationNode[];
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export interface InsertValuesSourceNode {
|
|
159
|
-
type: 'InsertValues';
|
|
160
|
-
/** Rows of values for INSERT rows */
|
|
161
|
-
rows: OperandNode[][];
|
|
162
|
-
}
|
|
163
|
-
|
|
1
|
+
import {
|
|
2
|
+
AliasRefNode,
|
|
3
|
+
CaseExpressionNode,
|
|
4
|
+
CastExpressionNode,
|
|
5
|
+
ColumnNode,
|
|
6
|
+
ExpressionNode,
|
|
7
|
+
FunctionNode,
|
|
8
|
+
OperandNode,
|
|
9
|
+
ScalarSubqueryNode,
|
|
10
|
+
WindowFunctionNode
|
|
11
|
+
} from './expression.js';
|
|
12
|
+
import { JoinNode } from './join.js';
|
|
13
|
+
import { OrderDirection } from '../sql/sql.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* AST node representing a table reference in a query
|
|
17
|
+
*/
|
|
18
|
+
export interface TableNode {
|
|
19
|
+
type: 'Table';
|
|
20
|
+
/** Table name */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Optional schema name */
|
|
23
|
+
schema?: string;
|
|
24
|
+
/** Optional table alias */
|
|
25
|
+
alias?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* AST node representing a function used as a table source (table-valued function)
|
|
30
|
+
*/
|
|
31
|
+
export interface FunctionTableNode {
|
|
32
|
+
type: 'FunctionTable';
|
|
33
|
+
// Canonical "intent" for dialect-aware table functions (tvf).
|
|
34
|
+
// If set, compiler resolves via TableFunctionStrategy and can fail fast.
|
|
35
|
+
key?: string;
|
|
36
|
+
/** Function name */
|
|
37
|
+
name: string;
|
|
38
|
+
/** Optional schema for the function (some dialects) */
|
|
39
|
+
schema?: string;
|
|
40
|
+
/** Function arguments as operand nodes */
|
|
41
|
+
args?: OperandNode[];
|
|
42
|
+
/** Optional alias for the function table */
|
|
43
|
+
alias?: string;
|
|
44
|
+
/** LATERAL flag */
|
|
45
|
+
lateral?: boolean;
|
|
46
|
+
/** WITH ORDINALITY flag */
|
|
47
|
+
withOrdinality?: boolean;
|
|
48
|
+
/** Optional column aliases */
|
|
49
|
+
columnAliases?: string[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* AST node representing a derived table (subquery with an alias)
|
|
54
|
+
*/
|
|
55
|
+
export interface DerivedTableNode {
|
|
56
|
+
type: 'DerivedTable';
|
|
57
|
+
/** Subquery providing the rows */
|
|
58
|
+
query: SelectQueryNode;
|
|
59
|
+
/** Required alias for the derived table */
|
|
60
|
+
alias: string;
|
|
61
|
+
/** Optional column aliases */
|
|
62
|
+
columnAliases?: string[];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type TableSourceNode = TableNode | FunctionTableNode | DerivedTableNode;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Any expression that can appear in ORDER BY / GROUP BY terms.
|
|
69
|
+
*/
|
|
70
|
+
export type OrderingTerm = OperandNode | ExpressionNode | AliasRefNode;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* AST node representing an ORDER BY clause
|
|
74
|
+
*/
|
|
75
|
+
export interface OrderByNode {
|
|
76
|
+
type: 'OrderBy';
|
|
77
|
+
/** Expression/operand/alias to order by */
|
|
78
|
+
term: OrderingTerm;
|
|
79
|
+
/** Order direction (ASC or DESC) */
|
|
80
|
+
direction: OrderDirection;
|
|
81
|
+
/** Optional nulls ordering (NULLS FIRST/LAST) */
|
|
82
|
+
nulls?: 'FIRST' | 'LAST';
|
|
83
|
+
/** Optional collation */
|
|
84
|
+
collation?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* AST node representing a Common Table Expression (CTE)
|
|
89
|
+
*/
|
|
90
|
+
export interface CommonTableExpressionNode {
|
|
91
|
+
type: 'CommonTableExpression';
|
|
92
|
+
/** CTE name */
|
|
93
|
+
name: string;
|
|
94
|
+
/** Optional column names */
|
|
95
|
+
columns?: string[];
|
|
96
|
+
/** CTE query */
|
|
97
|
+
query: SelectQueryNode;
|
|
98
|
+
/** Whether the CTE is recursive */
|
|
99
|
+
recursive: boolean;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Supported set operation kinds for compound SELECT queries
|
|
104
|
+
*/
|
|
105
|
+
export type SetOperationKind = 'UNION' | 'UNION ALL' | 'INTERSECT' | 'EXCEPT';
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* AST node representing a set operation (UNION, INTERSECT, etc.)
|
|
109
|
+
*/
|
|
110
|
+
export interface SetOperationNode {
|
|
111
|
+
type: 'SetOperation';
|
|
112
|
+
/** Operator to combine queries */
|
|
113
|
+
operator: SetOperationKind;
|
|
114
|
+
/** Right-hand query in the compound expression */
|
|
115
|
+
query: SelectQueryNode;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* AST node representing a complete SELECT query
|
|
120
|
+
*/
|
|
121
|
+
export interface SelectQueryNode {
|
|
122
|
+
type: 'SelectQuery';
|
|
123
|
+
/** Optional CTEs (WITH clauses) */
|
|
124
|
+
ctes?: CommonTableExpressionNode[];
|
|
125
|
+
/** FROM clause table (either a Table or a FunctionTable) */
|
|
126
|
+
from: TableSourceNode;
|
|
127
|
+
/** SELECT clause columns */
|
|
128
|
+
columns: (
|
|
129
|
+
ColumnNode |
|
|
130
|
+
FunctionNode |
|
|
131
|
+
ScalarSubqueryNode |
|
|
132
|
+
CaseExpressionNode |
|
|
133
|
+
CastExpressionNode |
|
|
134
|
+
WindowFunctionNode
|
|
135
|
+
)[];
|
|
136
|
+
/** JOIN clauses */
|
|
137
|
+
joins: JoinNode[];
|
|
138
|
+
/** Optional WHERE clause */
|
|
139
|
+
where?: ExpressionNode;
|
|
140
|
+
/** Optional GROUP BY clause */
|
|
141
|
+
groupBy?: OrderingTerm[];
|
|
142
|
+
/** Optional HAVING clause */
|
|
143
|
+
having?: ExpressionNode;
|
|
144
|
+
/** Optional ORDER BY clause */
|
|
145
|
+
orderBy?: OrderByNode[];
|
|
146
|
+
/** Optional LIMIT clause */
|
|
147
|
+
limit?: number;
|
|
148
|
+
/** Optional OFFSET clause */
|
|
149
|
+
offset?: number;
|
|
150
|
+
/** Optional query metadata */
|
|
151
|
+
meta?: Record<string, unknown>;
|
|
152
|
+
/** Optional DISTINCT clause */
|
|
153
|
+
distinct?: ColumnNode[];
|
|
154
|
+
/** Optional set operations chaining this query with others */
|
|
155
|
+
setOps?: SetOperationNode[];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export interface InsertValuesSourceNode {
|
|
159
|
+
type: 'InsertValues';
|
|
160
|
+
/** Rows of values for INSERT rows */
|
|
161
|
+
rows: OperandNode[][];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
164
|
export interface InsertSelectSourceNode {
|
|
165
165
|
type: 'InsertSelect';
|
|
166
166
|
/** SELECT query providing rows */
|
|
@@ -208,40 +208,40 @@ export interface InsertQueryNode {
|
|
|
208
208
|
/** Optional RETURNING clause */
|
|
209
209
|
returning?: ColumnNode[];
|
|
210
210
|
}
|
|
211
|
-
|
|
212
|
-
export interface UpdateAssignmentNode {
|
|
213
|
-
/** Column to update */
|
|
214
|
-
column: ColumnNode;
|
|
215
|
-
/** Value to set */
|
|
216
|
-
value: OperandNode;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export interface UpdateQueryNode {
|
|
220
|
-
type: 'UpdateQuery';
|
|
221
|
-
/** Table being updated */
|
|
222
|
-
table: TableNode;
|
|
223
|
-
/** Optional FROM clause for multi-table updates */
|
|
224
|
-
from?: TableSourceNode;
|
|
225
|
-
/** Optional joins applied to the FROM/USING tables */
|
|
226
|
-
joins?: JoinNode[];
|
|
227
|
-
/** Assignments for SET clause */
|
|
228
|
-
set: UpdateAssignmentNode[];
|
|
229
|
-
/** Optional WHERE clause */
|
|
230
|
-
where?: ExpressionNode;
|
|
231
|
-
/** Optional RETURNING clause */
|
|
232
|
-
returning?: ColumnNode[];
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export interface DeleteQueryNode {
|
|
236
|
-
type: 'DeleteQuery';
|
|
237
|
-
/** Table to delete from */
|
|
238
|
-
from: TableNode;
|
|
239
|
-
/** Optional USING clause for multi-table deletes */
|
|
240
|
-
using?: TableSourceNode;
|
|
241
|
-
/** Optional joins applied to the USING clause */
|
|
242
|
-
joins?: JoinNode[];
|
|
243
|
-
/** Optional WHERE clause */
|
|
244
|
-
where?: ExpressionNode;
|
|
245
|
-
/** Optional RETURNING clause */
|
|
246
|
-
returning?: ColumnNode[];
|
|
247
|
-
}
|
|
211
|
+
|
|
212
|
+
export interface UpdateAssignmentNode {
|
|
213
|
+
/** Column to update */
|
|
214
|
+
column: ColumnNode;
|
|
215
|
+
/** Value to set */
|
|
216
|
+
value: OperandNode;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export interface UpdateQueryNode {
|
|
220
|
+
type: 'UpdateQuery';
|
|
221
|
+
/** Table being updated */
|
|
222
|
+
table: TableNode;
|
|
223
|
+
/** Optional FROM clause for multi-table updates */
|
|
224
|
+
from?: TableSourceNode;
|
|
225
|
+
/** Optional joins applied to the FROM/USING tables */
|
|
226
|
+
joins?: JoinNode[];
|
|
227
|
+
/** Assignments for SET clause */
|
|
228
|
+
set: UpdateAssignmentNode[];
|
|
229
|
+
/** Optional WHERE clause */
|
|
230
|
+
where?: ExpressionNode;
|
|
231
|
+
/** Optional RETURNING clause */
|
|
232
|
+
returning?: ColumnNode[];
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export interface DeleteQueryNode {
|
|
236
|
+
type: 'DeleteQuery';
|
|
237
|
+
/** Table to delete from */
|
|
238
|
+
from: TableNode;
|
|
239
|
+
/** Optional USING clause for multi-table deletes */
|
|
240
|
+
using?: TableSourceNode;
|
|
241
|
+
/** Optional joins applied to the USING clause */
|
|
242
|
+
joins?: JoinNode[];
|
|
243
|
+
/** Optional WHERE clause */
|
|
244
|
+
where?: ExpressionNode;
|
|
245
|
+
/** Optional RETURNING clause */
|
|
246
|
+
returning?: ColumnNode[];
|
|
247
|
+
}
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { BaseSchemaDialect } from './base-schema-dialect.js';
|
|
3
|
-
import { PostgresSchemaDialect } from './postgres-schema-dialect.js';
|
|
4
|
-
import { TableDef } from '../../../schema/table.js';
|
|
5
|
-
import { ForeignKeyReference } from '../../../schema/column-types.js';
|
|
6
|
-
import { createLiteralFormatter } from '../sql-writing.js';
|
|
7
|
-
|
|
8
|
-
class DummySchemaDialect extends BaseSchemaDialect {
|
|
9
|
-
readonly name = 'sqlite';
|
|
10
|
-
private readonly formatter = createLiteralFormatter({
|
|
11
|
-
booleanTrue: '1',
|
|
12
|
-
booleanFalse: '0',
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
get literalFormatter() {
|
|
16
|
-
return this.formatter;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
quoteIdentifier(id: string): string {
|
|
20
|
-
return `"${id}"`;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
renderColumnType(): string {
|
|
24
|
-
return 'INTEGER';
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
renderAutoIncrement(): string | undefined {
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
renderIndex(): string {
|
|
32
|
-
return 'CREATE INDEX dummy;';
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const table: TableDef = {
|
|
37
|
-
name: 'child',
|
|
38
|
-
columns: {},
|
|
39
|
-
relations: {},
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const deferrableReference: ForeignKeyReference = {
|
|
43
|
-
table: 'parent',
|
|
44
|
-
column: 'id',
|
|
45
|
-
deferrable: true,
|
|
46
|
-
onDelete: 'CASCADE',
|
|
47
|
-
onUpdate: 'NO ACTION',
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
describe('renderReference deferrable handling', () => {
|
|
51
|
-
it('base dialect remains agnostic to deferrable flags', () => {
|
|
52
|
-
const dialect = new DummySchemaDialect();
|
|
53
|
-
const sql = dialect.renderReference(deferrableReference, table);
|
|
54
|
-
expect(sql).toContain('REFERENCES "parent"');
|
|
55
|
-
expect(sql).not.toContain('DEFERRABLE INITIALLY DEFERRED');
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('Postgres dialect renders the deferrable clause', () => {
|
|
59
|
-
const dialect = new PostgresSchemaDialect();
|
|
60
|
-
const sql = dialect.renderReference(deferrableReference, table);
|
|
61
|
-
expect(sql).toContain('DEFERRABLE INITIALLY DEFERRED');
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('Postgres dialect skips the clause when the flag is missing', () => {
|
|
65
|
-
const dialect = new PostgresSchemaDialect();
|
|
66
|
-
const sql = dialect.renderReference({ table: 'parent', column: 'id' }, table);
|
|
67
|
-
expect(sql).not.toContain('DEFERRABLE INITIALLY DEFERRED');
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { BaseSchemaDialect } from './base-schema-dialect.js';
|
|
3
|
+
import { PostgresSchemaDialect } from './postgres-schema-dialect.js';
|
|
4
|
+
import { TableDef } from '../../../schema/table.js';
|
|
5
|
+
import { ForeignKeyReference } from '../../../schema/column-types.js';
|
|
6
|
+
import { createLiteralFormatter } from '../sql-writing.js';
|
|
7
|
+
|
|
8
|
+
class DummySchemaDialect extends BaseSchemaDialect {
|
|
9
|
+
readonly name = 'sqlite';
|
|
10
|
+
private readonly formatter = createLiteralFormatter({
|
|
11
|
+
booleanTrue: '1',
|
|
12
|
+
booleanFalse: '0',
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
get literalFormatter() {
|
|
16
|
+
return this.formatter;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
quoteIdentifier(id: string): string {
|
|
20
|
+
return `"${id}"`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
renderColumnType(): string {
|
|
24
|
+
return 'INTEGER';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
renderAutoIncrement(): string | undefined {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
renderIndex(): string {
|
|
32
|
+
return 'CREATE INDEX dummy;';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const table: TableDef = {
|
|
37
|
+
name: 'child',
|
|
38
|
+
columns: {},
|
|
39
|
+
relations: {},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const deferrableReference: ForeignKeyReference = {
|
|
43
|
+
table: 'parent',
|
|
44
|
+
column: 'id',
|
|
45
|
+
deferrable: true,
|
|
46
|
+
onDelete: 'CASCADE',
|
|
47
|
+
onUpdate: 'NO ACTION',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
describe('renderReference deferrable handling', () => {
|
|
51
|
+
it('base dialect remains agnostic to deferrable flags', () => {
|
|
52
|
+
const dialect = new DummySchemaDialect();
|
|
53
|
+
const sql = dialect.renderReference(deferrableReference, table);
|
|
54
|
+
expect(sql).toContain('REFERENCES "parent"');
|
|
55
|
+
expect(sql).not.toContain('DEFERRABLE INITIALLY DEFERRED');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('Postgres dialect renders the deferrable clause', () => {
|
|
59
|
+
const dialect = new PostgresSchemaDialect();
|
|
60
|
+
const sql = dialect.renderReference(deferrableReference, table);
|
|
61
|
+
expect(sql).toContain('DEFERRABLE INITIALLY DEFERRED');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('Postgres dialect skips the clause when the flag is missing', () => {
|
|
65
|
+
const dialect = new PostgresSchemaDialect();
|
|
66
|
+
const sql = dialect.renderReference({ table: 'parent', column: 'id' }, table);
|
|
67
|
+
expect(sql).not.toContain('DEFERRABLE INITIALLY DEFERRED');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** Re-exports for supported catalog definitions. */
|
|
2
|
-
export * from './postgres.js';
|
|
3
|
-
export * from './mssql.js';
|
|
4
|
-
export * from './mysql.js';
|
|
5
|
-
export * from './sqlite.js';
|
|
1
|
+
/** Re-exports for supported catalog definitions. */
|
|
2
|
+
export * from './postgres.js';
|
|
3
|
+
export * from './mssql.js';
|
|
4
|
+
export * from './mysql.js';
|
|
5
|
+
export * from './sqlite.js';
|