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.
@@ -1,22 +1,22 @@
1
- export type Obj = {
1
+ type Obj = {
2
2
  [propName: string]: string
3
3
  }
4
4
 
5
- export interface RouteHandler<TRequest> {
5
+ interface RouteHandler<TRequest> {
6
6
  (request: TRequest, ...args: any): any
7
7
  }
8
8
 
9
- export interface Route {
9
+ interface Route {
10
10
  <TRequest>(path: string, ...handlers: RouteHandler<TRequest & Request>[]): Router<TRequest>
11
11
  }
12
12
 
13
- export interface RouteEntry<TRequest> {
13
+ interface RouteEntry<TRequest> {
14
14
  0: string
15
15
  1: RegExp
16
16
  2: RouteHandler<TRequest>[]
17
17
  }
18
18
 
19
- export interface Request {
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
- export interface IHTTPMethods {
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
- export type Router<TRequest = Request, TMethods = {}> = {
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
- export interface RouterOptions<TRequest> {
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 function Router<TRequest = Request, TMethods = {}>(options?:RouterOptions<TRequest>): Router<TRequest, TMethods>
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": "2.6.6",
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.min.js",
8
- "dist/itty-router.min.mjs",
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.min.mjs",
16
- "require": "./dist/itty-router.min.js",
17
- "default": "./dist/itty-router.min.mjs"
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:dist": "jest --verbose --coverage dist",
38
- "test": "yarn lint && jest --verbose --coverage src",
39
- "verify": "echo 'verifying module...' && yarn build && yarn test && yarn test:dist",
40
- "dev": "yarn lint && jest --verbose --watch src",
41
- "coveralls": "cat ./coverage/lcov.info | node node_modules/.bin/coveralls",
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 && node prebuild.js && cp src/itty-router.d.ts dist",
44
- "build": "yarn uglify",
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
- "jest": "^27.5.1",
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"
@@ -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}}}}};
@@ -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};