dbctx 1.0.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/app/assemble.d.mts +5 -0
  2. package/dist/app/assemble.d.mts.map +1 -0
  3. package/dist/app/assemble.mjs +161 -0
  4. package/dist/app/config.d.mts +9 -0
  5. package/dist/app/config.d.mts.map +1 -0
  6. package/dist/app/config.mjs +49 -0
  7. package/dist/app/db.d.mts +9 -0
  8. package/dist/app/db.d.mts.map +1 -0
  9. package/dist/app/db.mjs +157 -0
  10. package/dist/app/detect.d.mts +11 -0
  11. package/dist/app/detect.d.mts.map +1 -0
  12. package/dist/app/detect.mjs +105 -0
  13. package/dist/app/index.d.mts +3 -0
  14. package/dist/app/index.d.mts.map +1 -0
  15. package/dist/app/index.mjs +81 -0
  16. package/dist/app/open-url.d.mts +4 -0
  17. package/dist/app/open-url.d.mts.map +1 -0
  18. package/dist/app/open-url.mjs +27 -0
  19. package/dist/app/session.d.mts +8 -0
  20. package/dist/app/session.d.mts.map +1 -0
  21. package/dist/app/session.mjs +155 -0
  22. package/dist/app/ssh.d.mts +3 -0
  23. package/dist/app/ssh.d.mts.map +1 -0
  24. package/dist/app/ssh.mjs +207 -0
  25. package/dist/db/analyze.d.mts +1 -1
  26. package/dist/db/analyze.d.mts.map +1 -1
  27. package/dist/db/analyze.mjs +1 -1
  28. package/dist/db/attributes.d.mts +3 -3
  29. package/dist/db/attributes.d.mts.map +1 -1
  30. package/dist/db/attributes.mjs +2 -2
  31. package/dist/db/enums.d.mts +1 -1
  32. package/dist/db/enums.d.mts.map +1 -1
  33. package/dist/db/enums.mjs +2 -2
  34. package/dist/db/file-stats.d.mts +1 -1
  35. package/dist/db/file-stats.d.mts.map +1 -1
  36. package/dist/db/file-stats.mjs +1 -1
  37. package/dist/db/foreign-keys.d.mts +2 -2
  38. package/dist/db/foreign-keys.d.mts.map +1 -1
  39. package/dist/db/foreign-keys.mjs +1 -1
  40. package/dist/db/index.d.mts +9 -9
  41. package/dist/db/index.d.mts.map +1 -1
  42. package/dist/db/index.mjs +10 -10
  43. package/dist/db/indexes.d.mts +1 -1
  44. package/dist/db/indexes.d.mts.map +1 -1
  45. package/dist/db/indexes.mjs +1 -1
  46. package/dist/db/relations.d.mts +2 -2
  47. package/dist/db/relations.d.mts.map +1 -1
  48. package/dist/db/relations.mjs +2 -2
  49. package/dist/db/stats.d.mts +1 -1
  50. package/dist/db/stats.d.mts.map +1 -1
  51. package/dist/db/stats.mjs +2 -2
  52. package/dist/db/version.d.mts +2 -1
  53. package/dist/db/version.d.mts.map +1 -1
  54. package/dist/db/version.mjs +9 -1
  55. package/dist/index.d.mts +4 -3
  56. package/dist/index.d.mts.map +1 -1
  57. package/dist/index.mjs +50 -51
  58. package/dist/lib/trpc-url.d.mts +2 -0
  59. package/dist/lib/trpc-url.d.mts.map +1 -0
  60. package/dist/lib/trpc-url.mjs +6 -0
  61. package/dist/lib/trpc.d.mts +7 -0
  62. package/dist/lib/trpc.d.mts.map +1 -0
  63. package/dist/lib/trpc.mjs +37 -0
  64. package/dist/lib/trpc.react.d.mts +4 -0
  65. package/dist/lib/trpc.react.d.mts.map +1 -0
  66. package/dist/lib/trpc.react.mjs +3 -0
  67. package/dist/lib/version.d.mts +2 -0
  68. package/dist/lib/version.d.mts.map +1 -0
  69. package/dist/lib/version.mjs +5 -0
  70. package/dist/providers/TrpcProvider.d.ts +9 -0
  71. package/dist/providers/TrpcProvider.d.ts.map +1 -0
  72. package/dist/providers/TrpcProvider.js +41 -0
  73. package/dist/schemas/index.d.mts +106 -1
  74. package/dist/schemas/index.d.mts.map +1 -1
  75. package/dist/schemas/index.mjs +27 -2
  76. package/dist/store.d.mts +64 -0
  77. package/dist/store.d.mts.map +1 -0
  78. package/dist/store.mjs +68 -0
  79. package/dist/{App.d.ts → types/connection.d.mts} +3 -9
  80. package/dist/types/connection.d.mts.map +1 -0
  81. package/dist/types/connection.mjs +2 -0
  82. package/dist/ui/App.d.ts +10 -0
  83. package/dist/ui/App.d.ts.map +1 -0
  84. package/dist/ui/App.js +13 -0
  85. package/dist/ui/components/DB.d.ts +10 -0
  86. package/dist/ui/components/DB.d.ts.map +1 -0
  87. package/dist/ui/components/DB.js +22 -0
  88. package/dist/{components → ui/components}/Error.d.ts +1 -1
  89. package/dist/ui/components/Error.d.ts.map +1 -0
  90. package/dist/ui/components/Error.js +6 -0
  91. package/dist/ui/components/Gate.d.ts +10 -0
  92. package/dist/ui/components/Gate.d.ts.map +1 -0
  93. package/dist/ui/components/Gate.js +15 -0
  94. package/dist/ui/components/Introspect.d.ts +10 -0
  95. package/dist/ui/components/Introspect.d.ts.map +1 -0
  96. package/dist/ui/components/Introspect.js +66 -0
  97. package/dist/ui/components/PasswordInput.d.ts +7 -0
  98. package/dist/ui/components/PasswordInput.d.ts.map +1 -0
  99. package/dist/ui/components/PasswordInput.js +32 -0
  100. package/dist/ui/components/SSH.d.ts +10 -0
  101. package/dist/ui/components/SSH.d.ts.map +1 -0
  102. package/dist/ui/components/SSH.js +22 -0
  103. package/dist/ui/components/Session.d.ts +10 -0
  104. package/dist/ui/components/Session.d.ts.map +1 -0
  105. package/dist/ui/components/Session.js +47 -0
  106. package/dist/ui/components/Spinner.d.ts +3 -0
  107. package/dist/ui/components/Spinner.d.ts.map +1 -0
  108. package/dist/ui/components/Spinner.js +18 -0
  109. package/dist/ui/components/Splash.d.ts +3 -0
  110. package/dist/ui/components/Splash.d.ts.map +1 -0
  111. package/dist/ui/components/Splash.js +13 -0
  112. package/dist/validatePaths.d.mts +1 -1
  113. package/dist/validatePaths.d.mts.map +1 -1
  114. package/dist/validatePaths.mjs +17 -11
  115. package/package.json +22 -2
  116. package/dist/App.d.ts.map +0 -1
  117. package/dist/App.js +0 -9
  118. package/dist/components/Error.d.ts.map +0 -1
  119. package/dist/components/Error.js +0 -6
@@ -0,0 +1,5 @@
1
+ import type { Pool } from 'pg';
2
+ import type { TStore } from '../store.mjs';
3
+ import type { TDatabase } from '../schemas/index.mjs';
4
+ export declare const assembleDatabase: (pool: Pool, store: TStore) => Promise<TDatabase>;
5
+ //# sourceMappingURL=assemble.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assemble.d.mts","sourceRoot":"./src/","sources":["app/assemble.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAI7B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AA2FpD,eAAO,MAAM,gBAAgB,GACzB,MAAM,IAAI,EACV,OAAO,MAAM,KACd,OAAO,CAAC,SAAS,CA4HnB,CAAC"}
@@ -0,0 +1,161 @@
1
+ import PQueue from 'p-queue';
2
+ import { runInAction } from 'mobx';
3
+ import { fetchDatabaseIdentifier, fetchDatabaseComment, fetchPublicRelations, fetchPublicEnums, fetchRelationAttributes, fetchRelationIndexes, fetchRelationForeignKeys, analyzeRelation, fetchRelationStats, } from '../db/index.mjs';
4
+ const toRecord = (items, key) => Object.fromEntries(items.map((item) => [key(item), item]));
5
+ const transformAttribute = (attr) => {
6
+ const base = {
7
+ name: attr.attribute_name,
8
+ data_type: attr.data_type,
9
+ is_nullable: attr.is_nullable,
10
+ comment: attr.comment,
11
+ };
12
+ if (attr.kind === 'generated') {
13
+ return {
14
+ ...base,
15
+ kind: 'generated',
16
+ generated_storage: attr.generated_storage,
17
+ generated_expression: attr.generated_expression,
18
+ };
19
+ }
20
+ return attr.has_default
21
+ ? {
22
+ ...base,
23
+ kind: 'regular',
24
+ has_default: true,
25
+ default_expression: attr.default_expression,
26
+ }
27
+ : {
28
+ ...base,
29
+ kind: 'regular',
30
+ has_default: false,
31
+ };
32
+ };
33
+ const deriveIndexKind = (idx) => idx.is_primary
34
+ ? { index_kind: 'primary' }
35
+ : idx.is_unique
36
+ ? { index_kind: 'unique' }
37
+ : idx.is_exclusion
38
+ ? {
39
+ index_kind: 'exclusion',
40
+ exclusion_operators: idx.exclusion_operators,
41
+ }
42
+ : { index_kind: 'plain' };
43
+ const transformIndex = (idx) => ({
44
+ index_name: idx.index_name,
45
+ relation_name: idx.relation_name,
46
+ attributes: idx.attributes,
47
+ definition: idx.definition,
48
+ comment: idx.comment,
49
+ ...deriveIndexKind(idx),
50
+ ...(idx.is_partial
51
+ ? {
52
+ is_partial: true,
53
+ partial_predicate: idx.partial_predicate,
54
+ }
55
+ : { is_partial: false }),
56
+ });
57
+ const transformReference = (fk) => ({
58
+ constraint_name: fk.constraint_name,
59
+ attributes: fk.attributes,
60
+ referenced_relation: fk.referenced_relation,
61
+ referenced_attributes: fk.referenced_attributes,
62
+ on_update: fk.on_update,
63
+ on_delete: fk.on_delete,
64
+ comment: fk.comment,
65
+ });
66
+ export const assembleDatabase = async (pool, store) => {
67
+ const queue = new PQueue({ concurrency: 3 });
68
+ const counts = store.steps.introspection.counts;
69
+ runInAction(() => {
70
+ store.steps.introspection.state = 'fetching';
71
+ });
72
+ const [identifier, comment] = await Promise.all([
73
+ queue.add(() => fetchDatabaseIdentifier(pool)),
74
+ queue.add(() => fetchDatabaseComment(pool)),
75
+ ]);
76
+ const [grouped, enums] = await Promise.all([
77
+ queue.add(() => fetchPublicRelations(pool)),
78
+ queue.add(() => fetchPublicEnums(pool)),
79
+ ]);
80
+ const typedGrouped = grouped;
81
+ const typedEnums = enums;
82
+ runInAction(() => {
83
+ counts.tables =
84
+ (typedGrouped.table?.length ?? 0) +
85
+ (typedGrouped.partitioned_table?.length ?? 0);
86
+ counts.views =
87
+ (typedGrouped.view?.length ?? 0) +
88
+ (typedGrouped.materialized_view?.length ?? 0);
89
+ counts.enums = Object.keys(typedEnums).length;
90
+ });
91
+ const allRelations = [
92
+ ...(typedGrouped.partitioned_table ?? []),
93
+ ...(typedGrouped.table ?? []),
94
+ ...(typedGrouped.view ?? []),
95
+ ...(typedGrouped.materialized_view ?? []),
96
+ ];
97
+ const relationEntries = await Promise.all(allRelations.map(async (rel) => {
98
+ if (rel.type !== 'view') {
99
+ await queue.add(() => analyzeRelation(pool, rel.name));
100
+ runInAction(() => {
101
+ counts.analyzed += 1;
102
+ });
103
+ }
104
+ const [attributes, indexes, foreignKeys, stats] = await Promise.all([
105
+ queue.add(() => fetchRelationAttributes(pool, rel.name)),
106
+ queue.add(() => fetchRelationIndexes(pool, rel.name)),
107
+ queue.add(() => fetchRelationForeignKeys(pool, rel.name)),
108
+ queue.add(() => fetchRelationStats(pool, rel.name)),
109
+ ]);
110
+ const attrs = attributes;
111
+ const idxs = indexes;
112
+ const fks = foreignKeys;
113
+ const relStats = stats;
114
+ const distinctLookup = new Map(relStats.attributes.map((a) => [
115
+ a.attribute_name,
116
+ a.estimated_distinct,
117
+ ]));
118
+ runInAction(() => {
119
+ counts.columns += attrs.length;
120
+ counts.indexes += idxs.length;
121
+ counts.foreignKeys += fks.length;
122
+ });
123
+ const transformedAttrs = attrs.map((attr) => {
124
+ const base = transformAttribute(attr);
125
+ const distinct = distinctLookup.get(attr.attribute_name);
126
+ return distinct !== undefined
127
+ ? { ...base, estimated_distinct: distinct }
128
+ : base;
129
+ });
130
+ return [
131
+ rel.name,
132
+ {
133
+ name: rel.name,
134
+ comment: rel.comment,
135
+ kind: rel.type,
136
+ attributes: toRecord(transformedAttrs, (a) => a.name),
137
+ indexes: toRecord(idxs.map(transformIndex), (i) => i.index_name),
138
+ references: toRecord(fks.map(transformReference), (r) => r.constraint_name),
139
+ },
140
+ ];
141
+ }));
142
+ runInAction(() => {
143
+ store.steps.introspection.state = 'done';
144
+ });
145
+ return {
146
+ type: 'postgresql',
147
+ version: {
148
+ version_string: store.steps.databaseConnection.postgresVersion,
149
+ version_number: store.steps.databaseConnection.postgresVersionNumber,
150
+ },
151
+ identifier: {
152
+ system_identifier: identifier.system_identifier,
153
+ database_oid: identifier.database_oid,
154
+ },
155
+ name: identifier.database_name,
156
+ comment: comment ?? null,
157
+ relations: Object.fromEntries(relationEntries),
158
+ enums: typedEnums,
159
+ };
160
+ };
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2Fzc2VtYmxlLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQVFqQyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixrQkFBa0IsR0FDckIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLFFBQVEsR0FBRyxDQUNiLEtBQW1CLEVBQ25CLEdBQXdCLEVBQ1AsRUFBRSxDQUNuQixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUvRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsSUFBb0IsRUFBRSxFQUFFO0lBQ2hELE1BQU0sSUFBSSxHQUFHO1FBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjO1FBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztRQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7UUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO0tBQ3hCLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDNUIsT0FBTztZQUNILEdBQUcsSUFBSTtZQUNQLElBQUksRUFBRSxXQUFvQjtZQUMxQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQTBDO1lBQ2xFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxvQkFBcUI7U0FDbkQsQ0FBQztJQUNOLENBQUM7SUFFRCxPQUFP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QyxDQUFDLENBQUMsVUFBVSxDQUN0QjtnQkFDRCxVQUFVLEVBQUUsUUFBUSxDQUNoQixHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUMzQjthQUNKO1NBQ0ssQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFFRixXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUM3QyxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87UUFDSCxJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUU7WUFDTCxjQUFjLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxlQUFnQjtZQUMvRCxjQUFjLEVBQ1YsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBc0I7U0FDNUQ7UUFDRCxVQUFVLEVBQUU7WUFDUixpQkFBaUIsRUFBRSxVQUFXLENBQUMsaUJBQWlCO1lBQ2hELFlBQVksRUFBRSxVQUFXLENBQUMsWUFBWTtTQUN6QztRQUNELElBQUksRUFBRSxVQUFXLENBQUMsYUFBYTtRQUMvQixPQUFPLEVBQUUsT0FBTyxJQUFJLElBQUk7UUFDeEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDO1FBQzlDLEtBQUssRUFBRSxVQUFVO0tBQ3BCLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuaW1wb3J0IFBRdWV1ZSBmcm9tICdwLXF1ZXVlJztcbmltcG9ydCB7cnVuSW5BY3Rpb259IGZyb20gJ21vYngnO1xuXG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHR5cGUge1REYXRhYmFzZX0gZnJvbSAnLi4vc2NoZW1hcy9pbmRleC5tanMnO1xuaW1wb3J0IHR5cGUge1RBdHRyaWJ1dGVJbmZvfSBmcm9tICcuLi9kYi9hdHRyaWJ1dGVzLm1qcyc7XG5pbXBvcnQgdHlwZSB7VEluZGV4SW5mb30gZnJvbSAnLi4vZGIvaW5kZXhlcy5tanMnO1xuaW1wb3J0IHR5cGUge1RGb3JlaWduS2V5SW5mb30gZnJvbSAnLi4vZGIvZm9yZWlnbi1rZXlzLm1qcyc7XG5pbXBvcnQgdHlwZSB7VFJlbGF0aW9uU3RhdHN9IGZyb20gJy4uL2RiL3N0YXRzLm1qcyc7XG5pbXBvcnQge1xuICAgIGZldGNoRGF0YWJhc2VJZGVudGlmaWVyLFxuICAgIGZldGNoRGF0YWJhc2VDb21tZW50LFxuICAgIGZldGNoUHVibGljUmVsYXRpb25zLFxuICAgIGZldGNoUHVibGljRW51bXMsXG4gICAgZmV0Y2hSZWxhdGlvbkF0dHJpYnV0ZXMsXG4gICAgZmV0Y2hSZWxhdGlvbkluZGV4ZXMsXG4gICAgZmV0Y2hSZWxhdGlvbkZvcmVpZ25LZXlzLFxuICAgIGFuYWx5emVSZWxhdGlvbixcbiAgICBmZXRjaFJlbGF0aW9uU3RhdHMsXG59IGZyb20gJy4uL2RiL2luZGV4Lm1qcyc7XG5cbmNvbnN0IHRvUmVjb3JkID0gPFQgZXh0ZW5kcyB1bmtub3duPihcbiAgICBpdGVtczogcmVhZG9ubHkgVFtdLFxuICAgIGtleTogKGl0ZW06IFQpID0+IHN0cmluZyxcbik6IFJlY29yZDxzdHJpbmcsIFQ+ID0+XG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKGl0ZW1zLm1hcCgoaXRlbSkgPT4gW2tleShpdGVtKSwgaXRlbV0pKTtcblxuY29uc3QgdHJhbnNmb3JtQXR0cmlidXRlID0gKGF0dHI6IFRBdHRyaWJ1dGVJbmZvKSA9PiB7XG4gICAgY29uc3QgYmFzZSA9IHtcbiAgICAgICAgbmFtZTogYXR0ci5hdHRyaWJ1dGVfbmFtZSxcbiAgICAgICAgZGF0YV90eXBlOiBhdHRyLmRhdGFfdHlwZSxcbiAgICAgICAgaXNfbnVsbGFibGU6IGF0dHIuaXNfbnVsbGFibGUsXG4gICAgICAgIGNvbW1lbnQ6IGF0dHIuY29tbWVudCxcbiAgICB9O1xuXG4gICAgaWYgKGF0dHIua2luZCA9PT0gJ2dlbmVyYXRlZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICBraW5kOiAnZ2VuZXJhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgIGdlbmVyYXRlZF9zdG9yYWdlOiBhdHRyLmdlbmVyYXRlZF9zdG9yYWdlISBhcyAnc3RvcmVkJyB8ICd2aXJ0dWFsJyxcbiAgICAgICAgICAgIGdlbmVyYXRlZF9leHByZXNzaW9uOiBhdHRyLmdlbmVyYXRlZF9leHByZXNzaW9uISxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0ci5oYXNfZGVmYXVsdFxuICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgICAga2luZDogJ3JlZ3VsYXInIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBoYXNfZGVmYXVsdDogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgZGVmYXVsdF9leHByZXNzaW9uOiBhdHRyLmRlZmF1bHRfZXhwcmVzc2lvbiEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgICAga2luZDogJ3JlZ3VsYXInIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBoYXNfZGVmYXVsdDogZmFsc2UgYXMgY29uc3QsXG4gICAgICAgICAgfTtcbn07XG5cbmNvbnN0IGRlcml2ZUluZGV4S2luZCA9IChpZHg6IFRJbmRleEluZm8pID0+XG4gICAgaWR4LmlzX3ByaW1hcnlcbiAgICAgICAgPyAoe2luZGV4X2tpbmQ6ICdwcmltYXJ5J30gYXMgY29uc3QpXG4gICAgICAgIDogaWR4LmlzX3VuaXF1ZVxuICAgICAgICAgID8gKHtpbmRleF9raW5kOiAndW5pcXVlJ30gYXMgY29uc3QpXG4gICAgICAgICAgOiBpZHguaXNfZXhjbHVzaW9uXG4gICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICBpbmRleF9raW5kOiAnZXhjbHVzaW9uJyxcbiAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvbl9vcGVyYXRvcnM6IGlkeC5leGNsdXNpb25fb3BlcmF0b3JzISxcbiAgICAgICAgICAgICAgfSBhcyBjb25zdClcbiAgICAgICAgICAgIDogKHtpbmRleF9raW5kOiAncGxhaW4nfSBhcyBjb25zdCk7XG5cbmNvbnN0IHRyYW5zZm9ybUluZGV4ID0gKGlkeDogVEluZGV4SW5mbykgPT4gKHtcbiAgICBpbmRleF9uYW1lOiBpZHguaW5kZXhfbmFtZSxcbiAgICByZWxhdGlvbl9uYW1lOiBpZHgucmVsYXRpb25fbmFtZSxcbiAgICBhdHRyaWJ1dGVzOiBpZHguYXR0cmlidXRlcyxcbiAgICBkZWZpbml0aW9uOiBpZHguZGVmaW5pdGlvbixcbiAgICBjb21tZW50OiBpZHguY29tbWVudCxcbiAgICAuLi5kZXJpdmVJbmRleEtpbmQoaWR4KSxcbiAgICAuLi4oaWR4LmlzX3BhcnRpYWxcbiAgICAgICAgPyAoe1xuICAgICAgICAgICAgICBpc19wYXJ0aWFsOiB0cnVlLFxuICAgICAgICAgICAgICBwYXJ0aWFsX3ByZWRpY2F0ZTogaWR4LnBhcnRpYWxfcHJlZGljYXRlISxcbiAgICAgICAgICB9IGFzIGNvbnN0KVxuICAgICAgICA6ICh7aXNfcGFydGlhbDogZmFsc2V9IGFzIGNvbnN0KSksXG59KTtcblxuY29uc3QgdHJhbnNmb3JtUmVmZXJlbmNlID0gKGZrOiBURm9yZWlnbktleUluZm8pID0+ICh7XG4gICAgY29uc3RyYWludF9uYW1lOiBmay5jb25zdHJhaW50X25hbWUsXG4gICAgYXR0cmlidXRlczogZmsuYXR0cmlidXRlcyxcbiAgICByZWZlcmVuY2VkX3JlbGF0aW9uOiBmay5yZWZlcmVuY2VkX3JlbGF0aW9uLFxuICAgIHJlZmVyZW5jZWRfYXR0cmlidXRlczogZmsucmVmZXJlbmNlZF9hdHRyaWJ1dGVzLFxuICAgIG9uX3VwZGF0ZTogZmsub25fdXBkYXRlLFxuICAgIG9uX2RlbGV0ZTogZmsub25fZGVsZXRlLFxuICAgIGNvbW1lbnQ6IGZrLmNvbW1lbnQsXG59KTtcblxuZXhwb3J0IGNvbnN0IGFzc2VtYmxlRGF0YWJhc2UgPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTxURGF0YWJhc2U+ID0+IHtcbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBQUXVldWUoe2NvbmN1cnJlbmN5OiAzfSk7XG4gICAgY29uc3QgY291bnRzID0gc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5jb3VudHM7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uc3RhdGUgPSAnZmV0Y2hpbmcnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgW2lkZW50aWZpZXIsIGNvbW1lbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hEYXRhYmFzZUlkZW50aWZpZXIocG9vbCkpLFxuICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hEYXRhYmFzZUNvbW1lbnQocG9vbCkpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgW2dyb3VwZWQsIGVudW1zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUHVibGljUmVsYXRpb25zKHBvb2wpKSxcbiAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUHVibGljRW51bXMocG9vbCkpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgdHlwZWRHcm91cGVkID0gZ3JvdXBlZCBhcyBBd2FpdGVkPFxuICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBmZXRjaFB1YmxpY1JlbGF0aW9ucz5cbiAgICA+O1xuICAgIGNvbnN0IHR5cGVkRW51bXMgPSBlbnVtcyBhcyBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGZldGNoUHVibGljRW51bXM+PjtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgY291bnRzLnRhYmxlcyA9XG4gICAgICAgICAgICAodHlwZWRHcm91cGVkLnRhYmxlPy5sZW5ndGggPz8gMCkgK1xuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC5wYXJ0aXRpb25lZF90YWJsZT8ubGVuZ3RoID8/IDApO1xuICAgICAgICBjb3VudHMudmlld3MgPVxuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC52aWV3Py5sZW5ndGggPz8gMCkgK1xuICAgICAgICAgICAgKHR5cGVkR3JvdXBlZC5tYXRlcmlhbGl6ZWRfdmlldz8ubGVuZ3RoID8/IDApO1xuICAgICAgICBjb3VudHMuZW51bXMgPSBPYmplY3Qua2V5cyh0eXBlZEVudW1zKS5sZW5ndGg7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxSZWxhdGlvbnMgPSBbXG4gICAgICAgIC4uLih0eXBlZEdyb3VwZWQucGFydGl0aW9uZWRfdGFibGUgPz8gW10pLFxuICAgICAgICAuLi4odHlwZWRHcm91cGVkLnRhYmxlID8/IFtdKSxcbiAgICAgICAgLi4uKHR5cGVkR3JvdXBlZC52aWV3ID8/IFtdKSxcbiAgICAgICAgLi4uKHR5cGVkR3JvdXBlZC5tYXRlcmlhbGl6ZWRfdmlldyA/PyBbXSksXG4gICAgXTtcblxuICAgIGNvbnN0IHJlbGF0aW9uRW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBhbGxSZWxhdGlvbnMubWFwKGFzeW5jIChyZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWwudHlwZSAhPT0gJ3ZpZXcnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVldWUuYWRkKCgpID0+IGFuYWx5emVSZWxhdGlvbihwb29sLCByZWwubmFtZSkpO1xuICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzLmFuYWx5emVkICs9IDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFthdHRyaWJ1dGVzLCBpbmRleGVzLCBmb3JlaWduS2V5cywgc3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hZGQoKCkgPT4gZmV0Y2hSZWxhdGlvbkF0dHJpYnV0ZXMocG9vbCwgcmVsLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUmVsYXRpb25JbmRleGVzKHBvb2wsIHJlbC5uYW1lKSksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFkZCgoKSA9PiBmZXRjaFJlbGF0aW9uRm9yZWlnbktleXMocG9vbCwgcmVsLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgICAgcXVldWUuYWRkKCgpID0+IGZldGNoUmVsYXRpb25TdGF0cyhwb29sLCByZWwubmFtZSkpLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBhdHRycyA9IGF0dHJpYnV0ZXMgYXMgVEF0dHJpYnV0ZUluZm9bXTtcbiAgICAgICAgICAgIGNvbnN0IGlkeHMgPSBpbmRleGVzIGFzIFRJbmRleEluZm9bXTtcbiAgICAgICAgICAgIGNvbnN0IGZrcyA9IGZvcmVpZ25LZXlzIGFzIFRGb3JlaWduS2V5SW5mb1tdO1xuICAgICAgICAgICAgY29uc3QgcmVsU3RhdHMgPSBzdGF0cyBhcyBUUmVsYXRpb25TdGF0cztcblxuICAgICAgICAgICAgY29uc3QgZGlzdGluY3RMb29rdXAgPSBuZXcgTWFwKFxuICAgICAgICAgICAgICAgIHJlbFN0YXRzLmF0dHJpYnV0ZXMubWFwKChhKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgIGEuYXR0cmlidXRlX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIGEuZXN0aW1hdGVkX2Rpc3RpbmN0LFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvdW50cy5jb2x1bW5zICs9IGF0dHJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb3VudHMuaW5kZXhlcyArPSBpZHhzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb3VudHMuZm9yZWlnbktleXMgKz0gZmtzLmxlbmd0aDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZEF0dHJzID0gYXR0cnMubWFwKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRyYW5zZm9ybUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0aW5jdCA9IGRpc3RpbmN0TG9va3VwLmdldChhdHRyLmF0dHJpYnV0ZV9uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdGluY3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IHsuLi5iYXNlLCBlc3RpbWF0ZWRfZGlzdGluY3Q6IGRpc3RpbmN0fVxuICAgICAgICAgICAgICAgICAgICA6IGJhc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICByZWwubmFtZSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21tZW50OiByZWwuY29tbWVudCxcbiAgICAgICAgICAgICAgICAgICAga2luZDogcmVsLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRvUmVjb3JkKHRyYW5zZm9ybWVkQXR0cnMsIChhKSA9PiBhLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBpbmRleGVzOiB0b1JlY29yZChcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeHMubWFwKHRyYW5zZm9ybUluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChpKSA9PiBpLmluZGV4X25hbWUsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXM6IHRvUmVjb3JkKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmtzLm1hcCh0cmFuc2Zvcm1SZWZlcmVuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHIpID0+IHIuY29uc3RyYWludF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdIGFzIGNvbnN0O1xuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5pbnRyb3NwZWN0aW9uLnN0YXRlID0gJ2RvbmUnO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3Bvc3RncmVzcWwnLFxuICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICB2ZXJzaW9uX3N0cmluZzogc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBvc3RncmVzVmVyc2lvbiEsXG4gICAgICAgICAgICB2ZXJzaW9uX251bWJlcjpcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucG9zdGdyZXNWZXJzaW9uTnVtYmVyISxcbiAgICAgICAgfSxcbiAgICAgICAgaWRlbnRpZmllcjoge1xuICAgICAgICAgICAgc3lzdGVtX2lkZW50aWZpZXI6IGlkZW50aWZpZXIhLnN5c3RlbV9pZGVudGlmaWVyLFxuICAgICAgICAgICAgZGF0YWJhc2Vfb2lkOiBpZGVudGlmaWVyIS5kYXRhYmFzZV9vaWQsXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6IGlkZW50aWZpZXIhLmRhdGFiYXNlX25hbWUsXG4gICAgICAgIGNvbW1lbnQ6IGNvbW1lbnQgPz8gbnVsbCxcbiAgICAgICAgcmVsYXRpb25zOiBPYmplY3QuZnJvbUVudHJpZXMocmVsYXRpb25FbnRyaWVzKSxcbiAgICAgICAgZW51bXM6IHR5cGVkRW51bXMsXG4gICAgfTtcbn07XG4iXX0=
@@ -0,0 +1,9 @@
1
+ type TConfig = {
2
+ readonly token?: string;
3
+ readonly device_id: string;
4
+ };
5
+ export declare const readConfig: () => Promise<TConfig>;
6
+ export declare const writeConfig: (token: string) => Promise<void>;
7
+ export declare const flushConfig: () => Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=config.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.mts","sourceRoot":"./src/","sources":["app/config.mts"],"names":[],"mappings":"AAQA,KAAK,OAAO,GAAG;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAC,CAAC;AAgBrE,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,OAAO,CAiBlD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAG7D,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAQhD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
4
+ import { uuidv7 } from 'uuidv7';
5
+ const CONFIG_DIR = join(homedir(), '.dbctx');
6
+ const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
7
+ const readRawConfig = async () => {
8
+ try {
9
+ const raw = await readFile(CONFIG_PATH, 'utf-8');
10
+ return JSON.parse(raw) ?? {};
11
+ }
12
+ catch {
13
+ return {};
14
+ }
15
+ };
16
+ const persist = async (data) => {
17
+ await mkdir(CONFIG_DIR, { recursive: true });
18
+ await writeFile(CONFIG_PATH, JSON.stringify(data, null, 4), 'utf-8');
19
+ };
20
+ export const readConfig = async () => {
21
+ const raw = await readRawConfig();
22
+ if (typeof raw.device_id === 'string' && raw.device_id.length > 0) {
23
+ return {
24
+ token: typeof raw.token === 'string' ? raw.token : undefined,
25
+ device_id: raw.device_id,
26
+ };
27
+ }
28
+ const device_id = uuidv7();
29
+ await persist({ ...raw, device_id });
30
+ return {
31
+ token: typeof raw.token === 'string' ? raw.token : undefined,
32
+ device_id,
33
+ };
34
+ };
35
+ export const writeConfig = async (token) => {
36
+ const raw = await readRawConfig();
37
+ await persist({ ...raw, token });
38
+ };
39
+ export const flushConfig = async () => {
40
+ try {
41
+ const raw = await readRawConfig();
42
+ const { token: _, ...rest } = raw;
43
+ await persist(rest);
44
+ }
45
+ catch {
46
+ // ignore if file doesn't exist
47
+ }
48
+ };
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9jb25maWcubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBSXBELE1BQU0sYUFBYSxHQUFHLEtBQUssSUFBc0MsRUFBRTtJQUMvRCxJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLElBQTZCLEVBQWlCLEVBQUU7SUFDbkUsTUFBTSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxJQUFzQixFQUFFO0lBQ25ELE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxFQUFFLENBQUM7SUFFbEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE9BQU87WUFDSCxLQUFLLEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM1RCxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7U0FDM0IsQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUMzQixNQUFNLE9BQU8sQ0FBQyxFQUFDLEdBQUcsR0FBRyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7SUFFbkMsT0FBTztRQUNILEtBQUssRUFBRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzVELFNBQVM7S0FDWixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxLQUFhLEVBQWlCLEVBQUU7SUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxhQUFhLEVBQUUsQ0FBQztJQUNsQyxNQUFNLE9BQU8sQ0FBQyxFQUFDLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBbUIsRUFBRTtJQUNqRCxJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDTCwrQkFBK0I7SUFDbkMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aG9tZWRpcn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQge2pvaW59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge3JlYWRGaWxlLCB3cml0ZUZpbGUsIG1rZGlyfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7dXVpZHY3fSBmcm9tICd1dWlkdjcnO1xuXG5jb25zdCBDT05GSUdfRElSID0gam9pbihob21lZGlyKCksICcuZGJjdHgnKTtcbmNvbnN0IENPTkZJR19QQVRIID0gam9pbihDT05GSUdfRElSLCAnY29uZmlnLmpzb24nKTtcblxudHlwZSBUQ29uZmlnID0ge3JlYWRvbmx5IHRva2VuPzogc3RyaW5nOyByZWFkb25seSBkZXZpY2VfaWQ6IHN0cmluZ307XG5cbmNvbnN0IHJlYWRSYXdDb25maWcgPSBhc3luYyAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKENPTkZJR19QQVRILCAndXRmLTgnKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSA/PyB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn07XG5cbmNvbnN0IHBlcnNpc3QgPSBhc3luYyAoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBta2RpcihDT05GSUdfRElSLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKENPTkZJR19QQVRILCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCA0KSwgJ3V0Zi04Jyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVhZENvbmZpZyA9IGFzeW5jICgpOiBQcm9taXNlPFRDb25maWc+ID0+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkUmF3Q29uZmlnKCk7XG5cbiAgICBpZiAodHlwZW9mIHJhdy5kZXZpY2VfaWQgPT09ICdzdHJpbmcnICYmIHJhdy5kZXZpY2VfaWQubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9rZW46IHR5cGVvZiByYXcudG9rZW4gPT09ICdzdHJpbmcnID8gcmF3LnRva2VuIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGV2aWNlX2lkOiByYXcuZGV2aWNlX2lkLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRldmljZV9pZCA9IHV1aWR2NygpO1xuICAgIGF3YWl0IHBlcnNpc3Qoey4uLnJhdywgZGV2aWNlX2lkfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbjogdHlwZW9mIHJhdy50b2tlbiA9PT0gJ3N0cmluZycgPyByYXcudG9rZW4gOiB1bmRlZmluZWQsXG4gICAgICAgIGRldmljZV9pZCxcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHdyaXRlQ29uZmlnID0gYXN5bmMgKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkUmF3Q29uZmlnKCk7XG4gICAgYXdhaXQgcGVyc2lzdCh7Li4ucmF3LCB0b2tlbn0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGZsdXNoQ29uZmlnID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRSYXdDb25maWcoKTtcbiAgICAgICAgY29uc3Qge3Rva2VuOiBfLCAuLi5yZXN0fSA9IHJhdztcbiAgICAgICAgYXdhaXQgcGVyc2lzdChyZXN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlIGlmIGZpbGUgZG9lc24ndCBleGlzdFxuICAgIH1cbn07XG4iXX0=
@@ -0,0 +1,9 @@
1
+ import type { TStore } from '../store.mjs';
2
+ export type TDBConnection = {
3
+ readonly pool: InstanceType<typeof Pool>;
4
+ readonly cleanup: () => void;
5
+ };
6
+ declare const Pool: typeof import("pg").Pool;
7
+ export declare const connectDB: (store: TStore) => Promise<TDBConnection | undefined>;
8
+ export {};
9
+ //# sourceMappingURL=db.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.mts","sourceRoot":"./src/","sources":["app/db.mts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAIzC,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,QAAA,MAAO,IAAI,0BAAM,CAAC;AAwFlB,eAAO,MAAM,SAAS,GAClB,OAAO,MAAM,KACd,OAAO,CAAC,aAAa,GAAG,SAAS,CA8GnC,CAAC"}
@@ -0,0 +1,157 @@
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 resolveDBConfig = (store) => scope({
8
+ hostname: 'localhost',
9
+ port: 5432,
10
+ database: 'postgres',
11
+ username: 'postgres',
12
+ password: undefined,
13
+ })
14
+ .let((config) => ({
15
+ hostname: process.env['PGHOST'] ?? config.hostname,
16
+ port: process.env['PGPORT']
17
+ ? parseInt(process.env['PGPORT'], 10)
18
+ : config.port,
19
+ database: process.env['PGDATABASE'] ?? config.database,
20
+ username: process.env['PGUSER'] ?? config.username,
21
+ password: process.env['PGPASSWORD'] ?? config.password,
22
+ }))
23
+ .let((config) => store.config.connectionString
24
+ ? scope(new URL(store.config.connectionString))
25
+ .let((url) => ({
26
+ hostname: url.hostname || config.hostname,
27
+ port: url.port ? parseInt(url.port, 10) : config.port,
28
+ database: url.pathname.slice(1) || config.database,
29
+ username: decodeURIComponent(url.username) ||
30
+ config.username,
31
+ password: url.password
32
+ ? decodeURIComponent(url.password)
33
+ : config.password,
34
+ }))
35
+ .value()
36
+ : config)
37
+ .let((config) => ({
38
+ hostname: store.config.hostname ?? config.hostname,
39
+ port: store.config.port ?? config.port,
40
+ database: store.config.database ?? config.database,
41
+ username: store.config.username ?? config.username,
42
+ password: config.password,
43
+ }))
44
+ .value();
45
+ const buildSSLConfig = (store) => {
46
+ const mode = store.config.sslmode ?? 'prefer';
47
+ return mode === 'disable'
48
+ ? false
49
+ : {
50
+ rejectUnauthorized: mode === 'verify-ca' || mode === 'verify-full',
51
+ ...(store.config.sslrootcert
52
+ ? {
53
+ ca: readFileSync(store.config.sslrootcert, 'utf-8'),
54
+ }
55
+ : {}),
56
+ ...(store.config.sslcert
57
+ ? {
58
+ cert: readFileSync(store.config.sslcert, 'utf-8'),
59
+ }
60
+ : {}),
61
+ ...(store.config.sslkey
62
+ ? {
63
+ key: readFileSync(store.config.sslkey, 'utf-8'),
64
+ }
65
+ : {}),
66
+ };
67
+ };
68
+ export const connectDB = async (store) => {
69
+ const config = resolveDBConfig(store);
70
+ const ssl = buildSSLConfig(store);
71
+ // SSH tunnel: connect via localhost tunnel, but display the real remote target
72
+ const connectionHost = store.steps.sshConnection.enabled &&
73
+ store.steps.sshConnection.localPort !== null
74
+ ? '127.0.0.1'
75
+ : config.hostname;
76
+ const connectionPort = store.steps.sshConnection.enabled &&
77
+ store.steps.sshConnection.localPort !== null
78
+ ? store.steps.sshConnection.localPort
79
+ : config.port;
80
+ runInAction(() => {
81
+ store.steps.databaseConnection.pickedHostname = config.hostname;
82
+ store.steps.databaseConnection.pickedPort = config.port;
83
+ store.steps.databaseConnection.pickedDatabase = config.database;
84
+ store.steps.databaseConnection.pickedUsername = config.username;
85
+ store.steps.databaseConnection.state = 'connecting';
86
+ });
87
+ const attemptConnection = async (password, sslConfig) => {
88
+ const pool = new Pool({
89
+ host: connectionHost,
90
+ port: connectionPort,
91
+ database: config.database,
92
+ user: config.username,
93
+ password,
94
+ ssl: sslConfig,
95
+ connectionTimeoutMillis: 10_000,
96
+ });
97
+ try {
98
+ const client = await pool.connect();
99
+ client.release();
100
+ const version = await fetchPostgresVersion(pool);
101
+ runInAction(() => {
102
+ store.steps.databaseConnection.postgresVersion =
103
+ version.version;
104
+ store.steps.databaseConnection.postgresVersionNumber =
105
+ version.version_num;
106
+ store.steps.databaseConnection.state = 'connected';
107
+ });
108
+ return {
109
+ pool,
110
+ cleanup: () => {
111
+ pool.end();
112
+ runInAction(() => {
113
+ store.steps.databaseConnection.state = 'idle';
114
+ });
115
+ },
116
+ };
117
+ }
118
+ catch (err) {
119
+ await pool.end();
120
+ // SSL errors happen before auth — check first
121
+ const errMsg = err instanceof Error ? err.message : '';
122
+ const isSSLError = errMsg.includes('does not support SSL');
123
+ const sslMode = store.config.sslmode ?? 'prefer';
124
+ if (isSSLError && sslMode === 'prefer') {
125
+ return attemptConnection(password, false);
126
+ }
127
+ const pgCode = err.code;
128
+ const isAuthError = pgCode === '28P01' ||
129
+ pgCode === '28000' ||
130
+ errMsg.includes('password must be a string');
131
+ if (!isAuthError) {
132
+ runInAction(() => {
133
+ store.steps.databaseConnection.state = 'error';
134
+ store.steps.databaseConnection.error =
135
+ err instanceof Error ? err.message : String(err);
136
+ });
137
+ return undefined;
138
+ }
139
+ runInAction(() => {
140
+ store.steps.databaseConnection.wrongAttempt =
141
+ store.steps.databaseConnection.promptCount > 0;
142
+ store.steps.databaseConnection.password = null;
143
+ store.steps.databaseConnection.promptCount += 1;
144
+ store.steps.databaseConnection.state = 'need-password';
145
+ });
146
+ await when(() => store.steps.databaseConnection.password !== null);
147
+ const newPassword = store.steps.databaseConnection.password;
148
+ runInAction(() => {
149
+ store.steps.databaseConnection.password = null;
150
+ store.steps.databaseConnection.state = 'connecting';
151
+ });
152
+ return attemptConnection(newPassword, sslConfig);
153
+ }
154
+ };
155
+ return attemptConnection(config.password, ssl);
156
+ };
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2RiLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFJdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFPdkQsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQztBQVVsQixNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBcUIsRUFBRSxDQUN6RCxLQUFLLENBQUM7SUFDRixRQUFRLEVBQUUsV0FBVztJQUNyQixJQUFJLEVBQUUsSUFBSTtJQUNWLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFFBQVEsRUFBRSxTQUErQjtDQUM1QyxDQUFDO0tBQ0csR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVE7SUFDbEQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJO0lBQ2pCLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRO0lBQ3RELFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1B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a0IsQ0FBQyxZQUFZO29CQUN2QyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7Z0JBQ25ELEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDL0MsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUVuRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVMsQ0FBQztZQUU3RCxXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDL0MsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ3hELENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3JlYWRGaWxlU3luY30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGcgZnJvbSAncGcnO1xuaW1wb3J0IHtydW5JbkFjdGlvbiwgd2hlbn0gZnJvbSAnbW9ieCc7XG5pbXBvcnQge3Njb3BlfSBmcm9tICdzY29wZS11dGlsaXRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHR5cGUge1RTU0xNb2RlfSBmcm9tICcuLi9pbmRleC5tanMnO1xuaW1wb3J0IHtmZXRjaFBvc3RncmVzVmVyc2lvbn0gZnJvbSAnLi4vZGIvdmVyc2lvbi5tanMnO1xuXG5leHBvcnQgdHlwZSBUREJDb25uZWN0aW9uID0ge1xuICAgIHJlYWRvbmx5IHBvb2w6IEluc3RhbmNlVHlwZTx0eXBlb2YgUG9vbD47XG4gICAgcmVhZG9ubHkgY2xlYW51cDogKCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IHtQb29sfSA9IHBnO1xuXG50eXBlIFRSZXNvbHZlZERCQ29uZmlnID0ge1xuICAgIHJlYWRvbmx5IGhvc3RuYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGRhdGFiYXNlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdXNlcm5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBwYXNzd29yZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxuY29uc3QgcmVzb2x2ZURCQ29uZmlnID0gKHN0b3JlOiBUU3RvcmUpOiBUUmVzb2x2ZWREQkNvbmZpZyA9PlxuICAgIHNjb3BlKHtcbiAgICAgICAgaG9zdG5hbWU6ICdsb2NhbGhvc3QnLFxuICAgICAgICBwb3J0OiA1NDMyLFxuICAgICAgICBkYXRhYmFzZTogJ3Bvc3RncmVzJyxcbiAgICAgICAgdXNlcm5hbWU6ICdwb3N0Z3JlcycsXG4gICAgICAgIHBhc3N3b3JkOiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIH0pXG4gICAgICAgIC5sZXQoKGNvbmZpZykgPT4gKHtcbiAgICAgICAgICAgIGhvc3RuYW1lOiBwcm9jZXNzLmVudlsnUEdIT1NUJ10gPz8gY29uZmlnLmhvc3RuYW1lLFxuICAgICAgICAgICAgcG9ydDogcHJvY2Vzcy5lbnZbJ1BHUE9SVCddXG4gICAgICAgICAgICAgICAgPyBwYXJzZUludChwcm9jZXNzLmVudlsnUEdQT1JUJ10sIDEwKVxuICAgICAgICAgICAgICAgIDogY29uZmlnLnBvcnQsXG4gICAgICAgICAgICBkYXRhYmFzZTogcHJvY2Vzcy5lbnZbJ1BHREFUQUJBU0UnXSA/PyBjb25maWcuZGF0YWJhc2UsXG4gICAgICAgICAgICB1c2VybmFtZTogcHJvY2Vzcy5lbnZbJ1BHVVNFUiddID8/IGNvbmZpZy51c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwcm9jZXNzLmVudlsnUEdQQVNTV09SRCddID8/IGNvbmZpZy5wYXNzd29yZCxcbiAgICAgICAgfSkpXG4gICAgICAgIC5sZXQoKGNvbmZpZykgPT5cbiAgICAgICAgICAgIHN0b3JlLmNvbmZpZy5jb25uZWN0aW9uU3RyaW5nXG4gICAgICAgICAgICAgICAgPyBzY29wZShuZXcgVVJMKHN0b3JlLmNvbmZpZy5jb25uZWN0aW9uU3RyaW5nKSlcbiAgICAgICAgICAgICAgICAgICAgICAubGV0KCh1cmwpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUgfHwgY29uZmlnLmhvc3RuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiB1cmwucG9ydCA/IHBhcnNlSW50KHVybC5wb3J0LCAxMCkgOiBjb25maWcucG9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHVybC5wYXRobmFtZS5zbGljZSgxKSB8fCBjb25maWcuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50KHVybC51c2VybmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy51c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHVybC5wYXNzd29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZWNvZGVVUklDb21wb25lbnQodXJsLnBhc3N3b3JkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb25maWcucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgLnZhbHVlKClcbiAgICAgICAgICAgICAgICA6IGNvbmZpZyxcbiAgICAgICAgKVxuICAgICAgICAubGV0KChjb25maWcpID0+ICh7XG4gICAgICAgICAgICBob3N0bmFtZTogc3RvcmUuY29uZmlnLmhvc3RuYW1lID8/IGNvbmZpZy5ob3N0bmFtZSxcbiAgICAgICAgICAgIHBvcnQ6IHN0b3JlLmNvbmZpZy5wb3J0ID8/IGNvbmZpZy5wb3J0LFxuICAgICAgICAgICAgZGF0YWJhc2U6IHN0b3JlLmNvbmZpZy5kYXRhYmFzZSA/PyBjb25maWcuZGF0YWJhc2UsXG4gICAgICAgICAgICB1c2VybmFtZTogc3RvcmUuY29uZmlnLnVzZXJuYW1lID8/IGNvbmZpZy51c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBjb25maWcucGFzc3dvcmQsXG4gICAgICAgIH0pKVxuICAgICAgICAudmFsdWUoKTtcblxudHlwZSBUU1NMQ29uZmlnID1cbiAgICB8IGZhbHNlXG4gICAgfCB7XG4gICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuO1xuICAgICAgICAgIGNhPzogc3RyaW5nO1xuICAgICAgICAgIGNlcnQ/OiBzdHJpbmc7XG4gICAgICAgICAga2V5Pzogc3RyaW5nO1xuICAgICAgfTtcblxuY29uc3QgYnVpbGRTU0xDb25maWcgPSAoc3RvcmU6IFRTdG9yZSk6IFRTU0xDb25maWcgPT4ge1xuICAgIGNvbnN0IG1vZGU6IFRTU0xNb2RlID0gc3RvcmUuY29uZmlnLnNzbG1vZGUgPz8gJ3ByZWZlcic7XG5cbiAgICByZXR1cm4gbW9kZSA9PT0gJ2Rpc2FibGUnXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB7XG4gICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDpcbiAgICAgICAgICAgICAgICAgIG1vZGUgPT09ICd2ZXJpZnktY2EnIHx8IG1vZGUgPT09ICd2ZXJpZnktZnVsbCcsXG4gICAgICAgICAgICAgIC4uLihzdG9yZS5jb25maWcuc3Nscm9vdGNlcnRcbiAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2E6IHJlYWRGaWxlU3luYyhzdG9yZS5jb25maWcuc3Nscm9vdGNlcnQsICd1dGYtOCcpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKHN0b3JlLmNvbmZpZy5zc2xjZXJ0XG4gICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlcnQ6IHJlYWRGaWxlU3luYyhzdG9yZS5jb25maWcuc3NsY2VydCwgJ3V0Zi04JyksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAuLi4oc3RvcmUuY29uZmlnLnNzbGtleVxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHJlYWRGaWxlU3luYyhzdG9yZS5jb25maWcuc3Nsa2V5LCAndXRmLTgnKSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0REIgPSBhc3luYyAoXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8VERCQ29ubmVjdGlvbiB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVEQkNvbmZpZyhzdG9yZSk7XG4gICAgY29uc3Qgc3NsID0gYnVpbGRTU0xDb25maWcoc3RvcmUpO1xuXG4gICAgLy8gU1NIIHR1bm5lbDogY29ubmVjdCB2aWEgbG9jYWxob3N0IHR1bm5lbCwgYnV0IGRpc3BsYXkgdGhlIHJlYWwgcmVtb3RlIHRhcmdldFxuICAgIGNvbnN0IGNvbm5lY3Rpb25Ib3N0ID1cbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5lbmFibGVkICYmXG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ubG9jYWxQb3J0ICE9PSBudWxsXG4gICAgICAgICAgICA/ICcxMjcuMC4wLjEnXG4gICAgICAgICAgICA6IGNvbmZpZy5ob3N0bmFtZTtcbiAgICBjb25zdCBjb25uZWN0aW9uUG9ydCA9XG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uZW5hYmxlZCAmJlxuICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmxvY2FsUG9ydCAhPT0gbnVsbFxuICAgICAgICAgICAgPyBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmxvY2FsUG9ydFxuICAgICAgICAgICAgOiBjb25maWcucG9ydDtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBpY2tlZEhvc3RuYW1lID0gY29uZmlnLmhvc3RuYW1lO1xuICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGlja2VkUG9ydCA9IGNvbmZpZy5wb3J0O1xuICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGlja2VkRGF0YWJhc2UgPSBjb25maWcuZGF0YWJhc2U7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5waWNrZWRVc2VybmFtZSA9IGNvbmZpZy51c2VybmFtZTtcbiAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnN0YXRlID0gJ2Nvbm5lY3RpbmcnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYXR0ZW1wdENvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIHNzbENvbmZpZzogVFNTTENvbmZpZyxcbiAgICApOiBQcm9taXNlPFREQkNvbm5lY3Rpb24gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgY29uc3QgcG9vbCA9IG5ldyBQb29sKHtcbiAgICAgICAgICAgIGhvc3Q6IGNvbm5lY3Rpb25Ib3N0LFxuICAgICAgICAgICAgcG9ydDogY29ubmVjdGlvblBvcnQsXG4gICAgICAgICAgICBkYXRhYmFzZTogY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICAgICAgdXNlcjogY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgICBzc2w6IHNzbENvbmZpZyxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiAxMF8wMDAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBwb29sLmNvbm5lY3QoKTtcbiAgICAgICAgICAgIGNsaWVudC5yZWxlYXNlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBhd2FpdCBmZXRjaFBvc3RncmVzVmVyc2lvbihwb29sKTtcblxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wb3N0Z3Jlc1ZlcnNpb24gPVxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLnZlcnNpb247XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBvc3RncmVzVmVyc2lvbk51bWJlciA9XG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb24udmVyc2lvbl9udW07XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnN0YXRlID0gJ2Nvbm5lY3RlZCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwb29sLFxuICAgICAgICAgICAgICAgIGNsZWFudXA6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcG9vbC5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnN0YXRlID0gJ2lkbGUnO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBhd2FpdCBwb29sLmVuZCgpO1xuXG4gICAgICAgICAgICAvLyBTU0wgZXJyb3JzIGhhcHBlbiBiZWZvcmUgYXV0aCDigJQgY2hlY2sgZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGlzU1NMRXJyb3IgPSBlcnJNc2cuaW5jbHVkZXMoJ2RvZXMgbm90IHN1cHBvcnQgU1NMJyk7XG4gICAgICAgICAgICBjb25zdCBzc2xNb2RlOiBUU1NMTW9kZSA9IHN0b3JlLmNvbmZpZy5zc2xtb2RlID8/ICdwcmVmZXInO1xuXG4gICAgICAgICAgICBpZiAoaXNTU0xFcnJvciAmJiBzc2xNb2RlID09PSAncHJlZmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBhdHRlbXB0Q29ubmVjdGlvbihwYXNzd29yZCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwZ0NvZGUgPSAoZXJyIGFzIHtjb2RlPzogc3RyaW5nfSkuY29kZTtcbiAgICAgICAgICAgIGNvbnN0IGlzQXV0aEVycm9yID1cbiAgICAgICAgICAgICAgICBwZ0NvZGUgPT09ICcyOFAwMScgfHxcbiAgICAgICAgICAgICAgICBwZ0NvZGUgPT09ICcyODAwMCcgfHxcbiAgICAgICAgICAgICAgICBlcnJNc2cuaW5jbHVkZXMoJ3Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcnKTtcblxuICAgICAgICAgICAgaWYgKCFpc0F1dGhFcnJvcikge1xuICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnN0YXRlID0gJ2Vycm9yJztcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLmVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLndyb25nQXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5wcm9tcHRDb3VudCA+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"}
@@ -0,0 +1,105 @@
1
+ import { existsSync } from 'fs';
2
+ import { totalmem } from 'os';
3
+ import { basename, join } from 'path';
4
+ import { cwd, env, platform } from 'process';
5
+ export const detectOS = () => platform === 'darwin'
6
+ ? 'macos'
7
+ : platform === 'win32'
8
+ ? 'windows'
9
+ : 'linux';
10
+ export const detectShell = () => {
11
+ if (platform === 'win32') {
12
+ return 'powershell';
13
+ }
14
+ const shell = env.SHELL;
15
+ if (!shell) {
16
+ return 'other';
17
+ }
18
+ const name = basename(shell);
19
+ const known = {
20
+ bash: 'bash',
21
+ zsh: 'zsh',
22
+ ksh: 'ksh',
23
+ fish: 'fish',
24
+ ash: 'ash',
25
+ };
26
+ return known[name] ?? 'other';
27
+ };
28
+ export const detectWSL = () => !!(env.WSL_DISTRO_NAME || env.WSLENV);
29
+ const GB = 1024 ** 3;
30
+ export const detectSystemMemory = () => {
31
+ const bytes = totalmem();
32
+ if (bytes < 12 * GB) {
33
+ return '8g';
34
+ }
35
+ if (bytes < 20 * GB) {
36
+ return '16g';
37
+ }
38
+ if (bytes < 28 * GB) {
39
+ return '24g';
40
+ }
41
+ if (bytes < 48 * GB) {
42
+ return '32g';
43
+ }
44
+ return 'more';
45
+ };
46
+ export const detectPackageManager = () => {
47
+ const agent = env.npm_config_user_agent ?? '';
48
+ const known = [
49
+ 'pnpm',
50
+ 'yarn',
51
+ 'bun',
52
+ 'deno',
53
+ ];
54
+ const match = known.find((pm) => agent.startsWith(pm));
55
+ return match ?? 'npm';
56
+ };
57
+ // TODO: Implement hostname → provider mapping
58
+ export const detectProvider = (hostname) => {
59
+ const rules = [
60
+ ['.neon.tech', 'neon'],
61
+ ['.rds.amazonaws.com', 'aws'],
62
+ ['.amazonaws.com', 'aws'],
63
+ ['.supabase.co', 'supabase'],
64
+ ['.supabase.com', 'supabase'],
65
+ ['.database.azure.com', 'azure'],
66
+ ['.cloudsql.', 'gcp'],
67
+ ['.sql.goog', 'gcp'],
68
+ ['.railway.app', 'railway'],
69
+ ['.render.com', 'render'],
70
+ ['.aivencloud.com', 'avien'],
71
+ ['.aiven.io', 'avien'],
72
+ ['.timescaledb.io', 'timescale_cloud'],
73
+ ['.herokuapp.com', 'heroku'],
74
+ ['.fly.dev', 'fly'],
75
+ ['.koyeb.app', 'koyeb'],
76
+ ['.db.ondigitalocean.com', 'digital_ocean'],
77
+ ['.alibabaclouddb.com', 'alibada_cloud'],
78
+ ];
79
+ const lower = hostname.toLowerCase();
80
+ const found = rules.find(([suffix]) => lower.includes(suffix));
81
+ return found?.[1] ?? 'other';
82
+ };
83
+ const aiAssistantRules = [
84
+ ['cursor', ['.cursor', '.cursorrules']],
85
+ ['claude_code', ['.claude', 'CLAUDE.md']],
86
+ ['opencode', ['.opencode']],
87
+ ['aider', ['.aider.conf.yml', '.aider.chat.history.md']],
88
+ ['openai_codex', ['.codex']],
89
+ ['github_copilot', ['.github/copilot-instructions.md']],
90
+ ];
91
+ export const detectAIAssistants = () => {
92
+ const root = cwd();
93
+ return aiAssistantRules
94
+ .filter(([, paths]) => paths.some((p) => existsSync(join(root, p))))
95
+ .map(([name]) => name);
96
+ };
97
+ export const detectDocker = () => existsSync('/.dockerenv');
98
+ export const isLocalhost = (hostname) => {
99
+ const lower = hostname.toLowerCase();
100
+ return (lower === 'localhost' ||
101
+ lower === '127.0.0.1' ||
102
+ lower === '::1' ||
103
+ lower === '0.0.0.0');
104
+ };
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0Lm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9kZXRlY3QubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxJQUFJLENBQUM7QUFDOUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLElBQUksQ0FBQztBQUM1QixPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFXM0MsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQVEsRUFBRSxDQUM5QixRQUFRLEtBQUssUUFBUTtJQUNqQixDQUFDLENBQUMsT0FBTztJQUNULENBQUMsQ0FBQyxRQUFRLEtBQUssT0FBTztRQUNwQixDQUFDLENBQUMsU0FBUztRQUNYLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFFcEIsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQVcsRUFBRTtJQUNwQyxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN2QixPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztJQUV4QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLE1BQU0sS0FBSyxHQUEyQjtRQUNsQyxJQUFJLEVBQUUsTUFBTTtRQUNaLEdBQUcsRUFBRSxLQUFLO1FBQ1YsR0FBRyxFQUFFLEtBQUs7UUFDVixJQUFJLEVBQUUsTUFBTTtRQUNaLEdBQUcsRUFBRSxLQUFLO0tBQ2IsQ0FBQztJQUVGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQztBQUNsQyxD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LEtBQUssS0FBSyxTQUFTLENBQ3RCLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2V4aXN0c1N5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7dG90YWxtZW19IGZyb20gJ29zJztcbmltcG9ydCB7YmFzZW5hbWUsIGpvaW59IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtjd2QsIGVudiwgcGxhdGZvcm19IGZyb20gJ3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgVEFJQXNzaXN0YW50LFxuICAgIFREYXRhYmFzZVByb3ZpZGVyLFxuICAgIFRPcyxcbiAgICBUU2hlbGwsXG4gICAgVFN5c3RlbU1lbW9yeSxcbiAgICBUUGFja2FnZU1hbmFnZXIsXG59IGZyb20gJ0BkYmN0eC9jb3JlJztcblxuZXhwb3J0IGNvbnN0IGRldGVjdE9TID0gKCk6IFRPcyA9PlxuICAgIHBsYXRmb3JtID09PSAnZGFyd2luJ1xuICAgICAgICA/ICdtYWNvcydcbiAgICAgICAgOiBwbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgICAgICAgID8gJ3dpbmRvd3MnXG4gICAgICAgICAgOiAnbGludXgnO1xuXG5leHBvcnQgY29uc3QgZGV0ZWN0U2hlbGwgPSAoKTogVFNoZWxsID0+IHtcbiAgICBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgcmV0dXJuICdwb3dlcnNoZWxsJztcbiAgICB9XG5cbiAgICBjb25zdCBzaGVsbCA9IGVudi5TSEVMTDtcblxuICAgIGlmICghc2hlbGwpIHtcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKHNoZWxsKTtcbiAgICBjb25zdCBrbm93bjogUmVjb3JkPHN0cmluZywgVFNoZWxsPiA9IHtcbiAgICAgICAgYmFzaDogJ2Jhc2gnLFxuICAgICAgICB6c2g6ICd6c2gnLFxuICAgICAgICBrc2g6ICdrc2gnLFxuICAgICAgICBmaXNoOiAnZmlzaCcsXG4gICAgICAgIGFzaDogJ2FzaCcsXG4gICAgfTtcblxuICAgIHJldHVybiBrbm93bltuYW1lXSA/PyAnb3RoZXInO1xufTtcblxuZXhwb3J0IGNvbnN0IGRldGVjdFdTTCA9ICgpOiBib29sZWFuID0+ICEhKGVudi5XU0xfRElTVFJPX05BTUUgfHwgZW52LldTTEVOVik7XG5cbmNvbnN0IEdCID0gMTAyNCAqKiAzO1xuXG5leHBvcnQgY29uc3QgZGV0ZWN0U3lzdGVtTWVtb3J5ID0gKCk6IFRTeXN0ZW1NZW1vcnkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gdG90YWxtZW0oKTtcblxuICAgIGlmIChieXRlcyA8IDEyICogR0IpIHtcbiAgICAgICAgcmV0dXJuICc4Zyc7XG4gICAgfVxuICAgIGlmIChieXRlcyA8IDIwICogR0IpIHtcbiAgICAgICAgcmV0dXJuICcxNmcnO1xuICAgIH1cbiAgICBpZiAoYnl0ZXMgPCAyOCAqIEdCKSB7XG4gICAgICAgIHJldHVybiAnMjRnJztcbiAgICB9XG4gICAgaWYgKGJ5dGVzIDwgNDggKiBHQikge1xuICAgICAgICByZXR1cm4gJzMyZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdtb3JlJztcbn07XG5cbmV4cG9ydCBjb25zdCBkZXRlY3RQYWNrYWdlTWFuYWdlciA9ICgpOiBUUGFja2FnZU1hbmFnZXIgPT4ge1xuICAgIGNvbnN0IGFnZW50ID0gZW52Lm5wbV9jb25maWdfdXNlcl9hZ2VudCA/PyAnJztcbiAgICBjb25zdCBrbm93bjogcmVhZG9ubHkgVFBhY2thZ2VNYW5hZ2VyW10gPSBbXG4gICAgICAgICdwbnBtJyxcbiAgICAgICAgJ3lhcm4nLFxuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ2Rlbm8nLFxuICAgIF0gYXMgY29uc3Q7XG5cbiAgICBjb25zdCBtYXRjaCA9IGtub3duLmZpbmQoKHBtKSA9PiBhZ2VudC5zdGFydHNXaXRoKHBtKSk7XG5cbiAgICByZXR1cm4gbWF0Y2ggPz8gJ25wbSc7XG59O1xuXG4vLyBUT0RPOiBJbXBsZW1lbnQgaG9zdG5hbWUg4oaSIHByb3ZpZGVyIG1hcHBpbmdcbmV4cG9ydCBjb25zdCBkZXRlY3RQcm92aWRlciA9IChob3N0bmFtZTogc3RyaW5nKTogVERhdGFiYXNlUHJvdmlkZXIgPT4ge1xuICAgIGNvbnN0IHJ1bGVzOiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIFREYXRhYmFzZVByb3ZpZGVyXT4gPSBbXG4gICAgICAgIFsnLm5lb24udGVjaCcsICduZW9uJ10sXG4gICAgICAgIFsnLnJkcy5hbWF6b25hd3MuY29tJywgJ2F3cyddLFxuICAgICAgICBbJy5hbWF6b25hd3MuY29tJywgJ2F3cyddLFxuICAgICAgICBbJy5zdXBhYmFzZS5jbycsICdzdXBhYmFzZSddLFxuICAgICAgICBbJy5zdXBhYmFzZS5jb20nLCAnc3VwYWJhc2UnXSxcbiAgICAgICAgWycuZGF0YWJhc2UuYXp1cmUuY29tJywgJ2F6dXJlJ10sXG4gICAgICAgIFsnLmNsb3Vkc3FsLicsICdnY3AnXSxcbiAgICAgICAgWycuc3FsLmdvb2cnLCAnZ2NwJ10sXG4gICAgICAgIFsnLnJhaWx3YXkuYXBwJywgJ3JhaWx3YXknXSxcbiAgICAgICAgWycucmVuZGVyLmNvbScsICdyZW5kZXInXSxcbiAgICAgICAgWycuYWl2ZW5jbG91ZC5jb20nLCAnYXZpZW4nXSxcbiAgICAgICAgWycuYWl2ZW4uaW8nLCAnYXZpZW4nXSxcbiAgICAgICAgWycudGltZXNjYWxlZGIuaW8nLCAndGltZXNjYWxlX2Nsb3VkJ10sXG4gICAgICAgIFsnLmhlcm9rdWFwcC5jb20nLCAnaGVyb2t1J10sXG4gICAgICAgIFsnLmZseS5kZXYnLCAnZmx5J10sXG4gICAgICAgIFsnLmtveWViLmFwcCcsICdrb3llYiddLFxuICAgICAgICBbJy5kYi5vbmRpZ2l0YWxvY2Vhbi5jb20nLCAnZGlnaXRhbF9vY2VhbiddLFxuICAgICAgICBbJy5hbGliYWJhY2xvdWRkYi5jb20nLCAnYWxpYmFkYV9jbG91ZCddLFxuICAgIF07XG5cbiAgICBjb25zdCBsb3dlciA9IGhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZm91bmQgPSBydWxlcy5maW5kKChbc3VmZml4XSkgPT4gbG93ZXIuaW5jbHVkZXMoc3VmZml4KSk7XG5cbiAgICByZXR1cm4gZm91bmQ/LlsxXSA/PyAnb3RoZXInO1xufTtcblxuY29uc3QgYWlBc3Npc3RhbnRSdWxlczogUmVhZG9ubHlBcnJheTxcbiAgICByZWFkb25seSBbVEFJQXNzaXN0YW50LCBSZWFkb25seUFycmF5PHN0cmluZz5dXG4+ID0gW1xuICAgIFsnY3Vyc29yJywgWycuY3Vyc29yJywgJy5jdXJzb3JydWxlcyddXSxcbiAgICBbJ2NsYXVkZV9jb2RlJywgWycuY2xhdWRlJywgJ0NMQVVERS5tZCddXSxcbiAgICBbJ29wZW5jb2RlJywgWycub3BlbmNvZGUnXV0sXG4gICAgWydhaWRlcicsIFsnLmFpZGVyLmNvbmYueW1sJywgJy5haWRlci5jaGF0Lmhpc3RvcnkubWQnXV0sXG4gICAgWydvcGVuYWlfY29kZXgnLCBbJy5jb2RleCddXSxcbiAgICBbJ2dpdGh1Yl9jb3BpbG90JywgWycuZ2l0aHViL2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJ11dLFxuXTtcblxuZXhwb3J0IGNvbnN0IGRldGVjdEFJQXNzaXN0YW50cyA9ICgpOiBUQUlBc3Npc3RhbnRbXSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IGN3ZCgpO1xuXG4gICAgcmV0dXJuIGFpQXNzaXN0YW50UnVsZXNcbiAgICAgICAgLmZpbHRlcigoWywgcGF0aHNdKSA9PiBwYXRocy5zb21lKChwKSA9PiBleGlzdHNTeW5jKGpvaW4ocm9vdCwgcCkpKSlcbiAgICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZXRlY3REb2NrZXIgPSAoKTogYm9vbGVhbiA9PiBleGlzdHNTeW5jKCcvLmRvY2tlcmVudicpO1xuXG5leHBvcnQgY29uc3QgaXNMb2NhbGhvc3QgPSAoaG9zdG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGxvd2VyID0gaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIGxvd2VyID09PSAnbG9jYWxob3N0JyB8fFxuICAgICAgICBsb3dlciA9PT0gJzEyNy4wLjAuMScgfHxcbiAgICAgICAgbG93ZXIgPT09ICc6OjEnIHx8XG4gICAgICAgIGxvd2VyID09PSAnMC4wLjAuMCdcbiAgICApO1xufTtcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import { TStore } from '../store.mjs';
2
+ export declare function run(store: TStore): Promise<void>;
3
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"./src/","sources":["app/index.mts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAepC,wBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,iBAiGtC"}