dbctx 1.4.6 → 2.0.1

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 (164) hide show
  1. package/dist/app/assemble.d.mts +2 -2
  2. package/dist/app/assemble.d.mts.map +1 -1
  3. package/dist/app/assemble.mjs +37 -16
  4. package/dist/app/db.d.mts.map +1 -1
  5. package/dist/app/db.mjs +3 -2
  6. package/dist/app/detect.d.mts +1 -0
  7. package/dist/app/detect.d.mts.map +1 -1
  8. package/dist/app/detect.mjs +3 -2
  9. package/dist/app/list.d.mts +4 -0
  10. package/dist/app/list.d.mts.map +1 -0
  11. package/dist/app/list.mjs +93 -0
  12. package/dist/app/load-introspection.d.mts +26 -0
  13. package/dist/app/load-introspection.d.mts.map +1 -0
  14. package/dist/app/load-introspection.mjs +89 -0
  15. package/dist/app/login.d.mts +2 -0
  16. package/dist/app/login.d.mts.map +1 -0
  17. package/dist/app/login.mjs +69 -0
  18. package/dist/app/open-url.d.mts +2 -0
  19. package/dist/app/open-url.d.mts.map +1 -1
  20. package/dist/app/open-url.mjs +8 -3
  21. package/dist/app/sample.d.mts +24 -0
  22. package/dist/app/sample.d.mts.map +1 -0
  23. package/dist/app/sample.mjs +257 -0
  24. package/dist/app/session.d.mts +3 -2
  25. package/dist/app/session.d.mts.map +1 -1
  26. package/dist/app/session.mjs +46 -6
  27. package/dist/app/ssh.d.mts.map +1 -1
  28. package/dist/app/ssh.mjs +12 -1
  29. package/dist/app/tail.d.mts +13 -0
  30. package/dist/app/tail.d.mts.map +1 -0
  31. package/dist/app/tail.mjs +168 -0
  32. package/dist/db/check-constraints.d.mts +9 -0
  33. package/dist/db/check-constraints.d.mts.map +1 -0
  34. package/dist/db/check-constraints.mjs +17 -0
  35. package/dist/db/custom-types.d.mts +26 -0
  36. package/dist/db/custom-types.d.mts.map +1 -0
  37. package/dist/db/custom-types.mjs +61 -0
  38. package/dist/db/extensions.d.mts +8 -0
  39. package/dist/db/extensions.d.mts.map +1 -0
  40. package/dist/db/extensions.mjs +14 -0
  41. package/dist/db/foreign-keys.mjs +3 -3
  42. package/dist/db/functions.d.mts +11 -0
  43. package/dist/db/functions.d.mts.map +1 -0
  44. package/dist/db/functions.mjs +23 -0
  45. package/dist/db/index.d.mts +10 -1
  46. package/dist/db/index.d.mts.map +1 -1
  47. package/dist/db/index.mjs +11 -2
  48. package/dist/db/planner-stats.d.mts +33 -0
  49. package/dist/db/planner-stats.d.mts.map +1 -0
  50. package/dist/db/planner-stats.mjs +103 -0
  51. package/dist/db/relations.d.mts +1 -0
  52. package/dist/db/relations.d.mts.map +1 -1
  53. package/dist/db/relations.mjs +10 -1
  54. package/dist/db/rls.d.mts +21 -0
  55. package/dist/db/rls.d.mts.map +1 -0
  56. package/dist/db/rls.mjs +48 -0
  57. package/dist/db/sample.d.mts +16 -0
  58. package/dist/db/sample.d.mts.map +1 -0
  59. package/dist/db/sample.mjs +73 -0
  60. package/dist/db/sequences.d.mts +15 -0
  61. package/dist/db/sequences.d.mts.map +1 -0
  62. package/dist/db/sequences.mjs +31 -0
  63. package/dist/db/stats.mjs +3 -3
  64. package/dist/db/triggers.d.mts +11 -0
  65. package/dist/db/triggers.d.mts.map +1 -0
  66. package/dist/db/triggers.mjs +21 -0
  67. package/dist/flow/events.d.mts +115 -0
  68. package/dist/flow/events.d.mts.map +1 -0
  69. package/dist/flow/events.mjs +2 -0
  70. package/dist/flow/interpreter.d.mts +21 -0
  71. package/dist/flow/interpreter.d.mts.map +1 -0
  72. package/dist/flow/interpreter.mjs +605 -0
  73. package/dist/flow/projection.d.mts +17 -0
  74. package/dist/flow/projection.d.mts.map +1 -0
  75. package/dist/flow/projection.mjs +83 -0
  76. package/dist/flow/projection.test.d.mts +2 -0
  77. package/dist/flow/projection.test.d.mts.map +1 -0
  78. package/dist/flow/projection.test.mjs +162 -0
  79. package/dist/flow/reducer.d.mts +5 -0
  80. package/dist/flow/reducer.d.mts.map +1 -0
  81. package/dist/flow/reducer.mjs +306 -0
  82. package/dist/flow/reducer.test.d.mts +2 -0
  83. package/dist/flow/reducer.test.d.mts.map +1 -0
  84. package/dist/flow/reducer.test.mjs +479 -0
  85. package/dist/flow/run.d.mts +3 -0
  86. package/dist/flow/run.d.mts.map +1 -0
  87. package/dist/flow/run.mjs +89 -0
  88. package/dist/flow/states.d.mts +54 -0
  89. package/dist/flow/states.d.mts.map +1 -0
  90. package/dist/flow/states.mjs +39 -0
  91. package/dist/index.d.mts +11 -0
  92. package/dist/index.d.mts.map +1 -1
  93. package/dist/index.mjs +135 -12
  94. package/dist/lib/atomic-write.d.mts +4 -0
  95. package/dist/lib/atomic-write.d.mts.map +1 -0
  96. package/dist/lib/atomic-write.mjs +75 -0
  97. package/dist/lib/stream-job.d.mts +19 -0
  98. package/dist/lib/stream-job.d.mts.map +1 -0
  99. package/dist/lib/stream-job.mjs +55 -0
  100. package/dist/lib/trpc-url.mjs +2 -2
  101. package/dist/lib/trpc.mjs +2 -2
  102. package/dist/logger.d.mts.map +1 -1
  103. package/dist/logger.mjs +6 -3
  104. package/dist/providers/TrpcProvider.js +3 -3
  105. package/dist/store.d.mts +113 -1
  106. package/dist/store.d.mts.map +1 -1
  107. package/dist/store.mjs +81 -2
  108. package/dist/ui/App.d.ts +1 -1
  109. package/dist/ui/App.d.ts.map +1 -1
  110. package/dist/ui/App.js +32 -4
  111. package/dist/ui/components/Analyze.d.ts +10 -0
  112. package/dist/ui/components/Analyze.d.ts.map +1 -0
  113. package/dist/ui/components/Analyze.js +54 -0
  114. package/dist/ui/components/Billing.d.ts +10 -0
  115. package/dist/ui/components/Billing.d.ts.map +1 -0
  116. package/dist/ui/components/Billing.js +40 -0
  117. package/dist/ui/components/DB.d.ts.map +1 -1
  118. package/dist/ui/components/DB.js +2 -2
  119. package/dist/ui/components/DatabasePicker.d.ts +13 -0
  120. package/dist/ui/components/DatabasePicker.d.ts.map +1 -0
  121. package/dist/ui/components/DatabasePicker.js +79 -0
  122. package/dist/ui/components/Enrich.d.ts +10 -0
  123. package/dist/ui/components/Enrich.d.ts.map +1 -0
  124. package/dist/ui/components/Enrich.js +41 -0
  125. package/dist/ui/components/Gate.js +2 -2
  126. package/dist/ui/components/Introspect.d.ts.map +1 -1
  127. package/dist/ui/components/Introspect.js +2 -2
  128. package/dist/ui/components/IntrospectionUpload.d.ts +10 -0
  129. package/dist/ui/components/IntrospectionUpload.d.ts.map +1 -0
  130. package/dist/ui/components/IntrospectionUpload.js +30 -0
  131. package/dist/ui/components/Login.d.ts +19 -0
  132. package/dist/ui/components/Login.d.ts.map +1 -0
  133. package/dist/ui/components/Login.js +38 -0
  134. package/dist/ui/components/OutputJson.d.ts +10 -0
  135. package/dist/ui/components/OutputJson.d.ts.map +1 -0
  136. package/dist/ui/components/OutputJson.js +18 -0
  137. package/dist/ui/components/SSH.d.ts.map +1 -1
  138. package/dist/ui/components/SSH.js +2 -2
  139. package/dist/ui/components/SamplesUpload.d.ts +10 -0
  140. package/dist/ui/components/SamplesUpload.d.ts.map +1 -0
  141. package/dist/ui/components/SamplesUpload.js +24 -0
  142. package/dist/ui/components/Sampling.d.ts +10 -0
  143. package/dist/ui/components/Sampling.d.ts.map +1 -0
  144. package/dist/ui/components/Sampling.js +58 -0
  145. package/dist/ui/components/Session.d.ts.map +1 -1
  146. package/dist/ui/components/Session.js +4 -4
  147. package/dist/ui/components/Spinner.d.ts.map +1 -1
  148. package/dist/ui/components/Spinner.js +17 -5
  149. package/dist/ui/components/TextInput.d.ts +11 -0
  150. package/dist/ui/components/TextInput.d.ts.map +1 -0
  151. package/dist/ui/components/TextInput.js +286 -0
  152. package/dist/ui/components/UserExplanation.d.ts +10 -0
  153. package/dist/ui/components/UserExplanation.d.ts.map +1 -0
  154. package/dist/ui/components/UserExplanation.js +34 -0
  155. package/dist/validatePaths.d.mts +2 -1
  156. package/dist/validatePaths.d.mts.map +1 -1
  157. package/dist/validatePaths.mjs +6 -2
  158. package/package.json +7 -7
  159. package/dist/app/index.d.mts +0 -3
  160. package/dist/app/index.d.mts.map +0 -1
  161. package/dist/app/index.mjs +0 -82
  162. package/dist/schemas/index.d.mts +0 -107
  163. package/dist/schemas/index.d.mts.map +0 -1
  164. package/dist/schemas/index.mjs +0 -116
@@ -0,0 +1,89 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { runInAction } from 'mobx';
3
+ import { databaseIntrospectionSchema } from '@dbctx/core/schemas/introspection';
4
+ import { fetchDatabaseIdentifier } from '../db/version.mjs';
5
+ const errMessage = (err) => err instanceof Error ? err.message : String(err);
6
+ export const loadIntrospectionFromFile = async (path, pool) => {
7
+ const raw = await (async () => {
8
+ try {
9
+ return { ok: true, value: await readFile(path, 'utf8') };
10
+ }
11
+ catch (err) {
12
+ return {
13
+ ok: false,
14
+ error: {
15
+ kind: 'read',
16
+ message: `Failed to read introspection file at ${path}: ${errMessage(err)}`,
17
+ },
18
+ };
19
+ }
20
+ })();
21
+ if (!raw.ok) {
22
+ return { ok: false, error: raw.error };
23
+ }
24
+ const parsed = (() => {
25
+ try {
26
+ return { ok: true, value: JSON.parse(raw.value) };
27
+ }
28
+ catch (err) {
29
+ return {
30
+ ok: false,
31
+ error: {
32
+ kind: 'parse',
33
+ message: `Failed to parse introspection JSON at ${path}: ${errMessage(err)}`,
34
+ },
35
+ };
36
+ }
37
+ })();
38
+ if (!parsed.ok) {
39
+ return { ok: false, error: parsed.error };
40
+ }
41
+ const validated = databaseIntrospectionSchema.safeParse(parsed.value);
42
+ if (!validated.success) {
43
+ return {
44
+ ok: false,
45
+ error: {
46
+ kind: 'schema',
47
+ message: `Introspection JSON at ${path} does not match the expected schema: ${validated.error.message}`,
48
+ },
49
+ };
50
+ }
51
+ const loaded = validated.data;
52
+ const live = await fetchDatabaseIdentifier(pool);
53
+ const matches = loaded.identifier.system_identifier === live.system_identifier &&
54
+ loaded.identifier.database_oid === live.database_oid &&
55
+ loaded.name === live.database_name;
56
+ if (!matches) {
57
+ return {
58
+ ok: false,
59
+ error: {
60
+ kind: 'mismatch',
61
+ message: `Introspection JSON does not match the connected database.\n` +
62
+ ` loaded: name=${loaded.name} system_identifier=${loaded.identifier.system_identifier} database_oid=${loaded.identifier.database_oid}\n` +
63
+ ` live: name=${live.database_name} system_identifier=${live.system_identifier} database_oid=${live.database_oid}`,
64
+ },
65
+ };
66
+ }
67
+ return { ok: true, result: loaded };
68
+ };
69
+ export const populateIntrospectionCounts = (store, introspection) => {
70
+ const counts = store.steps.introspection.counts;
71
+ const relations = Object.values(introspection.relations);
72
+ const tables = relations.filter((r) => r.kind === 'table' || r.kind === 'partitioned_table').length;
73
+ const views = relations.filter((r) => r.kind === 'view').length;
74
+ const materializedViews = relations.filter((r) => r.kind === 'materialized_view').length;
75
+ const columns = relations.reduce((acc, r) => acc + Object.keys(r.attributes).length, 0);
76
+ const indexes = relations.reduce((acc, r) => acc + Object.keys(r.indexes).length, 0);
77
+ const foreignKeys = relations.reduce((acc, r) => acc + Object.keys(r.references).length, 0);
78
+ runInAction(() => {
79
+ counts.tables = tables;
80
+ counts.views = views;
81
+ counts.materializedViews = materializedViews;
82
+ counts.columns = columns;
83
+ counts.indexes = indexes;
84
+ counts.foreignKeys = foreignKeys;
85
+ counts.enums = Object.keys(introspection.enums).length;
86
+ counts.analyzed = 0;
87
+ });
88
+ };
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1pbnRyb3NwZWN0aW9uLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9sb2FkLWludHJvc3BlY3Rpb24ubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBSTlFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBWTFELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBWSxFQUFVLEVBQUUsQ0FDeEMsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEtBQUssRUFDMUMsSUFBWSxFQUNaLElBQVUsRUFDdUIsRUFBRTtJQUNuQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDMUIsSUFBSSxDQUFDO1lBQ0QsT0FBTyxFQUFDLEVBQUUsRUFBRSxJQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBQyxDQUFDO1FBQ3BFLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ1gsT0FBTztnQkFDSCxFQUFFLEVBQUUsS0FBYztnQkFDbEIsS0FBSyxFQUFFO29CQUNILElBQUksRUFBRSxNQUFlO29CQUNyQixPQUFPLEVBQUUsd0NBQXdDLElBQUksS0FBSyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7aUJBQzlFO2FBQ0osQ0FBQztRQUNOLENBQUM7SUFDTCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUwsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQztZQUNELE9BQU8sRUFBQyxFQUFFLEVBQUUsSUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQVksRUFBQyxDQUFDO1FBQ3hFLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ1gsT0FBTztnQkFDSCxFQUFFLEVBQUUsS0FBYztnQkFDbEIsS0FBSyxFQUFFO29CQUNILElBQUksRUFBRSxPQUFnQjtvQkFDdEIsT0FBTyxFQUFFLHlDQUF5QyxJQUFJLEtBQUssVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2lCQUMvRTthQUNKLENBQUM7UUFDTixDQUFDO0lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVMLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDYixPQUFPLEVBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTztZQUNILEVBQUUsRUFBRSxLQUFLO1lBQ1QsS0FBSyxFQUFFO2dCQUNILElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSx5QkFBeUIsSUFBSSx3Q0FBd0MsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7YUFDMUc7U0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDOUIsTUFBTSxJQUFJLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqRCxNQUFNLE9BQU8sR0FDVCxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixLQUFLLElBQUksQ0FBQyxpQkFBaUI7UUFDOUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLFlBQVk7UUFDcEQsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBRXZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNYLE9BQU87WUFDSCxFQUFFLEVBQUUsS0FBSztZQUNULEtBQUssRUFBRTtnQkFDSCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsT0FBTyxFQUNILDZEQUE2RDtvQkFDN0Qsa0JBQWtCLE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixpQkFBaUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLElBQUk7b0JBQ3pJLGtCQUFrQixJQUFJLENBQUMsYUFBYSxzQkFBc0IsSUFBSSxDQUFDLGlCQUFpQixpQkFBaUIsSUFBSSxDQUFDLFlBQVksRUFBRTthQUMzSDtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsT0FBTyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQ3ZDLEtBQWEsRUFDYixhQUFxQyxFQUNqQyxFQUFFO0lBQ04sTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBRWhELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXpELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUM5RCxDQUFDLE1BQU0sQ0FBQztJQUNULE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2hFLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQ3hDLENBQUMsTUFBTSxDQUFDO0lBRVQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUNsRCxDQUFDLENBQ0osQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQzVCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFDL0MsQ0FBQyxDQUNKLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUNoQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQ2xELENBQUMsQ0FDSixDQUFDO0lBRUYsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUM3QyxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN6QixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN6QixNQUFNLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNqQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmVhZEZpbGV9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcbmltcG9ydCB7cnVuSW5BY3Rpb259IGZyb20gJ21vYngnO1xuaW1wb3J0IHtkYXRhYmFzZUludHJvc3BlY3Rpb25TY2hlbWF9IGZyb20gJ0BkYmN0eC9jb3JlL3NjaGVtYXMvaW50cm9zcGVjdGlvbic7XG5pbXBvcnQgdHlwZSB7VERhdGFiYXNlSW50cm9zcGVjdGlvbn0gZnJvbSAnQGRiY3R4L2NvcmUnO1xuXG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHtmZXRjaERhdGFiYXNlSWRlbnRpZmllcn0gZnJvbSAnLi4vZGIvdmVyc2lvbi5tanMnO1xuXG5leHBvcnQgdHlwZSBUTG9hZEludHJvc3BlY3Rpb25FcnJvciA9XG4gICAgfCB7a2luZDogJ3JlYWQnOyBtZXNzYWdlOiBzdHJpbmd9XG4gICAgfCB7a2luZDogJ3BhcnNlJzsgbWVzc2FnZTogc3RyaW5nfVxuICAgIHwge2tpbmQ6ICdzY2hlbWEnOyBtZXNzYWdlOiBzdHJpbmd9XG4gICAgfCB7a2luZDogJ21pc21hdGNoJzsgbWVzc2FnZTogc3RyaW5nfTtcblxuZXhwb3J0IHR5cGUgVExvYWRJbnRyb3NwZWN0aW9uUmVzdWx0ID1cbiAgICB8IHtvazogdHJ1ZTsgcmVzdWx0OiBURGF0YWJhc2VJbnRyb3NwZWN0aW9ufVxuICAgIHwge29rOiBmYWxzZTsgZXJyb3I6IFRMb2FkSW50cm9zcGVjdGlvbkVycm9yfTtcblxuY29uc3QgZXJyTWVzc2FnZSA9IChlcnI6IHVua25vd24pOiBzdHJpbmcgPT5cbiAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cbmV4cG9ydCBjb25zdCBsb2FkSW50cm9zcGVjdGlvbkZyb21GaWxlID0gYXN5bmMgKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBwb29sOiBQb29sLFxuKTogUHJvbWlzZTxUTG9hZEludHJvc3BlY3Rpb25SZXN1bHQ+ID0+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHtvazogdHJ1ZSBhcyBjb25zdCwgdmFsdWU6IGF3YWl0IHJlYWRGaWxlKHBhdGgsICd1dGY4Jyl9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdyZWFkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byByZWFkIGludHJvc3BlY3Rpb24gZmlsZSBhdCAke3BhdGh9OiAke2Vyck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSkoKTtcblxuICAgIGlmICghcmF3Lm9rKSB7XG4gICAgICAgIHJldHVybiB7b2s6IGZhbHNlLCBlcnJvcjogcmF3LmVycm9yfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSAoKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHtvazogdHJ1ZSBhcyBjb25zdCwgdmFsdWU6IEpTT04ucGFyc2UocmF3LnZhbHVlKSBhcyB1bmtub3dufTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9rOiBmYWxzZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAncGFyc2UnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHBhcnNlIGludHJvc3BlY3Rpb24gSlNPTiBhdCAke3BhdGh9OiAke2Vyck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSkoKTtcblxuICAgIGlmICghcGFyc2VkLm9rKSB7XG4gICAgICAgIHJldHVybiB7b2s6IGZhbHNlLCBlcnJvcjogcGFyc2VkLmVycm9yfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZWQgPSBkYXRhYmFzZUludHJvc3BlY3Rpb25TY2hlbWEuc2FmZVBhcnNlKHBhcnNlZC52YWx1ZSk7XG5cbiAgICBpZiAoIXZhbGlkYXRlZC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgIGtpbmQ6ICdzY2hlbWEnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBJbnRyb3NwZWN0aW9uIEpTT04gYXQgJHtwYXRofSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgc2NoZW1hOiAke3ZhbGlkYXRlZC5lcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZCA9IHZhbGlkYXRlZC5kYXRhO1xuICAgIGNvbnN0IGxpdmUgPSBhd2FpdCBmZXRjaERhdGFiYXNlSWRlbnRpZmllcihwb29sKTtcblxuICAgIGNvbnN0IG1hdGNoZXMgPVxuICAgICAgICBsb2FkZWQuaWRlbnRpZmllci5zeXN0ZW1faWRlbnRpZmllciA9PT0gbGl2ZS5zeXN0ZW1faWRlbnRpZmllciAmJlxuICAgICAgICBsb2FkZWQuaWRlbnRpZmllci5kYXRhYmFzZV9vaWQgPT09IGxpdmUuZGF0YWJhc2Vfb2lkICYmXG4gICAgICAgIGxvYWRlZC5uYW1lID09PSBsaXZlLmRhdGFiYXNlX25hbWU7XG5cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAga2luZDogJ21pc21hdGNoJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICBgSW50cm9zcGVjdGlvbiBKU09OIGRvZXMgbm90IG1hdGNoIHRoZSBjb25uZWN0ZWQgZGF0YWJhc2UuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAgIGxvYWRlZDogbmFtZT0ke2xvYWRlZC5uYW1lfSBzeXN0ZW1faWRlbnRpZmllcj0ke2xvYWRlZC5pZGVudGlmaWVyLnN5c3RlbV9pZGVudGlmaWVyfSBkYXRhYmFzZV9vaWQ9JHtsb2FkZWQuaWRlbnRpZmllci5kYXRhYmFzZV9vaWR9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAgIGxpdmU6ICAgbmFtZT0ke2xpdmUuZGF0YWJhc2VfbmFtZX0gc3lzdGVtX2lkZW50aWZpZXI9JHtsaXZlLnN5c3RlbV9pZGVudGlmaWVyfSBkYXRhYmFzZV9vaWQ9JHtsaXZlLmRhdGFiYXNlX29pZH1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge29rOiB0cnVlLCByZXN1bHQ6IGxvYWRlZH07XG59O1xuXG5leHBvcnQgY29uc3QgcG9wdWxhdGVJbnRyb3NwZWN0aW9uQ291bnRzID0gKFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgaW50cm9zcGVjdGlvbjogVERhdGFiYXNlSW50cm9zcGVjdGlvbixcbik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGNvdW50cyA9IHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uY291bnRzO1xuXG4gICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LnZhbHVlcyhpbnRyb3NwZWN0aW9uLnJlbGF0aW9ucyk7XG5cbiAgICBjb25zdCB0YWJsZXMgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgICAgICAocikgPT4gci5raW5kID09PSAndGFibGUnIHx8IHIua2luZCA9PT0gJ3BhcnRpdGlvbmVkX3RhYmxlJyxcbiAgICApLmxlbmd0aDtcbiAgICBjb25zdCB2aWV3cyA9IHJlbGF0aW9ucy5maWx0ZXIoKHIpID0+IHIua2luZCA9PT0gJ3ZpZXcnKS5sZW5ndGg7XG4gICAgY29uc3QgbWF0ZXJpYWxpemVkVmlld3MgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgICAgICAocikgPT4gci5raW5kID09PSAnbWF0ZXJpYWxpemVkX3ZpZXcnLFxuICAgICkubGVuZ3RoO1xuXG4gICAgY29uc3QgY29sdW1ucyA9IHJlbGF0aW9ucy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHIpID0+IGFjYyArIE9iamVjdC5rZXlzKHIuYXR0cmlidXRlcykubGVuZ3RoLFxuICAgICAgICAwLFxuICAgICk7XG4gICAgY29uc3QgaW5kZXhlcyA9IHJlbGF0aW9ucy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHIpID0+IGFjYyArIE9iamVjdC5rZXlzKHIuaW5kZXhlcykubGVuZ3RoLFxuICAgICAgICAwLFxuICAgICk7XG4gICAgY29uc3QgZm9yZWlnbktleXMgPSByZWxhdGlvbnMucmVkdWNlKFxuICAgICAgICAoYWNjLCByKSA9PiBhY2MgKyBPYmplY3Qua2V5cyhyLnJlZmVyZW5jZXMpLmxlbmd0aCxcbiAgICAgICAgMCxcbiAgICApO1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBjb3VudHMudGFibGVzID0gdGFibGVzO1xuICAgICAgICBjb3VudHMudmlld3MgPSB2aWV3cztcbiAgICAgICAgY291bnRzLm1hdGVyaWFsaXplZFZpZXdzID0gbWF0ZXJpYWxpemVkVmlld3M7XG4gICAgICAgIGNvdW50cy5jb2x1bW5zID0gY29sdW1ucztcbiAgICAgICAgY291bnRzLmluZGV4ZXMgPSBpbmRleGVzO1xuICAgICAgICBjb3VudHMuZm9yZWlnbktleXMgPSBmb3JlaWduS2V5cztcbiAgICAgICAgY291bnRzLmVudW1zID0gT2JqZWN0LmtleXMoaW50cm9zcGVjdGlvbi5lbnVtcykubGVuZ3RoO1xuICAgICAgICBjb3VudHMuYW5hbHl6ZWQgPSAwO1xuICAgIH0pO1xufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export declare const runLogin: () => Promise<void>;
2
+ //# sourceMappingURL=login.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.mts","sourceRoot":"./src/","sources":["app/login.mts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,IAAI,CAsD7C,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { render } from 'ink';
2
+ import { createElement, useState, useEffect } from 'react';
3
+ import { trpc, createAuthenticatedTRPCClient } from '../lib/trpc.mjs';
4
+ import { readConfig, writeConfig } from './config.mjs';
5
+ import { buildConnectURL } from './open-url.mjs';
6
+ import { detectHostname, detectOS, detectShell, detectUsername, } from './detect.mjs';
7
+ import { LoginView } from '../ui/components/Login.js';
8
+ import { logger } from '../logger.mjs';
9
+ const waitForToken = (loginId) => new Promise((resolve, reject) => {
10
+ const sub = trpc.cliLogin.onAuthorization.subscribe({ login_id: loginId }, {
11
+ onData: (data) => {
12
+ sub.unsubscribe();
13
+ resolve(data.token);
14
+ },
15
+ onError: (err) => {
16
+ sub.unsubscribe();
17
+ reject(err);
18
+ },
19
+ });
20
+ });
21
+ const LoginApp = ({ initialState, subscribe }) => {
22
+ const [state, setState] = useState(initialState);
23
+ useEffect(() => {
24
+ subscribe(setState);
25
+ }, [subscribe]);
26
+ return createElement(LoginView, { state });
27
+ };
28
+ export const runLogin = async () => {
29
+ let setState = () => { };
30
+ const subscribe = async (update) => {
31
+ setState = update;
32
+ };
33
+ const inkApp = render(createElement(LoginApp, {
34
+ initialState: { kind: 'creating' },
35
+ subscribe,
36
+ }));
37
+ try {
38
+ const config = await readConfig();
39
+ const { login_id } = await trpc.cliLogin.create.mutate({
40
+ username: detectUsername(),
41
+ hostname: detectHostname(),
42
+ os: detectOS(),
43
+ shell: detectShell(),
44
+ device_id: config.device_id,
45
+ });
46
+ const url = buildConnectURL(login_id);
47
+ setState({ kind: 'waiting', url });
48
+ const token = await waitForToken(login_id);
49
+ await writeConfig(token);
50
+ const authed = createAuthenticatedTRPCClient(() => Promise.resolve(token));
51
+ const account = await authed.account.getAccount.query({});
52
+ setState({
53
+ kind: 'connected',
54
+ email: account.emails[0] ?? null,
55
+ });
56
+ await new Promise((r) => setTimeout(r, 200));
57
+ inkApp.unmount();
58
+ process.exit(0);
59
+ }
60
+ catch (err) {
61
+ const message = err instanceof Error ? err.message : String(err);
62
+ logger.error(`login: ${message}`);
63
+ setState({ kind: 'error', message });
64
+ await new Promise((r) => setTimeout(r, 200));
65
+ inkApp.unmount();
66
+ process.exit(1);
67
+ }
68
+ };
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4ubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2xvZ2luLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sRUFBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUN6RCxPQUFPLEVBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDckQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxjQUFjLEVBQ2QsUUFBUSxFQUNSLFdBQVcsRUFDWCxjQUFjLEdBQ2pCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBQyxTQUFTLEVBQW1CLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyQyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWUsRUFBbUIsRUFBRSxDQUN0RCxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQy9DLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxFQUNuQjtRQUNJLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxHQUFH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LEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmVuZGVyfSBmcm9tICdpbmsnO1xuaW1wb3J0IHtjcmVhdGVFbGVtZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3RycGMsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRUUlBDQ2xpZW50fSBmcm9tICcuLi9saWIvdHJwYy5tanMnO1xuaW1wb3J0IHtyZWFkQ29uZmlnLCB3cml0ZUNvbmZpZ30gZnJvbSAnLi9jb25maWcubWpzJztcbmltcG9ydCB7YnVpbGRDb25uZWN0VVJMfSBmcm9tICcuL29wZW4tdXJsLm1qcyc7XG5pbXBvcnQge1xuICAgIGRldGVjdEhvc3RuYW1lLFxuICAgIGRldGVjdE9TLFxuICAgIGRldGVjdFNoZWxsLFxuICAgIGRldGVjdFVzZXJuYW1lLFxufSBmcm9tICcuL2RldGVjdC5tanMnO1xuaW1wb3J0IHtMb2dpblZpZXcsIHR5cGUgVExvZ2luU3RhdGV9IGZyb20gJy4uL3VpL2NvbXBvbmVudHMvTG9naW4uanMnO1xuaW1wb3J0IHtsb2dnZXJ9IGZyb20gJy4uL2xvZ2dlci5tanMnO1xuXG5jb25zdCB3YWl0Rm9yVG9rZW4gPSAobG9naW5JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+XG4gICAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YiA9IHRycGMuY2xpTG9naW4ub25BdXRob3JpemF0aW9uLnN1YnNjcmliZShcbiAgICAgICAgICAgIHtsb2dpbl9pZDogbG9naW5JZH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb25EYXRhOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLnRva2VuKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH0pO1xuXG50eXBlIFRMb2dpbkFwcFByb3BzID0ge1xuICAgIHJlYWRvbmx5IGluaXRpYWxTdGF0ZTogVExvZ2luU3RhdGU7XG4gICAgcmVhZG9ubHkgc3Vic2NyaWJlOiAoXG4gICAgICAgIHNldFN0YXRlOiAobmV4dDogVExvZ2luU3RhdGUpID0+IHZvaWQsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+O1xufTtcblxuY29uc3QgTG9naW5BcHAgPSAoe2luaXRpYWxTdGF0ZSwgc3Vic2NyaWJlfTogVExvZ2luQXBwUHJvcHMpID0+IHtcbiAgICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlPFRMb2dpblN0YXRlPihpbml0aWFsU3RhdGUpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlKHNldFN0YXRlKTtcbiAgICB9LCBbc3Vic2NyaWJlXSk7XG5cbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChMb2dpblZpZXcsIHtzdGF0ZX0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJ1bkxvZ2luID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGxldCBzZXRTdGF0ZTogKG5leHQ6IFRMb2dpblN0YXRlKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBjb25zdCBzdWJzY3JpYmUgPSBhc3luYyAoXG4gICAgICAgIHVwZGF0ZTogKG5leHQ6IFRMb2dpblN0YXRlKSA9PiB2b2lkLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBzZXRTdGF0ZSA9IHVwZGF0ZTtcbiAgICB9O1xuXG4gICAgY29uc3QgaW5rQXBwID0gcmVuZGVyKFxuICAgICAgICBjcmVhdGVFbGVtZW50KExvZ2luQXBwLCB7XG4gICAgICAgICAgICBpbml0aWFsU3RhdGU6IHtraW5kOiAnY3JlYXRpbmcnfSxcbiAgICAgICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWRDb25maWcoKTtcblxuICAgICAgICBjb25zdCB7bG9naW5faWR9ID0gYXdhaXQgdHJwYy5jbGlMb2dpbi5jcmVhdGUubXV0YXRlKHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBkZXRlY3RVc2VybmFtZSgpLFxuICAgICAgICAgICAgaG9zdG5hbWU6IGRldGVjdEhvc3RuYW1lKCksXG4gICAgICAgICAgICBvczogZGV0ZWN0T1MoKSxcbiAgICAgICAgICAgIHNoZWxsOiBkZXRlY3RTaGVsbCgpLFxuICAgICAgICAgICAgZGV2aWNlX2lkOiBjb25maWcuZGV2aWNlX2lkLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB1cmwgPSBidWlsZENvbm5lY3RVUkwobG9naW5faWQpO1xuICAgICAgICBzZXRTdGF0ZSh7a2luZDogJ3dhaXRpbmcnLCB1cmx9KTtcblxuICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHdhaXRGb3JUb2tlbihsb2dpbl9pZCk7XG4gICAgICAgIGF3YWl0IHdyaXRlQ29uZmlnKHRva2VuKTtcblxuICAgICAgICBjb25zdCBhdXRoZWQgPSBjcmVhdGVBdXRoZW50aWNhdGVkVFJQQ0NsaWVudCgoKSA9PlxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRva2VuKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGF1dGhlZC5hY2NvdW50LmdldEFjY291bnQucXVlcnkoe30pO1xuXG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb25uZWN0ZWQnLFxuICAgICAgICAgICAgZW1haWw6IGFjY291bnQuZW1haWxzWzBdID8/IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDIwMCkpO1xuICAgICAgICBpbmtBcHAudW5tb3VudCgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgbG9naW46ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgc2V0U3RhdGUoe2tpbmQ6ICdlcnJvcicsIG1lc3NhZ2V9KTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMjAwKSk7XG4gICAgICAgIGlua0FwcC51bm1vdW50KCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG59O1xuIl19
@@ -1,4 +1,6 @@
1
1
  export declare const shouldOpenBrowser: () => boolean;
2
2
  export declare const buildSessionURL: (sessionId: string) => string;
3
+ export declare const buildConnectURL: (loginId: string) => string;
4
+ export declare const openURL: (url: string) => Promise<void>;
3
5
  export declare const openSessionURL: (url: string) => Promise<void>;
4
6
  //# sourceMappingURL=open-url.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"open-url.d.mts","sourceRoot":"./src/","sources":["app/open-url.mts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,QAAO,OAQpC,CAAC;AAMF,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,KAAG,MACH,CAAC;AAElD,eAAO,MAAM,cAAc,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAW9D,CAAC"}
1
+ {"version":3,"file":"open-url.d.mts","sourceRoot":"./src/","sources":["app/open-url.mts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,QAAO,OAQpC,CAAC;AAUF,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,KAAG,MACH,CAAC;AAElD,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,MACL,CAAC;AAE9C,eAAO,MAAM,OAAO,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAWvD,CAAC;AAEF,eAAO,MAAM,cAAc,QAbQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAanB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { env } from 'process';
2
- import { DBCTX_DEV } from '#client/lib/env.mjs';
2
+ import { DBCTX_DEV } from '../lib/env.mjs';
3
3
  const SKIP_VALUES = new Set(['none', 'false', '0']);
4
4
  const isDocker = () => !!(env.DOCKER || env.container || env.DOCKER_CONTAINER);
5
5
  export const shouldOpenBrowser = () => {
@@ -12,8 +12,12 @@ export const shouldOpenBrowser = () => {
12
12
  const SESSION_BASE_URL = !DBCTX_DEV
13
13
  ? 'https://dbctx.io/authorize/session'
14
14
  : 'http://localhost:12002/authorize/session';
15
+ const CONNECT_BASE_URL = !DBCTX_DEV
16
+ ? 'https://dbctx.io/connect'
17
+ : 'http://localhost:12002/connect';
15
18
  export const buildSessionURL = (sessionId) => `${SESSION_BASE_URL}?session-id=${sessionId}`;
16
- export const openSessionURL = async (url) => {
19
+ export const buildConnectURL = (loginId) => `${CONNECT_BASE_URL}?login-id=${loginId}`;
20
+ export const openURL = async (url) => {
17
21
  if (!shouldOpenBrowser()) {
18
22
  return;
19
23
  }
@@ -25,4 +29,5 @@ export const openSessionURL = async (url) => {
25
29
  // Browser opening is best-effort — no-op on failure
26
30
  }
27
31
  };
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi11cmwubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL29wZW4tdXJsLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUVwRCxNQUFNLFFBQVEsR0FBRyxHQUFZLEVBQUUsQ0FDM0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQVksRUFBRTtJQUMzQyxJQUFJLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDYixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUUzQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsU0FBUztJQUMvQixDQUFDLENBQUMsb0NBQW9DO0lBQ3RDLENBQUMsQ0FBQywwQ0FBMEMsQ0FBQztBQUVqRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFpQixFQUFVLEVBQUUsQ0FDekQsR0FBRyxnQkFBZ0IsZUFBZSxTQUFTLEVBQUUsQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUFFLEdBQVcsRUFBaUIsRUFBRTtJQUMvRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU87SUFDWCxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsb0RBQW9EO0lBQ3hELENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Vudn0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQge0RCQ1RYX0RFVn0gZnJvbSAnI2NsaWVudC9saWIvZW52Lm1qcyc7XG5cbmNvbnN0IFNLSVBfVkFMVUVTID0gbmV3IFNldChbJ25vbmUnLCAnZmFsc2UnLCAnMCddKTtcblxuY29uc3QgaXNEb2NrZXIgPSAoKTogYm9vbGVhbiA9PlxuICAgICEhKGVudi5ET0NLRVIgfHwgZW52LmNvbnRhaW5lciB8fCBlbnYuRE9DS0VSX0NPTlRBSU5FUik7XG5cbmV4cG9ydCBjb25zdCBzaG91bGRPcGVuQnJvd3NlciA9ICgpOiBib29sZWFuID0+IHtcbiAgICBpZiAoaXNEb2NrZXIoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYnJvd3NlciA9IGVudi5CUk9XU0VSPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuICFicm93c2VyIHx8ICFTS0lQX1ZBTFVFUy5oYXMoYnJvd3Nlcik7XG59O1xuXG5jb25zdCBTRVNTSU9OX0JBU0VfVVJMID0gIURCQ1RYX0RFVlxuICAgID8gJ2h0dHBzOi8vZGJjdHguaW8vYXV0aG9yaXplL3Nlc3Npb24nXG4gICAgOiAnaHR0cDovL2xvY2FsaG9zdDoxMjAwMi9hdXRob3JpemUvc2Vzc2lvbic7XG5cbmV4cG9ydCBjb25zdCBidWlsZFNlc3Npb25VUkwgPSAoc2Vzc2lvbklkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgICBgJHtTRVNTSU9OX0JBU0VfVVJMfT9zZXNzaW9uLWlkPSR7c2Vzc2lvbklkfWA7XG5cbmV4cG9ydCBjb25zdCBvcGVuU2Vzc2lvblVSTCA9IGFzeW5jICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghc2hvdWxkT3BlbkJyb3dzZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RlZmF1bHQ6IG9wZW59ID0gYXdhaXQgaW1wb3J0KCdvcGVuJyk7XG4gICAgICAgIGF3YWl0IG9wZW4odXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQnJvd3NlciBvcGVuaW5nIGlzIGJlc3QtZWZmb3J0IOKAlCBuby1vcCBvbiBmYWlsdXJlXG4gICAgfVxufTtcbiJdfQ==
32
+ export const openSessionURL = openURL;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi11cmwubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL29wZW4tdXJsLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUVwRCxNQUFNLFFBQVEsR0FBRyxHQUFZLEVBQUUsQ0FDM0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQVksRUFBRTtJQUMzQyxJQUFJLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDYixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUUzQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsU0FBUztJQUMvQixDQUFDLENBQUMsb0NBQW9DO0lBQ3RDLENBQUMsQ0FBQywwQ0FBMEMsQ0FBQztBQUVqRCxNQUFNLGdCQUFnQixHQUFHLENBQUMsU0FBUztJQUMvQixDQUFDLENBQUMsMEJBQTBCO0lBQzVCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFpQixFQUFVLEVBQUUsQ0FDekQsR0FBRyxnQkFBZ0IsZUFBZSxTQUFTLEVBQUUsQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQVUsRUFBRSxDQUN2RCxHQUFHLGdCQUFnQixhQUFhLE9BQU8sRUFBRSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsR0FBVyxFQUFpQixFQUFFO0lBQ3hELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7UUFDdkIsT0FBTztJQUNYLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDTCxvREFBb0Q7SUFDeEQsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Vudn0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQge0RCQ1RYX0RFVn0gZnJvbSAnLi4vbGliL2Vudi5tanMnO1xuXG5jb25zdCBTS0lQX1ZBTFVFUyA9IG5ldyBTZXQoWydub25lJywgJ2ZhbHNlJywgJzAnXSk7XG5cbmNvbnN0IGlzRG9ja2VyID0gKCk6IGJvb2xlYW4gPT5cbiAgICAhIShlbnYuRE9DS0VSIHx8IGVudi5jb250YWluZXIgfHwgZW52LkRPQ0tFUl9DT05UQUlORVIpO1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkT3BlbkJyb3dzZXIgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKGlzRG9ja2VyKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGJyb3dzZXIgPSBlbnYuQlJPV1NFUj8udG9Mb3dlckNhc2UoKTtcblxuICAgIHJldHVybiAhYnJvd3NlciB8fCAhU0tJUF9WQUxVRVMuaGFzKGJyb3dzZXIpO1xufTtcblxuY29uc3QgU0VTU0lPTl9CQVNFX1VSTCA9ICFEQkNUWF9ERVZcbiAgICA/ICdodHRwczovL2RiY3R4LmlvL2F1dGhvcml6ZS9zZXNzaW9uJ1xuICAgIDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MTIwMDIvYXV0aG9yaXplL3Nlc3Npb24nO1xuXG5jb25zdCBDT05ORUNUX0JBU0VfVVJMID0gIURCQ1RYX0RFVlxuICAgID8gJ2h0dHBzOi8vZGJjdHguaW8vY29ubmVjdCdcbiAgICA6ICdodHRwOi8vbG9jYWxob3N0OjEyMDAyL2Nvbm5lY3QnO1xuXG5leHBvcnQgY29uc3QgYnVpbGRTZXNzaW9uVVJMID0gKHNlc3Npb25JZDogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgYCR7U0VTU0lPTl9CQVNFX1VSTH0/c2Vzc2lvbi1pZD0ke3Nlc3Npb25JZH1gO1xuXG5leHBvcnQgY29uc3QgYnVpbGRDb25uZWN0VVJMID0gKGxvZ2luSWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIGAke0NPTk5FQ1RfQkFTRV9VUkx9P2xvZ2luLWlkPSR7bG9naW5JZH1gO1xuXG5leHBvcnQgY29uc3Qgb3BlblVSTCA9IGFzeW5jICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghc2hvdWxkT3BlbkJyb3dzZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RlZmF1bHQ6IG9wZW59ID0gYXdhaXQgaW1wb3J0KCdvcGVuJyk7XG4gICAgICAgIGF3YWl0IG9wZW4odXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQnJvd3NlciBvcGVuaW5nIGlzIGJlc3QtZWZmb3J0IOKAlCBuby1vcCBvbiBmYWlsdXJlXG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IG9wZW5TZXNzaW9uVVJMID0gb3BlblVSTDtcbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import type { Pool } from 'pg';
2
+ import type { TDatabaseIntrospection } from '@dbctx/core';
3
+ import type { TStore } from '../store.mjs';
4
+ export type TSensitiveMask = Readonly<Record<string, readonly string[]>>;
5
+ export type TTableSampleColumn = {
6
+ readonly strategy: 'distinct' | 'random';
7
+ readonly count: number;
8
+ readonly values: readonly string[];
9
+ };
10
+ export type TTableSamples = {
11
+ readonly table: string;
12
+ readonly sampled_at: string;
13
+ readonly columns: Readonly<Record<string, TTableSampleColumn>>;
14
+ readonly excluded_columns: readonly string[];
15
+ };
16
+ export type TTableSampleEvent = {
17
+ readonly tableName: string;
18
+ readonly samples: TTableSamples;
19
+ };
20
+ export declare const loadSensitiveMask: (path: string) => Promise<TSensitiveMask>;
21
+ export declare const prepareOutputDir: (dirPath: string, allowOverwrite: boolean, store: TStore) => Promise<boolean>;
22
+ export declare const persistTableSamplesToDir: (outputDir: string, event: TTableSampleEvent, indexAccumulator: Record<string, string>) => Promise<void>;
23
+ export declare const runSampling: (pool: Pool, introspection: TDatabaseIntrospection, store: TStore, mask: TSensitiveMask, tableFilter?: ReadonlySet<string>) => AsyncGenerator<TTableSampleEvent>;
24
+ //# sourceMappingURL=sample.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sample.d.mts","sourceRoot":"./src/","sources":["app/sample.mts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAC7B,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAazC,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,QAAQ,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;CACnC,CAAC;AAkFF,eAAO,MAAM,iBAAiB,GAC1B,MAAM,MAAM,KACb,OAAO,CAAC,cAAc,CAIxB,CAAC;AAmBF,eAAO,MAAM,gBAAgB,GACzB,SAAS,MAAM,EACf,gBAAgB,OAAO,EACvB,OAAO,MAAM,KACd,OAAO,CAAC,OAAO,CAsDjB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACjC,WAAW,MAAM,EACjB,OAAO,iBAAiB,EACxB,kBAAkB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KACzC,OAAO,CAAC,IAAI,CAcd,CAAC;AAEF,eAAO,MAAM,WAAW,GACpB,MAAM,IAAI,EACV,eAAe,sBAAsB,EACrC,OAAO,MAAM,EACb,MAAM,cAAc,EACpB,cAAc,WAAW,CAAC,MAAM,CAAC,KAClC,cAAc,CAAC,iBAAiB,CA0LlC,CAAC"}
@@ -0,0 +1,257 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile, mkdir, readdir, stat } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import PQueue from 'p-queue';
5
+ import { runInAction, when } from 'mobx';
6
+ import { z } from 'zod';
7
+ import { atomicWriteFile, recoverAtomicWritesInDir, } from '../lib/atomic-write.mjs';
8
+ import { sampleColumn, sampleCompositeSubField, fetchCompositeSubFields, } from '../db/index.mjs';
9
+ const SAMPLEABLE_TYPE_PREFIXES = Object.freeze([
10
+ 'text',
11
+ 'character',
12
+ 'citext',
13
+ 'integer',
14
+ 'bigint',
15
+ 'smallint',
16
+ 'numeric',
17
+ 'decimal',
18
+ 'real',
19
+ 'double precision',
20
+ 'boolean',
21
+ 'date',
22
+ 'timestamp',
23
+ 'time with',
24
+ 'time without',
25
+ 'interval',
26
+ 'uuid',
27
+ 'json',
28
+ 'money',
29
+ 'inet',
30
+ 'cidr',
31
+ ]);
32
+ const TEXTUAL_TYPE_PREFIXES = Object.freeze([
33
+ 'text',
34
+ 'character',
35
+ 'citext',
36
+ 'json',
37
+ ]);
38
+ const MAX_TEXT_LENGTH = 512;
39
+ const SAMPLING_CONCURRENCY = 8;
40
+ const sensitiveMaskSchema = z.record(z.string(), z.array(z.string()));
41
+ const matchesPrefix = (dataType, prefixes) => {
42
+ const lower = dataType.toLowerCase();
43
+ return prefixes.some((prefix) => lower.startsWith(prefix));
44
+ };
45
+ const isSampleableScalar = (dataType) => matchesPrefix(dataType, SAMPLEABLE_TYPE_PREFIXES);
46
+ const isArrayType = (dataType) => dataType.endsWith('[]') || dataType.toLowerCase().startsWith('array');
47
+ const getArrayElementType = (dataType) => dataType.endsWith('[]') ? dataType.slice(0, -2) : dataType;
48
+ const resolveEnumValues = (dataType, enums) => {
49
+ if (enums[dataType]) {
50
+ return enums[dataType].values;
51
+ }
52
+ if (isArrayType(dataType)) {
53
+ const el = getArrayElementType(dataType);
54
+ if (enums[el]) {
55
+ return enums[el].values;
56
+ }
57
+ }
58
+ return null;
59
+ };
60
+ const isTextualType = (dataType) => matchesPrefix(dataType, TEXTUAL_TYPE_PREFIXES);
61
+ const truncateValue = (value, dataType) => isTextualType(dataType) && value.length > MAX_TEXT_LENGTH
62
+ ? value.slice(0, MAX_TEXT_LENGTH) + '...'
63
+ : value;
64
+ const hashTableName = (name) => createHash('sha256').update(name).digest('hex');
65
+ export const loadSensitiveMask = async (path) => {
66
+ const raw = await readFile(path, 'utf-8');
67
+ const parsed = JSON.parse(raw);
68
+ return sensitiveMaskSchema.parse(parsed);
69
+ };
70
+ const isSampleableType = (dataType, enumNames) => {
71
+ if (isSampleableScalar(dataType)) {
72
+ return true;
73
+ }
74
+ if (enumNames.has(dataType)) {
75
+ return true;
76
+ }
77
+ if (isArrayType(dataType)) {
78
+ const elementType = getArrayElementType(dataType);
79
+ return isSampleableScalar(elementType) || enumNames.has(elementType);
80
+ }
81
+ return false;
82
+ };
83
+ export const prepareOutputDir = async (dirPath, allowOverwrite, store) => {
84
+ try {
85
+ const dirStat = await stat(dirPath).catch(() => null);
86
+ if (dirStat !== null && !dirStat.isDirectory()) {
87
+ runInAction(() => {
88
+ store.steps.sampling.state = 'error';
89
+ store.steps.sampling.error = `--output-samples path "${dirPath}" exists but is not a directory`;
90
+ });
91
+ return false;
92
+ }
93
+ if (dirStat === null) {
94
+ await mkdir(dirPath, { recursive: true });
95
+ runInAction(() => {
96
+ store.steps.sampling.outputDir = dirPath;
97
+ });
98
+ return true;
99
+ }
100
+ await recoverAtomicWritesInDir(dirPath);
101
+ const entries = await readdir(dirPath);
102
+ if (entries.length > 0 && !allowOverwrite) {
103
+ runInAction(() => {
104
+ store.steps.sampling.state = 'prompting-overwrite';
105
+ store.steps.sampling.outputDir = dirPath;
106
+ });
107
+ await when(() => store.steps.sampling.confirmed !== null);
108
+ if (!store.steps.sampling.confirmed) {
109
+ runInAction(() => {
110
+ store.steps.sampling.state = 'done';
111
+ });
112
+ return false;
113
+ }
114
+ }
115
+ runInAction(() => {
116
+ store.steps.sampling.outputDir = dirPath;
117
+ });
118
+ return true;
119
+ }
120
+ catch (err) {
121
+ runInAction(() => {
122
+ store.steps.sampling.state = 'error';
123
+ store.steps.sampling.error =
124
+ err instanceof Error
125
+ ? `Failed to prepare output directory: ${err.message}`
126
+ : String(err);
127
+ });
128
+ return false;
129
+ }
130
+ };
131
+ export const persistTableSamplesToDir = async (outputDir, event, indexAccumulator) => {
132
+ const fileName = `${hashTableName(event.tableName)}.json`;
133
+ await atomicWriteFile(join(outputDir, fileName), JSON.stringify(event.samples, null, 2));
134
+ indexAccumulator[event.tableName] = fileName;
135
+ await atomicWriteFile(join(outputDir, 'index.json'), JSON.stringify(indexAccumulator, null, 2));
136
+ };
137
+ export const runSampling = async function* (pool, introspection, store, mask, tableFilter) {
138
+ const enumNames = new Set(Object.keys(introspection.enums));
139
+ const relationEntries = Object.entries(introspection.relations).filter(([name]) => (tableFilter ? tableFilter.has(name) : true));
140
+ runInAction(() => {
141
+ store.steps.sampling.state = 'fetching';
142
+ store.steps.sampling.counts.totalTables = relationEntries.length;
143
+ });
144
+ const queue = new PQueue({ concurrency: SAMPLING_CONCURRENCY });
145
+ for (const [tableName, relation] of relationEntries) {
146
+ const maskedColumns = mask[tableName] ?? [];
147
+ const maskedSet = new Set(maskedColumns);
148
+ const attributes = Object.values(relation.attributes);
149
+ const relationKind = relation.kind;
150
+ const estimatedRowCount = relation.estimated_row_count ?? 0;
151
+ const workItems = [];
152
+ let skipped = 0;
153
+ for (const attr of attributes) {
154
+ if (maskedSet.has(attr.name)) {
155
+ skipped += 1;
156
+ continue;
157
+ }
158
+ const dataType = attr.data_type;
159
+ if (isSampleableType(dataType, enumNames)) {
160
+ workItems.push({
161
+ columnName: attr.name,
162
+ dataType,
163
+ estimatedDistinct: 'estimated_distinct' in attr
164
+ ? attr.estimated_distinct
165
+ : 0,
166
+ composite: null,
167
+ enumValues: resolveEnumValues(dataType, introspection.enums),
168
+ });
169
+ }
170
+ else if (!isArrayType(dataType) &&
171
+ !isSampleableScalar(dataType) &&
172
+ !enumNames.has(dataType)) {
173
+ // Potential composite type — introspect sub-fields
174
+ const subFields = await fetchCompositeSubFields(pool, dataType);
175
+ if (subFields.length > 0) {
176
+ for (const sf of subFields) {
177
+ if (maskedSet.has(sf.name)) {
178
+ skipped += 1;
179
+ continue;
180
+ }
181
+ if (isSampleableType(sf.data_type, enumNames)) {
182
+ workItems.push({
183
+ columnName: `${attr.name}.${sf.name}`,
184
+ dataType: sf.data_type,
185
+ estimatedDistinct: 0,
186
+ composite: {
187
+ columnName: attr.name,
188
+ subFieldName: sf.name,
189
+ },
190
+ enumValues: resolveEnumValues(sf.data_type, introspection.enums),
191
+ });
192
+ }
193
+ else {
194
+ skipped += 1;
195
+ }
196
+ }
197
+ }
198
+ else {
199
+ skipped += 1;
200
+ }
201
+ }
202
+ else {
203
+ skipped += 1;
204
+ }
205
+ }
206
+ runInAction(() => {
207
+ store.steps.sampling.counts.totalColumns += workItems.length;
208
+ store.steps.sampling.counts.skippedColumns += skipped;
209
+ });
210
+ const columnResults = (await Promise.all(workItems.map((item) => {
211
+ if (item.enumValues) {
212
+ runInAction(() => {
213
+ store.steps.sampling.counts.sampledColumns += 1;
214
+ });
215
+ const columnName = item.composite
216
+ ? `${item.composite.columnName}.${item.composite.subFieldName}`
217
+ : item.columnName;
218
+ return Promise.resolve({
219
+ column_name: columnName,
220
+ strategy: 'distinct',
221
+ values: item.enumValues,
222
+ });
223
+ }
224
+ return queue.add(async () => {
225
+ const result = item.composite
226
+ ? await sampleCompositeSubField(pool, tableName, item.composite.columnName, item.composite.subFieldName, item.estimatedDistinct, estimatedRowCount, relationKind)
227
+ : await sampleColumn(pool, tableName, item.columnName, item.estimatedDistinct, estimatedRowCount, relationKind);
228
+ runInAction(() => {
229
+ store.steps.sampling.counts.sampledColumns += 1;
230
+ });
231
+ return result;
232
+ });
233
+ })));
234
+ const columns = Object.fromEntries(columnResults.map((sample) => [
235
+ sample.column_name,
236
+ {
237
+ strategy: sample.strategy,
238
+ count: sample.values.length,
239
+ values: sample.values.map((v) => truncateValue(v, workItems.find((w) => w.columnName === sample.column_name)?.dataType ?? '')),
240
+ },
241
+ ]));
242
+ const tableSamples = {
243
+ table: tableName,
244
+ sampled_at: new Date().toISOString(),
245
+ columns,
246
+ excluded_columns: maskedColumns,
247
+ };
248
+ yield { tableName, samples: tableSamples };
249
+ runInAction(() => {
250
+ store.steps.sampling.counts.completedTables += 1;
251
+ });
252
+ }
253
+ runInAction(() => {
254
+ store.steps.sampling.state = 'done';
255
+ });
256
+ };
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtcGxlLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9zYW1wbGUubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdkMsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFL0IsT0FBTyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxDQUFDLEVBQUMsTUFBTSxLQUFLLENBQUM7QUFLdEIsT0FBTyxFQUNILGVBQWUsRUFDZix3QkFBd0IsR0FDM0IsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0gsWUFBWSxFQUNaLHVCQUF1QixFQUN2Qix1QkFBdUIsR0FHMUIsTUFBTSxpQkFBaUIsQ0FBQztBQXNCekIsTUFBTSx3QkFBd0IsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM5RCxNQUFNO0lBQ04sV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07SUFDTixrQkFBa0I7SUFDbEIsU0FBUztJQUNULE1BQU07SUFDTixXQUFXO0lBQ1gsV0FBVztJQUNYLGNBQWM7SUFDZCxVQUFVO0lBQ1YsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07Q0FDQSxDQUFDLENBQUM7QUFFWixNQUFNLHFCQUFxQixHQUFzQixNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNELE1BQU07SUFDTixXQUFXO0lBQ1gsUUFBUTtJQUNSLE1BQU07Q0FDQSxDQUFDLENBQUM7QUFFWixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDNUIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFdEUsTUFBTSxhQUFhLEdBQUcsQ0FDbEIsUUFBZ0IsRUFDaEIsUUFBMkIsRUFDcEIsRUFBRTtJQUNULE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUM7QUFFRixNQUFNLGtCQUFrQixHQUFHLENBQUMsUUFBZ0IsRUFBVyxFQUFFLENBQ3JELGFBQWEsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztBQUV0RCxNQUFNLFdBQVcsR0FBRyxDQUFDLFFBQWdCLEVBQVcsRUFBRSxDQUM5QyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFMUUsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLFFBQWdCLEVBQVUsRUFBRSxDQUNyRCxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFFL0QsTUFBTSxpQkFBaUIsR0FBRyxDQUN0QixRQUFnQixFQUNoQixLQUFzQyxFQUNkLEVBQUU7SUFDMUIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxFQUFFLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNaLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM1QixDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBZ0IsRUFBVyxFQUFFLENBQ2hELGFBQWEsQ0FBQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUVuRCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWEsRUFBRSxRQUFnQixFQUFVLEVBQUUsQ0FDOUQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsZUFBZTtJQUNyRCxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLEdBQUcsS0FBSztJQUN6QyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBRWhCLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBWSxFQUFVLEVBQUUsQ0FDM0MsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFcEQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUNsQyxJQUFZLEVBQ1csRUFBRTtJQUN6QixNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQVksQ0FBQztJQUMxQyxPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QyxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQ3JCLFFBQWdCLEVBQ2hCLFNBQThCLEVBQ3ZCLEVBQUU7SUFDVCxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxFQUNqQyxPQUFlLEVBQ2YsY0FBdUIsRUFDdkIsS0FBYSxFQUNHLEVBQUU7SUFDbEIsSUFBSSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRELElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQzdDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQkFDckMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLDBCQUEwQixPQUFPLGlDQUFpQyxDQUFDO1lBQ3BHLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25CLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1lBQ3hDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QyxXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQztnQkFDbkQsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUUxRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2xDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxLQUFLLENBQUM7WUFDakIsQ0FBQztRQUNMLENBQUM7UUFFRCxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ1gsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7WUFDckMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSztnQkFDdEIsR0FBRyxZQUFZLEtBQUs7b0JBQ2hCLENBQUMsQ0FBQyx1Q0FBdUMsR0FBRyxDQUFDLE9BQU8sRUFBRTtvQkFDdEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxLQUFLLEVBQ3pDLFNBQWlCLEVBQ2pCLEtBQXdCLEVBQ3hCLGdCQUF3QyxFQUMzQixFQUFFO0lBQ2YsTUFBTSxRQUFRLEdBQUcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFFMUQsTUFBTSxlQUFlLENBQ2pCLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3pDLENBQUM7SUFFRixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBRTdDLE1BQU0sZUFBZSxDQUNqQixJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDNUMsQ0FBQztBQUNOLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxLQUFLLFNBQVMsQ0FBQyxFQUN0QyxJQUFVLEVBQ1YsYUFBcUMsRUFDckMsS0FBYSxFQUNiLElBQW9CLEVBQ3BCLFdBQWlDO0lBRWpDLE1BQU0sU0FBUyxHQUF3QixJQUFJLEdBQUcsQ0FDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQ25DLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQ2xFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUMzRCxDQUFDO0lBRUYsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7UUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBQyxXQUFXLEVBQUUsb0JBQW9CLEVBQUMsQ0FBQyxDQUFDO0lBRTlELEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNsRCxNQUFNLGFBQWEsR0FBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBcUIsQ0FBQztRQUVwRCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUM7UUFhNUQsTUFBTSxTQUFTLEdBQWdCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFaEIsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM1QixJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLENBQUM7Z0JBQ2IsU0FBUztZQUNiLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBRWhDLElBQUksZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNyQixRQUFRO29CQUNSLGlCQUFpQixFQUNiLG9CQUFvQixJQUFJLElBQUk7d0JBQ3hCLENBQUMsQ0FBRSxJQUFJLENBQUMsa0JBQTZCO3dCQUNyQyxDQUFDLENBQUMsQ0FBQztvQkFDWCxTQUFTLEVBQUUsSUFBSTtvQkFDZixVQUFVLEVBQUUsaUJBQWlCLENBQ3pCLFFBQVEsRUFDUixhQUFhLENBQUMsS0FBSyxDQUN0QjtpQkFDSixDQUFDLENBQUM7WUFDUCxDQUFDO2lCQUFNLElBQ0gsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO2dCQUN0QixDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztnQkFDN0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUMxQixDQUFDO2dCQUNDLG1EQUFtRDtnQkFDbkQsTUFBTSxTQUFTLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBRWhFLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxNQUFNLEVBQUUsSUFBSSxTQUFTLEVBQUUsQ0FBQzt3QkFDekIsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUN6QixPQUFPLElBQUksQ0FBQyxDQUFDOzRCQUNiLFNBQVM7d0JBQ2IsQ0FBQzt3QkFFRCxJQUFJLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQzs0QkFDNUMsU0FBUyxDQUFDLElBQUksQ0FBQztnQ0FDWCxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUU7Z0NBQ3JDLFFBQVEsRUFBRSxFQUFFLENBQUMsU0FBUztnQ0FDdEIsaUJBQWlCLEVBQUUsQ0FBQztnQ0FDcEIsU0FBUyxFQUFFO29DQUNQLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtvQ0FDckIsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJO2lDQUN4QjtnQ0FDRCxVQUFVLEVBQUUsaUJBQWlCLENBQ3pCLEVBQUUsQ0FBQyxTQUFTLEVBQ1osYUFBYSxDQUFDLEtBQUssQ0FDdEI7NkJBQ0osQ0FBQyxDQUFDO3dCQUNQLENBQUM7NkJBQU0sQ0FBQzs0QkFDSixPQUFPLElBQUksQ0FBQyxDQUFDO3dCQUNqQixDQUFDO29CQUNMLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE9BQU8sSUFBSSxDQUFDLENBQUM7Z0JBQ2pCLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxJQUFJLENBQUMsQ0FBQztZQUNqQixDQUFDO1FBQ0wsQ0FBQztRQUVELFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDYixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDN0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxPQUFPLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGFBQWEsR0FBb0IsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3JELFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsV0FBVyxDQUFDLEdBQUcsRUFBRTtvQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVM7b0JBQzdCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO29CQUMvRCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDdEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFnQjtvQkFDbEMsV0FBVyxFQUFFLFVBQVU7b0JBQ3ZCLFFBQVEsRUFBRSxVQUFVO29CQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7aUJBQzFCLENBQUMsQ0FBQztZQUNQLENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTO29CQUN6QixDQUFDLENBQUMsTUFBTSx1QkFBdUIsQ0FDekIsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQzNCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsaUJBQWlCLEVBQ2pCLFlBQVksQ0FDZjtvQkFDSCxDQUFDLENBQUMsTUFBTSxZQUFZLENBQ2QsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsaUJBQWlCLEVBQ2pCLFlBQVksQ0FDZixDQUFDO2dCQUVSLFdBQVcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxDQUFDO2dCQUVILE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQ0wsQ0FBb0IsQ0FBQztRQUV0QixNQUFNLE9BQU8sR0FBdUMsTUFBTSxDQUFDLFdBQVcsQ0FDbEUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLFdBQVc7WUFDbEI7Z0JBQ0ksUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2dCQUMzQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1QixhQUFhLENBQ1QsQ0FBQyxFQUNELFNBQVMsQ0FBQyxJQUFJLENBQ1YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLFdBQVcsQ0FDN0MsRUFBRSxRQUFRLElBQUksRUFBRSxDQUNwQixDQUNKO2FBQ0o7U0FDSixDQUFDLENBQ0wsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFrQjtZQUNoQyxLQUFLLEVBQUUsU0FBUztZQUNoQixVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDcEMsT0FBTztZQUNQLGdCQUFnQixFQUFFLGFBQWE7U0FDbEMsQ0FBQztRQUVGLE1BQU0sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBQyxDQUFDO1FBRXpDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDYixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtyZWFkRmlsZSwgbWtkaXIsIHJlYWRkaXIsIHN0YXR9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtqb2lufSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgUFF1ZXVlIGZyb20gJ3AtcXVldWUnO1xuaW1wb3J0IHtydW5JbkFjdGlvbiwgd2hlbn0gZnJvbSAnbW9ieCc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuaW1wb3J0IHR5cGUge1REYXRhYmFzZUludHJvc3BlY3Rpb259IGZyb20gJ0BkYmN0eC9jb3JlJztcblxuaW1wb3J0IHR5cGUge1RTdG9yZX0gZnJvbSAnLi4vc3RvcmUubWpzJztcbmltcG9ydCB7XG4gICAgYXRvbWljV3JpdGVGaWxlLFxuICAgIHJlY292ZXJBdG9taWNXcml0ZXNJbkRpcixcbn0gZnJvbSAnLi4vbGliL2F0b21pYy13cml0ZS5tanMnO1xuaW1wb3J0IHtcbiAgICBzYW1wbGVDb2x1bW4sXG4gICAgc2FtcGxlQ29tcG9zaXRlU3ViRmllbGQsXG4gICAgZmV0Y2hDb21wb3NpdGVTdWJGaWVsZHMsXG4gICAgdHlwZSBUQ29sdW1uU2FtcGxlLFxuICAgIHR5cGUgVFJlbGF0aW9uS2luZCxcbn0gZnJvbSAnLi4vZGIvaW5kZXgubWpzJztcblxuZXhwb3J0IHR5cGUgVFNlbnNpdGl2ZU1hc2sgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+O1xuXG5leHBvcnQgdHlwZSBUVGFibGVTYW1wbGVDb2x1bW4gPSB7XG4gICAgcmVhZG9ubHkgc3RyYXRlZ3k6ICdkaXN0aW5jdCcgfCAncmFuZG9tJztcbiAgICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHZhbHVlczogcmVhZG9ubHkgc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBUVGFibGVTYW1wbGVzID0ge1xuICAgIHJlYWRvbmx5IHRhYmxlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2FtcGxlZF9hdDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFRUYWJsZVNhbXBsZUNvbHVtbj4+O1xuICAgIHJlYWRvbmx5IGV4Y2x1ZGVkX2NvbHVtbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgVFRhYmxlU2FtcGxlRXZlbnQgPSB7XG4gICAgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2FtcGxlczogVFRhYmxlU2FtcGxlcztcbn07XG5cbmNvbnN0IFNBTVBMRUFCTEVfVFlQRV9QUkVGSVhFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBPYmplY3QuZnJlZXplKFtcbiAgICAndGV4dCcsXG4gICAgJ2NoYXJhY3RlcicsXG4gICAgJ2NpdGV4dCcsXG4gICAgJ2ludGVnZXInLFxuICAgICdiaWdpbnQnLFxuICAgICdzbWFsbGludCcsXG4gICAgJ251bWVyaWMnLFxuICAgICdkZWNpbWFsJyxcbiAgICAncmVhbCcsXG4gICAgJ2RvdWJsZSBwcmVjaXNpb24nLFxuICAgICdib29sZWFuJyxcbiAgICAnZGF0ZScsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ3RpbWUgd2l0aCcsXG4gICAgJ3RpbWUgd2l0aG91dCcsXG4gICAgJ2ludGVydmFsJyxcbiAgICAndXVpZCcsXG4gICAgJ2pzb24nLFxuICAgICdtb25leScsXG4gICAgJ2luZXQnLFxuICAgICdjaWRyJyxcbl0gYXMgY29uc3QpO1xuXG5jb25zdCBURVhUVUFMX1RZUEVfUFJFRklYRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gT2JqZWN0LmZyZWV6ZShbXG4gICAgJ3RleHQnLFxuICAgICdjaGFyYWN0ZXInLFxuICAgICdjaXRleHQnLFxuICAgICdqc29uJyxcbl0gYXMgY29uc3QpO1xuXG5jb25zdCBNQVhfVEVYVF9MRU5HVEggPSA1MTI7XG5jb25zdCBTQU1QTElOR19DT05DVVJSRU5DWSA9IDg7XG5cbmNvbnN0IHNlbnNpdGl2ZU1hc2tTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpKTtcblxuY29uc3QgbWF0Y2hlc1ByZWZpeCA9IChcbiAgICBkYXRhVHlwZTogc3RyaW5nLFxuICAgIHByZWZpeGVzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGxvd2VyID0gZGF0YVR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gcHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiBsb3dlci5zdGFydHNXaXRoKHByZWZpeCkpO1xufTtcblxuY29uc3QgaXNTYW1wbGVhYmxlU2NhbGFyID0gKGRhdGFUeXBlOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgbWF0Y2hlc1ByZWZpeChkYXRhVHlwZSwgU0FNUExFQUJMRV9UWVBFX1BSRUZJWEVTKTtcblxuY29uc3QgaXNBcnJheVR5cGUgPSAoZGF0YVR5cGU6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBkYXRhVHlwZS5lbmRzV2l0aCgnW10nKSB8fCBkYXRhVHlwZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2FycmF5Jyk7XG5cbmNvbnN0IGdldEFycmF5RWxlbWVudFR5cGUgPSAoZGF0YVR5cGU6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIGRhdGFUeXBlLmVuZHNXaXRoKCdbXScpID8gZGF0YVR5cGUuc2xpY2UoMCwgLTIpIDogZGF0YVR5cGU7XG5cbmNvbnN0IHJlc29sdmVFbnVtVmFsdWVzID0gKFxuICAgIGRhdGFUeXBlOiBzdHJpbmcsXG4gICAgZW51bXM6IFREYXRhYmFzZUludHJvc3BlY3Rpb25bJ2VudW1zJ10sXG4pOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgPT4ge1xuICAgIGlmIChlbnVtc1tkYXRhVHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIGVudW1zW2RhdGFUeXBlXS52YWx1ZXM7XG4gICAgfVxuICAgIGlmIChpc0FycmF5VHlwZShkYXRhVHlwZSkpIHtcbiAgICAgICAgY29uc3QgZWwgPSBnZXRBcnJheUVsZW1lbnRUeXBlKGRhdGFUeXBlKTtcbiAgICAgICAgaWYgKGVudW1zW2VsXSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudW1zW2VsXS52YWx1ZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBpc1RleHR1YWxUeXBlID0gKGRhdGFUeXBlOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgbWF0Y2hlc1ByZWZpeChkYXRhVHlwZSwgVEVYVFVBTF9UWVBFX1BSRUZJWEVTKTtcblxuY29uc3QgdHJ1bmNhdGVWYWx1ZSA9ICh2YWx1ZTogc3RyaW5nLCBkYXRhVHlwZTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgaXNUZXh0dWFsVHlwZShkYXRhVHlwZSkgJiYgdmFsdWUubGVuZ3RoID4gTUFYX1RFWFRfTEVOR1RIXG4gICAgICAgID8gdmFsdWUuc2xpY2UoMCwgTUFYX1RFWFRfTEVOR1RIKSArICcuLi4nXG4gICAgICAgIDogdmFsdWU7XG5cbmNvbnN0IGhhc2hUYWJsZU5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKG5hbWUpLmRpZ2VzdCgnaGV4Jyk7XG5cbmV4cG9ydCBjb25zdCBsb2FkU2Vuc2l0aXZlTWFzayA9IGFzeW5jIChcbiAgICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPFRTZW5zaXRpdmVNYXNrPiA9PiB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIHVua25vd247XG4gICAgcmV0dXJuIHNlbnNpdGl2ZU1hc2tTY2hlbWEucGFyc2UocGFyc2VkKTtcbn07XG5cbmNvbnN0IGlzU2FtcGxlYWJsZVR5cGUgPSAoXG4gICAgZGF0YVR5cGU6IHN0cmluZyxcbiAgICBlbnVtTmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4pOiBib29sZWFuID0+IHtcbiAgICBpZiAoaXNTYW1wbGVhYmxlU2NhbGFyKGRhdGFUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVudW1OYW1lcy5oYXMoZGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheVR5cGUoZGF0YVR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZ2V0QXJyYXlFbGVtZW50VHlwZShkYXRhVHlwZSk7XG4gICAgICAgIHJldHVybiBpc1NhbXBsZWFibGVTY2FsYXIoZWxlbWVudFR5cGUpIHx8IGVudW1OYW1lcy5oYXMoZWxlbWVudFR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlcGFyZU91dHB1dERpciA9IGFzeW5jIChcbiAgICBkaXJQYXRoOiBzdHJpbmcsXG4gICAgYWxsb3dPdmVyd3JpdGU6IGJvb2xlYW4sXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpclN0YXQgPSBhd2FpdCBzdGF0KGRpclBhdGgpLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgIGlmIChkaXJTdGF0ICE9PSBudWxsICYmICFkaXJTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuZXJyb3IgPSBgLS1vdXRwdXQtc2FtcGxlcyBwYXRoIFwiJHtkaXJQYXRofVwiIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5YDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpclN0YXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpclBhdGgsIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5vdXRwdXREaXIgPSBkaXJQYXRoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHJlY292ZXJBdG9taWNXcml0ZXNJbkRpcihkaXJQYXRoKTtcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJQYXRoKTtcblxuICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmICFhbGxvd092ZXJ3cml0ZSkge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNhbXBsaW5nLnN0YXRlID0gJ3Byb21wdGluZy1vdmVyd3JpdGUnO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNhbXBsaW5nLm91dHB1dERpciA9IGRpclBhdGg7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgd2hlbigoKSA9PiBzdG9yZS5zdGVwcy5zYW1wbGluZy5jb25maXJtZWQgIT09IG51bGwpO1xuXG4gICAgICAgICAgICBpZiAoIXN0b3JlLnN0ZXBzLnNhbXBsaW5nLmNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuc3RhdGUgPSAnZG9uZSc7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcub3V0cHV0RGlyID0gZGlyUGF0aDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5lcnJvciA9XG4gICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgPyBgRmFpbGVkIHRvIHByZXBhcmUgb3V0cHV0IGRpcmVjdG9yeTogJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHBlcnNpc3RUYWJsZVNhbXBsZXNUb0RpciA9IGFzeW5jIChcbiAgICBvdXRwdXREaXI6IHN0cmluZyxcbiAgICBldmVudDogVFRhYmxlU2FtcGxlRXZlbnQsXG4gICAgaW5kZXhBY2N1bXVsYXRvcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7aGFzaFRhYmxlTmFtZShldmVudC50YWJsZU5hbWUpfS5qc29uYDtcblxuICAgIGF3YWl0IGF0b21pY1dyaXRlRmlsZShcbiAgICAgICAgam9pbihvdXRwdXREaXIsIGZpbGVOYW1lKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXZlbnQuc2FtcGxlcywgbnVsbCwgMiksXG4gICAgKTtcblxuICAgIGluZGV4QWNjdW11bGF0b3JbZXZlbnQudGFibGVOYW1lXSA9IGZpbGVOYW1lO1xuXG4gICAgYXdhaXQgYXRvbWljV3JpdGVGaWxlKFxuICAgICAgICBqb2luKG91dHB1dERpciwgJ2luZGV4Lmpzb24nKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW5kZXhBY2N1bXVsYXRvciwgbnVsbCwgMiksXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBydW5TYW1wbGluZyA9IGFzeW5jIGZ1bmN0aW9uKiAoXG4gICAgcG9vbDogUG9vbCxcbiAgICBpbnRyb3NwZWN0aW9uOiBURGF0YWJhc2VJbnRyb3NwZWN0aW9uLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgbWFzazogVFNlbnNpdGl2ZU1hc2ssXG4gICAgdGFibGVGaWx0ZXI/OiBSZWFkb25seVNldDxzdHJpbmc+LFxuKTogQXN5bmNHZW5lcmF0b3I8VFRhYmxlU2FtcGxlRXZlbnQ+IHtcbiAgICBjb25zdCBlbnVtTmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFxuICAgICAgICBPYmplY3Qua2V5cyhpbnRyb3NwZWN0aW9uLmVudW1zKSxcbiAgICApO1xuXG4gICAgY29uc3QgcmVsYXRpb25FbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoaW50cm9zcGVjdGlvbi5yZWxhdGlvbnMpLmZpbHRlcihcbiAgICAgICAgKFtuYW1lXSkgPT4gKHRhYmxlRmlsdGVyID8gdGFibGVGaWx0ZXIuaGFzKG5hbWUpIDogdHJ1ZSksXG4gICAgKTtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuc3RhdGUgPSAnZmV0Y2hpbmcnO1xuICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5jb3VudHMudG90YWxUYWJsZXMgPSByZWxhdGlvbkVudHJpZXMubGVuZ3RoO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcXVldWUgPSBuZXcgUFF1ZXVlKHtjb25jdXJyZW5jeTogU0FNUExJTkdfQ09OQ1VSUkVOQ1l9KTtcblxuICAgIGZvciAoY29uc3QgW3RhYmxlTmFtZSwgcmVsYXRpb25dIG9mIHJlbGF0aW9uRW50cmllcykge1xuICAgICAgICBjb25zdCBtYXNrZWRDb2x1bW5zOiByZWFkb25seSBzdHJpbmdbXSA9IG1hc2tbdGFibGVOYW1lXSA/PyBbXTtcbiAgICAgICAgY29uc3QgbWFza2VkU2V0ID0gbmV3IFNldChtYXNrZWRDb2x1bW5zKTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC52YWx1ZXMocmVsYXRpb24uYXR0cmlidXRlcyk7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uS2luZCA9IHJlbGF0aW9uLmtpbmQgYXMgVFJlbGF0aW9uS2luZDtcblxuICAgICAgICBjb25zdCBlc3RpbWF0ZWRSb3dDb3VudCA9IHJlbGF0aW9uLmVzdGltYXRlZF9yb3dfY291bnQgPz8gMDtcblxuICAgICAgICB0eXBlIFRXb3JrSXRlbSA9IHtcbiAgICAgICAgICAgIHJlYWRvbmx5IGNvbHVtbk5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlYWRvbmx5IGRhdGFUeXBlOiBzdHJpbmc7XG4gICAgICAgICAgICByZWFkb25seSBlc3RpbWF0ZWREaXN0aW5jdDogbnVtYmVyO1xuICAgICAgICAgICAgcmVhZG9ubHkgY29tcG9zaXRlOiB7XG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHN1YkZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgfSB8IG51bGw7XG4gICAgICAgICAgICByZWFkb25seSBlbnVtVmFsdWVzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgd29ya0l0ZW1zOiBUV29ya0l0ZW1bXSA9IFtdO1xuICAgICAgICBsZXQgc2tpcHBlZCA9IDA7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGlmIChtYXNrZWRTZXQuaGFzKGF0dHIubmFtZSkpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkICs9IDE7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gYXR0ci5kYXRhX3R5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc1NhbXBsZWFibGVUeXBlKGRhdGFUeXBlLCBlbnVtTmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgd29ya0l0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBhdHRyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlLFxuICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWREaXN0aW5jdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICdlc3RpbWF0ZWRfZGlzdGluY3QnIGluIGF0dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChhdHRyLmVzdGltYXRlZF9kaXN0aW5jdCBhcyBudW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZXM6IHJlc29sdmVFbnVtVmFsdWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRyb3NwZWN0aW9uLmVudW1zLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNBcnJheVR5cGUoZGF0YVR5cGUpICYmXG4gICAgICAgICAgICAgICAgIWlzU2FtcGxlYWJsZVNjYWxhcihkYXRhVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAhZW51bU5hbWVzLmhhcyhkYXRhVHlwZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFBvdGVudGlhbCBjb21wb3NpdGUgdHlwZSDigJQgaW50cm9zcGVjdCBzdWItZmllbGRzXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViRmllbGRzID0gYXdhaXQgZmV0Y2hDb21wb3NpdGVTdWJGaWVsZHMocG9vbCwgZGF0YVR5cGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2Ygb2Ygc3ViRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFza2VkU2V0LmhhcyhzZi5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtcGxlYWJsZVR5cGUoc2YuZGF0YV90eXBlLCBlbnVtTmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya0l0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBgJHthdHRyLm5hbWV9LiR7c2YubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogc2YuZGF0YV90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWREaXN0aW5jdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBhdHRyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGaWVsZE5hbWU6IHNmLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZXM6IHJlc29sdmVFbnVtVmFsdWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YuZGF0YV90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9zcGVjdGlvbi5lbnVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuY291bnRzLnRvdGFsQ29sdW1ucyArPSB3b3JrSXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuY291bnRzLnNraXBwZWRDb2x1bW5zICs9IHNraXBwZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNvbHVtblJlc3VsdHM6IFRDb2x1bW5TYW1wbGVbXSA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHdvcmtJdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5lbnVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNhbXBsaW5nLmNvdW50cy5zYW1wbGVkQ29sdW1ucyArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGl0ZW0uY29tcG9zaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2l0ZW0uY29tcG9zaXRlLmNvbHVtbk5hbWV9LiR7aXRlbS5jb21wb3NpdGUuc3ViRmllbGROYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb2x1bW5OYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlPFRDb2x1bW5TYW1wbGU+KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl9uYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3k6ICdkaXN0aW5jdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGl0ZW0uZW51bVZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLmFkZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW0uY29tcG9zaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IHNhbXBsZUNvbXBvc2l0ZVN1YkZpZWxkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcG9zaXRlLmNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBvc2l0ZS5zdWJGaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmVzdGltYXRlZERpc3RpbmN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkUm93Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbktpbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYXdhaXQgc2FtcGxlQ29sdW1uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZXN0aW1hdGVkRGlzdGluY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRSb3dDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uS2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5jb3VudHMuc2FtcGxlZENvbHVtbnMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApKSBhcyBUQ29sdW1uU2FtcGxlW107XG5cbiAgICAgICAgY29uc3QgY29sdW1uczogUmVjb3JkPHN0cmluZywgVFRhYmxlU2FtcGxlQ29sdW1uPiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGNvbHVtblJlc3VsdHMubWFwKChzYW1wbGUpID0+IFtcbiAgICAgICAgICAgICAgICBzYW1wbGUuY29sdW1uX25hbWUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdHJhdGVneTogc2FtcGxlLnN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogc2FtcGxlLnZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogc2FtcGxlLnZhbHVlcy5tYXAoKHYpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZVZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya0l0ZW1zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3KSA9PiB3LmNvbHVtbk5hbWUgPT09IHNhbXBsZS5jb2x1bW5fbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApPy5kYXRhVHlwZSA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRhYmxlU2FtcGxlczogVFRhYmxlU2FtcGxlcyA9IHtcbiAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICBzYW1wbGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgZXhjbHVkZWRfY29sdW1uczogbWFza2VkQ29sdW1ucyxcbiAgICAgICAgfTtcblxuICAgICAgICB5aWVsZCB7dGFibGVOYW1lLCBzYW1wbGVzOiB0YWJsZVNhbXBsZXN9O1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNhbXBsaW5nLmNvdW50cy5jb21wbGV0ZWRUYWJsZXMgKz0gMTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5zdGF0ZSA9ICdkb25lJztcbiAgICB9KTtcbn07XG4iXX0=
@@ -1,8 +1,9 @@
1
1
  import type { Pool } from 'pg';
2
2
  import type { TStore } from '../store.mjs';
3
- import type { TDatabase } from '../schemas/index.mjs';
3
+ import type { TDatabaseIntrospection } from '@dbctx/core';
4
4
  export declare const checkGate: (token: string, store: TStore) => Promise<boolean>;
5
+ export declare const checkBilling: (token: string, sessionUrl: string, store: TStore) => Promise<void>;
5
6
  export declare const connectAccount: (token: string, store: TStore) => Promise<void>;
6
- export declare const createSession: (pool: Pool, result: TDatabase, store: TStore, token: string | null, device_id: string) => Promise<string>;
7
+ export declare const createSession: (pool: Pool, result: TDatabaseIntrospection, store: TStore, token: string | null, device_id: string) => Promise<string>;
7
8
  export declare const waitForAuthorization: (sessionId: string, store: TStore) => Promise<void>;
8
9
  //# sourceMappingURL=session.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.mts","sourceRoot":"./src/","sources":["app/session.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAG7B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAoJpD,eAAO,MAAM,SAAS,GAClB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,OAAO,CAkBjB,CAAC;AAEF,eAAO,MAAM,cAAc,GACvB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAed,CAAC;AAEF,eAAO,MAAM,aAAa,GACtB,MAAM,IAAI,EACV,QAAQ,SAAS,EACjB,OAAO,MAAM,EACb,OAAO,MAAM,GAAG,IAAI,EACpB,WAAW,MAAM,KAClB,OAAO,CAAC,MAAM,CA0BhB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC7B,WAAW,MAAM,EACjB,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAYd,CAAC"}
1
+ {"version":3,"file":"session.d.mts","sourceRoot":"./src/","sources":["app/session.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAG7B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAqJxD,eAAO,MAAM,SAAS,GAClB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,OAAO,CAkBjB,CAAC;AAEF,eAAO,MAAM,YAAY,GACrB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CA+Cd,CAAC;AAEF,eAAO,MAAM,cAAc,GACvB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAed,CAAC;AAEF,eAAO,MAAM,aAAa,GACtB,MAAM,IAAI,EACV,QAAQ,sBAAsB,EAC9B,OAAO,MAAM,EACb,OAAO,MAAM,GAAG,IAAI,EACpB,WAAW,MAAM,KAClB,OAAO,CAAC,MAAM,CA0BhB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC7B,WAAW,MAAM,EACjB,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAYd,CAAC"}