@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.
Files changed (173) hide show
  1. package/dist/auth/ConsoleAuthUI.d.ts +10 -0
  2. package/dist/auth/ConsoleAuthUI.js +152 -0
  3. package/dist/auth/ConsoleAuthUI.js.map +1 -0
  4. package/dist/auth/ConsoleLogin.d.ts +8 -0
  5. package/dist/auth/ConsoleLogin.js +266 -0
  6. package/dist/auth/ConsoleLogin.js.map +1 -0
  7. package/dist/auth/SessionManager.d.ts +66 -0
  8. package/dist/auth/SessionManager.js +211 -0
  9. package/dist/auth/SessionManager.js.map +1 -0
  10. package/dist/index.d.ts +17 -0
  11. package/dist/index.js +61 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/records/RecordOperations.d.ts +79 -0
  14. package/dist/records/RecordOperations.js +346 -0
  15. package/dist/records/RecordOperations.js.map +1 -0
  16. package/dist/records/RecordUtils.d.ts +36 -0
  17. package/dist/records/RecordUtils.js +224 -0
  18. package/dist/records/RecordUtils.js.map +1 -0
  19. package/dist/sharing/Sharing.d.ts +27 -0
  20. package/dist/sharing/Sharing.js +125 -0
  21. package/dist/sharing/Sharing.js.map +1 -0
  22. package/dist/src/auth/ConsoleAuthUI.d.ts +10 -0
  23. package/dist/src/auth/ConsoleAuthUI.js +161 -0
  24. package/dist/src/auth/ConsoleAuthUI.js.map +1 -0
  25. package/dist/src/auth/ConsoleLogin.d.ts +8 -0
  26. package/dist/src/auth/ConsoleLogin.js +311 -0
  27. package/dist/src/auth/ConsoleLogin.js.map +1 -0
  28. package/dist/src/auth/SessionManager.d.ts +67 -0
  29. package/dist/src/auth/SessionManager.js +212 -0
  30. package/dist/src/auth/SessionManager.js.map +1 -0
  31. package/dist/src/folders/FolderManager.d.ts +57 -0
  32. package/dist/src/folders/FolderManager.js +108 -0
  33. package/dist/src/folders/FolderManager.js.map +1 -0
  34. package/dist/src/folders/addFolder.d.ts +32 -0
  35. package/dist/src/folders/addFolder.js +207 -0
  36. package/dist/src/folders/addFolder.js.map +1 -0
  37. package/dist/src/folders/changeDirectory.d.ts +19 -0
  38. package/dist/src/folders/changeDirectory.js +171 -0
  39. package/dist/src/folders/changeDirectory.js.map +1 -0
  40. package/dist/src/folders/deleteFolder.d.ts +17 -0
  41. package/dist/src/folders/deleteFolder.js +237 -0
  42. package/dist/src/folders/deleteFolder.js.map +1 -0
  43. package/dist/src/folders/folderHelpers.d.ts +48 -0
  44. package/dist/src/folders/folderHelpers.js +100 -0
  45. package/dist/src/folders/folderHelpers.js.map +1 -0
  46. package/dist/src/folders/folderTree.d.ts +29 -0
  47. package/dist/src/folders/folderTree.js +250 -0
  48. package/dist/src/folders/folderTree.js.map +1 -0
  49. package/dist/src/folders/getFolder.d.ts +56 -0
  50. package/dist/src/folders/getFolder.js +143 -0
  51. package/dist/src/folders/getFolder.js.map +1 -0
  52. package/dist/src/folders/listFolder.d.ts +48 -0
  53. package/dist/src/folders/listFolder.js +276 -0
  54. package/dist/src/folders/listFolder.js.map +1 -0
  55. package/dist/src/folders/updateFolder.d.ts +31 -0
  56. package/dist/src/folders/updateFolder.js +137 -0
  57. package/dist/src/folders/updateFolder.js.map +1 -0
  58. package/dist/src/index.d.ts +49 -0
  59. package/dist/src/index.js +151 -0
  60. package/dist/src/index.js.map +1 -0
  61. package/dist/src/records/RecordOperations.d.ts +80 -0
  62. package/dist/src/records/RecordOperations.js +356 -0
  63. package/dist/src/records/RecordOperations.js.map +1 -0
  64. package/dist/src/records/RecordUtils.d.ts +37 -0
  65. package/dist/src/records/RecordUtils.js +263 -0
  66. package/dist/src/records/RecordUtils.js.map +1 -0
  67. package/dist/src/records/Totp.d.ts +14 -0
  68. package/dist/src/records/Totp.js +111 -0
  69. package/dist/src/records/Totp.js.map +1 -0
  70. package/dist/src/sharedFolders/SharedFolderManager.d.ts +20 -0
  71. package/dist/src/sharedFolders/SharedFolderManager.js +33 -0
  72. package/dist/src/sharedFolders/SharedFolderManager.js.map +1 -0
  73. package/dist/src/sharedFolders/listSharedFolders.d.ts +29 -0
  74. package/dist/src/sharedFolders/listSharedFolders.js +127 -0
  75. package/dist/src/sharedFolders/listSharedFolders.js.map +1 -0
  76. package/dist/src/sharedFolders/shareFolder.d.ts +36 -0
  77. package/dist/src/sharedFolders/shareFolder.js +352 -0
  78. package/dist/src/sharedFolders/shareFolder.js.map +1 -0
  79. package/dist/src/sharing/Sharing.d.ts +50 -0
  80. package/dist/src/sharing/Sharing.js +195 -0
  81. package/dist/src/sharing/Sharing.js.map +1 -0
  82. package/dist/src/storage/InMemoryStorage.d.ts +24 -0
  83. package/dist/src/storage/InMemoryStorage.js +139 -0
  84. package/dist/src/storage/InMemoryStorage.js.map +1 -0
  85. package/dist/src/teams/TeamManager.d.ts +17 -0
  86. package/dist/src/teams/TeamManager.js +38 -0
  87. package/dist/src/teams/TeamManager.js.map +1 -0
  88. package/dist/src/teams/enterpriseData.d.ts +106 -0
  89. package/dist/src/teams/enterpriseData.js +319 -0
  90. package/dist/src/teams/enterpriseData.js.map +1 -0
  91. package/dist/src/teams/listTeams.d.ts +42 -0
  92. package/dist/src/teams/listTeams.js +308 -0
  93. package/dist/src/teams/listTeams.js.map +1 -0
  94. package/dist/src/teams/viewTeam.d.ts +35 -0
  95. package/dist/src/teams/viewTeam.js +177 -0
  96. package/dist/src/teams/viewTeam.js.map +1 -0
  97. package/dist/src/utils/Logger.d.ts +28 -0
  98. package/dist/src/utils/Logger.js +62 -0
  99. package/dist/src/utils/Logger.js.map +1 -0
  100. package/dist/src/utils/constants.d.ts +50 -0
  101. package/dist/src/utils/constants.js +64 -0
  102. package/dist/src/utils/constants.js.map +1 -0
  103. package/dist/src/utils/errors.d.ts +10 -0
  104. package/dist/src/utils/errors.js +117 -0
  105. package/dist/src/utils/errors.js.map +1 -0
  106. package/dist/src/utils/guards.d.ts +7 -0
  107. package/dist/src/utils/guards.js +29 -0
  108. package/dist/src/utils/guards.js.map +1 -0
  109. package/dist/src/utils/index.d.ts +7 -0
  110. package/dist/src/utils/index.js +39 -0
  111. package/dist/src/utils/index.js.map +1 -0
  112. package/dist/src/utils/patterns.d.ts +9 -0
  113. package/dist/src/utils/patterns.js +20 -0
  114. package/dist/src/utils/patterns.js.map +1 -0
  115. package/dist/src/utils/types.d.ts +12 -0
  116. package/dist/src/utils/types.js +3 -0
  117. package/dist/src/utils/types.js.map +1 -0
  118. package/dist/src/vault/KeeperVault.d.ts +116 -0
  119. package/dist/src/vault/KeeperVault.js +443 -0
  120. package/dist/src/vault/KeeperVault.js.map +1 -0
  121. package/dist/storage/InMemoryStorage.d.ts +24 -0
  122. package/dist/storage/InMemoryStorage.js +132 -0
  123. package/dist/storage/InMemoryStorage.js.map +1 -0
  124. package/dist/utils/Logger.d.ts +28 -0
  125. package/dist/utils/Logger.js +62 -0
  126. package/dist/utils/Logger.js.map +1 -0
  127. package/dist/utils/constants.d.ts +26 -0
  128. package/dist/utils/constants.js +37 -0
  129. package/dist/utils/constants.js.map +1 -0
  130. package/dist/utils/errors.d.ts +10 -0
  131. package/dist/utils/errors.js +117 -0
  132. package/dist/utils/errors.js.map +1 -0
  133. package/dist/utils/index.d.ts +4 -0
  134. package/dist/utils/index.js +22 -0
  135. package/dist/utils/index.js.map +1 -0
  136. package/dist/vault/KeeperVault.d.ts +72 -0
  137. package/dist/vault/KeeperVault.js +338 -0
  138. package/dist/vault/KeeperVault.js.map +1 -0
  139. package/package.json +32 -0
  140. package/src/auth/ConsoleAuthUI.ts +169 -0
  141. package/src/auth/ConsoleLogin.ts +351 -0
  142. package/src/auth/SessionManager.ts +293 -0
  143. package/src/folders/FolderManager.ts +174 -0
  144. package/src/folders/addFolder.ts +294 -0
  145. package/src/folders/changeDirectory.ts +217 -0
  146. package/src/folders/deleteFolder.ts +293 -0
  147. package/src/folders/folderHelpers.ts +99 -0
  148. package/src/folders/folderTree.ts +321 -0
  149. package/src/folders/getFolder.ts +234 -0
  150. package/src/folders/listFolder.ts +358 -0
  151. package/src/folders/updateFolder.ts +210 -0
  152. package/src/index.ts +242 -0
  153. package/src/records/RecordOperations.ts +549 -0
  154. package/src/records/RecordUtils.ts +282 -0
  155. package/src/records/Totp.ts +119 -0
  156. package/src/sharedFolders/SharedFolderManager.ts +57 -0
  157. package/src/sharedFolders/listSharedFolders.ts +173 -0
  158. package/src/sharedFolders/shareFolder.ts +457 -0
  159. package/src/sharing/Sharing.ts +282 -0
  160. package/src/storage/InMemoryStorage.ts +163 -0
  161. package/src/teams/TeamManager.ts +61 -0
  162. package/src/teams/enterpriseData.ts +453 -0
  163. package/src/teams/listTeams.ts +373 -0
  164. package/src/teams/viewTeam.ts +248 -0
  165. package/src/utils/Logger.ts +71 -0
  166. package/src/utils/constants.ts +63 -0
  167. package/src/utils/errors.ts +108 -0
  168. package/src/utils/guards.ts +24 -0
  169. package/src/utils/index.ts +22 -0
  170. package/src/utils/patterns.ts +20 -0
  171. package/src/utils/types.ts +11 -0
  172. package/src/vault/KeeperVault.ts +612 -0
  173. package/tsconfig.json +16 -0
@@ -0,0 +1,293 @@
1
+ import type { Auth, DeleteObject, KeeperPreDeleteResponse } from '@keeper-security/keeperapi'
2
+ import { preDeleteCommand, recordDeleteCommand } from '@keeper-security/keeperapi'
3
+ import type { DSharedFolder, DSharedFolderFolder, DUserFolder } from '@keeper-security/keeperapi'
4
+ import { InMemoryStorage } from '../storage/InMemoryStorage'
5
+ import { KeeperSdkError, extractErrorMessage, logger } from '../utils'
6
+ import { listFolder } from './listFolder'
7
+ import type { ListFolderFolderSimple } from './listFolder'
8
+ import { tryResolvePath, findParentFolderUid, type VaultFolderSession } from './changeDirectory'
9
+ import {
10
+ DeleteResolution,
11
+ FolderKind,
12
+ globToRegex,
13
+ sharedFolderFolderName,
14
+ sharedFolderName,
15
+ userFolderName,
16
+ } from './folderHelpers'
17
+ import { findFolder } from './getFolder'
18
+
19
+ export type DeleteFolderResult = {
20
+ success: boolean
21
+ message?: string
22
+ cancelled?: boolean
23
+ }
24
+
25
+ export type RmdirOptions = {
26
+ force?: boolean
27
+ quiet?: boolean
28
+ confirm?: (summary: string) => boolean | Promise<boolean>
29
+ }
30
+
31
+ function folderKindOfUid(storage: InMemoryStorage, uid: string): FolderKind {
32
+ if (storage.getByUid<DUserFolder>(FolderKind.UserFolder, uid)) return FolderKind.UserFolder
33
+ if (storage.getByUid<DSharedFolder>(FolderKind.SharedFolder, uid)) return FolderKind.SharedFolder
34
+ if (storage.getByUid<DSharedFolderFolder>(FolderKind.SharedFolderFolder, uid)) return FolderKind.SharedFolderFolder
35
+ return FolderKind.UserFolder
36
+ }
37
+
38
+ async function listFolderChildrenFolders(
39
+ storage: InMemoryStorage,
40
+ parentUid: string | null
41
+ ): Promise<ListFolderFolderSimple[]> {
42
+ const result = await listFolder(storage, {
43
+ folderUid: parentUid === null ? undefined : parentUid,
44
+ showFolders: true,
45
+ showRecords: false,
46
+ })
47
+ return result.folders
48
+ }
49
+
50
+ function folderDisplayName(storage: InMemoryStorage, uid: string): string {
51
+ const userFolder = storage.getByUid<DUserFolder>(FolderKind.UserFolder, uid)
52
+ if (userFolder) return userFolderName(userFolder)
53
+ const sharedFolder = storage.getByUid<DSharedFolder>(FolderKind.SharedFolder, uid)
54
+ if (sharedFolder) return sharedFolderName(sharedFolder)
55
+ const sharedFolderFolder = storage.getByUid<DSharedFolderFolder>(FolderKind.SharedFolderFolder, uid)
56
+ if (sharedFolderFolder) return sharedFolderFolderName(sharedFolderFolder)
57
+ return uid
58
+ }
59
+
60
+ export async function buildFolderDeleteObject(
61
+ storage: InMemoryStorage,
62
+ folderUid: string
63
+ ): Promise<DeleteObject | null> {
64
+ const userFolder = storage.getByUid<DUserFolder>(FolderKind.UserFolder, folderUid)
65
+ if (userFolder) {
66
+ const parentUid = await findParentFolderUid(storage, folderUid)
67
+ const deleteObject: DeleteObject = {
68
+ delete_resolution: DeleteResolution.Unlink,
69
+ object_uid: folderUid,
70
+ object_type: FolderKind.UserFolder,
71
+ from_type: FolderKind.UserFolder,
72
+ }
73
+ if (parentUid) {
74
+ deleteObject.from_uid = parentUid
75
+ deleteObject.from_type = folderKindOfUid(storage, parentUid)
76
+ } else {
77
+ deleteObject.from_uid = ''
78
+ }
79
+ return deleteObject
80
+ }
81
+ const sharedFolder = storage.getByUid<DSharedFolder>(FolderKind.SharedFolder, folderUid)
82
+ if (sharedFolder) {
83
+ const parentUid = await findParentFolderUid(storage, folderUid)
84
+ const deleteObject: DeleteObject = {
85
+ delete_resolution: DeleteResolution.Unlink,
86
+ object_uid: folderUid,
87
+ object_type: FolderKind.SharedFolder,
88
+ from_type: FolderKind.UserFolder,
89
+ }
90
+ if (parentUid) {
91
+ deleteObject.from_uid = parentUid
92
+ deleteObject.from_type = folderKindOfUid(storage, parentUid)
93
+ } else {
94
+ deleteObject.from_uid = ''
95
+ }
96
+ return deleteObject
97
+ }
98
+ const sharedFolderFolder = storage.getByUid<DSharedFolderFolder>(FolderKind.SharedFolderFolder, folderUid)
99
+ if (sharedFolderFolder) {
100
+ const parentUid = await findParentFolderUid(storage, folderUid)
101
+ const deleteObject: DeleteObject = {
102
+ delete_resolution: DeleteResolution.Unlink,
103
+ object_uid: folderUid,
104
+ object_type: FolderKind.SharedFolderFolder,
105
+ from_type: FolderKind.SharedFolder,
106
+ }
107
+ if (parentUid) {
108
+ deleteObject.from_uid = parentUid
109
+ deleteObject.from_type = folderKindOfUid(storage, parentUid)
110
+ } else {
111
+ deleteObject.from_uid = sharedFolderFolder.sharedFolderUid
112
+ deleteObject.from_type = FolderKind.SharedFolder
113
+ }
114
+ return deleteObject
115
+ }
116
+ return null
117
+ }
118
+
119
+ async function buildDeleteObjectForFolderRef(
120
+ storage: InMemoryStorage,
121
+ ref: string
122
+ ): Promise<DeleteObject | null> {
123
+ const trimmed = ref.trim()
124
+ if (!trimmed) return null
125
+
126
+ const direct = await buildFolderDeleteObject(storage, trimmed)
127
+ if (direct) return direct
128
+
129
+ const found = findFolder(storage, trimmed)
130
+ if (!found) return null
131
+ return buildFolderDeleteObject(storage, found.folder.uid)
132
+ }
133
+
134
+ export async function deleteFolder(
135
+ auth: Auth,
136
+ storage: InMemoryStorage,
137
+ folderRefs: string[],
138
+ confirm?: (summary: string) => boolean | Promise<boolean>
139
+ ): Promise<DeleteFolderResult> {
140
+ const objects: DeleteObject[] = []
141
+ for (const ref of folderRefs) {
142
+ const deleteObject = await buildDeleteObjectForFolderRef(storage, ref)
143
+ if (deleteObject) objects.push(deleteObject)
144
+ }
145
+ if (objects.length === 0) {
146
+ throw new KeeperSdkError(
147
+ 'No folders found to delete (not a folder UID or name).',
148
+ 'delete_nothing'
149
+ )
150
+ }
151
+
152
+ const targetUids = objects.map((deleteObject) => deleteObject.object_uid).join(', ')
153
+
154
+ let preResp: KeeperPreDeleteResponse
155
+ try {
156
+ preResp = await auth.executeRestCommand(preDeleteCommand({ objects }))
157
+ } catch (err) {
158
+ return {
159
+ success: false,
160
+ message: `pre_delete failed for [${targetUids}]: ${extractErrorMessage(err)}`,
161
+ }
162
+ }
163
+
164
+ const inner = preResp.pre_delete_response
165
+ const token = inner?.pre_delete_token
166
+ if (!token) {
167
+ const reason =
168
+ preResp.message ||
169
+ preResp.result_code ||
170
+ `pre_delete failed for [${targetUids}]: server did not return a pre_delete_token`
171
+ return {
172
+ success: false,
173
+ message: reason,
174
+ }
175
+ }
176
+
177
+ if (confirm) {
178
+ const wouldDelete = inner?.would_delete
179
+ const summaryItems = wouldDelete?.deletion_summary
180
+ if (Array.isArray(summaryItems) && summaryItems.length > 0) {
181
+ const summary = summaryItems.join('\n')
182
+ const confirmed = await confirm(summary)
183
+ if (!confirmed) {
184
+ return { success: false, cancelled: true, message: 'Cancelled.' }
185
+ }
186
+ }
187
+ }
188
+
189
+ try {
190
+ await auth.executeRestCommand(recordDeleteCommand({ pre_delete_token: token }))
191
+ } catch (err) {
192
+ return {
193
+ success: false,
194
+ message: `record_delete failed for [${targetUids}]: ${extractErrorMessage(err)}`,
195
+ }
196
+ }
197
+
198
+ return { success: true }
199
+ }
200
+
201
+ export async function resolveRmdirPatternsToFolderUids(
202
+ storage: InMemoryStorage,
203
+ session: VaultFolderSession,
204
+ pattern: string
205
+ ): Promise<Set<string>> {
206
+ const matchedUids = new Set<string>()
207
+ const trimmedPattern = pattern.trim()
208
+ if (!trimmedPattern) return matchedUids
209
+
210
+ const { folderUid: baseUid, remaining } = await tryResolvePath(storage, session, trimmedPattern)
211
+ const remainingPattern = remaining.trim()
212
+
213
+ if (!remainingPattern) {
214
+ if (baseUid !== null) {
215
+ matchedUids.add(baseUid)
216
+ }
217
+ return matchedUids
218
+ }
219
+
220
+ const children = await listFolderChildrenFolders(storage, baseUid)
221
+ const exactChild = children.find((child) => child.uid === remainingPattern)
222
+ if (exactChild) {
223
+ matchedUids.add(exactChild.uid)
224
+ return matchedUids
225
+ }
226
+
227
+ const matcher = globToRegex(remainingPattern)
228
+ for (const child of children) {
229
+ if (matcher.test(child.name.trim())) {
230
+ matchedUids.add(child.uid)
231
+ }
232
+ }
233
+ return matchedUids
234
+ }
235
+
236
+ async function dedupeNestedFolderDeletes(storage: InMemoryStorage, folderUids: Set<string>): Promise<void> {
237
+ for (const folderUid of [...folderUids]) {
238
+ let current = folderUid
239
+ while (true) {
240
+ const parentUid = await findParentFolderUid(storage, current)
241
+ if (!parentUid) break
242
+ if (folderUids.has(parentUid)) {
243
+ folderUids.delete(folderUid)
244
+ break
245
+ }
246
+ current = parentUid
247
+ }
248
+ }
249
+ }
250
+
251
+ export async function rmdir(
252
+ auth: Auth,
253
+ storage: InMemoryStorage,
254
+ session: VaultFolderSession,
255
+ patterns: string[],
256
+ options: RmdirOptions = {}
257
+ ): Promise<DeleteFolderResult> {
258
+ const { force = false, quiet = false, confirm } = options
259
+ if (!force && !confirm) {
260
+ throw new KeeperSdkError(
261
+ 'Confirmation is required: pass `confirm` or set `force: true`.',
262
+ 'rmdir_confirm_required'
263
+ )
264
+ }
265
+ const folderUids = new Set<string>()
266
+
267
+ for (const pattern of patterns) {
268
+ const trimmedPattern = pattern.trim()
269
+ if (!trimmedPattern) continue
270
+ const resolved = await resolveRmdirPatternsToFolderUids(storage, session, trimmedPattern)
271
+ for (const matchedUid of resolved) {
272
+ folderUids.add(matchedUid)
273
+ }
274
+ }
275
+
276
+ if (folderUids.size === 0) {
277
+ throw new KeeperSdkError('Enter name of an existing folder.', 'rmdir_no_match')
278
+ }
279
+
280
+ await dedupeNestedFolderDeletes(storage, folderUids)
281
+
282
+ const sortedNames = [...folderUids]
283
+ .map((uid) => folderDisplayName(storage, uid))
284
+ .sort((nameA, nameB) => nameA.localeCompare(nameB, undefined, { sensitivity: 'base' }))
285
+
286
+ if (!quiet || !force) {
287
+ logger.info(`\nThe following folder(s) will be removed:\n${sortedNames.join(', ')}\n`)
288
+ }
289
+
290
+ const confirmFn = force ? undefined : confirm
291
+
292
+ return deleteFolder(auth, storage, [...folderUids], confirmFn)
293
+ }
@@ -0,0 +1,99 @@
1
+ import type { DSharedFolder, DSharedFolderFolder, DUserFolder } from '@keeper-security/keeperapi'
2
+ import type { InMemoryStorage } from '../storage/InMemoryStorage'
3
+ import { escapeRegExp } from '../utils'
4
+
5
+ export enum FolderKind {
6
+ UserFolder = 'user_folder',
7
+ SharedFolder = 'shared_folder',
8
+ SharedFolderFolder = 'shared_folder_folder',
9
+ }
10
+
11
+ export enum ParentFolderKind {
12
+ VirtualRoot = 'virtual_root',
13
+ UserFolder = 'user_folder',
14
+ SharedFolder = 'shared_folder',
15
+ SharedFolderFolder = 'shared_folder_folder',
16
+ }
17
+
18
+ export enum FolderObjectType {
19
+ Folder = 'folder',
20
+ SharedFolder = 'shared_folder',
21
+ }
22
+
23
+ export enum DeleteResolution {
24
+ Unlink = 'unlink',
25
+ }
26
+
27
+ export enum DeleteObjectType {
28
+ Record = 'record',
29
+ UserFolder = 'user_folder',
30
+ SharedFolder = 'shared_folder',
31
+ SharedFolderFolder = 'shared_folder_folder',
32
+ }
33
+
34
+ export enum FolderResultStatus {
35
+ Success = 'success',
36
+ Invited = 'invited',
37
+ Unknown = 'unknown',
38
+ }
39
+
40
+ export enum VaultObjectKind {
41
+ Record = 'record',
42
+ Metadata = 'metadata',
43
+ NonSharedData = 'non_shared_data',
44
+ Team = 'team',
45
+ User = 'user',
46
+ SharedFolderUser = 'shared_folder_user',
47
+ SharedFolderTeam = 'shared_folder_team',
48
+ SharedFolderRecord = 'shared_folder_record',
49
+ }
50
+
51
+ export type FolderKindOrLiteral = FolderKind | `${FolderKind}`
52
+
53
+ export function folderKindFromString(value: string | undefined | null): FolderKind | undefined {
54
+ if (!value) return undefined
55
+ switch (value) {
56
+ case FolderKind.UserFolder:
57
+ return FolderKind.UserFolder
58
+ case FolderKind.SharedFolder:
59
+ return FolderKind.SharedFolder
60
+ case FolderKind.SharedFolderFolder:
61
+ return FolderKind.SharedFolderFolder
62
+ default:
63
+ return undefined
64
+ }
65
+ }
66
+
67
+ export function userFolderName(folder: DUserFolder): string {
68
+ const data = folder.data as { title?: string; name?: string } | undefined
69
+ return (data?.title || data?.name || folder.uid).trim() || folder.uid
70
+ }
71
+
72
+ export function sharedFolderFolderName(folder: DSharedFolderFolder): string {
73
+ const data = folder.data as { title?: string; name?: string } | undefined
74
+ return (data?.title || data?.name || folder.uid).trim() || folder.uid
75
+ }
76
+
77
+ export function sharedFolderName(folder: DSharedFolder): string {
78
+ return (folder.name || folder.uid).trim() || folder.uid
79
+ }
80
+
81
+ export function globToRegex(pattern: string): RegExp {
82
+ const escapedPattern = escapeRegExp(pattern)
83
+ const regexBody = escapedPattern.replace(/\*/g, '.*').replace(/\?/g, '.')
84
+ return new RegExp(`^${regexBody}$`, 'i')
85
+ }
86
+
87
+ export async function getUserFolderParentMap(storage: InMemoryStorage): Promise<Map<string, string>> {
88
+ const userFolders = storage.getAll<DUserFolder>(FolderKind.UserFolder)
89
+ const childToParent = new Map<string, string>()
90
+ for (const userFolder of userFolders) {
91
+ const dependencies = (await storage.getDependencies(userFolder.uid)) || []
92
+ for (const dependency of dependencies) {
93
+ if (dependency.kind === FolderKind.UserFolder) {
94
+ childToParent.set(dependency.uid, userFolder.uid)
95
+ }
96
+ }
97
+ }
98
+ return childToParent
99
+ }