itty-router 2.6.6 → 3.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/itty-router.d.ts +14 -12
- package/dist/itty-router.js +78 -0
- package/dist/itty-router.mjs +54 -0
- package/package.json +23 -20
- package/dist/itty-router.min.js +0 -1
- package/dist/itty-router.min.mjs +0 -1
package/dist/itty-router.d.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
type Obj = {
|
|
2
2
|
[propName: string]: string
|
|
3
3
|
}
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
interface RouteHandler<TRequest> {
|
|
6
6
|
(request: TRequest, ...args: any): any
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
interface Route {
|
|
10
10
|
<TRequest>(path: string, ...handlers: RouteHandler<TRequest & Request>[]): Router<TRequest>
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
interface RouteEntry<TRequest> {
|
|
14
14
|
0: string
|
|
15
15
|
1: RegExp
|
|
16
16
|
2: RouteHandler<TRequest>[]
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
interface Request {
|
|
20
20
|
method: string
|
|
21
21
|
params?: Obj
|
|
22
22
|
query?: Obj
|
|
@@ -29,7 +29,7 @@ export interface Request {
|
|
|
29
29
|
text?(): Promise<any>
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
interface IHTTPMethods {
|
|
33
33
|
get: Route
|
|
34
34
|
head: Route
|
|
35
35
|
post: Route
|
|
@@ -41,7 +41,12 @@ export interface IHTTPMethods {
|
|
|
41
41
|
patch: Route
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
interface RouterOptions<TRequest> {
|
|
45
|
+
base?: string
|
|
46
|
+
routes?: RouteEntry<TRequest>[]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
type Router<TRequest = Request, TMethods = {}> = {
|
|
45
50
|
handle: (request: TRequest, ...extra: any) => Promise<any>
|
|
46
51
|
routes: RouteEntry<TRequest>[]
|
|
47
52
|
all: Route
|
|
@@ -49,9 +54,6 @@ export type Router<TRequest = Request, TMethods = {}> = {
|
|
|
49
54
|
[any:string]: Route
|
|
50
55
|
}
|
|
51
56
|
|
|
52
|
-
|
|
53
|
-
base?: string
|
|
54
|
-
routes?: RouteEntry<TRequest>[]
|
|
55
|
-
}
|
|
57
|
+
declare function Router<TRequest = Request, TMethods = {}>(options?:RouterOptions<TRequest>): Router<TRequest, TMethods>
|
|
56
58
|
|
|
57
|
-
export
|
|
59
|
+
export { IHTTPMethods, Obj, Request, Route, RouteEntry, RouteHandler, Router, RouterOptions };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/itty-router.ts
|
|
20
|
+
var itty_router_exports = {};
|
|
21
|
+
__export(itty_router_exports, {
|
|
22
|
+
Router: () => Router
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(itty_router_exports);
|
|
25
|
+
var url = new URL("https://foo.bar?name=Kevin&age=14&pet=Katiya&pet=Vlad&pet=Halsey");
|
|
26
|
+
var query = (params, out = {}) => {
|
|
27
|
+
for (const [k, v] of params.entries()) {
|
|
28
|
+
if (typeof out[k] === "object") {
|
|
29
|
+
out[k].push(v);
|
|
30
|
+
} else if (out[k] === void 0) {
|
|
31
|
+
out[k] = v;
|
|
32
|
+
} else {
|
|
33
|
+
out[k] = [out[k], v];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
};
|
|
38
|
+
var query2 = (params) => [...params.entries()].reduce((acc, [k, v]) => {
|
|
39
|
+
if (acc[k] === void 0)
|
|
40
|
+
return (acc[k] = v) && acc;
|
|
41
|
+
return (acc[k] = [...[acc[k]], v].flat()) && acc;
|
|
42
|
+
}, {});
|
|
43
|
+
var query3 = (params) => [...params.entries()].reduce(
|
|
44
|
+
(acc, [k, v]) => (acc[k] === void 0 ? acc[k] = v : acc[k] = [...[acc[k]], v].flat()) && acc,
|
|
45
|
+
{}
|
|
46
|
+
);
|
|
47
|
+
console.log(query(url.searchParams));
|
|
48
|
+
console.log(query2(url.searchParams));
|
|
49
|
+
console.log(query3(url.searchParams));
|
|
50
|
+
function Router({ base = "", routes = [] } = {}) {
|
|
51
|
+
return {
|
|
52
|
+
__proto__: new Proxy({}, {
|
|
53
|
+
get: (target, prop, receiver) => (route, ...handlers) => routes.push([
|
|
54
|
+
prop.toUpperCase(),
|
|
55
|
+
RegExp(`^${(base + route).replace(/(\/?)\*/g, "($1.*)?").replace(/(\/$)|((?<=\/)\/)/, "").replace(/:(\w+)(\?)?(\.)?/g, "$2(?<$1>[^/]+)$2$3").replace(/\.(?=[\w(])/, "\\.").replace(/\)\.\?\(([^\[]+)\[\^/g, "?)\\.?($1(?<=\\.)[^\\.")}/*$`),
|
|
56
|
+
handlers
|
|
57
|
+
]) && receiver
|
|
58
|
+
}),
|
|
59
|
+
routes,
|
|
60
|
+
async handle(request, ...args) {
|
|
61
|
+
let response, match, url2 = new URL(request.url);
|
|
62
|
+
request.query = Object.fromEntries(url2.searchParams);
|
|
63
|
+
for (let [method, route, handlers] of routes) {
|
|
64
|
+
if ((method === request.method || method === "ALL") && (match = url2.pathname.match(route))) {
|
|
65
|
+
request.params = match.groups;
|
|
66
|
+
for (let handler of handlers) {
|
|
67
|
+
if ((response = await handler(request.proxy || request, ...args)) !== void 0)
|
|
68
|
+
return response;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
76
|
+
0 && (module.exports = {
|
|
77
|
+
Router
|
|
78
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// src/itty-router.ts
|
|
2
|
+
var url = new URL("https://foo.bar?name=Kevin&age=14&pet=Katiya&pet=Vlad&pet=Halsey");
|
|
3
|
+
var query = (params, out = {}) => {
|
|
4
|
+
for (const [k, v] of params.entries()) {
|
|
5
|
+
if (typeof out[k] === "object") {
|
|
6
|
+
out[k].push(v);
|
|
7
|
+
} else if (out[k] === void 0) {
|
|
8
|
+
out[k] = v;
|
|
9
|
+
} else {
|
|
10
|
+
out[k] = [out[k], v];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return out;
|
|
14
|
+
};
|
|
15
|
+
var query2 = (params) => [...params.entries()].reduce((acc, [k, v]) => {
|
|
16
|
+
if (acc[k] === void 0)
|
|
17
|
+
return (acc[k] = v) && acc;
|
|
18
|
+
return (acc[k] = [...[acc[k]], v].flat()) && acc;
|
|
19
|
+
}, {});
|
|
20
|
+
var query3 = (params) => [...params.entries()].reduce(
|
|
21
|
+
(acc, [k, v]) => (acc[k] === void 0 ? acc[k] = v : acc[k] = [...[acc[k]], v].flat()) && acc,
|
|
22
|
+
{}
|
|
23
|
+
);
|
|
24
|
+
console.log(query(url.searchParams));
|
|
25
|
+
console.log(query2(url.searchParams));
|
|
26
|
+
console.log(query3(url.searchParams));
|
|
27
|
+
function Router({ base = "", routes = [] } = {}) {
|
|
28
|
+
return {
|
|
29
|
+
__proto__: new Proxy({}, {
|
|
30
|
+
get: (target, prop, receiver) => (route, ...handlers) => routes.push([
|
|
31
|
+
prop.toUpperCase(),
|
|
32
|
+
RegExp(`^${(base + route).replace(/(\/?)\*/g, "($1.*)?").replace(/(\/$)|((?<=\/)\/)/, "").replace(/:(\w+)(\?)?(\.)?/g, "$2(?<$1>[^/]+)$2$3").replace(/\.(?=[\w(])/, "\\.").replace(/\)\.\?\(([^\[]+)\[\^/g, "?)\\.?($1(?<=\\.)[^\\.")}/*$`),
|
|
33
|
+
handlers
|
|
34
|
+
]) && receiver
|
|
35
|
+
}),
|
|
36
|
+
routes,
|
|
37
|
+
async handle(request, ...args) {
|
|
38
|
+
let response, match, url2 = new URL(request.url);
|
|
39
|
+
request.query = Object.fromEntries(url2.searchParams);
|
|
40
|
+
for (let [method, route, handlers] of routes) {
|
|
41
|
+
if ((method === request.method || method === "ALL") && (match = url2.pathname.match(route))) {
|
|
42
|
+
request.params = match.groups;
|
|
43
|
+
for (let handler of handlers) {
|
|
44
|
+
if ((response = await handler(request.proxy || request, ...args)) !== void 0)
|
|
45
|
+
return response;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
Router
|
|
54
|
+
};
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "itty-router",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-next.0",
|
|
4
4
|
"description": "Tiny, zero-dependency API router - built for Cloudflare Workers, but works everywhere!",
|
|
5
5
|
"sourceType": "module",
|
|
6
6
|
"files": [
|
|
7
|
-
"dist/itty-router.
|
|
8
|
-
"dist/itty-router.
|
|
7
|
+
"dist/itty-router.js",
|
|
8
|
+
"dist/itty-router.mjs",
|
|
9
9
|
"dist/itty-router.d.ts"
|
|
10
10
|
],
|
|
11
11
|
"main": "./dist/itty-router.min.js",
|
|
12
12
|
"exports": {
|
|
13
13
|
".": {
|
|
14
14
|
"types": "./dist/itty-router.d.ts",
|
|
15
|
-
"import": "./dist/itty-router.
|
|
16
|
-
"require": "./dist/itty-router.
|
|
17
|
-
"default": "./dist/itty-router.
|
|
15
|
+
"import": "./dist/itty-router.mjs",
|
|
16
|
+
"require": "./dist/itty-router.js",
|
|
17
|
+
"default": "./dist/itty-router.mjs"
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"types": "./dist/itty-router.d.ts",
|
|
@@ -34,20 +34,18 @@
|
|
|
34
34
|
"docs:build": "cp README.md ./docs/pages/README.md && vite build",
|
|
35
35
|
"docs:serve": "vite preview",
|
|
36
36
|
"lint": "npx eslint src",
|
|
37
|
-
"test
|
|
38
|
-
"test": "
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
37
|
+
"test": "vitest --coverage --reporter verbose",
|
|
38
|
+
"test:once": "vitest run",
|
|
39
|
+
"coverage": "vitest run --coverage",
|
|
40
|
+
"coveralls": "yarn coverage && cat ./coverage/lcov.info | coveralls",
|
|
41
|
+
"verify": "echo 'verifying module...' && yarn build && yarn test",
|
|
42
|
+
"dev": "yarn test",
|
|
42
43
|
"prerelease": "yarn verify",
|
|
43
|
-
"prebuild": "rimraf dist && mkdir dist
|
|
44
|
-
"build": "
|
|
45
|
-
"uglify": "yarn uglify:cjs && yarn uglify:esm",
|
|
46
|
-
"uglify:esm": "uglifyjs dist/itty-router.mjs -c -m --toplevel > dist/itty-router.min.mjs",
|
|
47
|
-
"uglify:cjs": "uglifyjs src/itty-router.js -c -m --toplevel > dist/itty-router.min.js",
|
|
48
|
-
"build:esm": "esbuild src/itty-router.js --format=esm --outfile=./dist/itty-router.mjs",
|
|
44
|
+
"prebuild": "rimraf dist && mkdir dist",
|
|
45
|
+
"build": "tsup src/itty-router.ts --format cjs,esm --dts --clean",
|
|
49
46
|
"postbuild": "node check-size.js",
|
|
50
|
-
"release": "release --tag --push --patch"
|
|
47
|
+
"release": "release --tag --push --patch",
|
|
48
|
+
"release:next": "release --push --type=next"
|
|
51
49
|
},
|
|
52
50
|
"repository": {
|
|
53
51
|
"type": "git",
|
|
@@ -61,17 +59,22 @@
|
|
|
61
59
|
"homepage": "https://itty-router.dev",
|
|
62
60
|
"devDependencies": {
|
|
63
61
|
"@vitejs/plugin-vue": "^2.2.4",
|
|
62
|
+
"@vitest/coverage-c8": "^0.24.3",
|
|
64
63
|
"coveralls": "^3.1.1",
|
|
65
|
-
"esbuild": "^0.14.27",
|
|
66
64
|
"eslint": "^8.11.0",
|
|
67
65
|
"eslint-plugin-jest": "^26.1.2",
|
|
66
|
+
"fetch-mock": "^9.11.0",
|
|
68
67
|
"fs-extra": "^10.0.1",
|
|
69
68
|
"gzip-size": "^6.0.0",
|
|
70
69
|
"isomorphic-fetch": "^3.0.0",
|
|
71
|
-
"
|
|
70
|
+
"jsdom": "^20.0.1",
|
|
71
|
+
"npm-run-all": "^4.1.5",
|
|
72
72
|
"rimraf": "^3.0.2",
|
|
73
|
+
"tsup": "^6.3.0",
|
|
74
|
+
"typescript": "^4.8.4",
|
|
73
75
|
"uglify-js": "^3.15.3",
|
|
74
76
|
"vite": "^2.8.6",
|
|
77
|
+
"vitest": "^0.24.3",
|
|
75
78
|
"vue": "^3.2.31",
|
|
76
79
|
"yarn": "^1.22.18",
|
|
77
80
|
"yarn-release": "^1.10.3"
|
package/dist/itty-router.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports={Router:function({base:t="",routes:n=[]}={}){return{__proto__:new Proxy({},{get:(e,a,o)=>(e,...r)=>n.push([a.toUpperCase(),RegExp(`^${(t+e).replace(/(\/?)\*/g,"($1.*)?").replace(/(\/$)|((?<=\/)\/)/,"").replace(/:(\w+)(\?)?(\.)?/g,"$2(?<$1>[^/]+)$2$3").replace(/\.(?=[\w(])/,"\\.").replace(/\)\.\?\(([^\[]+)\[\^/g,"?)\\.?($1(?<=\\.)[^\\.")}/*$`),r])&&o}),routes:n,async handle(e,...r){let a,o,t=new URL(e.url);e.query=Object.fromEntries(t.searchParams);for(var[p,s,u]of n)if((p===e.method||"ALL"===p)&&(o=t.pathname.match(s))){e.params=o.groups;for(var c of u)if(void 0!==(a=await c(e.proxy||e,...r)))return a}}}}};
|
package/dist/itty-router.min.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e({base:t="",routes:n=[]}={}){return{__proto__:new Proxy({},{get:(e,a,o)=>(e,...r)=>n.push([a.toUpperCase(),RegExp(`^${(t+e).replace(/(\/?)\*/g,"($1.*)?").replace(/(\/$)|((?<=\/)\/)/,"").replace(/:(\w+)(\?)?(\.)?/g,"$2(?<$1>[^/]+)$2$3").replace(/\.(?=[\w(])/,"\\.").replace(/\)\.\?\(([^\[]+)\[\^/g,"?)\\.?($1(?<=\\.)[^\\.")}/*$`),r])&&o}),routes:n,async handle(e,...r){let a,o,t=new URL(e.url);e.query=Object.fromEntries(t.searchParams);for(var[p,s,u]of n)if((p===e.method||"ALL"===p)&&(o=t.pathname.match(s))){e.params=o.groups;for(var c of u)if(void 0!==(a=await c(e.proxy||e,...r)))return a}}}}export default{Router:e};export{e as Router};
|