Skip to content

Commit d029150

Browse files
committed
Detect numeric csv in route params
1 parent eab80c3 commit d029150

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

library/helpers/buildRouteFromURL.test.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ t.test("it replaces dates", async () => {
3636
t.same(buildRouteFromURL("/posts/01-05-2023"), "/posts/:date");
3737
});
3838

39-
t.test("it ignores comma numbers", async () => {
40-
t.same(buildRouteFromURL("/posts/3,000"), "/posts/3,000");
41-
});
42-
4339
t.test("it ignores API version numbers", async () => {
4440
t.same(buildRouteFromURL("/v1/posts/3"), "/v1/posts/:number");
4541
});
@@ -186,3 +182,18 @@ t.test("it does not detect static files as secrets", async () => {
186182
t.same(buildRouteFromURL(`/assets/${file}`), `/assets/${file}`);
187183
}
188184
});
185+
186+
t.test("it detects numeric comma separated arrays", async (t) => {
187+
t.same(buildRouteFromURL("/users/1,2"), "/users/:array(number)");
188+
t.same(buildRouteFromURL("/users/1,2,3,4,5"), "/users/:array(number)");
189+
t.same(
190+
buildRouteFromURL("/users/100,200,3000000,40000000,500000000"),
191+
"/users/:array(number)"
192+
);
193+
194+
t.same(buildRouteFromURL("/users/1,2,3,4,"), "/users/1,2,3,4,");
195+
t.same(buildRouteFromURL("/users/1,"), "/users/1,");
196+
t.same(buildRouteFromURL("/users/,1,2"), "/users/,1,2");
197+
t.same(buildRouteFromURL("/users/1,2,3_"), "/users/1,2,3_");
198+
t.same(buildRouteFromURL("/users/1,2,3a"), "/users/1,2,3a");
199+
});

library/helpers/buildRouteFromURL.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const EMAIL =
1313
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
1414
const HASH = /^(?:[a-f0-9]{32}|[a-f0-9]{40}|[a-f0-9]{64}|[a-f0-9]{128})$/i;
1515
const HASH_LENGTHS = [32, 40, 64, 128];
16+
const NUMBER_ARRAY = /^\d+(?:,\d+)*$/;
1617

1718
export function buildRouteFromURL(url: string) {
1819
let path = tryParseURLPath(url);
@@ -77,6 +78,10 @@ function replaceURLSegmentWithParam(segment: string) {
7778
return ":hash";
7879
}
7980

81+
if (startsWithNumber && NUMBER_ARRAY.test(segment)) {
82+
return ":array(number)";
83+
}
84+
8085
if (looksLikeASecret(segment)) {
8186
return ":secret";
8287
}

0 commit comments

Comments
 (0)