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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dbctx",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "AI-enriched database context for humans and coding agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -50,8 +50,7 @@
50
50
  "terminal-link": "5.0.0",
51
51
  "uuidv7": "1.0.2",
52
52
  "winston": "3.19.0",
53
- "zod": "4.3.6",
54
- "@dbctx/common": "0.0.0"
53
+ "zod": "4.3.6"
55
54
  },
56
55
  "devDependencies": {
57
56
  "@types/node": "24.0.0",
@@ -61,7 +60,10 @@
61
60
  "concurrently": "9.2.1",
62
61
  "cross-env": "7.0.3",
63
62
  "prettier": "3.8.1",
63
+ "tsup": "8.5.0",
64
+ "tsx": "4.20.4",
64
65
  "typescript": "5.9.3",
66
+ "@dbctx/common": "0.0.0",
65
67
  "@dbctx/core": "2.0.5"
66
68
  },
67
69
  "volta": {
@@ -71,10 +73,11 @@
71
73
  "dist/"
72
74
  ],
73
75
  "scripts": {
74
- "start": "tsc && node ./dist/index.mjs",
75
- "dev": "tsc --watch --preserveWatchOutput",
76
- "build": "tsc",
77
- "build:ts:watch": "tsc --watch --preserveWatchOutput",
78
- "test": "tsc && node --test dist/flow/*.test.mjs"
76
+ "start": "tsup && node ./dist/index.mjs",
77
+ "dev": "tsup --watch",
78
+ "build": "tsup",
79
+ "typecheck": "tsc --noEmit",
80
+ "build:ts:watch": "tsc --watch --preserveWatchOutput --noEmit",
81
+ "test": "tsx --test src/flow/*.test.mts"
79
82
  }
80
83
  }
@@ -1,5 +0,0 @@
1
- import type { Pool } from 'pg';
2
- import type { TStore } from '../store.mjs';
3
- import type { TDatabaseIntrospection } from '@dbctx/core';
4
- export declare const assembleDatabase: (pool: Pool, store: TStore) => Promise<TDatabaseIntrospection>;
5
- //# sourceMappingURL=assemble.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assemble.d.mts","sourceRoot":"./src/","sources":["app/assemble.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAI7B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAmGxD,eAAO,MAAM,gBAAgB,GACzB,MAAM,IAAI,EACV,OAAO,MAAM,KACd,OAAO,CAAC,sBAAsB,CAuKhC,CAAC"}
@@ -1,182 +0,0 @@
1
- import PQueue from 'p-queue';
2
- import { runInAction } from 'mobx';
3
- import { fetchDatabaseIdentifier, fetchDatabaseComment, fetchPublicRelations, fetchPublicEnums, fetchRelationAttributes, fetchRelationIndexes, fetchRelationForeignKeys, fetchViewDefinition, analyzeRelation, fetchRelationStats, fetchPublicCheckConstraints, fetchInstalledExtensions, fetchPublicSequences, fetchPublicTriggers, fetchPublicFunctions, fetchPublicCustomTypes, fetchPublicRLS, } from '../db/index.mjs';
4
- const toRecord = (items, key) => Object.fromEntries(items.map((item) => [key(item), item]));
5
- const transformAttribute = (attr) => {
6
- const base = {
7
- name: attr.attribute_name,
8
- data_type: attr.data_type,
9
- is_nullable: attr.is_nullable,
10
- comment: attr.comment,
11
- };
12
- if (attr.kind === 'generated') {
13
- return {
14
- ...base,
15
- kind: 'generated',
16
- generated_storage: attr.generated_storage,
17
- generated_expression: attr.generated_expression,
18
- };
19
- }
20
- return attr.has_default
21
- ? {
22
- ...base,
23
- kind: 'regular',
24
- has_default: true,
25
- default_expression: attr.default_expression,
26
- }
27
- : {
28
- ...base,
29
- kind: 'regular',
30
- has_default: false,
31
- };
32
- };
33
- const deriveIndexKind = (idx) => idx.is_primary
34
- ? { index_kind: 'primary' }
35
- : idx.is_unique
36
- ? { index_kind: 'unique' }
37
- : idx.is_exclusion
38
- ? {
39
- index_kind: 'exclusion',
40
- exclusion_operators: idx.exclusion_operators,
41
- }
42
- : { index_kind: 'plain' };
43
- const transformIndex = (idx) => ({
44
- index_name: idx.index_name,
45
- relation_name: idx.relation_name,
46
- attributes: idx.attributes,
47
- definition: idx.definition,
48
- comment: idx.comment,
49
- ...deriveIndexKind(idx),
50
- ...(idx.is_partial
51
- ? {
52
- is_partial: true,
53
- partial_predicate: idx.partial_predicate,
54
- }
55
- : { is_partial: false }),
56
- });
57
- const transformReference = (fk) => ({
58
- constraint_name: fk.constraint_name,
59
- attributes: fk.attributes,
60
- referenced_relation: fk.referenced_relation,
61
- referenced_attributes: fk.referenced_attributes,
62
- on_update: fk.on_update,
63
- on_delete: fk.on_delete,
64
- comment: fk.comment,
65
- });
66
- export const assembleDatabase = async (pool, store) => {
67
- const queue = new PQueue({ concurrency: 3 });
68
- const counts = store.steps.introspection.counts;
69
- runInAction(() => {
70
- store.steps.introspection.state = 'fetching';
71
- });
72
- const [identifier, comment] = await Promise.all([
73
- queue.add(() => fetchDatabaseIdentifier(pool)),
74
- queue.add(() => fetchDatabaseComment(pool)),
75
- ]);
76
- const [grouped, enums, checkConstraints, extensions, sequences, triggers, functions, customTypes, rls,] = await Promise.all([
77
- queue.add(() => fetchPublicRelations(pool)),
78
- queue.add(() => fetchPublicEnums(pool)),
79
- queue.add(() => fetchPublicCheckConstraints(pool)),
80
- queue.add(() => fetchInstalledExtensions(pool)),
81
- queue.add(() => fetchPublicSequences(pool)),
82
- queue.add(() => fetchPublicTriggers(pool)),
83
- queue.add(() => fetchPublicFunctions(pool)),
84
- queue.add(() => fetchPublicCustomTypes(pool)),
85
- queue.add(() => fetchPublicRLS(pool)),
86
- ]);
87
- const typedGrouped = grouped;
88
- const typedEnums = enums;
89
- runInAction(() => {
90
- counts.tables =
91
- (typedGrouped.table?.length ?? 0) +
92
- (typedGrouped.partitioned_table?.length ?? 0);
93
- counts.views =
94
- (typedGrouped.view?.length ?? 0) +
95
- (typedGrouped.materialized_view?.length ?? 0);
96
- counts.enums = Object.keys(typedEnums).length;
97
- });
98
- const allRelations = [
99
- ...(typedGrouped.partitioned_table ?? []),
100
- ...(typedGrouped.table ?? []),
101
- ...(typedGrouped.view ?? []),
102
- ...(typedGrouped.materialized_view ?? []),
103
- ];
104
- const isViewKind = (type) => type === 'view' || type === 'materialized_view';
105
- const skipAnalyze = store.outputOptions.skipAnalyze;
106
- const relationEntries = await Promise.all(allRelations.map(async (rel) => {
107
- if (rel.type !== 'view' && !skipAnalyze) {
108
- await queue.add(() => analyzeRelation(pool, rel.name));
109
- runInAction(() => {
110
- counts.analyzed += 1;
111
- });
112
- }
113
- const [attributes, indexes, foreignKeys, stats, viewDefinition] = await Promise.all([
114
- queue.add(() => fetchRelationAttributes(pool, rel.name)),
115
- queue.add(() => fetchRelationIndexes(pool, rel.name)),
116
- queue.add(() => fetchRelationForeignKeys(pool, rel.name)),
117
- queue.add(() => fetchRelationStats(pool, rel.name)),
118
- isViewKind(rel.type)
119
- ? queue.add(() => fetchViewDefinition(pool, rel.name))
120
- : undefined,
121
- ]);
122
- const attrs = attributes;
123
- const idxs = indexes;
124
- const fks = foreignKeys;
125
- const relStats = stats;
126
- const distinctLookup = new Map(relStats.attributes.map((a) => [
127
- a.attribute_name,
128
- a.estimated_distinct,
129
- ]));
130
- runInAction(() => {
131
- counts.columns += attrs.length;
132
- counts.indexes += idxs.length;
133
- counts.foreignKeys += fks.length;
134
- });
135
- const transformedAttrs = attrs.map((attr) => {
136
- const base = transformAttribute(attr);
137
- const distinct = distinctLookup.get(attr.attribute_name);
138
- return distinct !== undefined
139
- ? { ...base, estimated_distinct: distinct }
140
- : base;
141
- });
142
- const relationObj = {
143
- name: rel.name,
144
- comment: rel.comment,
145
- kind: rel.type,
146
- estimated_row_count: relStats.estimated_row_count,
147
- attributes: toRecord(transformedAttrs, (a) => a.name),
148
- indexes: toRecord(idxs.map(transformIndex), (i) => i.index_name),
149
- references: toRecord(fks.map(transformReference), (r) => r.constraint_name),
150
- ...(viewDefinition
151
- ? { viewDefinition: viewDefinition }
152
- : {}),
153
- };
154
- return [rel.name, relationObj];
155
- }));
156
- runInAction(() => {
157
- store.steps.introspection.state = 'done';
158
- });
159
- return {
160
- type: 'postgresql',
161
- version: {
162
- version_string: store.steps.databaseConnection.postgresVersion,
163
- version_number: store.steps.databaseConnection.postgresVersionNumber,
164
- },
165
- identifier: {
166
- system_identifier: identifier.system_identifier,
167
- database_oid: identifier.database_oid,
168
- },
169
- name: identifier.database_name,
170
- comment: comment ?? null,
171
- relations: Object.fromEntries(relationEntries),
172
- enums: typedEnums,
173
- checkConstraints: checkConstraints,
174
- extensions: extensions,
175
- sequences: sequences,
176
- triggers: triggers,
177
- functions: functions,
178
- customTypes: customTypes,
179
- rls: rls,
180
- };
181
- };
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2Fzc2VtYmxlLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQVFqQyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLDJCQUEyQixFQUMzQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGNBQWMsR0FDakIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLFFBQVEsR0FBRyxDQUNiLEtBQW1CLEVBQ25CLEdBQXdCLEVBQ1AsRUFBRSxDQUNuQixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUvRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsSUFBb0IsRUFBRSxFQUFFO0lBQ2hELE1BQU0sSUFBSSxHQUFHO1FBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjO1FBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztRQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7UUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO0tBQ3hCLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDNUIsT0FBTztZQUNILEdBQUcsSUFBSTtZQUNQLElBQUksRUFBRSxXQUFv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RCxVQUFVLEVBQUUsVUFFWDtRQUNELFNBQVMsRUFBRSxTQUVWO1FBQ0QsUUFBUSxFQUFFLFFBQTJEO1FBQ3JFLFNBQVMsRUFBRSxTQUVWO1FBQ0QsV0FBVyxFQUNQLFdBQStEO1FBQ25FLEdBQUcsRUFBRSxHQUErQztLQUN2RCxDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcbmltcG9ydCBQUXVldWUgZnJvbSAncC1xdWV1ZSc7XG5pbXBvcnQge3J1bkluQWN0aW9ufSBmcm9tICdtb2J4JztcblxuaW1wb3J0IHR5cGUge1RTdG9yZX0gZnJvbSAnLi4vc3RvcmUubWpzJztcbmltcG9ydCB0eXBlIHtURGF0YWJhc2VJbnRyb3NwZWN0aW9ufSBmcm9tICdAZGJjdHgvY29yZSc7XG5pbXBvcnQgdHlwZSB7VEF0dHJpYnV0ZUluZm99IGZyb20gJy4uL2RiL2F0dHJpYnV0ZXMubWpzJztcbmltcG9ydCB0eXBlIHtUSW5kZXhJbmZvfSBmcm9tICcuLi9kYi9pbmRleGVzLm1qcyc7XG5pbXBvcnQgdHlwZSB7VEZvcmVpZ25LZXlJbmZvfSBmcm9tICcuLi9kYi9mb3JlaWduLWtleXMubWpzJztcbmltcG9ydCB0eXBlIHtUUmVsYXRpb25TdGF0c30gZnJvbSAnLi4vZGIvc3RhdHMubWpzJztcbmltcG9ydCB7XG4gICAgZmV0Y2hEYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgZmV0Y2hEYXRhYmFzZUNvbW1lbnQsXG4gICAgZmV0Y2hQdWJsaWNSZWxhdGlvbnMsXG4gICAgZmV0Y2hQdWJsaWNFbnVtcyxcbiAgICBmZXRjaFJlbGF0aW9uQXR0cmlidXRlcyxcbiAgICBmZXRjaFJlbGF0aW9uSW5kZXhlcyxcbiAgICBmZXRjaFJlbGF0aW9uRm9yZWlnbktleXMsXG4gICAgZmV0Y2hWaWV3RGVmaW5pdGlvbixcbiAgICBhbmFseXplUmVsYXRpb24sXG4gICAgZmV0Y2hSZWxhdGlvblN0YXRzLFxuICAgIGZldGNoUHVibGljQ2hlY2tDb25zdHJhaW50cyxcbiAgICBmZXRjaEluc3RhbGxlZEV4dGVuc2lvbnMsXG4gICAgZmV0Y2hQdWJsaWNTZXF1ZW5jZXMsXG4gICAgZmV0Y2hQdWJsaWNUcmlnZ2VycyxcbiAgICBmZXRjaFB1YmxpY0Z1bmN0aW9ucyxcbiAgICBmZXRjaFB1YmxpY0N1c3RvbVR5cGVzLFxuICAgIGZldGNoUHVibGljUkxTLFxufSBmcm9tICcuLi9kYi9pbmRleC5tanMnO1xuXG5jb25zdCB0b1JlY29yZCA9IDxUIGV4dGVuZHMgdW5rbm93bj4oXG4gICAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgICBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmcsXG4pOiBSZWNvcmQ8c3RyaW5nLCBUPiA9PlxuICAgIE9iamVjdC5mcm9tRW50cmllcyhpdGVtcy5tYXAoKGl0ZW0pID0+IFtrZXkoaXRlbSksIGl0ZW1dKSk7XG5cbmNvbnN0IHRyYW5zZm9ybUF0dHJpYnV0ZSA9IChhdHRyOiBUQXR0cmlidXRlSW5mbykgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICAgIG5hbWU6IGF0dHIuYXR0cmlidXRlX25hbWUsXG4gICAgICAgIGRhdGFfdHlwZTogYXR0ci5kYXRhX3R5cGUsXG4gICAgICAgIGlzX251bGxhYmxlOiBhdHRyLmlzX251bGxhYmxlLFxuICAgICAgICBjb21tZW50OiBhdHRyLmNvbW1lbnQsXG4gICAgfTtcblxuICAgIGlmIChhdHRyLmtpbmQgPT09ICdnZW5lcmF0ZWQnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAga2luZDogJ2dlbmVyYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICBnZW5lcmF0ZWRfc3RvcmFnZTogYXR0ci5nZW5lcmF0ZWRfc3RvcmFnZSEgYXMgJ3N0b3JlZCcgfCAndmlydHVhbCcsXG4gICAgICAgICAgICBnZW5lcmF0ZWRfZXhwcmVzc2lvbjogYXR0ci5nZW5lcmF0ZWRfZXhwcmVzc2lvbiEsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHIuaGFzX2RlZmF1bHRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICAgIGtpbmQ6ICdyZWd1bGFyJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgaGFzX2RlZmF1bHQ6IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgICAgIGRlZmF1bHRfZXhwcmVzc2lvbjogYXR0ci5kZWZhdWx0X2V4cHJlc3Npb24hLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICAgIGtpbmQ6ICdyZWd1bGFyJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgaGFzX2RlZmF1bHQ6IGZhbHNlIGFzIGNvbnN0LFxuICAgICAgICAgIH07XG59O1xuXG5jb25zdCBkZXJpdmVJbmRleEtpbmQgPSAoaWR4OiBUSW5kZXhJbmZvKSA9PlxuICAgIGlkeC5pc19wcmltYXJ5XG4gICAgICAgID8gKHtpbmRleF9raW5kOiAncHJpbWFyeSd9IGFzIGNvbnN0KVxuICAgICAgICA6IGlkeC5pc191bmlxdWVcbiAgICAgICAgICA/ICh7aW5kZXhfa2luZDogJ3VuaXF1ZSd9IGFzIGNvbnN0KVxuICAgICAgICAgIDogaWR4LmlzX2V4Y2x1c2lvblxuICAgICAgICAgICAgPyAoe1xuICAgICAgICAgICAgICAgICAgaW5kZXhfa2luZDogJ2V4Y2x1c2lvbicsXG4gICAgICAgICAgICAgICAgICBleGNsdXNpb25fb3BlcmF0b3JzOiBpZHguZXhjbHVzaW9uX29wZXJhdG9ycyEsXG4gICAgICAgICAgICAgIH0gYXMgY29uc3QpXG4gICAgICAgICAgICA6ICh7aW5kZXhfa2luZDogJ3BsYWluJ30gYXMgY29uc3QpO1xuXG5jb25zdCB0cmFuc2Zvcm1JbmRleCA9IChpZHg6IFRJbmRleEluZm8pID0+ICh7XG4gICAgaW5kZXhfbmFtZTogaWR4LmluZGV4X25hbWUsXG4gICAgcmVsYXRpb25fbmFtZTogaWR4LnJlbGF0aW9uX25hbWUsXG4gICAgYXR0cmlidXRlczogaWR4LmF0dHJpYnV0ZXMsXG4gICAgZGVmaW5pdGlvbjogaWR4LmRlZmluaXRpb24sXG4gICAgY29tbWVudDogaWR4LmNvbW1lbnQsXG4gICAgLi4uZGVyaXZlSW5kZXhLaW5kKGlkeCksXG4gICAgLi4uKGlkeC5pc19wYXJ0aWFsXG4gICAgICAgID8gKHtcbiAgICAgICAgICAgICAgaXNfcGFydGlhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFydGlhbF9wcmVkaWNhdGU6IGlkeC5wYXJ0aWFsX3ByZWRpY2F0ZSEsXG4gICAgICAgICAgfSBhcyBjb25zdClcbiAgICAgICAgOiAoe2lzX3BhcnRpYWw6IGZhbHNlfSBhcyBjb25zdCkpLFxufSk7XG5cbmNvbnN0IHRyYW5zZm9ybVJlZmVyZW5jZSA9IChmazogVEZvcmVpZ25LZXlJbmZvKSA9PiAoe1xuICAgIGNvbnN0cmFpbnRfbmFtZTogZmsuY29uc3RyYWludF9uYW1lLFxuICAgIGF0dHJpYnV0ZXM6IGZrLmF0dHJpYnV0ZXMsXG4gICAgcmVmZXJlbmNlZF9yZWxhdGlvbjogZmsucmVmZXJlbmNlZF9yZWxhdGlvbixcbiAgICByZWZlcmVuY2VkX2F0dHJpYnV0ZXM6IGZrLnJlZmVyZW5jZWRfYXR0cmlidXRlcyxcbiAgICBvbl91cGRhdGU6IGZrLm9uX3VwZGF0ZSxcbiAgICBvbl9kZWxldGU6IGZrLm9uX2RlbGV0ZSxcbiAgICBjb21tZW50OiBmay5jb21tZW50LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhc3NlbWJsZURhdGFiYXNlID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8VERhdGFiYXNlSW50cm9zcGVjdGlvbj4gPT4ge1xuICAgIGNvbnN0IHF1ZXVlID0gbmV3IFBRdWV1ZSh7Y29uY3VycmVuY3k6IDN9KTtcbiAgICBjb25zdCBjb3VudHMgPSBzdG9yZS5zdGVwcy5pbnRyb3NwZWN0aW9uLmNvdW50cztcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5zdGF0ZSA9ICdmZXRjaGluZyc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBbaWRlbnRpZmllciwgY29tbWVudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaERhdGFiYXNlSWRlbnRpZmllcihwb29sKSksXG4gICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaERhdGFiYXNlQ29tbWVudChwb29sKSksXG4gICAgXSk7XG5cbiAgICBjb25zdCBbXG4gICAgICAgIGdyb3VwZWQsXG4gICAgICAgIGVudW1zLFxuICAgICAgICBjaGVja0NvbnN0cmFpbnRzLFxuICAgICAgICBleHRlbnNpb25zLFxuICAgICAgICBzZXF1ZW5jZXMsXG4gICAgICAgIHRyaWdnZXJzLFxuICAgICAgICBmdW5jdGlvbnMsXG4gICAgICAgIGN1c3RvbVR5cGVzLFxuICAgICAgICBybHMsXG4gICAgXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUHVibGljUmVsYXRpb25zKHBvb2wpKSxcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUHVibGljRW51bXMocG9vbCkpLFxuICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hQdWJsaWNDaGVja0NvbnN0cmFpbnRzKHBvb2wpKSxcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoSW5zdGFsbGVkRXh0ZW5zaW9ucyhwb29sKSksXG4gICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaFB1YmxpY1NlcXVlbmNlcyhwb29sKSksXG4gICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaFB1YmxpY1RyaWdnZXJzKHBvb2wpKSxcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUHVibGljRnVuY3Rpb25zKHBvb2wpKSxcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUHVibGljQ3VzdG9tVHlwZXMocG9vbCkpLFxuICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hQdWJsaWNSTFMocG9vbCkpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgdHlwZWRHcm91cGVkID0gZ3JvdXBlZCBhcyBBd2FpdGVkPFxuICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBmZXRjaFB1YmxpY1JlbGF0aW9ucz5cbiAgICA+O1xuICAgIGNvbnN0IHR5cGVkRW51bXMgPSBlbnVtcyBhcyBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGZldGNoUHVibGljRW51bXM+PjtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgY291bnRzLnRhYmxlcyA9XG4gICAgICAgICAgICAodHlwZWRHcm91cGVkLnRhYmxlPy5sZW5ndGggPz8gMCkgK1xuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC5wYXJ0aXRpb25lZF90YWJsZT8ubGVuZ3RoID8/IDApO1xuICAgICAgICBjb3VudHMudmlld3MgPVxuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC52aWV3Py5sZW5ndGggPz8gMCkgK1xuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC5tYXRlcmlhbGl6ZWRfdmlldz8ubGVuZ3RoID8/IDApO1xuICAgICAgICBjb3VudHMuZW51bXMgPSBPYmplY3Qua2V5cyh0eXBlZEVudW1zKS5sZW5ndGg7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxSZWxhdGlvbnMgPSBbXG4gICAgICAgIC4uLih0eXBlZEdyb3VwZWQucGFydGl0aW9uZWRfdGFibGUgPz8gW10pLFxuICAgICAgICAuLi4odHlwZWRHcm91cGVkLnRhYmxlID8/IFtdKSxcbiAgICAgICAgLi4uKHR5cGVkR3JvdXBlZC52aWV3ID8/IFtdKSxcbiAgICAgICAgLi4uKHR5cGVkR3JvdXBlZC5tYXRlcmlhbGl6ZWRfdmlldyA/PyBbXSksXG4gICAgXTtcblxuICAgIGNvbnN0IGlzVmlld0tpbmQgPSAodHlwZTogc3RyaW5nKSA9PlxuICAgICAgICB0eXBlID09PSAndmlldycgfHwgdHlwZSA9PT0gJ21hdGVyaWFsaXplZF92aWV3JztcblxuICAgIGNvbnN0IHNraXBBbmFseXplID0gc3RvcmUub3V0cHV0T3B0aW9ucy5za2lwQW5hbHl6ZTtcblxuICAgIGNvbnN0IHJlbGF0aW9uRW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBhbGxSZWxhdGlvbnMubWFwKGFzeW5jIChyZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWwudHlwZSAhPT0gJ3ZpZXcnICYmICFza2lwQW5hbHl6ZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlLmFkZCgoKSA9PiBhbmFseXplUmVsYXRpb24ocG9vbCwgcmVsLm5hbWUpKTtcbiAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50cy5hbmFseXplZCArPSAxO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbYXR0cmlidXRlcywgaW5kZXhlcywgZm9yZWlnbktleXMsIHN0YXRzLCB2aWV3RGVmaW5pdGlvbl0gPVxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUmVsYXRpb25BdHRyaWJ1dGVzKHBvb2wsIHJlbC5uYW1lKSksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaFJlbGF0aW9uSW5kZXhlcyhwb29sLCByZWwubmFtZSkpLFxuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hSZWxhdGlvbkZvcmVpZ25LZXlzKHBvb2wsIHJlbC5uYW1lKSksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaFJlbGF0aW9uU3RhdHMocG9vbCwgcmVsLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgICAgaXNWaWV3S2luZChyZWwudHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcXVldWUuYWRkKCgpID0+IGZldGNoVmlld0RlZmluaXRpb24ocG9vbCwgcmVsLm5hbWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGF0dHJzID0gYXR0cmlidXRlcyBhcyBUQXR0cmlidXRlSW5mb1tdO1xuICAgICAgICAgICAgY29uc3QgaWR4cyA9IGluZGV4ZXMgYXMgVEluZGV4SW5mb1tdO1xuICAgICAgICAgICAgY29uc3QgZmtzID0gZm9yZWlnbktleXMgYXMgVEZvcmVpZ25LZXlJbmZvW107XG4gICAgICAgICAgICBjb25zdCByZWxTdGF0cyA9IHN0YXRzIGFzIFRSZWxhdGlvblN0YXRzO1xuXG4gICAgICAgICAgICBjb25zdCBkaXN0aW5jdExvb2t1cCA9IG5ldyBNYXAoXG4gICAgICAgICAgICAgICAgcmVsU3RhdHMuYXR0cmlidXRlcy5tYXAoKGEpID0+IFtcbiAgICAgICAgICAgICAgICAgICAgYS5hdHRyaWJ1dGVfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYS5lc3RpbWF0ZWRfZGlzdGluY3QsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY291bnRzLmNvbHVtbnMgKz0gYXR0cnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvdW50cy5pbmRleGVzICs9IGlkeHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvdW50cy5mb3JlaWduS2V5cyArPSBma3MubGVuZ3RoO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkQXR0cnMgPSBhdHRycy5tYXAoKGF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gdHJhbnNmb3JtQXR0cmlidXRlKGF0dHIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RpbmN0ID0gZGlzdGluY3RMb29rdXAuZ2V0KGF0dHIuYXR0cmlidXRlX25hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXN0aW5jdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgID8gey4uLmJhc2UsIGVzdGltYXRlZF9kaXN0aW5jdDogZGlzdGluY3R9XG4gICAgICAgICAgICAgICAgICAgIDogYmFzZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbk9iaiA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiByZWwubmFtZSxcbiAgICAgICAgICAgICAgICBjb21tZW50OiByZWwuY29tbWVudCxcbiAgICAgICAgICAgICAgICBraW5kOiByZWwudHlwZSxcbiAgICAgICAgICAgICAgICBlc3RpbWF0ZWRfcm93X2NvdW50OiByZWxTdGF0cy5lc3RpbWF0ZWRfcm93X2NvdW50LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRvUmVjb3JkKHRyYW5zZm9ybWVkQXR0cnMsIChhKSA9PiBhLm5hbWUpLFxuICAgICAgICAgICAgICAgIGluZGV4ZXM6IHRvUmVjb3JkKFxuICAgICAgICAgICAgICAgICAgICBpZHhzLm1hcCh0cmFuc2Zvcm1JbmRleCksXG4gICAgICAgICAgICAgICAgICAgIChpKSA9PiBpLmluZGV4X25hbWUsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiB0b1JlY29yZChcbiAgICAgICAgICAgICAgICAgICAgZmtzLm1hcCh0cmFuc2Zvcm1SZWZlcmVuY2UpLFxuICAgICAgICAgICAgICAgICAgICAocikgPT4gci5jb25zdHJhaW50X25hbWUsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAuLi4odmlld0RlZmluaXRpb25cbiAgICAgICAgICAgICAgICAgICAgPyB7dmlld0RlZmluaXRpb246IHZpZXdEZWZpbml0aW9uIGFzIHN0cmluZ31cbiAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gW3JlbC5uYW1lLCByZWxhdGlvbk9ial0gYXMgY29uc3Q7XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uc3RhdGUgPSAnZG9uZSc7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAncG9zdGdyZXNxbCcgYXMgY29uc3QsXG4gICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgIHZlcnNpb25fc3RyaW5nOiBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucG9zdGdyZXNWZXJzaW9uISxcbiAgICAgICAgICAgIHZlcnNpb25fbnVtYmVyOlxuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wb3N0Z3Jlc1ZlcnNpb25OdW1iZXIhLFxuICAgICAgICB9LFxuICAgICAgICBpZGVudGlmaWVyOiB7XG4gICAgICAgICAgICBzeXN0ZW1faWRlbnRpZmllcjogaWRlbnRpZmllciEuc3lzdGVtX2lkZW50aWZpZXIsXG4gICAgICAgICAgICBkYXRhYmFzZV9vaWQ6IGlkZW50aWZpZXIhLmRhdGFiYXNlX29pZCxcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZTogaWRlbnRpZmllciEuZGF0YWJhc2VfbmFtZSxcbiAgICAgICAgY29tbWVudDogY29tbWVudCA/PyBudWxsLFxuICAgICAgICByZWxhdGlvbnM6IE9iamVjdC5mcm9tRW50cmllcyhyZWxhdGlvbkVudHJpZXMpLFxuICAgICAgICBlbnVtczogdHlwZWRFbnVtcyxcbiAgICAgICAgY2hlY2tDb25zdHJhaW50czogY2hlY2tDb25zdHJhaW50cyBhcyBBd2FpdGVkPFxuICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZmV0Y2hQdWJsaWNDaGVja0NvbnN0cmFpbnRzPlxuICAgICAgICA+LFxuICAgICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zIGFzIEF3YWl0ZWQ8XG4gICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBmZXRjaEluc3RhbGxlZEV4dGVuc2lvbnM+XG4gICAgICAgID4sXG4gICAgICAgIHNlcXVlbmNlczogc2VxdWVuY2VzIGFzIEF3YWl0ZWQ8XG4gICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBmZXRjaFB1YmxpY1NlcXVlbmNlcz5cbiAgICAgICAgPixcbiAgICAgICAgdHJpZ2dlcnM6IHRyaWdnZXJzIGFzIEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZmV0Y2hQdWJsaWNUcmlnZ2Vycz4+LFxuICAgICAgICBmdW5jdGlvbnM6IGZ1bmN0aW9ucyBhcyBBd2FpdGVkPFxuICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZmV0Y2hQdWJsaWNGdW5jdGlvbnM+XG4gICAgICAgID4sXG4gICAgICAgIGN1c3RvbVR5cGVzOlxuICAgICAgICAgICAgY3VzdG9tVHlwZXMgYXMgdW5rbm93biBhcyBURGF0YWJhc2VJbnRyb3NwZWN0aW9uWydjdXN0b21UeXBlcyddLFxuICAgICAgICBybHM6IHJscyBhcyB1bmtub3duIGFzIFREYXRhYmFzZUludHJvc3BlY3Rpb25bJ3JscyddLFxuICAgIH07XG59O1xuIl19
@@ -1,9 +0,0 @@
1
- type TConfig = {
2
- readonly token?: string;
3
- readonly device_id: string;
4
- };
5
- export declare const readConfig: () => Promise<TConfig>;
6
- export declare const writeConfig: (token: string) => Promise<void>;
7
- export declare const flushConfig: () => Promise<void>;
8
- export {};
9
- //# sourceMappingURL=config.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.mts","sourceRoot":"./src/","sources":["app/config.mts"],"names":[],"mappings":"AAQA,KAAK,OAAO,GAAG;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAC,CAAC;AAgBrE,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,OAAO,CAiBlD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAG7D,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAQhD,CAAC"}
@@ -1,49 +0,0 @@
1
- import { homedir } from 'node:os';
2
- import { join } from 'node:path';
3
- import { readFile, writeFile, mkdir } from 'node:fs/promises';
4
- import { uuidv7 } from 'uuidv7';
5
- const CONFIG_DIR = join(homedir(), '.dbctx');
6
- const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
7
- const readRawConfig = async () => {
8
- try {
9
- const raw = await readFile(CONFIG_PATH, 'utf-8');
10
- return JSON.parse(raw) ?? {};
11
- }
12
- catch {
13
- return {};
14
- }
15
- };
16
- const persist = async (data) => {
17
- await mkdir(CONFIG_DIR, { recursive: true });
18
- await writeFile(CONFIG_PATH, JSON.stringify(data, null, 4), 'utf-8');
19
- };
20
- export const readConfig = async () => {
21
- const raw = await readRawConfig();
22
- if (typeof raw.device_id === 'string' && raw.device_id.length > 0) {
23
- return {
24
- token: typeof raw.token === 'string' ? raw.token : undefined,
25
- device_id: raw.device_id,
26
- };
27
- }
28
- const device_id = uuidv7();
29
- await persist({ ...raw, device_id });
30
- return {
31
- token: typeof raw.token === 'string' ? raw.token : undefined,
32
- device_id,
33
- };
34
- };
35
- export const writeConfig = async (token) => {
36
- const raw = await readRawConfig();
37
- await persist({ ...raw, token });
38
- };
39
- export const flushConfig = async () => {
40
- try {
41
- const raw = await readRawConfig();
42
- const { token: _, ...rest } = raw;
43
- await persist(rest);
44
- }
45
- catch {
46
- // ignore if file doesn't exist
47
- }
48
- };
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9jb25maWcubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBSXBELE1BQU0sYUFBYSxHQUFHLEtBQUssSUFBc0MsRUFBRTtJQUMvRCxJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLElBQTZCLEVBQWlCLEVBQUU7SUFDbkUsTUFBTSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxJQUFzQixFQUFFO0lBQ25ELE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxFQUFFLENBQUM7SUFFbEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE9BQU87WUFDSCxLQUFLLEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM1RCxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7U0FDM0IsQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUMzQixNQUFNLE9BQU8sQ0FBQyxFQUFDLEdBQUcsR0FBRyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7SUFFbkMsT0FBTztRQUNILEtBQUssRUFBRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzVELFNBQVM7S0FDWixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxLQUFhLEVBQWlCLEVBQUU7SUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxhQUFhLEVBQUUsQ0FBQztJQUNsQyxNQUFNLE9BQU8sQ0FBQyxFQUFDLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBbUIsRUFBRTtJQUNqRCxJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDTCwrQkFBK0I7SUFDbkMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aG9tZWRpcn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQge2pvaW59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge3JlYWRGaWxlLCB3cml0ZUZpbGUsIG1rZGlyfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7dXVpZHY3fSBmcm9tICd1dWlkdjcnO1xuXG5jb25zdCBDT05GSUdfRElSID0gam9pbihob21lZGlyKCksICcuZGJjdHgnKTtcbmNvbnN0IENPTkZJR19QQVRIID0gam9pbihDT05GSUdfRElSLCAnY29uZmlnLmpzb24nKTtcblxudHlwZSBUQ29uZmlnID0ge3JlYWRvbmx5IHRva2VuPzogc3RyaW5nOyByZWFkb25seSBkZXZpY2VfaWQ6IHN0cmluZ307XG5cbmNvbnN0IHJlYWRSYXdDb25maWcgPSBhc3luYyAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKENPTkZJR19QQVRILCAndXRmLTgnKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSA/PyB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn07XG5cbmNvbnN0IHBlcnNpc3QgPSBhc3luYyAoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBta2RpcihDT05GSUdfRElSLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKENPTkZJR19QQVRILCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCA0KSwgJ3V0Zi04Jyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVhZENvbmZpZyA9IGFzeW5jICgpOiBQcm9taXNlPFRDb25maWc+ID0+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkUmF3Q29uZmlnKCk7XG5cbiAgICBpZiAodHlwZW9mIHJhdy5kZXZpY2VfaWQgPT09ICdzdHJpbmcnICYmIHJhdy5kZXZpY2VfaWQubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9rZW46IHR5cGVvZiByYXcudG9rZW4gPT09ICdzdHJpbmcnID8gcmF3LnRva2VuIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGV2aWNlX2lkOiByYXcuZGV2aWNlX2lkLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRldmljZV9pZCA9IHV1aWR2NygpO1xuICAgIGF3YWl0IHBlcnNpc3Qoey4uLnJhdywgZGV2aWNlX2lkfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbjogdHlwZW9mIHJhdy50b2tlbiA9PT0gJ3N0cmluZycgPyByYXcudG9rZW4gOiB1bmRlZmluZWQsXG4gICAgICAgIGRldmljZV9pZCxcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHdyaXRlQ29uZmlnID0gYXN5bmMgKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkUmF3Q29uZmlnKCk7XG4gICAgYXdhaXQgcGVyc2lzdCh7Li4ucmF3LCB0b2tlbn0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGZsdXNoQ29uZmlnID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRSYXdDb25maWcoKTtcbiAgICAgICAgY29uc3Qge3Rva2VuOiBfLCAuLi5yZXN0fSA9IHJhdztcbiAgICAgICAgYXdhaXQgcGVyc2lzdChyZXN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlIGlmIGZpbGUgZG9lc24ndCBleGlzdFxuICAgIH1cbn07XG4iXX0=
package/dist/app/db.d.mts DELETED
@@ -1,9 +0,0 @@
1
- import type { TStore } from '../store.mjs';
2
- export type TDBConnection = {
3
- readonly pool: InstanceType<typeof Pool>;
4
- readonly cleanup: () => void;
5
- };
6
- declare const Pool: typeof import("pg").Pool;
7
- export declare const connectDB: (store: TStore) => Promise<TDBConnection | undefined>;
8
- export {};
9
- //# sourceMappingURL=db.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.d.mts","sourceRoot":"./src/","sources":["app/db.mts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAIzC,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,QAAA,MAAO,IAAI,0BAAM,CAAC;AAyHlB,eAAO,MAAM,SAAS,GAClB,OAAO,MAAM,KACd,OAAO,CAAC,aAAa,GAAG,SAAS,CA+GnC,CAAC"}
package/dist/app/db.mjs DELETED
@@ -1,182 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import pg from 'pg';
3
- import { runInAction, when } from 'mobx';
4
- import { scope } from 'scope-utilities';
5
- import { fetchPostgresVersion } from '../db/version.mjs';
6
- const { Pool } = pg;
7
- const formatConnectionError = (err) => {
8
- if (!(err instanceof Error)) {
9
- return String(err) || 'Unknown error';
10
- }
11
- if (err.message) {
12
- return err.message;
13
- }
14
- // System errors (ECONNREFUSED, ETIMEDOUT, etc.)
15
- const sysErr = err;
16
- if (sysErr.code) {
17
- const parts = [sysErr.code];
18
- if (sysErr.syscall) {
19
- parts.push(sysErr.syscall);
20
- }
21
- if (sysErr.address) {
22
- parts.push(sysErr.address);
23
- }
24
- if (sysErr.port !== undefined) {
25
- parts.push(String(sysErr.port));
26
- }
27
- return parts.join(' ');
28
- }
29
- return 'Connection failed';
30
- };
31
- const resolveDBConfig = (store) => scope({
32
- hostname: 'localhost',
33
- port: 5432,
34
- database: 'postgres',
35
- username: 'postgres',
36
- password: undefined,
37
- })
38
- .let((config) => ({
39
- hostname: process.env['PGHOST'] ?? config.hostname,
40
- port: process.env['PGPORT']
41
- ? parseInt(process.env['PGPORT'], 10)
42
- : config.port,
43
- database: process.env['PGDATABASE'] ?? config.database,
44
- username: process.env['PGUSER'] ?? config.username,
45
- password: process.env['PGPASSWORD'] ?? config.password,
46
- }))
47
- .let((config) => store.config.connectionString
48
- ? scope(new URL(store.config.connectionString))
49
- .let((url) => ({
50
- hostname: url.hostname || config.hostname,
51
- port: url.port ? parseInt(url.port, 10) : config.port,
52
- database: url.pathname.slice(1) || config.database,
53
- username: decodeURIComponent(url.username) ||
54
- config.username,
55
- password: url.password
56
- ? decodeURIComponent(url.password)
57
- : config.password,
58
- }))
59
- .value()
60
- : config)
61
- .let((config) => ({
62
- hostname: store.config.hostname ?? config.hostname,
63
- port: store.config.port ?? config.port,
64
- database: store.config.database ?? config.database,
65
- username: store.config.username ?? config.username,
66
- password: config.password,
67
- }))
68
- .value();
69
- const buildSSLConfig = (store) => {
70
- const mode = store.config.sslmode ?? 'prefer';
71
- return mode === 'disable'
72
- ? false
73
- : {
74
- rejectUnauthorized: mode === 'verify-ca' || mode === 'verify-full',
75
- ...(store.config.sslrootcert
76
- ? {
77
- ca: readFileSync(store.config.sslrootcert, 'utf-8'),
78
- }
79
- : {}),
80
- ...(store.config.sslcert
81
- ? {
82
- cert: readFileSync(store.config.sslcert, 'utf-8'),
83
- }
84
- : {}),
85
- ...(store.config.sslkey
86
- ? {
87
- key: readFileSync(store.config.sslkey, 'utf-8'),
88
- }
89
- : {}),
90
- };
91
- };
92
- export const connectDB = async (store) => {
93
- const config = resolveDBConfig(store);
94
- const ssl = buildSSLConfig(store);
95
- // SSH tunnel: connect via localhost tunnel, but display the real remote target
96
- const connectionHost = store.steps.sshConnection.enabled &&
97
- store.steps.sshConnection.localPort !== null
98
- ? '127.0.0.1'
99
- : config.hostname;
100
- const connectionPort = store.steps.sshConnection.enabled &&
101
- store.steps.sshConnection.localPort !== null
102
- ? store.steps.sshConnection.localPort
103
- : config.port;
104
- runInAction(() => {
105
- store.steps.databaseConnection.pickedHostname = config.hostname;
106
- store.steps.databaseConnection.pickedPort = config.port;
107
- store.steps.databaseConnection.pickedDatabase = config.database;
108
- store.steps.databaseConnection.pickedUsername = config.username;
109
- store.steps.databaseConnection.state = 'connecting';
110
- });
111
- const attemptConnection = async (password, sslConfig) => {
112
- const pool = new Pool({
113
- host: connectionHost,
114
- port: connectionPort,
115
- database: config.database,
116
- user: config.username,
117
- password,
118
- ssl: sslConfig,
119
- connectionTimeoutMillis: 10_000,
120
- });
121
- try {
122
- const client = await pool.connect();
123
- client.release();
124
- const version = await fetchPostgresVersion(pool);
125
- runInAction(() => {
126
- store.steps.databaseConnection.postgresVersion =
127
- version.version;
128
- store.steps.databaseConnection.postgresVersionNumber =
129
- version.version_num;
130
- store.steps.databaseConnection.state = 'connected';
131
- });
132
- return {
133
- pool,
134
- cleanup: () => {
135
- pool.end();
136
- runInAction(() => {
137
- store.steps.databaseConnection.state = 'idle';
138
- });
139
- },
140
- };
141
- }
142
- catch (err) {
143
- await pool.end();
144
- // SSL errors happen before auth — check first
145
- const errMsg = err instanceof Error ? err.message : '';
146
- const isSSLError = errMsg.includes('does not support SSL');
147
- const sslMode = store.config.sslmode ?? 'prefer';
148
- if (isSSLError && sslMode === 'prefer') {
149
- return attemptConnection(password, false);
150
- }
151
- const pgCode = err.code;
152
- const isAuthError = pgCode === '28P01' ||
153
- pgCode === '28000' ||
154
- errMsg.includes('password must be a string');
155
- if (!isAuthError) {
156
- runInAction(() => {
157
- store.steps.databaseConnection.state = 'error';
158
- store.steps.databaseConnection.error =
159
- formatConnectionError(err);
160
- });
161
- return undefined;
162
- }
163
- runInAction(() => {
164
- store.steps.databaseConnection.wrongAttempt =
165
- store.steps.databaseConnection.promptCount > 0 ||
166
- password !== undefined;
167
- store.steps.databaseConnection.password = null;
168
- store.steps.databaseConnection.promptCount += 1;
169
- store.steps.databaseConnection.state = 'need-password';
170
- });
171
- await when(() => store.steps.databaseConnection.password !== null);
172
- const newPassword = store.steps.databaseConnection.password;
173
- runInAction(() => {
174
- store.steps.databaseConnection.password = null;
175
- store.steps.databaseConnection.state = 'connecting';
176
- });
177
- return attemptConnection(newPassword, sslConfig);
178
- }
179
- };
180
- return attemptConnection(config.password, ssl);
181
- };
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2RiLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFJdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFPdkQsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQztBQUVsQixNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBWSxFQUFVLEVBQUU7SUFDbkQsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNkLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELE1BQU0sTUFBTSxHQUFHLEdBS2QsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLENBQUM7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QUFXLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUVuRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVMsQ0FBQztZQUU3RCxXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDL0MsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ3hELENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3JlYWRGaWxlU3luY30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGcgZnJvbSAncGcnO1xuaW1wb3J0IHtydW5JbkFjdGlvbiwgd2hlbn0gZnJvbSAnbW9ieCc7XG5pbXBvcnQge3Njb3BlfSBmcm9tICdzY29wZS11dGlsaXRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHR5cGUge1RTU0xNb2RlfSBmcm9tICcuLi9pbmRleC5tanMnO1xuaW1wb3J0IHtmZXRjaFBvc3RncmVzVmVyc2lvbn0gZnJvbSAnLi4vZGIvdmVyc2lvbi5tanMnO1xuXG5leHBvcnQgdHlwZSBUREJDb25uZWN0aW9uID0ge1xuICAgIHJlYWRvbmx5IHBvb2w6IEluc3RhbmNlVHlwZTx0eXBlb2YgUG9vbD47XG4gICAgcmVhZG9ubHkgY2xlYW51cDogKCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IHtQb29sfSA9IHBnO1xuXG5jb25zdCBmb3JtYXRDb25uZWN0aW9uRXJyb3IgPSAoZXJyOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhlcnIpIHx8ICdVbmtub3duIGVycm9yJztcbiAgICB9XG5cbiAgICBpZiAoZXJyLm1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIFN5c3RlbSBlcnJvcnMgKEVDT05OUkVGVVNFRCwgRVRJTUVET1VULCBldGMuKVxuICAgIGNvbnN0IHN5c0VyciA9IGVyciBhcyB7XG4gICAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgICAgIHN5c2NhbGw/OiBzdHJpbmc7XG4gICAgICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gICAgICAgIHBvcnQ/OiBudW1iZXI7XG4gICAgfTtcbiAgICBpZiAoc3lzRXJyLmNvZGUpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbc3lzRXJyLmNvZGVdO1xuICAgICAgICBpZiAoc3lzRXJyLnN5c2NhbGwpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goc3lzRXJyLnN5c2NhbGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeXNFcnIuYWRkcmVzcykge1xuICAgICAgICAgICAgcGFydHMucHVzaChzeXNFcnIuYWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5c0Vyci5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goU3RyaW5nKHN5c0Vyci5wb3J0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJ0Nvbm5lY3Rpb24gZmFpbGVkJztcbn07XG5cbnR5cGUgVFJlc29sdmVkREJDb25maWcgPSB7XG4gICAgcmVhZG9ubHkgaG9zdG5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZGF0YWJhc2U6IHN0cmluZztcbiAgICByZWFkb25seSB1c2VybmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBhc3N3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCByZXNvbHZlREJDb25maWcgPSAoc3RvcmU6IFRTdG9yZSk6IFRSZXNvbHZlZERCQ29uZmlnID0+XG4gICAgc2NvcGUoe1xuICAgICAgICBob3N0bmFtZTogJ2xvY2FsaG9zdCcsXG4gICAgICAgIHBvcnQ6IDU0MzIsXG4gICAgICAgIGRhdGFiYXNlOiAncG9zdGdyZXMnLFxuICAgICAgICB1c2VybmFtZTogJ3Bvc3RncmVzJyxcbiAgICAgICAgcGFzc3dvcmQ6IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgfSlcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PiAoe1xuICAgICAgICAgICAgaG9zdG5hbWU6IHByb2Nlc3MuZW52WydQR0hPU1QnXSA/PyBjb25maWcuaG9zdG5hbWUsXG4gICAgICAgICAgICBwb3J0OiBwcm9jZXNzLmVudlsnUEdQT1JUJ11cbiAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHByb2Nlc3MuZW52WydQR1BPUlQnXSwgMTApXG4gICAgICAgICAgICAgICAgOiBjb25maWcucG9ydCxcbiAgICAgICAgICAgIGRhdGFiYXNlOiBwcm9jZXNzLmVudlsnUEdEQVRBQkFTRSddID8/IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgIHVzZXJuYW1lOiBwcm9jZXNzLmVudlsnUEdVU0VSJ10gPz8gY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52WydQR1BBU1NXT1JEJ10gPz8gY29uZmlnLnBhc3N3b3JkLFxuICAgICAgICB9KSlcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PlxuICAgICAgICAgICAgc3RvcmUuY29uZmlnLmNvbm5lY3Rpb25TdHJpbmdcbiAgICAgICAgICAgICAgICA/IHNjb3BlKG5ldyBVUkwoc3RvcmUuY29uZmlnLmNvbm5lY3Rpb25TdHJpbmcpKVxuICAgICAgICAgICAgICAgICAgICAgIC5sZXQoKHVybCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSB8fCBjb25maWcuaG9zdG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHVybC5wb3J0ID8gcGFyc2VJbnQodXJsLnBvcnQsIDEwKSA6IGNvbmZpZy5wb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdXJsLnBhdGhuYW1lLnNsaWNlKDEpIHx8IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVVUklDb21wb25lbnQodXJsLnVzZXJuYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDogdXJsLnBhc3N3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlY29kZVVSSUNvbXBvbmVudCh1cmwucGFzc3dvcmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5wYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAudmFsdWUoKVxuICAgICAgICAgICAgICAgIDogY29uZmlnLFxuICAgICAgICApXG4gICAgICAgIC5sZXQoKGNvbmZpZykgPT4gKHtcbiAgICAgICAgICAgIGhvc3RuYW1lOiBzdG9yZS5jb25maWcuaG9zdG5hbWUgPz8gY29uZmlnLmhvc3RuYW1lLFxuICAgICAgICAgICAgcG9ydDogc3RvcmUuY29uZmlnLnBvcnQgPz8gY29uZmlnLnBvcnQsXG4gICAgICAgICAgICBkYXRhYmFzZTogc3RvcmUuY29uZmlnLmRhdGFiYXNlID8/IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgIHVzZXJuYW1lOiBzdG9yZS5jb25maWcudXNlcm5hbWUgPz8gY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IGNvbmZpZy5wYXNzd29yZCxcbiAgICAgICAgfSkpXG4gICAgICAgIC52YWx1ZSgpO1xuXG50eXBlIFRTU0xDb25maWcgPVxuICAgIHwgZmFsc2VcbiAgICB8IHtcbiAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGJvb2xlYW47XG4gICAgICAgICAgY2E/OiBzdHJpbmc7XG4gICAgICAgICAgY2VydD86IHN0cmluZztcbiAgICAgICAgICBrZXk/OiBzdHJpbmc7XG4gICAgICB9O1xuXG5jb25zdCBidWlsZFNTTENvbmZpZyA9IChzdG9yZTogVFN0b3JlKTogVFNTTENvbmZpZyA9PiB7XG4gICAgY29uc3QgbW9kZTogVFNTTE1vZGUgPSBzdG9yZS5jb25maWcuc3NsbW9kZSA/PyAncHJlZmVyJztcblxuICAgIHJldHVybiBtb2RlID09PSAnZGlzYWJsZSdcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHtcbiAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOlxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gJ3ZlcmlmeS1jYScgfHwgbW9kZSA9PT0gJ3ZlcmlmeS1mdWxsJyxcbiAgICAgICAgICAgICAgLi4uKHN0b3JlLmNvbmZpZy5zc2xyb290Y2VydFxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYTogcmVhZEZpbGVTeW5jKHN0b3JlLmNvbmZpZy5zc2xyb290Y2VydCwgJ3V0Zi04JyksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAuLi4oc3RvcmUuY29uZmlnLnNzbGNlcnRcbiAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VydDogcmVhZEZpbGVTeW5jKHN0b3JlLmNvbmZpZy5zc2xjZXJ0LCAndXRmLTgnKSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIC4uLihzdG9yZS5jb25maWcuc3Nsa2V5XG4gICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogcmVhZEZpbGVTeW5jKHN0b3JlLmNvbmZpZy5zc2xrZXksICd1dGYtOCcpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbm5lY3REQiA9IGFzeW5jIChcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTxUREJDb25uZWN0aW9uIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gcmVzb2x2ZURCQ29uZmlnKHN0b3JlKTtcbiAgICBjb25zdCBzc2wgPSBidWlsZFNTTENvbmZpZyhzdG9yZSk7XG5cbiAgICAvLyBTU0ggdHVubmVsOiBjb25uZWN0IHZpYSBsb2NhbGhvc3QgdHVubmVsLCBidXQgZGlzcGxheSB0aGUgcmVhbCByZW1vdGUgdGFyZ2V0XG4gICAgY29uc3QgY29ubmVjdGlvbkhvc3QgPVxuICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmVuYWJsZWQgJiZcbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5sb2NhbFBvcnQgIT09IG51bGxcbiAgICAgICAgICAgID8gJzEyNy4wLjAuMSdcbiAgICAgICAgICAgIDogY29uZmlnLmhvc3RuYW1lO1xuICAgIGNvbnN0IGNvbm5lY3Rpb25Qb3J0ID1cbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5lbmFibGVkICYmXG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ubG9jYWxQb3J0ICE9PSBudWxsXG4gICAgICAgICAgICA/IHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ubG9jYWxQb3J0XG4gICAgICAgICAgICA6IGNvbmZpZy5wb3J0O1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGlja2VkSG9zdG5hbWUgPSBjb25maWcuaG9zdG5hbWU7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5waWNrZWRQb3J0ID0gY29uZmlnLnBvcnQ7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5waWNrZWREYXRhYmFzZSA9IGNvbmZpZy5kYXRhYmFzZTtcbiAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBpY2tlZFVzZXJuYW1lID0gY29uZmlnLnVzZXJuYW1lO1xuICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnY29ubmVjdGluZyc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdHRlbXB0Q29ubmVjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgcGFzc3dvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgc3NsQ29uZmlnOiBUU1NMQ29uZmlnLFxuICAgICk6IFByb21pc2U8VERCQ29ubmVjdGlvbiB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCBwb29sID0gbmV3IFBvb2woe1xuICAgICAgICAgICAgaG9zdDogY29ubmVjdGlvbkhvc3QsXG4gICAgICAgICAgICBwb3J0OiBjb25uZWN0aW9uUG9ydCxcbiAgICAgICAgICAgIGRhdGFiYXNlOiBjb25maWcuZGF0YWJhc2UsXG4gICAgICAgICAgICB1c2VyOiBjb25maWcudXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgIHNzbDogc3NsQ29uZmlnLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IDEwXzAwMCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBvb2wuY29ubmVjdCgpO1xuICAgICAgICAgICAgY2xpZW50LnJlbGVhc2UoKTtcblxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGZldGNoUG9zdGdyZXNWZXJzaW9uKHBvb2wpO1xuXG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBvc3RncmVzVmVyc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb24udmVyc2lvbjtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucG9zdGdyZXNWZXJzaW9uTnVtYmVyID1cbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi52ZXJzaW9uX251bTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnY29ubmVjdGVkJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBvb2wsXG4gICAgICAgICAgICAgICAgY2xlYW51cDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwb29sLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnaWRsZSc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGF3YWl0IHBvb2wuZW5kKCk7XG5cbiAgICAgICAgICAgIC8vIFNTTCBlcnJvcnMgaGFwcGVuIGJlZm9yZSBhdXRoIOKAlCBjaGVjayBmaXJzdFxuICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICcnO1xuICAgICAgICAgICAgY29uc3QgaXNTU0xFcnJvciA9IGVyck1zZy5pbmNsdWRlcygnZG9lcyBub3Qgc3VwcG9ydCBTU0wnKTtcbiAgICAgICAgICAgIGNvbnN0IHNzbE1vZGU6IFRTU0xNb2RlID0gc3RvcmUuY29uZmlnLnNzbG1vZGUgPz8gJ3ByZWZlcic7XG5cbiAgICAgICAgICAgIGlmIChpc1NTTEVycm9yICYmIHNzbE1vZGUgPT09ICdwcmVmZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dGVtcHRDb25uZWN0aW9uKHBhc3N3b3JkLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBnQ29kZSA9IChlcnIgYXMge2NvZGU/OiBzdHJpbmd9KS5jb2RlO1xuICAgICAgICAgICAgY29uc3QgaXNBdXRoRXJyb3IgPVxuICAgICAgICAgICAgICAgIHBnQ29kZSA9PT0gJzI4UDAxJyB8fFxuICAgICAgICAgICAgICAgIHBnQ29kZSA9PT0gJzI4MDAwJyB8fFxuICAgICAgICAgICAgICAgIGVyck1zZy5pbmNsdWRlcygncGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG4gICAgICAgICAgICBpZiAoIWlzQXV0aEVycm9yKSB7XG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uZXJyb3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi53cm9uZ0F0dGVtcHQgPVxuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucHJvbXB0Q291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucHJvbXB0Q291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnbmVlZC1wYXNzd29yZCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgd2hlbigoKSA9PiBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQgIT09IG51bGwpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdQYXNzd29yZCA9IHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wYXNzd29yZCE7XG5cbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5zdGF0ZSA9ICdjb25uZWN0aW5nJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXR0ZW1wdENvbm5lY3Rpb24obmV3UGFzc3dvcmQsIHNzbENvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGF0dGVtcHRDb25uZWN0aW9uKGNvbmZpZy5wYXNzd29yZCwgc3NsKTtcbn07XG4iXX0=
@@ -1,14 +0,0 @@
1
- import type { TAIAssistant, TDatabaseProvider, TOs, TShell, TSystemMemory, TPackageManager } from '@dbctx/core';
2
- export declare const detectOS: () => TOs;
3
- export declare const detectShell: () => TShell;
4
- export declare const detectWSL: () => boolean;
5
- export declare const detectSystemMemory: () => TSystemMemory;
6
- export declare const detectPackageManager: () => TPackageManager;
7
- export declare const detectProvider: (hostname: string) => TDatabaseProvider;
8
- export declare const detectAIAssistants: () => TAIAssistant[];
9
- export declare const detectDocker: () => boolean;
10
- export declare const detectSSHSession: () => boolean;
11
- export declare const detectHostname: () => string;
12
- export declare const detectUsername: () => string;
13
- export declare const isLocalhost: (hostname: string) => boolean;
14
- //# sourceMappingURL=detect.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect.d.mts","sourceRoot":"./src/","sources":["app/detect.mts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACR,YAAY,EACZ,iBAAiB,EACjB,GAAG,EACH,MAAM,EACN,aAAa,EACb,eAAe,EAClB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,QAAQ,QAAO,GAKT,CAAC;AAEpB,eAAO,MAAM,WAAW,QAAO,MAqB9B,CAAC;AAEF,eAAO,MAAM,SAAS,QAAO,OAAgD,CAAC;AAI9E,eAAO,MAAM,kBAAkB,QAAO,aAiBrC,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAO,eAYvC,CAAC;AAGF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,KAAG,iBA0BjD,CAAC;AAaF,eAAO,MAAM,kBAAkB,QAAO,YAAY,EAMjD,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,OAAoC,CAAC;AAErE,eAAO,MAAM,gBAAgB,QAAO,OACuB,CAAC;AAE5D,eAAO,MAAM,cAAc,QAAO,MAAoB,CAAC;AAEvD,eAAO,MAAM,cAAc,QAAO,MAA6B,CAAC;AAEhE,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,KAAG,OAS9C,CAAC"}