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,33 +1,33 @@
1
- import { SelectQueryNode } from '../../ast/query.js';
2
- import { CompilerContext } from '../abstract.js';
3
-
4
- /**
5
- * Compiler for Common Table Expressions (CTEs).
6
- * Handles compilation of WITH and WITH RECURSIVE clauses.
7
- */
8
- export class CteCompiler {
9
- /**
10
- * Compiles CTEs (WITH clauses) including recursive CTEs.
11
- * @param ast - The SELECT query AST containing CTE definitions.
12
- * @param ctx - The compiler context for expression compilation.
13
- * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
14
- * @param compileSelectAst - Function to recursively compile SELECT query ASTs.
15
- * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.
16
- * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.
17
- * @returns SQL WITH clause string (e.g., "WITH cte_name AS (...) ") or empty string if no CTEs.
18
- */
19
- static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {
20
- if (!ast.ctes || ast.ctes.length === 0) return '';
21
- const hasRecursive = ast.ctes.some(cte => cte.recursive);
22
- const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';
23
- const cteDefs = ast.ctes.map(cte => {
24
- const name = quoteIdentifier(cte.name);
25
- const cols = cte.columns && cte.columns.length
26
- ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`
27
- : '';
28
- const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));
29
- return `${name}${cols} AS (${query})`;
30
- }).join(', ');
31
- return `${prefix}${cteDefs} `;
32
- }
33
- }
1
+ import { SelectQueryNode } from '../../ast/query.js';
2
+ import { CompilerContext } from '../abstract.js';
3
+
4
+ /**
5
+ * Compiler for Common Table Expressions (CTEs).
6
+ * Handles compilation of WITH and WITH RECURSIVE clauses.
7
+ */
8
+ export class CteCompiler {
9
+ /**
10
+ * Compiles CTEs (WITH clauses) including recursive CTEs.
11
+ * @param ast - The SELECT query AST containing CTE definitions.
12
+ * @param ctx - The compiler context for expression compilation.
13
+ * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
14
+ * @param compileSelectAst - Function to recursively compile SELECT query ASTs.
15
+ * @param normalizeSelectAst - Function to normalize SELECT query ASTs before compilation.
16
+ * @param stripTrailingSemicolon - Function to remove trailing semicolons from SQL.
17
+ * @returns SQL WITH clause string (e.g., "WITH cte_name AS (...) ") or empty string if no CTEs.
18
+ */
19
+ static compileCtes(ast: SelectQueryNode, ctx: CompilerContext, quoteIdentifier: (id: string) => string, compileSelectAst: (ast: SelectQueryNode, ctx: CompilerContext) => string, normalizeSelectAst: (ast: SelectQueryNode) => SelectQueryNode, stripTrailingSemicolon: (sql: string) => string): string {
20
+ if (!ast.ctes || ast.ctes.length === 0) return '';
21
+ const hasRecursive = ast.ctes.some(cte => cte.recursive);
22
+ const prefix = hasRecursive ? 'WITH RECURSIVE ' : 'WITH ';
23
+ const cteDefs = ast.ctes.map(cte => {
24
+ const name = quoteIdentifier(cte.name);
25
+ const cols = cte.columns && cte.columns.length
26
+ ? `(${cte.columns.map(c => quoteIdentifier(c)).join(', ')})`
27
+ : '';
28
+ const query = stripTrailingSemicolon(compileSelectAst(normalizeSelectAst(cte.query), ctx));
29
+ return `${name}${cols} AS (${query})`;
30
+ }).join(', ');
31
+ return `${prefix}${cteDefs} `;
32
+ }
33
+ }
@@ -1,112 +1,112 @@
1
- import { CompilerContext } from '../abstract.js';
1
+ import { CompilerContext } from '../abstract.js';
2
2
  import { OperandNode } from '../../ast/expression.js';
3
3
  import { FunctionTableNode } from '../../ast/query.js';
4
4
  import { SqlDialectBase } from './sql-dialect.js';
5
-
6
- /**
7
- * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).
8
- * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.
9
- */
10
- export class FunctionTableFormatter {
11
- /**
12
- * Formats a function table node into SQL syntax.
13
- * @param fn - The function table node containing schema, name, args, and aliases.
14
- * @param ctx - Optional compiler context for operand compilation.
15
- * @param dialect - The dialect instance for compiling operands.
16
- * @returns SQL function table expression (e.g., "LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)").
17
- */
5
+
6
+ /**
7
+ * Formatter for function table expressions (e.g., LATERAL unnest(...) WITH ORDINALITY).
8
+ * Encapsulates logic for generating SQL function table syntax including LATERAL, aliases, and column lists.
9
+ */
10
+ export class FunctionTableFormatter {
11
+ /**
12
+ * Formats a function table node into SQL syntax.
13
+ * @param fn - The function table node containing schema, name, args, and aliases.
14
+ * @param ctx - Optional compiler context for operand compilation.
15
+ * @param dialect - The dialect instance for compiling operands.
16
+ * @returns SQL function table expression (e.g., "LATERAL schema.func(args) WITH ORDINALITY AS alias(col1, col2)").
17
+ */
18
18
  static format(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {
19
- const schemaPart = this.formatSchema(fn, dialect);
20
- const args = this.formatArgs(fn, ctx, dialect);
19
+ const schemaPart = this.formatSchema(fn, dialect);
20
+ const args = this.formatArgs(fn, ctx, dialect);
21
21
  const base = this.formatBase(fn, schemaPart, args);
22
- const lateral = this.formatLateral(fn);
23
- const alias = this.formatAlias(fn, dialect);
24
- const colAliases = this.formatColumnAliases(fn, dialect);
25
- return `${lateral}${base}${alias}${colAliases}`;
26
- }
27
-
28
- /**
29
- * Formats the schema prefix for the function name.
30
- * @param fn - The function table node.
31
- * @param dialect - The dialect instance for quoting identifiers.
32
- * @returns Schema prefix (e.g., "schema.") or empty string.
33
- * @internal
34
- */
35
- private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
36
- if (!fn.schema) return '';
37
- const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;
38
- return `${quoted}.`;
39
- }
40
-
41
- /**
42
- * Formats function arguments into SQL syntax.
43
- * @param fn - The function table node containing arguments.
44
- * @param ctx - Optional compiler context for operand compilation.
45
- * @param dialect - The dialect instance for compiling operands.
46
- * @returns Comma-separated function arguments.
47
- * @internal
48
- */
49
- private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {
50
- return (fn.args || [])
51
- .map((a: OperandNode) => {
52
- if (ctx && dialect) {
53
- return (dialect as unknown as { compileOperand(n: OperandNode, c: CompilerContext): string }).compileOperand(a, ctx);
54
- }
55
- return String(a);
56
- })
57
- .join(', ');
58
- }
59
-
60
- /**
61
- * Formats the base function call with WITH ORDINALITY if present.
62
- * @param fn - The function table node.
63
- * @param schemaPart - Formatted schema prefix.
64
- * @param args - Formatted function arguments.
65
- * @param dialect - The dialect instance for quoting identifiers.
66
- * @returns Base function call expression (e.g., "schema.func(args) WITH ORDINALITY").
67
- * @internal
68
- */
22
+ const lateral = this.formatLateral(fn);
23
+ const alias = this.formatAlias(fn, dialect);
24
+ const colAliases = this.formatColumnAliases(fn, dialect);
25
+ return `${lateral}${base}${alias}${colAliases}`;
26
+ }
27
+
28
+ /**
29
+ * Formats the schema prefix for the function name.
30
+ * @param fn - The function table node.
31
+ * @param dialect - The dialect instance for quoting identifiers.
32
+ * @returns Schema prefix (e.g., "schema.") or empty string.
33
+ * @internal
34
+ */
35
+ private static formatSchema(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
36
+ if (!fn.schema) return '';
37
+ const quoted = dialect ? dialect.quoteIdentifier(fn.schema) : fn.schema;
38
+ return `${quoted}.`;
39
+ }
40
+
41
+ /**
42
+ * Formats function arguments into SQL syntax.
43
+ * @param fn - The function table node containing arguments.
44
+ * @param ctx - Optional compiler context for operand compilation.
45
+ * @param dialect - The dialect instance for compiling operands.
46
+ * @returns Comma-separated function arguments.
47
+ * @internal
48
+ */
49
+ private static formatArgs(fn: FunctionTableNode, ctx?: CompilerContext, dialect?: SqlDialectBase): string {
50
+ return (fn.args || [])
51
+ .map((a: OperandNode) => {
52
+ if (ctx && dialect) {
53
+ return (dialect as unknown as { compileOperand(n: OperandNode, c: CompilerContext): string }).compileOperand(a, ctx);
54
+ }
55
+ return String(a);
56
+ })
57
+ .join(', ');
58
+ }
59
+
60
+ /**
61
+ * Formats the base function call with WITH ORDINALITY if present.
62
+ * @param fn - The function table node.
63
+ * @param schemaPart - Formatted schema prefix.
64
+ * @param args - Formatted function arguments.
65
+ * @param dialect - The dialect instance for quoting identifiers.
66
+ * @returns Base function call expression (e.g., "schema.func(args) WITH ORDINALITY").
67
+ * @internal
68
+ */
69
69
  private static formatBase(fn: FunctionTableNode, schemaPart: string, args: string): string {
70
70
  const ordinality = fn.withOrdinality ? ' WITH ORDINALITY' : '';
71
71
  return `${schemaPart}${fn.name}(${args})${ordinality}`;
72
72
  }
73
-
74
- /**
75
- * Formats the LATERAL keyword if present.
76
- * @param fn - The function table node.
77
- * @returns "LATERAL " or empty string.
78
- * @internal
79
- */
80
- private static formatLateral(fn: FunctionTableNode): string {
81
- return fn.lateral ? 'LATERAL ' : '';
82
- }
83
-
84
- /**
85
- * Formats the table alias for the function table.
86
- * @param fn - The function table node.
87
- * @param dialect - The dialect instance for quoting identifiers.
88
- * @returns " AS alias" or empty string.
89
- * @internal
90
- */
91
- private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
92
- if (!fn.alias) return '';
93
- const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;
94
- return ` AS ${quoted}`;
95
- }
96
-
97
- /**
98
- * Formats column aliases for the function table result columns.
99
- * @param fn - The function table node containing column aliases.
100
- * @param dialect - The dialect instance for quoting identifiers.
101
- * @returns "(col1, col2, ...)" or empty string.
102
- * @internal
103
- */
104
- private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
105
- if (!fn.columnAliases || !fn.columnAliases.length) return '';
106
- const aliases = fn.columnAliases
107
- .map(col => dialect ? dialect.quoteIdentifier(col) : col)
108
- .join(', ');
109
- return `(${aliases})`;
110
- }
111
- }
112
-
73
+
74
+ /**
75
+ * Formats the LATERAL keyword if present.
76
+ * @param fn - The function table node.
77
+ * @returns "LATERAL " or empty string.
78
+ * @internal
79
+ */
80
+ private static formatLateral(fn: FunctionTableNode): string {
81
+ return fn.lateral ? 'LATERAL ' : '';
82
+ }
83
+
84
+ /**
85
+ * Formats the table alias for the function table.
86
+ * @param fn - The function table node.
87
+ * @param dialect - The dialect instance for quoting identifiers.
88
+ * @returns " AS alias" or empty string.
89
+ * @internal
90
+ */
91
+ private static formatAlias(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
92
+ if (!fn.alias) return '';
93
+ const quoted = dialect ? dialect.quoteIdentifier(fn.alias) : fn.alias;
94
+ return ` AS ${quoted}`;
95
+ }
96
+
97
+ /**
98
+ * Formats column aliases for the function table result columns.
99
+ * @param fn - The function table node containing column aliases.
100
+ * @param dialect - The dialect instance for quoting identifiers.
101
+ * @returns "(col1, col2, ...)" or empty string.
102
+ * @internal
103
+ */
104
+ private static formatColumnAliases(fn: FunctionTableNode, dialect?: SqlDialectBase): string {
105
+ if (!fn.columnAliases || !fn.columnAliases.length) return '';
106
+ const aliases = fn.columnAliases
107
+ .map(col => dialect ? dialect.quoteIdentifier(col) : col)
108
+ .join(', ');
109
+ return `(${aliases})`;
110
+ }
111
+ }
112
+
@@ -1,21 +1,21 @@
1
- import { OrderingTerm, SelectQueryNode } from '../../ast/query.js';
2
-
3
- type TermRenderer = (term: OrderingTerm) => string;
4
-
5
- /**
6
- * Compiler for GROUP BY clauses in SELECT statements.
7
- * Handles compilation of column grouping expressions.
8
- */
9
- export class GroupByCompiler {
10
- /**
11
- * Compiles GROUP BY clause from a SELECT query AST.
12
- * @param ast - The SELECT query AST containing grouping columns.
13
- * @param renderTerm - Function to render a grouping term.
14
- * @returns SQL GROUP BY clause (e.g., " GROUP BY table.col1, table.col2") or empty string if no grouping.
15
- */
16
- static compileGroupBy(ast: SelectQueryNode, renderTerm: TermRenderer): string {
17
- if (!ast.groupBy || ast.groupBy.length === 0) return '';
18
- const cols = ast.groupBy.map(renderTerm).join(', ');
19
- return ` GROUP BY ${cols}`;
20
- }
21
- }
1
+ import { OrderingTerm, SelectQueryNode } from '../../ast/query.js';
2
+
3
+ type TermRenderer = (term: OrderingTerm) => string;
4
+
5
+ /**
6
+ * Compiler for GROUP BY clauses in SELECT statements.
7
+ * Handles compilation of column grouping expressions.
8
+ */
9
+ export class GroupByCompiler {
10
+ /**
11
+ * Compiles GROUP BY clause from a SELECT query AST.
12
+ * @param ast - The SELECT query AST containing grouping columns.
13
+ * @param renderTerm - Function to render a grouping term.
14
+ * @returns SQL GROUP BY clause (e.g., " GROUP BY table.col1, table.col2") or empty string if no grouping.
15
+ */
16
+ static compileGroupBy(ast: SelectQueryNode, renderTerm: TermRenderer): string {
17
+ if (!ast.groupBy || ast.groupBy.length === 0) return '';
18
+ const cols = ast.groupBy.map(renderTerm).join(', ');
19
+ return ` GROUP BY ${cols}`;
20
+ }
21
+ }
@@ -1,25 +1,25 @@
1
- import { CompilerContext } from '../abstract.js';
2
- import { JoinNode } from '../../ast/join.js';
3
- import { TableSourceNode } from '../../ast/query.js';
4
- import { ExpressionNode } from '../../ast/expression.js';
5
-
6
- /**
7
- * Compiler for JOIN clauses in SELECT statements.
8
- * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).
9
- */
10
- export class JoinCompiler {
11
- static compileJoins(
12
- joins: JoinNode[] | undefined,
13
- ctx: CompilerContext,
14
- compileFrom: (from: TableSourceNode, ctx: CompilerContext) => string,
15
- compileExpression: (expr: ExpressionNode, ctx: CompilerContext) => string
16
- ): string {
17
- if (!joins || joins.length === 0) return '';
18
- const parts = joins.map(j => {
19
- const table = compileFrom(j.table, ctx);
20
- const cond = compileExpression(j.condition, ctx);
21
- return `${j.kind} JOIN ${table} ON ${cond}`;
22
- });
23
- return ` ${parts.join(' ')}`;
24
- }
25
- }
1
+ import { CompilerContext } from '../abstract.js';
2
+ import { JoinNode } from '../../ast/join.js';
3
+ import { TableSourceNode } from '../../ast/query.js';
4
+ import { ExpressionNode } from '../../ast/expression.js';
5
+
6
+ /**
7
+ * Compiler for JOIN clauses in SELECT statements.
8
+ * Handles compilation of all join types (INNER, LEFT, RIGHT, FULL, CROSS).
9
+ */
10
+ export class JoinCompiler {
11
+ static compileJoins(
12
+ joins: JoinNode[] | undefined,
13
+ ctx: CompilerContext,
14
+ compileFrom: (from: TableSourceNode, ctx: CompilerContext) => string,
15
+ compileExpression: (expr: ExpressionNode, ctx: CompilerContext) => string
16
+ ): string {
17
+ if (!joins || joins.length === 0) return '';
18
+ const parts = joins.map(j => {
19
+ const table = compileFrom(j.table, ctx);
20
+ const cond = compileExpression(j.condition, ctx);
21
+ return `${j.kind} JOIN ${table} ON ${cond}`;
22
+ });
23
+ return ` ${parts.join(' ')}`;
24
+ }
25
+ }
@@ -1,35 +1,35 @@
1
- import { OrderByNode, SelectQueryNode } from '../../ast/query.js';
2
-
3
- type NullsRenderer = (order: OrderByNode) => string | undefined;
4
- type CollationRenderer = (order: OrderByNode) => string | undefined;
5
- type TermRenderer = (term: OrderByNode['term']) => string;
6
-
7
- /**
8
- * Compiler for ORDER BY clauses in SELECT statements.
9
- * Handles compilation of sorting expressions with direction (ASC/DESC).
10
- */
11
- export class OrderByCompiler {
12
- /**
13
- * Compiles ORDER BY clause from a SELECT query AST.
14
- * @param ast - The SELECT query AST containing sort specifications.
15
- * @param renderTerm - Function to render an ordering term.
16
- * @param renderNulls - Optional function to render NULLS FIRST/LAST.
17
- * @param renderCollation - Optional function to render COLLATE clause.
18
- * @returns SQL ORDER BY clause (e.g., " ORDER BY table.col1 ASC, table.col2 DESC") or empty string if no ordering.
19
- */
20
- static compileOrderBy(
21
- ast: SelectQueryNode,
22
- renderTerm: TermRenderer,
23
- renderNulls?: NullsRenderer,
24
- renderCollation?: CollationRenderer
25
- ): string {
26
- if (!ast.orderBy || ast.orderBy.length === 0) return '';
27
- const parts = ast.orderBy.map(o => {
28
- const term = renderTerm(o.term);
29
- const collation = renderCollation ? renderCollation(o) : o.collation ? ` COLLATE ${o.collation}` : '';
30
- const nulls = renderNulls ? renderNulls(o) : o.nulls ? ` NULLS ${o.nulls}` : '';
31
- return `${term} ${o.direction}${collation}${nulls}`;
32
- }).join(', ');
33
- return ` ORDER BY ${parts}`;
34
- }
35
- }
1
+ import { OrderByNode, SelectQueryNode } from '../../ast/query.js';
2
+
3
+ type NullsRenderer = (order: OrderByNode) => string | undefined;
4
+ type CollationRenderer = (order: OrderByNode) => string | undefined;
5
+ type TermRenderer = (term: OrderByNode['term']) => string;
6
+
7
+ /**
8
+ * Compiler for ORDER BY clauses in SELECT statements.
9
+ * Handles compilation of sorting expressions with direction (ASC/DESC).
10
+ */
11
+ export class OrderByCompiler {
12
+ /**
13
+ * Compiles ORDER BY clause from a SELECT query AST.
14
+ * @param ast - The SELECT query AST containing sort specifications.
15
+ * @param renderTerm - Function to render an ordering term.
16
+ * @param renderNulls - Optional function to render NULLS FIRST/LAST.
17
+ * @param renderCollation - Optional function to render COLLATE clause.
18
+ * @returns SQL ORDER BY clause (e.g., " ORDER BY table.col1 ASC, table.col2 DESC") or empty string if no ordering.
19
+ */
20
+ static compileOrderBy(
21
+ ast: SelectQueryNode,
22
+ renderTerm: TermRenderer,
23
+ renderNulls?: NullsRenderer,
24
+ renderCollation?: CollationRenderer
25
+ ): string {
26
+ if (!ast.orderBy || ast.orderBy.length === 0) return '';
27
+ const parts = ast.orderBy.map(o => {
28
+ const term = renderTerm(o.term);
29
+ const collation = renderCollation ? renderCollation(o) : o.collation ? ` COLLATE ${o.collation}` : '';
30
+ const nulls = renderNulls ? renderNulls(o) : o.nulls ? ` NULLS ${o.nulls}` : '';
31
+ return `${term} ${o.direction}${collation}${nulls}`;
32
+ }).join(', ');
33
+ return ` ORDER BY ${parts}`;
34
+ }
35
+ }
@@ -1,32 +1,32 @@
1
- /**
2
- * Strategy interface for compiling pagination clauses.
3
- * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.
4
- */
5
- export interface PaginationStrategy {
6
- /**
7
- * Compiles pagination logic into SQL clause.
8
- * @param limit - The limit value, if present.
9
- * @param offset - The offset value, if present.
10
- * @returns SQL pagination clause (e.g., " LIMIT 10 OFFSET 0") or empty string if no pagination.
11
- */
12
- compilePagination(limit?: number, offset?: number): string;
13
- }
14
-
15
- /**
16
- * Standard SQL pagination using LIMIT and OFFSET.
17
- * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.
18
- */
19
- export class StandardLimitOffsetPagination implements PaginationStrategy {
20
- /**
21
- * Compiles LIMIT/OFFSET pagination clause.
22
- * @param limit - The maximum number of rows to return.
23
- * @param offset - The number of rows to skip.
24
- * @returns SQL pagination clause with LIMIT and/or OFFSET.
25
- */
26
- compilePagination(limit?: number, offset?: number): string {
27
- const parts: string[] = [];
28
- if (limit !== undefined) parts.push(`LIMIT ${limit}`);
29
- if (offset !== undefined) parts.push(`OFFSET ${offset}`);
30
- return parts.length ? ` ${parts.join(' ')}` : '';
31
- }
32
- }
1
+ /**
2
+ * Strategy interface for compiling pagination clauses.
3
+ * Allows dialects to customize how pagination (LIMIT/OFFSET, ROWS FETCH, etc.) is generated.
4
+ */
5
+ export interface PaginationStrategy {
6
+ /**
7
+ * Compiles pagination logic into SQL clause.
8
+ * @param limit - The limit value, if present.
9
+ * @param offset - The offset value, if present.
10
+ * @returns SQL pagination clause (e.g., " LIMIT 10 OFFSET 0") or empty string if no pagination.
11
+ */
12
+ compilePagination(limit?: number, offset?: number): string;
13
+ }
14
+
15
+ /**
16
+ * Standard SQL pagination using LIMIT and OFFSET.
17
+ * Implements the ANSI SQL-style pagination with LIMIT/OFFSET syntax.
18
+ */
19
+ export class StandardLimitOffsetPagination implements PaginationStrategy {
20
+ /**
21
+ * Compiles LIMIT/OFFSET pagination clause.
22
+ * @param limit - The maximum number of rows to return.
23
+ * @param offset - The number of rows to skip.
24
+ * @returns SQL pagination clause with LIMIT and/or OFFSET.
25
+ */
26
+ compilePagination(limit?: number, offset?: number): string {
27
+ const parts: string[] = [];
28
+ if (limit !== undefined) parts.push(`LIMIT ${limit}`);
29
+ if (offset !== undefined) parts.push(`OFFSET ${offset}`);
30
+ return parts.length ? ` ${parts.join(' ')}` : '';
31
+ }
32
+ }
@@ -1,57 +1,57 @@
1
- import { ColumnNode } from '../../ast/expression.js';
2
- import { CompilerContext } from '../abstract.js';
3
-
4
- /**
5
- * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).
6
- * Different SQL dialects have varying levels of support for RETURNING clauses.
7
- */
8
- export interface ReturningStrategy {
9
- /**
10
- * Compiles a RETURNING clause for DML statements.
11
- * @param returning - Array of columns to return, or undefined if none.
12
- * @param ctx - The compiler context for expression compilation.
13
- * @returns SQL RETURNING clause or empty string if not supported.
14
- * @throws Error if RETURNING is not supported by this dialect.
15
- */
16
- compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;
17
- /**
18
- * Formats column list for RETURNING clause.
19
- * @param returning - Array of columns to format.
20
- * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
21
- * @returns Formatted column list (e.g., "table.col1, table.col2").
22
- */
23
- formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;
24
- }
25
-
26
- /**
27
- * Default RETURNING strategy that throws an error when RETURNING is used.
28
- * Use this for dialects that don't support RETURNING clauses.
29
- */
30
- export class NoReturningStrategy implements ReturningStrategy {
31
- /**
32
- * Throws an error as RETURNING is not supported.
33
- * @param returning - Columns to return (causes error if non-empty).
34
- * @param _ctx - Compiler context (unused).
35
- * @throws Error indicating RETURNING is not supported.
36
- */
37
- compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {
38
- void _ctx;
39
- if (!returning || returning.length === 0) return '';
40
- throw new Error('RETURNING is not supported by this dialect.');
41
- }
42
- /**
43
- * Formats column names for RETURNING clause.
44
- * @param returning - Columns to format.
45
- * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
46
- * @returns Simple comma-separated column names.
47
- */
48
- formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {
49
- return returning
50
- .map(column => {
51
- const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';
52
- const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';
53
- return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;
54
- })
55
- .join(', ');
56
- }
57
- }
1
+ import { ColumnNode } from '../../ast/expression.js';
2
+ import { CompilerContext } from '../abstract.js';
3
+
4
+ /**
5
+ * Strategy interface for handling RETURNING clauses in DML statements (INSERT, UPDATE, DELETE).
6
+ * Different SQL dialects have varying levels of support for RETURNING clauses.
7
+ */
8
+ export interface ReturningStrategy {
9
+ /**
10
+ * Compiles a RETURNING clause for DML statements.
11
+ * @param returning - Array of columns to return, or undefined if none.
12
+ * @param ctx - The compiler context for expression compilation.
13
+ * @returns SQL RETURNING clause or empty string if not supported.
14
+ * @throws Error if RETURNING is not supported by this dialect.
15
+ */
16
+ compileReturning(returning: ColumnNode[] | undefined, ctx: CompilerContext): string;
17
+ /**
18
+ * Formats column list for RETURNING clause.
19
+ * @param returning - Array of columns to format.
20
+ * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
21
+ * @returns Formatted column list (e.g., "table.col1, table.col2").
22
+ */
23
+ formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string;
24
+ }
25
+
26
+ /**
27
+ * Default RETURNING strategy that throws an error when RETURNING is used.
28
+ * Use this for dialects that don't support RETURNING clauses.
29
+ */
30
+ export class NoReturningStrategy implements ReturningStrategy {
31
+ /**
32
+ * Throws an error as RETURNING is not supported.
33
+ * @param returning - Columns to return (causes error if non-empty).
34
+ * @param _ctx - Compiler context (unused).
35
+ * @throws Error indicating RETURNING is not supported.
36
+ */
37
+ compileReturning(returning: ColumnNode[] | undefined, _ctx: CompilerContext): string {
38
+ void _ctx;
39
+ if (!returning || returning.length === 0) return '';
40
+ throw new Error('RETURNING is not supported by this dialect.');
41
+ }
42
+ /**
43
+ * Formats column names for RETURNING clause.
44
+ * @param returning - Columns to format.
45
+ * @param quoteIdentifier - Function to quote identifiers according to dialect rules.
46
+ * @returns Simple comma-separated column names.
47
+ */
48
+ formatReturningColumns(returning: ColumnNode[], quoteIdentifier: (id: string) => string): string {
49
+ return returning
50
+ .map(column => {
51
+ const tablePart = column.table ? `${quoteIdentifier(column.table)}.` : '';
52
+ const aliasPart = column.alias ? ` AS ${quoteIdentifier(column.alias)}` : '';
53
+ return `${tablePart}${quoteIdentifier(column.name)}${aliasPart}`;
54
+ })
55
+ .join(', ');
56
+ }
57
+ }