@ocfl/ocfl 0.4.0 → 1.0.0-beta.1

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 (138) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +24 -9
  3. package/dist/constants.d.ts +15 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +14 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/digest.d.ts +58 -0
  8. package/dist/digest.d.ts.map +1 -0
  9. package/dist/digest.js +204 -0
  10. package/dist/digest.js.map +1 -0
  11. package/dist/error.d.ts +5 -0
  12. package/dist/error.d.ts.map +1 -0
  13. package/dist/error.js +9 -0
  14. package/dist/error.js.map +1 -0
  15. package/dist/extension.d.ts +83 -0
  16. package/dist/extension.d.ts.map +1 -0
  17. package/dist/extension.js +170 -0
  18. package/dist/extension.js.map +1 -0
  19. package/dist/extensions/0002-flat-direct-storage-layout.d.ts +12 -0
  20. package/dist/extensions/0002-flat-direct-storage-layout.d.ts.map +1 -0
  21. package/dist/extensions/0002-flat-direct-storage-layout.js +34 -0
  22. package/dist/extensions/0002-flat-direct-storage-layout.js.map +1 -0
  23. package/dist/extensions/0003-hash-and-id-n-tuple-storage-layout.d.ts +15 -0
  24. package/dist/extensions/0003-hash-and-id-n-tuple-storage-layout.d.ts.map +1 -0
  25. package/dist/extensions/0003-hash-and-id-n-tuple-storage-layout.js +49 -0
  26. package/dist/extensions/0003-hash-and-id-n-tuple-storage-layout.js.map +1 -0
  27. package/dist/extensions/0004-hashed-n-tuple-storage-layout.d.ts +17 -0
  28. package/dist/extensions/0004-hashed-n-tuple-storage-layout.d.ts.map +1 -0
  29. package/dist/extensions/0004-hashed-n-tuple-storage-layout.js +54 -0
  30. package/dist/extensions/0004-hashed-n-tuple-storage-layout.js.map +1 -0
  31. package/dist/extensions/0006-flat-omit-prefix-storage-layout.d.ts +6 -0
  32. package/dist/extensions/0006-flat-omit-prefix-storage-layout.d.ts.map +1 -0
  33. package/dist/extensions/0006-flat-omit-prefix-storage-layout.js +8 -0
  34. package/dist/extensions/0006-flat-omit-prefix-storage-layout.js.map +1 -0
  35. package/dist/extensions/0007-n-tuple-omit-prefix-storage-layout.d.ts +6 -0
  36. package/dist/extensions/0007-n-tuple-omit-prefix-storage-layout.d.ts.map +1 -0
  37. package/dist/extensions/0007-n-tuple-omit-prefix-storage-layout.js +8 -0
  38. package/dist/extensions/0007-n-tuple-omit-prefix-storage-layout.js.map +1 -0
  39. package/dist/extensions/0009-digest-algorithms.d.ts +9 -0
  40. package/dist/extensions/0009-digest-algorithms.d.ts.map +1 -0
  41. package/dist/extensions/0009-digest-algorithms.js +11 -0
  42. package/dist/extensions/0009-digest-algorithms.js.map +1 -0
  43. package/dist/extensions/000N-path-direct-storage-layout.d.ts +16 -0
  44. package/dist/extensions/000N-path-direct-storage-layout.d.ts.map +1 -0
  45. package/dist/extensions/000N-path-direct-storage-layout.js +46 -0
  46. package/dist/extensions/000N-path-direct-storage-layout.js.map +1 -0
  47. package/dist/extensions/index.d.ts +23 -0
  48. package/dist/extensions/index.d.ts.map +1 -0
  49. package/dist/extensions/index.js +8 -0
  50. package/dist/extensions/index.js.map +1 -0
  51. package/dist/file.d.ts +87 -0
  52. package/dist/file.d.ts.map +1 -0
  53. package/dist/file.js +118 -0
  54. package/dist/file.js.map +1 -0
  55. package/dist/index.d.ts +61 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +73 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/inventory.d.ts +155 -0
  60. package/dist/inventory.d.ts.map +1 -0
  61. package/dist/inventory.js +591 -0
  62. package/dist/inventory.js.map +1 -0
  63. package/dist/object.d.ts +188 -0
  64. package/dist/object.d.ts.map +1 -0
  65. package/dist/object.js +425 -0
  66. package/dist/object.js.map +1 -0
  67. package/dist/storage.d.ts +94 -0
  68. package/dist/storage.d.ts.map +1 -0
  69. package/dist/storage.js +302 -0
  70. package/dist/storage.js.map +1 -0
  71. package/dist/store.d.ts +100 -0
  72. package/dist/store.d.ts.map +1 -0
  73. package/dist/store.js +157 -0
  74. package/dist/store.js.map +1 -0
  75. package/dist/transaction.d.ts +155 -0
  76. package/dist/transaction.d.ts.map +1 -0
  77. package/dist/transaction.js +395 -0
  78. package/dist/transaction.js.map +1 -0
  79. package/dist/types.d.ts +107 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/utils.d.ts +24 -0
  84. package/dist/utils.d.ts.map +1 -0
  85. package/dist/utils.js +85 -0
  86. package/dist/utils.js.map +1 -0
  87. package/dist/validation.d.ts +32 -0
  88. package/dist/validation.d.ts.map +1 -0
  89. package/dist/validation.js +31 -0
  90. package/dist/validation.js.map +1 -0
  91. package/package.json +31 -51
  92. package/src/constants.ts +16 -0
  93. package/src/digest.ts +258 -0
  94. package/src/error.ts +9 -0
  95. package/src/extension.ts +206 -0
  96. package/{lib/extensions/0002-flat-direct-storage-layout.js → src/extensions/0002-flat-direct-storage-layout.ts} +15 -22
  97. package/src/extensions/0003-hash-and-id-n-tuple-storage-layout.ts +56 -0
  98. package/src/extensions/0004-hashed-n-tuple-storage-layout.ts +59 -0
  99. package/src/extensions/0006-flat-omit-prefix-storage-layout.ts +9 -0
  100. package/src/extensions/0007-n-tuple-omit-prefix-storage-layout.ts +9 -0
  101. package/src/extensions/0009-digest-algorithms.ts +12 -0
  102. package/src/extensions/000N-path-direct-storage-layout.ts +51 -0
  103. package/src/extensions/index.ts +24 -0
  104. package/src/file.ts +161 -0
  105. package/src/index.ts +92 -0
  106. package/src/inventory.ts +634 -0
  107. package/src/object.ts +473 -0
  108. package/src/storage.ts +342 -0
  109. package/src/store.ts +199 -0
  110. package/src/transaction.ts +456 -0
  111. package/{lib/types.d.ts → src/types.ts} +28 -74
  112. package/src/utils.ts +94 -0
  113. package/src/validation.ts +46 -0
  114. package/index.js +0 -129
  115. package/index.mjs +0 -18
  116. package/lib/constants.js +0 -24
  117. package/lib/digest.js +0 -307
  118. package/lib/enum.js +0 -90
  119. package/lib/error.js +0 -19
  120. package/lib/extension.js +0 -194
  121. package/lib/extensions/0003-hash-and-id-n-tuple-storage-layout.js +0 -60
  122. package/lib/extensions/0004-hashed-n-tuple-storage-layout.js +0 -63
  123. package/lib/extensions/0005-mutable-head.js +0 -0
  124. package/lib/extensions/0006-flat-omit-prefix-storage-layout.js +0 -7
  125. package/lib/extensions/0007-n-tuple-omit-prefix-storage-layout.js +0 -7
  126. package/lib/extensions/0008-schema-registry.js +0 -0
  127. package/lib/extensions/0009-digest-algorithms.js +0 -18
  128. package/lib/extensions/000N-path-direct-storage-layout.js +0 -61
  129. package/lib/extensions/index.js +0 -13
  130. package/lib/file.js +0 -147
  131. package/lib/index.js +0 -13
  132. package/lib/inventory.js +0 -564
  133. package/lib/object.js +0 -499
  134. package/lib/storage.js +0 -338
  135. package/lib/store.js +0 -191
  136. package/lib/transaction.js +0 -448
  137. package/lib/utils.js +0 -122
  138. package/lib/validation.js +0 -174
@@ -0,0 +1,591 @@
1
+ import { createError } from './validation.js';
2
+ class VersionNumber {
3
+ value;
4
+ zeroPaddingLength;
5
+ constructor(num, zeroPaddingLength) {
6
+ this.value = num;
7
+ this.zeroPaddingLength = zeroPaddingLength;
8
+ }
9
+ valueOf() {
10
+ return this.value;
11
+ }
12
+ toString() {
13
+ return `v${this.zeroPaddingLength ? `${this.value}`.padStart(this.zeroPaddingLength, '0') : this.value}`;
14
+ }
15
+ next() {
16
+ return new VersionNumber(this.value + 1, this.zeroPaddingLength);
17
+ }
18
+ previous() {
19
+ const n = this.value - 1;
20
+ if (n > 0) {
21
+ return new VersionNumber(n, this.zeroPaddingLength);
22
+ }
23
+ }
24
+ static fromInt(num, zeroPaddingLength) {
25
+ return new VersionNumber(num, zeroPaddingLength);
26
+ }
27
+ static fromString(versionLabel) {
28
+ const label = versionLabel.replace('v', '');
29
+ let zeroPaddingLength;
30
+ if (label.startsWith('0')) {
31
+ zeroPaddingLength = label.length;
32
+ }
33
+ return new VersionNumber(parseInt(label, 10), zeroPaddingLength);
34
+ }
35
+ static next(versionLabel) {
36
+ return VersionNumber.fromString(versionLabel).next();
37
+ }
38
+ static previous(versionLabel) {
39
+ return VersionNumber.fromString(versionLabel).previous();
40
+ }
41
+ }
42
+ function findKey(file, obj) {
43
+ for (const digest in obj) {
44
+ if (obj[digest]?.includes(file)) {
45
+ return digest;
46
+ }
47
+ }
48
+ }
49
+ function isNonEmpty(arr) {
50
+ return arr !== undefined && arr.length > 0;
51
+ }
52
+ function headNotInVersionsError(id, head) {
53
+ return createError('E040', id, `head "${head}" is not in versions`);
54
+ }
55
+ /**
56
+ * Wrapper class for inventory data
57
+ */
58
+ class OcflObjectInventory {
59
+ #data;
60
+ #fileIndex = {};
61
+ metadata;
62
+ /**
63
+ * Helper function to find the digest by logical file path and cached it by indexing
64
+ */
65
+ _indexGet(logicalPath, version, onlyUsecache) {
66
+ let digests = this.#fileIndex[version]?.[logicalPath];
67
+ if (!digests && !onlyUsecache) {
68
+ // search and then index
69
+ const fixity = this.fixity;
70
+ const algo = this.digestAlgorithm;
71
+ const digestArr = [];
72
+ const mainDigest = findKey(logicalPath, this.versionState(version) ?? {});
73
+ if (mainDigest) {
74
+ digestArr.push([algo, mainDigest]);
75
+ const cp = this.getContentPath(mainDigest);
76
+ if (fixity && cp) {
77
+ for (const [fixityDigest, digestBlock] of Object.entries(fixity)) {
78
+ const digest = findKey(cp, digestBlock);
79
+ if (digest) {
80
+ digestArr.push([fixityDigest, digest]);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ if (digestArr.length > 0) {
86
+ this.#fileIndex[version] ??= {};
87
+ digests = Object.fromEntries(digestArr);
88
+ this.#fileIndex[version][logicalPath] = digests;
89
+ }
90
+ }
91
+ return digests;
92
+ }
93
+ _indexAdd(logicalPath, version, digests) {
94
+ this.#fileIndex[version] ??= {};
95
+ this.#fileIndex[version][logicalPath] = digests;
96
+ }
97
+ _indexRemove(logicalPath, version = this.head) {
98
+ const index = this.#fileIndex[version];
99
+ const val = index?.[logicalPath];
100
+ delete index?.[logicalPath];
101
+ return val;
102
+ }
103
+ _indexBuild() {
104
+ // index fixity contentPaths
105
+ const fixity = this.fixity;
106
+ const fixityIndex = {};
107
+ if (fixity) {
108
+ for (const [fixityAlgo, digestBlock] of Object.entries(fixity)) {
109
+ const fixityIndexDigest = {};
110
+ fixityIndex[fixityAlgo] = fixityIndexDigest;
111
+ for (const [digest, cps] of Object.entries(digestBlock)) {
112
+ for (const cp of cps) {
113
+ fixityIndexDigest[cp] = digest;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ // index logicalPaths
119
+ // { v1: { 'dir/file.txt': { sha512: 'abcdef' } } }
120
+ const index = {};
121
+ this.#fileIndex = index;
122
+ const algo = this.digestAlgorithm;
123
+ const fixityEntries = Object.entries(fixityIndex);
124
+ for (const [verName, ver] of Object.entries(this.versions)) {
125
+ const indexVer = {};
126
+ index[verName] = indexVer;
127
+ for (const [digest, lps] of Object.entries(ver.state)) {
128
+ const cps = this.#requireContentPaths(digest);
129
+ for (const lp of lps) {
130
+ const file = { [algo]: digest };
131
+ indexVer[lp] = file;
132
+ for (const [fixityAlgo, fixityIndexDigest] of fixityEntries) {
133
+ for (const cp of cps) {
134
+ const fixityDigest = fixityIndexDigest[cp];
135
+ if (fixityDigest) {
136
+ file[fixityAlgo] = fixityDigest;
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ _indexFindPaths(prefix, version = this.head) {
145
+ const res = [];
146
+ const index = this.#fileIndex[version];
147
+ const prefixWithSlash = prefix.endsWith('/') ? prefix : `${prefix}/`;
148
+ for (const lp in index) {
149
+ if (index[lp] && (lp === prefix || lp.startsWith(prefixWithSlash))) {
150
+ res.push(lp);
151
+ }
152
+ }
153
+ return res;
154
+ }
155
+ /**
156
+ * Create a new mutable OcflObjectInventory from the object config or clone an existing inventory,
157
+ * and increase the inventory version number. If data.head is undefined, starts from v1.
158
+ */
159
+ static newVersion(data, cleanState) {
160
+ if (data instanceof OcflObjectInventory) {
161
+ data = data.toJSON();
162
+ }
163
+ if (!data.id || !data.digestAlgorithm || !data.type) {
164
+ throw new Error('Inventory must have an id, digestAlgorithm and type.');
165
+ }
166
+ data.manifest = data.manifest || {};
167
+ data.versions = data.versions || {};
168
+ let state = {};
169
+ if (data.head) {
170
+ if (!cleanState) {
171
+ const prev = data.versions[data.head];
172
+ if (!prev) {
173
+ throw headNotInVersionsError(data.id, data.head);
174
+ }
175
+ state = JSON.parse(JSON.stringify(prev.state));
176
+ }
177
+ data.head = VersionNumber.next(data.head).toString();
178
+ }
179
+ else {
180
+ data.head = 'v1';
181
+ }
182
+ data.versions[data.head] = {
183
+ created: new Date().toISOString(),
184
+ state,
185
+ };
186
+ return new OcflObjectInventoryMut(data);
187
+ }
188
+ /**
189
+ * Create a new inventory model
190
+ * @param data - Initial data of the inventory
191
+ * @param version - Set the version, default to data.head
192
+ */
193
+ constructor(data, _version) {
194
+ // an empty head is an inventory with no versions yet
195
+ if (data.head !== '' && !data.versions?.[data.head]) {
196
+ throw headNotInVersionsError(data.id, data.head);
197
+ }
198
+ this.#data = data;
199
+ this._indexBuild();
200
+ }
201
+ get id() {
202
+ return this.#data.id;
203
+ }
204
+ get type() {
205
+ return this.#data.type;
206
+ }
207
+ get digestAlgorithm() {
208
+ return this.#data.digestAlgorithm;
209
+ }
210
+ get head() {
211
+ return this.#data.head;
212
+ }
213
+ /** The version number of the current head */
214
+ get versionNumber() {
215
+ return VersionNumber.fromString(this.head);
216
+ }
217
+ get contentDirectory() {
218
+ return this.#data.contentDirectory || 'content';
219
+ }
220
+ get manifest() {
221
+ return this.#data.manifest;
222
+ }
223
+ get versions() {
224
+ return this.#data.versions;
225
+ }
226
+ /** The current head version. Throws if the head is not in versions. */
227
+ get version() {
228
+ const version = this.versions[this.head];
229
+ if (!version) {
230
+ throw headNotInVersionsError(this.id, this.head);
231
+ }
232
+ return version;
233
+ }
234
+ get fixity() {
235
+ return this.#data.fixity;
236
+ }
237
+ set fixity(val) {
238
+ this.#data.fixity = val;
239
+ }
240
+ /** The state of the current version */
241
+ get state() {
242
+ return this.version.state;
243
+ }
244
+ get created() {
245
+ return this.version.created;
246
+ }
247
+ get message() {
248
+ return this.version.message;
249
+ }
250
+ get user() {
251
+ return this.version.user;
252
+ }
253
+ //get nextVersion() { return this.versionNumber.next().toString(); }
254
+ //get prevVersion() { return this.versionNumber.previous()?.toString(); }
255
+ /** Return true if there has been actual change to the state of current version compared to the previous version */
256
+ get isChanged() {
257
+ const prev = this.versionNumber.previous()?.toString();
258
+ if (!prev) {
259
+ return true;
260
+ }
261
+ const diff = this.diffState(this.head, prev);
262
+ return Object.keys(diff[0]).length > 0 || Object.keys(diff[1]).length > 0;
263
+ }
264
+ set created(val) {
265
+ this.version.created = val;
266
+ }
267
+ set message(val) {
268
+ this.version.message = val;
269
+ }
270
+ set user(val) {
271
+ this.version.user = val;
272
+ }
273
+ /**
274
+ * Return the state of the specified version
275
+ * @param version - The inventory version, default to the latest
276
+ */
277
+ versionState(version) {
278
+ if (!version || version === 'latest') {
279
+ version = this.head;
280
+ }
281
+ return this.versions[version]?.state;
282
+ }
283
+ toString() {
284
+ return JSON.stringify(this.#data, null, 2);
285
+ }
286
+ toJSON() {
287
+ return JSON.parse(this.toString());
288
+ }
289
+ /**
290
+ * @param version - The version name
291
+ */
292
+ *files(version) {
293
+ let state;
294
+ if (!version || version === 'latest') {
295
+ state = this.state;
296
+ version = this.head;
297
+ }
298
+ else {
299
+ state = this.versions[version]?.state;
300
+ }
301
+ for (const [digest, files] of Object.entries(state ?? {})) {
302
+ const [contentPath] = this.#requireContentPaths(digest);
303
+ for (const logicalPath of files) {
304
+ yield {
305
+ logicalPath,
306
+ version,
307
+ digest,
308
+ contentPath,
309
+ fixity: this.getFixity(logicalPath, version),
310
+ ...this.metadata?.[contentPath],
311
+ };
312
+ }
313
+ }
314
+ }
315
+ *find(fn, version) {
316
+ for (const f of this.files(version)) {
317
+ if (fn(f)) {
318
+ yield f;
319
+ }
320
+ }
321
+ }
322
+ clone() {
323
+ return new OcflObjectInventory(this.toJSON());
324
+ }
325
+ /**
326
+ * Get the first content path found with the given digest from the manifest.
327
+ * Also can be used to check the existance of an entry with the specified digest in the manifest.
328
+ * @returns The first content path found in the array
329
+ */
330
+ getContentPath(digest) {
331
+ const cp = this.manifest[digest];
332
+ if (cp && cp.length > 0) {
333
+ return cp[0];
334
+ }
335
+ }
336
+ #requireContentPaths(digest) {
337
+ const cps = this.manifest[digest];
338
+ if (!isNonEmpty(cps)) {
339
+ throw createError('E050', this.id, `digest "${digest}" is not in the manifest`);
340
+ }
341
+ return cps;
342
+ }
343
+ /**
344
+ * Get the digest of a content represented by the logicalPath of the specified version
345
+ */
346
+ getDigest(logicalPath, versionName = this.head) {
347
+ return this._indexGet(logicalPath, versionName, true)?.[this.digestAlgorithm];
348
+ }
349
+ /**
350
+ * Get the file information by the logicalPath of the specified version
351
+ */
352
+ getFile(logicalPath, versionName = this.head) {
353
+ const digest = this.getDigest(logicalPath, versionName);
354
+ const version = versionName;
355
+ if (digest) {
356
+ const [contentPath] = this.#requireContentPaths(digest);
357
+ return {
358
+ logicalPath,
359
+ version,
360
+ digest,
361
+ contentPath,
362
+ fixity: this.getFixity(logicalPath, version),
363
+ ...this.metadata?.[contentPath],
364
+ };
365
+ }
366
+ }
367
+ getFileByDigest(digest, versionName) {
368
+ if (versionName) {
369
+ const logicalPath = this.versions[versionName]?.state[digest]?.[0];
370
+ return logicalPath ? this.getFile(logicalPath, versionName) : undefined;
371
+ }
372
+ for (const [version, { state }] of Object.entries(this.versions)) {
373
+ const logicalPath = state[digest]?.[0];
374
+ if (logicalPath) {
375
+ return this.getFile(logicalPath, version);
376
+ }
377
+ }
378
+ }
379
+ getFileByContentPath(contentPath, versionName) {
380
+ for (const digest in this.manifest) {
381
+ if (this.manifest[digest]?.includes(contentPath)) {
382
+ return this.getFileByDigest(digest, versionName);
383
+ }
384
+ }
385
+ }
386
+ /**
387
+ * Get the fixity of a content represented by the logicalPath of the specified version
388
+ */
389
+ getFixity(logicalPath, versionName = this.head) {
390
+ const { [this.digestAlgorithm]: digest, ...fixity } = this._indexGet(logicalPath, versionName, true) || {};
391
+ return fixity;
392
+ }
393
+ /**
394
+ * Compare the differences between the state of two versions
395
+ * @returns A tuple of [A, B] where A contains files
396
+ * that are in `version0` but not in `version1` and B contains files
397
+ * that are in `version1` but not in `version0`
398
+ */
399
+ diffState(version0, version1) {
400
+ const state1 = this.versionState(version0) ?? {};
401
+ const state2 = this.versionState(version1) ?? {};
402
+ const diff = (s1, s2) => {
403
+ const r = {};
404
+ for (const [d, d1] of Object.entries(s1)) {
405
+ const d2 = s2[d];
406
+ const files = d2?.length ? d1.filter((f) => !d2.includes(f)) : d1.slice();
407
+ if (files.length > 0) {
408
+ r[d] = files;
409
+ }
410
+ }
411
+ return r;
412
+ };
413
+ return [diff(state1, state2), diff(state2, state1)];
414
+ }
415
+ }
416
+ /**
417
+ * Wrapper class with mutable methods for inventory data
418
+ */
419
+ class OcflObjectInventoryMut extends OcflObjectInventory {
420
+ /** The digest of a logical path and the state entry listing it */
421
+ #stateEntry(logicalPath, version = this.head) {
422
+ const digest = this.getDigest(logicalPath, version);
423
+ const files = digest ? this.versionState(version)?.[digest] : undefined;
424
+ return digest && files ? { digest, files } : undefined;
425
+ }
426
+ /**
427
+ * Add a new file to the inventory or update the digest of an existing file
428
+ * @returns true if the state is changed
429
+ */
430
+ add(logicalPath, digest, fixity) {
431
+ const state = this.state;
432
+ const contentPath = `${this.head}/${this.contentDirectory}/${logicalPath}`;
433
+ // add fixity info
434
+ if (fixity) {
435
+ for (const [digestName, digestValue] of Object.entries(fixity)) {
436
+ this.addFixity(contentPath, digestName, digestValue);
437
+ }
438
+ }
439
+ const files = state[digest];
440
+ if (files) {
441
+ // this is a file with identical content but different name
442
+ if (files.indexOf(logicalPath) < 0) {
443
+ files.push(logicalPath);
444
+ }
445
+ else {
446
+ return false; // else, same digest and path, ignore
447
+ }
448
+ }
449
+ else {
450
+ const mf = this.manifest[digest];
451
+ if (mf && mf.length > 0) {
452
+ // this is a reinstatement
453
+ }
454
+ else {
455
+ // normal addition of a new file
456
+ this.manifest[digest] = [contentPath];
457
+ }
458
+ if (this.getDigest(logicalPath)) {
459
+ // this is an update, remove old digest
460
+ this.delete(logicalPath);
461
+ }
462
+ state[digest] = [logicalPath];
463
+ }
464
+ this._indexAdd(logicalPath, this.head, { [this.digestAlgorithm]: digest, ...fixity });
465
+ return true;
466
+ }
467
+ /**
468
+ * Low-level method to add a set of digest entries associated to file into the fixity block
469
+ */
470
+ addFixity(contentPath, digestName, digestValue) {
471
+ if (!digestValue || !digestName) {
472
+ return;
473
+ }
474
+ this.fixity ??= {};
475
+ this.fixity[digestName] ??= {};
476
+ const digestBlock = this.fixity[digestName];
477
+ if (digestBlock[digestValue]) {
478
+ if (!digestBlock[digestValue].includes(contentPath)) {
479
+ digestBlock[digestValue].push(contentPath);
480
+ }
481
+ }
482
+ else {
483
+ digestBlock[digestValue] = [contentPath];
484
+ }
485
+ }
486
+ /**
487
+ * Rename a logical path. This will overwrite dest if exists
488
+ */
489
+ rename(srcLogicalPath, destLogicalPath) {
490
+ const srcPrefix = srcLogicalPath.endsWith('/') ? srcLogicalPath : `${srcLogicalPath}/`;
491
+ const destPrefix = destLogicalPath.endsWith('/') ? destLogicalPath : `${destLogicalPath}/`;
492
+ const srcList = this._indexFindPaths(srcPrefix);
493
+ const pairs = srcList.map((src) => [src, destPrefix + src.slice(srcPrefix.length)]);
494
+ if (pairs.length === 0) {
495
+ pairs.push([srcLogicalPath, destLogicalPath]);
496
+ }
497
+ for (const [src, dest] of pairs) {
498
+ const entry = this.#stateEntry(src);
499
+ const index = entry?.files.indexOf(src) ?? -1;
500
+ if (entry && index >= 0) {
501
+ this.delete(dest); //overwrite
502
+ entry.files[index] = dest;
503
+ const digests = this._indexRemove(src, this.head);
504
+ if (digests) {
505
+ this._indexAdd(dest, this.head, digests);
506
+ }
507
+ }
508
+ else {
509
+ /** @todo decide: throw error or silently ignore non-existant file? */
510
+ }
511
+ }
512
+ }
513
+ /**
514
+ * Create an alias or reference of a logical path
515
+ */
516
+ copy(srcLogicalPath, destLogicalPath) {
517
+ const srcPrefix = srcLogicalPath.endsWith('/') ? srcLogicalPath : `${srcLogicalPath}/`;
518
+ const destPrefix = destLogicalPath.endsWith('/') ? destLogicalPath : `${destLogicalPath}/`;
519
+ const srcList = this._indexFindPaths(srcPrefix);
520
+ const pairs = srcList.map((src) => [src, destPrefix + src.slice(srcPrefix.length)]);
521
+ if (pairs.length === 0) {
522
+ pairs.push([srcLogicalPath, destLogicalPath]);
523
+ }
524
+ for (const [src, dest] of pairs) {
525
+ if (!dest) {
526
+ throw new Error(`Target logical path cannot be empty`);
527
+ }
528
+ const digests = this._indexGet(src, this.head, true);
529
+ const entry = this.#stateEntry(src);
530
+ if (!digests || !entry) {
531
+ throw new Error(`Source logical path "${src}" does not exist in object [${this.id}]`);
532
+ }
533
+ if (entry.files.indexOf(dest) >= 0) {
534
+ /** @todo decide: throw error or silently ignore existing dest file? */
535
+ }
536
+ else {
537
+ entry.files.push(dest);
538
+ this._indexAdd(dest, this.head, digests);
539
+ }
540
+ }
541
+ }
542
+ /**
543
+ * Delete a file
544
+ */
545
+ delete(logicalPath, version = this.head) {
546
+ const names = this._indexFindPaths(logicalPath, version);
547
+ let count = 0;
548
+ const state = this.versionState(version);
549
+ if (!state) {
550
+ return 0;
551
+ }
552
+ for (const lp of names) {
553
+ const entry = this.#stateEntry(lp, version);
554
+ if (!entry) {
555
+ continue;
556
+ }
557
+ const { digest, files } = entry;
558
+ const index = files.indexOf(lp);
559
+ if (index >= 0) {
560
+ if (files.length === 1) {
561
+ delete state[digest];
562
+ }
563
+ else {
564
+ files.splice(index, 1);
565
+ }
566
+ this._indexRemove(lp, version);
567
+ count++;
568
+ }
569
+ }
570
+ return count;
571
+ }
572
+ reinstate(logicalPath, versionName) {
573
+ const names = this._indexFindPaths(logicalPath, versionName);
574
+ //let digest = this.getDigest(logicalPath, versionName);
575
+ const state = this.state;
576
+ let count = 0;
577
+ for (const lp of names) {
578
+ const digests = this._indexGet(lp, versionName);
579
+ const digest = digests?.[this.digestAlgorithm];
580
+ if (digests && digest) {
581
+ this.delete(lp);
582
+ state[digest] = [lp];
583
+ this._indexAdd(lp, this.head, digests);
584
+ count++;
585
+ }
586
+ }
587
+ return count;
588
+ }
589
+ }
590
+ export { OcflObjectInventory, OcflObjectInventoryMut, VersionNumber };
591
+ //# sourceMappingURL=inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.js","sourceRoot":"","sources":["../src/inventory.ts"],"names":[],"mappings":"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"}