dbctx 2.0.1 → 2.1.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 (220) hide show
  1. package/dist/index.mjs +6004 -279
  2. package/package.json +11 -8
  3. package/dist/app/assemble.d.mts +0 -5
  4. package/dist/app/assemble.d.mts.map +0 -1
  5. package/dist/app/assemble.mjs +0 -182
  6. package/dist/app/config.d.mts +0 -9
  7. package/dist/app/config.d.mts.map +0 -1
  8. package/dist/app/config.mjs +0 -49
  9. package/dist/app/db.d.mts +0 -9
  10. package/dist/app/db.d.mts.map +0 -1
  11. package/dist/app/db.mjs +0 -182
  12. package/dist/app/detect.d.mts +0 -14
  13. package/dist/app/detect.d.mts.map +0 -1
  14. package/dist/app/detect.mjs +0 -108
  15. package/dist/app/list.d.mts +0 -4
  16. package/dist/app/list.d.mts.map +0 -1
  17. package/dist/app/list.mjs +0 -93
  18. package/dist/app/load-introspection.d.mts +0 -26
  19. package/dist/app/load-introspection.d.mts.map +0 -1
  20. package/dist/app/load-introspection.mjs +0 -89
  21. package/dist/app/login.d.mts +0 -2
  22. package/dist/app/login.d.mts.map +0 -1
  23. package/dist/app/login.mjs +0 -69
  24. package/dist/app/open-url.d.mts +0 -6
  25. package/dist/app/open-url.d.mts.map +0 -1
  26. package/dist/app/open-url.mjs +0 -33
  27. package/dist/app/sample.d.mts +0 -24
  28. package/dist/app/sample.d.mts.map +0 -1
  29. package/dist/app/sample.mjs +0 -257
  30. package/dist/app/session.d.mts +0 -9
  31. package/dist/app/session.d.mts.map +0 -1
  32. package/dist/app/session.mjs +0 -195
  33. package/dist/app/ssh.d.mts +0 -3
  34. package/dist/app/ssh.d.mts.map +0 -1
  35. package/dist/app/ssh.mjs +0 -218
  36. package/dist/app/tail.d.mts +0 -13
  37. package/dist/app/tail.d.mts.map +0 -1
  38. package/dist/app/tail.mjs +0 -168
  39. package/dist/db/analyze.d.mts +0 -3
  40. package/dist/db/analyze.d.mts.map +0 -1
  41. package/dist/db/analyze.mjs +0 -16
  42. package/dist/db/attributes.d.mts +0 -16
  43. package/dist/db/attributes.d.mts.map +0 -1
  44. package/dist/db/attributes.mjs +0 -37
  45. package/dist/db/check-constraints.d.mts +0 -9
  46. package/dist/db/check-constraints.d.mts.map +0 -1
  47. package/dist/db/check-constraints.mjs +0 -17
  48. package/dist/db/custom-types.d.mts +0 -26
  49. package/dist/db/custom-types.d.mts.map +0 -1
  50. package/dist/db/custom-types.mjs +0 -61
  51. package/dist/db/enums.d.mts +0 -8
  52. package/dist/db/enums.d.mts.map +0 -1
  53. package/dist/db/enums.mjs +0 -24
  54. package/dist/db/extensions.d.mts +0 -8
  55. package/dist/db/extensions.d.mts.map +0 -1
  56. package/dist/db/extensions.mjs +0 -14
  57. package/dist/db/file-stats.d.mts +0 -11
  58. package/dist/db/file-stats.d.mts.map +0 -1
  59. package/dist/db/file-stats.mjs +0 -43
  60. package/dist/db/foreign-keys.d.mts +0 -14
  61. package/dist/db/foreign-keys.d.mts.map +0 -1
  62. package/dist/db/foreign-keys.mjs +0 -44
  63. package/dist/db/functions.d.mts +0 -11
  64. package/dist/db/functions.d.mts.map +0 -1
  65. package/dist/db/functions.mjs +0 -23
  66. package/dist/db/index.d.mts +0 -19
  67. package/dist/db/index.d.mts.map +0 -1
  68. package/dist/db/index.mjs +0 -19
  69. package/dist/db/indexes.d.mts +0 -16
  70. package/dist/db/indexes.d.mts.map +0 -1
  71. package/dist/db/indexes.mjs +0 -38
  72. package/dist/db/planner-stats.d.mts +0 -33
  73. package/dist/db/planner-stats.d.mts.map +0 -1
  74. package/dist/db/planner-stats.mjs +0 -103
  75. package/dist/db/relations.d.mts +0 -11
  76. package/dist/db/relations.d.mts.map +0 -1
  77. package/dist/db/relations.mjs +0 -32
  78. package/dist/db/rls.d.mts +0 -21
  79. package/dist/db/rls.d.mts.map +0 -1
  80. package/dist/db/rls.mjs +0 -48
  81. package/dist/db/sample.d.mts +0 -16
  82. package/dist/db/sample.d.mts.map +0 -1
  83. package/dist/db/sample.mjs +0 -73
  84. package/dist/db/sequences.d.mts +0 -15
  85. package/dist/db/sequences.d.mts.map +0 -1
  86. package/dist/db/sequences.mjs +0 -31
  87. package/dist/db/stats.d.mts +0 -12
  88. package/dist/db/stats.d.mts.map +0 -1
  89. package/dist/db/stats.mjs +0 -34
  90. package/dist/db/triggers.d.mts +0 -11
  91. package/dist/db/triggers.d.mts.map +0 -1
  92. package/dist/db/triggers.mjs +0 -21
  93. package/dist/db/version.d.mts +0 -14
  94. package/dist/db/version.d.mts.map +0 -1
  95. package/dist/db/version.mjs +0 -27
  96. package/dist/flow/events.d.mts +0 -115
  97. package/dist/flow/events.d.mts.map +0 -1
  98. package/dist/flow/events.mjs +0 -2
  99. package/dist/flow/interpreter.d.mts +0 -21
  100. package/dist/flow/interpreter.d.mts.map +0 -1
  101. package/dist/flow/interpreter.mjs +0 -605
  102. package/dist/flow/projection.d.mts +0 -17
  103. package/dist/flow/projection.d.mts.map +0 -1
  104. package/dist/flow/projection.mjs +0 -83
  105. package/dist/flow/projection.test.d.mts +0 -2
  106. package/dist/flow/projection.test.d.mts.map +0 -1
  107. package/dist/flow/projection.test.mjs +0 -162
  108. package/dist/flow/reducer.d.mts +0 -5
  109. package/dist/flow/reducer.d.mts.map +0 -1
  110. package/dist/flow/reducer.mjs +0 -306
  111. package/dist/flow/reducer.test.d.mts +0 -2
  112. package/dist/flow/reducer.test.d.mts.map +0 -1
  113. package/dist/flow/reducer.test.mjs +0 -479
  114. package/dist/flow/run.d.mts +0 -3
  115. package/dist/flow/run.d.mts.map +0 -1
  116. package/dist/flow/run.mjs +0 -89
  117. package/dist/flow/states.d.mts +0 -54
  118. package/dist/flow/states.d.mts.map +0 -1
  119. package/dist/flow/states.mjs +0 -39
  120. package/dist/index.d.mts +0 -29
  121. package/dist/index.d.mts.map +0 -1
  122. package/dist/lib/atomic-write.d.mts +0 -4
  123. package/dist/lib/atomic-write.d.mts.map +0 -1
  124. package/dist/lib/atomic-write.mjs +0 -75
  125. package/dist/lib/env.d.mts +0 -2
  126. package/dist/lib/env.d.mts.map +0 -1
  127. package/dist/lib/env.mjs +0 -4
  128. package/dist/lib/stream-job.d.mts +0 -19
  129. package/dist/lib/stream-job.d.mts.map +0 -1
  130. package/dist/lib/stream-job.mjs +0 -55
  131. package/dist/lib/trpc-url.d.mts +0 -2
  132. package/dist/lib/trpc-url.d.mts.map +0 -1
  133. package/dist/lib/trpc-url.mjs +0 -5
  134. package/dist/lib/trpc.d.mts +0 -7
  135. package/dist/lib/trpc.d.mts.map +0 -1
  136. package/dist/lib/trpc.mjs +0 -37
  137. package/dist/lib/trpc.react.d.mts +0 -4
  138. package/dist/lib/trpc.react.d.mts.map +0 -1
  139. package/dist/lib/trpc.react.mjs +0 -3
  140. package/dist/lib/version.d.mts +0 -2
  141. package/dist/lib/version.d.mts.map +0 -1
  142. package/dist/lib/version.mjs +0 -5
  143. package/dist/logger.d.mts +0 -3
  144. package/dist/logger.d.mts.map +0 -1
  145. package/dist/logger.mjs +0 -11
  146. package/dist/providers/TrpcProvider.d.ts +0 -9
  147. package/dist/providers/TrpcProvider.d.ts.map +0 -1
  148. package/dist/providers/TrpcProvider.js +0 -41
  149. package/dist/store.d.mts +0 -176
  150. package/dist/store.d.mts.map +0 -1
  151. package/dist/store.mjs +0 -147
  152. package/dist/types/connection.d.mts +0 -17
  153. package/dist/types/connection.d.mts.map +0 -1
  154. package/dist/types/connection.mjs +0 -2
  155. package/dist/ui/App.d.ts +0 -10
  156. package/dist/ui/App.d.ts.map +0 -1
  157. package/dist/ui/App.js +0 -41
  158. package/dist/ui/components/Analyze.d.ts +0 -10
  159. package/dist/ui/components/Analyze.d.ts.map +0 -1
  160. package/dist/ui/components/Analyze.js +0 -54
  161. package/dist/ui/components/Billing.d.ts +0 -10
  162. package/dist/ui/components/Billing.d.ts.map +0 -1
  163. package/dist/ui/components/Billing.js +0 -40
  164. package/dist/ui/components/DB.d.ts +0 -10
  165. package/dist/ui/components/DB.d.ts.map +0 -1
  166. package/dist/ui/components/DB.js +0 -22
  167. package/dist/ui/components/DatabasePicker.d.ts +0 -13
  168. package/dist/ui/components/DatabasePicker.d.ts.map +0 -1
  169. package/dist/ui/components/DatabasePicker.js +0 -79
  170. package/dist/ui/components/Enrich.d.ts +0 -10
  171. package/dist/ui/components/Enrich.d.ts.map +0 -1
  172. package/dist/ui/components/Enrich.js +0 -41
  173. package/dist/ui/components/Error.d.ts +0 -7
  174. package/dist/ui/components/Error.d.ts.map +0 -1
  175. package/dist/ui/components/Error.js +0 -6
  176. package/dist/ui/components/Gate.d.ts +0 -10
  177. package/dist/ui/components/Gate.d.ts.map +0 -1
  178. package/dist/ui/components/Gate.js +0 -15
  179. package/dist/ui/components/Introspect.d.ts +0 -10
  180. package/dist/ui/components/Introspect.d.ts.map +0 -1
  181. package/dist/ui/components/Introspect.js +0 -66
  182. package/dist/ui/components/IntrospectionUpload.d.ts +0 -10
  183. package/dist/ui/components/IntrospectionUpload.d.ts.map +0 -1
  184. package/dist/ui/components/IntrospectionUpload.js +0 -30
  185. package/dist/ui/components/Login.d.ts +0 -19
  186. package/dist/ui/components/Login.d.ts.map +0 -1
  187. package/dist/ui/components/Login.js +0 -38
  188. package/dist/ui/components/OutputJson.d.ts +0 -10
  189. package/dist/ui/components/OutputJson.d.ts.map +0 -1
  190. package/dist/ui/components/OutputJson.js +0 -18
  191. package/dist/ui/components/PasswordInput.d.ts +0 -7
  192. package/dist/ui/components/PasswordInput.d.ts.map +0 -1
  193. package/dist/ui/components/PasswordInput.js +0 -32
  194. package/dist/ui/components/SSH.d.ts +0 -10
  195. package/dist/ui/components/SSH.d.ts.map +0 -1
  196. package/dist/ui/components/SSH.js +0 -22
  197. package/dist/ui/components/SamplesUpload.d.ts +0 -10
  198. package/dist/ui/components/SamplesUpload.d.ts.map +0 -1
  199. package/dist/ui/components/SamplesUpload.js +0 -24
  200. package/dist/ui/components/Sampling.d.ts +0 -10
  201. package/dist/ui/components/Sampling.d.ts.map +0 -1
  202. package/dist/ui/components/Sampling.js +0 -58
  203. package/dist/ui/components/Session.d.ts +0 -10
  204. package/dist/ui/components/Session.d.ts.map +0 -1
  205. package/dist/ui/components/Session.js +0 -47
  206. package/dist/ui/components/Spinner.d.ts +0 -3
  207. package/dist/ui/components/Spinner.d.ts.map +0 -1
  208. package/dist/ui/components/Spinner.js +0 -30
  209. package/dist/ui/components/Splash.d.ts +0 -3
  210. package/dist/ui/components/Splash.d.ts.map +0 -1
  211. package/dist/ui/components/Splash.js +0 -13
  212. package/dist/ui/components/TextInput.d.ts +0 -11
  213. package/dist/ui/components/TextInput.d.ts.map +0 -1
  214. package/dist/ui/components/TextInput.js +0 -286
  215. package/dist/ui/components/UserExplanation.d.ts +0 -10
  216. package/dist/ui/components/UserExplanation.d.ts.map +0 -1
  217. package/dist/ui/components/UserExplanation.js +0 -34
  218. package/dist/validatePaths.d.mts +0 -13
  219. package/dist/validatePaths.d.mts.map +0 -1
  220. package/dist/validatePaths.mjs +0 -58
package/dist/app/ssh.mjs DELETED
@@ -1,218 +0,0 @@
1
- import { readFileSync, existsSync } from 'node:fs';
2
- import { homedir, userInfo } from 'node:os';
3
- import { join } from 'node:path';
4
- import net from 'node:net';
5
- import ssh2 from 'ssh2';
6
- const { Client, utils } = ssh2;
7
- import SSHConfig from 'ssh-config';
8
- import { runInAction, when } from 'mobx';
9
- import { scope } from 'scope-utilities';
10
- const SSH_KEY_ORDER = [
11
- 'id_ed25519_sk',
12
- 'id_ed25519',
13
- 'id_ecdsa_sk',
14
- 'id_ecdsa',
15
- 'id_rsa',
16
- 'id_dsa',
17
- ];
18
- const resolveSSHConfig = (store) => {
19
- const sshDir = join(homedir(), '.ssh');
20
- const configPath = join(sshDir, 'config');
21
- return scope({
22
- host: store.config.sshHost,
23
- port: 22,
24
- username: userInfo().username,
25
- privateKeyPath: undefined,
26
- })
27
- .let((config) => {
28
- if (!existsSync(configPath)) {
29
- return config;
30
- }
31
- const configText = readFileSync(configPath, 'utf-8');
32
- const computed = SSHConfig.parse(configText).compute(config.host);
33
- const identityFile = computed['IdentityFile']
34
- ? (Array.isArray(computed['IdentityFile'])
35
- ? computed['IdentityFile'][0]
36
- : computed['IdentityFile']).replace(/^~/, homedir())
37
- : config.privateKeyPath;
38
- return {
39
- host: computed['HostName'] ?? config.host,
40
- port: computed['Port']
41
- ? parseInt(computed['Port'], 10)
42
- : config.port,
43
- username: computed['User'] ?? config.username,
44
- privateKeyPath: identityFile,
45
- };
46
- })
47
- .let((config) => ({
48
- ...config,
49
- privateKeyPath: config.privateKeyPath ??
50
- SSH_KEY_ORDER.map((name) => join(sshDir, name)).find((path) => existsSync(path)),
51
- }))
52
- .let((config) => ({
53
- host: config.host,
54
- port: store.config.sshPort ?? config.port,
55
- username: store.config.sshUsername ?? config.username,
56
- privateKeyPath: store.config.sshKey ?? config.privateKeyPath,
57
- }))
58
- .value();
59
- };
60
- export const connectSSH = async (store) => {
61
- if (!store.steps.sshConnection.enabled) {
62
- return undefined;
63
- }
64
- const config = resolveSSHConfig(store);
65
- const privateKey = config.privateKeyPath && existsSync(config.privateKeyPath)
66
- ? readFileSync(config.privateKeyPath)
67
- : undefined;
68
- const keyIsEncrypted = privateKey !== undefined && utils.parseKey(privateKey) instanceof Error;
69
- let publicKeyAttempted = false;
70
- const promptForInput = (type, finish) => {
71
- runInAction(() => {
72
- store.steps.sshConnection.wrongAttempt =
73
- store.steps.sshConnection.passwordPromptType === type;
74
- store.steps.sshConnection.password = null;
75
- store.steps.sshConnection.needPassword = true;
76
- store.steps.sshConnection.passwordPromptType = type;
77
- store.steps.sshConnection.promptCount += 1;
78
- store.steps.sshConnection.state = 'need-password';
79
- });
80
- when(() => store.steps.sshConnection.password !== null).then(() => {
81
- runInAction(() => {
82
- store.steps.sshConnection.needPassword = false;
83
- store.steps.sshConnection.state = 'connecting';
84
- });
85
- finish([store.steps.sshConnection.password]);
86
- });
87
- };
88
- const promptForPassphrase = (finish) => {
89
- const envPassphrase = process.env['SSH_PASSPHRASE'];
90
- if (envPassphrase !== undefined &&
91
- !(utils.parseKey(privateKey, envPassphrase) instanceof Error)) {
92
- finish(envPassphrase);
93
- return;
94
- }
95
- if (envPassphrase !== undefined) {
96
- runInAction(() => {
97
- store.steps.sshConnection.passwordPromptType = 'passphrase';
98
- });
99
- }
100
- promptForInput('passphrase', (responses) => {
101
- const tryPassphrase = responses[0];
102
- utils.parseKey(privateKey, tryPassphrase) instanceof Error
103
- ? promptForPassphrase(finish)
104
- : finish(tryPassphrase);
105
- });
106
- };
107
- const authHandler = (methodsLeft, _partialSuccess, next) => {
108
- const { username } = config;
109
- // First call: methodsLeft is null — send 'none' to discover available methods
110
- !methodsLeft
111
- ? next({ type: 'none', username })
112
- : methodsLeft.includes('publickey') &&
113
- privateKey &&
114
- keyIsEncrypted &&
115
- !publicKeyAttempted
116
- ? promptForPassphrase((validPassphrase) => {
117
- publicKeyAttempted = true;
118
- next({
119
- type: 'publickey',
120
- username,
121
- key: privateKey,
122
- passphrase: validPassphrase,
123
- });
124
- })
125
- : methodsLeft.includes('publickey') &&
126
- privateKey &&
127
- !publicKeyAttempted
128
- ? (() => {
129
- publicKeyAttempted = true;
130
- next({ type: 'publickey', username, key: privateKey });
131
- })()
132
- : methodsLeft.includes('keyboard-interactive')
133
- ? next({
134
- type: 'keyboard-interactive',
135
- username,
136
- prompt: (_name, _instructions, _lang, _prompts, finish) => {
137
- promptForInput('password', finish);
138
- },
139
- })
140
- : methodsLeft.includes('password')
141
- ? promptForInput('password', (responses) => {
142
- next({
143
- type: 'password',
144
- username,
145
- password: responses[0],
146
- });
147
- })
148
- : next('none');
149
- };
150
- const connectConfig = {
151
- host: config.host,
152
- port: config.port,
153
- username: config.username,
154
- readyTimeout: 0,
155
- keepaliveInterval: 10_000,
156
- keepaliveCountMax: 3,
157
- authHandler: authHandler,
158
- };
159
- runInAction(() => {
160
- store.steps.sshConnection.pickedHostname = config.host;
161
- store.steps.sshConnection.pickedPort = config.port;
162
- store.steps.sshConnection.pickedUsername = config.username;
163
- store.steps.sshConnection.pickedKeyPath = config.privateKeyPath ?? null;
164
- store.steps.sshConnection.state = 'connecting';
165
- });
166
- const client = new Client();
167
- return new Promise((resolve, reject) => {
168
- client.on('ready', () => {
169
- runInAction(() => {
170
- store.steps.sshConnection.state = 'connected';
171
- store.steps.sshConnection.needPassword = false;
172
- });
173
- const remoteHost = store.config.hostname ?? 'localhost';
174
- const remotePort = store.config.port ?? 5432;
175
- const server = net.createServer((socket) => {
176
- const localPort = server.address().port;
177
- client.forwardOut('127.0.0.1', localPort, remoteHost, remotePort, (err, stream) => {
178
- if (err) {
179
- socket.end();
180
- return;
181
- }
182
- socket.pipe(stream).pipe(socket);
183
- });
184
- });
185
- server.listen(0, '127.0.0.1', () => {
186
- const localPort = server.address().port;
187
- runInAction(() => {
188
- store.steps.sshConnection.localPort = localPort;
189
- });
190
- resolve(() => {
191
- server.close();
192
- client.end();
193
- runInAction(() => {
194
- store.steps.sshConnection.state = 'idle';
195
- store.steps.sshConnection.localPort = null;
196
- });
197
- });
198
- });
199
- });
200
- client.on('error', (err) => {
201
- runInAction(() => {
202
- store.steps.sshConnection.state = 'error';
203
- store.steps.sshConnection.error = err.message;
204
- });
205
- reject(err);
206
- });
207
- client.on('close', () => {
208
- runInAction(() => {
209
- if (store.steps.sshConnection.state !== 'error') {
210
- store.steps.sshConnection.state = 'closed';
211
- }
212
- store.steps.sshConnection.localPort = null;
213
- });
214
- });
215
- client.connect(connectConfig);
216
- });
217
- };
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NoLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9zc2gubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQzNCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUd4QixNQUFNLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztBQUM3QixPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE1BQU0sYUFBYSxHQUFHO0lBQ2xCLGVBQWU7SUFDZixZQUFZO0lBQ1osYUFBYTtJQUNiLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtDQUNGLENBQUM7QUFFWCxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFMUMsT0FBTyxLQUFLLENBQUM7UUFDVCxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFRO1FBQzNCLElBQUksRUFBRSxFQUFFO1FBQ1IsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVE7UUFDN0IsY0FBYyxFQUFFLFNBQStCO0tBQ2xELENBQUM7U0FDRyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQzdCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUM1QixDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUU1QixPQUFPO1lBQ0gsSUFBSSxFQUFHLFFBQVEsQ0FBQyxVQUFVLENBQVksSUFBSSxNQUFNLENBQUMsSUFBSTtZQUNyRCxJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDakIsUUFBUSxFQUFHLFFBQVEsQ0FBQyxNQUFNLENBQVksSUFBSSxNQUFNLENBQUMsUUFBUTtZQUN6RCxjQUFjLEVBQUUsWUFBWTtTQUMvQixDQUFDO0lBQ04sQ0FBQyxDQUFDO1NBQ0QsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxNQUFNO1FBQ1QsY0FBYyxFQUNWLE1BQU0sQ0FBQyxjQUFjO1lBQ3JCLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMxRCxVQUFVLENBQUMsSUFBSSxDQUFDLENBQ25CO0tBQ1IsQ0FBQyxDQUFDO1NBQ0YsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSTtRQUN6QyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFFBQVE7UUFDckQsY0FBYyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxjQUFjO0tBQy9ELENBQUMsQ0FBQztTQUNGLEtBQUssRUFBRSxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQzNCLEtBQWEsRUFDb0IsRUFBRTtJQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZDLE1BQU0sVUFBVSxHQUNaLE1BQU0sQ0FBQyxjQUFjLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDdEQsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFcEIsTUFBTSxjQUFjLEdBQ2hCLFVBQVUsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxLQUFLLENBQUM7SUFFNUUsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFFL0IsTUFBTSxjQUFjLEdBQUcsQ0FDbkIsSUFBK0IsRUFDL0IsTUFBcUMsRUFDdkMsRUFBRTtRQUNBLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZO2dCQUNsQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLENBQUM7WUFDMUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUMxQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzlDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUNwRCxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1lBQzNDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDOUQsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMvQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUyxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUF5QyxFQUFFLEVBQUU7UUFDdEUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BELElBQ0ksYUFBYSxLQUFLLFNBQVM7WUFDM0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVyxFQUFFLGFBQWEsQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUNoRSxDQUFDO1lBQ0MsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsR0FBRyxZQUFZLENBQUM7WUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztZQUNwQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVcsRUFBRSxhQUFhLENBQUMsWUFBWSxLQUFLO2dCQUN2RCxDQUFDLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDO2dCQUM3QixDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDO0lBRUYsTUFBTSxXQUFXLEdBQTBCLENBQ3ZDLFdBQVcsRUFDWCxlQUFlLEVBQ2YsSUFBSSxFQUNOLEVBQUU7UUFDQSxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsTUFBTSxDQUFDO1FBRTFCLDhFQUE4RTtRQUM5RSxDQUFDLFdBQVc7WUFDUixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQy9CLFVBQVU7Z0JBQ1YsY0FBYztnQkFDZCxDQUFDLGtCQUFrQjtnQkFDckIsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7b0JBQ3BDLGtCQUFrQixHQUFHLElBQUksQ0FBQztvQkFDMUIsSUFBSSxDQUFDO3dCQUNELElBQUksRUFBRSxXQUFXO3dCQUNqQixRQUFRO3dCQUNSLEdBQUcsRUFBRSxVQUFVO3dCQUNmLFVBQVUsRUFBRSxlQUFlO3FCQUM5QixDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDO2dCQUNKLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztvQkFDL0IsVUFBVTtvQkFDVixDQUFDLGtCQUFrQjtvQkFDckIsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO3dCQUNGLGtCQUFrQixHQUFHLElBQUksQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7b0JBQ3pELENBQUMsQ0FBQyxFQUFFO29CQUNOLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO3dCQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUNELElBQUksRUFBRSxzQkFBc0I7NEJBQzVCLFFBQVE7NEJBQ1IsTUFBTSxFQUFFLENBQ0osS0FBSyxFQUNMLGFBQWEsRUFDYixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDUixFQUFFO2dDQUNBLGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7NEJBQ3ZDLENBQUM7eUJBQ0osQ0FBQzt3QkFDSixDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7NEJBQ2hDLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0NBQ3JDLElBQUksQ0FBQztvQ0FDRCxJQUFJLEVBQUUsVUFBVTtvQ0FDaEIsUUFBUTtvQ0FDUixRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBRTtpQ0FDMUIsQ0FBQyxDQUFDOzRCQUNQLENBQUMsQ0FBQzs0QkFDSixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFrQjtRQUNqQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixZQUFZLEVBQUUsQ0FBQztRQUNmLGlCQUFpQixFQUFFLE1BQU07UUFDekIsaUJBQWlCLEVBQUUsQ0FBQztRQUNwQixXQUFXLEVBQUUsV0FBVztLQUMzQixDQUFDO0lBRUYsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ25ELEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzNELEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQztRQUN4RSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUU1QixPQUFPLElBQUksT0FBTyxDQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQy9DLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNwQixXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7Z0JBQzlDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUM7WUFDeEQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1lBRTdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDdkMsTUFBTSxTQUFTLEdBQUksTUFBTSxDQUFDLE9BQU8sRUFBc0IsQ0FBQyxJQUFJLENBQUM7Z0JBRTdELE1BQU0sQ0FBQyxVQUFVLENBQ2IsV0FBVyxFQUNYLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUNaLElBQUksR0FBRyxFQUFFLENBQUM7d0JBQ04sTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNiLE9BQU87b0JBQ1gsQ0FBQztvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckMsQ0FBQyxDQUNKLENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUU7Z0JBQy9CLE1BQU0sU0FBUyxHQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQXNCLENBQUMsSUFBSSxDQUFDO2dCQUU3RCxXQUFXLENBQUMsR0FBRyxFQUFFO29CQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxDQUFDO2dCQUVILE9BQU8sQ0FBQyxHQUFHLEVBQUU7b0JBQ1QsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNmLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDYixXQUFXLENBQUMsR0FBRyxFQUFFO3dCQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7d0JBQ3pDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQy9DLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDdkIsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO2dCQUMxQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNwQixXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUMvQyxDQUFDO2dCQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luY30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge2hvbWVkaXIsIHVzZXJJbmZvfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7am9pbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBuZXQgZnJvbSAnbm9kZTpuZXQnO1xuaW1wb3J0IHNzaDIgZnJvbSAnc3NoMic7XG5pbXBvcnQgdHlwZSB7QXV0aEhhbmRsZXJNaWRkbGV3YXJlLCBDb25uZWN0Q29uZmlnfSBmcm9tICdzc2gyJztcblxuY29uc3Qge0NsaWVudCwgdXRpbHN9ID0gc3NoMjtcbmltcG9ydCBTU0hDb25maWcgZnJvbSAnc3NoLWNvbmZpZyc7XG5pbXBvcnQge3J1bkluQWN0aW9uLCB3aGVufSBmcm9tICdtb2J4JztcbmltcG9ydCB7c2NvcGV9IGZyb20gJ3Njb3BlLXV0aWxpdGllcyc7XG5cbmltcG9ydCB0eXBlIHtUU3RvcmV9IGZyb20gJy4uL3N0b3JlLm1qcyc7XG5cbmNvbnN0IFNTSF9LRVlfT1JERVIgPSBbXG4gICAgJ2lkX2VkMjU1MTlfc2snLFxuICAgICdpZF9lZDI1NTE5JyxcbiAgICAnaWRfZWNkc2Ffc2snLFxuICAgICdpZF9lY2RzYScsXG4gICAgJ2lkX3JzYScsXG4gICAgJ2lkX2RzYScsXG5dIGFzIGNvbnN0O1xuXG5jb25zdCByZXNvbHZlU1NIQ29uZmlnID0gKHN0b3JlOiBUU3RvcmUpID0+IHtcbiAgICBjb25zdCBzc2hEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5zc2gnKTtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihzc2hEaXIsICdjb25maWcnKTtcblxuICAgIHJldHVybiBzY29wZSh7XG4gICAgICAgIGhvc3Q6IHN0b3JlLmNvbmZpZy5zc2hIb3N0ISxcbiAgICAgICAgcG9ydDogMjIsXG4gICAgICAgIHVzZXJuYW1lOiB1c2VySW5mbygpLnVzZXJuYW1lLFxuICAgICAgICBwcml2YXRlS2V5UGF0aDogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB9KVxuICAgICAgICAubGV0KChjb25maWcpID0+IHtcbiAgICAgICAgICAgIGlmICghZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1RleHQgPSByZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IFNTSENvbmZpZy5wYXJzZShjb25maWdUZXh0KS5jb21wdXRlKGNvbmZpZy5ob3N0KTtcblxuICAgICAgICAgICAgY29uc3QgaWRlbnRpdHlGaWxlID0gY29tcHV0ZWRbJ0lkZW50aXR5RmlsZSddXG4gICAgICAgICAgICAgICAgPyAoQXJyYXkuaXNBcnJheShjb21wdXRlZFsnSWRlbnRpdHlGaWxlJ10pXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb21wdXRlZFsnSWRlbnRpdHlGaWxlJ11bMF1cbiAgICAgICAgICAgICAgICAgICAgICA6IGNvbXB1dGVkWydJZGVudGl0eUZpbGUnXVxuICAgICAgICAgICAgICAgICAgKS5yZXBsYWNlKC9efi8sIGhvbWVkaXIoKSlcbiAgICAgICAgICAgICAgICA6IGNvbmZpZy5wcml2YXRlS2V5UGF0aDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBob3N0OiAoY29tcHV0ZWRbJ0hvc3ROYW1lJ10gYXMgc3RyaW5nKSA/PyBjb25maWcuaG9zdCxcbiAgICAgICAgICAgICAgICBwb3J0OiBjb21wdXRlZFsnUG9ydCddXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoY29tcHV0ZWRbJ1BvcnQnXSBhcyBzdHJpbmcsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5wb3J0LFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiAoY29tcHV0ZWRbJ1VzZXInXSBhcyBzdHJpbmcpID8/IGNvbmZpZy51c2VybmFtZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlS2V5UGF0aDogaWRlbnRpdHlGaWxlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PiAoe1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgcHJpdmF0ZUtleVBhdGg6XG4gICAgICAgICAgICAgICAgY29uZmlnLnByaXZhdGVLZXlQYXRoID8/XG4gICAgICAgICAgICAgICAgU1NIX0tFWV9PUkRFUi5tYXAoKG5hbWUpID0+IGpvaW4oc3NoRGlyLCBuYW1lKSkuZmluZCgocGF0aCkgPT5cbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzU3luYyhwYXRoKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9KSlcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PiAoe1xuICAgICAgICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICAgICAgICBwb3J0OiBzdG9yZS5jb25maWcuc3NoUG9ydCA/PyBjb25maWcucG9ydCxcbiAgICAgICAgICAgIHVzZXJuYW1lOiBzdG9yZS5jb25maWcuc3NoVXNlcm5hbWUgPz8gY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgcHJpdmF0ZUtleVBhdGg6IHN0b3JlLmNvbmZpZy5zc2hLZXkgPz8gY29uZmlnLnByaXZhdGVLZXlQYXRoLFxuICAgICAgICB9KSlcbiAgICAgICAgLnZhbHVlKCk7XG59O1xuXG5leHBvcnQgY29uc3QgY29ubmVjdFNTSCA9IGFzeW5jIChcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTwoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBpZiAoIXN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVTU0hDb25maWcoc3RvcmUpO1xuXG4gICAgY29uc3QgcHJpdmF0ZUtleSA9XG4gICAgICAgIGNvbmZpZy5wcml2YXRlS2V5UGF0aCAmJiBleGlzdHNTeW5jKGNvbmZpZy5wcml2YXRlS2V5UGF0aClcbiAgICAgICAgICAgID8gcmVhZEZpbGVTeW5jKGNvbmZpZy5wcml2YXRlS2V5UGF0aClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qga2V5SXNFbmNyeXB0ZWQgPVxuICAgICAgICBwcml2YXRlS2V5ICE9PSB1bmRlZmluZWQgJiYgdXRpbHMucGFyc2VLZXkocHJpdmF0ZUtleSkgaW5zdGFuY2VvZiBFcnJvcjtcblxuICAgIGxldCBwdWJsaWNLZXlBdHRlbXB0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHByb21wdEZvcklucHV0ID0gKFxuICAgICAgICB0eXBlOiAncGFzc3BocmFzZScgfCAncGFzc3dvcmQnLFxuICAgICAgICBmaW5pc2g6IChyZXNwb25zZXM6IHN0cmluZ1tdKSA9PiB2b2lkLFxuICAgICkgPT4ge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLndyb25nQXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5wYXNzd29yZFByb21wdFR5cGUgPT09IHR5cGU7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ubmVlZFBhc3N3b3JkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ucGFzc3dvcmRQcm9tcHRUeXBlID0gdHlwZTtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ucHJvbXB0Q291bnQgKz0gMTtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uc3RhdGUgPSAnbmVlZC1wYXNzd29yZCc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoZW4oKCkgPT4gc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5wYXNzd29yZCAhPT0gbnVsbCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5uZWVkUGFzc3dvcmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnN0YXRlID0gJ2Nvbm5lY3RpbmcnO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZpbmlzaChbc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5wYXNzd29yZCFdKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByb21wdEZvclBhc3NwaHJhc2UgPSAoZmluaXNoOiAodmFsaWRQYXNzcGhyYXNlOiBzdHJpbmcpID0+IHZvaWQpID0+IHtcbiAgICAgICAgY29uc3QgZW52UGFzc3BocmFzZSA9IHByb2Nlc3MuZW52WydTU0hfUEFTU1BIUkFTRSddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbnZQYXNzcGhyYXNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICEodXRpbHMucGFyc2VLZXkocHJpdmF0ZUtleSEsIGVudlBhc3NwaHJhc2UpIGluc3RhbmNlb2YgRXJyb3IpXG4gICAgICAgICkge1xuICAgICAgICAgICAgZmluaXNoKGVudlBhc3NwaHJhc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudlBhc3NwaHJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ucGFzc3dvcmRQcm9tcHRUeXBlID0gJ3Bhc3NwaHJhc2UnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9tcHRGb3JJbnB1dCgncGFzc3BocmFzZScsIChyZXNwb25zZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyeVBhc3NwaHJhc2UgPSByZXNwb25zZXNbMF0hO1xuICAgICAgICAgICAgdXRpbHMucGFyc2VLZXkocHJpdmF0ZUtleSEsIHRyeVBhc3NwaHJhc2UpIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICA/IHByb21wdEZvclBhc3NwaHJhc2UoZmluaXNoKVxuICAgICAgICAgICAgICAgIDogZmluaXNoKHRyeVBhc3NwaHJhc2UpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXV0aEhhbmRsZXI6IEF1dGhIYW5kbGVyTWlkZGxld2FyZSA9IChcbiAgICAgICAgbWV0aG9kc0xlZnQsXG4gICAgICAgIF9wYXJ0aWFsU3VjY2VzcyxcbiAgICAgICAgbmV4dCxcbiAgICApID0+IHtcbiAgICAgICAgY29uc3Qge3VzZXJuYW1lfSA9IGNvbmZpZztcblxuICAgICAgICAvLyBGaXJzdCBjYWxsOiBtZXRob2RzTGVmdCBpcyBudWxsIOKAlCBzZW5kICdub25lJyB0byBkaXNjb3ZlciBhdmFpbGFibGUgbWV0aG9kc1xuICAgICAgICAhbWV0aG9kc0xlZnRcbiAgICAgICAgICAgID8gbmV4dCh7dHlwZTogJ25vbmUnLCB1c2VybmFtZX0pXG4gICAgICAgICAgICA6IG1ldGhvZHNMZWZ0LmluY2x1ZGVzKCdwdWJsaWNrZXknKSAmJlxuICAgICAgICAgICAgICAgIHByaXZhdGVLZXkgJiZcbiAgICAgICAgICAgICAgICBrZXlJc0VuY3J5cHRlZCAmJlxuICAgICAgICAgICAgICAgICFwdWJsaWNLZXlBdHRlbXB0ZWRcbiAgICAgICAgICAgICAgPyBwcm9tcHRGb3JQYXNzcGhyYXNlKCh2YWxpZFBhc3NwaHJhc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5QXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHVibGlja2V5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBwcml2YXRlS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZTogdmFsaWRQYXNzcGhyYXNlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IG1ldGhvZHNMZWZ0LmluY2x1ZGVzKCdwdWJsaWNrZXknKSAmJlxuICAgICAgICAgICAgICAgICAgcHJpdmF0ZUtleSAmJlxuICAgICAgICAgICAgICAgICAgIXB1YmxpY0tleUF0dGVtcHRlZFxuICAgICAgICAgICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNLZXlBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIG5leHQoe3R5cGU6ICdwdWJsaWNrZXknLCB1c2VybmFtZSwga2V5OiBwcml2YXRlS2V5fSk7XG4gICAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICAgICAgOiBtZXRob2RzTGVmdC5pbmNsdWRlcygna2V5Ym9hcmQtaW50ZXJhY3RpdmUnKVxuICAgICAgICAgICAgICAgICAgPyBuZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdrZXlib2FyZC1pbnRlcmFjdGl2ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xhbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb21wdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0Rm9ySW5wdXQoJ3Bhc3N3b3JkJywgZmluaXNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICA6IG1ldGhvZHNMZWZ0LmluY2x1ZGVzKCdwYXNzd29yZCcpXG4gICAgICAgICAgICAgICAgICAgID8gcHJvbXB0Rm9ySW5wdXQoJ3Bhc3N3b3JkJywgKHJlc3BvbnNlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiByZXNwb25zZXNbMF0hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IG5leHQoJ25vbmUnKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29ubmVjdENvbmZpZzogQ29ubmVjdENvbmZpZyA9IHtcbiAgICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICAgIHBvcnQ6IGNvbmZpZy5wb3J0LFxuICAgICAgICB1c2VybmFtZTogY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICByZWFkeVRpbWVvdXQ6IDAsXG4gICAgICAgIGtlZXBhbGl2ZUludGVydmFsOiAxMF8wMDAsXG4gICAgICAgIGtlZXBhbGl2ZUNvdW50TWF4OiAzLFxuICAgICAgICBhdXRoSGFuZGxlcjogYXV0aEhhbmRsZXIsXG4gICAgfTtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5waWNrZWRIb3N0bmFtZSA9IGNvbmZpZy5ob3N0O1xuICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnBpY2tlZFBvcnQgPSBjb25maWcucG9ydDtcbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5waWNrZWRVc2VybmFtZSA9IGNvbmZpZy51c2VybmFtZTtcbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5waWNrZWRLZXlQYXRoID0gY29uZmlnLnByaXZhdGVLZXlQYXRoID8/IG51bGw7XG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uc3RhdGUgPSAnY29ubmVjdGluZyc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8KCkgPT4gdm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjbGllbnQub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uc3RhdGUgPSAnY29ubmVjdGVkJztcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLm5lZWRQYXNzd29yZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbW90ZUhvc3QgPSBzdG9yZS5jb25maWcuaG9zdG5hbWUgPz8gJ2xvY2FsaG9zdCc7XG4gICAgICAgICAgICBjb25zdCByZW1vdGVQb3J0ID0gc3RvcmUuY29uZmlnLnBvcnQgPz8gNTQzMjtcblxuICAgICAgICAgICAgY29uc3Qgc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcigoc29ja2V0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxQb3J0ID0gKHNlcnZlci5hZGRyZXNzKCkgYXMgbmV0LkFkZHJlc3NJbmZvKS5wb3J0O1xuXG4gICAgICAgICAgICAgICAgY2xpZW50LmZvcndhcmRPdXQoXG4gICAgICAgICAgICAgICAgICAgICcxMjcuMC4wLjEnLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbFBvcnQsXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QsXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZVBvcnQsXG4gICAgICAgICAgICAgICAgICAgIChlcnIsIHN0cmVhbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQucGlwZShzdHJlYW0pLnBpcGUoc29ja2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlcnZlci5saXN0ZW4oMCwgJzEyNy4wLjAuMScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbFBvcnQgPSAoc2VydmVyLmFkZHJlc3MoKSBhcyBuZXQuQWRkcmVzc0luZm8pLnBvcnQ7XG5cbiAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ubG9jYWxQb3J0ID0gbG9jYWxQb3J0O1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBjbGllbnQuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uc3RhdGUgPSAnaWRsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmxvY2FsUG9ydCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNsaWVudC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5lcnJvciA9IGVyci5tZXNzYWdlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjbGllbnQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnN0YXRlICE9PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uc3RhdGUgPSAnY2xvc2VkJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmxvY2FsUG9ydCA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2xpZW50LmNvbm5lY3QoY29ubmVjdENvbmZpZyk7XG4gICAgfSk7XG59O1xuIl19
@@ -1,13 +0,0 @@
1
- import type { TRPCClient } from '@trpc/client';
2
- import type { TAppRouter } from '@dbctx/core';
3
- import { type TJobSnapshot } from '../lib/stream-job.mjs';
4
- import type { TStore } from '../store.mjs';
5
- export declare const streamPostIntrospection: (authed: TRPCClient<TAppRouter>, jobId: string, store: TStore) => Promise<TJobSnapshot>;
6
- export declare const dispatchAndStreamPostSampling: (authed: TRPCClient<TAppRouter>, revisionId: string, store: TStore) => Promise<void>;
7
- export declare const tailRevision: (args: {
8
- authed: TRPCClient<TAppRouter>;
9
- revisionId: string;
10
- store: TStore;
11
- postIntrospectionDone: boolean;
12
- }) => Promise<void>;
13
- //# sourceMappingURL=tail.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tail.d.mts","sourceRoot":"./src/","sources":["app/tail.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAK5C,OAAO,EAAY,KAAK,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAMzC,eAAO,MAAM,uBAAuB,GAChC,QAAQ,UAAU,CAAC,UAAU,CAAC,EAC9B,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,YAAY,CAuCtB,CAAC;AAIF,eAAO,MAAM,6BAA6B,GACtC,QAAQ,UAAU,CAAC,UAAU,CAAC,EAC9B,YAAY,MAAM,EAClB,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAqFd,CAAC;AAYF,eAAO,MAAM,YAAY,GAAU,MAAM;IACrC,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB,EAAE,OAAO,CAAC;CAClC,KAAG,OAAO,CAAC,IAAI,CAkCf,CAAC"}
package/dist/app/tail.mjs DELETED
@@ -1,168 +0,0 @@
1
- import { runInAction } from 'mobx';
2
- import { parsePostIntrospectionStage, parsePostSamplingLabel, } from '@dbctx/common';
3
- import { streamJob } from '../lib/stream-job.mjs';
4
- import { logger } from '../logger.mjs';
5
- // Streams a post-introspection job to completion and binds progress + terminal state
6
- // onto store.steps.ingestion.postIntrospection. Returns the final snapshot so callers
7
- // can react to success/failure.
8
- export const streamPostIntrospection = async (authed, jobId, store) => {
9
- try {
10
- const snapshot = await streamJob(authed, jobId, {
11
- onProgress: (snap) => {
12
- runInAction(() => {
13
- store.steps.ingestion.postIntrospection.state = 'running';
14
- store.steps.ingestion.postIntrospection.stage =
15
- parsePostIntrospectionStage(snap.progressLabel);
16
- store.steps.ingestion.postIntrospection.tokensIn =
17
- snap.tokensIn ?? null;
18
- store.steps.ingestion.postIntrospection.tokensOut =
19
- snap.tokensOut ?? null;
20
- store.steps.ingestion.postIntrospection.columnsDone =
21
- snap.columnsDone ?? null;
22
- store.steps.ingestion.postIntrospection.columnsTotal =
23
- snap.columnsTotal ?? null;
24
- });
25
- },
26
- });
27
- runInAction(() => {
28
- if (snapshot.status === 'failed') {
29
- store.steps.ingestion.postIntrospection.state = 'error';
30
- store.steps.ingestion.postIntrospection.error =
31
- snapshot.error ?? 'post-introspection failed';
32
- }
33
- else {
34
- store.steps.ingestion.postIntrospection.state = 'done';
35
- }
36
- });
37
- return snapshot;
38
- }
39
- catch (err) {
40
- const msg = err instanceof Error ? err.message : String(err);
41
- runInAction(() => {
42
- store.steps.ingestion.postIntrospection.state = 'error';
43
- store.steps.ingestion.postIntrospection.error = msg;
44
- });
45
- throw err;
46
- }
47
- };
48
- // Triggers post-sampling (server skips re-enqueue if already analyzed) and binds
49
- // progress + terminal state onto store.steps.ingestion.postSampling.
50
- export const dispatchAndStreamPostSampling = async (authed, revisionId, store) => {
51
- runInAction(() => {
52
- if (store.steps.ingestion.postSampling.state === 'idle') {
53
- store.steps.ingestion.postSampling.state = 'queued';
54
- }
55
- });
56
- const result = await authed.revisions.runPostSampling.mutate({ revisionId });
57
- if (result.alreadyAnalyzed) {
58
- runInAction(() => {
59
- const c = store.steps.ingestion.postSampling;
60
- c.state = 'done';
61
- c.jobId = null;
62
- c.reused = true;
63
- c.counts.totalTables = result.counts.totalTables;
64
- c.counts.foreignKeysFound = result.counts.foreignKeys;
65
- });
66
- logger.info(`post-sampling reused for revision=${revisionId} (tables=${result.counts.totalTables} fks=${result.counts.foreignKeys})`);
67
- return;
68
- }
69
- const { jobId } = result;
70
- runInAction(() => {
71
- store.steps.ingestion.postSampling.jobId = jobId;
72
- store.steps.ingestion.postSampling.state = 'running';
73
- });
74
- const snapshot = await streamJob(authed, jobId, {
75
- onProgress: (snap) => {
76
- runInAction(() => {
77
- const c = store.steps.ingestion.postSampling;
78
- const next = parsePostSamplingLabel(snap.progressLabel, {
79
- stage: c.stage,
80
- totalTables: c.counts.totalTables,
81
- describedTables: c.counts.describedTables,
82
- embeddedTables: c.counts.embeddedTables,
83
- totalEmbeddings: c.counts.totalEmbeddings,
84
- scannedTables: c.counts.scannedTables,
85
- foreignKeysFound: c.counts.foreignKeysFound,
86
- });
87
- if (next.stage !== null) {
88
- c.stage = next.stage;
89
- }
90
- if (next.totalTables !== undefined) {
91
- c.counts.totalTables = next.totalTables;
92
- }
93
- if (next.describedTables !== undefined) {
94
- c.counts.describedTables = next.describedTables;
95
- }
96
- if (next.embeddedTables !== undefined) {
97
- c.counts.embeddedTables = next.embeddedTables;
98
- }
99
- if (next.totalEmbeddings !== undefined) {
100
- c.counts.totalEmbeddings = next.totalEmbeddings;
101
- }
102
- if (next.scannedTables !== undefined) {
103
- c.counts.scannedTables = next.scannedTables;
104
- }
105
- if (next.foreignKeysFound !== undefined) {
106
- c.counts.foreignKeysFound = next.foreignKeysFound;
107
- }
108
- });
109
- },
110
- });
111
- runInAction(() => {
112
- if (snapshot.status === 'failed') {
113
- store.steps.ingestion.postSampling.state = 'error';
114
- store.steps.ingestion.postSampling.error =
115
- snapshot.error ?? 'post-sampling job failed';
116
- }
117
- else {
118
- store.steps.ingestion.postSampling.state = 'done';
119
- }
120
- });
121
- if (snapshot.status === 'failed') {
122
- logger.error(`post-sampling job failed: ${snapshot.error ?? 'unknown'}`);
123
- }
124
- else {
125
- logger.info(`post-sampling done for revision=${revisionId}`);
126
- }
127
- };
128
- // Sequential tail of a server-side revision: post-introspection first if still running,
129
- // then post-sampling. Used by the list-subcommand flow after the user picks a
130
- // database to monitor. Caller is responsible for pre-filling the upstream
131
- // store steps (introspection/sampling/samples) to their 'skipped' states.
132
- //
133
- // Always calls dispatchAndStreamPostSampling even when post-sampling is already complete
134
- // server-side — runPostSampling is idempotent (`alreadyAnalyzed: true` short-circuit)
135
- // and is the only way to populate the relations/foreign-keys counts the UI
136
- // renders. Skipping it here would leave the analyze line showing "0 tables,
137
- // 0 foreign keys".
138
- export const tailRevision = async (args) => {
139
- const { authed, revisionId, store, postIntrospectionDone } = args;
140
- if (!postIntrospectionDone) {
141
- // Funnel through ensurePostIntrospection (rather than deriving the deterministic
142
- // job ID inline) so the server can wipe any prior failed post-introspection and
143
- // hand back a fresh job ID. Without this, a failed post-introspection caught by
144
- // the list flow would just stream back the same dead snapshot.
145
- const result = await authed.revisions.ensurePostIntrospection.mutate({
146
- revisionId,
147
- });
148
- if (result.alreadyEnriched) {
149
- runInAction(() => {
150
- store.steps.ingestion.postIntrospection.state = 'done';
151
- });
152
- }
153
- else {
154
- runInAction(() => {
155
- store.steps.ingestion.postIntrospection.jobId = result.jobId;
156
- if (store.steps.ingestion.postIntrospection.state === 'idle') {
157
- store.steps.ingestion.postIntrospection.state = 'queued';
158
- }
159
- });
160
- const snap = await streamPostIntrospection(authed, result.jobId, store);
161
- if (snap.status === 'failed') {
162
- return;
163
- }
164
- }
165
- }
166
- await dispatchAndStreamPostSampling(authed, revisionId, store);
167
- };
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbC5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJhcHAvdGFpbC5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUdqQyxPQUFPLEVBQ0gsMkJBQTJCLEVBQzNCLHNCQUFzQixHQUN6QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFvQixNQUFNLHVCQUF1QixDQUFDO0FBRW5FLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFckMscUZBQXFGO0FBQ3JGLHNGQUFzRjtBQUN0RixnQ0FBZ0M7QUFDaEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxFQUN4QyxNQUE4QixFQUM5QixLQUFhLEVBQ2IsS0FBYSxFQUNRLEVBQUU7SUFDdkIsSUFBSSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtZQUM1QyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDakIsV0FBVyxDQUFDLEdBQUcsRUFBRTtvQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO29CQUMxRCxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLO3dCQUN6QywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3BELEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFFBQVE7d0JBQzVDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO29CQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO3dCQUM3QyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQztvQkFDM0IsS0FBSyxD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WUFDekIsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQzNELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM3RCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDM0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztnQkFDN0QsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSx1QkFBdUIsQ0FDdEMsTUFBTSxFQUNOLE1BQU0sQ0FBQyxLQUFLLEVBQ1osS0FBSyxDQUNSLENBQUM7WUFDRixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNCLE9BQU87WUFDWCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtydW5JbkFjdGlvbn0gZnJvbSAnbW9ieCc7XG5pbXBvcnQgdHlwZSB7VFJQQ0NsaWVudH0gZnJvbSAnQHRycGMvY2xpZW50JztcbmltcG9ydCB0eXBlIHtUQXBwUm91dGVyfSBmcm9tICdAZGJjdHgvY29yZSc7XG5pbXBvcnQge1xuICAgIHBhcnNlUG9zdEludHJvc3BlY3Rpb25TdGFnZSxcbiAgICBwYXJzZVBvc3RTYW1wbGluZ0xhYmVsLFxufSBmcm9tICdAZGJjdHgvY29tbW9uJztcbmltcG9ydCB7c3RyZWFtSm9iLCB0eXBlIFRKb2JTbmFwc2hvdH0gZnJvbSAnLi4vbGliL3N0cmVhbS1qb2IubWpzJztcbmltcG9ydCB0eXBlIHtUU3RvcmV9IGZyb20gJy4uL3N0b3JlLm1qcyc7XG5pbXBvcnQge2xvZ2dlcn0gZnJvbSAnLi4vbG9nZ2VyLm1qcyc7XG5cbi8vIFN0cmVhbXMgYSBwb3N0LWludHJvc3BlY3Rpb24gam9iIHRvIGNvbXBsZXRpb24gYW5kIGJpbmRzIHByb2dyZXNzICsgdGVybWluYWwgc3RhdGVcbi8vIG9udG8gc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLiBSZXR1cm5zIHRoZSBmaW5hbCBzbmFwc2hvdCBzbyBjYWxsZXJzXG4vLyBjYW4gcmVhY3QgdG8gc3VjY2Vzcy9mYWlsdXJlLlxuZXhwb3J0IGNvbnN0IHN0cmVhbVBvc3RJbnRyb3NwZWN0aW9uID0gYXN5bmMgKFxuICAgIGF1dGhlZDogVFJQQ0NsaWVudDxUQXBwUm91dGVyPixcbiAgICBqb2JJZDogc3RyaW5nLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPFRKb2JTbmFwc2hvdD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc3RyZWFtSm9iKGF1dGhlZCwgam9iSWQsIHtcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IChzbmFwKSA9PiB7XG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uc3RhdGUgPSAncnVubmluZyc7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0SW50cm9zcGVjdGlvbi5zdGFnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVBvc3RJbnRyb3NwZWN0aW9uU3RhZ2Uoc25hcC5wcm9ncmVzc0xhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLnRva2Vuc0luID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXAudG9rZW5zSW4gPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLnRva2Vuc091dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBzbmFwLnRva2Vuc091dCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uY29sdW1uc0RvbmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgc25hcC5jb2x1bW5zRG9uZSA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uY29sdW1uc1RvdGFsID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXAuY29sdW1uc1RvdGFsID8/IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc25hcHNob3Quc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0SW50cm9zcGVjdGlvbi5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLmVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3QuZXJyb3IgPz8gJ3Bvc3QtaW50cm9zcGVjdGlvbiBmYWlsZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uc3RhdGUgPSAnZG9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uc3RhdGUgPSAnZXJyb3InO1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLmVycm9yID0gbXNnO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG5cbi8vIFRyaWdnZXJzIHBvc3Qtc2FtcGxpbmcgKHNlcnZlciBza2lwcyByZS1lbnF1ZXVlIGlmIGFscmVhZHkgYW5hbHl6ZWQpIGFuZCBiaW5kc1xuLy8gcHJvZ3Jlc3MgKyB0ZXJtaW5hbCBzdGF0ZSBvbnRvIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0U2FtcGxpbmcuXG5leHBvcnQgY29uc3QgZGlzcGF0Y2hBbmRTdHJlYW1Qb3N0U2FtcGxpbmcgPSBhc3luYyAoXG4gICAgYXV0aGVkOiBUUlBDQ2xpZW50PFRBcHBSb3V0ZXI+LFxuICAgIHJldmlzaW9uSWQ6IHN0cmluZyxcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBpZiAoc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RTYW1wbGluZy5zdGF0ZSA9PT0gJ2lkbGUnKSB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdFNhbXBsaW5nLnN0YXRlID0gJ3F1ZXVlZCc7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF1dGhlZC5yZXZpc2lvbnMucnVuUG9zdFNhbXBsaW5nLm11dGF0ZSh7cmV2aXNpb25JZH0pO1xuXG4gICAgaWYgKHJlc3VsdC5hbHJlYWR5QW5hbHl6ZWQpIHtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYyA9IHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0U2FtcGxpbmc7XG4gICAgICAgICAgICBjLnN0YXRlID0gJ2RvbmUnO1xuICAgICAgICAgICAgYy5qb2JJZCA9IG51bGw7XG4gICAgICAgICAgICBjLnJldXNlZCA9IHRydWU7XG4gICAgICAgICAgICBjLmNvdW50cy50b3RhbFRhYmxlcyA9IHJlc3VsdC5jb3VudHMudG90YWxUYWJsZXM7XG4gICAgICAgICAgICBjLmNvdW50cy5mb3JlaWduS2V5c0ZvdW5kID0gcmVzdWx0LmNvdW50cy5mb3JlaWduS2V5cztcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYHBvc3Qtc2FtcGxpbmcgcmV1c2VkIGZvciByZXZpc2lvbj0ke3JldmlzaW9uSWR9ICh0YWJsZXM9JHtyZXN1bHQuY291bnRzLnRvdGFsVGFibGVzfSBma3M9JHtyZXN1bHQuY291bnRzLmZvcmVpZ25LZXlzfSlgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2pvYklkfSA9IHJlc3VsdDtcbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0U2FtcGxpbmcuam9iSWQgPSBqb2JJZDtcbiAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RTYW1wbGluZy5zdGF0ZSA9ICdydW5uaW5nJztcbiAgICB9KTtcblxuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc3RyZWFtSm9iKGF1dGhlZCwgam9iSWQsIHtcbiAgICAgICAgb25Qcm9ncmVzczogKHNuYXApID0+IHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RTYW1wbGluZztcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gcGFyc2VQb3N0U2FtcGxpbmdMYWJlbChzbmFwLnByb2dyZXNzTGFiZWwsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2U6IGMuc3RhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsVGFibGVzOiBjLmNvdW50cy50b3RhbFRhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkVGFibGVzOiBjLmNvdW50cy5kZXNjcmliZWRUYWJsZXMsXG4gICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkVGFibGVzOiBjLmNvdW50cy5lbWJlZGRlZFRhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxFbWJlZGRpbmdzOiBjLmNvdW50cy50b3RhbEVtYmVkZGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHNjYW5uZWRUYWJsZXM6IGMuY291bnRzLnNjYW5uZWRUYWJsZXMsXG4gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzRm91bmQ6IGMuY291bnRzLmZvcmVpZ25LZXlzRm91bmQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQuc3RhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5zdGFnZSA9IG5leHQuc3RhZ2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvdGFsVGFibGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5jb3VudHMudG90YWxUYWJsZXMgPSBuZXh0LnRvdGFsVGFibGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dC5kZXNjcmliZWRUYWJsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjLmNvdW50cy5kZXNjcmliZWRUYWJsZXMgPSBuZXh0LmRlc2NyaWJlZFRhYmxlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQuZW1iZWRkZWRUYWJsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjLmNvdW50cy5lbWJlZGRlZFRhYmxlcyA9IG5leHQuZW1iZWRkZWRUYWJsZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvdGFsRW1iZWRkaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGMuY291bnRzLnRvdGFsRW1iZWRkaW5ncyA9IG5leHQudG90YWxFbWJlZGRpbmdzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dC5zY2FubmVkVGFibGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5jb3VudHMuc2Nhbm5lZFRhYmxlcyA9IG5leHQuc2Nhbm5lZFRhYmxlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQuZm9yZWlnbktleXNGb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGMuY291bnRzLmZvcmVpZ25LZXlzRm91bmQgPSBuZXh0LmZvcmVpZ25LZXlzRm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIGlmIChzbmFwc2hvdC5zdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdFNhbXBsaW5nLnN0YXRlID0gJ2Vycm9yJztcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0U2FtcGxpbmcuZXJyb3IgPVxuICAgICAgICAgICAgICAgIHNuYXBzaG90LmVycm9yID8/ICdwb3N0LXNhbXBsaW5nIGpvYiBmYWlsZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RTYW1wbGluZy5zdGF0ZSA9ICdkb25lJztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHNuYXBzaG90LnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYHBvc3Qtc2FtcGxpbmcgam9iIGZhaWxlZDogJHtzbmFwc2hvdC5lcnJvciA/PyAndW5rbm93bid9YCxcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuaW5mbyhgcG9zdC1zYW1wbGluZyBkb25lIGZvciByZXZpc2lvbj0ke3JldmlzaW9uSWR9YCk7XG4gICAgfVxufTtcblxuLy8gU2VxdWVudGlhbCB0YWlsIG9mIGEgc2VydmVyLXNpZGUgcmV2aXNpb246IHBvc3QtaW50cm9zcGVjdGlvbiBmaXJzdCBpZiBzdGlsbCBydW5uaW5nLFxuLy8gdGhlbiBwb3N0LXNhbXBsaW5nLiBVc2VkIGJ5IHRoZSBsaXN0LXN1YmNvbW1hbmQgZmxvdyBhZnRlciB0aGUgdXNlciBwaWNrcyBhXG4vLyBkYXRhYmFzZSB0byBtb25pdG9yLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHByZS1maWxsaW5nIHRoZSB1cHN0cmVhbVxuLy8gc3RvcmUgc3RlcHMgKGludHJvc3BlY3Rpb24vc2FtcGxpbmcvc2FtcGxlcykgdG8gdGhlaXIgJ3NraXBwZWQnIHN0YXRlcy5cbi8vXG4vLyBBbHdheXMgY2FsbHMgZGlzcGF0Y2hBbmRTdHJlYW1Qb3N0U2FtcGxpbmcgZXZlbiB3aGVuIHBvc3Qtc2FtcGxpbmcgaXMgYWxyZWFkeSBjb21wbGV0ZVxuLy8gc2VydmVyLXNpZGUg4oCUIHJ1blBvc3RTYW1wbGluZyBpcyBpZGVtcG90ZW50IChgYWxyZWFkeUFuYWx5emVkOiB0cnVlYCBzaG9ydC1jaXJjdWl0KVxuLy8gYW5kIGlzIHRoZSBvbmx5IHdheSB0byBwb3B1bGF0ZSB0aGUgcmVsYXRpb25zL2ZvcmVpZ24ta2V5cyBjb3VudHMgdGhlIFVJXG4vLyByZW5kZXJzLiBTa2lwcGluZyBpdCBoZXJlIHdvdWxkIGxlYXZlIHRoZSBhbmFseXplIGxpbmUgc2hvd2luZyBcIjAgdGFibGVzLFxuLy8gMCBmb3JlaWduIGtleXNcIi5cbmV4cG9ydCBjb25zdCB0YWlsUmV2aXNpb24gPSBhc3luYyAoYXJnczoge1xuICAgIGF1dGhlZDogVFJQQ0NsaWVudDxUQXBwUm91dGVyPjtcbiAgICByZXZpc2lvbklkOiBzdHJpbmc7XG4gICAgc3RvcmU6IFRTdG9yZTtcbiAgICBwb3N0SW50cm9zcGVjdGlvbkRvbmU6IGJvb2xlYW47XG59KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qge2F1dGhlZCwgcmV2aXNpb25JZCwgc3RvcmUsIHBvc3RJbnRyb3NwZWN0aW9uRG9uZX0gPSBhcmdzO1xuXG4gICAgaWYgKCFwb3N0SW50cm9zcGVjdGlvbkRvbmUpIHtcbiAgICAgICAgLy8gRnVubmVsIHRocm91Z2ggZW5zdXJlUG9zdEludHJvc3BlY3Rpb24gKHJhdGhlciB0aGFuIGRlcml2aW5nIHRoZSBkZXRlcm1pbmlzdGljXG4gICAgICAgIC8vIGpvYiBJRCBpbmxpbmUpIHNvIHRoZSBzZXJ2ZXIgY2FuIHdpcGUgYW55IHByaW9yIGZhaWxlZCBwb3N0LWludHJvc3BlY3Rpb24gYW5kXG4gICAgICAgIC8vIGhhbmQgYmFjayBhIGZyZXNoIGpvYiBJRC4gV2l0aG91dCB0aGlzLCBhIGZhaWxlZCBwb3N0LWludHJvc3BlY3Rpb24gY2F1Z2h0IGJ5XG4gICAgICAgIC8vIHRoZSBsaXN0IGZsb3cgd291bGQganVzdCBzdHJlYW0gYmFjayB0aGUgc2FtZSBkZWFkIHNuYXBzaG90LlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRoZWQucmV2aXNpb25zLmVuc3VyZVBvc3RJbnRyb3NwZWN0aW9uLm11dGF0ZSh7XG4gICAgICAgICAgICByZXZpc2lvbklkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5hbHJlYWR5RW5yaWNoZWQpIHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uc3RhdGUgPSAnZG9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uam9iSWQgPSByZXN1bHQuam9iSWQ7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0SW50cm9zcGVjdGlvbi5zdGF0ZSA9PT0gJ2lkbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0SW50cm9zcGVjdGlvbi5zdGF0ZSA9ICdxdWV1ZWQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc25hcCA9IGF3YWl0IHN0cmVhbVBvc3RJbnRyb3NwZWN0aW9uKFxuICAgICAgICAgICAgICAgIGF1dGhlZCxcbiAgICAgICAgICAgICAgICByZXN1bHQuam9iSWQsXG4gICAgICAgICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNuYXAuc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IGRpc3BhdGNoQW5kU3RyZWFtUG9zdFNhbXBsaW5nKGF1dGhlZCwgcmV2aXNpb25JZCwgc3RvcmUpO1xufTtcbiJdfQ==
@@ -1,3 +0,0 @@
1
- import type { Pool } from 'pg';
2
- export declare const analyzeRelation: (pool: Pool, relationName: string) => Promise<void>;
3
- //# sourceMappingURL=analyze.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyze.d.mts","sourceRoot":"./src/","sources":["db/analyze.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,eAAO,MAAM,eAAe,GACxB,MAAM,IAAI,EACV,cAAc,MAAM,KACrB,OAAO,CAAC,IAAI,CAqBd,CAAC"}
@@ -1,16 +0,0 @@
1
- export const analyzeRelation = async (pool, relationName) => {
2
- // Validate relation exists and get properly quoted name to prevent SQL injection
3
- const validation = await pool.query(`
4
- SELECT format('%I', c.relname) AS quoted_name
5
- FROM pg_catalog.pg_class c
6
- JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
7
- WHERE n.nspname = 'public'
8
- AND c.relname = $1
9
- AND c.relkind IN ('r', 'p', 'm')
10
- `, [relationName]);
11
- if (validation.rows.length === 0) {
12
- throw new Error(`Relation "${relationName}" not found in public schema`);
13
- }
14
- await pool.query(`ANALYZE public.${validation.rows[0].quoted_name}`);
15
- };
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZS5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJkYi9hbmFseXplLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUNoQyxJQUFVLEVBQ1YsWUFBb0IsRUFDUCxFQUFFO0lBQ2YsaUZBQWlGO0lBQ2pGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDL0I7Ozs7Ozs7U0FPQyxFQUNELENBQUMsWUFBWSxDQUFDLENBQ2pCLENBQUM7SUFFRixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQ1gsYUFBYSxZQUFZLDhCQUE4QixDQUMxRCxDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtQb29sfSBmcm9tICdwZyc7XG5cbmV4cG9ydCBjb25zdCBhbmFseXplUmVsYXRpb24gPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbiAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFZhbGlkYXRlIHJlbGF0aW9uIGV4aXN0cyBhbmQgZ2V0IHByb3Blcmx5IHF1b3RlZCBuYW1lIHRvIHByZXZlbnQgU1FMIGluamVjdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBhd2FpdCBwb29sLnF1ZXJ5PHtxdW90ZWRfbmFtZTogc3RyaW5nfT4oXG4gICAgICAgIGBcbiAgICAgICAgU0VMRUNUIGZvcm1hdCgnJUknLCBjLnJlbG5hbWUpIEFTIHF1b3RlZF9uYW1lXG4gICAgICAgIEZST00gcGdfY2F0YWxvZy5wZ19jbGFzcyBjXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgbiBPTiBuLm9pZCA9IGMucmVsbmFtZXNwYWNlXG4gICAgICAgIFdIRVJFIG4ubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICAgICBBTkQgYy5yZWxuYW1lID0gJDFcbiAgICAgICAgICAgIEFORCBjLnJlbGtpbmQgSU4gKCdyJywgJ3AnLCAnbScpXG4gICAgICAgIGAsXG4gICAgICAgIFtyZWxhdGlvbk5hbWVdLFxuICAgICk7XG5cbiAgICBpZiAodmFsaWRhdGlvbi5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgUmVsYXRpb24gXCIke3JlbGF0aW9uTmFtZX1cIiBub3QgZm91bmQgaW4gcHVibGljIHNjaGVtYWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgcG9vbC5xdWVyeShgQU5BTFlaRSBwdWJsaWMuJHt2YWxpZGF0aW9uLnJvd3NbMF0ucXVvdGVkX25hbWV9YCk7XG59O1xuIl19
@@ -1,16 +0,0 @@
1
- import type { Pool } from 'pg';
2
- export type TAttributeKind = 'regular' | 'generated';
3
- export type TGeneratedStorage = 'stored' | 'virtual';
4
- export type TAttributeInfo = {
5
- attribute_name: string;
6
- data_type: string;
7
- is_nullable: boolean;
8
- has_default: boolean;
9
- default_expression: string | null;
10
- kind: TAttributeKind;
11
- generated_storage: TGeneratedStorage | null;
12
- generated_expression: string | null;
13
- comment: string | null;
14
- };
15
- export declare const fetchRelationAttributes: (pool: Pool, relationName: string) => Promise<TAttributeInfo[]>;
16
- //# sourceMappingURL=attributes.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attributes.d.mts","sourceRoot":"./src/","sources":["db/attributes.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAChC,MAAM,IAAI,EACV,cAAc,MAAM,KACrB,OAAO,CAAC,cAAc,EAAE,CAuC1B,CAAC"}
@@ -1,37 +0,0 @@
1
- export const fetchRelationAttributes = async (pool, relationName) => {
2
- const result = await pool.query(`
3
- SELECT
4
- a.attname AS attribute_name,
5
- format_type(a.atttypid, a.atttypmod) AS data_type,
6
- NOT a.attnotnull AS is_nullable,
7
- ad.adbin IS NOT NULL AS has_default,
8
- CASE
9
- WHEN a.attgenerated = '' AND ad.adbin IS NOT NULL THEN pg_get_expr(ad.adbin, ad.adrelid)
10
- ELSE NULL
11
- END AS default_expression,
12
- CASE a.attgenerated
13
- WHEN '' THEN 'regular'
14
- ELSE 'generated'
15
- END AS kind,
16
- CASE a.attgenerated
17
- WHEN 's' THEN 'stored'
18
- WHEN 'v' THEN 'virtual'
19
- ELSE NULL
20
- END AS generated_storage,
21
- CASE
22
- WHEN a.attgenerated != '' THEN pg_get_expr(ad.adbin, ad.adrelid)
23
- ELSE NULL
24
- END AS generated_expression,
25
- col_description(c.oid, a.attnum) AS comment
26
- FROM pg_catalog.pg_class c
27
- JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
28
- LEFT JOIN pg_catalog.pg_attrdef ad ON ad.adrelid = a.attrelid AND ad.adnum = a.attnum
29
- WHERE c.relname = $1
30
- AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')
31
- AND a.attnum > 0
32
- AND NOT a.attisdropped
33
- ORDER BY a.attnum
34
- `, [relationName]);
35
- return result.rows;
36
- };
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlcy5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJkYi9hdHRyaWJ1dGVzLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxFQUN4QyxJQUFVLEVBQ1YsWUFBb0IsRUFDSyxFQUFFO0lBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBZ0NDLEVBQ0QsQ0FBQyxZQUFZLENBQUMsQ0FDakIsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuXG5leHBvcnQgdHlwZSBUQXR0cmlidXRlS2luZCA9ICdyZWd1bGFyJyB8ICdnZW5lcmF0ZWQnO1xuXG5leHBvcnQgdHlwZSBUR2VuZXJhdGVkU3RvcmFnZSA9ICdzdG9yZWQnIHwgJ3ZpcnR1YWwnO1xuXG5leHBvcnQgdHlwZSBUQXR0cmlidXRlSW5mbyA9IHtcbiAgICBhdHRyaWJ1dGVfbmFtZTogc3RyaW5nO1xuICAgIGRhdGFfdHlwZTogc3RyaW5nO1xuICAgIGlzX251bGxhYmxlOiBib29sZWFuO1xuICAgIGhhc19kZWZhdWx0OiBib29sZWFuO1xuICAgIGRlZmF1bHRfZXhwcmVzc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICBraW5kOiBUQXR0cmlidXRlS2luZDtcbiAgICBnZW5lcmF0ZWRfc3RvcmFnZTogVEdlbmVyYXRlZFN0b3JhZ2UgfCBudWxsO1xuICAgIGdlbmVyYXRlZF9leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZmV0Y2hSZWxhdGlvbkF0dHJpYnV0ZXMgPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbiAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8VEF0dHJpYnV0ZUluZm9bXT4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBvb2wucXVlcnk8VEF0dHJpYnV0ZUluZm8+KFxuICAgICAgICBgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgYS5hdHRuYW1lIEFTIGF0dHJpYnV0ZV9uYW1lLFxuICAgICAgICAgICAgZm9ybWF0X3R5cGUoYS5hdHR0eXBpZCwgYS5hdHR0eXBtb2QpIEFTIGRhdGFfdHlwZSxcbiAgICAgICAgICAgIE5PVCBhLmF0dG5vdG51bGwgQVMgaXNfbnVsbGFibGUsXG4gICAgICAgICAgICBhZC5hZGJpbiBJUyBOT1QgTlVMTCBBUyBoYXNfZGVmYXVsdCxcbiAgICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgICBXSEVOIGEuYXR0Z2VuZXJhdGVkID0gJycgQU5EIGFkLmFkYmluIElTIE5PVCBOVUxMIFRIRU4gcGdfZ2V0X2V4cHIoYWQuYWRiaW4sIGFkLmFkcmVsaWQpXG4gICAgICAgICAgICAgICAgRUxTRSBOVUxMXG4gICAgICAgICAgICBFTkQgQVMgZGVmYXVsdF9leHByZXNzaW9uLFxuICAgICAgICAgICAgQ0FTRSBhLmF0dGdlbmVyYXRlZFxuICAgICAgICAgICAgICAgIFdIRU4gJycgVEhFTiAncmVndWxhcidcbiAgICAgICAgICAgICAgICBFTFNFICdnZW5lcmF0ZWQnXG4gICAgICAgICAgICBFTkQgQVMga2luZCxcbiAgICAgICAgICAgIENBU0UgYS5hdHRnZW5lcmF0ZWRcbiAgICAgICAgICAgICAgICBXSEVOICdzJyBUSEVOICdzdG9yZWQnXG4gICAgICAgICAgICAgICAgV0hFTiAndicgVEhFTiAndmlydHVhbCdcbiAgICAgICAgICAgICAgICBFTFNFIE5VTExcbiAgICAgICAgICAgIEVORCBBUyBnZW5lcmF0ZWRfc3RvcmFnZSxcbiAgICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgICBXSEVOIGEuYXR0Z2VuZXJhdGVkICE9ICcnIFRIRU4gcGdfZ2V0X2V4cHIoYWQuYWRiaW4sIGFkLmFkcmVsaWQpXG4gICAgICAgICAgICAgICAgRUxTRSBOVUxMXG4gICAgICAgICAgICBFTkQgQVMgZ2VuZXJhdGVkX2V4cHJlc3Npb24sXG4gICAgICAgICAgICBjb2xfZGVzY3JpcHRpb24oYy5vaWQsIGEuYXR0bnVtKSBBUyBjb21tZW50XG4gICAgICAgIEZST00gcGdfY2F0YWxvZy5wZ19jbGFzcyBjXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dHJlbGlkID0gYy5vaWRcbiAgICAgICAgTEVGVCBKT0lOIHBnX2NhdGFsb2cucGdfYXR0cmRlZiBhZCBPTiBhZC5hZHJlbGlkID0gYS5hdHRyZWxpZCBBTkQgYWQuYWRudW0gPSBhLmF0dG51bVxuICAgICAgICBXSEVSRSBjLnJlbG5hbWUgPSAkMVxuICAgICAgICAgICAgQU5EIGMucmVsbmFtZXNwYWNlID0gKFNFTEVDVCBvaWQgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9ICdwdWJsaWMnKVxuICAgICAgICAgICAgQU5EIGEuYXR0bnVtID4gMFxuICAgICAgICAgICAgQU5EIE5PVCBhLmF0dGlzZHJvcHBlZFxuICAgICAgICBPUkRFUiBCWSBhLmF0dG51bVxuICAgICAgICBgLFxuICAgICAgICBbcmVsYXRpb25OYW1lXSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xufTtcbiJdfQ==
@@ -1,9 +0,0 @@
1
- import type { Pool } from 'pg';
2
- export type TCheckConstraintInfo = {
3
- relation_name: string;
4
- name: string;
5
- expression: string;
6
- is_valid: boolean;
7
- };
8
- export declare const fetchPublicCheckConstraints: (pool: Pool) => Promise<TCheckConstraintInfo[]>;
9
- //# sourceMappingURL=check-constraints.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check-constraints.d.mts","sourceRoot":"./src/","sources":["db/check-constraints.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,oBAAoB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACpC,MAAM,IAAI,KACX,OAAO,CAAC,oBAAoB,EAAE,CAgBhC,CAAC"}
@@ -1,17 +0,0 @@
1
- export const fetchPublicCheckConstraints = async (pool) => {
2
- const result = await pool.query(`
3
- SELECT
4
- t.relname AS relation_name,
5
- con.conname AS name,
6
- pg_get_constraintdef(con.oid, true) AS expression,
7
- con.convalidated AS is_valid
8
- FROM pg_catalog.pg_constraint con
9
- JOIN pg_catalog.pg_class t ON t.oid = con.conrelid
10
- JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace
11
- WHERE n.nspname = 'public'
12
- AND con.contype = 'c'
13
- ORDER BY t.relname, con.conname
14
- `);
15
- return result.rows;
16
- };
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stY29uc3RyYWludHMubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiZGIvY2hlY2stY29uc3RyYWludHMubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEtBQUssRUFDNUMsSUFBVSxFQUNxQixFQUFFO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBdUI7Ozs7Ozs7Ozs7OztLQVlyRCxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDdkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcblxuZXhwb3J0IHR5cGUgVENoZWNrQ29uc3RyYWludEluZm8gPSB7XG4gICAgcmVsYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHByZXNzaW9uOiBzdHJpbmc7XG4gICAgaXNfdmFsaWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgZmV0Y2hQdWJsaWNDaGVja0NvbnN0cmFpbnRzID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4pOiBQcm9taXNlPFRDaGVja0NvbnN0cmFpbnRJbmZvW10+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PFRDaGVja0NvbnN0cmFpbnRJbmZvPihgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgdC5yZWxuYW1lIEFTIHJlbGF0aW9uX25hbWUsXG4gICAgICAgICAgICBjb24uY29ubmFtZSBBUyBuYW1lLFxuICAgICAgICAgICAgcGdfZ2V0X2NvbnN0cmFpbnRkZWYoY29uLm9pZCwgdHJ1ZSkgQVMgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGNvbi5jb252YWxpZGF0ZWQgQVMgaXNfdmFsaWRcbiAgICAgICAgRlJPTSBwZ19jYXRhbG9nLnBnX2NvbnN0cmFpbnQgY29uXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19jbGFzcyB0IE9OIHQub2lkID0gY29uLmNvbnJlbGlkXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgbiBPTiBuLm9pZCA9IHQucmVsbmFtZXNwYWNlXG4gICAgICAgIFdIRVJFIG4ubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICAgICBBTkQgY29uLmNvbnR5cGUgPSAnYydcbiAgICAgICAgT1JERVIgQlkgdC5yZWxuYW1lLCBjb24uY29ubmFtZVxuICAgIGApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xufTtcbiJdfQ==