prettier-cli icon indicating copy to clipboard operation
prettier-cli copied to clipboard

Prettier experimental CLI fails when the repository contains a file or directory named `propertyIsEnumerable`

Open Standard8 opened this issue 6 months ago • 5 comments

Environments:

  • Prettier Version: 3.6.0
  • Running Prettier via: CLI
  • Runtime: Node v24.1.0
  • Operating System: macOS
  • Prettier plugins (if any): None

Steps to reproduce:

  1. Have a repository where Prettier 3.6 runs correctly.
  2. Create either a file or a directory called propertyIsEnumerable
  3. Run Prettier with the experimental cli:

npx prettier --experimental-cli --check .

Expected behavior:

Prettier runs correctly, no issues.

Actual behavior:

Prettier those an exception:

file:///Users/standard8/dev/test-repo/node_modules/prettier/internal/experimental-cli.mjs:3664
        directoriesNamesToPaths.propertyIsEnumerable(name) || (directoriesNamesToPaths[name] = []);
                                ^

TypeError: directoriesNamesToPaths.propertyIsEnumerable is not a function
    at handleDirectory (file:///Users/standard8/dev/test-repo/node_modules/prettier/internal/experimental-cli.mjs:3664:33)
    at handleDirent (file:///Users/standard8/dev/test-repo/node_modules/prettier/internal/experimental-cli.mjs:3730:11)
    at handleDirents (file:///Users/standard8/dev/test-repo/node_modules/prettier/internal/experimental-cli.mjs:3739:11)
    at file:///Users/standard8/dev/test-repo/node_modules/prettier/internal/experimental-cli.mjs:3760:13
    at Object.then (file:///Users/standard8/dev/test-repo/node_modules/prettier/internal/experimental-cli.mjs:3601:9)
    at file:///Users/standard8/dev/test-repo/node_modules/prettier/internal/experimental-cli.mjs:3758:20
    at node:fs:178:23
    at node:internal/util:569:20
    at getDirents (node:internal/fs/utils:278:7)
    at FSReqCallback.oncomplete (node:fs:1530:7)

It looks like there might also be an issue with symlinks, though I wasn't able to replicate that.

Standard8 avatar Jun 23 '25 09:06 Standard8

Transferred from prettier repo.

fisker avatar Jun 23 '25 10:06 fisker

Does that problem not happen if you don't have a file named "propertyIsEnumerable"? It sounds to me like you may be running the CLI in an environment where plain objects have a null prototype. If that's not the case I've no clue how this may be happening 🤔 it can be fixed, but it'd be useful to be able to repro it.

fabiospampinato avatar Jun 23 '25 12:06 fabiospampinato

I think it's caused by the next call after

https://github.com/prettier/prettier-cli/blob/4b1a66a1b8d7091ba53a37b4762b7863eaf09585/src/utils.ts#L248

been executed, it will override targetFilesNamesToPaths.propertyIsEnumerable to an array.

fisker avatar Jun 23 '25 12:06 fisker

Change to Object.property.propertyIsEnumerable.call() should fix it.

fisker avatar Jun 23 '25 12:06 fisker

Oh of course 🤦‍♂️ I'll get it fixed, thanks 👍

fabiospampinato avatar Jun 23 '25 13:06 fabiospampinato