zen-fs / core

A filesystem, anywhere
https://zen-fs.github.io/core/
MIT License
103 stars 14 forks source link

mkdir recursive option is missing #75

Closed yoursunny closed 3 months ago

yoursunny commented 3 months ago

fs.promises.mkdir accepts but ignores the recursive: true option.

Snippet to Reproduce

package.json

{
  "private": true,
  "type": "module",
  "packageManager": "pnpm@9.1.3+sha256.7f63001edc077f1cff96cacba901f350796287a2800dfa83fe898f94183e4f5f",
  "dependencies": {
    "@zenfs/core": "^0.12.6"
  }
}

main.mjs

import { promises as fs } from "@zenfs/core";

await fs.mkdir("/A/B", { recursive: true });

Error Message

ubuntu@ndndev:~/zenfs-demo$ node main.mjs 
node:internal/process/esm_loader:34
      internalBinding('errors').triggerUncaughtException(
                                ^

ErrnoError: ENOENT: No such file or directory, '/A'
    at ErrnoError.With (file:///home/ubuntu/zenfs-demo/node_modules/.pnpm/@zenfs+core@0.12.6/node_modules/@zenfs/core/dist/error.js:249:16)
    at StoreFS._findINode (file:///home/ubuntu/zenfs-demo/node_modules/.pnpm/@zenfs+core@0.12.6/node_modules/@zenfs/core/dist/backends/store/fs.js:431:30)
    at async StoreFS.findINode (file:///home/ubuntu/zenfs-demo/node_modules/.pnpm/@zenfs+core@0.12.6/node_modules/@zenfs/core/dist/backends/store/fs.js:464:20)
    at async StoreFS.commitNew (file:///home/ubuntu/zenfs-demo/node_modules/.pnpm/@zenfs+core@0.12.6/node_modules/@zenfs/core/dist/backends/store/fs.js:578:52)
    at async StoreFS.mkdir (file:///home/ubuntu/zenfs-demo/node_modules/.pnpm/@zenfs+core@0.12.6/node_modules/@zenfs/core/dist/backends/store/fs.js:264:9)
    at async Module.mkdir (file:///home/ubuntu/zenfs-demo/node_modules/.pnpm/@zenfs+core@0.12.6/node_modules/@zenfs/core/dist/emulation/promises.js:515:9)
    at async file:///home/ubuntu/zenfs-demo/main.mjs:3:1 {
  errno: 2,
  path: '/A',
  syscall: '_findINode',
  code: 'ENOENT'
}

Node.js v20.12.2
yoursunny commented 3 months ago

I won't make a Pull Request for this feature right away, but here's a test case:

    test('mkdir, recursive', async () => {
        await fs.promises.mkdir('/nested/recursive/dir', { recursive: true });
        expect(await fs.promises.exists('/nested')).toBe(true);
        expect(await fs.promises.exists('/nested/recursive')).toBe(true);
        expect(await fs.promises.exists('/nested/recursive/dir')).toBe(true);
    });
james-pre commented 3 months ago

A PR would be greatly appreciated! If you don't want to or can't, I'd be happy to work on a PR