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,146 +1,146 @@
1
- import { defineTable } from '../../../../schema/table.js';
2
- import { col } from '../../../../schema/column-types.js';
3
-
4
- /** Table definition for information_schema.columns, providing metadata about table columns. */
5
- export const PgInformationSchemaColumns = defineTable(
6
- 'columns',
7
- {
8
- table_schema: col.varchar(255),
9
- table_name: col.varchar(255),
10
- column_name: col.varchar(255),
11
- data_type: col.varchar(255),
12
- is_nullable: col.varchar(3),
13
- column_default: col.varchar(1024),
14
- ordinal_position: col.int()
15
- },
16
- {},
17
- undefined,
18
- { schema: 'information_schema' }
19
- );
20
-
21
- export const PgClass = defineTable(
22
- 'pg_class',
23
- {
24
- oid: col.int(),
25
- relname: col.varchar(255),
26
- relnamespace: col.int(),
27
- relkind: col.varchar(1)
28
- },
29
- {},
30
- undefined,
31
- { schema: 'pg_catalog' }
32
- );
33
-
34
- export const PgNamespace = defineTable(
35
- 'pg_namespace',
36
- {
37
- oid: col.int(),
38
- nspname: col.varchar(255)
39
- },
40
- {},
41
- undefined,
42
- { schema: 'pg_catalog' }
43
- );
44
-
45
- export const PgIndex = defineTable(
46
- 'pg_index',
47
- {
48
- indrelid: col.int(),
49
- indexrelid: col.int(),
50
- indisprimary: col.boolean(),
51
- indkey: col.varchar(255),
52
- indpred: col.varchar(1024)
53
- },
54
- {},
55
- undefined,
56
- { schema: 'pg_catalog' }
57
- );
58
-
59
- export const PgAttribute = defineTable(
60
- 'pg_attribute',
61
- {
62
- attrelid: col.int(),
63
- attname: col.varchar(255),
64
- attnum: col.int()
65
- },
66
- {},
67
- undefined,
68
- { schema: 'pg_catalog' }
69
- );
70
-
71
- export const PgTableConstraints = defineTable(
72
- 'table_constraints',
73
- {
74
- constraint_catalog: col.varchar(255),
75
- constraint_schema: col.varchar(255),
76
- constraint_name: col.varchar(255),
77
- table_catalog: col.varchar(255),
78
- table_schema: col.varchar(255),
79
- table_name: col.varchar(255),
80
- constraint_type: col.varchar(255)
81
- },
82
- {},
83
- undefined,
84
- { schema: 'information_schema' }
85
- );
86
-
87
- export const PgKeyColumnUsage = defineTable(
88
- 'key_column_usage',
89
- {
90
- constraint_catalog: col.varchar(255),
91
- constraint_schema: col.varchar(255),
92
- constraint_name: col.varchar(255),
93
- table_catalog: col.varchar(255),
94
- table_schema: col.varchar(255),
95
- table_name: col.varchar(255),
96
- column_name: col.varchar(255),
97
- ordinal_position: col.int()
98
- },
99
- {},
100
- undefined,
101
- { schema: 'information_schema' }
102
- );
103
-
104
- export const PgConstraintColumnUsage = defineTable(
105
- 'constraint_column_usage',
106
- {
107
- constraint_catalog: col.varchar(255),
108
- constraint_schema: col.varchar(255),
109
- constraint_name: col.varchar(255),
110
- table_catalog: col.varchar(255),
111
- table_schema: col.varchar(255),
112
- table_name: col.varchar(255),
113
- column_name: col.varchar(255)
114
- },
115
- {},
116
- undefined,
117
- { schema: 'information_schema' }
118
- );
119
-
120
- export const PgReferentialConstraints = defineTable(
121
- 'referential_constraints',
122
- {
123
- constraint_catalog: col.varchar(255),
124
- constraint_schema: col.varchar(255),
125
- constraint_name: col.varchar(255),
126
- unique_constraint_catalog: col.varchar(255),
127
- unique_constraint_schema: col.varchar(255),
128
- unique_constraint_name: col.varchar(255),
129
- match_option: col.varchar(64),
130
- update_rule: col.varchar(64),
131
- delete_rule: col.varchar(64)
132
- },
133
- {},
134
- undefined,
135
- { schema: 'information_schema' }
136
- );
137
-
138
- /** Default export containing commonly used PostgreSQL catalog table definitions. */
139
- export default {
140
- PgInformationSchemaColumns,
141
- PgClass,
142
- PgNamespace,
143
- PgIndex,
144
- PgAttribute
145
- };
146
-
1
+ import { defineTable } from '../../../../schema/table.js';
2
+ import { col } from '../../../../schema/column-types.js';
3
+
4
+ /** Table definition for information_schema.columns, providing metadata about table columns. */
5
+ export const PgInformationSchemaColumns = defineTable(
6
+ 'columns',
7
+ {
8
+ table_schema: col.varchar(255),
9
+ table_name: col.varchar(255),
10
+ column_name: col.varchar(255),
11
+ data_type: col.varchar(255),
12
+ is_nullable: col.varchar(3),
13
+ column_default: col.varchar(1024),
14
+ ordinal_position: col.int()
15
+ },
16
+ {},
17
+ undefined,
18
+ { schema: 'information_schema' }
19
+ );
20
+
21
+ export const PgClass = defineTable(
22
+ 'pg_class',
23
+ {
24
+ oid: col.int(),
25
+ relname: col.varchar(255),
26
+ relnamespace: col.int(),
27
+ relkind: col.varchar(1)
28
+ },
29
+ {},
30
+ undefined,
31
+ { schema: 'pg_catalog' }
32
+ );
33
+
34
+ export const PgNamespace = defineTable(
35
+ 'pg_namespace',
36
+ {
37
+ oid: col.int(),
38
+ nspname: col.varchar(255)
39
+ },
40
+ {},
41
+ undefined,
42
+ { schema: 'pg_catalog' }
43
+ );
44
+
45
+ export const PgIndex = defineTable(
46
+ 'pg_index',
47
+ {
48
+ indrelid: col.int(),
49
+ indexrelid: col.int(),
50
+ indisprimary: col.boolean(),
51
+ indkey: col.varchar(255),
52
+ indpred: col.varchar(1024)
53
+ },
54
+ {},
55
+ undefined,
56
+ { schema: 'pg_catalog' }
57
+ );
58
+
59
+ export const PgAttribute = defineTable(
60
+ 'pg_attribute',
61
+ {
62
+ attrelid: col.int(),
63
+ attname: col.varchar(255),
64
+ attnum: col.int()
65
+ },
66
+ {},
67
+ undefined,
68
+ { schema: 'pg_catalog' }
69
+ );
70
+
71
+ export const PgTableConstraints = defineTable(
72
+ 'table_constraints',
73
+ {
74
+ constraint_catalog: col.varchar(255),
75
+ constraint_schema: col.varchar(255),
76
+ constraint_name: col.varchar(255),
77
+ table_catalog: col.varchar(255),
78
+ table_schema: col.varchar(255),
79
+ table_name: col.varchar(255),
80
+ constraint_type: col.varchar(255)
81
+ },
82
+ {},
83
+ undefined,
84
+ { schema: 'information_schema' }
85
+ );
86
+
87
+ export const PgKeyColumnUsage = defineTable(
88
+ 'key_column_usage',
89
+ {
90
+ constraint_catalog: col.varchar(255),
91
+ constraint_schema: col.varchar(255),
92
+ constraint_name: col.varchar(255),
93
+ table_catalog: col.varchar(255),
94
+ table_schema: col.varchar(255),
95
+ table_name: col.varchar(255),
96
+ column_name: col.varchar(255),
97
+ ordinal_position: col.int()
98
+ },
99
+ {},
100
+ undefined,
101
+ { schema: 'information_schema' }
102
+ );
103
+
104
+ export const PgConstraintColumnUsage = defineTable(
105
+ 'constraint_column_usage',
106
+ {
107
+ constraint_catalog: col.varchar(255),
108
+ constraint_schema: col.varchar(255),
109
+ constraint_name: col.varchar(255),
110
+ table_catalog: col.varchar(255),
111
+ table_schema: col.varchar(255),
112
+ table_name: col.varchar(255),
113
+ column_name: col.varchar(255)
114
+ },
115
+ {},
116
+ undefined,
117
+ { schema: 'information_schema' }
118
+ );
119
+
120
+ export const PgReferentialConstraints = defineTable(
121
+ 'referential_constraints',
122
+ {
123
+ constraint_catalog: col.varchar(255),
124
+ constraint_schema: col.varchar(255),
125
+ constraint_name: col.varchar(255),
126
+ unique_constraint_catalog: col.varchar(255),
127
+ unique_constraint_schema: col.varchar(255),
128
+ unique_constraint_name: col.varchar(255),
129
+ match_option: col.varchar(64),
130
+ update_rule: col.varchar(64),
131
+ delete_rule: col.varchar(64)
132
+ },
133
+ {},
134
+ undefined,
135
+ { schema: 'information_schema' }
136
+ );
137
+
138
+ /** Default export containing commonly used PostgreSQL catalog table definitions. */
139
+ export default {
140
+ PgInformationSchemaColumns,
141
+ PgClass,
142
+ PgNamespace,
143
+ PgIndex,
144
+ PgAttribute
145
+ };
146
+
@@ -1,15 +1,15 @@
1
- import type { Dialect } from '../../dialect/abstract.js';
2
- import type { DbExecutor } from '../../execution/db-executor.js';
3
-
4
- /**
5
- * Context for schema introspection operations.
6
- * Provides the necessary components to perform database schema introspection.
7
- */
8
- export interface IntrospectContext {
9
- /** The database dialect used for introspection. */
10
- dialect: Dialect;
11
- /** The database executor for running introspection queries. */
12
- executor: DbExecutor;
13
- }
14
-
15
- export default IntrospectContext;
1
+ import type { Dialect } from '../../dialect/abstract.js';
2
+ import type { DbExecutor } from '../../execution/db-executor.js';
3
+
4
+ /**
5
+ * Context for schema introspection operations.
6
+ * Provides the necessary components to perform database schema introspection.
7
+ */
8
+ export interface IntrospectContext {
9
+ /** The database dialect used for introspection. */
10
+ dialect: Dialect;
11
+ /** The database executor for running introspection queries. */
12
+ executor: DbExecutor;
13
+ }
14
+
15
+ export default IntrospectContext;
@@ -1,35 +1,35 @@
1
- // Small helpers to build Postgres-specific function calls as AST FunctionNodes
2
- import { valueToOperand } from '../../../ast/expression-builders.js';
3
- import type { OperandNode, FunctionNode } from '../../../ast/expression.js';
4
-
5
- type OperandInput = OperandNode | string | number | boolean | null;
6
-
7
- const toOperand = (v: OperandInput): OperandNode => valueToOperand(v);
8
-
9
- const fn = (name: string, args: OperandInput[]): FunctionNode => ({
10
- type: 'Function',
11
- name,
12
- fn: name,
13
- args: args.map(toOperand)
14
- });
15
-
16
- /**
17
- * Creates a pg_get_expr function call AST node.
18
- * @param expr - The expression.
19
- * @param relid - The relation ID.
20
- * @returns The function node.
21
- */
22
- export const pgGetExpr = (expr: OperandInput, relid: OperandInput): FunctionNode =>
23
- fn('pg_get_expr', [expr, relid]);
24
-
25
- /**
26
- * Creates a format_type function call AST node.
27
- * @param typeOid - The type OID.
28
- * @param typmod - The type modifier.
29
- * @returns The function node.
30
- */
31
- export const formatType = (typeOid: OperandInput, typmod: OperandInput): FunctionNode =>
32
- fn('format_type', [typeOid, typmod]);
33
-
34
- /** Default export with PostgreSQL-specific function helpers. */
35
- export default { pgGetExpr, formatType };
1
+ // Small helpers to build Postgres-specific function calls as AST FunctionNodes
2
+ import { valueToOperand } from '../../../ast/expression-builders.js';
3
+ import type { OperandNode, FunctionNode } from '../../../ast/expression.js';
4
+
5
+ type OperandInput = OperandNode | string | number | boolean | null;
6
+
7
+ const toOperand = (v: OperandInput): OperandNode => valueToOperand(v);
8
+
9
+ const fn = (name: string, args: OperandInput[]): FunctionNode => ({
10
+ type: 'Function',
11
+ name,
12
+ fn: name,
13
+ args: args.map(toOperand)
14
+ });
15
+
16
+ /**
17
+ * Creates a pg_get_expr function call AST node.
18
+ * @param expr - The expression.
19
+ * @param relid - The relation ID.
20
+ * @returns The function node.
21
+ */
22
+ export const pgGetExpr = (expr: OperandInput, relid: OperandInput): FunctionNode =>
23
+ fn('pg_get_expr', [expr, relid]);
24
+
25
+ /**
26
+ * Creates a format_type function call AST node.
27
+ * @param typeOid - The type OID.
28
+ * @param typmod - The type modifier.
29
+ * @returns The function node.
30
+ */
31
+ export const formatType = (typeOid: OperandInput, typmod: OperandInput): FunctionNode =>
32
+ fn('format_type', [typeOid, typmod]);
33
+
34
+ /** Default export with PostgreSQL-specific function helpers. */
35
+ export default { pgGetExpr, formatType };
@@ -98,6 +98,31 @@ const databaseFunction: FunctionNode = {
98
98
  args: []
99
99
  };
100
100
 
101
+ const readMysqlField = (row: object, field: string): unknown => {
102
+ const record = row as Record<string, unknown>;
103
+
104
+ if (Object.prototype.hasOwnProperty.call(record, field)) {
105
+ return record[field];
106
+ }
107
+
108
+ const lower = field.toLowerCase();
109
+ if (lower !== field && Object.prototype.hasOwnProperty.call(record, lower)) {
110
+ return record[lower];
111
+ }
112
+
113
+ const upper = field.toUpperCase();
114
+ if (upper !== field && Object.prototype.hasOwnProperty.call(record, upper)) {
115
+ return record[upper];
116
+ }
117
+
118
+ return undefined;
119
+ };
120
+
121
+ const readMysqlStringField = (row: object, field: string): string | undefined => {
122
+ const value = readMysqlField(row, field);
123
+ return typeof value === 'string' ? value : undefined;
124
+ };
125
+
101
126
  /**
102
127
  * Schema introspector for MySQL.
103
128
  * Queries information_schema tables to extract schema metadata.
@@ -254,30 +279,58 @@ export const mysqlIntrospector: SchemaIntrospector = {
254
279
 
255
280
  const tableComments = new Map<string, string>();
256
281
  tableRows.forEach(r => {
257
- const key = `${r.table_schema}.${r.table_name}`;
258
- if (r.table_comment) {
259
- tableComments.set(key, r.table_comment);
282
+ const tableSchema = readMysqlStringField(r, 'table_schema');
283
+ const tableName = readMysqlStringField(r, 'table_name');
284
+ const tableComment = readMysqlStringField(r, 'table_comment');
285
+ if (!tableSchema || !tableName) return;
286
+ const key = `${tableSchema}.${tableName}`;
287
+ if (tableComment) {
288
+ tableComments.set(key, tableComment);
260
289
  }
261
290
  });
262
291
 
263
292
  const pkMap = new Map<string, string[]>();
264
293
  pkRows.forEach(r => {
265
- const key = `${r.table_schema}.${r.table_name}`;
294
+ const tableSchema = readMysqlStringField(r, 'table_schema');
295
+ const tableName = readMysqlStringField(r, 'table_name');
296
+ const columnName = readMysqlStringField(r, 'column_name');
297
+ if (!tableSchema || !tableName || !columnName) return;
298
+ const key = `${tableSchema}.${tableName}`;
266
299
  const list = pkMap.get(key) || [];
267
- list.push(r.column_name);
300
+ list.push(columnName);
268
301
  pkMap.set(key, list);
269
302
  });
270
303
 
271
304
  const fkMap = new Map<string, MysqlForeignKeyEntry[]>();
272
305
  fkRows.forEach(r => {
273
- const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;
306
+ const tableSchema = readMysqlStringField(r, 'table_schema');
307
+ const tableName = readMysqlStringField(r, 'table_name');
308
+ const columnName = readMysqlStringField(r, 'column_name');
309
+ const constraintName = readMysqlStringField(r, 'constraint_name');
310
+ const referencedTableSchema = readMysqlStringField(r, 'referenced_table_schema');
311
+ const referencedTableName = readMysqlStringField(r, 'referenced_table_name');
312
+ const referencedColumnName = readMysqlStringField(r, 'referenced_column_name');
313
+ const deleteRule = readMysqlStringField(r, 'delete_rule');
314
+ const updateRule = readMysqlStringField(r, 'update_rule');
315
+ if (
316
+ !tableSchema ||
317
+ !tableName ||
318
+ !columnName ||
319
+ !constraintName ||
320
+ !referencedTableSchema ||
321
+ !referencedTableName ||
322
+ !referencedColumnName
323
+ ) {
324
+ return;
325
+ }
326
+ const key = `${tableSchema}.${tableName}.${columnName}`;
274
327
  const list = fkMap.get(key) || [];
275
328
  list.push({
276
- table: `${r.referenced_table_schema}.${r.referenced_table_name}`,
277
- column: r.referenced_column_name,
278
- onDelete: r.delete_rule,
279
- onUpdate: r.update_rule,
280
- name: r.constraint_name
329
+ table: `${referencedTableSchema}.${referencedTableName}`,
330
+ column: referencedColumnName,
331
+ onDelete: deleteRule,
332
+ onUpdate: updateRule,
333
+ name: constraintName
281
334
  });
282
335
  fkMap.set(key, list);
283
336
  });
@@ -285,12 +338,21 @@ export const mysqlIntrospector: SchemaIntrospector = {
285
338
  const tablesByKey = new Map<string, DatabaseTable>();
286
339
 
287
340
  columnRows.forEach(r => {
288
- const key = `${r.table_schema}.${r.table_name}`;
289
- if (!shouldIncludeTable(r.table_name, options)) return;
341
+ const tableSchema = readMysqlStringField(r, 'table_schema');
342
+ const tableName = readMysqlStringField(r, 'table_name');
343
+ const columnName = readMysqlStringField(r, 'column_name');
344
+ const columnType = readMysqlStringField(r, 'column_type') || readMysqlStringField(r, 'data_type');
345
+ const isNullable = readMysqlStringField(r, 'is_nullable');
346
+ const columnDefault = readMysqlField(r, 'column_default');
347
+ const extra = readMysqlStringField(r, 'extra');
348
+ const columnComment = readMysqlStringField(r, 'column_comment');
349
+ if (!tableSchema || !tableName || !columnName || !columnType || !isNullable) return;
350
+ const key = `${tableSchema}.${tableName}`;
351
+ if (!shouldIncludeTable(tableName, options)) return;
290
352
  if (!tablesByKey.has(key)) {
291
353
  tablesByKey.set(key, {
292
- name: r.table_name,
293
- schema: r.table_schema,
354
+ name: tableName,
355
+ schema: tableSchema,
294
356
  columns: [],
295
357
  primaryKey: pkMap.get(key) || [],
296
358
  indexes: [],
@@ -298,17 +360,16 @@ export const mysqlIntrospector: SchemaIntrospector = {
298
360
  });
299
361
  }
300
362
  const table = tablesByKey.get(key)!;
301
- const columnType = r.column_type || r.data_type;
302
- const comment = r.column_comment?.trim() ? r.column_comment : undefined;
363
+ const comment = columnComment?.trim() ? columnComment : undefined;
303
364
  const column: DatabaseColumn = {
304
- name: r.column_name,
365
+ name: columnName,
305
366
  type: columnType,
306
- notNull: r.is_nullable === 'NO',
307
- default: r.column_default ?? undefined,
308
- autoIncrement: typeof r.extra === 'string' && r.extra.includes('auto_increment'),
367
+ notNull: isNullable === 'NO',
368
+ default: columnDefault ?? undefined,
369
+ autoIncrement: typeof extra === 'string' && extra.includes('auto_increment'),
309
370
  comment
310
371
  };
311
- const fk = fkMap.get(`${key}.${r.column_name}`)?.[0];
372
+ const fk = fkMap.get(`${key}.${columnName}`)?.[0];
312
373
  if (fk) {
313
374
  column.references = {
314
375
  table: fk.table,
@@ -322,14 +383,20 @@ export const mysqlIntrospector: SchemaIntrospector = {
322
383
  });
323
384
 
324
385
  indexRows.forEach(r => {
325
- const key = `${r.table_schema}.${r.table_name}`;
386
+ const tableSchema = readMysqlStringField(r, 'table_schema');
387
+ const tableName = readMysqlStringField(r, 'table_name');
388
+ const indexName = readMysqlStringField(r, 'index_name');
389
+ const nonUnique = readMysqlField(r, 'non_unique');
390
+ const colsValue = readMysqlField(r, 'cols');
391
+ if (!tableSchema || !tableName || !indexName) return;
392
+ const key = `${tableSchema}.${tableName}`;
326
393
  const table = tablesByKey.get(key);
327
394
  if (!table) return;
328
- const cols = (typeof r.cols === 'string' ? r.cols.split(',') : []).map(c => ({ column: c.trim() }));
395
+ const cols = (typeof colsValue === 'string' ? colsValue.split(',') : []).map(c => ({ column: c.trim() }));
329
396
  const idx: DatabaseIndex = {
330
- name: r.index_name,
397
+ name: indexName,
331
398
  columns: cols,
332
- unique: r.non_unique === 0
399
+ unique: Number(nonUnique) === 0
333
400
  };
334
401
  table.indexes = table.indexes || [];
335
402
  table.indexes.push(idx);
@@ -409,26 +476,36 @@ export const mysqlIntrospector: SchemaIntrospector = {
409
476
  const viewsByKey = new Map<string, DatabaseView>();
410
477
 
411
478
  for (const r of viewRows) {
412
- if (!shouldIncludeView(r.table_name, options)) continue;
413
- const key = `${r.table_schema}.${r.table_name}`;
479
+ const tableSchema = readMysqlStringField(r, 'table_schema');
480
+ const tableName = readMysqlStringField(r, 'table_name');
481
+ const viewDefinition = readMysqlStringField(r, 'view_definition');
482
+ if (!tableSchema || !tableName) continue;
483
+ if (!shouldIncludeView(tableName, options)) continue;
484
+ const key = `${tableSchema}.${tableName}`;
414
485
  viewsByKey.set(key, {
415
- name: r.table_name,
416
- schema: r.table_schema,
486
+ name: tableName,
487
+ schema: tableSchema,
417
488
  columns: [],
418
- definition: r.view_definition || undefined
489
+ definition: viewDefinition || undefined
419
490
  });
420
491
  }
421
492
 
422
493
  for (const r of viewColumnRows) {
423
- const key = `${r.table_schema}.${r.table_name}`;
494
+ const tableSchema = readMysqlStringField(r, 'table_schema');
495
+ const tableName = readMysqlStringField(r, 'table_name');
496
+ const columnName = readMysqlStringField(r, 'column_name');
497
+ const columnType = readMysqlStringField(r, 'column_type') || readMysqlStringField(r, 'data_type');
498
+ const isNullable = readMysqlStringField(r, 'is_nullable');
499
+ const columnComment = readMysqlStringField(r, 'column_comment');
500
+ if (!tableSchema || !tableName || !columnName || !columnType || !isNullable) continue;
501
+ const key = `${tableSchema}.${tableName}`;
424
502
  const view = viewsByKey.get(key);
425
503
  if (!view) continue;
426
- const columnType = r.column_type || r.data_type;
427
504
  const column: DatabaseColumn = {
428
- name: r.column_name,
505
+ name: columnName,
429
506
  type: columnType,
430
- notNull: r.is_nullable === 'NO',
431
- comment: r.column_comment?.trim() || undefined
507
+ notNull: isNullable === 'NO',
508
+ comment: columnComment?.trim() || undefined
432
509
  };
433
510
  view.columns.push(column);
434
511
  }