diff --git a/lib/core/Router.ts b/lib/core/Router.ts index a0f5b17..077616e 100644 --- a/lib/core/Router.ts +++ b/lib/core/Router.ts @@ -37,7 +37,8 @@ export class Route { } get regexPath() { - return new RegExp(this.path); + const escaped = this.path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); } match(ctx: RequestContext): boolean { diff --git a/lib/http/HttpRouter.ts b/lib/http/HttpRouter.ts index c5e469e..5a8516b 100644 --- a/lib/http/HttpRouter.ts +++ b/lib/http/HttpRouter.ts @@ -28,14 +28,15 @@ export class HttpRoute< return x; } - override get regexPath() { - const pattern = this.path.replace( - /:(\w+)/g, - (_, paramName) => `(?<${paramName}>[^/]+)` - ); - - return new RegExp(`^${pattern}/?$`); - } +override get regexPath() { + const escaped = this.path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const pattern = escaped.replace( + /:(\w+)/g, + (_, paramName) => `(?<${paramName}>[^/]+)` + ); + + return new RegExp(`^${pattern}/?$`); +} override match(ctx: RequestContext): boolean { const match = this.regexPath.exec(ctx.url.pathname); diff --git a/package-lock.json b/package-lock.json index 5c2c7c3..d867089 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "@sejori/peko", - "version": "2.4.1", + "version": "2.4.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@sejori/peko", - "version": "2.4.1", - "license": "GPL-3.0", + "version": "2.4.2", + "license": "MIT", "devDependencies": { "@cloudflare/workers-types": "^4.20250703.0", "@types/react": "^19.1.8", diff --git a/package.json b/package.json index e756bb3..b6f028e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sejori/peko", - "version": "2.4.2", + "version": "2.4.1", "description": "Featherweight apps on the edge 🐣⚡", "main": "dist/mod.js", "directories": { @@ -30,7 +30,7 @@ "url": "git+https://github.com/sejori/peko.git" }, "author": "Seb Ringrose ", - "license": "GPL-3.0", + "license": "MIT", "bugs": { "url": "https://github.com/sejori/peko/issues" },