Skip to content

Commit 5da76b1

Browse files
committed
fix: reject fractional search page numbers
1 parent edad47c commit 5da76b1

2 files changed

Lines changed: 10 additions & 2 deletions

File tree

__tests__/unit/types.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ async function runTests() {
3636
assert.equal(isSearXNGWebSearchArgs({ query: 'test', language: 'en' }), true);
3737
assert.equal(isSearXNGWebSearchArgs({ query: 'test search' }), true);
3838
assert.equal(isSearXNGWebSearchArgs({ query: 'test', pageno: 1, time_range: 'day' }), true);
39+
assert.equal(isSearXNGWebSearchArgs({ query: 'test', pageno: 2 }), true);
3940
assert.equal(isSearXNGWebSearchArgs({ query: 'test', pageno: 1, time_range: 'week', safesearch: 2 }), true);
4041
assert.equal(isSearXNGWebSearchArgs({ query: 'test', safesearch: 0 }), true);
4142
assert.equal(isSearXNGWebSearchArgs({ query: 'test', safesearch: 1 }), true);
@@ -61,6 +62,7 @@ async function runTests() {
6162
await testFunction('isSearXNGWebSearchArgs type guard - invalid optional parameters', () => {
6263
assert.equal(isSearXNGWebSearchArgs({ query: 'test', pageno: 0 }), false);
6364
assert.equal(isSearXNGWebSearchArgs({ query: 'test', pageno: -1 }), false);
65+
assert.equal(isSearXNGWebSearchArgs({ query: 'test', pageno: 1.5 }), false);
6466
assert.equal(isSearXNGWebSearchArgs({ query: 'test', pageno: '1' }), false);
6567
assert.equal(isSearXNGWebSearchArgs({ query: 'test', time_range: 'last week' }), false);
6668
assert.equal(isSearXNGWebSearchArgs({ query: 'test', language: 123 }), false);
@@ -89,6 +91,8 @@ async function runTests() {
8991
assert.equal(properties.min_score.type, 'number');
9092
assert.equal(properties.min_score.minimum, 0);
9193
assert.equal(properties.min_score.maximum, 1);
94+
assert.equal(properties.pageno.type, 'integer');
95+
assert.equal(properties.pageno.minimum, 1);
9296
assert.equal(properties.num_results.type, 'number');
9397
assert.equal(properties.num_results.minimum, 1);
9498
assert.equal(properties.num_results.maximum, 20);

src/types.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ export function isSearXNGWebSearchArgs(args: unknown): args is {
6868
response_format?: unknown;
6969
};
7070

71-
if (searchArgs.pageno !== undefined && (typeof searchArgs.pageno !== "number" || searchArgs.pageno < 1)) {
71+
if (
72+
searchArgs.pageno !== undefined &&
73+
(typeof searchArgs.pageno !== "number" || !Number.isInteger(searchArgs.pageno) || searchArgs.pageno < 1)
74+
) {
7275
return false;
7376
}
7477
if (
@@ -196,8 +199,9 @@ export const WEB_SEARCH_TOOL: Tool = {
196199
"The search query string. This is the required parameter name — use exactly `query`, not `prompt` or `q`.",
197200
},
198201
pageno: {
199-
type: "number",
202+
type: "integer",
200203
description: "Search page number (starts at 1)",
204+
minimum: 1,
201205
default: 1,
202206
},
203207
time_range: {

0 commit comments

Comments
 (0)