diff --git a/packages/fs/fs-sandbox/src/containment.ts b/packages/fs/fs-sandbox/src/containment.ts index 782ceb151d..41b9bdd08a 100644 --- a/packages/fs/fs-sandbox/src/containment.ts +++ b/packages/fs/fs-sandbox/src/containment.ts @@ -9,9 +9,11 @@ import type { BigIntStats } from 'node:fs' import { stat } from 'node:fs/promises' import { dirname, sep } from 'node:path' +const MISSING_CODES: ReadonlySet = new Set(['ENOENT', 'ENOTDIR']) + function isMissing(error: unknown): boolean { const code = (error as NodeJS.ErrnoException).code - return code === 'ENOENT' || code === 'ENOTDIR' + return MISSING_CODES.has(code) } function comparablePath(path: string, caseSensitive: boolean): string { diff --git a/packages/fs/fs-sandbox/tests/containment.spec.ts b/packages/fs/fs-sandbox/tests/containment.spec.ts index 30821cc826..35dc52029b 100644 --- a/packages/fs/fs-sandbox/tests/containment.spec.ts +++ b/packages/fs/fs-sandbox/tests/containment.spec.ts @@ -27,6 +27,7 @@ describe('filesystem sandbox containment', () => { it('uses case-insensitive lexical comparison for Windows-style containment', async () => { expect(await isPathUnder(join(base.toUpperCase(), 'child'), base.toLowerCase(), false)).toBe(true) + expect(await isPathUnder(join(base, 'case-sensitive-child'), base, true)).toBe(true) }) it('recognizes an alias-equivalent root by filesystem identity for a missing target', async () => {