dbctx 1.0.3 → 1.3.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 (119) hide show
  1. package/dist/app/assemble.d.mts +5 -0
  2. package/dist/app/assemble.d.mts.map +1 -0
  3. package/dist/app/assemble.mjs +161 -0
  4. package/dist/app/config.d.mts +9 -0
  5. package/dist/app/config.d.mts.map +1 -0
  6. package/dist/app/config.mjs +49 -0
  7. package/dist/app/db.d.mts +9 -0
  8. package/dist/app/db.d.mts.map +1 -0
  9. package/dist/app/db.mjs +181 -0
  10. package/dist/app/detect.d.mts +11 -0
  11. package/dist/app/detect.d.mts.map +1 -0
  12. package/dist/app/detect.mjs +105 -0
  13. package/dist/app/index.d.mts +3 -0
  14. package/dist/app/index.d.mts.map +1 -0
  15. package/dist/app/index.mjs +81 -0
  16. package/dist/app/open-url.d.mts +4 -0
  17. package/dist/app/open-url.d.mts.map +1 -0
  18. package/dist/app/open-url.mjs +27 -0
  19. package/dist/app/session.d.mts +8 -0
  20. package/dist/app/session.d.mts.map +1 -0
  21. package/dist/app/session.mjs +155 -0
  22. package/dist/app/ssh.d.mts +3 -0
  23. package/dist/app/ssh.d.mts.map +1 -0
  24. package/dist/app/ssh.mjs +207 -0
  25. package/dist/db/analyze.d.mts +1 -1
  26. package/dist/db/analyze.d.mts.map +1 -1
  27. package/dist/db/analyze.mjs +1 -1
  28. package/dist/db/attributes.d.mts +3 -3
  29. package/dist/db/attributes.d.mts.map +1 -1
  30. package/dist/db/attributes.mjs +2 -2
  31. package/dist/db/enums.d.mts +1 -1
  32. package/dist/db/enums.d.mts.map +1 -1
  33. package/dist/db/enums.mjs +2 -2
  34. package/dist/db/file-stats.d.mts +1 -1
  35. package/dist/db/file-stats.d.mts.map +1 -1
  36. package/dist/db/file-stats.mjs +1 -1
  37. package/dist/db/foreign-keys.d.mts +2 -2
  38. package/dist/db/foreign-keys.d.mts.map +1 -1
  39. package/dist/db/foreign-keys.mjs +1 -1
  40. package/dist/db/index.d.mts +9 -9
  41. package/dist/db/index.d.mts.map +1 -1
  42. package/dist/db/index.mjs +10 -10
  43. package/dist/db/indexes.d.mts +1 -1
  44. package/dist/db/indexes.d.mts.map +1 -1
  45. package/dist/db/indexes.mjs +1 -1
  46. package/dist/db/relations.d.mts +2 -2
  47. package/dist/db/relations.d.mts.map +1 -1
  48. package/dist/db/relations.mjs +2 -2
  49. package/dist/db/stats.d.mts +1 -1
  50. package/dist/db/stats.d.mts.map +1 -1
  51. package/dist/db/stats.mjs +2 -2
  52. package/dist/db/version.d.mts +2 -1
  53. package/dist/db/version.d.mts.map +1 -1
  54. package/dist/db/version.mjs +9 -1
  55. package/dist/index.d.mts +4 -3
  56. package/dist/index.d.mts.map +1 -1
  57. package/dist/index.mjs +105 -51
  58. package/dist/lib/trpc-url.d.mts +2 -0
  59. package/dist/lib/trpc-url.d.mts.map +1 -0
  60. package/dist/lib/trpc-url.mjs +6 -0
  61. package/dist/lib/trpc.d.mts +7 -0
  62. package/dist/lib/trpc.d.mts.map +1 -0
  63. package/dist/lib/trpc.mjs +37 -0
  64. package/dist/lib/trpc.react.d.mts +4 -0
  65. package/dist/lib/trpc.react.d.mts.map +1 -0
  66. package/dist/lib/trpc.react.mjs +3 -0
  67. package/dist/lib/version.d.mts +2 -0
  68. package/dist/lib/version.d.mts.map +1 -0
  69. package/dist/lib/version.mjs +5 -0
  70. package/dist/providers/TrpcProvider.d.ts +9 -0
  71. package/dist/providers/TrpcProvider.d.ts.map +1 -0
  72. package/dist/providers/TrpcProvider.js +41 -0
  73. package/dist/schemas/index.d.mts +106 -1
  74. package/dist/schemas/index.d.mts.map +1 -1
  75. package/dist/schemas/index.mjs +27 -2
  76. package/dist/store.d.mts +64 -0
  77. package/dist/store.d.mts.map +1 -0
  78. package/dist/store.mjs +68 -0
  79. package/dist/{App.d.ts → types/connection.d.mts} +3 -9
  80. package/dist/types/connection.d.mts.map +1 -0
  81. package/dist/types/connection.mjs +2 -0
  82. package/dist/ui/App.d.ts +10 -0
  83. package/dist/ui/App.d.ts.map +1 -0
  84. package/dist/ui/App.js +13 -0
  85. package/dist/ui/components/DB.d.ts +10 -0
  86. package/dist/ui/components/DB.d.ts.map +1 -0
  87. package/dist/ui/components/DB.js +22 -0
  88. package/dist/{components → ui/components}/Error.d.ts +1 -1
  89. package/dist/ui/components/Error.d.ts.map +1 -0
  90. package/dist/ui/components/Error.js +6 -0
  91. package/dist/ui/components/Gate.d.ts +10 -0
  92. package/dist/ui/components/Gate.d.ts.map +1 -0
  93. package/dist/ui/components/Gate.js +15 -0
  94. package/dist/ui/components/Introspect.d.ts +10 -0
  95. package/dist/ui/components/Introspect.d.ts.map +1 -0
  96. package/dist/ui/components/Introspect.js +66 -0
  97. package/dist/ui/components/PasswordInput.d.ts +7 -0
  98. package/dist/ui/components/PasswordInput.d.ts.map +1 -0
  99. package/dist/ui/components/PasswordInput.js +32 -0
  100. package/dist/ui/components/SSH.d.ts +10 -0
  101. package/dist/ui/components/SSH.d.ts.map +1 -0
  102. package/dist/ui/components/SSH.js +22 -0
  103. package/dist/ui/components/Session.d.ts +10 -0
  104. package/dist/ui/components/Session.d.ts.map +1 -0
  105. package/dist/ui/components/Session.js +47 -0
  106. package/dist/ui/components/Spinner.d.ts +3 -0
  107. package/dist/ui/components/Spinner.d.ts.map +1 -0
  108. package/dist/ui/components/Spinner.js +18 -0
  109. package/dist/ui/components/Splash.d.ts +3 -0
  110. package/dist/ui/components/Splash.d.ts.map +1 -0
  111. package/dist/ui/components/Splash.js +13 -0
  112. package/dist/validatePaths.d.mts +1 -1
  113. package/dist/validatePaths.d.mts.map +1 -1
  114. package/dist/validatePaths.mjs +17 -11
  115. package/package.json +22 -2
  116. package/dist/App.d.ts.map +0 -1
  117. package/dist/App.js +0 -9
  118. package/dist/components/Error.d.ts.map +0 -1
  119. package/dist/components/Error.js +0 -6
@@ -0,0 +1,5 @@
1
+ import type { Pool } from 'pg';
2
+ import type { TStore } from '../store.mjs';
3
+ import type { TDatabase } from '../schemas/index.mjs';
4
+ export declare const assembleDatabase: (pool: Pool, store: TStore) => Promise<TDatabase>;
5
+ //# sourceMappingURL=assemble.d.mts.map
@@ -0,0 +1 @@
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,SAAS,EAAC,MAAM,sBAAsB,CAAC;AA2FpD,eAAO,MAAM,gBAAgB,GACzB,MAAM,IAAI,EACV,OAAO,MAAM,KACd,OAAO,CAAC,SAAS,CA4HnB,CAAC"}
@@ -0,0 +1,161 @@
1
+ import PQueue from 'p-queue';
2
+ import { runInAction } from 'mobx';
3
+ import { fetchDatabaseIdentifier, fetchDatabaseComment, fetchPublicRelations, fetchPublicEnums, fetchRelationAttributes, fetchRelationIndexes, fetchRelationForeignKeys, analyzeRelation, fetchRelationStats, } 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] = await Promise.all([
77
+ queue.add(() => fetchPublicRelations(pool)),
78
+ queue.add(() => fetchPublicEnums(pool)),
79
+ ]);
80
+ const typedGrouped = grouped;
81
+ const typedEnums = enums;
82
+ runInAction(() => {
83
+ counts.tables =
84
+ (typedGrouped.table?.length ?? 0) +
85
+ (typedGrouped.partitioned_table?.length ?? 0);
86
+ counts.views =
87
+ (typedGrouped.view?.length ?? 0) +
88
+ (typedGrouped.materialized_view?.length ?? 0);
89
+ counts.enums = Object.keys(typedEnums).length;
90
+ });
91
+ const allRelations = [
92
+ ...(typedGrouped.partitioned_table ?? []),
93
+ ...(typedGrouped.table ?? []),
94
+ ...(typedGrouped.view ?? []),
95
+ ...(typedGrouped.materialized_view ?? []),
96
+ ];
97
+ const relationEntries = await Promise.all(allRelations.map(async (rel) => {
98
+ if (rel.type !== 'view') {
99
+ await queue.add(() => analyzeRelation(pool, rel.name));
100
+ runInAction(() => {
101
+ counts.analyzed += 1;
102
+ });
103
+ }
104
+ const [attributes, indexes, foreignKeys, stats] = await Promise.all([
105
+ queue.add(() => fetchRelationAttributes(pool, rel.name)),
106
+ queue.add(() => fetchRelationIndexes(pool, rel.name)),
107
+ queue.add(() => fetchRelationForeignKeys(pool, rel.name)),
108
+ queue.add(() => fetchRelationStats(pool, rel.name)),
109
+ ]);
110
+ const attrs = attributes;
111
+ const idxs = indexes;
112
+ const fks = foreignKeys;
113
+ const relStats = stats;
114
+ const distinctLookup = new Map(relStats.attributes.map((a) => [
115
+ a.attribute_name,
116
+ a.estimated_distinct,
117
+ ]));
118
+ runInAction(() => {
119
+ counts.columns += attrs.length;
120
+ counts.indexes += idxs.length;
121
+ counts.foreignKeys += fks.length;
122
+ });
123
+ const transformedAttrs = attrs.map((attr) => {
124
+ const base = transformAttribute(attr);
125
+ const distinct = distinctLookup.get(attr.attribute_name);
126
+ return distinct !== undefined
127
+ ? { ...base, estimated_distinct: distinct }
128
+ : base;
129
+ });
130
+ return [
131
+ rel.name,
132
+ {
133
+ name: rel.name,
134
+ comment: rel.comment,
135
+ kind: rel.type,
136
+ attributes: toRecord(transformedAttrs, (a) => a.name),
137
+ indexes: toRecord(idxs.map(transformIndex), (i) => i.index_name),
138
+ references: toRecord(fks.map(transformReference), (r) => r.constraint_name),
139
+ },
140
+ ];
141
+ }));
142
+ runInAction(() => {
143
+ store.steps.introspection.state = 'done';
144
+ });
145
+ return {
146
+ type: 'postgresql',
147
+ version: {
148
+ version_string: store.steps.databaseConnection.postgresVersion,
149
+ version_number: store.steps.databaseConnection.postgresVersionNumber,
150
+ },
151
+ identifier: {
152
+ system_identifier: identifier.system_identifier,
153
+ database_oid: identifier.database_oid,
154
+ },
155
+ name: identifier.database_name,
156
+ comment: comment ?? null,
157
+ relations: Object.fromEntries(relationEntries),
158
+ enums: typedEnums,
159
+ };
160
+ };
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2Fzc2VtYmxlLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQVFqQyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixrQkFBa0IsR0FDckIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLFFBQVEsR0FBRyxDQUNiLEtBQW1CLEVBQ25CLEdBQXdCLEVBQ1AsRUFBRSxDQUNuQixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUvRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsSUFBb0IsRUFBRSxFQUFFO0lBQ2hELE1BQU0sSUFBSSxHQUFHO1FBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjO1FBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztRQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7UUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO0tBQ3hCLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDNUIsT0FBTztZQUNILEdBQUcsSUFBSTtZQUNQLElBQUksRUFBRSxXQUFvQjtZQUMxQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQTBDO1lBQ2xFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxvQkFBcUI7U0FDbkQsQ0FBQztJQUNOLENBQUM7SUFFRCxPQUFP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QyxDQUFDLENBQUMsVUFBVSxDQUN0QjtnQkFDRCxVQUFVLEVBQUUsUUFBUSxDQUNoQixHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUMzQjthQUNKO1NBQ0ssQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFFRixXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUM3QyxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87UUFDSCxJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUU7WUFDTCxjQUFjLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxlQUFnQjtZQUMvRCxjQUFjLEVBQ1YsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBc0I7U0FDNUQ7UUFDRCxVQUFVLEVBQUU7WUFDUixpQkFBaUIsRUFBRSxVQUFXLENBQUMsaUJBQWlCO1lBQ2hELFlBQVksRUFBRSxVQUFXLENBQUMsWUFBWTtTQUN6QztRQUNELElBQUksRUFBRSxVQUFXLENBQUMsYUFBYTtRQUMvQixPQUFPLEVBQUUsT0FBTyxJQUFJLElBQUk7UUFDeEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDO1FBQzlDLEtBQUssRUFBRSxVQUFVO0tBQ3BCLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuaW1wb3J0IFBRdWV1ZSBmcm9tICdwLXF1ZXVlJztcbmltcG9ydCB7cnVuSW5BY3Rpb259IGZyb20gJ21vYngnO1xuXG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHR5cGUge1REYXRhYmFzZX0gZnJvbSAnLi4vc2NoZW1hcy9pbmRleC5tanMnO1xuaW1wb3J0IHR5cGUge1RBdHRyaWJ1dGVJbmZvfSBmcm9tICcuLi9kYi9hdHRyaWJ1dGVzLm1qcyc7XG5pbXBvcnQgdHlwZSB7VEluZGV4SW5mb30gZnJvbSAnLi4vZGIvaW5kZXhlcy5tanMnO1xuaW1wb3J0IHR5cGUge1RGb3JlaWduS2V5SW5mb30gZnJvbSAnLi4vZGIvZm9yZWlnbi1rZXlzLm1qcyc7XG5pbXBvcnQgdHlwZSB7VFJlbGF0aW9uU3RhdHN9IGZyb20gJy4uL2RiL3N0YXRzLm1qcyc7XG5pbXBvcnQge1xuICAgIGZldGNoRGF0YWJhc2VJZGVudGlmaWVyLFxuICAgIGZldGNoRGF0YWJhc2VDb21tZW50LFxuICAgIGZldGNoUHVibGljUmVsYXRpb25zLFxuICAgIGZldGNoUHVibGljRW51bXMsXG4gICAgZmV0Y2hSZWxhdGlvbkF0dHJpYnV0ZXMsXG4gICAgZmV0Y2hSZWxhdGlvbkluZGV4ZXMsXG4gICAgZmV0Y2hSZWxhdGlvbkZvcmVpZ25LZXlzLFxuICAgIGFuYWx5emVSZWxhdGlvbixcbiAgICBmZXRjaFJlbGF0aW9uU3RhdHMsXG59IGZyb20gJy4uL2RiL2luZGV4Lm1qcyc7XG5cbmNvbnN0IHRvUmVjb3JkID0gPFQgZXh0ZW5kcyB1bmtub3duPihcbiAgICBpdGVtczogcmVhZG9ubHkgVFtdLFxuICAgIGtleTogKGl0ZW06IFQpID0+IHN0cmluZyxcbik6IFJlY29yZDxzdHJpbmcsIFQ+ID0+XG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKGl0ZW1zLm1hcCgoaXRlbSkgPT4gW2tleShpdGVtKSwgaXRlbV0pKTtcblxuY29uc3QgdHJhbnNmb3JtQXR0cmlidXRlID0gKGF0dHI6IFRBdHRyaWJ1dGVJbmZvKSA9PiB7XG4gICAgY29uc3QgYmFzZSA9IHtcbiAgICAgICAgbmFtZTogYXR0ci5hdHRyaWJ1dGVfbmFtZSxcbiAgICAgICAgZGF0YV90eXBlOiBhdHRyLmRhdGFfdHlwZSxcbiAgICAgICAgaXNfbnVsbGFibGU6IGF0dHIuaXNfbnVsbGFibGUsXG4gICAgICAgIGNvbW1lbnQ6IGF0dHIuY29tbWVudCxcbiAgICB9O1xuXG4gICAgaWYgKGF0dHIua2luZCA9PT0gJ2dlbmVyYXRlZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICBraW5kOiAnZ2VuZXJhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgIGdlbmVyYXRlZF9zdG9yYWdlOiBhdHRyLmdlbmVyYXRlZF9zdG9yYWdlISBhcyAnc3RvcmVkJyB8ICd2aXJ0dWFsJyxcbiAgICAgICAgICAgIGdlbmVyYXRlZF9leHByZXNzaW9uOiBhdHRyLmdlbmVyYXRlZF9leHByZXNzaW9uISxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0ci5oYXNfZGVmYXVsdFxuICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgICAga2luZDogJ3JlZ3VsYXInIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBoYXNfZGVmYXVsdDogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgZGVmYXVsdF9leHByZXNzaW9uOiBhdHRyLmRlZmF1bHRfZXhwcmVzc2lvbiEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgICAga2luZDogJ3JlZ3VsYXInIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBoYXNfZGVmYXVsdDogZmFsc2UgYXMgY29uc3QsXG4gICAgICAgICAgfTtcbn07XG5cbmNvbnN0IGRlcml2ZUluZGV4S2luZCA9IChpZHg6IFRJbmRleEluZm8pID0+XG4gICAgaWR4LmlzX3ByaW1hcnlcbiAgICAgICAgPyAoe2luZGV4X2tpbmQ6ICdwcmltYXJ5J30gYXMgY29uc3QpXG4gICAgICAgIDogaWR4LmlzX3VuaXF1ZVxuICAgICAgICAgID8gKHtpbmRleF9raW5kOiAndW5pcXVlJ30gYXMgY29uc3QpXG4gICAgICAgICAgOiBpZHguaXNfZXhjbHVzaW9uXG4gICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICBpbmRleF9raW5kOiAnZXhjbHVzaW9uJyxcbiAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvbl9vcGVyYXRvcnM6IGlkeC5leGNsdXNpb25fb3BlcmF0b3JzISxcbiAgICAgICAgICAgICAgfSBhcyBjb25zdClcbiAgICAgICAgICAgIDogKHtpbmRleF9raW5kOiAncGxhaW4nfSBhcyBjb25zdCk7XG5cbmNvbnN0IHRyYW5zZm9ybUluZGV4ID0gKGlkeDogVEluZGV4SW5mbykgPT4gKHtcbiAgICBpbmRleF9uYW1lOiBpZHguaW5kZXhfbmFtZSxcbiAgICByZWxhdGlvbl9uYW1lOiBpZHgucmVsYXRpb25fbmFtZSxcbiAgICBhdHRyaWJ1dGVzOiBpZHguYXR0cmlidXRlcyxcbiAgICBkZWZpbml0aW9uOiBpZHguZGVmaW5pdGlvbixcbiAgICBjb21tZW50OiBpZHguY29tbWVudCxcbiAgICAuLi5kZXJpdmVJbmRleEtpbmQoaWR4KSxcbiAgICAuLi4oaWR4LmlzX3BhcnRpYWxcbiAgICAgICAgPyAoe1xuICAgICAgICAgICAgICBpc19wYXJ0aWFsOiB0cnVlLFxuICAgICAgICAgICAgICBwYXJ0aWFsX3ByZWRpY2F0ZTogaWR4LnBhcnRpYWxfcHJlZGljYXRlISxcbiAgICAgICAgICB9IGFzIGNvbnN0KVxuICAgICAgICA6ICh7aXNfcGFydGlhbDogZmFsc2V9IGFzIGNvbnN0KSksXG59KTtcblxuY29uc3QgdHJhbnNmb3JtUmVmZXJlbmNlID0gKGZrOiBURm9yZWlnbktleUluZm8pID0+ICh7XG4gICAgY29uc3RyYWludF9uYW1lOiBmay5jb25zdHJhaW50X25hbWUsXG4gICAgYXR0cmlidXRlczogZmsuYXR0cmlidXRlcyxcbiAgICByZWZlcmVuY2VkX3JlbGF0aW9uOiBmay5yZWZlcmVuY2VkX3JlbGF0aW9uLFxuICAgIHJlZmVyZW5jZWRfYXR0cmlidXRlczogZmsucmVmZXJlbmNlZF9hdHRyaWJ1dGVzLFxuICAgIG9uX3VwZGF0ZTogZmsub25fdXBkYXRlLFxuICAgIG9uX2RlbGV0ZTogZmsub25fZGVsZXRlLFxuICAgIGNvbW1lbnQ6IGZrLmNvbW1lbnQsXG59KTtcblxuZXhwb3J0IGNvbnN0IGFzc2VtYmxlRGF0YWJhc2UgPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTxURGF0YWJhc2U+ID0+IHtcbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBQUXVldWUoe2NvbmN1cnJlbmN5OiAzfSk7XG4gICAgY29uc3QgY291bnRzID0gc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5jb3VudHM7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uc3RhdGUgPSAnZmV0Y2hpbmcnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgW2lkZW50aWZpZXIsIGNvbW1lbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hEYXRhYmFzZUlkZW50aWZpZXIocG9vbCkpLFxuICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hEYXRhYmFzZUNvbW1lbnQocG9vbCkpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgW2dyb3VwZWQsIGVudW1zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUHVibGljUmVsYXRpb25zKHBvb2wpKSxcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUHVibGljRW51bXMocG9vbCkpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgdHlwZWRHcm91cGVkID0gZ3JvdXBlZCBhcyBBd2FpdGVkPFxuICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBmZXRjaFB1YmxpY1JlbGF0aW9ucz5cbiAgICA+O1xuICAgIGNvbnN0IHR5cGVkRW51bXMgPSBlbnVtcyBhcyBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGZldGNoUHVibGljRW51bXM+PjtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgY291bnRzLnRhYmxlcyA9XG4gICAgICAgICAgICAodHlwZWRHcm91cGVkLnRhYmxlPy5sZW5ndGggPz8gMCkgK1xuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC5wYXJ0aXRpb25lZF90YWJsZT8ubGVuZ3RoID8/IDApO1xuICAgICAgICBjb3VudHMudmlld3MgPVxuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC52aWV3Py5sZW5ndGggPz8gMCkgK1xuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC5tYXRlcmlhbGl6ZWRfdmlldz8ubGVuZ3RoID8/IDApO1xuICAgICAgICBjb3VudHMuZW51bXMgPSBPYmplY3Qua2V5cyh0eXBlZEVudW1zKS5sZW5ndGg7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxSZWxhdGlvbnMgPSBbXG4gICAgICAgIC4uLih0eXBlZEdyb3VwZWQucGFydGl0aW9uZWRfdGFibGUgPz8gW10pLFxuICAgICAgICAuLi4odHlwZWRHcm91cGVkLnRhYmxlID8/IFtdKSxcbiAgICAgICAgLi4uKHR5cGVkR3JvdXBlZC52aWV3ID8/IFtdKSxcbiAgICAgICAgLi4uKHR5cGVkR3JvdXBlZC5tYXRlcmlhbGl6ZWRfdmlldyA/PyBbXSksXG4gICAgXTtcblxuICAgIGNvbnN0IHJlbGF0aW9uRW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBhbGxSZWxhdGlvbnMubWFwKGFzeW5jIChyZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWwudHlwZSAhPT0gJ3ZpZXcnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVldWUuYWRkKCgpID0+IGFuYWx5emVSZWxhdGlvbihwb29sLCByZWwubmFtZSkpO1xuICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzLmFuYWx5emVkICs9IDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFthdHRyaWJ1dGVzLCBpbmRleGVzLCBmb3JlaWduS2V5cywgc3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hSZWxhdGlvbkF0dHJpYnV0ZXMocG9vbCwgcmVsLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUmVsYXRpb25JbmRleGVzKHBvb2wsIHJlbC5uYW1lKSksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaFJlbGF0aW9uRm9yZWlnbktleXMocG9vbCwgcmVsLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUmVsYXRpb25TdGF0cyhwb29sLCByZWwubmFtZSkpLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBhdHRycyA9IGF0dHJpYnV0ZXMgYXMgVEF0dHJpYnV0ZUluZm9bXTtcbiAgICAgICAgICAgIGNvbnN0IGlkeHMgPSBpbmRleGVzIGFzIFRJbmRleEluZm9bXTtcbiAgICAgICAgICAgIGNvbnN0IGZrcyA9IGZvcmVpZ25LZXlzIGFzIFRGb3JlaWduS2V5SW5mb1tdO1xuICAgICAgICAgICAgY29uc3QgcmVsU3RhdHMgPSBzdGF0cyBhcyBUUmVsYXRpb25TdGF0cztcblxuICAgICAgICAgICAgY29uc3QgZGlzdGluY3RMb29rdXAgPSBuZXcgTWFwKFxuICAgICAgICAgICAgICAgIHJlbFN0YXRzLmF0dHJpYnV0ZXMubWFwKChhKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgIGEuYXR0cmlidXRlX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIGEuZXN0aW1hdGVkX2Rpc3RpbmN0LFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvdW50cy5jb2x1bW5zICs9IGF0dHJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb3VudHMuaW5kZXhlcyArPSBpZHhzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb3VudHMuZm9yZWlnbktleXMgKz0gZmtzLmxlbmd0aDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZEF0dHJzID0gYXR0cnMubWFwKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRyYW5zZm9ybUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0aW5jdCA9IGRpc3RpbmN0TG9va3VwLmdldChhdHRyLmF0dHJpYnV0ZV9uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdGluY3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IHsuLi5iYXNlLCBlc3RpbWF0ZWRfZGlzdGluY3Q6IGRpc3RpbmN0fVxuICAgICAgICAgICAgICAgICAgICA6IGJhc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICByZWwubmFtZSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21tZW50OiByZWwuY29tbWVudCxcbiAgICAgICAgICAgICAgICAgICAga2luZDogcmVsLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRvUmVjb3JkKHRyYW5zZm9ybWVkQXR0cnMsIChhKSA9PiBhLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBpbmRleGVzOiB0b1JlY29yZChcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeHMubWFwKHRyYW5zZm9ybUluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChpKSA9PiBpLmluZGV4X25hbWUsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXM6IHRvUmVjb3JkKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmtzLm1hcCh0cmFuc2Zvcm1SZWZlcmVuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHIpID0+IHIuY29uc3RyYWludF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdIGFzIGNvbnN0O1xuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5pbnRyb3NwZWN0aW9uLnN0YXRlID0gJ2RvbmUnO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3Bvc3RncmVzcWwnLFxuICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICB2ZXJzaW9uX3N0cmluZzogc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBvc3RncmVzVmVyc2lvbiEsXG4gICAgICAgICAgICB2ZXJzaW9uX251bWJlcjpcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucG9zdGdyZXNWZXJzaW9uTnVtYmVyISxcbiAgICAgICAgfSxcbiAgICAgICAgaWRlbnRpZmllcjoge1xuICAgICAgICAgICAgc3lzdGVtX2lkZW50aWZpZXI6IGlkZW50aWZpZXIhLnN5c3RlbV9pZGVudGlmaWVyLFxuICAgICAgICAgICAgZGF0YWJhc2Vfb2lkOiBpZGVudGlmaWVyIS5kYXRhYmFzZV9vaWQsXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6IGlkZW50aWZpZXIhLmRhdGFiYXNlX25hbWUsXG4gICAgICAgIGNvbW1lbnQ6IGNvbW1lbnQgPz8gbnVsbCxcbiAgICAgICAgcmVsYXRpb25zOiBPYmplY3QuZnJvbUVudHJpZXMocmVsYXRpb25FbnRyaWVzKSxcbiAgICAgICAgZW51bXM6IHR5cGVkRW51bXMsXG4gICAgfTtcbn07XG4iXX0=
@@ -0,0 +1,9 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,49 @@
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=
@@ -0,0 +1,9 @@
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
@@ -0,0 +1 @@
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,CA8GnC,CAAC"}
@@ -0,0 +1,181 @@
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
+ store.steps.databaseConnection.password = null;
167
+ store.steps.databaseConnection.promptCount += 1;
168
+ store.steps.databaseConnection.state = 'need-password';
169
+ });
170
+ await when(() => store.steps.databaseConnection.password !== null);
171
+ const newPassword = store.steps.databaseConnection.password;
172
+ runInAction(() => {
173
+ store.steps.databaseConnection.password = null;
174
+ store.steps.databaseConnection.state = 'connecting';
175
+ });
176
+ return attemptConnection(newPassword, sslConfig);
177
+ }
178
+ };
179
+ return attemptConnection(config.password, ssl);
180
+ };
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2RiLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFJdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFPdkQsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQztBQUVsQixNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBWSxFQUFVLEVBQUU7SUFDbkQsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNkLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELE1BQU0sTUFBTSxHQUFHLEdBS2QsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLENBQUM7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Q2hELEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQztZQUMzRCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBRW5FLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUyxDQUFDO1lBRTdELFdBQVcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUMvQyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmVhZEZpbGVTeW5jfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwZyBmcm9tICdwZyc7XG5pbXBvcnQge3J1bkluQWN0aW9uLCB3aGVufSBmcm9tICdtb2J4JztcbmltcG9ydCB7c2NvcGV9IGZyb20gJ3Njb3BlLXV0aWxpdGllcyc7XG5cbmltcG9ydCB0eXBlIHtUU3RvcmV9IGZyb20gJy4uL3N0b3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7VFNTTE1vZGV9IGZyb20gJy4uL2luZGV4Lm1qcyc7XG5pbXBvcnQge2ZldGNoUG9zdGdyZXNWZXJzaW9ufSBmcm9tICcuLi9kYi92ZXJzaW9uLm1qcyc7XG5cbmV4cG9ydCB0eXBlIFREQkNvbm5lY3Rpb24gPSB7XG4gICAgcmVhZG9ubHkgcG9vbDogSW5zdGFuY2VUeXBlPHR5cGVvZiBQb29sPjtcbiAgICByZWFkb25seSBjbGVhbnVwOiAoKSA9PiB2b2lkO1xufTtcblxuY29uc3Qge1Bvb2x9ID0gcGc7XG5cbmNvbnN0IGZvcm1hdENvbm5lY3Rpb25FcnJvciA9IChlcnI6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGVycikgfHwgJ1Vua25vd24gZXJyb3InO1xuICAgIH1cblxuICAgIGlmIChlcnIubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gU3lzdGVtIGVycm9ycyAoRUNPTk5SRUZVU0VELCBFVElNRURPVVQsIGV0Yy4pXG4gICAgY29uc3Qgc3lzRXJyID0gZXJyIGFzIHtcbiAgICAgICAgY29kZT86IHN0cmluZztcbiAgICAgICAgc3lzY2FsbD86IHN0cmluZztcbiAgICAgICAgYWRkcmVzcz86IHN0cmluZztcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICB9O1xuICAgIGlmIChzeXNFcnIuY29kZSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IFtzeXNFcnIuY29kZV07XG4gICAgICAgIGlmIChzeXNFcnIuc3lzY2FsbCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChzeXNFcnIuc3lzY2FsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5c0Vyci5hZGRyZXNzKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHN5c0Vyci5hZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3lzRXJyLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChTdHJpbmcoc3lzRXJyLnBvcnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xuICAgIH1cblxuICAgIHJldHVybiAnQ29ubmVjdGlvbiBmYWlsZWQnO1xufTtcblxudHlwZSBUUmVzb2x2ZWREQkNvbmZpZyA9IHtcbiAgICByZWFkb25seSBob3N0bmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBkYXRhYmFzZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcGFzc3dvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHJlc29sdmVEQkNvbmZpZyA9IChzdG9yZTogVFN0b3JlKTogVFJlc29sdmVkREJDb25maWcgPT5cbiAgICBzY29wZSh7XG4gICAgICAgIGhvc3RuYW1lOiAnbG9jYWxob3N0JyxcbiAgICAgICAgcG9ydDogNTQzMixcbiAgICAgICAgZGF0YWJhc2U6ICdwb3N0Z3JlcycsXG4gICAgICAgIHVzZXJuYW1lOiAncG9zdGdyZXMnLFxuICAgICAgICBwYXNzd29yZDogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB9KVxuICAgICAgICAubGV0KChjb25maWcpID0+ICh7XG4gICAgICAgICAgICBob3N0bmFtZTogcHJvY2Vzcy5lbnZbJ1BHSE9TVCddID8/IGNvbmZpZy5ob3N0bmFtZSxcbiAgICAgICAgICAgIHBvcnQ6IHByb2Nlc3MuZW52WydQR1BPUlQnXVxuICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocHJvY2Vzcy5lbnZbJ1BHUE9SVCddLCAxMClcbiAgICAgICAgICAgICAgICA6IGNvbmZpZy5wb3J0LFxuICAgICAgICAgICAgZGF0YWJhc2U6IHByb2Nlc3MuZW52WydQR0RBVEFCQVNFJ10gPz8gY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICAgICAgdXNlcm5hbWU6IHByb2Nlc3MuZW52WydQR1VTRVInXSA/PyBjb25maWcudXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogcHJvY2Vzcy5lbnZbJ1BHUEFTU1dPUkQnXSA/PyBjb25maWcucGFzc3dvcmQsXG4gICAgICAgIH0pKVxuICAgICAgICAubGV0KChjb25maWcpID0+XG4gICAgICAgICAgICBzdG9yZS5jb25maWcuY29ubmVjdGlvblN0cmluZ1xuICAgICAgICAgICAgICAgID8gc2NvcGUobmV3IFVSTChzdG9yZS5jb25maWcuY29ubmVjdGlvblN0cmluZykpXG4gICAgICAgICAgICAgICAgICAgICAgLmxldCgodXJsKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lIHx8IGNvbmZpZy5ob3N0bmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydDogdXJsLnBvcnQgPyBwYXJzZUludCh1cmwucG9ydCwgMTApIDogY29uZmlnLnBvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlOiB1cmwucGF0aG5hbWUuc2xpY2UoMSkgfHwgY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVVSSUNvbXBvbmVudCh1cmwudXNlcm5hbWUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiB1cmwucGFzc3dvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXNzd29yZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uZmlnLnBhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZSgpXG4gICAgICAgICAgICAgICAgOiBjb25maWcsXG4gICAgICAgIClcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PiAoe1xuICAgICAgICAgICAgaG9zdG5hbWU6IHN0b3JlLmNvbmZpZy5ob3N0bmFtZSA/PyBjb25maWcuaG9zdG5hbWUsXG4gICAgICAgICAgICBwb3J0OiBzdG9yZS5jb25maWcucG9ydCA/PyBjb25maWcucG9ydCxcbiAgICAgICAgICAgIGRhdGFiYXNlOiBzdG9yZS5jb25maWcuZGF0YWJhc2UgPz8gY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICAgICAgdXNlcm5hbWU6IHN0b3JlLmNvbmZpZy51c2VybmFtZSA/PyBjb25maWcudXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogY29uZmlnLnBhc3N3b3JkLFxuICAgICAgICB9KSlcbiAgICAgICAgLnZhbHVlKCk7XG5cbnR5cGUgVFNTTENvbmZpZyA9XG4gICAgfCBmYWxzZVxuICAgIHwge1xuICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbjtcbiAgICAgICAgICBjYT86IHN0cmluZztcbiAgICAgICAgICBjZXJ0Pzogc3RyaW5nO1xuICAgICAgICAgIGtleT86IHN0cmluZztcbiAgICAgIH07XG5cbmNvbnN0IGJ1aWxkU1NMQ29uZmlnID0gKHN0b3JlOiBUU3RvcmUpOiBUU1NMQ29uZmlnID0+IHtcbiAgICBjb25zdCBtb2RlOiBUU1NMTW9kZSA9IHN0b3JlLmNvbmZpZy5zc2xtb2RlID8/ICdwcmVmZXInO1xuXG4gICAgcmV0dXJuIG1vZGUgPT09ICdkaXNhYmxlJ1xuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDoge1xuICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSAndmVyaWZ5LWNhJyB8fCBtb2RlID09PSAndmVyaWZ5LWZ1bGwnLFxuICAgICAgICAgICAgICAuLi4oc3RvcmUuY29uZmlnLnNzbHJvb3RjZXJ0XG4gICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhOiByZWFkRmlsZVN5bmMoc3RvcmUuY29uZmlnLnNzbHJvb3RjZXJ0LCAndXRmLTgnKSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIC4uLihzdG9yZS5jb25maWcuc3NsY2VydFxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZXJ0OiByZWFkRmlsZVN5bmMoc3RvcmUuY29uZmlnLnNzbGNlcnQsICd1dGYtOCcpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKHN0b3JlLmNvbmZpZy5zc2xrZXlcbiAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiByZWFkRmlsZVN5bmMoc3RvcmUuY29uZmlnLnNzbGtleSwgJ3V0Zi04JyksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgY29ubmVjdERCID0gYXN5bmMgKFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPFREQkNvbm5lY3Rpb24gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBjb25zdCBjb25maWcgPSByZXNvbHZlREJDb25maWcoc3RvcmUpO1xuICAgIGNvbnN0IHNzbCA9IGJ1aWxkU1NMQ29uZmlnKHN0b3JlKTtcblxuICAgIC8vIFNTSCB0dW5uZWw6IGNvbm5lY3QgdmlhIGxvY2FsaG9zdCB0dW5uZWwsIGJ1dCBkaXNwbGF5IHRoZSByZWFsIHJlbW90ZSB0YXJnZXRcbiAgICBjb25zdCBjb25uZWN0aW9uSG9zdCA9XG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uZW5hYmxlZCAmJlxuICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmxvY2FsUG9ydCAhPT0gbnVsbFxuICAgICAgICAgICAgPyAnMTI3LjAuMC4xJ1xuICAgICAgICAgICAgOiBjb25maWcuaG9zdG5hbWU7XG4gICAgY29uc3QgY29ubmVjdGlvblBvcnQgPVxuICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmVuYWJsZWQgJiZcbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5sb2NhbFBvcnQgIT09IG51bGxcbiAgICAgICAgICAgID8gc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5sb2NhbFBvcnRcbiAgICAgICAgICAgIDogY29uZmlnLnBvcnQ7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5waWNrZWRIb3N0bmFtZSA9IGNvbmZpZy5ob3N0bmFtZTtcbiAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBpY2tlZFBvcnQgPSBjb25maWcucG9ydDtcbiAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBpY2tlZERhdGFiYXNlID0gY29uZmlnLmRhdGFiYXNlO1xuICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGlja2VkVXNlcm5hbWUgPSBjb25maWcudXNlcm5hbWU7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5zdGF0ZSA9ICdjb25uZWN0aW5nJztcbiAgICB9KTtcblxuICAgIGNvbnN0IGF0dGVtcHRDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgICAgICBwYXNzd29yZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBzc2xDb25maWc6IFRTU0xDb25maWcsXG4gICAgKTogUHJvbWlzZTxUREJDb25uZWN0aW9uIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIGNvbnN0IHBvb2wgPSBuZXcgUG9vbCh7XG4gICAgICAgICAgICBob3N0OiBjb25uZWN0aW9uSG9zdCxcbiAgICAgICAgICAgIHBvcnQ6IGNvbm5lY3Rpb25Qb3J0LFxuICAgICAgICAgICAgZGF0YWJhc2U6IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgIHVzZXI6IGNvbmZpZy51c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgc3NsOiBzc2xDb25maWcsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogMTBfMDAwLFxuICAgICAgICB9KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgcG9vbC5jb25uZWN0KCk7XG4gICAgICAgICAgICBjbGllbnQucmVsZWFzZSgpO1xuXG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZmV0Y2hQb3N0Z3Jlc1ZlcnNpb24ocG9vbCk7XG5cbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucG9zdGdyZXNWZXJzaW9uID1cbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi52ZXJzaW9uO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wb3N0Z3Jlc1ZlcnNpb25OdW1iZXIgPVxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLnZlcnNpb25fbnVtO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5zdGF0ZSA9ICdjb25uZWN0ZWQnO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcG9vbCxcbiAgICAgICAgICAgICAgICBjbGVhbnVwOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBvb2wuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5zdGF0ZSA9ICdpZGxlJztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgYXdhaXQgcG9vbC5lbmQoKTtcblxuICAgICAgICAgICAgLy8gU1NMIGVycm9ycyBoYXBwZW4gYmVmb3JlIGF1dGgg4oCUIGNoZWNrIGZpcnN0XG4gICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJyc7XG4gICAgICAgICAgICBjb25zdCBpc1NTTEVycm9yID0gZXJyTXNnLmluY2x1ZGVzKCdkb2VzIG5vdCBzdXBwb3J0IFNTTCcpO1xuICAgICAgICAgICAgY29uc3Qgc3NsTW9kZTogVFNTTE1vZGUgPSBzdG9yZS5jb25maWcuc3NsbW9kZSA/PyAncHJlZmVyJztcblxuICAgICAgICAgICAgaWYgKGlzU1NMRXJyb3IgJiYgc3NsTW9kZSA9PT0gJ3ByZWZlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXR0ZW1wdENvbm5lY3Rpb24ocGFzc3dvcmQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGdDb2RlID0gKGVyciBhcyB7Y29kZT86IHN0cmluZ30pLmNvZGU7XG4gICAgICAgICAgICBjb25zdCBpc0F1dGhFcnJvciA9XG4gICAgICAgICAgICAgICAgcGdDb2RlID09PSAnMjhQMDEnIHx8XG4gICAgICAgICAgICAgICAgcGdDb2RlID09PSAnMjgwMDAnIHx8XG4gICAgICAgICAgICAgICAgZXJyTXNnLmluY2x1ZGVzKCdwYXNzd29yZCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cbiAgICAgICAgICAgIGlmICghaXNBdXRoRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5lcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRDb25uZWN0aW9uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLndyb25nQXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wcm9tcHRDb3VudCA+IDA7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucHJvbXB0Q291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnbmVlZC1wYXNzd29yZCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgd2hlbigoKSA9PiBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQgIT09IG51bGwpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdQYXNzd29yZCA9IHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wYXNzd29yZCE7XG5cbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5zdGF0ZSA9ICdjb25uZWN0aW5nJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXR0ZW1wdENvbm5lY3Rpb24obmV3UGFzc3dvcmQsIHNzbENvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGF0dGVtcHRDb25uZWN0aW9uKGNvbmZpZy5wYXNzd29yZCwgc3NsKTtcbn07XG4iXX0=
@@ -0,0 +1,11 @@
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 isLocalhost: (hostname: string) => boolean;
11
+ //# sourceMappingURL=detect.d.mts.map
@@ -0,0 +1 @@
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,WAAW,GAAI,UAAU,MAAM,KAAG,OAS9C,CAAC"}