@ocfl/ocfl-fs 1.0.0-beta.16 → 1.0.0-beta.18

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/store.d.ts CHANGED
@@ -32,6 +32,7 @@ declare class OcflFsStore extends OcflStore {
32
32
  mkdir(filePath: string, options?: fs.MakeDirectoryOptions): Promise<string | undefined>;
33
33
  move(source: string, target: string): Promise<void>;
34
34
  remove(filePath: string): Promise<void>;
35
+ removeIfEmpty(dirPath: string): Promise<void>;
35
36
  }
36
37
  export { OcflFsStore };
37
38
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9F,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,cAAM,WAAY,SAAQ,SAAS;IACjC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAa;IAEvD,EAAE,EAAE,OAAO,EAAE,CAAC;IAEd;;;OAGG;IACH,YAAY,MAAM,CAAC,EAAE,iBAAiB,EAGrC;IAEK,IAAI,CAAC,QAAQ,EAAE,MAAM,qBAE1B;IAEK,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,0BAE3F;IAEK,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,2BAG7F;IAEK,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gCAEzF;IAEK,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,qDAG1F;IAEK,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAKnE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,iBAI/E;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAG5C;IAEK,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,cAAc,mBAE1D;IAEK,OAAO,CAAC,QAAQ,EAAE,MAAM,qBAE7B;IAEK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAiB,EAAE,UAAe,EAAE,SAAiB,EAAE,GAAE,WAAgB,iDA8BtG;IAEK,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,EAAE,CAAC,oBAA0C,+BAEnF;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAsBxC;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,iBAE5B;CACF;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9F,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CAC5B;AAMD;;GAEG;AACH,cAAM,WAAY,SAAQ,SAAS;IACjC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAa;IAEvD,EAAE,EAAE,OAAO,EAAE,CAAC;IAEd;;;OAGG;IACH,YAAY,MAAM,CAAC,EAAE,iBAAiB,EAGrC;IAEK,IAAI,CAAC,QAAQ,EAAE,MAAM,qBAE1B;IAEK,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,0BAE3F;IAEK,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,2BAG7F;IAEK,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gCAEzF;IAEK,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,qDAG1F;IAEK,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAKnE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,iBAK/E;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAG5C;IAEK,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,cAAc,mBAE1D;IAEK,OAAO,CAAC,QAAQ,EAAE,MAAM,qBAE7B;IAEK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAiB,EAAE,UAAe,EAAE,SAAiB,EAAE,GAAE,WAAgB,iDA8BtG;IAEK,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,EAAE,CAAC,oBAA0C,+BAEnF;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAuBxC;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,iBAE5B;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,iBASlC;CACF;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
package/dist/store.js CHANGED
@@ -2,6 +2,9 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { Readable, Writable } from 'node:stream';
4
4
  import { OcflStore } from '@ocfl/ocfl';
5
+ function hasErrorCode(error, ...codes) {
6
+ return error instanceof Error && 'code' in error && codes.includes(error.code);
7
+ }
5
8
  /**
6
9
  * OCFL Object backed by local filesystem
7
10
  */
@@ -38,7 +41,8 @@ class OcflFsStore extends OcflStore {
38
41
  }
39
42
  async writeFile(filePath, data, options) {
40
43
  await this.fs.promises.mkdir(path.dirname(filePath), { recursive: true });
41
- const content = data instanceof ReadableStream ? Readable.fromWeb(data) : data instanceof ArrayBuffer ? new Uint8Array(data) : data;
44
+ // Readable.from, not fromWeb: fromWeb reads eagerly, so a source failure before writeFile attaches would be uncaught
45
+ const content = data instanceof ReadableStream ? Readable.from(data) : data instanceof ArrayBuffer ? new Uint8Array(data) : data;
42
46
  await this.fs.promises.writeFile(filePath, content, options);
43
47
  }
44
48
  async copyFile(source, target) {
@@ -95,7 +99,7 @@ class OcflFsStore extends OcflStore {
95
99
  return;
96
100
  }
97
101
  catch (error) {
98
- if (!(error instanceof Error && 'code' in error && error.code === 'EXDEV')) {
102
+ if (!hasErrorCode(error, 'EXDEV')) {
99
103
  throw error;
100
104
  }
101
105
  }
@@ -109,11 +113,23 @@ class OcflFsStore extends OcflStore {
109
113
  finally {
110
114
  await rm(staging, { recursive: true, force: true });
111
115
  }
112
- await rm(source, { recursive: true, force: true });
116
+ // The target is complete, so a leftover source must not fail the move
117
+ await rm(source, { recursive: true, force: true }).catch(() => { });
113
118
  }
114
119
  async remove(filePath) {
115
120
  return this.fs.promises.rm(filePath, { recursive: true, force: true });
116
121
  }
122
+ async removeIfEmpty(dirPath) {
123
+ try {
124
+ await this.fs.promises.rmdir(dirPath);
125
+ }
126
+ catch (error) {
127
+ // POSIX allows EEXIST in place of ENOTEMPTY
128
+ if (!hasErrorCode(error, 'ENOENT', 'ENOTEMPTY', 'EEXIST')) {
129
+ throw error;
130
+ }
131
+ }
132
+ }
117
133
  }
118
134
  export { OcflFsStore };
119
135
  //# sourceMappingURL=store.js.map
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ocfl/ocfl-fs",
3
- "version": "1.0.0-beta.16",
3
+ "version": "1.0.0-beta.18",
4
4
  "description": "Oxford Common File Layout (OCFL) JS client library for filesystem storage",
5
5
  "keywords": [
6
6
  "ocfl",
@@ -32,14 +32,14 @@
32
32
  "src"
33
33
  ],
34
34
  "devDependencies": {
35
- "@ocfl/ocfl": "^1.0.0-beta.16",
35
+ "@ocfl/ocfl": "^1.0.0-beta.18",
36
36
  "@ocfl/ocfl-tests": "0.0.0",
37
37
  "@types/node": "^22.20.5",
38
38
  "memfs": "^4.80.0",
39
39
  "typescript": "^7.0.2"
40
40
  },
41
41
  "peerDependencies": {
42
- "@ocfl/ocfl": "^1.0.0-beta.16"
42
+ "@ocfl/ocfl": "^1.0.0-beta.18"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public",
package/src/store.ts CHANGED
@@ -8,6 +8,10 @@ export interface OcflFsStoreConfig {
8
8
  fs?: typeof fs | undefined;
9
9
  }
10
10
 
11
+ function hasErrorCode(error: unknown, ...codes: string[]) {
12
+ return error instanceof Error && 'code' in error && codes.includes(error.code as string);
13
+ }
14
+
11
15
  /**
12
16
  * OCFL Object backed by local filesystem
13
17
  */
@@ -55,7 +59,8 @@ class OcflFsStore extends OcflStore {
55
59
 
56
60
  async writeFile(filePath: string, data: WriteFileData, options?: object | string) {
57
61
  await this.fs.promises.mkdir(path.dirname(filePath), { recursive: true });
58
- const content = data instanceof ReadableStream ? Readable.fromWeb(data) : data instanceof ArrayBuffer ? new Uint8Array(data) : data;
62
+ // Readable.from, not fromWeb: fromWeb reads eagerly, so a source failure before writeFile attaches would be uncaught
63
+ const content = data instanceof ReadableStream ? Readable.from(data) : data instanceof ArrayBuffer ? new Uint8Array(data) : data;
59
64
  await this.fs.promises.writeFile(filePath, content, options as Parameters<typeof fs.promises.writeFile>[2]);
60
65
  }
61
66
 
@@ -116,7 +121,7 @@ class OcflFsStore extends OcflStore {
116
121
  await rename(source, target);
117
122
  return;
118
123
  } catch (error) {
119
- if (!(error instanceof Error && 'code' in error && error.code === 'EXDEV')) {
124
+ if (!hasErrorCode(error, 'EXDEV')) {
120
125
  throw error;
121
126
  }
122
127
  }
@@ -129,12 +134,24 @@ class OcflFsStore extends OcflStore {
129
134
  } finally {
130
135
  await rm(staging, { recursive: true, force: true });
131
136
  }
132
- await rm(source, { recursive: true, force: true });
137
+ // The target is complete, so a leftover source must not fail the move
138
+ await rm(source, { recursive: true, force: true }).catch(() => {});
133
139
  }
134
140
 
135
141
  async remove(filePath: string) {
136
142
  return this.fs.promises.rm(filePath, { recursive: true, force: true });
137
143
  }
144
+
145
+ async removeIfEmpty(dirPath: string) {
146
+ try {
147
+ await this.fs.promises.rmdir(dirPath);
148
+ } catch (error) {
149
+ // POSIX allows EEXIST in place of ENOTEMPTY
150
+ if (!hasErrorCode(error, 'ENOENT', 'ENOTEMPTY', 'EEXIST')) {
151
+ throw error;
152
+ }
153
+ }
154
+ }
138
155
  }
139
156
 
140
157
  export { OcflFsStore };