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.
Files changed (192) hide show
  1. package/README.md +758 -769
  2. package/dist/index.cjs +106 -43
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +5 -5
  5. package/dist/index.d.ts +5 -5
  6. package/dist/index.js +106 -43
  7. package/dist/index.js.map +1 -1
  8. package/package.json +100 -96
  9. package/scripts/generate-entities/render.mjs +21 -12
  10. package/scripts/generate-entities/schema.mjs +209 -195
  11. package/scripts/generate-entities/tree-detection.mjs +159 -153
  12. package/scripts/inflection/pt-br.mjs +468 -468
  13. package/scripts/run-eslint.mjs +33 -34
  14. package/scripts/show-sql-seed.sql +102 -0
  15. package/scripts/show-sql.mjs +321 -325
  16. package/src/bulk/bulk-delete-executor.ts +3 -5
  17. package/src/bulk/bulk-insert-executor.ts +7 -7
  18. package/src/bulk/bulk-update-executor.ts +2 -2
  19. package/src/bulk/bulk-upsert-executor.ts +5 -7
  20. package/src/codegen/naming-strategy.ts +54 -54
  21. package/src/codegen/typescript.ts +482 -482
  22. package/src/core/ast/adapters.ts +1 -1
  23. package/src/core/ast/builders.ts +123 -123
  24. package/src/core/ast/expression-builders.ts +745 -745
  25. package/src/core/ast/expression-nodes.ts +304 -304
  26. package/src/core/ast/expression-visitor.ts +212 -212
  27. package/src/core/ast/expression.ts +20 -20
  28. package/src/core/ast/helpers.ts +14 -14
  29. package/src/core/ast/join.ts +18 -18
  30. package/src/core/ast/query.ts +200 -200
  31. package/src/core/ddl/dialects/base-schema-dialect.ts +1 -1
  32. package/src/core/ddl/dialects/mssql-schema-dialect.ts +1 -1
  33. package/src/core/ddl/dialects/mysql-schema-dialect.ts +1 -1
  34. package/src/core/ddl/dialects/postgres-schema-dialect.ts +1 -1
  35. package/src/core/ddl/dialects/render-reference.test.ts +70 -70
  36. package/src/core/ddl/dialects/sqlite-schema-dialect.ts +1 -1
  37. package/src/core/ddl/introspect/catalogs/index.ts +5 -5
  38. package/src/core/ddl/introspect/catalogs/postgres.ts +146 -146
  39. package/src/core/ddl/introspect/context.ts +15 -15
  40. package/src/core/ddl/introspect/functions/postgres.ts +35 -35
  41. package/src/core/ddl/introspect/mysql.ts +113 -36
  42. package/src/core/ddl/introspect/registry.ts +40 -40
  43. package/src/core/ddl/introspect/run-select.ts +35 -35
  44. package/src/core/ddl/introspect/utils.ts +56 -56
  45. package/src/core/ddl/naming-strategy.ts +16 -16
  46. package/src/core/ddl/schema-dialect.ts +56 -56
  47. package/src/core/ddl/schema-diff.ts +234 -234
  48. package/src/core/ddl/schema-generator.ts +1 -1
  49. package/src/core/ddl/schema-introspect.ts +25 -25
  50. package/src/core/ddl/sql-writing.ts +171 -171
  51. package/src/core/dialect/abstract.ts +541 -541
  52. package/src/core/dialect/base/cte-compiler.ts +33 -33
  53. package/src/core/dialect/base/function-table-formatter.ts +103 -103
  54. package/src/core/dialect/base/groupby-compiler.ts +21 -21
  55. package/src/core/dialect/base/join-compiler.ts +25 -25
  56. package/src/core/dialect/base/orderby-compiler.ts +35 -35
  57. package/src/core/dialect/base/pagination-strategy.ts +32 -32
  58. package/src/core/dialect/base/returning-strategy.ts +57 -57
  59. package/src/core/dialect/base/sql-dialect.ts +294 -294
  60. package/src/core/dialect/dialect-factory.ts +91 -91
  61. package/src/core/dialect/mssql/functions.ts +120 -120
  62. package/src/core/dialect/mssql/index.ts +317 -317
  63. package/src/core/dialect/mysql/functions.ts +103 -103
  64. package/src/core/dialect/mysql/index.ts +105 -105
  65. package/src/core/dialect/postgres/functions.ts +108 -108
  66. package/src/core/dialect/postgres/index.ts +91 -91
  67. package/src/core/dialect/sqlite/functions.ts +129 -129
  68. package/src/core/dialect/sqlite/index.ts +67 -67
  69. package/src/core/driver/database-driver.ts +19 -19
  70. package/src/core/driver/mssql-driver.ts +23 -23
  71. package/src/core/driver/mysql-driver.ts +23 -23
  72. package/src/core/driver/postgres-driver.ts +23 -23
  73. package/src/core/driver/sqlite-driver.ts +23 -23
  74. package/src/core/execution/db-executor.ts +92 -92
  75. package/src/core/execution/executors/better-sqlite3-executor.ts +94 -94
  76. package/src/core/execution/executors/mssql-executor.ts +184 -184
  77. package/src/core/execution/executors/mysql-executor.ts +88 -88
  78. package/src/core/execution/executors/postgres-executor.ts +26 -26
  79. package/src/core/execution/executors/sqlite-executor.ts +42 -42
  80. package/src/core/execution/pooling/pool-types.ts +30 -30
  81. package/src/core/execution/pooling/pool.ts +275 -275
  82. package/src/core/functions/array.ts +35 -35
  83. package/src/core/functions/control-flow.ts +79 -79
  84. package/src/core/functions/datetime.ts +237 -237
  85. package/src/core/functions/json.ts +70 -70
  86. package/src/core/functions/numeric.ts +297 -297
  87. package/src/core/functions/text.ts +334 -334
  88. package/src/core/functions/types.ts +33 -33
  89. package/src/core/hydration/types.ts +51 -51
  90. package/src/core/sql/sql-operator-config.ts +39 -39
  91. package/src/core/sql/sql.ts +152 -152
  92. package/src/decorators/column-decorator.ts +87 -87
  93. package/src/decorators/decorator-metadata.ts +143 -143
  94. package/src/decorators/entity.ts +93 -93
  95. package/src/decorators/index.ts +39 -39
  96. package/src/decorators/relations.ts +231 -231
  97. package/src/decorators/transformers/built-in/string-transformers.ts +231 -231
  98. package/src/decorators/transformers/transformer-decorators.ts +134 -134
  99. package/src/decorators/transformers/transformer-executor.ts +171 -171
  100. package/src/decorators/transformers/transformer-metadata.ts +73 -73
  101. package/src/decorators/validators/built-in/br-cep-validator.ts +55 -55
  102. package/src/decorators/validators/built-in/br-cnpj-validator.ts +105 -105
  103. package/src/decorators/validators/built-in/br-cpf-validator.ts +103 -103
  104. package/src/decorators/validators/country-validator-registry.ts +64 -64
  105. package/src/decorators/validators/country-validators-decorators.ts +203 -203
  106. package/src/decorators/validators/country-validators.ts +105 -105
  107. package/src/decorators/validators/validator-metadata.ts +59 -59
  108. package/src/dto/dto-types.ts +226 -226
  109. package/src/dto/filter-types.ts +141 -141
  110. package/src/dto/index.ts +95 -95
  111. package/src/dto/openapi/generators/base.ts +29 -29
  112. package/src/dto/openapi/generators/column.ts +37 -37
  113. package/src/dto/openapi/generators/dto.ts +91 -91
  114. package/src/dto/openapi/generators/filter.ts +75 -75
  115. package/src/dto/openapi/generators/nested-dto.ts +618 -618
  116. package/src/dto/openapi/generators/pagination.ts +111 -111
  117. package/src/dto/openapi/generators/relation-filter.ts +228 -228
  118. package/src/dto/openapi/index.ts +12 -12
  119. package/src/dto/openapi/types.ts +101 -101
  120. package/src/dto/openapi/utilities.ts +95 -95
  121. package/src/dto/pagination-utils.ts +150 -150
  122. package/src/dto/transform.ts +197 -197
  123. package/src/index.ts +86 -86
  124. package/src/orm/als.ts +58 -58
  125. package/src/orm/domain-event-bus.ts +119 -119
  126. package/src/orm/entity-context.ts +86 -86
  127. package/src/orm/entity-materializer.ts +159 -159
  128. package/src/orm/entity-meta.ts +97 -97
  129. package/src/orm/entity-registry.ts +39 -39
  130. package/src/orm/entity-relation-cache.ts +39 -39
  131. package/src/orm/execute.ts +194 -194
  132. package/src/orm/execution-context.ts +18 -18
  133. package/src/orm/hydration-context.ts +26 -26
  134. package/src/orm/hydration.ts +112 -112
  135. package/src/orm/identity-map.ts +61 -61
  136. package/src/orm/interceptor-pipeline.ts +16 -16
  137. package/src/orm/lazy-batch/belongs-to-many.ts +119 -119
  138. package/src/orm/lazy-batch/belongs-to.ts +108 -108
  139. package/src/orm/lazy-batch/has-many.ts +69 -69
  140. package/src/orm/lazy-batch/has-one.ts +68 -68
  141. package/src/orm/lazy-batch/shared.ts +125 -125
  142. package/src/orm/orm-session.ts +620 -620
  143. package/src/orm/orm.ts +34 -34
  144. package/src/orm/pooled-executor-factory.ts +121 -121
  145. package/src/orm/query-logger.ts +40 -40
  146. package/src/orm/relation-change-processor.ts +420 -420
  147. package/src/orm/relations/belongs-to.ts +143 -143
  148. package/src/orm/relations/has-many.ts +204 -204
  149. package/src/orm/relations/has-one.ts +174 -174
  150. package/src/orm/relations/many-to-many.ts +288 -288
  151. package/src/orm/relations/morph-many.ts +156 -156
  152. package/src/orm/relations/morph-one.ts +151 -151
  153. package/src/orm/relations/morph-to.ts +162 -162
  154. package/src/orm/runtime-types.ts +92 -92
  155. package/src/orm/save-graph.ts +561 -561
  156. package/src/orm/transaction-runner.ts +24 -24
  157. package/src/orm/unit-of-work.ts +426 -426
  158. package/src/query/index.ts +69 -69
  159. package/src/query/target.ts +46 -46
  160. package/src/query-builder/column-selector.ts +81 -81
  161. package/src/query-builder/delete.ts +141 -141
  162. package/src/query-builder/insert-query-state.ts +149 -149
  163. package/src/query-builder/insert.ts +117 -117
  164. package/src/query-builder/query-ast-service.ts +287 -287
  165. package/src/query-builder/query-resolution.ts +78 -78
  166. package/src/query-builder/raw-column-parser.ts +38 -38
  167. package/src/query-builder/relation-filter-utils.ts +153 -153
  168. package/src/query-builder/relation-join-planner.ts +10 -10
  169. package/src/query-builder/relation-manager.ts +87 -87
  170. package/src/query-builder/relation-projection-helper.ts +102 -102
  171. package/src/query-builder/relation-types.ts +9 -9
  172. package/src/query-builder/relation-utils.ts +15 -15
  173. package/src/query-builder/select/cte-facet.ts +40 -40
  174. package/src/query-builder/select/from-facet.ts +80 -80
  175. package/src/query-builder/select/join-facet.ts +62 -62
  176. package/src/query-builder/select/predicate-facet.ts +104 -104
  177. package/src/query-builder/select/projection-facet.ts +70 -70
  178. package/src/query-builder/select/relation-facet.ts +81 -81
  179. package/src/query-builder/select/setop-facet.ts +36 -36
  180. package/src/query-builder/select-helpers.ts +1 -1
  181. package/src/query-builder/select-query-builder-deps.ts +130 -130
  182. package/src/query-builder/select-query-state.ts +207 -207
  183. package/src/query-builder/update.ts +151 -151
  184. package/src/schema/column-types.ts +322 -322
  185. package/src/schema/table-guards.ts +37 -37
  186. package/src/schema/table.ts +281 -281
  187. package/src/tree/index.ts +13 -13
  188. package/src/tree/nested-set-strategy.ts +545 -545
  189. package/src/tree/tree-decorator.ts +397 -397
  190. package/src/tree/tree-manager.ts +754 -754
  191. package/src/tree/tree-query.ts +427 -427
  192. package/src/tree/tree-types.ts +299 -299
@@ -1,238 +1,238 @@
1
- import type { SelectQueryNode, OrderByNode } from './query.js';
2
- import { SqlOperator, BitwiseOperator } from '../sql/sql.js';
3
- import { ColumnRef } from './types.js';
4
-
5
- /**
6
- * AST node representing a literal value
7
- */
8
- export interface LiteralNode {
9
- type: 'Literal';
10
- /** The literal value (string, number, boolean, Date, Buffer, or null) */
11
- value: string | number | boolean | Date | Buffer | null;
12
- }
13
-
14
- /**
15
- * AST node representing a reference to a SELECT alias (for ORDER BY / GROUP BY).
16
- */
17
- export interface AliasRefNode {
18
- type: 'AliasRef';
19
- /** Alias name to reference */
20
- name: string;
21
- }
22
-
23
- /**
24
- * AST node representing a column reference
25
- */
26
- export interface ColumnNode {
27
- type: 'Column';
28
- /** Table name the column belongs to */
29
- table: string;
30
- /** Column name */
31
- name: string;
32
- /** Optional alias for the column */
33
- alias?: string;
34
- /** Optional scope marker (e.g., 'outer' for correlated references) */
35
- scope?: 'outer' | 'default';
36
- }
37
-
38
- /**
39
- * AST node representing a function call
40
- */
41
- export interface FunctionNode {
42
- type: 'Function';
43
- /** Function name (e.g., COUNT, SUM) */
44
- name: string;
45
- /** Optional canonical function key for dialect-aware rendering */
46
- fn?: string;
47
- /** Function arguments */
48
- args: OperandNode[];
49
- /** Optional alias for the function result */
50
- alias?: string;
51
- /** Optional ORDER BY clause used by aggregations like GROUP_CONCAT */
52
- orderBy?: OrderByNode[];
53
- /** Optional separator argument used by GROUP_CONCAT-like functions */
54
- separator?: OperandNode;
55
- /** Optional DISTINCT modifier */
56
- distinct?: boolean;
57
- }
58
-
59
- /**
60
- * AST node representing a JSON path expression
61
- */
62
- export interface JsonPathNode {
63
- type: 'JsonPath';
64
- /** Source column */
65
- column: ColumnNode;
66
- /** JSON path expression */
67
- path: string;
68
- /** Optional alias for the result */
69
- alias?: string;
70
- }
71
-
72
- /**
73
- * AST node representing a scalar subquery
74
- */
75
- export interface ScalarSubqueryNode {
76
- type: 'ScalarSubquery';
77
- /** Subquery to execute */
78
- query: SelectQueryNode;
79
- /** Optional alias for the subquery result */
80
- alias?: string;
81
- }
82
-
83
- export type InExpressionRight = OperandNode[] | ScalarSubqueryNode;
84
-
85
- /**
86
- * AST node representing a CASE expression
87
- */
88
- export interface CaseExpressionNode {
89
- type: 'CaseExpression';
90
- /** WHEN-THEN conditions */
91
- conditions: { when: ExpressionNode; then: OperandNode }[];
92
- /** Optional ELSE clause */
93
- else?: OperandNode;
94
- /** Optional alias for the result */
95
- alias?: string;
96
- }
97
-
98
- /**
99
- * AST node representing a CAST expression (CAST(value AS type)).
100
- */
101
- export interface CastExpressionNode {
102
- type: 'Cast';
103
- /** Expression being cast */
104
- expression: OperandNode;
105
- /** SQL type literal, e.g. "varchar(255)" */
106
- castType: string;
107
- /** Optional alias for the result */
108
- alias?: string;
109
- }
110
-
111
- /**
112
- * AST node representing a COLLATE expression (expression COLLATE collationName).
113
- */
114
- export interface CollateExpressionNode {
115
- type: 'Collate';
116
- /** Expression to be collated */
117
- expression: OperandNode;
118
- /** Collation name */
119
- collation: string;
120
- }
121
-
122
- /**
123
- * AST node representing a window function
124
- */
125
- export interface WindowFunctionNode {
126
- type: 'WindowFunction';
127
- /** Window function name (e.g., ROW_NUMBER, RANK) */
128
- name: string;
129
- /** Function arguments */
130
- args: (ColumnNode | LiteralNode | JsonPathNode)[];
131
- /** Optional PARTITION BY clause */
132
- partitionBy?: ColumnNode[];
133
- /** Optional ORDER BY clause */
134
- orderBy?: OrderByNode[];
135
- /** Optional alias for the result */
136
- alias?: string;
137
- }
138
-
139
- /**
140
- * AST node representing an arithmetic expression (e.g., a + b)
141
- */
142
- export interface ArithmeticExpressionNode {
143
- type: 'ArithmeticExpression';
144
- left: OperandNode;
145
- operator: '+' | '-' | '*' | '/';
146
- right: OperandNode;
147
- }
148
-
149
- /**
150
- * Union type representing any operand that can be used in expressions
151
- */
152
- export type OperandNode =
153
- | AliasRefNode
154
- | ColumnNode
155
- | LiteralNode
156
- | FunctionNode
157
- | JsonPathNode
158
- | ScalarSubqueryNode
159
- | CaseExpressionNode
160
- | CastExpressionNode
161
- | WindowFunctionNode
162
- | ArithmeticExpressionNode
163
- | BitwiseExpressionNode
164
- | CollateExpressionNode;
165
-
166
- const operandTypes = new Set<OperandNode['type']>([
167
- 'AliasRef',
168
- 'Column',
169
- 'Literal',
170
- 'Function',
171
- 'JsonPath',
172
- 'ScalarSubquery',
173
- 'CaseExpression',
174
- 'Cast',
175
- 'WindowFunction',
176
- 'ArithmeticExpression',
177
- 'BitwiseExpression',
178
- 'Collate'
179
- ]);
180
-
181
- const hasTypeProperty = (value: unknown): value is { type?: string } =>
182
- typeof value === 'object' && value !== null && 'type' in value;
183
-
184
- export const isOperandNode = (node: unknown): node is OperandNode => {
185
- if (!hasTypeProperty(node)) return false;
186
- return operandTypes.has(node.type as OperandNode['type']);
187
- };
188
-
189
- export const isFunctionNode = (node: unknown): node is FunctionNode =>
190
- isOperandNode(node) && node.type === 'Function';
191
- export const isCaseExpressionNode = (node: unknown): node is CaseExpressionNode =>
192
- isOperandNode(node) && node.type === 'CaseExpression';
193
-
194
- export const isCastExpressionNode = (node: unknown): node is CastExpressionNode =>
195
- isOperandNode(node) && node.type === 'Cast';
196
- export const isCollateExpressionNode = (node: unknown): node is CollateExpressionNode =>
197
- isOperandNode(node) && node.type === 'Collate';
198
- export const isWindowFunctionNode = (node: unknown): node is WindowFunctionNode =>
199
- isOperandNode(node) && node.type === 'WindowFunction';
200
- export const isExpressionSelectionNode = (
201
- node: ColumnRef | FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode
202
- ): node is FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode =>
203
- isFunctionNode(node) || isCaseExpressionNode(node) || isCastExpressionNode(node) || isWindowFunctionNode(node);
204
-
205
- /**
206
- * AST node representing a binary expression (e.g., column = value)
207
- */
208
- export interface BinaryExpressionNode {
209
- type: 'BinaryExpression';
210
- /** Left operand */
211
- left: OperandNode;
212
- /** Comparison operator */
213
- operator: SqlOperator;
214
- /** Right operand */
215
- right: OperandNode;
216
- /** Optional escape character for LIKE expressions */
217
- escape?: LiteralNode;
218
- }
219
-
220
- /**
221
- * AST node representing a bitwise expression (e.g., a & b)
222
- */
223
- export interface BitwiseExpressionNode {
224
- type: 'BitwiseExpression';
225
- /** Left operand */
226
- left: OperandNode;
227
- /** Bitwise operator */
228
- operator: BitwiseOperator;
229
- /** Right operand */
230
- right: OperandNode;
231
- }
232
-
233
- /**
234
- * AST node representing a logical expression (AND/OR)
235
- */
1
+ import type { SelectQueryNode, OrderByNode } from './query.js';
2
+ import { SqlOperator, BitwiseOperator } from '../sql/sql.js';
3
+ import { ColumnRef } from './types.js';
4
+
5
+ /**
6
+ * AST node representing a literal value
7
+ */
8
+ export interface LiteralNode {
9
+ type: 'Literal';
10
+ /** The literal value (string, number, boolean, Date, Buffer, or null) */
11
+ value: string | number | boolean | Date | Buffer | null;
12
+ }
13
+
14
+ /**
15
+ * AST node representing a reference to a SELECT alias (for ORDER BY / GROUP BY).
16
+ */
17
+ export interface AliasRefNode {
18
+ type: 'AliasRef';
19
+ /** Alias name to reference */
20
+ name: string;
21
+ }
22
+
23
+ /**
24
+ * AST node representing a column reference
25
+ */
26
+ export interface ColumnNode {
27
+ type: 'Column';
28
+ /** Table name the column belongs to */
29
+ table: string;
30
+ /** Column name */
31
+ name: string;
32
+ /** Optional alias for the column */
33
+ alias?: string;
34
+ /** Optional scope marker (e.g., 'outer' for correlated references) */
35
+ scope?: 'outer' | 'default';
36
+ }
37
+
38
+ /**
39
+ * AST node representing a function call
40
+ */
41
+ export interface FunctionNode {
42
+ type: 'Function';
43
+ /** Function name (e.g., COUNT, SUM) */
44
+ name: string;
45
+ /** Optional canonical function key for dialect-aware rendering */
46
+ fn?: string;
47
+ /** Function arguments */
48
+ args: OperandNode[];
49
+ /** Optional alias for the function result */
50
+ alias?: string;
51
+ /** Optional ORDER BY clause used by aggregations like GROUP_CONCAT */
52
+ orderBy?: OrderByNode[];
53
+ /** Optional separator argument used by GROUP_CONCAT-like functions */
54
+ separator?: OperandNode;
55
+ /** Optional DISTINCT modifier */
56
+ distinct?: boolean;
57
+ }
58
+
59
+ /**
60
+ * AST node representing a JSON path expression
61
+ */
62
+ export interface JsonPathNode {
63
+ type: 'JsonPath';
64
+ /** Source column */
65
+ column: ColumnNode;
66
+ /** JSON path expression */
67
+ path: string;
68
+ /** Optional alias for the result */
69
+ alias?: string;
70
+ }
71
+
72
+ /**
73
+ * AST node representing a scalar subquery
74
+ */
75
+ export interface ScalarSubqueryNode {
76
+ type: 'ScalarSubquery';
77
+ /** Subquery to execute */
78
+ query: SelectQueryNode;
79
+ /** Optional alias for the subquery result */
80
+ alias?: string;
81
+ }
82
+
83
+ export type InExpressionRight = OperandNode[] | ScalarSubqueryNode;
84
+
85
+ /**
86
+ * AST node representing a CASE expression
87
+ */
88
+ export interface CaseExpressionNode {
89
+ type: 'CaseExpression';
90
+ /** WHEN-THEN conditions */
91
+ conditions: { when: ExpressionNode; then: OperandNode }[];
92
+ /** Optional ELSE clause */
93
+ else?: OperandNode;
94
+ /** Optional alias for the result */
95
+ alias?: string;
96
+ }
97
+
98
+ /**
99
+ * AST node representing a CAST expression (CAST(value AS type)).
100
+ */
101
+ export interface CastExpressionNode {
102
+ type: 'Cast';
103
+ /** Expression being cast */
104
+ expression: OperandNode;
105
+ /** SQL type literal, e.g. "varchar(255)" */
106
+ castType: string;
107
+ /** Optional alias for the result */
108
+ alias?: string;
109
+ }
110
+
111
+ /**
112
+ * AST node representing a COLLATE expression (expression COLLATE collationName).
113
+ */
114
+ export interface CollateExpressionNode {
115
+ type: 'Collate';
116
+ /** Expression to be collated */
117
+ expression: OperandNode;
118
+ /** Collation name */
119
+ collation: string;
120
+ }
121
+
122
+ /**
123
+ * AST node representing a window function
124
+ */
125
+ export interface WindowFunctionNode {
126
+ type: 'WindowFunction';
127
+ /** Window function name (e.g., ROW_NUMBER, RANK) */
128
+ name: string;
129
+ /** Function arguments */
130
+ args: (ColumnNode | LiteralNode | JsonPathNode)[];
131
+ /** Optional PARTITION BY clause */
132
+ partitionBy?: ColumnNode[];
133
+ /** Optional ORDER BY clause */
134
+ orderBy?: OrderByNode[];
135
+ /** Optional alias for the result */
136
+ alias?: string;
137
+ }
138
+
139
+ /**
140
+ * AST node representing an arithmetic expression (e.g., a + b)
141
+ */
142
+ export interface ArithmeticExpressionNode {
143
+ type: 'ArithmeticExpression';
144
+ left: OperandNode;
145
+ operator: '+' | '-' | '*' | '/';
146
+ right: OperandNode;
147
+ }
148
+
149
+ /**
150
+ * Union type representing any operand that can be used in expressions
151
+ */
152
+ export type OperandNode =
153
+ | AliasRefNode
154
+ | ColumnNode
155
+ | LiteralNode
156
+ | FunctionNode
157
+ | JsonPathNode
158
+ | ScalarSubqueryNode
159
+ | CaseExpressionNode
160
+ | CastExpressionNode
161
+ | WindowFunctionNode
162
+ | ArithmeticExpressionNode
163
+ | BitwiseExpressionNode
164
+ | CollateExpressionNode;
165
+
166
+ const operandTypes = new Set<OperandNode['type']>([
167
+ 'AliasRef',
168
+ 'Column',
169
+ 'Literal',
170
+ 'Function',
171
+ 'JsonPath',
172
+ 'ScalarSubquery',
173
+ 'CaseExpression',
174
+ 'Cast',
175
+ 'WindowFunction',
176
+ 'ArithmeticExpression',
177
+ 'BitwiseExpression',
178
+ 'Collate'
179
+ ]);
180
+
181
+ const hasTypeProperty = (value: unknown): value is { type?: string } =>
182
+ typeof value === 'object' && value !== null && 'type' in value;
183
+
184
+ export const isOperandNode = (node: unknown): node is OperandNode => {
185
+ if (!hasTypeProperty(node)) return false;
186
+ return operandTypes.has(node.type as OperandNode['type']);
187
+ };
188
+
189
+ export const isFunctionNode = (node: unknown): node is FunctionNode =>
190
+ isOperandNode(node) && node.type === 'Function';
191
+ export const isCaseExpressionNode = (node: unknown): node is CaseExpressionNode =>
192
+ isOperandNode(node) && node.type === 'CaseExpression';
193
+
194
+ export const isCastExpressionNode = (node: unknown): node is CastExpressionNode =>
195
+ isOperandNode(node) && node.type === 'Cast';
196
+ export const isCollateExpressionNode = (node: unknown): node is CollateExpressionNode =>
197
+ isOperandNode(node) && node.type === 'Collate';
198
+ export const isWindowFunctionNode = (node: unknown): node is WindowFunctionNode =>
199
+ isOperandNode(node) && node.type === 'WindowFunction';
200
+ export const isExpressionSelectionNode = (
201
+ node: ColumnRef | FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode
202
+ ): node is FunctionNode | CaseExpressionNode | CastExpressionNode | WindowFunctionNode =>
203
+ isFunctionNode(node) || isCaseExpressionNode(node) || isCastExpressionNode(node) || isWindowFunctionNode(node);
204
+
205
+ /**
206
+ * AST node representing a binary expression (e.g., column = value)
207
+ */
208
+ export interface BinaryExpressionNode {
209
+ type: 'BinaryExpression';
210
+ /** Left operand */
211
+ left: OperandNode;
212
+ /** Comparison operator */
213
+ operator: SqlOperator;
214
+ /** Right operand */
215
+ right: OperandNode;
216
+ /** Optional escape character for LIKE expressions */
217
+ escape?: LiteralNode;
218
+ }
219
+
220
+ /**
221
+ * AST node representing a bitwise expression (e.g., a & b)
222
+ */
223
+ export interface BitwiseExpressionNode {
224
+ type: 'BitwiseExpression';
225
+ /** Left operand */
226
+ left: OperandNode;
227
+ /** Bitwise operator */
228
+ operator: BitwiseOperator;
229
+ /** Right operand */
230
+ right: OperandNode;
231
+ }
232
+
233
+ /**
234
+ * AST node representing a logical expression (AND/OR)
235
+ */
236
236
  export interface LogicalExpressionNode {
237
237
  type: 'LogicalExpression';
238
238
  /** Logical operator (AND or OR) */
@@ -255,73 +255,73 @@ export interface NotExpressionNode {
255
255
  */
256
256
  export interface NullExpressionNode {
257
257
  type: 'NullExpression';
258
- /** Operand to check for null */
259
- left: OperandNode;
260
- /** Null check operator */
261
- operator: 'IS NULL' | 'IS NOT NULL';
262
- }
263
-
264
- /**
265
- * AST node representing an IN/NOT IN expression
266
- */
267
- export interface InExpressionNode {
268
- type: 'InExpression';
269
- /** Left operand to check */
270
- left: OperandNode;
271
- /** IN/NOT IN operator */
272
- operator: 'IN' | 'NOT IN';
273
- /** Values to check against */
274
- right: InExpressionRight;
275
- }
276
-
277
- /**
278
- * AST node representing an EXISTS/NOT EXISTS expression
279
- */
280
- export interface ExistsExpressionNode {
281
- type: 'ExistsExpression';
282
- /** EXISTS/NOT EXISTS operator */
283
- operator: SqlOperator;
284
- /** Subquery to check */
285
- subquery: SelectQueryNode;
286
- }
287
-
288
- /**
289
- * AST node representing a BETWEEN/NOT BETWEEN expression
290
- */
291
- export interface BetweenExpressionNode {
292
- type: 'BetweenExpression';
293
- /** Operand to check */
294
- left: OperandNode;
295
- /** BETWEEN/NOT BETWEEN operator */
296
- operator: 'BETWEEN' | 'NOT BETWEEN';
297
- /** Lower bound */
298
- lower: OperandNode;
299
- /** Upper bound */
300
- upper: OperandNode;
301
- }
302
-
303
- /**
304
- * AST node representing an IS DISTINCT FROM / IS NOT DISTINCT FROM expression
305
- */
306
- export interface IsDistinctExpressionNode {
307
- type: 'IsDistinctExpression';
308
-
309
- /** The operand on the left side. */
310
- left: OperandNode;
311
-
312
- /**
313
- * `'IS DISTINCT FROM'` → true when values are different, even if one is NULL.
314
- * `'IS NOT DISTINCT FROM'` → true when values are equal, treating NULL = NULL.
315
- */
316
- operator: 'IS DISTINCT FROM' | 'IS NOT DISTINCT FROM';
317
-
318
- /** The operand on the right side. */
319
- right: OperandNode;
320
- }
321
-
322
- /**
323
- * Union type representing any supported expression node
324
- */
258
+ /** Operand to check for null */
259
+ left: OperandNode;
260
+ /** Null check operator */
261
+ operator: 'IS NULL' | 'IS NOT NULL';
262
+ }
263
+
264
+ /**
265
+ * AST node representing an IN/NOT IN expression
266
+ */
267
+ export interface InExpressionNode {
268
+ type: 'InExpression';
269
+ /** Left operand to check */
270
+ left: OperandNode;
271
+ /** IN/NOT IN operator */
272
+ operator: 'IN' | 'NOT IN';
273
+ /** Values to check against */
274
+ right: InExpressionRight;
275
+ }
276
+
277
+ /**
278
+ * AST node representing an EXISTS/NOT EXISTS expression
279
+ */
280
+ export interface ExistsExpressionNode {
281
+ type: 'ExistsExpression';
282
+ /** EXISTS/NOT EXISTS operator */
283
+ operator: SqlOperator;
284
+ /** Subquery to check */
285
+ subquery: SelectQueryNode;
286
+ }
287
+
288
+ /**
289
+ * AST node representing a BETWEEN/NOT BETWEEN expression
290
+ */
291
+ export interface BetweenExpressionNode {
292
+ type: 'BetweenExpression';
293
+ /** Operand to check */
294
+ left: OperandNode;
295
+ /** BETWEEN/NOT BETWEEN operator */
296
+ operator: 'BETWEEN' | 'NOT BETWEEN';
297
+ /** Lower bound */
298
+ lower: OperandNode;
299
+ /** Upper bound */
300
+ upper: OperandNode;
301
+ }
302
+
303
+ /**
304
+ * AST node representing an IS DISTINCT FROM / IS NOT DISTINCT FROM expression
305
+ */
306
+ export interface IsDistinctExpressionNode {
307
+ type: 'IsDistinctExpression';
308
+
309
+ /** The operand on the left side. */
310
+ left: OperandNode;
311
+
312
+ /**
313
+ * `'IS DISTINCT FROM'` → true when values are different, even if one is NULL.
314
+ * `'IS NOT DISTINCT FROM'` → true when values are equal, treating NULL = NULL.
315
+ */
316
+ operator: 'IS DISTINCT FROM' | 'IS NOT DISTINCT FROM';
317
+
318
+ /** The operand on the right side. */
319
+ right: OperandNode;
320
+ }
321
+
322
+ /**
323
+ * Union type representing any supported expression node
324
+ */
325
325
  export type ExpressionNode =
326
326
  | BinaryExpressionNode
327
327
  | LogicalExpressionNode
@@ -331,5 +331,5 @@ export type ExpressionNode =
331
331
  | ExistsExpressionNode
332
332
  | BetweenExpressionNode
333
333
  | ArithmeticExpressionNode
334
- | BitwiseExpressionNode
335
- | IsDistinctExpressionNode;
334
+ | BitwiseExpressionNode
335
+ | IsDistinctExpressionNode;