@keeper-security/keeper-sdk-javascript 0.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/auth/ConsoleAuthUI.d.ts +10 -0
- package/dist/auth/ConsoleAuthUI.js +152 -0
- package/dist/auth/ConsoleAuthUI.js.map +1 -0
- package/dist/auth/ConsoleLogin.d.ts +8 -0
- package/dist/auth/ConsoleLogin.js +266 -0
- package/dist/auth/ConsoleLogin.js.map +1 -0
- package/dist/auth/SessionManager.d.ts +66 -0
- package/dist/auth/SessionManager.js +211 -0
- package/dist/auth/SessionManager.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/records/RecordOperations.d.ts +79 -0
- package/dist/records/RecordOperations.js +346 -0
- package/dist/records/RecordOperations.js.map +1 -0
- package/dist/records/RecordUtils.d.ts +36 -0
- package/dist/records/RecordUtils.js +224 -0
- package/dist/records/RecordUtils.js.map +1 -0
- package/dist/sharing/Sharing.d.ts +27 -0
- package/dist/sharing/Sharing.js +125 -0
- package/dist/sharing/Sharing.js.map +1 -0
- package/dist/src/auth/ConsoleAuthUI.d.ts +10 -0
- package/dist/src/auth/ConsoleAuthUI.js +161 -0
- package/dist/src/auth/ConsoleAuthUI.js.map +1 -0
- package/dist/src/auth/ConsoleLogin.d.ts +8 -0
- package/dist/src/auth/ConsoleLogin.js +311 -0
- package/dist/src/auth/ConsoleLogin.js.map +1 -0
- package/dist/src/auth/SessionManager.d.ts +67 -0
- package/dist/src/auth/SessionManager.js +212 -0
- package/dist/src/auth/SessionManager.js.map +1 -0
- package/dist/src/folders/FolderManager.d.ts +57 -0
- package/dist/src/folders/FolderManager.js +108 -0
- package/dist/src/folders/FolderManager.js.map +1 -0
- package/dist/src/folders/addFolder.d.ts +32 -0
- package/dist/src/folders/addFolder.js +207 -0
- package/dist/src/folders/addFolder.js.map +1 -0
- package/dist/src/folders/changeDirectory.d.ts +19 -0
- package/dist/src/folders/changeDirectory.js +171 -0
- package/dist/src/folders/changeDirectory.js.map +1 -0
- package/dist/src/folders/deleteFolder.d.ts +17 -0
- package/dist/src/folders/deleteFolder.js +237 -0
- package/dist/src/folders/deleteFolder.js.map +1 -0
- package/dist/src/folders/folderHelpers.d.ts +48 -0
- package/dist/src/folders/folderHelpers.js +100 -0
- package/dist/src/folders/folderHelpers.js.map +1 -0
- package/dist/src/folders/folderTree.d.ts +29 -0
- package/dist/src/folders/folderTree.js +250 -0
- package/dist/src/folders/folderTree.js.map +1 -0
- package/dist/src/folders/getFolder.d.ts +56 -0
- package/dist/src/folders/getFolder.js +143 -0
- package/dist/src/folders/getFolder.js.map +1 -0
- package/dist/src/folders/listFolder.d.ts +48 -0
- package/dist/src/folders/listFolder.js +276 -0
- package/dist/src/folders/listFolder.js.map +1 -0
- package/dist/src/folders/updateFolder.d.ts +31 -0
- package/dist/src/folders/updateFolder.js +137 -0
- package/dist/src/folders/updateFolder.js.map +1 -0
- package/dist/src/index.d.ts +49 -0
- package/dist/src/index.js +151 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/records/RecordOperations.d.ts +80 -0
- package/dist/src/records/RecordOperations.js +356 -0
- package/dist/src/records/RecordOperations.js.map +1 -0
- package/dist/src/records/RecordUtils.d.ts +37 -0
- package/dist/src/records/RecordUtils.js +263 -0
- package/dist/src/records/RecordUtils.js.map +1 -0
- package/dist/src/records/Totp.d.ts +14 -0
- package/dist/src/records/Totp.js +111 -0
- package/dist/src/records/Totp.js.map +1 -0
- package/dist/src/sharedFolders/SharedFolderManager.d.ts +20 -0
- package/dist/src/sharedFolders/SharedFolderManager.js +33 -0
- package/dist/src/sharedFolders/SharedFolderManager.js.map +1 -0
- package/dist/src/sharedFolders/listSharedFolders.d.ts +29 -0
- package/dist/src/sharedFolders/listSharedFolders.js +127 -0
- package/dist/src/sharedFolders/listSharedFolders.js.map +1 -0
- package/dist/src/sharedFolders/shareFolder.d.ts +36 -0
- package/dist/src/sharedFolders/shareFolder.js +352 -0
- package/dist/src/sharedFolders/shareFolder.js.map +1 -0
- package/dist/src/sharing/Sharing.d.ts +50 -0
- package/dist/src/sharing/Sharing.js +195 -0
- package/dist/src/sharing/Sharing.js.map +1 -0
- package/dist/src/storage/InMemoryStorage.d.ts +24 -0
- package/dist/src/storage/InMemoryStorage.js +139 -0
- package/dist/src/storage/InMemoryStorage.js.map +1 -0
- package/dist/src/teams/TeamManager.d.ts +17 -0
- package/dist/src/teams/TeamManager.js +38 -0
- package/dist/src/teams/TeamManager.js.map +1 -0
- package/dist/src/teams/enterpriseData.d.ts +106 -0
- package/dist/src/teams/enterpriseData.js +319 -0
- package/dist/src/teams/enterpriseData.js.map +1 -0
- package/dist/src/teams/listTeams.d.ts +42 -0
- package/dist/src/teams/listTeams.js +308 -0
- package/dist/src/teams/listTeams.js.map +1 -0
- package/dist/src/teams/viewTeam.d.ts +35 -0
- package/dist/src/teams/viewTeam.js +177 -0
- package/dist/src/teams/viewTeam.js.map +1 -0
- package/dist/src/utils/Logger.d.ts +28 -0
- package/dist/src/utils/Logger.js +62 -0
- package/dist/src/utils/Logger.js.map +1 -0
- package/dist/src/utils/constants.d.ts +50 -0
- package/dist/src/utils/constants.js +64 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/errors.d.ts +10 -0
- package/dist/src/utils/errors.js +117 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/guards.d.ts +7 -0
- package/dist/src/utils/guards.js +29 -0
- package/dist/src/utils/guards.js.map +1 -0
- package/dist/src/utils/index.d.ts +7 -0
- package/dist/src/utils/index.js +39 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/patterns.d.ts +9 -0
- package/dist/src/utils/patterns.js +20 -0
- package/dist/src/utils/patterns.js.map +1 -0
- package/dist/src/utils/types.d.ts +12 -0
- package/dist/src/utils/types.js +3 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/src/vault/KeeperVault.d.ts +116 -0
- package/dist/src/vault/KeeperVault.js +443 -0
- package/dist/src/vault/KeeperVault.js.map +1 -0
- package/dist/storage/InMemoryStorage.d.ts +24 -0
- package/dist/storage/InMemoryStorage.js +132 -0
- package/dist/storage/InMemoryStorage.js.map +1 -0
- package/dist/utils/Logger.d.ts +28 -0
- package/dist/utils/Logger.js +62 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/constants.d.ts +26 -0
- package/dist/utils/constants.js +37 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errors.d.ts +10 -0
- package/dist/utils/errors.js +117 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/vault/KeeperVault.d.ts +72 -0
- package/dist/vault/KeeperVault.js +338 -0
- package/dist/vault/KeeperVault.js.map +1 -0
- package/package.json +32 -0
- package/src/auth/ConsoleAuthUI.ts +169 -0
- package/src/auth/ConsoleLogin.ts +351 -0
- package/src/auth/SessionManager.ts +293 -0
- package/src/folders/FolderManager.ts +174 -0
- package/src/folders/addFolder.ts +294 -0
- package/src/folders/changeDirectory.ts +217 -0
- package/src/folders/deleteFolder.ts +293 -0
- package/src/folders/folderHelpers.ts +99 -0
- package/src/folders/folderTree.ts +321 -0
- package/src/folders/getFolder.ts +234 -0
- package/src/folders/listFolder.ts +358 -0
- package/src/folders/updateFolder.ts +210 -0
- package/src/index.ts +242 -0
- package/src/records/RecordOperations.ts +549 -0
- package/src/records/RecordUtils.ts +282 -0
- package/src/records/Totp.ts +119 -0
- package/src/sharedFolders/SharedFolderManager.ts +57 -0
- package/src/sharedFolders/listSharedFolders.ts +173 -0
- package/src/sharedFolders/shareFolder.ts +457 -0
- package/src/sharing/Sharing.ts +282 -0
- package/src/storage/InMemoryStorage.ts +163 -0
- package/src/teams/TeamManager.ts +61 -0
- package/src/teams/enterpriseData.ts +453 -0
- package/src/teams/listTeams.ts +373 -0
- package/src/teams/viewTeam.ts +248 -0
- package/src/utils/Logger.ts +71 -0
- package/src/utils/constants.ts +63 -0
- package/src/utils/errors.ts +108 -0
- package/src/utils/guards.ts +24 -0
- package/src/utils/index.ts +22 -0
- package/src/utils/patterns.ts +20 -0
- package/src/utils/types.ts +11 -0
- package/src/vault/KeeperVault.ts +612 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DRecord } from '@keeper-security/keeperapi';
|
|
2
|
+
export declare enum RecordVersion {
|
|
3
|
+
Legacy = 2,
|
|
4
|
+
Typed = 3
|
|
5
|
+
}
|
|
6
|
+
type RecordField = {
|
|
7
|
+
type: string;
|
|
8
|
+
value: any[];
|
|
9
|
+
label?: string;
|
|
10
|
+
required?: boolean;
|
|
11
|
+
privacyScreen?: boolean;
|
|
12
|
+
enforceGeneration?: boolean;
|
|
13
|
+
complexity?: {
|
|
14
|
+
length?: number;
|
|
15
|
+
caps?: number;
|
|
16
|
+
lowercase?: number;
|
|
17
|
+
digits?: number;
|
|
18
|
+
special?: number;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export declare function getRecordTitle(record: DRecord): string;
|
|
22
|
+
export declare function getRecordType(record: DRecord): string;
|
|
23
|
+
export declare function getRecordFields(record: DRecord): RecordField[];
|
|
24
|
+
export type RecordSummary = {
|
|
25
|
+
login?: string;
|
|
26
|
+
password?: string;
|
|
27
|
+
url?: string;
|
|
28
|
+
fields: RecordField[];
|
|
29
|
+
};
|
|
30
|
+
export declare function getRecordSummary(record: DRecord): RecordSummary;
|
|
31
|
+
export declare function getRecordTotpUrl(record: DRecord): string | undefined;
|
|
32
|
+
export declare function getRecordPassword(record: DRecord): string | undefined;
|
|
33
|
+
export declare function getRecordLogin(record: DRecord): string | undefined;
|
|
34
|
+
export declare function getRecordUrl(record: DRecord): string | undefined;
|
|
35
|
+
export declare function searchRecords(records: DRecord[], criteria: string): DRecord[];
|
|
36
|
+
export declare function formatRecord(record: DRecord, showDetails?: boolean): string;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatRecord = exports.searchRecords = exports.getRecordUrl = exports.getRecordLogin = exports.getRecordPassword = exports.getRecordTotpUrl = exports.getRecordSummary = exports.getRecordFields = exports.getRecordType = exports.getRecordTitle = exports.RecordVersion = void 0;
|
|
4
|
+
const Totp_1 = require("./Totp");
|
|
5
|
+
var FieldType;
|
|
6
|
+
(function (FieldType) {
|
|
7
|
+
FieldType["Login"] = "login";
|
|
8
|
+
FieldType["Password"] = "password";
|
|
9
|
+
FieldType["Url"] = "url";
|
|
10
|
+
FieldType["Note"] = "note";
|
|
11
|
+
FieldType["Text"] = "text";
|
|
12
|
+
})(FieldType || (FieldType = {}));
|
|
13
|
+
var RecordVersion;
|
|
14
|
+
(function (RecordVersion) {
|
|
15
|
+
RecordVersion[RecordVersion["Legacy"] = 2] = "Legacy";
|
|
16
|
+
RecordVersion[RecordVersion["Typed"] = 3] = "Typed";
|
|
17
|
+
})(RecordVersion = exports.RecordVersion || (exports.RecordVersion = {}));
|
|
18
|
+
const TOTP_FIELD_TYPES = new Set(['totp', 'oneTimeCode', 'otp']);
|
|
19
|
+
const MASKED_VALUE = '********';
|
|
20
|
+
const RECORD_SEPARATOR = '-'.repeat(50);
|
|
21
|
+
function toFieldValueArray(v) {
|
|
22
|
+
if (v == null)
|
|
23
|
+
return [];
|
|
24
|
+
return Array.isArray(v) ? v : [v];
|
|
25
|
+
}
|
|
26
|
+
function getLegacyExtraFields(record) {
|
|
27
|
+
const raw = record.extra;
|
|
28
|
+
if (raw == null)
|
|
29
|
+
return [];
|
|
30
|
+
let extra;
|
|
31
|
+
if (typeof raw === 'string') {
|
|
32
|
+
try {
|
|
33
|
+
extra = JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
catch (_a) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (typeof raw === 'object') {
|
|
40
|
+
extra = raw;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
if (!Array.isArray(extra.fields))
|
|
46
|
+
return [];
|
|
47
|
+
const out = [];
|
|
48
|
+
for (const f of extra.fields) {
|
|
49
|
+
const typeName = f.type || f.field_type || FieldType.Text;
|
|
50
|
+
const rawVal = f.value !== undefined && f.value !== null ? f.value : f.data;
|
|
51
|
+
out.push({
|
|
52
|
+
type: typeName,
|
|
53
|
+
value: toFieldValueArray(rawVal),
|
|
54
|
+
label: f.label || f.field_title,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
function getRecordTitle(record) {
|
|
60
|
+
if (!record.data)
|
|
61
|
+
return '(no data)';
|
|
62
|
+
if (typeof record.data === 'string') {
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(record.data);
|
|
65
|
+
return parsed.title || '(untitled)';
|
|
66
|
+
}
|
|
67
|
+
catch (_a) {
|
|
68
|
+
return '(parse error)';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return record.data.title || '(untitled)';
|
|
72
|
+
}
|
|
73
|
+
exports.getRecordTitle = getRecordTitle;
|
|
74
|
+
function getRecordType(record) {
|
|
75
|
+
if (record.version <= RecordVersion.Legacy)
|
|
76
|
+
return 'legacy';
|
|
77
|
+
if (!record.data)
|
|
78
|
+
return 'unknown';
|
|
79
|
+
return record.data.type || 'unknown';
|
|
80
|
+
}
|
|
81
|
+
exports.getRecordType = getRecordType;
|
|
82
|
+
function getRecordFields(record) {
|
|
83
|
+
if (!record.data)
|
|
84
|
+
return [];
|
|
85
|
+
if (record.version <= RecordVersion.Legacy) {
|
|
86
|
+
const fields = [];
|
|
87
|
+
const d = record.data;
|
|
88
|
+
if (d.secret1)
|
|
89
|
+
fields.push({ type: FieldType.Login, value: [d.secret1] });
|
|
90
|
+
if (d.secret2)
|
|
91
|
+
fields.push({ type: FieldType.Password, value: [d.secret2] });
|
|
92
|
+
if (d.link)
|
|
93
|
+
fields.push({ type: FieldType.Url, value: [d.link] });
|
|
94
|
+
if (d.notes)
|
|
95
|
+
fields.push({ type: FieldType.Note, value: [d.notes] });
|
|
96
|
+
if (Array.isArray(d.custom)) {
|
|
97
|
+
for (const c of d.custom) {
|
|
98
|
+
if (!c)
|
|
99
|
+
continue;
|
|
100
|
+
fields.push({
|
|
101
|
+
type: c.type || FieldType.Text,
|
|
102
|
+
value: c.value != null && c.value !== '' ? [c.value] : [],
|
|
103
|
+
label: c.name,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const extraFields = getLegacyExtraFields(record);
|
|
108
|
+
fields.push(...extraFields);
|
|
109
|
+
return fields;
|
|
110
|
+
}
|
|
111
|
+
const fields = [];
|
|
112
|
+
if (Array.isArray(record.data.fields)) {
|
|
113
|
+
for (const f of record.data.fields) {
|
|
114
|
+
fields.push({
|
|
115
|
+
type: f.type || FieldType.Text,
|
|
116
|
+
value: Array.isArray(f.value) ? f.value : [f.value],
|
|
117
|
+
label: f.label,
|
|
118
|
+
required: f.required,
|
|
119
|
+
privacyScreen: f.privacyScreen,
|
|
120
|
+
enforceGeneration: f.enforceGeneration,
|
|
121
|
+
complexity: f.complexity,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (Array.isArray(record.data.custom)) {
|
|
126
|
+
for (const f of record.data.custom) {
|
|
127
|
+
fields.push({
|
|
128
|
+
type: f.type || FieldType.Text,
|
|
129
|
+
value: Array.isArray(f.value) ? f.value : [f.value],
|
|
130
|
+
label: f.label,
|
|
131
|
+
required: f.required,
|
|
132
|
+
privacyScreen: f.privacyScreen,
|
|
133
|
+
enforceGeneration: f.enforceGeneration,
|
|
134
|
+
complexity: f.complexity,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return fields;
|
|
139
|
+
}
|
|
140
|
+
exports.getRecordFields = getRecordFields;
|
|
141
|
+
function getRecordSummary(record) {
|
|
142
|
+
var _a, _b, _c;
|
|
143
|
+
const fields = getRecordFields(record);
|
|
144
|
+
if (record.version <= RecordVersion.Legacy) {
|
|
145
|
+
return {
|
|
146
|
+
login: (_a = record.data) === null || _a === void 0 ? void 0 : _a.secret1,
|
|
147
|
+
password: (_b = record.data) === null || _b === void 0 ? void 0 : _b.secret2,
|
|
148
|
+
url: (_c = record.data) === null || _c === void 0 ? void 0 : _c.link,
|
|
149
|
+
fields,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
let login;
|
|
153
|
+
let password;
|
|
154
|
+
let url;
|
|
155
|
+
for (const f of fields) {
|
|
156
|
+
if (!login && f.type === FieldType.Login && f.value.length > 0) {
|
|
157
|
+
login = String(f.value[0]);
|
|
158
|
+
}
|
|
159
|
+
else if (!password && f.type === FieldType.Password && f.value.length > 0) {
|
|
160
|
+
password = String(f.value[0]);
|
|
161
|
+
}
|
|
162
|
+
else if (!url && f.type === FieldType.Url && f.value.length > 0) {
|
|
163
|
+
const val = f.value[0];
|
|
164
|
+
url = typeof val === 'string' ? val : (val === null || val === void 0 ? void 0 : val.value) || (val === null || val === void 0 ? void 0 : val.url);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return { login, password, url, fields };
|
|
168
|
+
}
|
|
169
|
+
exports.getRecordSummary = getRecordSummary;
|
|
170
|
+
function getRecordTotpUrl(record) {
|
|
171
|
+
for (const field of getRecordFields(record)) {
|
|
172
|
+
if (!TOTP_FIELD_TYPES.has(field.type))
|
|
173
|
+
continue;
|
|
174
|
+
for (const v of field.value) {
|
|
175
|
+
if (typeof v === 'string' && v.trim())
|
|
176
|
+
return v.trim();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
exports.getRecordTotpUrl = getRecordTotpUrl;
|
|
182
|
+
function getRecordPassword(record) {
|
|
183
|
+
return getRecordSummary(record).password;
|
|
184
|
+
}
|
|
185
|
+
exports.getRecordPassword = getRecordPassword;
|
|
186
|
+
function getRecordLogin(record) {
|
|
187
|
+
return getRecordSummary(record).login;
|
|
188
|
+
}
|
|
189
|
+
exports.getRecordLogin = getRecordLogin;
|
|
190
|
+
function getRecordUrl(record) {
|
|
191
|
+
return getRecordSummary(record).url;
|
|
192
|
+
}
|
|
193
|
+
exports.getRecordUrl = getRecordUrl;
|
|
194
|
+
const wordCache = new WeakMap();
|
|
195
|
+
function searchRecords(records, criteria) {
|
|
196
|
+
if (!criteria.trim())
|
|
197
|
+
return records;
|
|
198
|
+
const searchWords = criteria.toLowerCase().split(/\s+/);
|
|
199
|
+
return records.filter((record) => {
|
|
200
|
+
let words = wordCache.get(record);
|
|
201
|
+
if (!words) {
|
|
202
|
+
words = collectRecordWords(record);
|
|
203
|
+
wordCache.set(record, words);
|
|
204
|
+
}
|
|
205
|
+
return searchWords.every((sw) => words.some((w) => w.includes(sw)));
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
exports.searchRecords = searchRecords;
|
|
209
|
+
function collectRecordWords(record) {
|
|
210
|
+
const words = [];
|
|
211
|
+
const title = getRecordTitle(record);
|
|
212
|
+
if (title)
|
|
213
|
+
words.push(...title.toLowerCase().split(/\s+/));
|
|
214
|
+
for (const field of getRecordFields(record)) {
|
|
215
|
+
if (field.label)
|
|
216
|
+
words.push(field.label.toLowerCase());
|
|
217
|
+
for (const v of field.value) {
|
|
218
|
+
if (typeof v === 'string') {
|
|
219
|
+
words.push(...v.toLowerCase().split(/\s+/));
|
|
220
|
+
}
|
|
221
|
+
else if (v && typeof v === 'object') {
|
|
222
|
+
for (const val of Object.values(v)) {
|
|
223
|
+
if (typeof val === 'string') {
|
|
224
|
+
words.push(...val.toLowerCase().split(/\s+/));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
words.push(record.uid);
|
|
231
|
+
return words;
|
|
232
|
+
}
|
|
233
|
+
function formatRecord(record, showDetails = false) {
|
|
234
|
+
const summary = getRecordSummary(record);
|
|
235
|
+
const lines = [
|
|
236
|
+
RECORD_SEPARATOR,
|
|
237
|
+
`Title: ${getRecordTitle(record)}`,
|
|
238
|
+
`Record UID: ${record.uid}`,
|
|
239
|
+
`Record Type: ${getRecordType(record)}`,
|
|
240
|
+
];
|
|
241
|
+
if (summary.login)
|
|
242
|
+
lines.push(`Username: ${summary.login}`);
|
|
243
|
+
if (summary.url)
|
|
244
|
+
lines.push(`URL: ${summary.url}`);
|
|
245
|
+
if (showDetails) {
|
|
246
|
+
for (const field of summary.fields) {
|
|
247
|
+
if (field.type === FieldType.Login || field.type === FieldType.Url)
|
|
248
|
+
continue;
|
|
249
|
+
const isTotp = TOTP_FIELD_TYPES.has(field.type);
|
|
250
|
+
const isSensitive = field.type === FieldType.Password || isTotp;
|
|
251
|
+
const label = isTotp ? 'TOTP URL' : field.label || field.type;
|
|
252
|
+
lines.push(`${label}: ${isSensitive ? MASKED_VALUE : field.value.join(', ')}`);
|
|
253
|
+
}
|
|
254
|
+
const totpUrl = getRecordTotpUrl(record);
|
|
255
|
+
const code = totpUrl ? (0, Totp_1.getTotpCode)(totpUrl) : null;
|
|
256
|
+
if (code) {
|
|
257
|
+
lines.push(`Two Factor Code: ${code.code} valid for ${code.secondsRemaining} sec`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return lines.join('\n');
|
|
261
|
+
}
|
|
262
|
+
exports.formatRecord = formatRecord;
|
|
263
|
+
//# sourceMappingURL=RecordUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordUtils.js","sourceRoot":"","sources":["../../../src/records/RecordUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type TotpAlgorithm = 'SHA1' | 'SHA256' | 'SHA512';
|
|
2
|
+
export type TotpParams = {
|
|
3
|
+
secret: string;
|
|
4
|
+
algorithm: TotpAlgorithm;
|
|
5
|
+
digits: number;
|
|
6
|
+
period: number;
|
|
7
|
+
};
|
|
8
|
+
export type TotpCode = {
|
|
9
|
+
code: string;
|
|
10
|
+
secondsRemaining: number;
|
|
11
|
+
period: number;
|
|
12
|
+
};
|
|
13
|
+
export declare function parseTotpUrl(url: string): TotpParams | null;
|
|
14
|
+
export declare function getTotpCode(urlOrParams: string | TotpParams, now?: number): TotpCode | null;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTotpCode = exports.parseTotpUrl = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
|
|
6
|
+
const DEFAULT_DIGITS = 6;
|
|
7
|
+
const DEFAULT_PERIOD = 30;
|
|
8
|
+
const DEFAULT_ALGORITHM = 'SHA1';
|
|
9
|
+
const UINT32_MAX = 0x100000000;
|
|
10
|
+
function decodeBase32(input) {
|
|
11
|
+
const noWhitespace = input.replace(/\s+/g, '');
|
|
12
|
+
let endIndex = noWhitespace.length;
|
|
13
|
+
while (endIndex > 0 && noWhitespace.charCodeAt(endIndex - 1) === 0x3d)
|
|
14
|
+
endIndex--;
|
|
15
|
+
const cleaned = noWhitespace.slice(0, endIndex).toUpperCase();
|
|
16
|
+
const out = [];
|
|
17
|
+
let buffer = 0;
|
|
18
|
+
let bits = 0;
|
|
19
|
+
for (const ch of cleaned) {
|
|
20
|
+
const idx = BASE32_ALPHABET.indexOf(ch);
|
|
21
|
+
if (idx < 0)
|
|
22
|
+
throw new Error(`Invalid base32 character "${ch}" in TOTP secret`);
|
|
23
|
+
buffer = (buffer << 5) | idx;
|
|
24
|
+
bits += 5;
|
|
25
|
+
if (bits >= 8) {
|
|
26
|
+
bits -= 8;
|
|
27
|
+
out.push((buffer >> bits) & 0xff);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return Uint8Array.from(out);
|
|
31
|
+
}
|
|
32
|
+
function normalizeAlgorithm(value) {
|
|
33
|
+
const upper = (value || DEFAULT_ALGORITHM).toUpperCase();
|
|
34
|
+
return upper === 'SHA256' || upper === 'SHA512' ? upper : DEFAULT_ALGORITHM;
|
|
35
|
+
}
|
|
36
|
+
function parsePositiveInt(value, fallback) {
|
|
37
|
+
const parsed = parseInt(value || '', 10);
|
|
38
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
39
|
+
}
|
|
40
|
+
function parseTotpUrl(url) {
|
|
41
|
+
if (!(url === null || url === void 0 ? void 0 : url.trim()))
|
|
42
|
+
return null;
|
|
43
|
+
let params;
|
|
44
|
+
try {
|
|
45
|
+
if (url.startsWith('otpauth://')) {
|
|
46
|
+
const u = new URL(url);
|
|
47
|
+
if (u.hostname.toLowerCase() !== 'totp')
|
|
48
|
+
return null;
|
|
49
|
+
params = u.searchParams;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
params = new URLSearchParams(url);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (_a) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const secret = (params.get('secret') || '').trim();
|
|
59
|
+
if (!secret)
|
|
60
|
+
return null;
|
|
61
|
+
return {
|
|
62
|
+
secret,
|
|
63
|
+
algorithm: normalizeAlgorithm(params.get('algorithm')),
|
|
64
|
+
digits: parsePositiveInt(params.get('digits'), DEFAULT_DIGITS),
|
|
65
|
+
period: parsePositiveInt(params.get('period'), DEFAULT_PERIOD),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
exports.parseTotpUrl = parseTotpUrl;
|
|
69
|
+
function counterToBuffer(counter) {
|
|
70
|
+
const buf = Buffer.alloc(8);
|
|
71
|
+
buf.writeUInt32BE(Math.floor(counter / UINT32_MAX), 0);
|
|
72
|
+
buf.writeUInt32BE(counter % UINT32_MAX, 4);
|
|
73
|
+
return buf;
|
|
74
|
+
}
|
|
75
|
+
function getTotpCode(urlOrParams, now = Date.now()) {
|
|
76
|
+
const params = typeof urlOrParams === 'string' ? parseTotpUrl(urlOrParams) : urlOrParams;
|
|
77
|
+
if (!params)
|
|
78
|
+
return null;
|
|
79
|
+
if (!Number.isFinite(params.period) || params.period <= 0)
|
|
80
|
+
return null;
|
|
81
|
+
if (!Number.isFinite(params.digits) || params.digits <= 0)
|
|
82
|
+
return null;
|
|
83
|
+
let key;
|
|
84
|
+
try {
|
|
85
|
+
key = decodeBase32(params.secret);
|
|
86
|
+
}
|
|
87
|
+
catch (_a) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
if (key.length === 0)
|
|
91
|
+
return null;
|
|
92
|
+
const seconds = Math.floor(now / 1000);
|
|
93
|
+
const counter = Math.floor(seconds / params.period);
|
|
94
|
+
const secondsRemaining = params.period - (seconds % params.period);
|
|
95
|
+
const digest = (0, crypto_1.createHmac)(params.algorithm.toLowerCase(), Buffer.from(key))
|
|
96
|
+
.update(counterToBuffer(counter))
|
|
97
|
+
.digest();
|
|
98
|
+
if (digest.length === 0)
|
|
99
|
+
return null;
|
|
100
|
+
const offset = digest[digest.length - 1] & 0x0f;
|
|
101
|
+
if (offset + 3 >= digest.length)
|
|
102
|
+
return null;
|
|
103
|
+
const binary = ((digest[offset] & 0x7f) << 24) |
|
|
104
|
+
((digest[offset + 1] & 0xff) << 16) |
|
|
105
|
+
((digest[offset + 2] & 0xff) << 8) |
|
|
106
|
+
(digest[offset + 3] & 0xff);
|
|
107
|
+
const code = (binary % 10 ** params.digits).toString().padStart(params.digits, '0');
|
|
108
|
+
return { code, secondsRemaining, period: params.period };
|
|
109
|
+
}
|
|
110
|
+
exports.getTotpCode = getTotpCode;
|
|
111
|
+
//# sourceMappingURL=Totp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Totp.js","sourceRoot":"","sources":["../../../src/records/Totp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Auth } from '@keeper-security/keeperapi';
|
|
2
|
+
import { InMemoryStorage } from '../storage/InMemoryStorage';
|
|
3
|
+
import type { FormattedSharedFoldersTable, ListSharedFolderRow, ListSharedFoldersOptions } from './listSharedFolders';
|
|
4
|
+
import type { ShareFolderInput, ShareFolderResult } from './shareFolder';
|
|
5
|
+
export type AuthProvider = () => Auth;
|
|
6
|
+
export declare class SharedFolderManager {
|
|
7
|
+
private readonly storage;
|
|
8
|
+
private readonly authProvider;
|
|
9
|
+
constructor(storage: InMemoryStorage, authProvider: AuthProvider);
|
|
10
|
+
private requireAuth;
|
|
11
|
+
listSharedFolders(options?: ListSharedFoldersOptions): ListSharedFolderRow[];
|
|
12
|
+
formatSharedFoldersTable(rows: ListSharedFolderRow[], options?: {
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
columnWidth?: number;
|
|
15
|
+
}): FormattedSharedFoldersTable;
|
|
16
|
+
renderSharedFoldersAsciiTable(table: FormattedSharedFoldersTable, options?: {
|
|
17
|
+
minColWidth?: number;
|
|
18
|
+
}): string;
|
|
19
|
+
shareFolder(input: ShareFolderInput): Promise<ShareFolderResult>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SharedFolderManager = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const listSharedFolders_1 = require("./listSharedFolders");
|
|
6
|
+
const shareFolder_1 = require("./shareFolder");
|
|
7
|
+
class SharedFolderManager {
|
|
8
|
+
constructor(storage, authProvider) {
|
|
9
|
+
this.storage = storage;
|
|
10
|
+
this.authProvider = authProvider;
|
|
11
|
+
}
|
|
12
|
+
requireAuth() {
|
|
13
|
+
const auth = this.authProvider();
|
|
14
|
+
if (!auth) {
|
|
15
|
+
throw new utils_1.KeeperSdkError('Not logged in. Call login() first.', utils_1.ResultCodes.NOT_LOGGED_IN);
|
|
16
|
+
}
|
|
17
|
+
return auth;
|
|
18
|
+
}
|
|
19
|
+
listSharedFolders(options = {}) {
|
|
20
|
+
return (0, listSharedFolders_1.listSharedFolders)(this.storage, options);
|
|
21
|
+
}
|
|
22
|
+
formatSharedFoldersTable(rows, options = {}) {
|
|
23
|
+
return (0, listSharedFolders_1.formatSharedFoldersTable)(rows, options);
|
|
24
|
+
}
|
|
25
|
+
renderSharedFoldersAsciiTable(table, options = {}) {
|
|
26
|
+
return (0, listSharedFolders_1.renderSharedFoldersAsciiTable)(table, options);
|
|
27
|
+
}
|
|
28
|
+
async shareFolder(input) {
|
|
29
|
+
return (0, shareFolder_1.shareFolder)(this.requireAuth(), this.storage, input);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.SharedFolderManager = SharedFolderManager;
|
|
33
|
+
//# sourceMappingURL=SharedFolderManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedFolderManager.js","sourceRoot":"","sources":["../../../src/sharedFolders/SharedFolderManager.ts"],"names":[],"mappings":";;;AAEA,oCAAsD;AACtD,2DAI4B;AAM5B,+CAA2C;AAK3C,MAAa,mBAAmB;IAI5B,YAAY,OAAwB,EAAE,YAA0B;QAC5D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IACpC,CAAC;IAEO,WAAW;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;QAChC,IAAI,CAAC,IAAI,EAAE;YACP,MAAM,IAAI,sBAAc,CAAC,oCAAoC,EAAE,mBAAW,CAAC,aAAa,CAAC,CAAA;SAC5F;QACD,OAAO,IAAI,CAAA;IACf,CAAC;IAEM,iBAAiB,CAAC,UAAoC,EAAE;QAC3D,OAAO,IAAA,qCAAiB,EAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IAEM,wBAAwB,CAC3B,IAA2B,EAC3B,UAAuD,EAAE;QAEzD,OAAO,IAAA,4CAAwB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;IAEM,6BAA6B,CAChC,KAAkC,EAClC,UAAoC,EAAE;QAEtC,OAAO,IAAA,iDAA6B,EAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAuB;QAC5C,OAAO,IAAA,yBAAW,EAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC/D,CAAC;CACJ;AAtCD,kDAsCC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { InMemoryStorage } from '../storage/InMemoryStorage';
|
|
2
|
+
export type ListSharedFoldersOptions = {
|
|
3
|
+
pattern?: string | null;
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
includeDetails?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type ListSharedFolderRow = {
|
|
8
|
+
shared_folder_uid: string;
|
|
9
|
+
name: string;
|
|
10
|
+
team_count?: number;
|
|
11
|
+
user_count?: number;
|
|
12
|
+
record_count?: number;
|
|
13
|
+
default_manage_records?: boolean;
|
|
14
|
+
default_manage_users?: boolean;
|
|
15
|
+
default_can_edit?: boolean;
|
|
16
|
+
default_can_share?: boolean;
|
|
17
|
+
};
|
|
18
|
+
export declare function listSharedFolders(storage: InMemoryStorage, options?: ListSharedFoldersOptions): ListSharedFolderRow[];
|
|
19
|
+
export type FormattedSharedFoldersTable = {
|
|
20
|
+
headers: string[];
|
|
21
|
+
rows: string[][];
|
|
22
|
+
};
|
|
23
|
+
export declare function formatSharedFoldersTable(rows: ListSharedFolderRow[], options?: {
|
|
24
|
+
verbose?: boolean;
|
|
25
|
+
columnWidth?: number;
|
|
26
|
+
}): FormattedSharedFoldersTable;
|
|
27
|
+
export declare function renderSharedFoldersAsciiTable(table: FormattedSharedFoldersTable, options?: {
|
|
28
|
+
minColWidth?: number;
|
|
29
|
+
}): string;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderSharedFoldersAsciiTable = exports.formatSharedFoldersTable = exports.listSharedFolders = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const folderHelpers_1 = require("../folders/folderHelpers");
|
|
6
|
+
const DEFAULT_COLUMN_WIDTH = 40;
|
|
7
|
+
const MIN_TRUNCATE_PREFIX = 3;
|
|
8
|
+
function sharedFolderDisplayName(folder) {
|
|
9
|
+
return (folder.name || folder.uid).trim() || folder.uid;
|
|
10
|
+
}
|
|
11
|
+
function findSharedFolders(storage, pattern) {
|
|
12
|
+
const searchWords = tokenize(pattern.toLowerCase());
|
|
13
|
+
const matches = [];
|
|
14
|
+
for (const sharedFolder of storage.getAll(folderHelpers_1.FolderKind.SharedFolder)) {
|
|
15
|
+
const uid = sharedFolder.uid;
|
|
16
|
+
const name = sharedFolderDisplayName(sharedFolder).toLowerCase();
|
|
17
|
+
const entityWords = tokenize(`${uid} ${name}`);
|
|
18
|
+
if (matchEntity(entityWords, searchWords)) {
|
|
19
|
+
matches.push(sharedFolder);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return matches;
|
|
23
|
+
}
|
|
24
|
+
function matchEntity(entityWords, searchWords) {
|
|
25
|
+
if (!searchWords || searchWords.length === 0)
|
|
26
|
+
return true;
|
|
27
|
+
if (!entityWords || entityWords.length === 0)
|
|
28
|
+
return false;
|
|
29
|
+
for (const entityWord of entityWords) {
|
|
30
|
+
for (const searchWord of searchWords) {
|
|
31
|
+
if (searchWord.length <= entityWord.length && entityWord.includes(searchWord)) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
function tokenize(text) {
|
|
39
|
+
return text.split(utils_1.TOKEN_SEPARATOR_PATTERN).filter((token) => token.length > 0);
|
|
40
|
+
}
|
|
41
|
+
function countBySharedFolderUid(items, sharedFolderUid) {
|
|
42
|
+
let count = 0;
|
|
43
|
+
for (const item of items) {
|
|
44
|
+
if (item.sharedFolderUid === sharedFolderUid)
|
|
45
|
+
count += 1;
|
|
46
|
+
}
|
|
47
|
+
return count;
|
|
48
|
+
}
|
|
49
|
+
function countTeamsForFolder(storage, sharedFolderUid) {
|
|
50
|
+
return countBySharedFolderUid(storage.getAll(folderHelpers_1.VaultObjectKind.SharedFolderTeam), sharedFolderUid);
|
|
51
|
+
}
|
|
52
|
+
function countUsersForFolder(storage, sharedFolderUid) {
|
|
53
|
+
return countBySharedFolderUid(storage.getAll(folderHelpers_1.VaultObjectKind.SharedFolderUser), sharedFolderUid);
|
|
54
|
+
}
|
|
55
|
+
function countRecordsForFolder(storage, sharedFolderUid) {
|
|
56
|
+
return countBySharedFolderUid(storage.getAll(folderHelpers_1.VaultObjectKind.SharedFolderRecord), sharedFolderUid);
|
|
57
|
+
}
|
|
58
|
+
function listSharedFolders(storage, options = {}) {
|
|
59
|
+
const { pattern, includeDetails = false } = options;
|
|
60
|
+
const sharedFolders = pattern
|
|
61
|
+
? findSharedFolders(storage, pattern)
|
|
62
|
+
: storage.getAll(folderHelpers_1.FolderKind.SharedFolder);
|
|
63
|
+
return sharedFolders.map((sharedFolder) => {
|
|
64
|
+
const shared_folder_uid = sharedFolder.uid;
|
|
65
|
+
const name = sharedFolderDisplayName(sharedFolder);
|
|
66
|
+
const row = { shared_folder_uid, name };
|
|
67
|
+
if (includeDetails) {
|
|
68
|
+
row.record_count = countRecordsForFolder(storage, shared_folder_uid);
|
|
69
|
+
row.user_count = countUsersForFolder(storage, shared_folder_uid);
|
|
70
|
+
row.team_count = countTeamsForFolder(storage, shared_folder_uid);
|
|
71
|
+
row.default_manage_records = sharedFolder.defaultManageRecords;
|
|
72
|
+
row.default_manage_users = sharedFolder.defaultManageUsers;
|
|
73
|
+
row.default_can_edit = sharedFolder.defaultCanEdit;
|
|
74
|
+
row.default_can_share = sharedFolder.defaultCanShare;
|
|
75
|
+
}
|
|
76
|
+
return row;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
exports.listSharedFolders = listSharedFolders;
|
|
80
|
+
function truncateText(text, maxLength) {
|
|
81
|
+
if (!text)
|
|
82
|
+
return '';
|
|
83
|
+
if (text.length <= maxLength)
|
|
84
|
+
return text;
|
|
85
|
+
if (maxLength <= MIN_TRUNCATE_PREFIX)
|
|
86
|
+
return text.slice(0, maxLength);
|
|
87
|
+
return `${text.slice(0, maxLength - MIN_TRUNCATE_PREFIX)}...`;
|
|
88
|
+
}
|
|
89
|
+
function formatSharedFoldersTable(rows, options = {}) {
|
|
90
|
+
const { verbose = false, columnWidth = DEFAULT_COLUMN_WIDTH } = options;
|
|
91
|
+
const maxWidth = verbose ? null : columnWidth;
|
|
92
|
+
const headers = ['#', 'Shared Folder UID', 'Name'];
|
|
93
|
+
const outRows = rows.map((row, rowIndex) => {
|
|
94
|
+
const uid = maxWidth == null ? row.shared_folder_uid : truncateText(row.shared_folder_uid, maxWidth);
|
|
95
|
+
const name = maxWidth == null ? row.name : truncateText(row.name, maxWidth);
|
|
96
|
+
return [String(rowIndex + 1), uid, name];
|
|
97
|
+
});
|
|
98
|
+
return { headers, rows: outRows };
|
|
99
|
+
}
|
|
100
|
+
exports.formatSharedFoldersTable = formatSharedFoldersTable;
|
|
101
|
+
function renderSharedFoldersAsciiTable(table, options = {}) {
|
|
102
|
+
const { minColWidth = 2 } = options;
|
|
103
|
+
const { headers, rows } = table;
|
|
104
|
+
const columnCount = headers.length;
|
|
105
|
+
const columnWidths = new Array(columnCount).fill(0);
|
|
106
|
+
for (let columnIndex = 0; columnIndex < columnCount; columnIndex += 1) {
|
|
107
|
+
columnWidths[columnIndex] = Math.max(headers[columnIndex].length, minColWidth);
|
|
108
|
+
}
|
|
109
|
+
for (const row of rows) {
|
|
110
|
+
for (let columnIndex = 0; columnIndex < columnCount; columnIndex += 1) {
|
|
111
|
+
const cell = row[columnIndex] || '';
|
|
112
|
+
columnWidths[columnIndex] = Math.max(columnWidths[columnIndex], cell.length, minColWidth);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const padCell = (cell, columnIndex) => cell + ' '.repeat(columnWidths[columnIndex] - cell.length);
|
|
116
|
+
const formatRow = (cells) => cells.map((cell, columnIndex) => padCell(cell, columnIndex)).join(' ');
|
|
117
|
+
const ruleRow = Array.from({ length: columnCount }, (_unused, columnIndex) => '-'.repeat(columnWidths[columnIndex]))
|
|
118
|
+
.map((dashes, columnIndex) => padCell(dashes, columnIndex))
|
|
119
|
+
.join(' ');
|
|
120
|
+
const lines = [formatRow(headers), ruleRow];
|
|
121
|
+
for (const row of rows) {
|
|
122
|
+
lines.push(formatRow(row));
|
|
123
|
+
}
|
|
124
|
+
return lines.join('\n');
|
|
125
|
+
}
|
|
126
|
+
exports.renderSharedFoldersAsciiTable = renderSharedFoldersAsciiTable;
|
|
127
|
+
//# sourceMappingURL=listSharedFolders.js.map
|