callman-core 1.29.0 → 1.30.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 (200) 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-cjs/ai/prompts/diagram.js +23 -6
  135. package/dist-cjs/ai/prompts/diagram.js.map +1 -1
  136. package/dist-cjs/diagram/componentCatalog.js +5 -1
  137. package/dist-cjs/diagram/componentCatalog.js.map +1 -1
  138. package/dist-cjs/diagram/database/derive.js +119 -0
  139. package/dist-cjs/diagram/database/derive.js.map +1 -0
  140. package/dist-cjs/diagram/database/diff.js +115 -0
  141. package/dist-cjs/diagram/database/diff.js.map +1 -0
  142. package/dist-cjs/diagram/database/edit.js +366 -0
  143. package/dist-cjs/diagram/database/edit.js.map +1 -0
  144. package/dist-cjs/diagram/database/fromSchema.js +188 -0
  145. package/dist-cjs/diagram/database/fromSchema.js.map +1 -0
  146. package/dist-cjs/diagram/database/index.js +32 -0
  147. package/dist-cjs/diagram/database/index.js.map +1 -0
  148. package/dist-cjs/diagram/database/model.js +311 -0
  149. package/dist-cjs/diagram/database/model.js.map +1 -0
  150. package/dist-cjs/diagram/database/patch.js +190 -0
  151. package/dist-cjs/diagram/database/patch.js.map +1 -0
  152. package/dist-cjs/diagram/database/place.js +26 -0
  153. package/dist-cjs/diagram/database/place.js.map +1 -0
  154. package/dist-cjs/diagram/database/types.js +122 -0
  155. package/dist-cjs/diagram/database/types.js.map +1 -0
  156. package/dist-cjs/diagram/index.js +1 -0
  157. package/dist-cjs/diagram/index.js.map +1 -1
  158. package/dist-cjs/diagram/layout.js +3 -2
  159. package/dist-cjs/diagram/layout.js.map +1 -1
  160. package/dist-cjs/diagram/ops.js +42 -0
  161. package/dist-cjs/diagram/ops.js.map +1 -1
  162. package/dist-cjs/diagram/opsReference.js +9 -0
  163. package/dist-cjs/diagram/opsReference.js.map +1 -1
  164. package/dist-cjs/diagram/patchInput.js +414 -11
  165. package/dist-cjs/diagram/patchInput.js.map +1 -1
  166. package/dist-cjs/diagram/schema.js +3 -3
  167. package/dist-cjs/diagram/schema.js.map +1 -1
  168. package/dist-cjs/diagram/views.js +51 -1
  169. package/dist-cjs/diagram/views.js.map +1 -1
  170. package/dist-cjs/host/db/introspection/index.js +59 -0
  171. package/dist-cjs/host/db/introspection/index.js.map +1 -0
  172. package/dist-cjs/host/db/introspection/mongo.js +189 -0
  173. package/dist-cjs/host/db/introspection/mongo.js.map +1 -0
  174. package/dist-cjs/host/db/introspection/mssql.js +216 -0
  175. package/dist-cjs/host/db/introspection/mssql.js.map +1 -0
  176. package/dist-cjs/host/db/introspection/mysql.js +167 -0
  177. package/dist-cjs/host/db/introspection/mysql.js.map +1 -0
  178. package/dist-cjs/host/db/introspection/oracle.js +230 -0
  179. package/dist-cjs/host/db/introspection/oracle.js.map +1 -0
  180. package/dist-cjs/host/db/introspection/postgres.js +176 -0
  181. package/dist-cjs/host/db/introspection/postgres.js.map +1 -0
  182. package/dist-cjs/host/db/introspection/shared.js +133 -0
  183. package/dist-cjs/host/db/introspection/shared.js.map +1 -0
  184. package/dist-cjs/host/db/introspection/types.js +7 -0
  185. package/dist-cjs/host/db/introspection/types.js.map +1 -0
  186. package/dist-cjs/host/db/mongoAdapter.js +15 -1
  187. package/dist-cjs/host/db/mongoAdapter.js.map +1 -1
  188. package/dist-cjs/host/db/mssqlAdapter.js +5 -2
  189. package/dist-cjs/host/db/mssqlAdapter.js.map +1 -1
  190. package/dist-cjs/host/db/mysqlAdapter.js +13 -1
  191. package/dist-cjs/host/db/mysqlAdapter.js.map +1 -1
  192. package/dist-cjs/host/db/oracleAdapter.js +24 -1
  193. package/dist-cjs/host/db/oracleAdapter.js.map +1 -1
  194. package/dist-cjs/host/db/postgresAdapter.js +15 -1
  195. package/dist-cjs/host/db/postgresAdapter.js.map +1 -1
  196. package/dist-cjs/host/db/queryExecutor.js +5 -4
  197. package/dist-cjs/host/db/queryExecutor.js.map +1 -1
  198. package/dist-cjs/host/index.js +24 -1
  199. package/dist-cjs/host/index.js.map +1 -1
  200. package/package.json +1 -1
@@ -0,0 +1,12 @@
1
+ import type { DbConnection } from "../types.js";
2
+ import { type ResolvedIntrospectOptions } from "./shared.js";
3
+ import type { DbSchema } from "./types.js";
4
+ export declare const formatOracleType: (row: {
5
+ DATA_TYPE?: unknown;
6
+ DATA_LENGTH?: unknown;
7
+ CHAR_LENGTH?: unknown;
8
+ DATA_PRECISION?: unknown;
9
+ DATA_SCALE?: unknown;
10
+ }) => string;
11
+ export declare const introspectOracle: (connection: DbConnection, options: ResolvedIntrospectOptions) => Promise<DbSchema>;
12
+ //# sourceMappingURL=oracle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../../../src/host/db/introspection/oracle.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAA0F,KAAK,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACrJ,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AA0D1D,eAAO,MAAM,gBAAgB,GAAI,KAAK;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,KAAG,MAc7J,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,YAAY,YAAY,EAAE,SAAS,yBAAyB,KAAG,OAAO,CAAC,QAAQ,CAmJ5G,CAAC"}
@@ -0,0 +1,225 @@
1
+ // Oracle schema introspection over the ALL_* data dictionary views (one
2
+ // connection, a handful of queries per schema/owner). The current schema is
3
+ // read unless owners are named; Oracle-maintained accounts are never listed.
4
+ import { withOracleConnection } from "../oracleAdapter.js";
5
+ import { asNumber, asString, emptyTable, finishTable, referentialAction, selectTables, tableKey } from "./shared.js";
6
+ const CURRENT_SCHEMA_SQL = "SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS SCH FROM DUAL";
7
+ const DB_NAME_SQL = "SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS DB FROM DUAL";
8
+ const SCHEMAS_SQL = "SELECT USERNAME AS SCH FROM ALL_USERS WHERE ORACLE_MAINTAINED = 'N' ORDER BY 1";
9
+ const SCHEMAS_FALLBACK_SQL = `
10
+ SELECT USERNAME AS SCH FROM ALL_USERS
11
+ WHERE USERNAME NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'XDB', 'CTXSYS', 'MDSYS', 'ORDSYS', 'ORDDATA', 'WMSYS', 'DBSNMP', 'APPQOSSYS', 'AUDSYS',
12
+ 'GSMADMIN_INTERNAL', 'DVSYS', 'LBACSYS', 'OJVMSYS', 'OLAPSYS', 'ORACLE_OCM', 'REMOTE_SCHEDULER_AGENT', 'SYSBACKUP', 'SYSDG', 'SYSKM', 'SYSRAC',
13
+ 'SYS$UMF', 'DBSFWUSER', 'GGSYS', 'ANONYMOUS', 'XS$NULL', 'DIP', 'APEX_PUBLIC_USER', 'FLOWS_FILES', 'MDDATA', 'SI_INFORMTN_SCHEMA', 'ORDPLUGINS',
14
+ 'SPATIAL_CSW_ADMIN_USR', 'WKSYS', 'WKPROXY', 'WK_TEST', 'EXFSYS', 'DMSYS', 'TSMSYS', 'OWBSYS', 'OWBSYS_AUDIT', 'SCOTT', 'HR', 'OE', 'PM', 'IX', 'SH', 'BI')
15
+ ORDER BY 1`;
16
+ const TABLES_SQL = `
17
+ SELECT t.OWNER AS SCH, t.TABLE_NAME AS TBL, 'table' AS KIND, c.COMMENTS AS TABLE_COMMENT, t.NUM_ROWS AS ESTIMATE
18
+ FROM ALL_TABLES t
19
+ LEFT JOIN ALL_TAB_COMMENTS c ON c.OWNER = t.OWNER AND c.TABLE_NAME = t.TABLE_NAME
20
+ WHERE t.OWNER = :owner AND t.TABLE_NAME NOT LIKE 'BIN$%'
21
+ UNION ALL
22
+ SELECT v.OWNER, v.VIEW_NAME, 'view', c.COMMENTS, NULL
23
+ FROM ALL_VIEWS v
24
+ LEFT JOIN ALL_TAB_COMMENTS c ON c.OWNER = v.OWNER AND c.TABLE_NAME = v.VIEW_NAME
25
+ WHERE v.OWNER = :owner
26
+ ORDER BY 1, 2`;
27
+ const COLUMNS_SQL = `
28
+ 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,
29
+ c.DATA_PRECISION, c.DATA_SCALE, c.NULLABLE, c.DATA_DEFAULT, cc.COMMENTS AS COL_COMMENT
30
+ FROM ALL_TAB_COLUMNS c
31
+ 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
32
+ WHERE c.OWNER = :owner
33
+ ORDER BY 1, 3`;
34
+ const CONSTRAINTS_SQL = `
35
+ 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,
36
+ c.R_OWNER AS REF_OWNER, c.R_CONSTRAINT_NAME AS REF_CNAME, c.DELETE_RULE AS ON_DELETE
37
+ FROM ALL_CONSTRAINTS c
38
+ JOIN ALL_CONS_COLUMNS cc ON cc.OWNER = c.OWNER AND cc.CONSTRAINT_NAME = c.CONSTRAINT_NAME AND cc.TABLE_NAME = c.TABLE_NAME
39
+ WHERE c.OWNER = :owner AND c.CONSTRAINT_TYPE IN ('P', 'U', 'R')
40
+ ORDER BY 1, 2, 5`;
41
+ const KEY_COLUMNS_SQL = `
42
+ SELECT cc.CONSTRAINT_NAME AS CNAME, cc.TABLE_NAME AS TBL, cc.COLUMN_NAME AS COL, cc.POSITION AS POS
43
+ FROM ALL_CONS_COLUMNS cc
44
+ JOIN ALL_CONSTRAINTS c ON c.OWNER = cc.OWNER AND c.CONSTRAINT_NAME = cc.CONSTRAINT_NAME
45
+ WHERE cc.OWNER = :owner AND c.CONSTRAINT_TYPE IN ('P', 'U')
46
+ ORDER BY 1, 4`;
47
+ const INDEXES_SQL = `
48
+ 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
49
+ FROM ALL_INDEXES i
50
+ JOIN ALL_IND_COLUMNS ic ON ic.INDEX_OWNER = i.OWNER AND ic.INDEX_NAME = i.INDEX_NAME
51
+ WHERE i.TABLE_OWNER = :owner
52
+ ORDER BY 1, 2, 5`;
53
+ // The type the way SQL Developer prints it: VARCHAR2(120), NUMBER(10,2), DATE.
54
+ export const formatOracleType = (row) => {
55
+ const type = String(row.DATA_TYPE ?? "").toUpperCase();
56
+ const charLength = asNumber(row.CHAR_LENGTH);
57
+ const dataLength = asNumber(row.DATA_LENGTH);
58
+ const precision = asNumber(row.DATA_PRECISION);
59
+ const scale = asNumber(row.DATA_SCALE);
60
+ if (["VARCHAR2", "NVARCHAR2", "CHAR", "NCHAR"].includes(type))
61
+ return `${type}(${charLength && charLength > 0 ? charLength : dataLength ?? ""})`.replace("()", "");
62
+ if (type === "RAW")
63
+ return dataLength !== undefined ? `RAW(${dataLength})` : type;
64
+ if (type === "NUMBER") {
65
+ if (precision !== undefined)
66
+ return scale ? `NUMBER(${precision},${scale})` : `NUMBER(${precision})`;
67
+ return "NUMBER";
68
+ }
69
+ if (type === "FLOAT")
70
+ return precision !== undefined ? `FLOAT(${precision})` : type;
71
+ return type;
72
+ };
73
+ export const introspectOracle = (connection, options) => withOracleConnection(connection, async (client, oracledb) => {
74
+ const query = async (sql, binds = {}) => {
75
+ const result = await client.execute(sql, binds, { outFormat: oracledb.OUT_FORMAT_OBJECT });
76
+ return Array.isArray(result?.rows) ? result.rows : [];
77
+ };
78
+ const warnings = [];
79
+ const current = String((await query(CURRENT_SCHEMA_SQL))[0]?.SCH ?? connection.username).toUpperCase();
80
+ let database;
81
+ try {
82
+ database = asString((await query(DB_NAME_SQL))[0]?.DB);
83
+ }
84
+ catch {
85
+ database = connection.serviceName?.trim() || connection.database?.trim() || undefined;
86
+ }
87
+ let schemas;
88
+ try {
89
+ schemas = (await query(SCHEMAS_SQL)).map((row) => String(row.SCH));
90
+ }
91
+ catch {
92
+ // ORACLE_MAINTAINED arrived in 12c; older servers get the static list.
93
+ schemas = (await query(SCHEMAS_FALLBACK_SQL)).map((row) => String(row.SCH));
94
+ }
95
+ if (!schemas.includes(current))
96
+ schemas.unshift(current);
97
+ const wanted = options.schemas ? options.schemas.map((name) => name.toUpperCase()) : [current];
98
+ const candidates = [];
99
+ for (const owner of wanted) {
100
+ for (const row of await query(TABLES_SQL, { owner })) {
101
+ candidates.push({
102
+ schema: String(row.SCH),
103
+ name: String(row.TBL),
104
+ kind: String(row.KIND) === "view" ? "view" : "table",
105
+ ...(asString(row.TABLE_COMMENT) ? { comment: String(row.TABLE_COMMENT) } : {}),
106
+ ...(asNumber(row.ESTIMATE) !== undefined ? { estimate: asNumber(row.ESTIMATE) } : {}),
107
+ });
108
+ }
109
+ }
110
+ const { selected, truncated } = selectTables(candidates, options);
111
+ const tables = new Map();
112
+ for (const candidate of selected) {
113
+ tables.set(tableKey(candidate.schema, candidate.name), emptyTable(candidate, {
114
+ ...(candidate.comment ? { comment: candidate.comment } : {}),
115
+ ...(candidate.estimate !== undefined ? { rowCountEstimate: candidate.estimate } : {}),
116
+ }));
117
+ }
118
+ if (!options.objectsOnly && tables.size > 0) {
119
+ const detailOwners = [...new Set(selected.map((candidate) => candidate.schema))];
120
+ // Referenced key constraints, by owner + constraint name, for the FK ends.
121
+ const keyColumns = new Map();
122
+ const loadKeyColumns = async (owner) => {
123
+ for (const row of await query(KEY_COLUMNS_SQL, { owner })) {
124
+ const key = `${owner}.${row.CNAME}`;
125
+ const entry = keyColumns.get(key) ?? { table: String(row.TBL), columns: [] };
126
+ entry.columns.push(String(row.COL));
127
+ keyColumns.set(key, entry);
128
+ }
129
+ };
130
+ for (const owner of detailOwners) {
131
+ for (const row of await query(COLUMNS_SQL, { owner })) {
132
+ const table = tables.get(tableKey(owner, String(row.TBL)));
133
+ if (!table)
134
+ continue;
135
+ const defaultValue = asString(row.DATA_DEFAULT)?.trim();
136
+ table.columns.push({
137
+ name: String(row.COL),
138
+ dataType: formatOracleType(row),
139
+ ordinal: asNumber(row.ORDINAL) ?? table.columns.length + 1,
140
+ nullable: String(row.NULLABLE ?? "Y").toUpperCase() === "Y",
141
+ primaryKey: false,
142
+ ...(defaultValue ? { defaultValue } : {}),
143
+ ...(defaultValue && /\.NEXTVAL$/i.test(defaultValue) ? { autoIncrement: true } : {}),
144
+ ...(asString(row.COL_COMMENT) ? { comment: String(row.COL_COMMENT) } : {}),
145
+ });
146
+ }
147
+ await loadKeyColumns(owner);
148
+ const groups = new Map();
149
+ for (const row of await query(CONSTRAINTS_SQL, { owner })) {
150
+ const table = tables.get(tableKey(owner, String(row.TBL)));
151
+ if (!table)
152
+ continue;
153
+ const key = `${row.TBL}.${row.CNAME}`;
154
+ let group = groups.get(key);
155
+ if (!group) {
156
+ group = {
157
+ table,
158
+ name: String(row.CNAME),
159
+ type: String(row.CTYPE),
160
+ columns: [],
161
+ ...(asString(row.REF_OWNER) ? { refOwner: String(row.REF_OWNER) } : {}),
162
+ ...(asString(row.REF_CNAME) ? { refName: String(row.REF_CNAME) } : {}),
163
+ ...(referentialAction(row.ON_DELETE) ? { onDelete: referentialAction(row.ON_DELETE) } : {}),
164
+ };
165
+ groups.set(key, group);
166
+ }
167
+ group.columns.push(String(row.COL));
168
+ }
169
+ for (const group of groups.values()) {
170
+ if (group.type === "P")
171
+ group.table.primaryKey = group.columns;
172
+ else if (group.type === "U")
173
+ group.table.indexes.push({ name: group.name, columns: group.columns, unique: true });
174
+ else if (group.type === "R" && group.refOwner && group.refName) {
175
+ if (!detailOwners.includes(group.refOwner) && ![...keyColumns.keys()].some((key) => key.startsWith(`${group.refOwner}.`)))
176
+ await loadKeyColumns(group.refOwner);
177
+ const referenced = keyColumns.get(`${group.refOwner}.${group.refName}`);
178
+ if (!referenced) {
179
+ warnings.push(`Foreign key ${group.name} on ${owner}.${group.table.name} references a key this connection cannot read.`);
180
+ continue;
181
+ }
182
+ group.table.foreignKeys.push({
183
+ name: group.name,
184
+ columns: group.columns,
185
+ refSchema: group.refOwner,
186
+ refTable: referenced.table,
187
+ refColumns: referenced.columns,
188
+ ...(group.onDelete ? { onDelete: group.onDelete } : {}),
189
+ });
190
+ }
191
+ }
192
+ const indexGroups = new Map();
193
+ for (const row of await query(INDEXES_SQL, { owner })) {
194
+ const table = tables.get(tableKey(owner, String(row.TBL)));
195
+ if (!table)
196
+ continue;
197
+ const key = `${row.TBL}.${row.NAME}`;
198
+ let group = indexGroups.get(key);
199
+ if (!group) {
200
+ group = { table, name: String(row.NAME), unique: String(row.UNIQ ?? "").toUpperCase() === "UNIQUE", columns: [] };
201
+ indexGroups.set(key, group);
202
+ }
203
+ group.columns.push(String(row.COL));
204
+ }
205
+ for (const group of indexGroups.values()) {
206
+ if (group.table.indexes.some((index) => index.name === group.name))
207
+ continue;
208
+ const primary = group.unique && group.table.primaryKey.length > 0 && group.columns.join(",") === group.table.primaryKey.join(",");
209
+ group.table.indexes.push({ name: group.name, columns: group.columns, unique: group.unique, ...(primary ? { primary: true } : {}) });
210
+ }
211
+ }
212
+ for (const table of tables.values())
213
+ finishTable(table);
214
+ }
215
+ return {
216
+ dialect: "oracle",
217
+ ...(database ? { database } : {}),
218
+ schemas,
219
+ tables: [...tables.values()],
220
+ capturedAt: new Date().toISOString(),
221
+ warnings,
222
+ ...(truncated ? { truncated: true } : {}),
223
+ };
224
+ });
225
+ //# 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,5 @@
1
+ import type { DbConnection } from "../types.js";
2
+ import { type ResolvedIntrospectOptions } from "./shared.js";
3
+ import type { DbSchema } from "./types.js";
4
+ export declare const introspectPostgres: (connection: DbConnection, options: ResolvedIntrospectOptions) => Promise<DbSchema>;
5
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../../src/host/db/introspection/postgres.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EASL,KAAK,yBAAyB,EAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAiF1D,eAAO,MAAM,kBAAkB,GAAI,YAAY,YAAY,EAAE,SAAS,yBAAyB,KAAG,OAAO,CAAC,QAAQ,CA2F9G,CAAC"}
@@ -0,0 +1,172 @@
1
+ // PostgreSQL schema introspection over pg_catalog (one client, five catalog
2
+ // queries). information_schema is avoided on purpose: it hides objects the
3
+ // role does not own and formats types less faithfully than format_type().
4
+ import { withPostgresClient } from "../postgresAdapter.js";
5
+ import { asBoolean, asNumber, asString, emptyTable, finishTable, referentialAction, selectTables, tableKey, } from "./shared.js";
6
+ const SCHEMAS_SQL = `
7
+ SELECT n.nspname AS sch
8
+ FROM pg_namespace n
9
+ WHERE n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
10
+ AND n.nspname NOT LIKE 'pg\\_temp\\_%'
11
+ AND n.nspname NOT LIKE 'pg\\_toast\\_temp\\_%'
12
+ ORDER BY 1`;
13
+ const TABLES_SQL = `
14
+ SELECT n.nspname AS sch, c.relname AS tbl, c.relkind::text AS kind,
15
+ obj_description(c.oid, 'pg_class') AS comment,
16
+ GREATEST(c.reltuples, 0)::bigint AS estimate
17
+ FROM pg_class c
18
+ JOIN pg_namespace n ON n.oid = c.relnamespace
19
+ WHERE n.nspname = ANY($1::text[]) AND c.relkind::text = ANY($2::text[])
20
+ ORDER BY 1, 2`;
21
+ const COLUMNS_SQL = `
22
+ SELECT n.nspname AS sch, c.relname AS tbl, a.attname AS col, a.attnum AS ordinal,
23
+ format_type(a.atttypid, a.atttypmod) AS data_type,
24
+ NOT a.attnotnull AS nullable,
25
+ pg_get_expr(d.adbin, d.adrelid) AS default_value,
26
+ col_description(c.oid, a.attnum) AS comment,
27
+ (a.attidentity <> '') AS identity
28
+ FROM pg_attribute a
29
+ JOIN pg_class c ON c.oid = a.attrelid
30
+ JOIN pg_namespace n ON n.oid = c.relnamespace
31
+ LEFT JOIN pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum
32
+ WHERE a.attnum > 0 AND NOT a.attisdropped
33
+ AND n.nspname = ANY($1::text[]) AND c.relkind::text = ANY($2::text[])
34
+ ORDER BY 1, 2, 4`;
35
+ const CONSTRAINTS_SQL = `
36
+ SELECT con.conname AS cname, con.contype::text AS ctype, n.nspname AS sch, c.relname AS tbl,
37
+ (SELECT array_agg(a.attname ORDER BY k.ord)
38
+ FROM unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord)
39
+ JOIN pg_attribute a ON a.attrelid = con.conrelid AND a.attnum = k.attnum) AS cols,
40
+ fn.nspname AS ref_sch, fc.relname AS ref_tbl,
41
+ (SELECT array_agg(a.attname ORDER BY k.ord)
42
+ FROM unnest(con.confkey) WITH ORDINALITY AS k(attnum, ord)
43
+ JOIN pg_attribute a ON a.attrelid = con.confrelid AND a.attnum = k.attnum) AS ref_cols,
44
+ con.confdeltype::text AS on_delete, con.confupdtype::text AS on_update
45
+ FROM pg_constraint con
46
+ JOIN pg_class c ON c.oid = con.conrelid
47
+ JOIN pg_namespace n ON n.oid = c.relnamespace
48
+ LEFT JOIN pg_class fc ON fc.oid = con.confrelid
49
+ LEFT JOIN pg_namespace fn ON fn.oid = fc.relnamespace
50
+ WHERE con.contype IN ('p', 'u', 'f') AND n.nspname = ANY($1::text[])
51
+ ORDER BY 3, 4, 1`;
52
+ const INDEXES_SQL = `
53
+ SELECT n.nspname AS sch, t.relname AS tbl, i.relname AS name,
54
+ ix.indisunique AS is_unique, ix.indisprimary AS is_primary,
55
+ (SELECT array_agg(a.attname ORDER BY k.ord)
56
+ FROM unnest(ix.indkey::int2[]) WITH ORDINALITY AS k(attnum, ord)
57
+ JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = k.attnum
58
+ WHERE k.attnum > 0) AS cols
59
+ FROM pg_index ix
60
+ JOIN pg_class t ON t.oid = ix.indrelid
61
+ JOIN pg_class i ON i.oid = ix.indexrelid
62
+ JOIN pg_namespace n ON n.oid = t.relnamespace
63
+ WHERE n.nspname = ANY($1::text[])
64
+ ORDER BY 1, 2, 3`;
65
+ const asList = (value) => {
66
+ if (Array.isArray(value))
67
+ return value.map(String);
68
+ if (typeof value === "string") {
69
+ // pg returns text[] as arrays, but a driver without type parsing may hand
70
+ // back the "{a,b}" literal.
71
+ const inner = value.replace(/^\{|\}$/g, "");
72
+ return inner ? inner.split(",").map((item) => item.replace(/^"|"$/g, "")) : [];
73
+ }
74
+ return [];
75
+ };
76
+ const kindOf = (relkind) => (relkind === "v" || relkind === "m" ? "view" : "table");
77
+ export const introspectPostgres = (connection, options) => withPostgresClient(connection, async (client) => {
78
+ const query = async (sql, params = []) => {
79
+ const result = await client.query(sql, params);
80
+ return Array.isArray(result?.rows) ? result.rows : [];
81
+ };
82
+ const warnings = [];
83
+ const databaseRow = (await query("SELECT current_database() AS db"))[0];
84
+ const schemas = (await query(SCHEMAS_SQL)).map((row) => String(row.sch));
85
+ const wanted = options.schemas ? options.schemas.filter((name) => schemas.includes(name)) : schemas;
86
+ for (const name of options.schemas ?? [])
87
+ if (!schemas.includes(name))
88
+ warnings.push(`Schema "${name}" is not visible to this connection.`);
89
+ const kinds = options.includeViews ? ["r", "p", "f", "v", "m"] : ["r", "p", "f"];
90
+ const tableRows = wanted.length > 0 ? await query(TABLES_SQL, [wanted, kinds]) : [];
91
+ const candidates = tableRows.map((row) => ({
92
+ schema: String(row.sch),
93
+ name: String(row.tbl),
94
+ kind: kindOf(String(row.kind)),
95
+ comment: asString(row.comment),
96
+ estimate: asNumber(row.estimate),
97
+ }));
98
+ const { selected, truncated } = selectTables(candidates, options);
99
+ const tables = new Map();
100
+ for (const candidate of selected) {
101
+ tables.set(tableKey(candidate.schema, candidate.name), emptyTable(candidate, {
102
+ ...(candidate.comment ? { comment: candidate.comment } : {}),
103
+ ...(candidate.estimate !== undefined ? { rowCountEstimate: candidate.estimate } : {}),
104
+ }));
105
+ }
106
+ if (!options.objectsOnly && tables.size > 0) {
107
+ const detailSchemas = [...new Set(selected.map((candidate) => candidate.schema))];
108
+ for (const row of await query(COLUMNS_SQL, [detailSchemas, kinds])) {
109
+ const table = tables.get(tableKey(String(row.sch), String(row.tbl)));
110
+ if (!table)
111
+ continue;
112
+ const defaultValue = asString(row.default_value);
113
+ table.columns.push({
114
+ name: String(row.col),
115
+ dataType: String(row.data_type),
116
+ ordinal: asNumber(row.ordinal) ?? table.columns.length + 1,
117
+ nullable: asBoolean(row.nullable),
118
+ primaryKey: false,
119
+ ...(defaultValue !== undefined ? { defaultValue } : {}),
120
+ ...(asBoolean(row.identity) || /^nextval\(/i.test(defaultValue ?? "") ? { autoIncrement: true } : {}),
121
+ ...(asString(row.comment) ? { comment: asString(row.comment) } : {}),
122
+ });
123
+ }
124
+ for (const row of await query(CONSTRAINTS_SQL, [detailSchemas])) {
125
+ const table = tables.get(tableKey(String(row.sch), String(row.tbl)));
126
+ if (!table)
127
+ continue;
128
+ const columns = asList(row.cols);
129
+ const type = String(row.ctype);
130
+ if (type === "p")
131
+ table.primaryKey = columns;
132
+ else if (type === "u") {
133
+ table.indexes.push({ name: String(row.cname), columns, unique: true });
134
+ }
135
+ else if (type === "f") {
136
+ table.foreignKeys.push({
137
+ name: String(row.cname),
138
+ columns,
139
+ ...(asString(row.ref_sch) ? { refSchema: String(row.ref_sch) } : {}),
140
+ refTable: String(row.ref_tbl ?? ""),
141
+ refColumns: asList(row.ref_cols),
142
+ ...(referentialAction(row.on_delete) ? { onDelete: referentialAction(row.on_delete) } : {}),
143
+ ...(referentialAction(row.on_update) ? { onUpdate: referentialAction(row.on_update) } : {}),
144
+ });
145
+ }
146
+ }
147
+ for (const row of await query(INDEXES_SQL, [detailSchemas])) {
148
+ const table = tables.get(tableKey(String(row.sch), String(row.tbl)));
149
+ if (!table)
150
+ continue;
151
+ const name = String(row.name);
152
+ if (table.indexes.some((index) => index.name === name))
153
+ continue; // the unique constraint already listed it
154
+ const columns = asList(row.cols);
155
+ if (columns.length === 0)
156
+ continue; // expression index
157
+ table.indexes.push({ name, columns, unique: asBoolean(row.is_unique), ...(asBoolean(row.is_primary) ? { primary: true } : {}) });
158
+ }
159
+ for (const table of tables.values())
160
+ finishTable(table);
161
+ }
162
+ return {
163
+ dialect: "postgres",
164
+ ...(asString(databaseRow?.db) ? { database: String(databaseRow.db) } : {}),
165
+ schemas,
166
+ tables: [...tables.values()],
167
+ capturedAt: new Date().toISOString(),
168
+ warnings,
169
+ ...(truncated ? { truncated: true } : {}),
170
+ };
171
+ });
172
+ //# 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,29 @@
1
+ import type { DbIntrospectOptions, DbSchemaObjectKind, DbSchemaTable } from "./types.js";
2
+ export interface ResolvedIntrospectOptions {
3
+ schemas?: string[];
4
+ tables?: string[];
5
+ includeViews: boolean;
6
+ objectsOnly: boolean;
7
+ sampleSize: number;
8
+ maxTables: number;
9
+ }
10
+ export declare const resolveIntrospectOptions: (options?: DbIntrospectOptions) => ResolvedIntrospectOptions;
11
+ export declare const tableKey: (schema: string | undefined, name: string) => string;
12
+ export declare const tableMatchesFilter: (schema: string | undefined, name: string, filters: string[] | undefined) => boolean;
13
+ export interface TableCandidate {
14
+ schema?: string;
15
+ name: string;
16
+ kind: DbSchemaObjectKind;
17
+ }
18
+ export declare const selectTables: <T extends TableCandidate>(candidates: T[], options: ResolvedIntrospectOptions) => {
19
+ selected: T[];
20
+ truncated: boolean;
21
+ };
22
+ export declare const emptyTable: (candidate: TableCandidate, extra?: Partial<DbSchemaTable>) => DbSchemaTable;
23
+ export declare const asString: (value: unknown) => string | undefined;
24
+ export declare const asNumber: (value: unknown) => number | undefined;
25
+ export declare const asBoolean: (value: unknown) => boolean;
26
+ export declare const referentialAction: (value: unknown) => string | undefined;
27
+ export declare const markUniqueColumns: (table: DbSchemaTable) => void;
28
+ export declare const finishTable: (table: DbSchemaTable) => DbSchemaTable;
29
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/host/db/introspection/shared.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,eAAO,MAAM,wBAAwB,GAAI,UAAS,mBAAwB,KAAG,yBAW5E,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAA+C,CAAC;AAKpH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,KAAG,OAQ5G,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAKD,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,cAAc,EACnD,YAAY,CAAC,EAAE,EACf,SAAS,yBAAyB,KACjC;IAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAMrC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,WAAW,cAAc,EAAE,QAAO,OAAO,CAAC,aAAa,CAAM,KAAG,aASzF,CAAC;AAEH,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAIlD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAIlD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,OAK1C,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAuB3D,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,aAAa,KAAG,IAUxD,CAAC;AAGF,eAAO,MAAM,WAAW,GAAI,OAAO,aAAa,KAAG,aAMlD,CAAC"}
@@ -0,0 +1,119 @@
1
+ // Helpers every dialect's introspection shares: the resolved options, the
2
+ // table filter, the size cap and small normalisers.
3
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
4
+ export const resolveIntrospectOptions = (options = {}) => {
5
+ const schemas = options.schemas?.map((name) => name.trim()).filter(Boolean);
6
+ const tables = options.tables?.map((name) => name.trim()).filter(Boolean);
7
+ return {
8
+ ...(schemas && schemas.length > 0 ? { schemas } : {}),
9
+ ...(tables && tables.length > 0 ? { tables } : {}),
10
+ includeViews: options.includeViews !== false,
11
+ objectsOnly: Boolean(options.objectsOnly),
12
+ sampleSize: clamp(Math.round(Number(options.sampleSize) || 100), 1, 1000),
13
+ maxTables: clamp(Math.round(Number(options.maxTables) || 2000), 1, 20000),
14
+ };
15
+ };
16
+ export const tableKey = (schema, name) => (schema ? `${schema}.${name}` : name);
17
+ // "schema.table" matches the qualified name, a bare name matches the table
18
+ // name in any schema; both case-insensitive (Oracle upper-cases, Postgres
19
+ // lower-cases, SQL Server does not care).
20
+ export const tableMatchesFilter = (schema, name, filters) => {
21
+ if (!filters || filters.length === 0)
22
+ return true;
23
+ const qualified = tableKey(schema, name).toLowerCase();
24
+ const bare = name.toLowerCase();
25
+ return filters.some((filter) => {
26
+ const wanted = filter.toLowerCase();
27
+ return wanted.includes(".") ? wanted === qualified : wanted === bare;
28
+ });
29
+ };
30
+ // Views, the explicit table filter and the cap, applied in the order the
31
+ // database listed the objects. Returns the kept candidates and whether the
32
+ // cap cut anything.
33
+ export const selectTables = (candidates, options) => {
34
+ const filtered = candidates.filter((candidate) => (options.includeViews || candidate.kind !== "view") && tableMatchesFilter(candidate.schema, candidate.name, options.tables));
35
+ if (filtered.length <= options.maxTables)
36
+ return { selected: filtered, truncated: false };
37
+ return { selected: filtered.slice(0, options.maxTables), truncated: true };
38
+ };
39
+ export const emptyTable = (candidate, extra = {}) => ({
40
+ ...(candidate.schema ? { schema: candidate.schema } : {}),
41
+ name: candidate.name,
42
+ kind: candidate.kind,
43
+ columns: [],
44
+ primaryKey: [],
45
+ foreignKeys: [],
46
+ indexes: [],
47
+ ...extra,
48
+ });
49
+ export const asString = (value) => {
50
+ if (value === null || value === undefined)
51
+ return undefined;
52
+ const text = String(value);
53
+ return text.length > 0 ? text : undefined;
54
+ };
55
+ export const asNumber = (value) => {
56
+ if (value === null || value === undefined || value === "")
57
+ return undefined;
58
+ const number = Number(value);
59
+ return Number.isFinite(number) ? number : undefined;
60
+ };
61
+ export const asBoolean = (value) => {
62
+ if (typeof value === "boolean")
63
+ return value;
64
+ if (typeof value === "number")
65
+ return value !== 0;
66
+ if (typeof value === "string")
67
+ return /^(1|true|yes|y|t)$/i.test(value.trim());
68
+ return Boolean(value);
69
+ };
70
+ // Referential actions the way SQL spells them, from the dialect's codes.
71
+ export const referentialAction = (value) => {
72
+ const text = asString(value);
73
+ if (!text)
74
+ return undefined;
75
+ const upper = text.trim().toUpperCase().replace(/_/g, " ");
76
+ switch (upper) {
77
+ case "A":
78
+ case "NO ACTION":
79
+ return "NO ACTION";
80
+ case "R":
81
+ case "RESTRICT":
82
+ return "RESTRICT";
83
+ case "C":
84
+ case "CASCADE":
85
+ return "CASCADE";
86
+ case "N":
87
+ case "SET NULL":
88
+ return "SET NULL";
89
+ case "D":
90
+ case "SET DEFAULT":
91
+ return "SET DEFAULT";
92
+ default:
93
+ return upper;
94
+ }
95
+ };
96
+ // Mark the columns a single-column unique constraint/index covers.
97
+ export const markUniqueColumns = (table) => {
98
+ const unique = new Set();
99
+ const primary = new Set(table.primaryKey);
100
+ for (const index of table.indexes) {
101
+ if (!index.unique || index.primary || index.columns.length !== 1 || primary.has(index.columns[0]))
102
+ continue;
103
+ unique.add(index.columns[0]);
104
+ }
105
+ for (const column of table.columns) {
106
+ if (unique.has(column.name) && !column.primaryKey)
107
+ column.unique = true;
108
+ }
109
+ };
110
+ // Column order and primary-key flags from the table's key list.
111
+ export const finishTable = (table) => {
112
+ table.columns.sort((a, b) => a.ordinal - b.ordinal);
113
+ const primary = new Set(table.primaryKey);
114
+ for (const column of table.columns)
115
+ column.primaryKey = primary.has(column.name);
116
+ markUniqueColumns(table);
117
+ return table;
118
+ };
119
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/host/db/introspection/shared.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,oDAAoD;AAapD,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAEvG,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,UAA+B,EAAE,EAA6B,EAAE;IACvG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO;QACL,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,YAAY,EAAE,OAAO,CAAC,YAAY,KAAK,KAAK;QAC5C,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;QACzC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QACzE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;KAC1E,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAA0B,EAAE,IAAY,EAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAEpH,2EAA2E;AAC3E,0EAA0E;AAC1E,0CAA0C;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAA0B,EAAE,IAAY,EAAE,OAA6B,EAAW,EAAE;IACrH,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAQF,yEAAyE;AACzE,2EAA2E;AAC3E,oBAAoB;AACpB,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,UAAe,EACf,OAAkC,EACK,EAAE;IACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAChC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAC3I,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1F,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAyB,EAAE,QAAgC,EAAE,EAAiB,EAAE,CAAC,CAAC;IAC3G,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,IAAI,EAAE,SAAS,CAAC,IAAI;IACpB,IAAI,EAAE,SAAS,CAAC,IAAI;IACpB,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,EAAE;IACX,GAAG,KAAK;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAsB,EAAE;IAC7D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAsB,EAAE;IAC7D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAW,EAAE;IACnD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,KAAK,CAAC,CAAC;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAsB,EAAE;IACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3D,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,GAAG,CAAC;QACT,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,GAAG,CAAC;QACT,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,GAAG,CAAC;QACT,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,GAAG,CAAC;QACT,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,GAAG,CAAC;QACT,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAoB,EAAQ,EAAE;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAC5G,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IAC1E,CAAC;AACH,CAAC,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAiB,EAAE;IACjE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO;QAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjF,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}