dbctx 1.5.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +6012 -188
- package/package.json +12 -9
- package/dist/app/assemble.d.mts +0 -5
- package/dist/app/assemble.d.mts.map +0 -1
- package/dist/app/assemble.mjs +0 -166
- package/dist/app/config.d.mts +0 -9
- package/dist/app/config.d.mts.map +0 -1
- package/dist/app/config.mjs +0 -49
- package/dist/app/db.d.mts +0 -9
- package/dist/app/db.d.mts.map +0 -1
- package/dist/app/db.mjs +0 -182
- package/dist/app/detect.d.mts +0 -14
- package/dist/app/detect.d.mts.map +0 -1
- package/dist/app/detect.mjs +0 -108
- package/dist/app/index.d.mts +0 -3
- package/dist/app/index.d.mts.map +0 -1
- package/dist/app/index.mjs +0 -156
- package/dist/app/open-url.d.mts +0 -4
- package/dist/app/open-url.d.mts.map +0 -1
- package/dist/app/open-url.mjs +0 -28
- package/dist/app/session.d.mts +0 -8
- package/dist/app/session.d.mts.map +0 -1
- package/dist/app/session.mjs +0 -155
- package/dist/app/ssh.d.mts +0 -3
- package/dist/app/ssh.d.mts.map +0 -1
- package/dist/app/ssh.mjs +0 -218
- package/dist/db/analyze.d.mts +0 -3
- package/dist/db/analyze.d.mts.map +0 -1
- package/dist/db/analyze.mjs +0 -16
- package/dist/db/attributes.d.mts +0 -16
- package/dist/db/attributes.d.mts.map +0 -1
- package/dist/db/attributes.mjs +0 -37
- package/dist/db/enums.d.mts +0 -8
- package/dist/db/enums.d.mts.map +0 -1
- package/dist/db/enums.mjs +0 -24
- package/dist/db/file-stats.d.mts +0 -11
- package/dist/db/file-stats.d.mts.map +0 -1
- package/dist/db/file-stats.mjs +0 -43
- package/dist/db/foreign-keys.d.mts +0 -14
- package/dist/db/foreign-keys.d.mts.map +0 -1
- package/dist/db/foreign-keys.mjs +0 -44
- package/dist/db/index.d.mts +0 -10
- package/dist/db/index.d.mts.map +0 -1
- package/dist/db/index.mjs +0 -10
- package/dist/db/indexes.d.mts +0 -16
- package/dist/db/indexes.d.mts.map +0 -1
- package/dist/db/indexes.mjs +0 -38
- package/dist/db/relations.d.mts +0 -11
- package/dist/db/relations.d.mts.map +0 -1
- package/dist/db/relations.mjs +0 -32
- package/dist/db/stats.d.mts +0 -12
- package/dist/db/stats.d.mts.map +0 -1
- package/dist/db/stats.mjs +0 -34
- package/dist/db/version.d.mts +0 -14
- package/dist/db/version.d.mts.map +0 -1
- package/dist/db/version.mjs +0 -27
- package/dist/index.d.mts +0 -23
- package/dist/index.d.mts.map +0 -1
- package/dist/lib/env.d.mts +0 -2
- package/dist/lib/env.d.mts.map +0 -1
- package/dist/lib/env.mjs +0 -4
- package/dist/lib/trpc-url.d.mts +0 -2
- package/dist/lib/trpc-url.d.mts.map +0 -1
- package/dist/lib/trpc-url.mjs +0 -5
- package/dist/lib/trpc.d.mts +0 -7
- package/dist/lib/trpc.d.mts.map +0 -1
- package/dist/lib/trpc.mjs +0 -37
- package/dist/lib/trpc.react.d.mts +0 -4
- package/dist/lib/trpc.react.d.mts.map +0 -1
- package/dist/lib/trpc.react.mjs +0 -3
- package/dist/lib/version.d.mts +0 -2
- package/dist/lib/version.d.mts.map +0 -1
- package/dist/lib/version.mjs +0 -5
- package/dist/logger.d.mts +0 -3
- package/dist/logger.d.mts.map +0 -1
- package/dist/logger.mjs +0 -8
- package/dist/providers/TrpcProvider.d.ts +0 -9
- package/dist/providers/TrpcProvider.d.ts.map +0 -1
- package/dist/providers/TrpcProvider.js +0 -41
- package/dist/store.d.mts +0 -83
- package/dist/store.d.mts.map +0 -1
- package/dist/store.mjs +0 -84
- package/dist/types/connection.d.mts +0 -17
- package/dist/types/connection.d.mts.map +0 -1
- package/dist/types/connection.mjs +0 -2
- package/dist/ui/App.d.ts +0 -10
- package/dist/ui/App.d.ts.map +0 -1
- package/dist/ui/App.js +0 -23
- package/dist/ui/components/DB.d.ts +0 -10
- package/dist/ui/components/DB.d.ts.map +0 -1
- package/dist/ui/components/DB.js +0 -22
- package/dist/ui/components/Error.d.ts +0 -7
- package/dist/ui/components/Error.d.ts.map +0 -1
- package/dist/ui/components/Error.js +0 -6
- package/dist/ui/components/Gate.d.ts +0 -10
- package/dist/ui/components/Gate.d.ts.map +0 -1
- package/dist/ui/components/Gate.js +0 -15
- package/dist/ui/components/Introspect.d.ts +0 -10
- package/dist/ui/components/Introspect.d.ts.map +0 -1
- package/dist/ui/components/Introspect.js +0 -66
- package/dist/ui/components/OutputJson.d.ts +0 -10
- package/dist/ui/components/OutputJson.d.ts.map +0 -1
- package/dist/ui/components/OutputJson.js +0 -18
- package/dist/ui/components/PasswordInput.d.ts +0 -7
- package/dist/ui/components/PasswordInput.d.ts.map +0 -1
- package/dist/ui/components/PasswordInput.js +0 -32
- package/dist/ui/components/SSH.d.ts +0 -10
- package/dist/ui/components/SSH.d.ts.map +0 -1
- package/dist/ui/components/SSH.js +0 -22
- package/dist/ui/components/Session.d.ts +0 -10
- package/dist/ui/components/Session.d.ts.map +0 -1
- package/dist/ui/components/Session.js +0 -47
- package/dist/ui/components/Spinner.d.ts +0 -3
- package/dist/ui/components/Spinner.d.ts.map +0 -1
- package/dist/ui/components/Spinner.js +0 -18
- package/dist/ui/components/Splash.d.ts +0 -3
- package/dist/ui/components/Splash.d.ts.map +0 -1
- package/dist/ui/components/Splash.js +0 -13
- package/dist/ui/components/TextInput.d.ts +0 -11
- package/dist/ui/components/TextInput.d.ts.map +0 -1
- package/dist/ui/components/TextInput.js +0 -286
- package/dist/ui/components/UserExplanation.d.ts +0 -10
- package/dist/ui/components/UserExplanation.d.ts.map +0 -1
- package/dist/ui/components/UserExplanation.js +0 -34
- package/dist/validatePaths.d.mts +0 -13
- package/dist/validatePaths.d.mts.map +0 -1
- package/dist/validatePaths.mjs +0 -54
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dbctx",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "AI-enriched database context for humans and coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.mjs",
|
|
@@ -28,9 +28,6 @@
|
|
|
28
28
|
"url": "https://github.com/dbctx/dbctx"
|
|
29
29
|
},
|
|
30
30
|
"license": "MIT",
|
|
31
|
-
"imports": {
|
|
32
|
-
"#client/*": "./dist/*"
|
|
33
|
-
},
|
|
34
31
|
"dependencies": {
|
|
35
32
|
"@tanstack/react-query": "5.90.20",
|
|
36
33
|
"@trpc/client": "11.8.1",
|
|
@@ -50,6 +47,7 @@
|
|
|
50
47
|
"scope-utilities": "2.2.1",
|
|
51
48
|
"ssh-config": "5.0.4",
|
|
52
49
|
"ssh2": "1.17.0",
|
|
50
|
+
"terminal-link": "5.0.0",
|
|
53
51
|
"uuidv7": "1.0.2",
|
|
54
52
|
"winston": "3.19.0",
|
|
55
53
|
"zod": "4.3.6"
|
|
@@ -62,8 +60,11 @@
|
|
|
62
60
|
"concurrently": "9.2.1",
|
|
63
61
|
"cross-env": "7.0.3",
|
|
64
62
|
"prettier": "3.8.1",
|
|
63
|
+
"tsup": "8.5.0",
|
|
64
|
+
"tsx": "4.20.4",
|
|
65
65
|
"typescript": "5.9.3",
|
|
66
|
-
"@dbctx/
|
|
66
|
+
"@dbctx/common": "0.0.0",
|
|
67
|
+
"@dbctx/core": "2.0.5"
|
|
67
68
|
},
|
|
68
69
|
"volta": {
|
|
69
70
|
"node": "24.0.0"
|
|
@@ -72,9 +73,11 @@
|
|
|
72
73
|
"dist/"
|
|
73
74
|
],
|
|
74
75
|
"scripts": {
|
|
75
|
-
"start": "
|
|
76
|
-
"dev": "
|
|
77
|
-
"build": "
|
|
78
|
-
"
|
|
76
|
+
"start": "tsup && node ./dist/index.mjs",
|
|
77
|
+
"dev": "tsup --watch",
|
|
78
|
+
"build": "tsup",
|
|
79
|
+
"typecheck": "tsc --noEmit",
|
|
80
|
+
"build:ts:watch": "tsc --watch --preserveWatchOutput --noEmit",
|
|
81
|
+
"test": "tsx --test src/flow/*.test.mts"
|
|
79
82
|
}
|
|
80
83
|
}
|
package/dist/app/assemble.d.mts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { Pool } from 'pg';
|
|
2
|
-
import type { TStore } from '../store.mjs';
|
|
3
|
-
import type { TDatabaseIntrospection } from '@dbctx/core';
|
|
4
|
-
export declare const assembleDatabase: (pool: Pool, store: TStore) => Promise<TDatabaseIntrospection>;
|
|
5
|
-
//# sourceMappingURL=assemble.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assemble.d.mts","sourceRoot":"./src/","sources":["app/assemble.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAI7B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AA4FxD,eAAO,MAAM,gBAAgB,GACzB,MAAM,IAAI,EACV,OAAO,MAAM,KACd,OAAO,CAAC,sBAAsB,CAmIhC,CAAC"}
|
package/dist/app/assemble.mjs
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import PQueue from 'p-queue';
|
|
2
|
-
import { runInAction } from 'mobx';
|
|
3
|
-
import { fetchDatabaseIdentifier, fetchDatabaseComment, fetchPublicRelations, fetchPublicEnums, fetchRelationAttributes, fetchRelationIndexes, fetchRelationForeignKeys, fetchViewDefinition, analyzeRelation, fetchRelationStats, } 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 isViewKind = (type) => type === 'view' || type === 'materialized_view';
|
|
98
|
-
const relationEntries = await Promise.all(allRelations.map(async (rel) => {
|
|
99
|
-
if (rel.type !== 'view') {
|
|
100
|
-
await queue.add(() => analyzeRelation(pool, rel.name));
|
|
101
|
-
runInAction(() => {
|
|
102
|
-
counts.analyzed += 1;
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
const [attributes, indexes, foreignKeys, stats, viewDefinition] = await Promise.all([
|
|
106
|
-
queue.add(() => fetchRelationAttributes(pool, rel.name)),
|
|
107
|
-
queue.add(() => fetchRelationIndexes(pool, rel.name)),
|
|
108
|
-
queue.add(() => fetchRelationForeignKeys(pool, rel.name)),
|
|
109
|
-
queue.add(() => fetchRelationStats(pool, rel.name)),
|
|
110
|
-
isViewKind(rel.type)
|
|
111
|
-
? queue.add(() => fetchViewDefinition(pool, rel.name))
|
|
112
|
-
: undefined,
|
|
113
|
-
]);
|
|
114
|
-
const attrs = attributes;
|
|
115
|
-
const idxs = indexes;
|
|
116
|
-
const fks = foreignKeys;
|
|
117
|
-
const relStats = stats;
|
|
118
|
-
const distinctLookup = new Map(relStats.attributes.map((a) => [
|
|
119
|
-
a.attribute_name,
|
|
120
|
-
a.estimated_distinct,
|
|
121
|
-
]));
|
|
122
|
-
runInAction(() => {
|
|
123
|
-
counts.columns += attrs.length;
|
|
124
|
-
counts.indexes += idxs.length;
|
|
125
|
-
counts.foreignKeys += fks.length;
|
|
126
|
-
});
|
|
127
|
-
const transformedAttrs = attrs.map((attr) => {
|
|
128
|
-
const base = transformAttribute(attr);
|
|
129
|
-
const distinct = distinctLookup.get(attr.attribute_name);
|
|
130
|
-
return distinct !== undefined
|
|
131
|
-
? { ...base, estimated_distinct: distinct }
|
|
132
|
-
: base;
|
|
133
|
-
});
|
|
134
|
-
const relationObj = {
|
|
135
|
-
name: rel.name,
|
|
136
|
-
comment: rel.comment,
|
|
137
|
-
kind: rel.type,
|
|
138
|
-
attributes: toRecord(transformedAttrs, (a) => a.name),
|
|
139
|
-
indexes: toRecord(idxs.map(transformIndex), (i) => i.index_name),
|
|
140
|
-
references: toRecord(fks.map(transformReference), (r) => r.constraint_name),
|
|
141
|
-
...(viewDefinition
|
|
142
|
-
? { viewDefinition: viewDefinition }
|
|
143
|
-
: {}),
|
|
144
|
-
};
|
|
145
|
-
return [rel.name, relationObj];
|
|
146
|
-
}));
|
|
147
|
-
runInAction(() => {
|
|
148
|
-
store.steps.introspection.state = 'done';
|
|
149
|
-
});
|
|
150
|
-
return {
|
|
151
|
-
type: 'postgresql',
|
|
152
|
-
version: {
|
|
153
|
-
version_string: store.steps.databaseConnection.postgresVersion,
|
|
154
|
-
version_number: store.steps.databaseConnection.postgresVersionNumber,
|
|
155
|
-
},
|
|
156
|
-
identifier: {
|
|
157
|
-
system_identifier: identifier.system_identifier,
|
|
158
|
-
database_oid: identifier.database_oid,
|
|
159
|
-
},
|
|
160
|
-
name: identifier.database_name,
|
|
161
|
-
comment: comment ?? null,
|
|
162
|
-
relations: Object.fromEntries(relationEntries),
|
|
163
|
-
enums: typedEnums,
|
|
164
|
-
};
|
|
165
|
-
};
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2Fzc2VtYmxlLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQVFqQyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ3JCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsTUFBTSxRQUFRLEdBQUcsQ0FDYixLQUFtQixFQUNuQixHQUF3QixFQUNQLEVBQUUsQ0FDbkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFL0QsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLElBQW9CLEVBQUUsRUFBRTtJQUNoRCxNQUFNLElBQUksR0FBRztRQUNULElBQUksRUFBRSxJQUFJLENBQUMsY0FBYztRQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7UUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1FBQzdCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztLQUN4QixDQUFDO0lBRUYsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE9BQU87WUFDSCxHQUFHLElBQUk7WUFDUCxJQUFJLEVBQUUsV0FBb0I7WUFDMUIsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUEwQztZQUNsRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQXFCO1NBQ25ELENBQUM7SUFDTixD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U0FDekM7UUFDRCxJQUFJLEVBQUUsVUFBVyxDQUFDLGFBQWE7UUFDL0IsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJO1FBQ3hCLFNBQVMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztRQUM5QyxLQUFLLEVBQUUsVUFBVTtLQUNwQixDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcbmltcG9ydCBQUXVldWUgZnJvbSAncC1xdWV1ZSc7XG5pbXBvcnQge3J1bkluQWN0aW9ufSBmcm9tICdtb2J4JztcblxuaW1wb3J0IHR5cGUge1RTdG9yZX0gZnJvbSAnLi4vc3RvcmUubWpzJztcbmltcG9ydCB0eXBlIHtURGF0YWJhc2VJbnRyb3NwZWN0aW9ufSBmcm9tICdAZGJjdHgvY29yZSc7XG5pbXBvcnQgdHlwZSB7VEF0dHJpYnV0ZUluZm99IGZyb20gJy4uL2RiL2F0dHJpYnV0ZXMubWpzJztcbmltcG9ydCB0eXBlIHtUSW5kZXhJbmZvfSBmcm9tICcuLi9kYi9pbmRleGVzLm1qcyc7XG5pbXBvcnQgdHlwZSB7VEZvcmVpZ25LZXlJbmZvfSBmcm9tICcuLi9kYi9mb3JlaWduLWtleXMubWpzJztcbmltcG9ydCB0eXBlIHtUUmVsYXRpb25TdGF0c30gZnJvbSAnLi4vZGIvc3RhdHMubWpzJztcbmltcG9ydCB7XG4gICAgZmV0Y2hEYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgZmV0Y2hEYXRhYmFzZUNvbW1lbnQsXG4gICAgZmV0Y2hQdWJsaWNSZWxhdGlvbnMsXG4gICAgZmV0Y2hQdWJsaWNFbnVtcyxcbiAgICBmZXRjaFJlbGF0aW9uQXR0cmlidXRlcyxcbiAgICBmZXRjaFJlbGF0aW9uSW5kZXhlcyxcbiAgICBmZXRjaFJlbGF0aW9uRm9yZWlnbktleXMsXG4gICAgZmV0Y2hWaWV3RGVmaW5pdGlvbixcbiAgICBhbmFseXplUmVsYXRpb24sXG4gICAgZmV0Y2hSZWxhdGlvblN0YXRzLFxufSBmcm9tICcuLi9kYi9pbmRleC5tanMnO1xuXG5jb25zdCB0b1JlY29yZCA9IDxUIGV4dGVuZHMgdW5rbm93bj4oXG4gICAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgICBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmcsXG4pOiBSZWNvcmQ8c3RyaW5nLCBUPiA9PlxuICAgIE9iamVjdC5mcm9tRW50cmllcyhpdGVtcy5tYXAoKGl0ZW0pID0+IFtrZXkoaXRlbSksIGl0ZW1dKSk7XG5cbmNvbnN0IHRyYW5zZm9ybUF0dHJpYnV0ZSA9IChhdHRyOiBUQXR0cmlidXRlSW5mbykgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICAgIG5hbWU6IGF0dHIuYXR0cmlidXRlX25hbWUsXG4gICAgICAgIGRhdGFfdHlwZTogYXR0ci5kYXRhX3R5cGUsXG4gICAgICAgIGlzX251bGxhYmxlOiBhdHRyLmlzX251bGxhYmxlLFxuICAgICAgICBjb21tZW50OiBhdHRyLmNvbW1lbnQsXG4gICAgfTtcblxuICAgIGlmIChhdHRyLmtpbmQgPT09ICdnZW5lcmF0ZWQnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAga2luZDogJ2dlbmVyYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICBnZW5lcmF0ZWRfc3RvcmFnZTogYXR0ci5nZW5lcmF0ZWRfc3RvcmFnZSEgYXMgJ3N0b3JlZCcgfCAndmlydHVhbCcsXG4gICAgICAgICAgICBnZW5lcmF0ZWRfZXhwcmVzc2lvbjogYXR0ci5nZW5lcmF0ZWRfZXhwcmVzc2lvbiEsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHIuaGFzX2RlZmF1bHRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICAgIGtpbmQ6ICdyZWd1bGFyJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgaGFzX2RlZmF1bHQ6IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgICAgIGRlZmF1bHRfZXhwcmVzc2lvbjogYXR0ci5kZWZhdWx0X2V4cHJlc3Npb24hLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICAgIGtpbmQ6ICdyZWd1bGFyJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgaGFzX2RlZmF1bHQ6IGZhbHNlIGFzIGNvbnN0LFxuICAgICAgICAgIH07XG59O1xuXG5jb25zdCBkZXJpdmVJbmRleEtpbmQgPSAoaWR4OiBUSW5kZXhJbmZvKSA9PlxuICAgIGlkeC5pc19wcmltYXJ5XG4gICAgICAgID8gKHtpbmRleF9raW5kOiAncHJpbWFyeSd9IGFzIGNvbnN0KVxuICAgICAgICA6IGlkeC5pc191bmlxdWVcbiAgICAgICAgICA/ICh7aW5kZXhfa2luZDogJ3VuaXF1ZSd9IGFzIGNvbnN0KVxuICAgICAgICAgIDogaWR4LmlzX2V4Y2x1c2lvblxuICAgICAgICAgICAgPyAoe1xuICAgICAgICAgICAgICAgICAgaW5kZXhfa2luZDogJ2V4Y2x1c2lvbicsXG4gICAgICAgICAgICAgICAgICBleGNsdXNpb25fb3BlcmF0b3JzOiBpZHguZXhjbHVzaW9uX29wZXJhdG9ycyEsXG4gICAgICAgICAgICAgIH0gYXMgY29uc3QpXG4gICAgICAgICAgICA6ICh7aW5kZXhfa2luZDogJ3BsYWluJ30gYXMgY29uc3QpO1xuXG5jb25zdCB0cmFuc2Zvcm1JbmRleCA9IChpZHg6IFRJbmRleEluZm8pID0+ICh7XG4gICAgaW5kZXhfbmFtZTogaWR4LmluZGV4X25hbWUsXG4gICAgcmVsYXRpb25fbmFtZTogaWR4LnJlbGF0aW9uX25hbWUsXG4gICAgYXR0cmlidXRlczogaWR4LmF0dHJpYnV0ZXMsXG4gICAgZGVmaW5pdGlvbjogaWR4LmRlZmluaXRpb24sXG4gICAgY29tbWVudDogaWR4LmNvbW1lbnQsXG4gICAgLi4uZGVyaXZlSW5kZXhLaW5kKGlkeCksXG4gICAgLi4uKGlkeC5pc19wYXJ0aWFsXG4gICAgICAgID8gKHtcbiAgICAgICAgICAgICAgaXNfcGFydGlhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFydGlhbF9wcmVkaWNhdGU6IGlkeC5wYXJ0aWFsX3ByZWRpY2F0ZSEsXG4gICAgICAgICAgfSBhcyBjb25zdClcbiAgICAgICAgOiAoe2lzX3BhcnRpYWw6IGZhbHNlfSBhcyBjb25zdCkpLFxufSk7XG5cbmNvbnN0IHRyYW5zZm9ybVJlZmVyZW5jZSA9IChmazogVEZvcmVpZ25LZXlJbmZvKSA9PiAoe1xuICAgIGNvbnN0cmFpbnRfbmFtZTogZmsuY29uc3RyYWludF9uYW1lLFxuICAgIGF0dHJpYnV0ZXM6IGZrLmF0dHJpYnV0ZXMsXG4gICAgcmVmZXJlbmNlZF9yZWxhdGlvbjogZmsucmVmZXJlbmNlZF9yZWxhdGlvbixcbiAgICByZWZlcmVuY2VkX2F0dHJpYnV0ZXM6IGZrLnJlZmVyZW5jZWRfYXR0cmlidXRlcyxcbiAgICBvbl91cGRhdGU6IGZrLm9uX3VwZGF0ZSxcbiAgICBvbl9kZWxldGU6IGZrLm9uX2RlbGV0ZSxcbiAgICBjb21tZW50OiBmay5jb21tZW50LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhc3NlbWJsZURhdGFiYXNlID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8VERhdGFiYXNlSW50cm9zcGVjdGlvbj4gPT4ge1xuICAgIGNvbnN0IHF1ZXVlID0gbmV3IFBRdWV1ZSh7Y29uY3VycmVuY3k6IDN9KTtcbiAgICBjb25zdCBjb3VudHMgPSBzdG9yZS5zdGVwcy5pbnRyb3NwZWN0aW9uLmNvdW50cztcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5zdGF0ZSA9ICdmZXRjaGluZyc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBbaWRlbnRpZmllciwgY29tbWVudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaERhdGFiYXNlSWRlbnRpZmllcihwb29sKSksXG4gICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaERhdGFiYXNlQ29tbWVudChwb29sKSksXG4gICAgXSk7XG5cbiAgICBjb25zdCBbZ3JvdXBlZCwgZW51bXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hQdWJsaWNSZWxhdGlvbnMocG9vbCkpLFxuICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hQdWJsaWNFbnVtcyhwb29sKSksXG4gICAgXSk7XG5cbiAgICBjb25zdCB0eXBlZEdyb3VwZWQgPSBncm91cGVkIGFzIEF3YWl0ZWQ8XG4gICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGZldGNoUHVibGljUmVsYXRpb25zPlxuICAgID47XG4gICAgY29uc3QgdHlwZWRFbnVtcyA9IGVudW1zIGFzIEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZmV0Y2hQdWJsaWNFbnVtcz4+O1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBjb3VudHMudGFibGVzID1cbiAgICAgICAgICAgICh0eXBlZEdyb3VwZWQudGFibGU/Lmxlbmd0aCA/PyAwKSArXG4gICAgICAgICAgICAodHlwZWRHcm91cGVkLnBhcnRpdGlvbmVkX3RhYmxlPy5sZW5ndGggPz8gMCk7XG4gICAgICAgIGNvdW50cy52aWV3cyA9XG4gICAgICAgICAgICAodHlwZWRHcm91cGVkLnZpZXc/Lmxlbmd0aCA/PyAwKSArXG4gICAgICAgICAgICAodHlwZWRHcm91cGVkLm1hdGVyaWFsaXplZF92aWV3Py5sZW5ndGggPz8gMCk7XG4gICAgICAgIGNvdW50cy5lbnVtcyA9IE9iamVjdC5rZXlzKHR5cGVkRW51bXMpLmxlbmd0aDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFsbFJlbGF0aW9ucyA9IFtcbiAgICAgICAgLi4uKHR5cGVkR3JvdXBlZC5wYXJ0aXRpb25lZF90YWJsZSA/PyBbXSksXG4gICAgICAgIC4uLih0eXBlZEdyb3VwZWQudGFibGUgPz8gW10pLFxuICAgICAgICAuLi4odHlwZWRHcm91cGVkLnZpZXcgPz8gW10pLFxuICAgICAgICAuLi4odHlwZWRHcm91cGVkLm1hdGVyaWFsaXplZF92aWV3ID8/IFtdKSxcbiAgICBdO1xuXG4gICAgY29uc3QgaXNWaWV3S2luZCA9ICh0eXBlOiBzdHJpbmcpID0+XG4gICAgICAgIHR5cGUgPT09ICd2aWV3JyB8fCB0eXBlID09PSAnbWF0ZXJpYWxpemVkX3ZpZXcnO1xuXG4gICAgY29uc3QgcmVsYXRpb25FbnRyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGFsbFJlbGF0aW9ucy5tYXAoYXN5bmMgKHJlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlbC50eXBlICE9PSAndmlldycpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZS5hZGQoKCkgPT4gYW5hbHl6ZVJlbGF0aW9uKHBvb2wsIHJlbC5uYW1lKSk7XG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb3VudHMuYW5hbHl6ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2F0dHJpYnV0ZXMsIGluZGV4ZXMsIGZvcmVpZ25LZXlzLCBzdGF0cywgdmlld0RlZmluaXRpb25dID1cbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaFJlbGF0aW9uQXR0cmlidXRlcyhwb29sLCByZWwubmFtZSkpLFxuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hSZWxhdGlvbkluZGV4ZXMocG9vbCwgcmVsLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUmVsYXRpb25Gb3JlaWduS2V5cyhwb29sLCByZWwubmFtZSkpLFxuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hSZWxhdGlvblN0YXRzKHBvb2wsIHJlbC5uYW1lKSksXG4gICAgICAgICAgICAgICAgICAgIGlzVmlld0tpbmQocmVsLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHF1ZXVlLmFkZCgoKSA9PiBmZXRjaFZpZXdEZWZpbml0aW9uKHBvb2wsIHJlbC5uYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCBhdHRycyA9IGF0dHJpYnV0ZXMgYXMgVEF0dHJpYnV0ZUluZm9bXTtcbiAgICAgICAgICAgIGNvbnN0IGlkeHMgPSBpbmRleGVzIGFzIFRJbmRleEluZm9bXTtcbiAgICAgICAgICAgIGNvbnN0IGZrcyA9IGZvcmVpZ25LZXlzIGFzIFRGb3JlaWduS2V5SW5mb1tdO1xuICAgICAgICAgICAgY29uc3QgcmVsU3RhdHMgPSBzdGF0cyBhcyBUUmVsYXRpb25TdGF0cztcblxuICAgICAgICAgICAgY29uc3QgZGlzdGluY3RMb29rdXAgPSBuZXcgTWFwKFxuICAgICAgICAgICAgICAgIHJlbFN0YXRzLmF0dHJpYnV0ZXMubWFwKChhKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgIGEuYXR0cmlidXRlX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIGEuZXN0aW1hdGVkX2Rpc3RpbmN0LFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvdW50cy5jb2x1bW5zICs9IGF0dHJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb3VudHMuaW5kZXhlcyArPSBpZHhzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb3VudHMuZm9yZWlnbktleXMgKz0gZmtzLmxlbmd0aDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZEF0dHJzID0gYXR0cnMubWFwKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRyYW5zZm9ybUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0aW5jdCA9IGRpc3RpbmN0TG9va3VwLmdldChhdHRyLmF0dHJpYnV0ZV9uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdGluY3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IHsuLi5iYXNlLCBlc3RpbWF0ZWRfZGlzdGluY3Q6IGRpc3RpbmN0fVxuICAgICAgICAgICAgICAgICAgICA6IGJhc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVsYXRpb25PYmogPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogcmVsLm5hbWUsXG4gICAgICAgICAgICAgICAgY29tbWVudDogcmVsLmNvbW1lbnQsXG4gICAgICAgICAgICAgICAga2luZDogcmVsLnR5cGUsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogdG9SZWNvcmQodHJhbnNmb3JtZWRBdHRycywgKGEpID0+IGEubmFtZSksXG4gICAgICAgICAgICAgICAgaW5kZXhlczogdG9SZWNvcmQoXG4gICAgICAgICAgICAgICAgICAgIGlkeHMubWFwKHRyYW5zZm9ybUluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgKGkpID0+IGkuaW5kZXhfbmFtZSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXM6IHRvUmVjb3JkKFxuICAgICAgICAgICAgICAgICAgICBma3MubWFwKHRyYW5zZm9ybVJlZmVyZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIChyKSA9PiByLmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIC4uLih2aWV3RGVmaW5pdGlvblxuICAgICAgICAgICAgICAgICAgICA/IHt2aWV3RGVmaW5pdGlvbjogdmlld0RlZmluaXRpb24gYXMgc3RyaW5nfVxuICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBbcmVsLm5hbWUsIHJlbGF0aW9uT2JqXSBhcyBjb25zdDtcbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5zdGF0ZSA9ICdkb25lJztcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdwb3N0Z3Jlc3FsJyxcbiAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgdmVyc2lvbl9zdHJpbmc6IHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wb3N0Z3Jlc1ZlcnNpb24hLFxuICAgICAgICAgICAgdmVyc2lvbl9udW1iZXI6XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBvc3RncmVzVmVyc2lvbk51bWJlciEsXG4gICAgICAgIH0sXG4gICAgICAgIGlkZW50aWZpZXI6IHtcbiAgICAgICAgICAgIHN5c3RlbV9pZGVudGlmaWVyOiBpZGVudGlmaWVyIS5zeXN0ZW1faWRlbnRpZmllcixcbiAgICAgICAgICAgIGRhdGFiYXNlX29pZDogaWRlbnRpZmllciEuZGF0YWJhc2Vfb2lkLFxuICAgICAgICB9LFxuICAgICAgICBuYW1lOiBpZGVudGlmaWVyIS5kYXRhYmFzZV9uYW1lLFxuICAgICAgICBjb21tZW50OiBjb21tZW50ID8/IG51bGwsXG4gICAgICAgIHJlbGF0aW9uczogT2JqZWN0LmZyb21FbnRyaWVzKHJlbGF0aW9uRW50cmllcyksXG4gICAgICAgIGVudW1zOiB0eXBlZEVudW1zLFxuICAgIH07XG59O1xuIl19
|
package/dist/app/config.d.mts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
type TConfig = {
|
|
2
|
-
readonly token?: string;
|
|
3
|
-
readonly device_id: string;
|
|
4
|
-
};
|
|
5
|
-
export declare const readConfig: () => Promise<TConfig>;
|
|
6
|
-
export declare const writeConfig: (token: string) => Promise<void>;
|
|
7
|
-
export declare const flushConfig: () => Promise<void>;
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=config.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.mts","sourceRoot":"./src/","sources":["app/config.mts"],"names":[],"mappings":"AAQA,KAAK,OAAO,GAAG;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAC,CAAC;AAgBrE,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,OAAO,CAiBlD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAG7D,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAQhD,CAAC"}
|
package/dist/app/config.mjs
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
4
|
-
import { uuidv7 } from 'uuidv7';
|
|
5
|
-
const CONFIG_DIR = join(homedir(), '.dbctx');
|
|
6
|
-
const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
|
|
7
|
-
const readRawConfig = async () => {
|
|
8
|
-
try {
|
|
9
|
-
const raw = await readFile(CONFIG_PATH, 'utf-8');
|
|
10
|
-
return JSON.parse(raw) ?? {};
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return {};
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
const persist = async (data) => {
|
|
17
|
-
await mkdir(CONFIG_DIR, { recursive: true });
|
|
18
|
-
await writeFile(CONFIG_PATH, JSON.stringify(data, null, 4), 'utf-8');
|
|
19
|
-
};
|
|
20
|
-
export const readConfig = async () => {
|
|
21
|
-
const raw = await readRawConfig();
|
|
22
|
-
if (typeof raw.device_id === 'string' && raw.device_id.length > 0) {
|
|
23
|
-
return {
|
|
24
|
-
token: typeof raw.token === 'string' ? raw.token : undefined,
|
|
25
|
-
device_id: raw.device_id,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
const device_id = uuidv7();
|
|
29
|
-
await persist({ ...raw, device_id });
|
|
30
|
-
return {
|
|
31
|
-
token: typeof raw.token === 'string' ? raw.token : undefined,
|
|
32
|
-
device_id,
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
export const writeConfig = async (token) => {
|
|
36
|
-
const raw = await readRawConfig();
|
|
37
|
-
await persist({ ...raw, token });
|
|
38
|
-
};
|
|
39
|
-
export const flushConfig = async () => {
|
|
40
|
-
try {
|
|
41
|
-
const raw = await readRawConfig();
|
|
42
|
-
const { token: _, ...rest } = raw;
|
|
43
|
-
await persist(rest);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
// ignore if file doesn't exist
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9jb25maWcubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBSXBELE1BQU0sYUFBYSxHQUFHLEtBQUssSUFBc0MsRUFBRTtJQUMvRCxJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLElBQTZCLEVBQWlCLEVBQUU7SUFDbkUsTUFBTSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxJQUFzQixFQUFFO0lBQ25ELE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxFQUFFLENBQUM7SUFFbEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE9BQU87WUFDSCxLQUFLLEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM1RCxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7U0FDM0IsQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUMzQixNQUFNLE9BQU8sQ0FBQyxFQUFDLEdBQUcsR0FBRyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7SUFFbkMsT0FBTztRQUNILEtBQUssRUFBRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzVELFNBQVM7S0FDWixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxLQUFhLEVBQWlCLEVBQUU7SUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxhQUFhLEVBQUUsQ0FBQztJQUNsQyxNQUFNLE9BQU8sQ0FBQyxFQUFDLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBbUIsRUFBRTtJQUNqRCxJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDTCwrQkFBK0I7SUFDbkMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aG9tZWRpcn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQge2pvaW59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge3JlYWRGaWxlLCB3cml0ZUZpbGUsIG1rZGlyfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7dXVpZHY3fSBmcm9tICd1dWlkdjcnO1xuXG5jb25zdCBDT05GSUdfRElSID0gam9pbihob21lZGlyKCksICcuZGJjdHgnKTtcbmNvbnN0IENPTkZJR19QQVRIID0gam9pbihDT05GSUdfRElSLCAnY29uZmlnLmpzb24nKTtcblxudHlwZSBUQ29uZmlnID0ge3JlYWRvbmx5IHRva2VuPzogc3RyaW5nOyByZWFkb25seSBkZXZpY2VfaWQ6IHN0cmluZ307XG5cbmNvbnN0IHJlYWRSYXdDb25maWcgPSBhc3luYyAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKENPTkZJR19QQVRILCAndXRmLTgnKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSA/PyB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn07XG5cbmNvbnN0IHBlcnNpc3QgPSBhc3luYyAoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBta2RpcihDT05GSUdfRElSLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKENPTkZJR19QQVRILCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCA0KSwgJ3V0Zi04Jyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVhZENvbmZpZyA9IGFzeW5jICgpOiBQcm9taXNlPFRDb25maWc+ID0+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkUmF3Q29uZmlnKCk7XG5cbiAgICBpZiAodHlwZW9mIHJhdy5kZXZpY2VfaWQgPT09ICdzdHJpbmcnICYmIHJhdy5kZXZpY2VfaWQubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9rZW46IHR5cGVvZiByYXcudG9rZW4gPT09ICdzdHJpbmcnID8gcmF3LnRva2VuIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGV2aWNlX2lkOiByYXcuZGV2aWNlX2lkLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRldmljZV9pZCA9IHV1aWR2NygpO1xuICAgIGF3YWl0IHBlcnNpc3Qoey4uLnJhdywgZGV2aWNlX2lkfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbjogdHlwZW9mIHJhdy50b2tlbiA9PT0gJ3N0cmluZycgPyByYXcudG9rZW4gOiB1bmRlZmluZWQsXG4gICAgICAgIGRldmljZV9pZCxcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHdyaXRlQ29uZmlnID0gYXN5bmMgKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkUmF3Q29uZmlnKCk7XG4gICAgYXdhaXQgcGVyc2lzdCh7Li4ucmF3LCB0b2tlbn0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGZsdXNoQ29uZmlnID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRSYXdDb25maWcoKTtcbiAgICAgICAgY29uc3Qge3Rva2VuOiBfLCAuLi5yZXN0fSA9IHJhdztcbiAgICAgICAgYXdhaXQgcGVyc2lzdChyZXN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlIGlmIGZpbGUgZG9lc24ndCBleGlzdFxuICAgIH1cbn07XG4iXX0=
|
package/dist/app/db.d.mts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { TStore } from '../store.mjs';
|
|
2
|
-
export type TDBConnection = {
|
|
3
|
-
readonly pool: InstanceType<typeof Pool>;
|
|
4
|
-
readonly cleanup: () => void;
|
|
5
|
-
};
|
|
6
|
-
declare const Pool: typeof import("pg").Pool;
|
|
7
|
-
export declare const connectDB: (store: TStore) => Promise<TDBConnection | undefined>;
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=db.d.mts.map
|
package/dist/app/db.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.mts","sourceRoot":"./src/","sources":["app/db.mts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAIzC,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,QAAA,MAAO,IAAI,0BAAM,CAAC;AAyHlB,eAAO,MAAM,SAAS,GAClB,OAAO,MAAM,KACd,OAAO,CAAC,aAAa,GAAG,SAAS,CA+GnC,CAAC"}
|
package/dist/app/db.mjs
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import pg from 'pg';
|
|
3
|
-
import { runInAction, when } from 'mobx';
|
|
4
|
-
import { scope } from 'scope-utilities';
|
|
5
|
-
import { fetchPostgresVersion } from '../db/version.mjs';
|
|
6
|
-
const { Pool } = pg;
|
|
7
|
-
const formatConnectionError = (err) => {
|
|
8
|
-
if (!(err instanceof Error)) {
|
|
9
|
-
return String(err) || 'Unknown error';
|
|
10
|
-
}
|
|
11
|
-
if (err.message) {
|
|
12
|
-
return err.message;
|
|
13
|
-
}
|
|
14
|
-
// System errors (ECONNREFUSED, ETIMEDOUT, etc.)
|
|
15
|
-
const sysErr = err;
|
|
16
|
-
if (sysErr.code) {
|
|
17
|
-
const parts = [sysErr.code];
|
|
18
|
-
if (sysErr.syscall) {
|
|
19
|
-
parts.push(sysErr.syscall);
|
|
20
|
-
}
|
|
21
|
-
if (sysErr.address) {
|
|
22
|
-
parts.push(sysErr.address);
|
|
23
|
-
}
|
|
24
|
-
if (sysErr.port !== undefined) {
|
|
25
|
-
parts.push(String(sysErr.port));
|
|
26
|
-
}
|
|
27
|
-
return parts.join(' ');
|
|
28
|
-
}
|
|
29
|
-
return 'Connection failed';
|
|
30
|
-
};
|
|
31
|
-
const resolveDBConfig = (store) => scope({
|
|
32
|
-
hostname: 'localhost',
|
|
33
|
-
port: 5432,
|
|
34
|
-
database: 'postgres',
|
|
35
|
-
username: 'postgres',
|
|
36
|
-
password: undefined,
|
|
37
|
-
})
|
|
38
|
-
.let((config) => ({
|
|
39
|
-
hostname: process.env['PGHOST'] ?? config.hostname,
|
|
40
|
-
port: process.env['PGPORT']
|
|
41
|
-
? parseInt(process.env['PGPORT'], 10)
|
|
42
|
-
: config.port,
|
|
43
|
-
database: process.env['PGDATABASE'] ?? config.database,
|
|
44
|
-
username: process.env['PGUSER'] ?? config.username,
|
|
45
|
-
password: process.env['PGPASSWORD'] ?? config.password,
|
|
46
|
-
}))
|
|
47
|
-
.let((config) => store.config.connectionString
|
|
48
|
-
? scope(new URL(store.config.connectionString))
|
|
49
|
-
.let((url) => ({
|
|
50
|
-
hostname: url.hostname || config.hostname,
|
|
51
|
-
port: url.port ? parseInt(url.port, 10) : config.port,
|
|
52
|
-
database: url.pathname.slice(1) || config.database,
|
|
53
|
-
username: decodeURIComponent(url.username) ||
|
|
54
|
-
config.username,
|
|
55
|
-
password: url.password
|
|
56
|
-
? decodeURIComponent(url.password)
|
|
57
|
-
: config.password,
|
|
58
|
-
}))
|
|
59
|
-
.value()
|
|
60
|
-
: config)
|
|
61
|
-
.let((config) => ({
|
|
62
|
-
hostname: store.config.hostname ?? config.hostname,
|
|
63
|
-
port: store.config.port ?? config.port,
|
|
64
|
-
database: store.config.database ?? config.database,
|
|
65
|
-
username: store.config.username ?? config.username,
|
|
66
|
-
password: config.password,
|
|
67
|
-
}))
|
|
68
|
-
.value();
|
|
69
|
-
const buildSSLConfig = (store) => {
|
|
70
|
-
const mode = store.config.sslmode ?? 'prefer';
|
|
71
|
-
return mode === 'disable'
|
|
72
|
-
? false
|
|
73
|
-
: {
|
|
74
|
-
rejectUnauthorized: mode === 'verify-ca' || mode === 'verify-full',
|
|
75
|
-
...(store.config.sslrootcert
|
|
76
|
-
? {
|
|
77
|
-
ca: readFileSync(store.config.sslrootcert, 'utf-8'),
|
|
78
|
-
}
|
|
79
|
-
: {}),
|
|
80
|
-
...(store.config.sslcert
|
|
81
|
-
? {
|
|
82
|
-
cert: readFileSync(store.config.sslcert, 'utf-8'),
|
|
83
|
-
}
|
|
84
|
-
: {}),
|
|
85
|
-
...(store.config.sslkey
|
|
86
|
-
? {
|
|
87
|
-
key: readFileSync(store.config.sslkey, 'utf-8'),
|
|
88
|
-
}
|
|
89
|
-
: {}),
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
export const connectDB = async (store) => {
|
|
93
|
-
const config = resolveDBConfig(store);
|
|
94
|
-
const ssl = buildSSLConfig(store);
|
|
95
|
-
// SSH tunnel: connect via localhost tunnel, but display the real remote target
|
|
96
|
-
const connectionHost = store.steps.sshConnection.enabled &&
|
|
97
|
-
store.steps.sshConnection.localPort !== null
|
|
98
|
-
? '127.0.0.1'
|
|
99
|
-
: config.hostname;
|
|
100
|
-
const connectionPort = store.steps.sshConnection.enabled &&
|
|
101
|
-
store.steps.sshConnection.localPort !== null
|
|
102
|
-
? store.steps.sshConnection.localPort
|
|
103
|
-
: config.port;
|
|
104
|
-
runInAction(() => {
|
|
105
|
-
store.steps.databaseConnection.pickedHostname = config.hostname;
|
|
106
|
-
store.steps.databaseConnection.pickedPort = config.port;
|
|
107
|
-
store.steps.databaseConnection.pickedDatabase = config.database;
|
|
108
|
-
store.steps.databaseConnection.pickedUsername = config.username;
|
|
109
|
-
store.steps.databaseConnection.state = 'connecting';
|
|
110
|
-
});
|
|
111
|
-
const attemptConnection = async (password, sslConfig) => {
|
|
112
|
-
const pool = new Pool({
|
|
113
|
-
host: connectionHost,
|
|
114
|
-
port: connectionPort,
|
|
115
|
-
database: config.database,
|
|
116
|
-
user: config.username,
|
|
117
|
-
password,
|
|
118
|
-
ssl: sslConfig,
|
|
119
|
-
connectionTimeoutMillis: 10_000,
|
|
120
|
-
});
|
|
121
|
-
try {
|
|
122
|
-
const client = await pool.connect();
|
|
123
|
-
client.release();
|
|
124
|
-
const version = await fetchPostgresVersion(pool);
|
|
125
|
-
runInAction(() => {
|
|
126
|
-
store.steps.databaseConnection.postgresVersion =
|
|
127
|
-
version.version;
|
|
128
|
-
store.steps.databaseConnection.postgresVersionNumber =
|
|
129
|
-
version.version_num;
|
|
130
|
-
store.steps.databaseConnection.state = 'connected';
|
|
131
|
-
});
|
|
132
|
-
return {
|
|
133
|
-
pool,
|
|
134
|
-
cleanup: () => {
|
|
135
|
-
pool.end();
|
|
136
|
-
runInAction(() => {
|
|
137
|
-
store.steps.databaseConnection.state = 'idle';
|
|
138
|
-
});
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
catch (err) {
|
|
143
|
-
await pool.end();
|
|
144
|
-
// SSL errors happen before auth — check first
|
|
145
|
-
const errMsg = err instanceof Error ? err.message : '';
|
|
146
|
-
const isSSLError = errMsg.includes('does not support SSL');
|
|
147
|
-
const sslMode = store.config.sslmode ?? 'prefer';
|
|
148
|
-
if (isSSLError && sslMode === 'prefer') {
|
|
149
|
-
return attemptConnection(password, false);
|
|
150
|
-
}
|
|
151
|
-
const pgCode = err.code;
|
|
152
|
-
const isAuthError = pgCode === '28P01' ||
|
|
153
|
-
pgCode === '28000' ||
|
|
154
|
-
errMsg.includes('password must be a string');
|
|
155
|
-
if (!isAuthError) {
|
|
156
|
-
runInAction(() => {
|
|
157
|
-
store.steps.databaseConnection.state = 'error';
|
|
158
|
-
store.steps.databaseConnection.error =
|
|
159
|
-
formatConnectionError(err);
|
|
160
|
-
});
|
|
161
|
-
return undefined;
|
|
162
|
-
}
|
|
163
|
-
runInAction(() => {
|
|
164
|
-
store.steps.databaseConnection.wrongAttempt =
|
|
165
|
-
store.steps.databaseConnection.promptCount > 0 ||
|
|
166
|
-
password !== undefined;
|
|
167
|
-
store.steps.databaseConnection.password = null;
|
|
168
|
-
store.steps.databaseConnection.promptCount += 1;
|
|
169
|
-
store.steps.databaseConnection.state = 'need-password';
|
|
170
|
-
});
|
|
171
|
-
await when(() => store.steps.databaseConnection.password !== null);
|
|
172
|
-
const newPassword = store.steps.databaseConnection.password;
|
|
173
|
-
runInAction(() => {
|
|
174
|
-
store.steps.databaseConnection.password = null;
|
|
175
|
-
store.steps.databaseConnection.state = 'connecting';
|
|
176
|
-
});
|
|
177
|
-
return attemptConnection(newPassword, sslConfig);
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
return attemptConnection(config.password, ssl);
|
|
181
|
-
};
|
|
182
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2RiLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFJdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFPdkQsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQztBQUVsQixNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBWSxFQUFVLEVBQUU7SUFDbkQsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNkLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELE1BQU0sTUFBTSxHQUFHLEdBS2QsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLENBQUM7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QUFXLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUVuRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVMsQ0FBQztZQUU3RCxXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDL0MsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ3hELENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3JlYWRGaWxlU3luY30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGcgZnJvbSAncGcnO1xuaW1wb3J0IHtydW5JbkFjdGlvbiwgd2hlbn0gZnJvbSAnbW9ieCc7XG5pbXBvcnQge3Njb3BlfSBmcm9tICdzY29wZS11dGlsaXRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHR5cGUge1RTU0xNb2RlfSBmcm9tICcuLi9pbmRleC5tanMnO1xuaW1wb3J0IHtmZXRjaFBvc3RncmVzVmVyc2lvbn0gZnJvbSAnLi4vZGIvdmVyc2lvbi5tanMnO1xuXG5leHBvcnQgdHlwZSBUREJDb25uZWN0aW9uID0ge1xuICAgIHJlYWRvbmx5IHBvb2w6IEluc3RhbmNlVHlwZTx0eXBlb2YgUG9vbD47XG4gICAgcmVhZG9ubHkgY2xlYW51cDogKCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IHtQb29sfSA9IHBnO1xuXG5jb25zdCBmb3JtYXRDb25uZWN0aW9uRXJyb3IgPSAoZXJyOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhlcnIpIHx8ICdVbmtub3duIGVycm9yJztcbiAgICB9XG5cbiAgICBpZiAoZXJyLm1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIFN5c3RlbSBlcnJvcnMgKEVDT05OUkVGVVNFRCwgRVRJTUVET1VULCBldGMuKVxuICAgIGNvbnN0IHN5c0VyciA9IGVyciBhcyB7XG4gICAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgICAgIHN5c2NhbGw/OiBzdHJpbmc7XG4gICAgICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gICAgICAgIHBvcnQ/OiBudW1iZXI7XG4gICAgfTtcbiAgICBpZiAoc3lzRXJyLmNvZGUpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbc3lzRXJyLmNvZGVdO1xuICAgICAgICBpZiAoc3lzRXJyLnN5c2NhbGwpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goc3lzRXJyLnN5c2NhbGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeXNFcnIuYWRkcmVzcykge1xuICAgICAgICAgICAgcGFydHMucHVzaChzeXNFcnIuYWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5c0Vyci5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goU3RyaW5nKHN5c0Vyci5wb3J0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJ0Nvbm5lY3Rpb24gZmFpbGVkJztcbn07XG5cbnR5cGUgVFJlc29sdmVkREJDb25maWcgPSB7XG4gICAgcmVhZG9ubHkgaG9zdG5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZGF0YWJhc2U6IHN0cmluZztcbiAgICByZWFkb25seSB1c2VybmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBhc3N3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCByZXNvbHZlREJDb25maWcgPSAoc3RvcmU6IFRTdG9yZSk6IFRSZXNvbHZlZERCQ29uZmlnID0+XG4gICAgc2NvcGUoe1xuICAgICAgICBob3N0bmFtZTogJ2xvY2FsaG9zdCcsXG4gICAgICAgIHBvcnQ6IDU0MzIsXG4gICAgICAgIGRhdGFiYXNlOiAncG9zdGdyZXMnLFxuICAgICAgICB1c2VybmFtZTogJ3Bvc3RncmVzJyxcbiAgICAgICAgcGFzc3dvcmQ6IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgfSlcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PiAoe1xuICAgICAgICAgICAgaG9zdG5hbWU6IHByb2Nlc3MuZW52WydQR0hPU1QnXSA/PyBjb25maWcuaG9zdG5hbWUsXG4gICAgICAgICAgICBwb3J0OiBwcm9jZXNzLmVudlsnUEdQT1JUJ11cbiAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHByb2Nlc3MuZW52WydQR1BPUlQnXSwgMTApXG4gICAgICAgICAgICAgICAgOiBjb25maWcucG9ydCxcbiAgICAgICAgICAgIGRhdGFiYXNlOiBwcm9jZXNzLmVudlsnUEdEQVRBQkFTRSddID8/IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgIHVzZXJuYW1lOiBwcm9jZXNzLmVudlsnUEdVU0VSJ10gPz8gY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52WydQR1BBU1NXT1JEJ10gPz8gY29uZmlnLnBhc3N3b3JkLFxuICAgICAgICB9KSlcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PlxuICAgICAgICAgICAgc3RvcmUuY29uZmlnLmNvbm5lY3Rpb25TdHJpbmdcbiAgICAgICAgICAgICAgICA/IHNjb3BlKG5ldyBVUkwoc3RvcmUuY29uZmlnLmNvbm5lY3Rpb25TdHJpbmcpKVxuICAgICAgICAgICAgICAgICAgICAgIC5sZXQoKHVybCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSB8fCBjb25maWcuaG9zdG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHVybC5wb3J0ID8gcGFyc2VJbnQodXJsLnBvcnQsIDEwKSA6IGNvbmZpZy5wb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdXJsLnBhdGhuYW1lLnNsaWNlKDEpIHx8IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVVUklDb21wb25lbnQodXJsLnVzZXJuYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDogdXJsLnBhc3N3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlY29kZVVSSUNvbXBvbmVudCh1cmwucGFzc3dvcmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5wYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAudmFsdWUoKVxuICAgICAgICAgICAgICAgIDogY29uZmlnLFxuICAgICAgICApXG4gICAgICAgIC5sZXQoKGNvbmZpZykgPT4gKHtcbiAgICAgICAgICAgIGhvc3RuYW1lOiBzdG9yZS5jb25maWcuaG9zdG5hbWUgPz8gY29uZmlnLmhvc3RuYW1lLFxuICAgICAgICAgICAgcG9ydDogc3RvcmUuY29uZmlnLnBvcnQgPz8gY29uZmlnLnBvcnQsXG4gICAgICAgICAgICBkYXRhYmFzZTogc3RvcmUuY29uZmlnLmRhdGFiYXNlID8/IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgIHVzZXJuYW1lOiBzdG9yZS5jb25maWcudXNlcm5hbWUgPz8gY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IGNvbmZpZy5wYXNzd29yZCxcbiAgICAgICAgfSkpXG4gICAgICAgIC52YWx1ZSgpO1xuXG50eXBlIFRTU0xDb25maWcgPVxuICAgIHwgZmFsc2VcbiAgICB8IHtcbiAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGJvb2xlYW47XG4gICAgICAgICAgY2E/OiBzdHJpbmc7XG4gICAgICAgICAgY2VydD86IHN0cmluZztcbiAgICAgICAgICBrZXk/OiBzdHJpbmc7XG4gICAgICB9O1xuXG5jb25zdCBidWlsZFNTTENvbmZpZyA9IChzdG9yZTogVFN0b3JlKTogVFNTTENvbmZpZyA9PiB7XG4gICAgY29uc3QgbW9kZTogVFNTTE1vZGUgPSBzdG9yZS5jb25maWcuc3NsbW9kZSA/PyAncHJlZmVyJztcblxuICAgIHJldHVybiBtb2RlID09PSAnZGlzYWJsZSdcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHtcbiAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOlxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gJ3ZlcmlmeS1jYScgfHwgbW9kZSA9PT0gJ3ZlcmlmeS1mdWxsJyxcbiAgICAgICAgICAgICAgLi4uKHN0b3JlLmNvbmZpZy5zc2xyb290Y2VydFxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYTogcmVhZEZpbGVTeW5jKHN0b3JlLmNvbmZpZy5zc2xyb290Y2VydCwgJ3V0Zi04JyksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAuLi4oc3RvcmUuY29uZmlnLnNzbGNlcnRcbiAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VydDogcmVhZEZpbGVTeW5jKHN0b3JlLmNvbmZpZy5zc2xjZXJ0LCAndXRmLTgnKSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIC4uLihzdG9yZS5jb25maWcuc3Nsa2V5XG4gICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogcmVhZEZpbGVTeW5jKHN0b3JlLmNvbmZpZy5zc2xrZXksICd1dGYtOCcpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbm5lY3REQiA9IGFzeW5jIChcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTxUREJDb25uZWN0aW9uIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gcmVzb2x2ZURCQ29uZmlnKHN0b3JlKTtcbiAgICBjb25zdCBzc2wgPSBidWlsZFNTTENvbmZpZyhzdG9yZSk7XG5cbiAgICAvLyBTU0ggdHVubmVsOiBjb25uZWN0IHZpYSBsb2NhbGhvc3QgdHVubmVsLCBidXQgZGlzcGxheSB0aGUgcmVhbCByZW1vdGUgdGFyZ2V0XG4gICAgY29uc3QgY29ubmVjdGlvbkhvc3QgPVxuICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmVuYWJsZWQgJiZcbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5sb2NhbFBvcnQgIT09IG51bGxcbiAgICAgICAgICAgID8gJzEyNy4wLjAuMSdcbiAgICAgICAgICAgIDogY29uZmlnLmhvc3RuYW1lO1xuICAgIGNvbnN0IGNvbm5lY3Rpb25Qb3J0ID1cbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5lbmFibGVkICYmXG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ubG9jYWxQb3J0ICE9PSBudWxsXG4gICAgICAgICAgICA/IHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ubG9jYWxQb3J0XG4gICAgICAgICAgICA6IGNvbmZpZy5wb3J0O1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGlja2VkSG9zdG5hbWUgPSBjb25maWcuaG9zdG5hbWU7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5waWNrZWRQb3J0ID0gY29uZmlnLnBvcnQ7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5waWNrZWREYXRhYmFzZSA9IGNvbmZpZy5kYXRhYmFzZTtcbiAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBpY2tlZFVzZXJuYW1lID0gY29uZmlnLnVzZXJuYW1lO1xuICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnY29ubmVjdGluZyc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdHRlbXB0Q29ubmVjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgcGFzc3dvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgc3NsQ29uZmlnOiBUU1NMQ29uZmlnLFxuICAgICk6IFByb21pc2U8VERCQ29ubmVjdGlvbiB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCBwb29sID0gbmV3IFBvb2woe1xuICAgICAgICAgICAgaG9zdDogY29ubmVjdGlvbkhvc3QsXG4gICAgICAgICAgICBwb3J0OiBjb25uZWN0aW9uUG9ydCxcbiAgICAgICAgICAgIGRhdGFiYXNlOiBjb25maWcuZGF0YWJhc2UsXG4gICAgICAgICAgICB1c2VyOiBjb25maWcudXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgIHNzbDogc3NsQ29uZmlnLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IDEwXzAwMCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBvb2wuY29ubmVjdCgpO1xuICAgICAgICAgICAgY2xpZW50LnJlbGVhc2UoKTtcblxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGZldGNoUG9zdGdyZXNWZXJzaW9uKHBvb2wpO1xuXG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBvc3RncmVzVmVyc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb24udmVyc2lvbjtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucG9zdGdyZXNWZXJzaW9uTnVtYmVyID1cbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi52ZXJzaW9uX251bTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnY29ubmVjdGVkJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBvb2wsXG4gICAgICAgICAgICAgICAgY2xlYW51cDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwb29sLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnaWRsZSc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGF3YWl0IHBvb2wuZW5kKCk7XG5cbiAgICAgICAgICAgIC8vIFNTTCBlcnJvcnMgaGFwcGVuIGJlZm9yZSBhdXRoIOKAlCBjaGVjayBmaXJzdFxuICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICcnO1xuICAgICAgICAgICAgY29uc3QgaXNTU0xFcnJvciA9IGVyck1zZy5pbmNsdWRlcygnZG9lcyBub3Qgc3VwcG9ydCBTU0wnKTtcbiAgICAgICAgICAgIGNvbnN0IHNzbE1vZGU6IFRTU0xNb2RlID0gc3RvcmUuY29uZmlnLnNzbG1vZGUgPz8gJ3ByZWZlcic7XG5cbiAgICAgICAgICAgIGlmIChpc1NTTEVycm9yICYmIHNzbE1vZGUgPT09ICdwcmVmZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dGVtcHRDb25uZWN0aW9uKHBhc3N3b3JkLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBnQ29kZSA9IChlcnIgYXMge2NvZGU/OiBzdHJpbmd9KS5jb2RlO1xuICAgICAgICAgICAgY29uc3QgaXNBdXRoRXJyb3IgPVxuICAgICAgICAgICAgICAgIHBnQ29kZSA9PT0gJzI4UDAxJyB8fFxuICAgICAgICAgICAgICAgIHBnQ29kZSA9PT0gJzI4MDAwJyB8fFxuICAgICAgICAgICAgICAgIGVyck1zZy5pbmNsdWRlcygncGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG4gICAgICAgICAgICBpZiAoIWlzQXV0aEVycm9yKSB7XG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uZXJyb3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi53cm9uZ0F0dGVtcHQgPVxuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucHJvbXB0Q291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucHJvbXB0Q291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPSAnbmVlZC1wYXNzd29yZCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgd2hlbigoKSA9PiBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQgIT09IG51bGwpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdQYXNzd29yZCA9IHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wYXNzd29yZCE7XG5cbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5zdGF0ZSA9ICdjb25uZWN0aW5nJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXR0ZW1wdENvbm5lY3Rpb24obmV3UGFzc3dvcmQsIHNzbENvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGF0dGVtcHRDb25uZWN0aW9uKGNvbmZpZy5wYXNzd29yZCwgc3NsKTtcbn07XG4iXX0=
|
package/dist/app/detect.d.mts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { TAIAssistant, TDatabaseProvider, TOs, TShell, TSystemMemory, TPackageManager } from '@dbctx/core';
|
|
2
|
-
export declare const detectOS: () => TOs;
|
|
3
|
-
export declare const detectShell: () => TShell;
|
|
4
|
-
export declare const detectWSL: () => boolean;
|
|
5
|
-
export declare const detectSystemMemory: () => TSystemMemory;
|
|
6
|
-
export declare const detectPackageManager: () => TPackageManager;
|
|
7
|
-
export declare const detectProvider: (hostname: string) => TDatabaseProvider;
|
|
8
|
-
export declare const detectAIAssistants: () => TAIAssistant[];
|
|
9
|
-
export declare const detectDocker: () => boolean;
|
|
10
|
-
export declare const detectSSHSession: () => boolean;
|
|
11
|
-
export declare const detectHostname: () => string;
|
|
12
|
-
export declare const detectUsername: () => string;
|
|
13
|
-
export declare const isLocalhost: (hostname: string) => boolean;
|
|
14
|
-
//# sourceMappingURL=detect.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.mts","sourceRoot":"./src/","sources":["app/detect.mts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACR,YAAY,EACZ,iBAAiB,EACjB,GAAG,EACH,MAAM,EACN,aAAa,EACb,eAAe,EAClB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,QAAQ,QAAO,GAKT,CAAC;AAEpB,eAAO,MAAM,WAAW,QAAO,MAqB9B,CAAC;AAEF,eAAO,MAAM,SAAS,QAAO,OAAgD,CAAC;AAI9E,eAAO,MAAM,kBAAkB,QAAO,aAiBrC,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAO,eAYvC,CAAC;AAGF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,KAAG,iBA0BjD,CAAC;AAaF,eAAO,MAAM,kBAAkB,QAAO,YAAY,EAMjD,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,OAAoC,CAAC;AAErE,eAAO,MAAM,gBAAgB,QAAO,OACuB,CAAC;AAE5D,eAAO,MAAM,cAAc,QAAO,MAAoB,CAAC;AAEvD,eAAO,MAAM,cAAc,QAAO,MAA6B,CAAC;AAEhE,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,KAAG,OAS9C,CAAC"}
|