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.
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,89 +1,89 @@
1
- import { TableDef } from '../schema/table.js';
2
- import {
3
- SelectQueryNode,
4
- CommonTableExpressionNode,
5
- OrderByNode,
6
- SetOperationNode,
7
- TableSourceNode,
8
- OrderingTerm
9
- } from '../core/ast/query.js';
10
- import { createTableNode } from '../core/ast/builders.js';
11
- import {
12
- ColumnNode,
13
- ExpressionNode,
14
- FunctionNode,
15
- ScalarSubqueryNode,
16
- CaseExpressionNode,
17
- CastExpressionNode,
18
- WindowFunctionNode
19
- } from '../core/ast/expression.js';
20
- import { JoinNode } from '../core/ast/join.js';
21
-
22
- /**
23
- * Node types that can be used in query projections
24
- */
25
- export type ProjectionNode =
26
- | ColumnNode
27
- | FunctionNode
28
- | ScalarSubqueryNode
29
- | CaseExpressionNode
30
- | CastExpressionNode
31
- | WindowFunctionNode;
32
-
33
- /**
34
- * Manages the state of a SELECT query being built
35
- */
36
- export class SelectQueryState {
37
- /**
38
- * Table definition for the query
39
- */
40
- public readonly table: TableDef;
41
- /**
42
- * Abstract Syntax Tree (AST) representation of the query
43
- */
44
- public readonly ast: SelectQueryNode;
45
-
46
- /**
47
- * Creates a new SelectQueryState instance
48
- * @param table - Table definition
49
- * @param ast - Optional existing AST
50
- */
51
- constructor(table: TableDef, ast?: SelectQueryNode) {
52
- this.table = table;
53
- this.ast = ast ?? {
54
- type: 'SelectQuery',
55
- from: createTableNode(table),
56
- columns: [],
57
- joins: []
58
- };
59
- }
60
-
61
- /**
62
- * Creates a new SelectQueryState with updated AST
63
- * @param nextAst - Updated AST
64
- * @returns New SelectQueryState instance
65
- */
66
- private clone(nextAst: SelectQueryNode): SelectQueryState {
67
- return new SelectQueryState(this.table, nextAst);
68
- }
69
-
70
- /**
71
- * Adds columns to the query
72
- * @param newCols - Columns to add
73
- * @returns New SelectQueryState with added columns
74
- */
75
- withColumns(newCols: ProjectionNode[]): SelectQueryState {
76
- return this.clone({
77
- ...this.ast,
78
- columns: [...(this.ast.columns ?? []), ...newCols]
79
- });
80
- }
81
-
82
- /**
83
- * Adds a join to the query
84
- * @param join - Join node to add
85
- * @returns New SelectQueryState with added join
86
- */
1
+ import { TableDef } from '../schema/table.js';
2
+ import {
3
+ SelectQueryNode,
4
+ CommonTableExpressionNode,
5
+ OrderByNode,
6
+ SetOperationNode,
7
+ TableSourceNode,
8
+ OrderingTerm
9
+ } from '../core/ast/query.js';
10
+ import { createTableNode } from '../core/ast/builders.js';
11
+ import {
12
+ ColumnNode,
13
+ ExpressionNode,
14
+ FunctionNode,
15
+ ScalarSubqueryNode,
16
+ CaseExpressionNode,
17
+ CastExpressionNode,
18
+ WindowFunctionNode
19
+ } from '../core/ast/expression.js';
20
+ import { JoinNode } from '../core/ast/join.js';
21
+
22
+ /**
23
+ * Node types that can be used in query projections
24
+ */
25
+ export type ProjectionNode =
26
+ | ColumnNode
27
+ | FunctionNode
28
+ | ScalarSubqueryNode
29
+ | CaseExpressionNode
30
+ | CastExpressionNode
31
+ | WindowFunctionNode;
32
+
33
+ /**
34
+ * Manages the state of a SELECT query being built
35
+ */
36
+ export class SelectQueryState {
37
+ /**
38
+ * Table definition for the query
39
+ */
40
+ public readonly table: TableDef;
41
+ /**
42
+ * Abstract Syntax Tree (AST) representation of the query
43
+ */
44
+ public readonly ast: SelectQueryNode;
45
+
46
+ /**
47
+ * Creates a new SelectQueryState instance
48
+ * @param table - Table definition
49
+ * @param ast - Optional existing AST
50
+ */
51
+ constructor(table: TableDef, ast?: SelectQueryNode) {
52
+ this.table = table;
53
+ this.ast = ast ?? {
54
+ type: 'SelectQuery',
55
+ from: createTableNode(table),
56
+ columns: [],
57
+ joins: []
58
+ };
59
+ }
60
+
61
+ /**
62
+ * Creates a new SelectQueryState with updated AST
63
+ * @param nextAst - Updated AST
64
+ * @returns New SelectQueryState instance
65
+ */
66
+ private clone(nextAst: SelectQueryNode): SelectQueryState {
67
+ return new SelectQueryState(this.table, nextAst);
68
+ }
69
+
70
+ /**
71
+ * Adds columns to the query
72
+ * @param newCols - Columns to add
73
+ * @returns New SelectQueryState with added columns
74
+ */
75
+ withColumns(newCols: ProjectionNode[]): SelectQueryState {
76
+ return this.clone({
77
+ ...this.ast,
78
+ columns: [...(this.ast.columns ?? []), ...newCols]
79
+ });
80
+ }
81
+
82
+ /**
83
+ * Adds a join to the query
84
+ * @param join - Join node to add
85
+ * @returns New SelectQueryState with added join
86
+ */
87
87
  withJoin(join: JoinNode): SelectQueryState {
88
88
  return this.clone({
89
89
  ...this.ast,
@@ -102,124 +102,124 @@ export class SelectQueryState {
102
102
  joins
103
103
  });
104
104
  }
105
-
106
- /**
107
- * Replaces the FROM clause.
108
- * @param from - Table source for the FROM clause
109
- * @returns New SelectQueryState with updated FROM
110
- */
111
- withFrom(from: TableSourceNode): SelectQueryState {
112
- return this.clone({
113
- ...this.ast,
114
- from
115
- });
116
- }
117
-
118
- /**
119
- * Adds a WHERE clause to the query
120
- * @param predicate - WHERE predicate expression
121
- * @returns New SelectQueryState with WHERE clause
122
- */
123
- withWhere(predicate: ExpressionNode): SelectQueryState {
124
- return this.clone({
125
- ...this.ast,
126
- where: predicate
127
- });
128
- }
129
-
130
- /**
131
- * Adds a HAVING clause to the query
132
- * @param predicate - HAVING predicate expression
133
- * @returns New SelectQueryState with HAVING clause
134
- */
135
- withHaving(predicate: ExpressionNode): SelectQueryState {
136
- return this.clone({
137
- ...this.ast,
138
- having: predicate
139
- });
140
- }
141
-
142
- /**
143
- * Adds GROUP BY columns to the query
144
- * @param columns - Terms to group by
145
- * @returns New SelectQueryState with GROUP BY clause
146
- */
147
- withGroupBy(columns: OrderingTerm[]): SelectQueryState {
148
- return this.clone({
149
- ...this.ast,
150
- groupBy: [...(this.ast.groupBy ?? []), ...columns]
151
- });
152
- }
153
-
154
- /**
155
- * Adds ORDER BY clauses to the query
156
- * @param orderBy - ORDER BY nodes
157
- * @returns New SelectQueryState with ORDER BY clause
158
- */
159
- withOrderBy(orderBy: OrderByNode[]): SelectQueryState {
160
- return this.clone({
161
- ...this.ast,
162
- orderBy: [...(this.ast.orderBy ?? []), ...orderBy]
163
- });
164
- }
165
-
166
- /**
167
- * Adds DISTINCT columns to the query
168
- * @param columns - Columns to make distinct
169
- * @returns New SelectQueryState with DISTINCT clause
170
- */
171
- withDistinct(columns: ColumnNode[]): SelectQueryState {
172
- return this.clone({
173
- ...this.ast,
174
- distinct: [...(this.ast.distinct ?? []), ...columns]
175
- });
176
- }
177
-
178
- /**
179
- * Adds a LIMIT clause to the query
180
- * @param limit - Maximum number of rows to return
181
- * @returns New SelectQueryState with LIMIT clause
182
- */
183
- withLimit(limit: number): SelectQueryState {
184
- return this.clone({
185
- ...this.ast,
186
- limit
187
- });
188
- }
189
-
190
- /**
191
- * Adds an OFFSET clause to the query
192
- * @param offset - Number of rows to skip
193
- * @returns New SelectQueryState with OFFSET clause
194
- */
195
- withOffset(offset: number): SelectQueryState {
196
- return this.clone({
197
- ...this.ast,
198
- offset
199
- });
200
- }
201
-
202
- /**
203
- * Adds a Common Table Expression (CTE) to the query
204
- * @param cte - CTE node to add
205
- * @returns New SelectQueryState with CTE
206
- */
207
- withCte(cte: CommonTableExpressionNode): SelectQueryState {
208
- return this.clone({
209
- ...this.ast,
210
- ctes: [...(this.ast.ctes ?? []), cte]
211
- });
212
- }
213
-
214
- /**
215
- * Adds a set operation (UNION/INTERSECT/EXCEPT) to the query
216
- * @param op - Set operation node to add
217
- * @returns New SelectQueryState with set operation
218
- */
219
- withSetOperation(op: SetOperationNode): SelectQueryState {
220
- return this.clone({
221
- ...this.ast,
222
- setOps: [...(this.ast.setOps ?? []), op]
223
- });
224
- }
225
- }
105
+
106
+ /**
107
+ * Replaces the FROM clause.
108
+ * @param from - Table source for the FROM clause
109
+ * @returns New SelectQueryState with updated FROM
110
+ */
111
+ withFrom(from: TableSourceNode): SelectQueryState {
112
+ return this.clone({
113
+ ...this.ast,
114
+ from
115
+ });
116
+ }
117
+
118
+ /**
119
+ * Adds a WHERE clause to the query
120
+ * @param predicate - WHERE predicate expression
121
+ * @returns New SelectQueryState with WHERE clause
122
+ */
123
+ withWhere(predicate: ExpressionNode): SelectQueryState {
124
+ return this.clone({
125
+ ...this.ast,
126
+ where: predicate
127
+ });
128
+ }
129
+
130
+ /**
131
+ * Adds a HAVING clause to the query
132
+ * @param predicate - HAVING predicate expression
133
+ * @returns New SelectQueryState with HAVING clause
134
+ */
135
+ withHaving(predicate: ExpressionNode): SelectQueryState {
136
+ return this.clone({
137
+ ...this.ast,
138
+ having: predicate
139
+ });
140
+ }
141
+
142
+ /**
143
+ * Adds GROUP BY columns to the query
144
+ * @param columns - Terms to group by
145
+ * @returns New SelectQueryState with GROUP BY clause
146
+ */
147
+ withGroupBy(columns: OrderingTerm[]): SelectQueryState {
148
+ return this.clone({
149
+ ...this.ast,
150
+ groupBy: [...(this.ast.groupBy ?? []), ...columns]
151
+ });
152
+ }
153
+
154
+ /**
155
+ * Adds ORDER BY clauses to the query
156
+ * @param orderBy - ORDER BY nodes
157
+ * @returns New SelectQueryState with ORDER BY clause
158
+ */
159
+ withOrderBy(orderBy: OrderByNode[]): SelectQueryState {
160
+ return this.clone({
161
+ ...this.ast,
162
+ orderBy: [...(this.ast.orderBy ?? []), ...orderBy]
163
+ });
164
+ }
165
+
166
+ /**
167
+ * Adds DISTINCT columns to the query
168
+ * @param columns - Columns to make distinct
169
+ * @returns New SelectQueryState with DISTINCT clause
170
+ */
171
+ withDistinct(columns: ColumnNode[]): SelectQueryState {
172
+ return this.clone({
173
+ ...this.ast,
174
+ distinct: [...(this.ast.distinct ?? []), ...columns]
175
+ });
176
+ }
177
+
178
+ /**
179
+ * Adds a LIMIT clause to the query
180
+ * @param limit - Maximum number of rows to return
181
+ * @returns New SelectQueryState with LIMIT clause
182
+ */
183
+ withLimit(limit: number): SelectQueryState {
184
+ return this.clone({
185
+ ...this.ast,
186
+ limit
187
+ });
188
+ }
189
+
190
+ /**
191
+ * Adds an OFFSET clause to the query
192
+ * @param offset - Number of rows to skip
193
+ * @returns New SelectQueryState with OFFSET clause
194
+ */
195
+ withOffset(offset: number): SelectQueryState {
196
+ return this.clone({
197
+ ...this.ast,
198
+ offset
199
+ });
200
+ }
201
+
202
+ /**
203
+ * Adds a Common Table Expression (CTE) to the query
204
+ * @param cte - CTE node to add
205
+ * @returns New SelectQueryState with CTE
206
+ */
207
+ withCte(cte: CommonTableExpressionNode): SelectQueryState {
208
+ return this.clone({
209
+ ...this.ast,
210
+ ctes: [...(this.ast.ctes ?? []), cte]
211
+ });
212
+ }
213
+
214
+ /**
215
+ * Adds a set operation (UNION/INTERSECT/EXCEPT) to the query
216
+ * @param op - Set operation node to add
217
+ * @returns New SelectQueryState with set operation
218
+ */
219
+ withSetOperation(op: SetOperationNode): SelectQueryState {
220
+ return this.clone({
221
+ ...this.ast,
222
+ setOps: [...(this.ast.setOps ?? []), op]
223
+ });
224
+ }
225
+ }