callman-core 1.29.0 → 1.31.0

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 (218) hide show
  1. package/dist/ai/prompts/diagram.d.ts.map +1 -1
  2. package/dist/ai/prompts/diagram.js +24 -7
  3. package/dist/ai/prompts/diagram.js.map +1 -1
  4. package/dist/ai/types.d.ts +1 -1
  5. package/dist/ai/types.d.ts.map +1 -1
  6. package/dist/diagram/componentCatalog.d.ts +3 -0
  7. package/dist/diagram/componentCatalog.d.ts.map +1 -1
  8. package/dist/diagram/componentCatalog.js +5 -1
  9. package/dist/diagram/componentCatalog.js.map +1 -1
  10. package/dist/diagram/database/derive.d.ts +14 -0
  11. package/dist/diagram/database/derive.d.ts.map +1 -0
  12. package/dist/diagram/database/derive.js +114 -0
  13. package/dist/diagram/database/derive.js.map +1 -0
  14. package/dist/diagram/database/diff.d.ts +48 -0
  15. package/dist/diagram/database/diff.d.ts.map +1 -0
  16. package/dist/diagram/database/diff.js +109 -0
  17. package/dist/diagram/database/diff.js.map +1 -0
  18. package/dist/diagram/database/edit.d.ts +113 -0
  19. package/dist/diagram/database/edit.d.ts.map +1 -0
  20. package/dist/diagram/database/edit.js +359 -0
  21. package/dist/diagram/database/edit.js.map +1 -0
  22. package/dist/diagram/database/fromSchema.d.ts +12 -0
  23. package/dist/diagram/database/fromSchema.d.ts.map +1 -0
  24. package/dist/diagram/database/fromSchema.js +182 -0
  25. package/dist/diagram/database/fromSchema.js.map +1 -0
  26. package/dist/diagram/database/index.d.ts +9 -0
  27. package/dist/diagram/database/index.d.ts.map +1 -0
  28. package/dist/diagram/database/index.js +14 -0
  29. package/dist/diagram/database/index.js.map +1 -0
  30. package/dist/diagram/database/model.d.ts +93 -0
  31. package/dist/diagram/database/model.d.ts.map +1 -0
  32. package/dist/diagram/database/model.js +294 -0
  33. package/dist/diagram/database/model.js.map +1 -0
  34. package/dist/diagram/database/patch.d.ts +14 -0
  35. package/dist/diagram/database/patch.d.ts.map +1 -0
  36. package/dist/diagram/database/patch.js +186 -0
  37. package/dist/diagram/database/patch.js.map +1 -0
  38. package/dist/diagram/database/place.d.ts +4 -0
  39. package/dist/diagram/database/place.d.ts.map +1 -0
  40. package/dist/diagram/database/place.js +22 -0
  41. package/dist/diagram/database/place.js.map +1 -0
  42. package/dist/diagram/database/types.d.ts +50 -0
  43. package/dist/diagram/database/types.d.ts.map +1 -0
  44. package/dist/diagram/database/types.js +106 -0
  45. package/dist/diagram/database/types.js.map +1 -0
  46. package/dist/diagram/index.d.ts +1 -0
  47. package/dist/diagram/index.d.ts.map +1 -1
  48. package/dist/diagram/index.js +1 -0
  49. package/dist/diagram/index.js.map +1 -1
  50. package/dist/diagram/layout.d.ts +1 -0
  51. package/dist/diagram/layout.d.ts.map +1 -1
  52. package/dist/diagram/layout.js +2 -1
  53. package/dist/diagram/layout.js.map +1 -1
  54. package/dist/diagram/ops.d.ts +1 -1
  55. package/dist/diagram/ops.d.ts.map +1 -1
  56. package/dist/diagram/ops.js +42 -0
  57. package/dist/diagram/ops.js.map +1 -1
  58. package/dist/diagram/opsReference.d.ts +1 -1
  59. package/dist/diagram/opsReference.d.ts.map +1 -1
  60. package/dist/diagram/opsReference.js +9 -0
  61. package/dist/diagram/opsReference.js.map +1 -1
  62. package/dist/diagram/patchInput.d.ts +65 -1
  63. package/dist/diagram/patchInput.d.ts.map +1 -1
  64. package/dist/diagram/patchInput.js +414 -11
  65. package/dist/diagram/patchInput.js.map +1 -1
  66. package/dist/diagram/schema.d.ts +2 -2
  67. package/dist/diagram/schema.d.ts.map +1 -1
  68. package/dist/diagram/schema.js +3 -3
  69. package/dist/diagram/schema.js.map +1 -1
  70. package/dist/diagram/views.d.ts +13 -0
  71. package/dist/diagram/views.d.ts.map +1 -1
  72. package/dist/diagram/views.js +49 -0
  73. package/dist/diagram/views.js.map +1 -1
  74. package/dist/host/db/introspection/index.d.ts +9 -0
  75. package/dist/host/db/introspection/index.d.ts.map +1 -0
  76. package/dist/host/db/introspection/index.js +35 -0
  77. package/dist/host/db/introspection/index.js.map +1 -0
  78. package/dist/host/db/introspection/mongo.d.ts +7 -0
  79. package/dist/host/db/introspection/mongo.d.ts.map +1 -0
  80. package/dist/host/db/introspection/mongo.js +183 -0
  81. package/dist/host/db/introspection/mongo.js.map +1 -0
  82. package/dist/host/db/introspection/mssql.d.ts +6 -0
  83. package/dist/host/db/introspection/mssql.d.ts.map +1 -0
  84. package/dist/host/db/introspection/mssql.js +211 -0
  85. package/dist/host/db/introspection/mssql.js.map +1 -0
  86. package/dist/host/db/introspection/mysql.d.ts +5 -0
  87. package/dist/host/db/introspection/mysql.d.ts.map +1 -0
  88. package/dist/host/db/introspection/mysql.js +163 -0
  89. package/dist/host/db/introspection/mysql.js.map +1 -0
  90. package/dist/host/db/introspection/oracle.d.ts +12 -0
  91. package/dist/host/db/introspection/oracle.d.ts.map +1 -0
  92. package/dist/host/db/introspection/oracle.js +225 -0
  93. package/dist/host/db/introspection/oracle.js.map +1 -0
  94. package/dist/host/db/introspection/postgres.d.ts +5 -0
  95. package/dist/host/db/introspection/postgres.d.ts.map +1 -0
  96. package/dist/host/db/introspection/postgres.js +172 -0
  97. package/dist/host/db/introspection/postgres.js.map +1 -0
  98. package/dist/host/db/introspection/shared.d.ts +29 -0
  99. package/dist/host/db/introspection/shared.d.ts.map +1 -0
  100. package/dist/host/db/introspection/shared.js +119 -0
  101. package/dist/host/db/introspection/shared.js.map +1 -0
  102. package/dist/host/db/introspection/types.d.ts +58 -0
  103. package/dist/host/db/introspection/types.d.ts.map +1 -0
  104. package/dist/host/db/introspection/types.js +6 -0
  105. package/dist/host/db/introspection/types.js.map +1 -0
  106. package/dist/host/db/mongoAdapter.d.ts +1 -0
  107. package/dist/host/db/mongoAdapter.d.ts.map +1 -1
  108. package/dist/host/db/mongoAdapter.js +13 -0
  109. package/dist/host/db/mongoAdapter.js.map +1 -1
  110. package/dist/host/db/mssqlAdapter.d.ts +1 -0
  111. package/dist/host/db/mssqlAdapter.d.ts.map +1 -1
  112. package/dist/host/db/mssqlAdapter.js +3 -1
  113. package/dist/host/db/mssqlAdapter.js.map +1 -1
  114. package/dist/host/db/mysqlAdapter.d.ts +1 -0
  115. package/dist/host/db/mysqlAdapter.d.ts.map +1 -1
  116. package/dist/host/db/mysqlAdapter.js +11 -0
  117. package/dist/host/db/mysqlAdapter.js.map +1 -1
  118. package/dist/host/db/oracleAdapter.d.ts +1 -0
  119. package/dist/host/db/oracleAdapter.d.ts.map +1 -1
  120. package/dist/host/db/oracleAdapter.js +22 -0
  121. package/dist/host/db/oracleAdapter.js.map +1 -1
  122. package/dist/host/db/postgresAdapter.d.ts +1 -0
  123. package/dist/host/db/postgresAdapter.d.ts.map +1 -1
  124. package/dist/host/db/postgresAdapter.js +13 -0
  125. package/dist/host/db/postgresAdapter.js.map +1 -1
  126. package/dist/host/db/queryExecutor.d.ts +2 -1
  127. package/dist/host/db/queryExecutor.d.ts.map +1 -1
  128. package/dist/host/db/queryExecutor.js +1 -1
  129. package/dist/host/db/queryExecutor.js.map +1 -1
  130. package/dist/host/index.d.ts +7 -0
  131. package/dist/host/index.d.ts.map +1 -1
  132. package/dist/host/index.js +9 -0
  133. package/dist/host/index.js.map +1 -1
  134. package/dist/index.d.ts +2 -0
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +2 -0
  137. package/dist/index.js.map +1 -1
  138. package/dist/ui-test/commands.d.ts +54 -0
  139. package/dist/ui-test/commands.d.ts.map +1 -0
  140. package/dist/ui-test/commands.js +436 -0
  141. package/dist/ui-test/commands.js.map +1 -0
  142. package/dist/ui-test/flow-lint.d.ts +43 -0
  143. package/dist/ui-test/flow-lint.d.ts.map +1 -0
  144. package/dist/ui-test/flow-lint.js +229 -0
  145. package/dist/ui-test/flow-lint.js.map +1 -0
  146. package/dist-cjs/ai/prompts/diagram.js +23 -6
  147. package/dist-cjs/ai/prompts/diagram.js.map +1 -1
  148. package/dist-cjs/diagram/componentCatalog.js +5 -1
  149. package/dist-cjs/diagram/componentCatalog.js.map +1 -1
  150. package/dist-cjs/diagram/database/derive.js +119 -0
  151. package/dist-cjs/diagram/database/derive.js.map +1 -0
  152. package/dist-cjs/diagram/database/diff.js +115 -0
  153. package/dist-cjs/diagram/database/diff.js.map +1 -0
  154. package/dist-cjs/diagram/database/edit.js +366 -0
  155. package/dist-cjs/diagram/database/edit.js.map +1 -0
  156. package/dist-cjs/diagram/database/fromSchema.js +188 -0
  157. package/dist-cjs/diagram/database/fromSchema.js.map +1 -0
  158. package/dist-cjs/diagram/database/index.js +32 -0
  159. package/dist-cjs/diagram/database/index.js.map +1 -0
  160. package/dist-cjs/diagram/database/model.js +311 -0
  161. package/dist-cjs/diagram/database/model.js.map +1 -0
  162. package/dist-cjs/diagram/database/patch.js +190 -0
  163. package/dist-cjs/diagram/database/patch.js.map +1 -0
  164. package/dist-cjs/diagram/database/place.js +26 -0
  165. package/dist-cjs/diagram/database/place.js.map +1 -0
  166. package/dist-cjs/diagram/database/types.js +122 -0
  167. package/dist-cjs/diagram/database/types.js.map +1 -0
  168. package/dist-cjs/diagram/index.js +1 -0
  169. package/dist-cjs/diagram/index.js.map +1 -1
  170. package/dist-cjs/diagram/layout.js +3 -2
  171. package/dist-cjs/diagram/layout.js.map +1 -1
  172. package/dist-cjs/diagram/ops.js +42 -0
  173. package/dist-cjs/diagram/ops.js.map +1 -1
  174. package/dist-cjs/diagram/opsReference.js +9 -0
  175. package/dist-cjs/diagram/opsReference.js.map +1 -1
  176. package/dist-cjs/diagram/patchInput.js +414 -11
  177. package/dist-cjs/diagram/patchInput.js.map +1 -1
  178. package/dist-cjs/diagram/schema.js +3 -3
  179. package/dist-cjs/diagram/schema.js.map +1 -1
  180. package/dist-cjs/diagram/views.js +51 -1
  181. package/dist-cjs/diagram/views.js.map +1 -1
  182. package/dist-cjs/host/db/introspection/index.js +59 -0
  183. package/dist-cjs/host/db/introspection/index.js.map +1 -0
  184. package/dist-cjs/host/db/introspection/mongo.js +189 -0
  185. package/dist-cjs/host/db/introspection/mongo.js.map +1 -0
  186. package/dist-cjs/host/db/introspection/mssql.js +216 -0
  187. package/dist-cjs/host/db/introspection/mssql.js.map +1 -0
  188. package/dist-cjs/host/db/introspection/mysql.js +167 -0
  189. package/dist-cjs/host/db/introspection/mysql.js.map +1 -0
  190. package/dist-cjs/host/db/introspection/oracle.js +230 -0
  191. package/dist-cjs/host/db/introspection/oracle.js.map +1 -0
  192. package/dist-cjs/host/db/introspection/postgres.js +176 -0
  193. package/dist-cjs/host/db/introspection/postgres.js.map +1 -0
  194. package/dist-cjs/host/db/introspection/shared.js +133 -0
  195. package/dist-cjs/host/db/introspection/shared.js.map +1 -0
  196. package/dist-cjs/host/db/introspection/types.js +7 -0
  197. package/dist-cjs/host/db/introspection/types.js.map +1 -0
  198. package/dist-cjs/host/db/mongoAdapter.js +15 -1
  199. package/dist-cjs/host/db/mongoAdapter.js.map +1 -1
  200. package/dist-cjs/host/db/mssqlAdapter.js +5 -2
  201. package/dist-cjs/host/db/mssqlAdapter.js.map +1 -1
  202. package/dist-cjs/host/db/mysqlAdapter.js +13 -1
  203. package/dist-cjs/host/db/mysqlAdapter.js.map +1 -1
  204. package/dist-cjs/host/db/oracleAdapter.js +24 -1
  205. package/dist-cjs/host/db/oracleAdapter.js.map +1 -1
  206. package/dist-cjs/host/db/postgresAdapter.js +15 -1
  207. package/dist-cjs/host/db/postgresAdapter.js.map +1 -1
  208. package/dist-cjs/host/db/queryExecutor.js +5 -4
  209. package/dist-cjs/host/db/queryExecutor.js.map +1 -1
  210. package/dist-cjs/host/index.js +24 -1
  211. package/dist-cjs/host/index.js.map +1 -1
  212. package/dist-cjs/index.js +2 -0
  213. package/dist-cjs/index.js.map +1 -1
  214. package/dist-cjs/ui-test/commands.js +441 -0
  215. package/dist-cjs/ui-test/commands.js.map +1 -0
  216. package/dist-cjs/ui-test/flow-lint.js +235 -0
  217. package/dist-cjs/ui-test/flow-lint.js.map +1 -0
  218. package/package.json +3 -1
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ // Oracle schema introspection over the ALL_* data dictionary views (one
3
+ // connection, a handful of queries per schema/owner). The current schema is
4
+ // read unless owners are named; Oracle-maintained accounts are never listed.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.introspectOracle = exports.formatOracleType = void 0;
7
+ const oracleAdapter_js_1 = require("../oracleAdapter.js");
8
+ const shared_js_1 = require("./shared.js");
9
+ const CURRENT_SCHEMA_SQL = "SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS SCH FROM DUAL";
10
+ const DB_NAME_SQL = "SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS DB FROM DUAL";
11
+ const SCHEMAS_SQL = "SELECT USERNAME AS SCH FROM ALL_USERS WHERE ORACLE_MAINTAINED = 'N' ORDER BY 1";
12
+ const SCHEMAS_FALLBACK_SQL = `
13
+ SELECT USERNAME AS SCH FROM ALL_USERS
14
+ WHERE USERNAME NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'XDB', 'CTXSYS', 'MDSYS', 'ORDSYS', 'ORDDATA', 'WMSYS', 'DBSNMP', 'APPQOSSYS', 'AUDSYS',
15
+ 'GSMADMIN_INTERNAL', 'DVSYS', 'LBACSYS', 'OJVMSYS', 'OLAPSYS', 'ORACLE_OCM', 'REMOTE_SCHEDULER_AGENT', 'SYSBACKUP', 'SYSDG', 'SYSKM', 'SYSRAC',
16
+ 'SYS$UMF', 'DBSFWUSER', 'GGSYS', 'ANONYMOUS', 'XS$NULL', 'DIP', 'APEX_PUBLIC_USER', 'FLOWS_FILES', 'MDDATA', 'SI_INFORMTN_SCHEMA', 'ORDPLUGINS',
17
+ 'SPATIAL_CSW_ADMIN_USR', 'WKSYS', 'WKPROXY', 'WK_TEST', 'EXFSYS', 'DMSYS', 'TSMSYS', 'OWBSYS', 'OWBSYS_AUDIT', 'SCOTT', 'HR', 'OE', 'PM', 'IX', 'SH', 'BI')
18
+ ORDER BY 1`;
19
+ const TABLES_SQL = `
20
+ SELECT t.OWNER AS SCH, t.TABLE_NAME AS TBL, 'table' AS KIND, c.COMMENTS AS TABLE_COMMENT, t.NUM_ROWS AS ESTIMATE
21
+ FROM ALL_TABLES t
22
+ LEFT JOIN ALL_TAB_COMMENTS c ON c.OWNER = t.OWNER AND c.TABLE_NAME = t.TABLE_NAME
23
+ WHERE t.OWNER = :owner AND t.TABLE_NAME NOT LIKE 'BIN$%'
24
+ UNION ALL
25
+ SELECT v.OWNER, v.VIEW_NAME, 'view', c.COMMENTS, NULL
26
+ FROM ALL_VIEWS v
27
+ LEFT JOIN ALL_TAB_COMMENTS c ON c.OWNER = v.OWNER AND c.TABLE_NAME = v.VIEW_NAME
28
+ WHERE v.OWNER = :owner
29
+ ORDER BY 1, 2`;
30
+ const COLUMNS_SQL = `
31
+ SELECT c.TABLE_NAME AS TBL, c.COLUMN_NAME AS COL, c.COLUMN_ID AS ORDINAL, c.DATA_TYPE, c.DATA_LENGTH, c.CHAR_LENGTH,
32
+ c.DATA_PRECISION, c.DATA_SCALE, c.NULLABLE, c.DATA_DEFAULT, cc.COMMENTS AS COL_COMMENT
33
+ FROM ALL_TAB_COLUMNS c
34
+ LEFT JOIN ALL_COL_COMMENTS cc ON cc.OWNER = c.OWNER AND cc.TABLE_NAME = c.TABLE_NAME AND cc.COLUMN_NAME = c.COLUMN_NAME
35
+ WHERE c.OWNER = :owner
36
+ ORDER BY 1, 3`;
37
+ const CONSTRAINTS_SQL = `
38
+ SELECT c.TABLE_NAME AS TBL, c.CONSTRAINT_NAME AS CNAME, c.CONSTRAINT_TYPE AS CTYPE, cc.COLUMN_NAME AS COL, cc.POSITION AS POS,
39
+ c.R_OWNER AS REF_OWNER, c.R_CONSTRAINT_NAME AS REF_CNAME, c.DELETE_RULE AS ON_DELETE
40
+ FROM ALL_CONSTRAINTS c
41
+ JOIN ALL_CONS_COLUMNS cc ON cc.OWNER = c.OWNER AND cc.CONSTRAINT_NAME = c.CONSTRAINT_NAME AND cc.TABLE_NAME = c.TABLE_NAME
42
+ WHERE c.OWNER = :owner AND c.CONSTRAINT_TYPE IN ('P', 'U', 'R')
43
+ ORDER BY 1, 2, 5`;
44
+ const KEY_COLUMNS_SQL = `
45
+ SELECT cc.CONSTRAINT_NAME AS CNAME, cc.TABLE_NAME AS TBL, cc.COLUMN_NAME AS COL, cc.POSITION AS POS
46
+ FROM ALL_CONS_COLUMNS cc
47
+ JOIN ALL_CONSTRAINTS c ON c.OWNER = cc.OWNER AND c.CONSTRAINT_NAME = cc.CONSTRAINT_NAME
48
+ WHERE cc.OWNER = :owner AND c.CONSTRAINT_TYPE IN ('P', 'U')
49
+ ORDER BY 1, 4`;
50
+ const INDEXES_SQL = `
51
+ SELECT i.TABLE_NAME AS TBL, i.INDEX_NAME AS NAME, i.UNIQUENESS AS UNIQ, ic.COLUMN_NAME AS COL, ic.COLUMN_POSITION AS POS
52
+ FROM ALL_INDEXES i
53
+ JOIN ALL_IND_COLUMNS ic ON ic.INDEX_OWNER = i.OWNER AND ic.INDEX_NAME = i.INDEX_NAME
54
+ WHERE i.TABLE_OWNER = :owner
55
+ ORDER BY 1, 2, 5`;
56
+ // The type the way SQL Developer prints it: VARCHAR2(120), NUMBER(10,2), DATE.
57
+ const formatOracleType = (row) => {
58
+ const type = String(row.DATA_TYPE ?? "").toUpperCase();
59
+ const charLength = (0, shared_js_1.asNumber)(row.CHAR_LENGTH);
60
+ const dataLength = (0, shared_js_1.asNumber)(row.DATA_LENGTH);
61
+ const precision = (0, shared_js_1.asNumber)(row.DATA_PRECISION);
62
+ const scale = (0, shared_js_1.asNumber)(row.DATA_SCALE);
63
+ if (["VARCHAR2", "NVARCHAR2", "CHAR", "NCHAR"].includes(type))
64
+ return `${type}(${charLength && charLength > 0 ? charLength : dataLength ?? ""})`.replace("()", "");
65
+ if (type === "RAW")
66
+ return dataLength !== undefined ? `RAW(${dataLength})` : type;
67
+ if (type === "NUMBER") {
68
+ if (precision !== undefined)
69
+ return scale ? `NUMBER(${precision},${scale})` : `NUMBER(${precision})`;
70
+ return "NUMBER";
71
+ }
72
+ if (type === "FLOAT")
73
+ return precision !== undefined ? `FLOAT(${precision})` : type;
74
+ return type;
75
+ };
76
+ exports.formatOracleType = formatOracleType;
77
+ const introspectOracle = (connection, options) => (0, oracleAdapter_js_1.withOracleConnection)(connection, async (client, oracledb) => {
78
+ const query = async (sql, binds = {}) => {
79
+ const result = await client.execute(sql, binds, { outFormat: oracledb.OUT_FORMAT_OBJECT });
80
+ return Array.isArray(result?.rows) ? result.rows : [];
81
+ };
82
+ const warnings = [];
83
+ const current = String((await query(CURRENT_SCHEMA_SQL))[0]?.SCH ?? connection.username).toUpperCase();
84
+ let database;
85
+ try {
86
+ database = (0, shared_js_1.asString)((await query(DB_NAME_SQL))[0]?.DB);
87
+ }
88
+ catch {
89
+ database = connection.serviceName?.trim() || connection.database?.trim() || undefined;
90
+ }
91
+ let schemas;
92
+ try {
93
+ schemas = (await query(SCHEMAS_SQL)).map((row) => String(row.SCH));
94
+ }
95
+ catch {
96
+ // ORACLE_MAINTAINED arrived in 12c; older servers get the static list.
97
+ schemas = (await query(SCHEMAS_FALLBACK_SQL)).map((row) => String(row.SCH));
98
+ }
99
+ if (!schemas.includes(current))
100
+ schemas.unshift(current);
101
+ const wanted = options.schemas ? options.schemas.map((name) => name.toUpperCase()) : [current];
102
+ const candidates = [];
103
+ for (const owner of wanted) {
104
+ for (const row of await query(TABLES_SQL, { owner })) {
105
+ candidates.push({
106
+ schema: String(row.SCH),
107
+ name: String(row.TBL),
108
+ kind: String(row.KIND) === "view" ? "view" : "table",
109
+ ...((0, shared_js_1.asString)(row.TABLE_COMMENT) ? { comment: String(row.TABLE_COMMENT) } : {}),
110
+ ...((0, shared_js_1.asNumber)(row.ESTIMATE) !== undefined ? { estimate: (0, shared_js_1.asNumber)(row.ESTIMATE) } : {}),
111
+ });
112
+ }
113
+ }
114
+ const { selected, truncated } = (0, shared_js_1.selectTables)(candidates, options);
115
+ const tables = new Map();
116
+ for (const candidate of selected) {
117
+ tables.set((0, shared_js_1.tableKey)(candidate.schema, candidate.name), (0, shared_js_1.emptyTable)(candidate, {
118
+ ...(candidate.comment ? { comment: candidate.comment } : {}),
119
+ ...(candidate.estimate !== undefined ? { rowCountEstimate: candidate.estimate } : {}),
120
+ }));
121
+ }
122
+ if (!options.objectsOnly && tables.size > 0) {
123
+ const detailOwners = [...new Set(selected.map((candidate) => candidate.schema))];
124
+ // Referenced key constraints, by owner + constraint name, for the FK ends.
125
+ const keyColumns = new Map();
126
+ const loadKeyColumns = async (owner) => {
127
+ for (const row of await query(KEY_COLUMNS_SQL, { owner })) {
128
+ const key = `${owner}.${row.CNAME}`;
129
+ const entry = keyColumns.get(key) ?? { table: String(row.TBL), columns: [] };
130
+ entry.columns.push(String(row.COL));
131
+ keyColumns.set(key, entry);
132
+ }
133
+ };
134
+ for (const owner of detailOwners) {
135
+ for (const row of await query(COLUMNS_SQL, { owner })) {
136
+ const table = tables.get((0, shared_js_1.tableKey)(owner, String(row.TBL)));
137
+ if (!table)
138
+ continue;
139
+ const defaultValue = (0, shared_js_1.asString)(row.DATA_DEFAULT)?.trim();
140
+ table.columns.push({
141
+ name: String(row.COL),
142
+ dataType: (0, exports.formatOracleType)(row),
143
+ ordinal: (0, shared_js_1.asNumber)(row.ORDINAL) ?? table.columns.length + 1,
144
+ nullable: String(row.NULLABLE ?? "Y").toUpperCase() === "Y",
145
+ primaryKey: false,
146
+ ...(defaultValue ? { defaultValue } : {}),
147
+ ...(defaultValue && /\.NEXTVAL$/i.test(defaultValue) ? { autoIncrement: true } : {}),
148
+ ...((0, shared_js_1.asString)(row.COL_COMMENT) ? { comment: String(row.COL_COMMENT) } : {}),
149
+ });
150
+ }
151
+ await loadKeyColumns(owner);
152
+ const groups = new Map();
153
+ for (const row of await query(CONSTRAINTS_SQL, { owner })) {
154
+ const table = tables.get((0, shared_js_1.tableKey)(owner, String(row.TBL)));
155
+ if (!table)
156
+ continue;
157
+ const key = `${row.TBL}.${row.CNAME}`;
158
+ let group = groups.get(key);
159
+ if (!group) {
160
+ group = {
161
+ table,
162
+ name: String(row.CNAME),
163
+ type: String(row.CTYPE),
164
+ columns: [],
165
+ ...((0, shared_js_1.asString)(row.REF_OWNER) ? { refOwner: String(row.REF_OWNER) } : {}),
166
+ ...((0, shared_js_1.asString)(row.REF_CNAME) ? { refName: String(row.REF_CNAME) } : {}),
167
+ ...((0, shared_js_1.referentialAction)(row.ON_DELETE) ? { onDelete: (0, shared_js_1.referentialAction)(row.ON_DELETE) } : {}),
168
+ };
169
+ groups.set(key, group);
170
+ }
171
+ group.columns.push(String(row.COL));
172
+ }
173
+ for (const group of groups.values()) {
174
+ if (group.type === "P")
175
+ group.table.primaryKey = group.columns;
176
+ else if (group.type === "U")
177
+ group.table.indexes.push({ name: group.name, columns: group.columns, unique: true });
178
+ else if (group.type === "R" && group.refOwner && group.refName) {
179
+ if (!detailOwners.includes(group.refOwner) && ![...keyColumns.keys()].some((key) => key.startsWith(`${group.refOwner}.`)))
180
+ await loadKeyColumns(group.refOwner);
181
+ const referenced = keyColumns.get(`${group.refOwner}.${group.refName}`);
182
+ if (!referenced) {
183
+ warnings.push(`Foreign key ${group.name} on ${owner}.${group.table.name} references a key this connection cannot read.`);
184
+ continue;
185
+ }
186
+ group.table.foreignKeys.push({
187
+ name: group.name,
188
+ columns: group.columns,
189
+ refSchema: group.refOwner,
190
+ refTable: referenced.table,
191
+ refColumns: referenced.columns,
192
+ ...(group.onDelete ? { onDelete: group.onDelete } : {}),
193
+ });
194
+ }
195
+ }
196
+ const indexGroups = new Map();
197
+ for (const row of await query(INDEXES_SQL, { owner })) {
198
+ const table = tables.get((0, shared_js_1.tableKey)(owner, String(row.TBL)));
199
+ if (!table)
200
+ continue;
201
+ const key = `${row.TBL}.${row.NAME}`;
202
+ let group = indexGroups.get(key);
203
+ if (!group) {
204
+ group = { table, name: String(row.NAME), unique: String(row.UNIQ ?? "").toUpperCase() === "UNIQUE", columns: [] };
205
+ indexGroups.set(key, group);
206
+ }
207
+ group.columns.push(String(row.COL));
208
+ }
209
+ for (const group of indexGroups.values()) {
210
+ if (group.table.indexes.some((index) => index.name === group.name))
211
+ continue;
212
+ const primary = group.unique && group.table.primaryKey.length > 0 && group.columns.join(",") === group.table.primaryKey.join(",");
213
+ group.table.indexes.push({ name: group.name, columns: group.columns, unique: group.unique, ...(primary ? { primary: true } : {}) });
214
+ }
215
+ }
216
+ for (const table of tables.values())
217
+ (0, shared_js_1.finishTable)(table);
218
+ }
219
+ return {
220
+ dialect: "oracle",
221
+ ...(database ? { database } : {}),
222
+ schemas,
223
+ tables: [...tables.values()],
224
+ capturedAt: new Date().toISOString(),
225
+ warnings,
226
+ ...(truncated ? { truncated: true } : {}),
227
+ };
228
+ });
229
+ exports.introspectOracle = introspectOracle;
230
+ //# sourceMappingURL=oracle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../../../src/host/db/introspection/oracle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ // PostgreSQL schema introspection over pg_catalog (one client, five catalog
3
+ // queries). information_schema is avoided on purpose: it hides objects the
4
+ // role does not own and formats types less faithfully than format_type().
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.introspectPostgres = void 0;
7
+ const postgresAdapter_js_1 = require("../postgresAdapter.js");
8
+ const shared_js_1 = require("./shared.js");
9
+ const SCHEMAS_SQL = `
10
+ SELECT n.nspname AS sch
11
+ FROM pg_namespace n
12
+ WHERE n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
13
+ AND n.nspname NOT LIKE 'pg\\_temp\\_%'
14
+ AND n.nspname NOT LIKE 'pg\\_toast\\_temp\\_%'
15
+ ORDER BY 1`;
16
+ const TABLES_SQL = `
17
+ SELECT n.nspname AS sch, c.relname AS tbl, c.relkind::text AS kind,
18
+ obj_description(c.oid, 'pg_class') AS comment,
19
+ GREATEST(c.reltuples, 0)::bigint AS estimate
20
+ FROM pg_class c
21
+ JOIN pg_namespace n ON n.oid = c.relnamespace
22
+ WHERE n.nspname = ANY($1::text[]) AND c.relkind::text = ANY($2::text[])
23
+ ORDER BY 1, 2`;
24
+ const COLUMNS_SQL = `
25
+ SELECT n.nspname AS sch, c.relname AS tbl, a.attname AS col, a.attnum AS ordinal,
26
+ format_type(a.atttypid, a.atttypmod) AS data_type,
27
+ NOT a.attnotnull AS nullable,
28
+ pg_get_expr(d.adbin, d.adrelid) AS default_value,
29
+ col_description(c.oid, a.attnum) AS comment,
30
+ (a.attidentity <> '') AS identity
31
+ FROM pg_attribute a
32
+ JOIN pg_class c ON c.oid = a.attrelid
33
+ JOIN pg_namespace n ON n.oid = c.relnamespace
34
+ LEFT JOIN pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum
35
+ WHERE a.attnum > 0 AND NOT a.attisdropped
36
+ AND n.nspname = ANY($1::text[]) AND c.relkind::text = ANY($2::text[])
37
+ ORDER BY 1, 2, 4`;
38
+ const CONSTRAINTS_SQL = `
39
+ SELECT con.conname AS cname, con.contype::text AS ctype, n.nspname AS sch, c.relname AS tbl,
40
+ (SELECT array_agg(a.attname ORDER BY k.ord)
41
+ FROM unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord)
42
+ JOIN pg_attribute a ON a.attrelid = con.conrelid AND a.attnum = k.attnum) AS cols,
43
+ fn.nspname AS ref_sch, fc.relname AS ref_tbl,
44
+ (SELECT array_agg(a.attname ORDER BY k.ord)
45
+ FROM unnest(con.confkey) WITH ORDINALITY AS k(attnum, ord)
46
+ JOIN pg_attribute a ON a.attrelid = con.confrelid AND a.attnum = k.attnum) AS ref_cols,
47
+ con.confdeltype::text AS on_delete, con.confupdtype::text AS on_update
48
+ FROM pg_constraint con
49
+ JOIN pg_class c ON c.oid = con.conrelid
50
+ JOIN pg_namespace n ON n.oid = c.relnamespace
51
+ LEFT JOIN pg_class fc ON fc.oid = con.confrelid
52
+ LEFT JOIN pg_namespace fn ON fn.oid = fc.relnamespace
53
+ WHERE con.contype IN ('p', 'u', 'f') AND n.nspname = ANY($1::text[])
54
+ ORDER BY 3, 4, 1`;
55
+ const INDEXES_SQL = `
56
+ SELECT n.nspname AS sch, t.relname AS tbl, i.relname AS name,
57
+ ix.indisunique AS is_unique, ix.indisprimary AS is_primary,
58
+ (SELECT array_agg(a.attname ORDER BY k.ord)
59
+ FROM unnest(ix.indkey::int2[]) WITH ORDINALITY AS k(attnum, ord)
60
+ JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = k.attnum
61
+ WHERE k.attnum > 0) AS cols
62
+ FROM pg_index ix
63
+ JOIN pg_class t ON t.oid = ix.indrelid
64
+ JOIN pg_class i ON i.oid = ix.indexrelid
65
+ JOIN pg_namespace n ON n.oid = t.relnamespace
66
+ WHERE n.nspname = ANY($1::text[])
67
+ ORDER BY 1, 2, 3`;
68
+ const asList = (value) => {
69
+ if (Array.isArray(value))
70
+ return value.map(String);
71
+ if (typeof value === "string") {
72
+ // pg returns text[] as arrays, but a driver without type parsing may hand
73
+ // back the "{a,b}" literal.
74
+ const inner = value.replace(/^\{|\}$/g, "");
75
+ return inner ? inner.split(",").map((item) => item.replace(/^"|"$/g, "")) : [];
76
+ }
77
+ return [];
78
+ };
79
+ const kindOf = (relkind) => (relkind === "v" || relkind === "m" ? "view" : "table");
80
+ const introspectPostgres = (connection, options) => (0, postgresAdapter_js_1.withPostgresClient)(connection, async (client) => {
81
+ const query = async (sql, params = []) => {
82
+ const result = await client.query(sql, params);
83
+ return Array.isArray(result?.rows) ? result.rows : [];
84
+ };
85
+ const warnings = [];
86
+ const databaseRow = (await query("SELECT current_database() AS db"))[0];
87
+ const schemas = (await query(SCHEMAS_SQL)).map((row) => String(row.sch));
88
+ const wanted = options.schemas ? options.schemas.filter((name) => schemas.includes(name)) : schemas;
89
+ for (const name of options.schemas ?? [])
90
+ if (!schemas.includes(name))
91
+ warnings.push(`Schema "${name}" is not visible to this connection.`);
92
+ const kinds = options.includeViews ? ["r", "p", "f", "v", "m"] : ["r", "p", "f"];
93
+ const tableRows = wanted.length > 0 ? await query(TABLES_SQL, [wanted, kinds]) : [];
94
+ const candidates = tableRows.map((row) => ({
95
+ schema: String(row.sch),
96
+ name: String(row.tbl),
97
+ kind: kindOf(String(row.kind)),
98
+ comment: (0, shared_js_1.asString)(row.comment),
99
+ estimate: (0, shared_js_1.asNumber)(row.estimate),
100
+ }));
101
+ const { selected, truncated } = (0, shared_js_1.selectTables)(candidates, options);
102
+ const tables = new Map();
103
+ for (const candidate of selected) {
104
+ tables.set((0, shared_js_1.tableKey)(candidate.schema, candidate.name), (0, shared_js_1.emptyTable)(candidate, {
105
+ ...(candidate.comment ? { comment: candidate.comment } : {}),
106
+ ...(candidate.estimate !== undefined ? { rowCountEstimate: candidate.estimate } : {}),
107
+ }));
108
+ }
109
+ if (!options.objectsOnly && tables.size > 0) {
110
+ const detailSchemas = [...new Set(selected.map((candidate) => candidate.schema))];
111
+ for (const row of await query(COLUMNS_SQL, [detailSchemas, kinds])) {
112
+ const table = tables.get((0, shared_js_1.tableKey)(String(row.sch), String(row.tbl)));
113
+ if (!table)
114
+ continue;
115
+ const defaultValue = (0, shared_js_1.asString)(row.default_value);
116
+ table.columns.push({
117
+ name: String(row.col),
118
+ dataType: String(row.data_type),
119
+ ordinal: (0, shared_js_1.asNumber)(row.ordinal) ?? table.columns.length + 1,
120
+ nullable: (0, shared_js_1.asBoolean)(row.nullable),
121
+ primaryKey: false,
122
+ ...(defaultValue !== undefined ? { defaultValue } : {}),
123
+ ...((0, shared_js_1.asBoolean)(row.identity) || /^nextval\(/i.test(defaultValue ?? "") ? { autoIncrement: true } : {}),
124
+ ...((0, shared_js_1.asString)(row.comment) ? { comment: (0, shared_js_1.asString)(row.comment) } : {}),
125
+ });
126
+ }
127
+ for (const row of await query(CONSTRAINTS_SQL, [detailSchemas])) {
128
+ const table = tables.get((0, shared_js_1.tableKey)(String(row.sch), String(row.tbl)));
129
+ if (!table)
130
+ continue;
131
+ const columns = asList(row.cols);
132
+ const type = String(row.ctype);
133
+ if (type === "p")
134
+ table.primaryKey = columns;
135
+ else if (type === "u") {
136
+ table.indexes.push({ name: String(row.cname), columns, unique: true });
137
+ }
138
+ else if (type === "f") {
139
+ table.foreignKeys.push({
140
+ name: String(row.cname),
141
+ columns,
142
+ ...((0, shared_js_1.asString)(row.ref_sch) ? { refSchema: String(row.ref_sch) } : {}),
143
+ refTable: String(row.ref_tbl ?? ""),
144
+ refColumns: asList(row.ref_cols),
145
+ ...((0, shared_js_1.referentialAction)(row.on_delete) ? { onDelete: (0, shared_js_1.referentialAction)(row.on_delete) } : {}),
146
+ ...((0, shared_js_1.referentialAction)(row.on_update) ? { onUpdate: (0, shared_js_1.referentialAction)(row.on_update) } : {}),
147
+ });
148
+ }
149
+ }
150
+ for (const row of await query(INDEXES_SQL, [detailSchemas])) {
151
+ const table = tables.get((0, shared_js_1.tableKey)(String(row.sch), String(row.tbl)));
152
+ if (!table)
153
+ continue;
154
+ const name = String(row.name);
155
+ if (table.indexes.some((index) => index.name === name))
156
+ continue; // the unique constraint already listed it
157
+ const columns = asList(row.cols);
158
+ if (columns.length === 0)
159
+ continue; // expression index
160
+ table.indexes.push({ name, columns, unique: (0, shared_js_1.asBoolean)(row.is_unique), ...((0, shared_js_1.asBoolean)(row.is_primary) ? { primary: true } : {}) });
161
+ }
162
+ for (const table of tables.values())
163
+ (0, shared_js_1.finishTable)(table);
164
+ }
165
+ return {
166
+ dialect: "postgres",
167
+ ...((0, shared_js_1.asString)(databaseRow?.db) ? { database: String(databaseRow.db) } : {}),
168
+ schemas,
169
+ tables: [...tables.values()],
170
+ capturedAt: new Date().toISOString(),
171
+ warnings,
172
+ ...(truncated ? { truncated: true } : {}),
173
+ };
174
+ });
175
+ exports.introspectPostgres = introspectPostgres;
176
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../../src/host/db/introspection/postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ // Helpers every dialect's introspection shares: the resolved options, the
3
+ // table filter, the size cap and small normalisers.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.finishTable = exports.markUniqueColumns = exports.referentialAction = exports.asBoolean = exports.asNumber = exports.asString = exports.emptyTable = exports.selectTables = exports.tableMatchesFilter = exports.tableKey = exports.resolveIntrospectOptions = void 0;
6
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
7
+ const resolveIntrospectOptions = (options = {}) => {
8
+ const schemas = options.schemas?.map((name) => name.trim()).filter(Boolean);
9
+ const tables = options.tables?.map((name) => name.trim()).filter(Boolean);
10
+ return {
11
+ ...(schemas && schemas.length > 0 ? { schemas } : {}),
12
+ ...(tables && tables.length > 0 ? { tables } : {}),
13
+ includeViews: options.includeViews !== false,
14
+ objectsOnly: Boolean(options.objectsOnly),
15
+ sampleSize: clamp(Math.round(Number(options.sampleSize) || 100), 1, 1000),
16
+ maxTables: clamp(Math.round(Number(options.maxTables) || 2000), 1, 20000),
17
+ };
18
+ };
19
+ exports.resolveIntrospectOptions = resolveIntrospectOptions;
20
+ const tableKey = (schema, name) => (schema ? `${schema}.${name}` : name);
21
+ exports.tableKey = tableKey;
22
+ // "schema.table" matches the qualified name, a bare name matches the table
23
+ // name in any schema; both case-insensitive (Oracle upper-cases, Postgres
24
+ // lower-cases, SQL Server does not care).
25
+ const tableMatchesFilter = (schema, name, filters) => {
26
+ if (!filters || filters.length === 0)
27
+ return true;
28
+ const qualified = (0, exports.tableKey)(schema, name).toLowerCase();
29
+ const bare = name.toLowerCase();
30
+ return filters.some((filter) => {
31
+ const wanted = filter.toLowerCase();
32
+ return wanted.includes(".") ? wanted === qualified : wanted === bare;
33
+ });
34
+ };
35
+ exports.tableMatchesFilter = tableMatchesFilter;
36
+ // Views, the explicit table filter and the cap, applied in the order the
37
+ // database listed the objects. Returns the kept candidates and whether the
38
+ // cap cut anything.
39
+ const selectTables = (candidates, options) => {
40
+ const filtered = candidates.filter((candidate) => (options.includeViews || candidate.kind !== "view") && (0, exports.tableMatchesFilter)(candidate.schema, candidate.name, options.tables));
41
+ if (filtered.length <= options.maxTables)
42
+ return { selected: filtered, truncated: false };
43
+ return { selected: filtered.slice(0, options.maxTables), truncated: true };
44
+ };
45
+ exports.selectTables = selectTables;
46
+ const emptyTable = (candidate, extra = {}) => ({
47
+ ...(candidate.schema ? { schema: candidate.schema } : {}),
48
+ name: candidate.name,
49
+ kind: candidate.kind,
50
+ columns: [],
51
+ primaryKey: [],
52
+ foreignKeys: [],
53
+ indexes: [],
54
+ ...extra,
55
+ });
56
+ exports.emptyTable = emptyTable;
57
+ const asString = (value) => {
58
+ if (value === null || value === undefined)
59
+ return undefined;
60
+ const text = String(value);
61
+ return text.length > 0 ? text : undefined;
62
+ };
63
+ exports.asString = asString;
64
+ const asNumber = (value) => {
65
+ if (value === null || value === undefined || value === "")
66
+ return undefined;
67
+ const number = Number(value);
68
+ return Number.isFinite(number) ? number : undefined;
69
+ };
70
+ exports.asNumber = asNumber;
71
+ const asBoolean = (value) => {
72
+ if (typeof value === "boolean")
73
+ return value;
74
+ if (typeof value === "number")
75
+ return value !== 0;
76
+ if (typeof value === "string")
77
+ return /^(1|true|yes|y|t)$/i.test(value.trim());
78
+ return Boolean(value);
79
+ };
80
+ exports.asBoolean = asBoolean;
81
+ // Referential actions the way SQL spells them, from the dialect's codes.
82
+ const referentialAction = (value) => {
83
+ const text = (0, exports.asString)(value);
84
+ if (!text)
85
+ return undefined;
86
+ const upper = text.trim().toUpperCase().replace(/_/g, " ");
87
+ switch (upper) {
88
+ case "A":
89
+ case "NO ACTION":
90
+ return "NO ACTION";
91
+ case "R":
92
+ case "RESTRICT":
93
+ return "RESTRICT";
94
+ case "C":
95
+ case "CASCADE":
96
+ return "CASCADE";
97
+ case "N":
98
+ case "SET NULL":
99
+ return "SET NULL";
100
+ case "D":
101
+ case "SET DEFAULT":
102
+ return "SET DEFAULT";
103
+ default:
104
+ return upper;
105
+ }
106
+ };
107
+ exports.referentialAction = referentialAction;
108
+ // Mark the columns a single-column unique constraint/index covers.
109
+ const markUniqueColumns = (table) => {
110
+ const unique = new Set();
111
+ const primary = new Set(table.primaryKey);
112
+ for (const index of table.indexes) {
113
+ if (!index.unique || index.primary || index.columns.length !== 1 || primary.has(index.columns[0]))
114
+ continue;
115
+ unique.add(index.columns[0]);
116
+ }
117
+ for (const column of table.columns) {
118
+ if (unique.has(column.name) && !column.primaryKey)
119
+ column.unique = true;
120
+ }
121
+ };
122
+ exports.markUniqueColumns = markUniqueColumns;
123
+ // Column order and primary-key flags from the table's key list.
124
+ const finishTable = (table) => {
125
+ table.columns.sort((a, b) => a.ordinal - b.ordinal);
126
+ const primary = new Set(table.primaryKey);
127
+ for (const column of table.columns)
128
+ column.primaryKey = primary.has(column.name);
129
+ (0, exports.markUniqueColumns)(table);
130
+ return table;
131
+ };
132
+ exports.finishTable = finishTable;
133
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/host/db/introspection/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ // What a database looks like from the outside: schemas, tables/views (or
3
+ // collections), columns with keys and defaults, foreign keys and indexes.
4
+ // This is the DRIVER-side truth an ERD is built from (see diagram/database);
5
+ // it deliberately carries no diagram concerns (no ids, positions, colors).
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/host/db/introspection/types.ts"],"names":[],"mappings":";AAAA,yEAAyE;AACzE,0EAA0E;AAC1E,6EAA6E;AAC7E,2EAA2E"}
@@ -4,7 +4,7 @@
4
4
  // `createRequire`, the `mongodb` / `bson` packages are loaded lazily via
5
5
  // `loadOptionalModule` so callman-core stays driver-agnostic.
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.executeMongoQuery = exports.testMongoConnection = exports.__setMongoDriverForTests = void 0;
7
+ exports.executeMongoQuery = exports.testMongoConnection = exports.withMongoClient = exports.__setMongoDriverForTests = void 0;
8
8
  const lazy_js_1 = require("../lazy.js");
9
9
  const unwrap = (mod) => (mod && mod.default && !mod.MongoClient ? mod.default : mod);
10
10
  // Test-only seam: lets unit tests inject a fake `{ MongoClient, ObjectId }`
@@ -386,6 +386,20 @@ const coerceMongoFilter = (filter, ObjectId) => {
386
386
  }
387
387
  return Object.fromEntries(Object.entries(filter).map(([key, value]) => [key, coerceMongoFilterValue(value, ObjectId)]));
388
388
  };
389
+ // One client for several operations (schema introspection); the database
390
+ // name is resolved the same way the query path resolves it.
391
+ const withMongoClient = async (connection, fn) => {
392
+ const { MongoClient } = await loadMongoDriver();
393
+ const client = new MongoClient(buildMongoUri(connection), { serverSelectionTimeoutMS: 5000 });
394
+ await client.connect();
395
+ try {
396
+ return await fn(client, getMongoDatabaseName(connection));
397
+ }
398
+ finally {
399
+ await client.close();
400
+ }
401
+ };
402
+ exports.withMongoClient = withMongoClient;
389
403
  const testMongoConnection = async (connection) => {
390
404
  const { MongoClient } = await loadMongoDriver();
391
405
  const client = new MongoClient(buildMongoUri(connection));