diff --git a/packages/cli/src/serve/fs/workspace-file-system.test.ts b/packages/cli/src/serve/fs/workspace-file-system.test.ts index d3322b59058..ceb7417d706 100644 --- a/packages/cli/src/serve/fs/workspace-file-system.test.ts +++ b/packages/cli/src/serve/fs/workspace-file-system.test.ts @@ -768,6 +768,27 @@ describe('WorkspaceFileSystem - write/edit', () => { } }); + it('rejects non-positive-integer opts.limit with parse_error', async () => { + const target = path.join(h.workspace, 'v.txt'); + await fsp.writeFile(target, 'a\nb\nc\n'); + const r = await h.fs.resolve('v.txt', 'read'); + for (const bad of [ + Infinity, + -Infinity, + Number.MAX_SAFE_INTEGER + 1, + 0, + -1, + 1.5, + NaN, + ]) { + const err = await h.fs + .readText(r, { limit: bad }) + .catch((e: unknown) => e); + expect(isFsError(err)).toBe(true); + expect((err as { kind: string }).kind).toBe('parse_error'); + } + }); + it('records matchedIgnore on edit() audit (parity with readText/writeText)', async () => { const ignore = new Ignore().add(['*.log']); h = await makeHarness({ ignore }); diff --git a/packages/cli/src/serve/fs/workspace-file-system.ts b/packages/cli/src/serve/fs/workspace-file-system.ts index 8ef12aa4ee0..36a0ecb5c90 100644 --- a/packages/cli/src/serve/fs/workspace-file-system.ts +++ b/packages/cli/src/serve/fs/workspace-file-system.ts @@ -391,6 +391,15 @@ class WorkspaceFileSystemImpl implements WorkspaceFileSystem { `line must be a positive integer, got ${opts.line}`, ); } + if ( + opts.limit !== undefined && + (!Number.isSafeInteger(opts.limit) || opts.limit < 1) + ) { + throw new FsError( + 'parse_error', + `limit must be a positive integer, got ${opts.limit}`, + ); + } const snapshot = await readTextSnapshotFromResolvedFile(p, opts); const ignoreVerdict = shouldIgnore( p,