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.
- package/dist/app/assemble.d.mts +5 -0
- package/dist/app/assemble.d.mts.map +1 -0
- package/dist/app/assemble.mjs +161 -0
- package/dist/app/config.d.mts +9 -0
- package/dist/app/config.d.mts.map +1 -0
- package/dist/app/config.mjs +49 -0
- package/dist/app/db.d.mts +9 -0
- package/dist/app/db.d.mts.map +1 -0
- package/dist/app/db.mjs +181 -0
- package/dist/app/detect.d.mts +11 -0
- package/dist/app/detect.d.mts.map +1 -0
- package/dist/app/detect.mjs +105 -0
- package/dist/app/index.d.mts +3 -0
- package/dist/app/index.d.mts.map +1 -0
- package/dist/app/index.mjs +81 -0
- package/dist/app/open-url.d.mts +4 -0
- package/dist/app/open-url.d.mts.map +1 -0
- package/dist/app/open-url.mjs +27 -0
- package/dist/app/session.d.mts +8 -0
- package/dist/app/session.d.mts.map +1 -0
- package/dist/app/session.mjs +155 -0
- package/dist/app/ssh.d.mts +3 -0
- package/dist/app/ssh.d.mts.map +1 -0
- package/dist/app/ssh.mjs +207 -0
- package/dist/db/analyze.d.mts +1 -1
- package/dist/db/analyze.d.mts.map +1 -1
- package/dist/db/analyze.mjs +1 -1
- package/dist/db/attributes.d.mts +3 -3
- package/dist/db/attributes.d.mts.map +1 -1
- package/dist/db/attributes.mjs +2 -2
- package/dist/db/enums.d.mts +1 -1
- package/dist/db/enums.d.mts.map +1 -1
- package/dist/db/enums.mjs +2 -2
- package/dist/db/file-stats.d.mts +1 -1
- package/dist/db/file-stats.d.mts.map +1 -1
- package/dist/db/file-stats.mjs +1 -1
- package/dist/db/foreign-keys.d.mts +2 -2
- package/dist/db/foreign-keys.d.mts.map +1 -1
- package/dist/db/foreign-keys.mjs +1 -1
- package/dist/db/index.d.mts +9 -9
- package/dist/db/index.d.mts.map +1 -1
- package/dist/db/index.mjs +10 -10
- package/dist/db/indexes.d.mts +1 -1
- package/dist/db/indexes.d.mts.map +1 -1
- package/dist/db/indexes.mjs +1 -1
- package/dist/db/relations.d.mts +2 -2
- package/dist/db/relations.d.mts.map +1 -1
- package/dist/db/relations.mjs +2 -2
- package/dist/db/stats.d.mts +1 -1
- package/dist/db/stats.d.mts.map +1 -1
- package/dist/db/stats.mjs +2 -2
- package/dist/db/version.d.mts +2 -1
- package/dist/db/version.d.mts.map +1 -1
- package/dist/db/version.mjs +9 -1
- package/dist/index.d.mts +4 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +105 -51
- package/dist/lib/trpc-url.d.mts +2 -0
- package/dist/lib/trpc-url.d.mts.map +1 -0
- package/dist/lib/trpc-url.mjs +6 -0
- package/dist/lib/trpc.d.mts +7 -0
- package/dist/lib/trpc.d.mts.map +1 -0
- package/dist/lib/trpc.mjs +37 -0
- package/dist/lib/trpc.react.d.mts +4 -0
- package/dist/lib/trpc.react.d.mts.map +1 -0
- package/dist/lib/trpc.react.mjs +3 -0
- package/dist/lib/version.d.mts +2 -0
- package/dist/lib/version.d.mts.map +1 -0
- package/dist/lib/version.mjs +5 -0
- package/dist/providers/TrpcProvider.d.ts +9 -0
- package/dist/providers/TrpcProvider.d.ts.map +1 -0
- package/dist/providers/TrpcProvider.js +41 -0
- package/dist/schemas/index.d.mts +106 -1
- package/dist/schemas/index.d.mts.map +1 -1
- package/dist/schemas/index.mjs +27 -2
- package/dist/store.d.mts +64 -0
- package/dist/store.d.mts.map +1 -0
- package/dist/store.mjs +68 -0
- package/dist/{App.d.ts → types/connection.d.mts} +3 -9
- package/dist/types/connection.d.mts.map +1 -0
- package/dist/types/connection.mjs +2 -0
- package/dist/ui/App.d.ts +10 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +13 -0
- package/dist/ui/components/DB.d.ts +10 -0
- package/dist/ui/components/DB.d.ts.map +1 -0
- package/dist/ui/components/DB.js +22 -0
- package/dist/{components → ui/components}/Error.d.ts +1 -1
- package/dist/ui/components/Error.d.ts.map +1 -0
- package/dist/ui/components/Error.js +6 -0
- package/dist/ui/components/Gate.d.ts +10 -0
- package/dist/ui/components/Gate.d.ts.map +1 -0
- package/dist/ui/components/Gate.js +15 -0
- package/dist/ui/components/Introspect.d.ts +10 -0
- package/dist/ui/components/Introspect.d.ts.map +1 -0
- package/dist/ui/components/Introspect.js +66 -0
- package/dist/ui/components/PasswordInput.d.ts +7 -0
- package/dist/ui/components/PasswordInput.d.ts.map +1 -0
- package/dist/ui/components/PasswordInput.js +32 -0
- package/dist/ui/components/SSH.d.ts +10 -0
- package/dist/ui/components/SSH.d.ts.map +1 -0
- package/dist/ui/components/SSH.js +22 -0
- package/dist/ui/components/Session.d.ts +10 -0
- package/dist/ui/components/Session.d.ts.map +1 -0
- package/dist/ui/components/Session.js +47 -0
- package/dist/ui/components/Spinner.d.ts +3 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +18 -0
- package/dist/ui/components/Splash.d.ts +3 -0
- package/dist/ui/components/Splash.d.ts.map +1 -0
- package/dist/ui/components/Splash.js +13 -0
- package/dist/validatePaths.d.mts +1 -1
- package/dist/validatePaths.d.mts.map +1 -1
- package/dist/validatePaths.mjs +17 -11
- package/package.json +22 -2
- package/dist/App.d.ts.map +0 -1
- package/dist/App.js +0 -9
- package/dist/components/Error.d.ts.map +0 -1
- package/dist/components/Error.js +0 -6
|
@@ -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"}
|
package/dist/app/db.mjs
ADDED
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2RiLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFJdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFPdkQsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQztBQUVsQixNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBWSxFQUFVLEVBQUU7SUFDbkQsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNkLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELE1BQU0sTUFBTSxHQUFHLEdBS2QsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTyxtQkFBbUIsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFVRixNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBcUIsRUFBRSxDQUN6RCxLQUFLLENBQUM7SUFDRixRQUFRLEVBQUUsV0FBVztJQUNyQixJQUFJLEVBQUUsSUFBSTtJQUNWLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFFBQVEsRUFBRSxTQUErQjtDQUM1QyxDQUFDO0tBQ0csR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVE7SUFDbEQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJO0lBQ2pCLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRO0lBQ3RELFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRO0lBQ2xELFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRO0NBQ3pELENBQUMsQ0FBQztLQUNGLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1osS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7SUFDekIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDeEMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1gsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVE7UUFDekMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSTtRQUNyRCxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVE7UUFDbEQsUUFBUSxFQUNKLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDaEMsTUFBTSxDQUFDLFFBQVE7UUFDbkIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1lBQ2xCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUTtLQUN4QixDQUFDLENBQUM7U0FDRixLQUFLLEVBQUU7SUFDZCxDQUFDLENBQUMsTUFBTSxDQUNmO0tBQ0EsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRO0lBQ2xELElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSTtJQUN0QyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVE7SUFDbEQsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRO0lBQ2xELFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtDQUM1QixDQUFDLENBQUM7S0FDRixLQUFLLEVBQUUsQ0FBQztBQVdqQixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWEsRUFBYyxFQUFFO0lBQ2pELE1BQU0sSUFBSSxHQUFhLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQztJQUV4RCxPQUFPLElBQUksS0FBSyxTQUFTO1FBQ3JCLENBQUMsQ0FBQyxLQUFLO1FBQ1AsQ0FBQyxDQUFDO1lBQ0ksa0JBQWtCLEVBQ2QsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssYUFBYTtZQUNsRCxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXO2dCQUN4QixDQUFDLENBQUM7b0JBQ0ksRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7aUJBQ3REO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUNwQixDQUFDLENBQUM7b0JBQ0ksSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7aUJBQ3BEO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNO2dCQUNuQixDQUFDLENBQUM7b0JBQ0ksR0FBRyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7aUJBQ2xEO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDWixDQUFDO0FBQ1osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFDMUIsS0FBYSxFQUNxQixFQUFFO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbEMsK0VBQStFO0lBQy9FLE1BQU0sY0FBYyxHQUNoQixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPO1FBQ2pDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsS0FBSyxJQUFJO1FBQ3hDLENBQUMsQ0FBQyxXQUFXO1FBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDMUIsTUFBTSxjQUFjLEdBQ2hCLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU87UUFDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxLQUFLLElBQUk7UUFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVM7UUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFFdEIsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDaEUsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4RCxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDaEUsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQzNCLFFBQTRCLEVBQzVCLFNBQXFCLEVBQ2EsRUFBRTtRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQztZQUNsQixJQUFJLEVBQUUsY0FBYztZQUNwQixJQUFJLEVBQUUsY0FBYztZQUNwQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3JCLFFBQVE7WUFDUixHQUFHLEVBQUUsU0FBUztZQUNkLHVCQUF1QixFQUFFLE1BQU07U0FDbEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRWpCLE1BQU0sT0FBTyxHQUFHLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFakQsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGVBQWU7b0JBQzFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3BCLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMscUJBQXFCO29CQUNoRCxPQUFPLENBQUMsV0FBVyxDQUFDO2dCQUN4QixLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7WUFDdkQsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPO2dCQUNILElBQUk7Z0JBQ0osT0FBTyxFQUFFLEdBQUcsRUFBRTtvQkFDVixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ1gsV0FBVyxDQUFDLEdBQUcsRUFBRTt3QkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7b0JBQ2xELENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7YUFDSixDQUFDO1FBQ04sQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVqQiw4Q0FBOEM7WUFDOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUMzRCxNQUFNLE9BQU8sR0FBYSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUM7WUFFM0QsSUFBSSxVQUFVLElBQUksT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUksR0FBdUIsQ0FBQyxJQUFJLENBQUM7WUFDN0MsTUFBTSxXQUFXLEdBQ2IsTUFBTSxLQUFLLE9BQU87Z0JBQ2xCLE1BQU0sS0FBSyxPQUFPO2dCQUNsQixNQUFNLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFFakQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNmLFdBQVcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO29CQUMvQyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUs7d0JBQ2hDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLFNBQVMsQ0FBQztZQUNyQixDQUFDO1lBRUQsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFlBQVk7b0JBQ3ZDLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDbkQsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUMvQyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQztZQUMzRCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBRW5FLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUyxDQUFDO1lBRTdELFdBQVcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUMvQyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmVhZEZpbGVTeW5jfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwZyBmcm9tICdwZyc7XG5pbXBvcnQge3J1bkluQWN0aW9uLCB3aGVufSBmcm9tICdtb2J4JztcbmltcG9ydCB7c2NvcGV9IGZyb20gJ3Njb3BlLXV0aWxpdGllcyc7XG5cbmltcG9ydCB0eXBlIHtUU3RvcmV9IGZyb20gJy4uL3N0b3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7VFNTTE1vZGV9IGZyb20gJy4uL2luZGV4Lm1qcyc7XG5pbXBvcnQge2ZldGNoUG9zdGdyZXNWZXJzaW9ufSBmcm9tICcuLi9kYi92ZXJzaW9uLm1qcyc7XG5cbmV4cG9ydCB0eXBlIFREQkNvbm5lY3Rpb24gPSB7XG4gICAgcmVhZG9ubHkgcG9vbDogSW5zdGFuY2VUeXBlPHR5cGVvZiBQb29sPjtcbiAgICByZWFkb25seSBjbGVhbnVwOiAoKSA9PiB2b2lkO1xufTtcblxuY29uc3Qge1Bvb2x9ID0gcGc7XG5cbmNvbnN0IGZvcm1hdENvbm5lY3Rpb25FcnJvciA9IChlcnI6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGVycikgfHwgJ1Vua25vd24gZXJyb3InO1xuICAgIH1cblxuICAgIGlmIChlcnIubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gZXJyLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gU3lzdGVtIGVycm9ycyAoRUNPTk5SRUZVU0VELCBFVElNRURPVVQsIGV0Yy4pXG4gICAgY29uc3Qgc3lzRXJyID0gZXJyIGFzIHtcbiAgICAgICAgY29kZT86IHN0cmluZztcbiAgICAgICAgc3lzY2FsbD86IHN0cmluZztcbiAgICAgICAgYWRkcmVzcz86IHN0cmluZztcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICB9O1xuICAgIGlmIChzeXNFcnIuY29kZSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IFtzeXNFcnIuY29kZV07XG4gICAgICAgIGlmIChzeXNFcnIuc3lzY2FsbCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChzeXNFcnIuc3lzY2FsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5c0Vyci5hZGRyZXNzKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHN5c0Vyci5hZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3lzRXJyLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChTdHJpbmcoc3lzRXJyLnBvcnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xuICAgIH1cblxuICAgIHJldHVybiAnQ29ubmVjdGlvbiBmYWlsZWQnO1xufTtcblxudHlwZSBUUmVzb2x2ZWREQkNvbmZpZyA9IHtcbiAgICByZWFkb25seSBob3N0bmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBkYXRhYmFzZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcGFzc3dvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHJlc29sdmVEQkNvbmZpZyA9IChzdG9yZTogVFN0b3JlKTogVFJlc29sdmVkREJDb25maWcgPT5cbiAgICBzY29wZSh7XG4gICAgICAgIGhvc3RuYW1lOiAnbG9jYWxob3N0JyxcbiAgICAgICAgcG9ydDogNTQzMixcbiAgICAgICAgZGF0YWJhc2U6ICdwb3N0Z3JlcycsXG4gICAgICAgIHVzZXJuYW1lOiAncG9zdGdyZXMnLFxuICAgICAgICBwYXNzd29yZDogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB9KVxuICAgICAgICAubGV0KChjb25maWcpID0+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"}
|