diff --git a/demo/fsa/main.ts b/demo/fsa/main.ts index 9ee1c7cbb..c0c0d728b 100644 --- a/demo/fsa/main.ts +++ b/demo/fsa/main.ts @@ -51,6 +51,12 @@ const demo = async (dir: fsa.IFileSystemDirectoryHandle) => { strictEqual(fs.existsSync('/to-be-deleted'), true); fs.rmdirSync('/to-be-deleted'); strictEqual(fs.existsSync('/to-be-deleted'), false); + + console.log('rmSync() - can delete a file'); + await fs.promises.writeFile('/dir/tmp', '...'); + strictEqual(fs.existsSync('/dir/tmp'), true); + fs.rmSync('/dir/tmp'); + strictEqual(fs.existsSync('/dir/tmp'), false); }; const main = async () => { diff --git a/src/fsa-to-node/FsaNodeFs.ts b/src/fsa-to-node/FsaNodeFs.ts index 8cb872f0f..0a5e5b72c 100644 --- a/src/fsa-to-node/FsaNodeFs.ts +++ b/src/fsa-to-node/FsaNodeFs.ts @@ -645,7 +645,6 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono const [options, callback] = getRmOptsAndCb(a, b); const [folder, name] = pathToLocation(pathToFilename(path)); this.getDir(folder, false, 'rmdir') - .then(dir => dir.getDirectoryHandle(name).then(() => dir)) .then(dir => dir.removeEntry(name, { recursive: options.recursive ?? false })) .then( () => callback(null), @@ -860,12 +859,19 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono public readonly rmdirSync: FsSynchronousApi['rmdirSync'] = (path: misc.PathLike, opts?: opts.IRmdirOptions): void => { const filename = pathToFilename(path); const adapter = this.getSyncAdapter(); - adapter.call('rmdir', {path: filename, opts}); + adapter.call('rmdir', [filename, opts]); + }; + + public readonly rmSync: FsSynchronousApi['rmSync'] = (path: misc.PathLike, options?: opts.IRmOptions): void => { + const filename = pathToFilename(path); + const adapter = this.getSyncAdapter(); + adapter.call('rm', [filename, options]); }; + public readonly mkdirSync: FsSynchronousApi['mkdirSync'] = notSupported; + public readonly ftruncateSync: FsSynchronousApi['ftruncateSync'] = notSupported; public readonly linkSync: FsSynchronousApi['linkSync'] = notSupported; - public readonly mkdirSync: FsSynchronousApi['mkdirSync'] = notSupported; public readonly mkdirpSync: FsSynchronousApi['mkdirpSync'] = notSupported; public readonly mkdtempSync: FsSynchronousApi['mkdtempSync'] = notSupported; public readonly openSync: FsSynchronousApi['openSync'] = notSupported; @@ -873,7 +879,6 @@ export class FsaNodeFs extends FsaNodeCore implements FsCallbackApi, FsSynchrono public readonly readlinkSync: FsSynchronousApi['readlinkSync'] = notSupported; public readonly readSync: FsSynchronousApi['readSync'] = notSupported; public readonly realpathSync: FsSynchronousApi['realpathSync'] = notSupported; - public readonly rmSync: FsSynchronousApi['rmSync'] = notSupported; public readonly symlinkSync: FsSynchronousApi['symlinkSync'] = notSupported; public readonly truncateSync: FsSynchronousApi['truncateSync'] = notSupported; public readonly unlinkSync: FsSynchronousApi['unlinkSync'] = notSupported; diff --git a/src/fsa-to-node/__tests__/FsaNodeFs.test.ts b/src/fsa-to-node/__tests__/FsaNodeFs.test.ts index a930a7c2a..11810ab2f 100644 --- a/src/fsa-to-node/__tests__/FsaNodeFs.test.ts +++ b/src/fsa-to-node/__tests__/FsaNodeFs.test.ts @@ -155,6 +155,15 @@ onlyOnNode20('FsaNodeFs', () => { const { fs } = setup({ folder: { subfolder: { file: 'test' } }, 'empty-folder': null }); await fs.promises.rm('/lala/lulu', { recursive: true, force: true }); }); + + test('can remove a file', async () => { + const { fs, mfs } = setup({ folder: { subfolder: { file: 'test' } }, 'empty-folder': null }); + await fs.promises.rm('/folder/subfolder/file'); + expect(mfs.__vol.toJSON()).toStrictEqual({ + '/mountpoint/folder/subfolder': null, + '/mountpoint/empty-folder': null, + }); + }); }); describe('.unlink()', () => { diff --git a/src/fsa-to-node/types.ts b/src/fsa-to-node/types.ts index 16cd0ac48..d7e08313d 100644 --- a/src/fsa-to-node/types.ts +++ b/src/fsa-to-node/types.ts @@ -13,7 +13,8 @@ export interface FsaNodeSyncAdapterApi { appendFile(req: { filename: string; data: Uint8Array; opts?: opts.IAppendFileOptions }): void; copy(req: { src: string; dst: string, flags?: number }): void; move(req: { src: string; dst: string }): void; - rmdir(req: { path: string; opts?: opts.IRmdirOptions }): void; + rmdir(req: [filename: string, opts?: opts.IRmdirOptions]): void; + rm(req: [filename: string, opts?: opts.IRmOptions]): void; } export interface FsaNodeSyncAdapter { diff --git a/src/fsa-to-node/worker/FsaNodeSyncWorker.ts b/src/fsa-to-node/worker/FsaNodeSyncWorker.ts index 00683169a..860bdd3e8 100644 --- a/src/fsa-to-node/worker/FsaNodeSyncWorker.ts +++ b/src/fsa-to-node/worker/FsaNodeSyncWorker.ts @@ -141,8 +141,11 @@ export class FsaNodeSyncWorker { move: async ({ src, dst }): Promise => { await this.fs.promises.rename(src, dst); }, - rmdir: async ({ path, opts }): Promise => { - await this.fs.promises.rmdir(path, opts); + rmdir: async ([filename, options]): Promise => { + await this.fs.promises.rmdir(filename, options); + }, + rm: async ([filename, options]): Promise => { + await this.fs.promises.rm(filename, options); }, }; }