mirror of
https://github.com/denoland/deno.git
synced 2024-11-24 15:19:26 -05:00
chore(bench): add flash router benchmarks (#15495)
This commit is contained in:
parent
9e576dff7c
commit
25a109d9ea
97 changed files with 3350 additions and 0 deletions
|
@ -20,6 +20,7 @@
|
||||||
".cargo_home",
|
".cargo_home",
|
||||||
".git",
|
".git",
|
||||||
"cli/bench/testdata/express-router.js",
|
"cli/bench/testdata/express-router.js",
|
||||||
|
"cli/bench/testdata/npm/*",
|
||||||
"cli/dts/lib.d.ts",
|
"cli/dts/lib.d.ts",
|
||||||
"cli/dts/lib.dom*",
|
"cli/dts/lib.dom*",
|
||||||
"cli/dts/lib.es*",
|
"cli/dts/lib.es*",
|
||||||
|
|
13
cli/bench/http/bun_hono_router.js
Normal file
13
cli/bench/http/bun_hono_router.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
|
||||||
|
const port = Bun.argv[2] || "4545";
|
||||||
|
const { Hono } = require("../testdata/npm/hono/dist/index.js");
|
||||||
|
|
||||||
|
const app = new Hono();
|
||||||
|
app.get("/", (c) => c.text("Hello, World!"));
|
||||||
|
|
||||||
|
Bun.serve({
|
||||||
|
fetch(r) {
|
||||||
|
return app.fetch(r);
|
||||||
|
},
|
||||||
|
port: Number(port),
|
||||||
|
});
|
10
cli/bench/http/deno_flash_hono_router.js
Normal file
10
cli/bench/http/deno_flash_hono_router.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
|
||||||
|
import { Hono } from "https://deno.land/x/hono@v2.0.9/mod.ts";
|
||||||
|
|
||||||
|
const addr = Deno.args[0] || "127.0.0.1:4500";
|
||||||
|
const [hostname, port] = addr.split(":");
|
||||||
|
|
||||||
|
const app = new Hono();
|
||||||
|
app.get("/", (c) => c.text("Hello, World!"));
|
||||||
|
|
||||||
|
Deno.serve(app.fetch, { port: Number(port), hostname });
|
21
cli/bench/testdata/npm/hono/LICENSE
vendored
Normal file
21
cli/bench/testdata/npm/hono/LICENSE
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Yusuke Wada
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
88
cli/bench/testdata/npm/hono/README.md
vendored
Normal file
88
cli/bench/testdata/npm/hono/README.md
vendored
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
<div align="center">
|
||||||
|
<a href="https://honojs.dev">
|
||||||
|
<img src="https://raw.githubusercontent.com/honojs/hono/main/docs/images/hono-title.png" width="500" height="auto" alt="Hono"/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://honojs.dev"><b>Documentation :point_right: honojs.dev</b></a><br />
|
||||||
|
<i>v2.x has been released!</i> <a href="docs/MIGRATION.md">Migration guide</b>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/honojs/hono/ci)](https://github.com/honojs/hono/actions)
|
||||||
|
[![GitHub](https://img.shields.io/github/license/honojs/hono)](https://github.com/honojs/hono/blob/main/LICENSE)
|
||||||
|
[![npm](https://img.shields.io/npm/v/hono)](https://www.npmjs.com/package/hono)
|
||||||
|
[![npm](https://img.shields.io/npm/dm/hono)](https://www.npmjs.com/package/hono)
|
||||||
|
[![npm type definitions](https://img.shields.io/npm/types/hono)](https://www.npmjs.com/package/hono)
|
||||||
|
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/honojs/hono)](https://github.com/honojs/hono/pulse)
|
||||||
|
[![GitHub last commit](https://img.shields.io/github/last-commit/honojs/hono)](https://github.com/honojs/hono/commits/main)
|
||||||
|
[![Deno badge](https://img.shields.io/endpoint?url=https%3A%2F%2Fdeno-visualizer.danopia.net%2Fshields%2Flatest-version%2Fx%2Fhono%2Fmod.ts)](https://doc.deno.land/https/deno.land/x/hono/mod.ts)
|
||||||
|
|
||||||
|
Hono - _**[炎] means flame🔥 in Japanese**_ - is a small, simple, and ultrafast web framework for Cloudflare Workers, Deno, Bun, and others.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { Hono } from 'hono'
|
||||||
|
const app = new Hono()
|
||||||
|
|
||||||
|
app.get('/', (c) => c.text('Hono!!'))
|
||||||
|
|
||||||
|
export default app
|
||||||
|
```
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Ultrafast** - the router does not use linear loops.
|
||||||
|
- **Zero-dependencies** - using only Service Worker and Web Standard API.
|
||||||
|
- **Middleware** - built-in middleware, custom middleware, and third-party middleware.
|
||||||
|
- **TypeScript** - first-class TypeScript support.
|
||||||
|
- **Multi-platform** - works on Cloudflare Workers, Fastly Compute@Edge, Deno, or Bun.
|
||||||
|
|
||||||
|
## Benchmarks
|
||||||
|
|
||||||
|
**Hono is fastest**, compared to other routers for Cloudflare Workers.
|
||||||
|
|
||||||
|
```plain
|
||||||
|
hono - trie-router(default) x 424,449 ops/sec ±4.98% (77 runs sampled)
|
||||||
|
hono - regexp-router x 516,228 ops/sec ±4.79% (81 runs sampled)
|
||||||
|
itty-router x 206,641 ops/sec ±3.59% (87 runs sampled)
|
||||||
|
sunder x 319,500 ops/sec ±1.33% (93 runs sampled)
|
||||||
|
worktop x 187,280 ops/sec ±3.09% (87 runs sampled)
|
||||||
|
Fastest is hono - regexp-router
|
||||||
|
✨ Done in 38.32s.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
The documentation is available on [honojs.dev](https://honojs.dev).
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
Migration guide is available on [docs/MIGRATION.md](docs/MIGRATION.md).
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions Welcome! You can contribute in the following ways.
|
||||||
|
|
||||||
|
- Create an Issue - Propose a new feature. Report a bug.
|
||||||
|
- Pull Request - Fix a bug and typo. Refactor the code.
|
||||||
|
- Create third-party middleware - Instruct below.
|
||||||
|
- Share - Share your thoughts on the Blog, Twitter, and others.
|
||||||
|
- Make your application - Please try to use Hono.
|
||||||
|
|
||||||
|
For more details, see [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md).
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
Thanks to [all contributors](https://github.com/honojs/hono/graphs/contributors)! Especially, [@metrue](https://github.com/metrue) and [@usualoma](https://github.com/usualoma)!
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
Yusuke Wada <https://github.com/yusukebe>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Distributed under the MIT License. See [LICENSE](LICENSE) for more information.
|
2
cli/bench/testdata/npm/hono/dist/compose.d.ts
vendored
Normal file
2
cli/bench/testdata/npm/hono/dist/compose.d.ts
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
import type { ErrorHandler, NotFoundHandler } from './hono';
|
||||||
|
export declare const compose: <C>(middleware: Function[], onError?: ErrorHandler, onNotFound?: NotFoundHandler) => (context: C, next?: Function) => Promise<C>;
|
49
cli/bench/testdata/npm/hono/dist/compose.js
vendored
Normal file
49
cli/bench/testdata/npm/hono/dist/compose.js
vendored
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.compose = void 0;
|
||||||
|
const context_1 = require("./context");
|
||||||
|
// Based on the code in the MIT licensed `koa-compose` package.
|
||||||
|
const compose = (middleware, onError, onNotFound) => {
|
||||||
|
const middlewareLength = middleware.length;
|
||||||
|
return (context, next) => {
|
||||||
|
let index = -1;
|
||||||
|
return dispatch(0);
|
||||||
|
async function dispatch(i) {
|
||||||
|
if (i <= index) {
|
||||||
|
throw new Error('next() called multiple times');
|
||||||
|
}
|
||||||
|
let handler = middleware[i];
|
||||||
|
index = i;
|
||||||
|
if (i === middlewareLength && next)
|
||||||
|
handler = next;
|
||||||
|
if (!handler) {
|
||||||
|
if (context instanceof context_1.HonoContext && context.finalized === false && onNotFound) {
|
||||||
|
context.res = await onNotFound(context);
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
let res;
|
||||||
|
let isError = false;
|
||||||
|
try {
|
||||||
|
const tmp = handler(context, () => dispatch(i + 1));
|
||||||
|
res = tmp instanceof Promise ? await tmp : tmp;
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
if (context instanceof context_1.HonoContext && onError) {
|
||||||
|
if (err instanceof Error) {
|
||||||
|
isError = true;
|
||||||
|
res = onError(err, context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!res) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (res && context instanceof context_1.HonoContext && (!context.finalized || isError)) {
|
||||||
|
context.res = res;
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.compose = compose;
|
69
cli/bench/testdata/npm/hono/dist/context.d.ts
vendored
Normal file
69
cli/bench/testdata/npm/hono/dist/context.d.ts
vendored
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/// <reference types="@cloudflare/workers-types" />
|
||||||
|
import type { ContextVariableMap, NotFoundHandler } from './hono';
|
||||||
|
import type { CookieOptions } from './utils/cookie';
|
||||||
|
import type { StatusCode } from './utils/http-status';
|
||||||
|
declare type Headers = Record<string, string>;
|
||||||
|
export declare type Data = string | ArrayBuffer | ReadableStream;
|
||||||
|
declare type Env = Record<string, any>;
|
||||||
|
export interface Context<RequestParamKeyType extends string = string, E = Env> {
|
||||||
|
req: Request<RequestParamKeyType>;
|
||||||
|
env: E;
|
||||||
|
event: FetchEvent;
|
||||||
|
executionCtx: ExecutionContext;
|
||||||
|
finalized: boolean;
|
||||||
|
get res(): Response;
|
||||||
|
set res(_res: Response);
|
||||||
|
header: (name: string, value: string) => void;
|
||||||
|
status: (status: StatusCode) => void;
|
||||||
|
set: {
|
||||||
|
<Key extends keyof ContextVariableMap>(key: Key, value: ContextVariableMap[Key]): void;
|
||||||
|
(key: string, value: any): void;
|
||||||
|
};
|
||||||
|
get: {
|
||||||
|
<Key extends keyof ContextVariableMap>(key: Key): ContextVariableMap[Key];
|
||||||
|
<T = any>(key: string): T;
|
||||||
|
};
|
||||||
|
pretty: (prettyJSON: boolean, space?: number) => void;
|
||||||
|
newResponse: (data: Data | null, status: StatusCode, headers: Headers) => Response;
|
||||||
|
body: (data: Data | null, status?: StatusCode, headers?: Headers) => Response;
|
||||||
|
text: (text: string, status?: StatusCode, headers?: Headers) => Response;
|
||||||
|
json: <T>(object: T, status?: StatusCode, headers?: Headers) => Response;
|
||||||
|
html: (html: string, status?: StatusCode, headers?: Headers) => Response;
|
||||||
|
redirect: (location: string, status?: StatusCode) => Response;
|
||||||
|
cookie: (name: string, value: string, options?: CookieOptions) => void;
|
||||||
|
notFound: () => Response | Promise<Response>;
|
||||||
|
}
|
||||||
|
export declare class HonoContext<RequestParamKeyType extends string = string, E = Env> implements Context<RequestParamKeyType, E> {
|
||||||
|
req: Request<RequestParamKeyType>;
|
||||||
|
env: E;
|
||||||
|
finalized: boolean;
|
||||||
|
_status: StatusCode;
|
||||||
|
private _executionCtx;
|
||||||
|
private _pretty;
|
||||||
|
private _prettySpace;
|
||||||
|
private _map;
|
||||||
|
private _headers;
|
||||||
|
private _res;
|
||||||
|
private notFoundHandler;
|
||||||
|
constructor(req: Request, env?: E | undefined, executionCtx?: FetchEvent | ExecutionContext | undefined, notFoundHandler?: NotFoundHandler);
|
||||||
|
get event(): FetchEvent;
|
||||||
|
get executionCtx(): ExecutionContext;
|
||||||
|
get res(): Response;
|
||||||
|
set res(_res: Response);
|
||||||
|
header(name: string, value: string): void;
|
||||||
|
status(status: StatusCode): void;
|
||||||
|
set<Key extends keyof ContextVariableMap>(key: Key, value: ContextVariableMap[Key]): void;
|
||||||
|
set(key: string, value: any): void;
|
||||||
|
get<Key extends keyof ContextVariableMap>(key: Key): ContextVariableMap[Key];
|
||||||
|
get<T = any>(key: string): T;
|
||||||
|
pretty(prettyJSON: boolean, space?: number): void;
|
||||||
|
newResponse(data: Data | null, status: StatusCode, headers?: Headers): Response;
|
||||||
|
body(data: Data | null, status?: StatusCode, headers?: Headers): Response;
|
||||||
|
text(text: string, status?: StatusCode, headers?: Headers): Response;
|
||||||
|
json<T>(object: T, status?: StatusCode, headers?: Headers): Response;
|
||||||
|
html(html: string, status?: StatusCode, headers?: Headers): Response;
|
||||||
|
redirect(location: string, status?: StatusCode): Response;
|
||||||
|
cookie(name: string, value: string, opt?: CookieOptions): void;
|
||||||
|
notFound(): Response | Promise<Response>;
|
||||||
|
}
|
||||||
|
export {};
|
112
cli/bench/testdata/npm/hono/dist/context.js
vendored
Normal file
112
cli/bench/testdata/npm/hono/dist/context.js
vendored
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.HonoContext = void 0;
|
||||||
|
const cookie_1 = require("./utils/cookie");
|
||||||
|
const url_1 = require("./utils/url");
|
||||||
|
class HonoContext {
|
||||||
|
constructor(req, env = undefined, executionCtx = undefined, notFoundHandler = () => new Response()) {
|
||||||
|
this._status = 200;
|
||||||
|
this._pretty = false;
|
||||||
|
this._prettySpace = 2;
|
||||||
|
this._executionCtx = executionCtx;
|
||||||
|
this.req = req;
|
||||||
|
this.env = env ? env : {};
|
||||||
|
this.notFoundHandler = notFoundHandler;
|
||||||
|
this.finalized = false;
|
||||||
|
}
|
||||||
|
get event() {
|
||||||
|
if (this._executionCtx instanceof FetchEvent) {
|
||||||
|
return this._executionCtx;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw Error('This context has no FetchEvent');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
get executionCtx() {
|
||||||
|
if (this._executionCtx) {
|
||||||
|
return this._executionCtx;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw Error('This context has no ExecutionContext');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
get res() {
|
||||||
|
return (this._res || (this._res = new Response()));
|
||||||
|
}
|
||||||
|
set res(_res) {
|
||||||
|
this._res = _res;
|
||||||
|
this.finalized = true;
|
||||||
|
}
|
||||||
|
header(name, value) {
|
||||||
|
this._headers || (this._headers = {});
|
||||||
|
this._headers[name.toLowerCase()] = value;
|
||||||
|
if (this.finalized) {
|
||||||
|
this.res.headers.set(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
status(status) {
|
||||||
|
this._status = status;
|
||||||
|
}
|
||||||
|
set(key, value) {
|
||||||
|
this._map || (this._map = {});
|
||||||
|
this._map[key] = value;
|
||||||
|
}
|
||||||
|
get(key) {
|
||||||
|
if (!this._map) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return this._map[key];
|
||||||
|
}
|
||||||
|
pretty(prettyJSON, space = 2) {
|
||||||
|
this._pretty = prettyJSON;
|
||||||
|
this._prettySpace = space;
|
||||||
|
}
|
||||||
|
newResponse(data, status, headers = {}) {
|
||||||
|
const _headers = { ...this._headers };
|
||||||
|
if (this._res) {
|
||||||
|
this._res.headers.forEach((v, k) => {
|
||||||
|
_headers[k] = v;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return new Response(data, {
|
||||||
|
status: status || this._status || 200,
|
||||||
|
headers: { ..._headers, ...headers },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
body(data, status = this._status, headers = {}) {
|
||||||
|
return this.newResponse(data, status, headers);
|
||||||
|
}
|
||||||
|
text(text, status = this._status, headers = {}) {
|
||||||
|
headers['content-type'] = 'text/plain; charset=UTF-8';
|
||||||
|
return this.body(text, status, headers);
|
||||||
|
}
|
||||||
|
json(object, status = this._status, headers = {}) {
|
||||||
|
const body = this._pretty
|
||||||
|
? JSON.stringify(object, null, this._prettySpace)
|
||||||
|
: JSON.stringify(object);
|
||||||
|
headers['content-type'] = 'application/json; charset=UTF-8';
|
||||||
|
return this.body(body, status, headers);
|
||||||
|
}
|
||||||
|
html(html, status = this._status, headers = {}) {
|
||||||
|
headers['content-type'] = 'text/html; charset=UTF-8';
|
||||||
|
return this.body(html, status, headers);
|
||||||
|
}
|
||||||
|
redirect(location, status = 302) {
|
||||||
|
if (!(0, url_1.isAbsoluteURL)(location)) {
|
||||||
|
const url = new URL(this.req.url);
|
||||||
|
url.pathname = location;
|
||||||
|
location = url.toString();
|
||||||
|
}
|
||||||
|
return this.newResponse(null, status, {
|
||||||
|
Location: location,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
cookie(name, value, opt) {
|
||||||
|
const cookie = (0, cookie_1.serialize)(name, value, opt);
|
||||||
|
this.header('set-cookie', cookie);
|
||||||
|
}
|
||||||
|
notFound() {
|
||||||
|
return this.notFoundHandler(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.HonoContext = HonoContext;
|
56
cli/bench/testdata/npm/hono/dist/hono.d.ts
vendored
Normal file
56
cli/bench/testdata/npm/hono/dist/hono.d.ts
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/// <reference types="@cloudflare/workers-types" />
|
||||||
|
import type { Context } from './context';
|
||||||
|
import type { Router } from './router';
|
||||||
|
export interface ContextVariableMap {
|
||||||
|
}
|
||||||
|
declare type Env = Record<string, any>;
|
||||||
|
export declare type Handler<RequestParamKeyType extends string = string, E = Env> = (c: Context<RequestParamKeyType, E>, next: Next) => Response | Promise<Response> | Promise<void> | Promise<Response | undefined>;
|
||||||
|
export declare type NotFoundHandler<E = Env> = (c: Context<string, E>) => Response | Promise<Response>;
|
||||||
|
export declare type ErrorHandler<E = Env> = (err: Error, c: Context<string, E>) => Response;
|
||||||
|
export declare type Next = () => Promise<void>;
|
||||||
|
declare type ParamKeyName<NameWithPattern> = NameWithPattern extends `${infer Name}{${infer _Pattern}` ? Name : NameWithPattern;
|
||||||
|
declare type ParamKey<Component> = Component extends `:${infer NameWithPattern}` ? ParamKeyName<NameWithPattern> : never;
|
||||||
|
declare type ParamKeys<Path> = Path extends `${infer Component}/${infer Rest}` ? ParamKey<Component> | ParamKeys<Rest> : ParamKey<Path>;
|
||||||
|
interface HandlerInterface<T extends string, E extends Env = Env, U = Hono<E, T>> {
|
||||||
|
<Path extends string>(path: Path, ...handlers: Handler<ParamKeys<Path> extends never ? string : ParamKeys<Path>, E>[]): U;
|
||||||
|
(path: string, ...handlers: Handler<string, E>[]): U;
|
||||||
|
<Path extends string>(...handlers: Handler<ParamKeys<Path> extends never ? string : ParamKeys<Path>, E>[]): U;
|
||||||
|
(...handlers: Handler<string, E>[]): U;
|
||||||
|
}
|
||||||
|
interface Route<E extends Env> {
|
||||||
|
path: string;
|
||||||
|
method: string;
|
||||||
|
handler: Handler<string, E>;
|
||||||
|
}
|
||||||
|
declare const Hono_base: new <E_1 extends Env, T extends string, U>() => {
|
||||||
|
all: HandlerInterface<T, E_1, U>;
|
||||||
|
get: HandlerInterface<T, E_1, U>;
|
||||||
|
post: HandlerInterface<T, E_1, U>;
|
||||||
|
put: HandlerInterface<T, E_1, U>;
|
||||||
|
delete: HandlerInterface<T, E_1, U>;
|
||||||
|
head: HandlerInterface<T, E_1, U>;
|
||||||
|
options: HandlerInterface<T, E_1, U>;
|
||||||
|
patch: HandlerInterface<T, E_1, U>;
|
||||||
|
};
|
||||||
|
export declare class Hono<E extends Env = Env, P extends string = '/'> extends Hono_base<E, P, Hono<E, P>> {
|
||||||
|
readonly router: Router<Handler<string, E>>;
|
||||||
|
readonly strict: boolean;
|
||||||
|
private _tempPath;
|
||||||
|
private path;
|
||||||
|
routes: Route<E>[];
|
||||||
|
constructor(init?: Partial<Pick<Hono, 'router' | 'strict'>>);
|
||||||
|
private notFoundHandler;
|
||||||
|
private errorHandler;
|
||||||
|
route(path: string, app?: Hono<any>): Hono<E, P>;
|
||||||
|
use(path: string, ...middleware: Handler<string, E>[]): Hono<E, P>;
|
||||||
|
use(...middleware: Handler<string, E>[]): Hono<E, P>;
|
||||||
|
onError(handler: ErrorHandler<E>): Hono<E, P>;
|
||||||
|
notFound(handler: NotFoundHandler<E>): Hono<E, P>;
|
||||||
|
private addRoute;
|
||||||
|
private matchRoute;
|
||||||
|
private dispatch;
|
||||||
|
handleEvent(event: FetchEvent): Promise<Response>;
|
||||||
|
fetch: (request: Request, env?: E, executionCtx?: ExecutionContext) => Promise<Response>;
|
||||||
|
request(input: RequestInfo, requestInit?: RequestInit): Promise<Response>;
|
||||||
|
}
|
||||||
|
export {};
|
128
cli/bench/testdata/npm/hono/dist/hono.js
vendored
Normal file
128
cli/bench/testdata/npm/hono/dist/hono.js
vendored
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.Hono = void 0;
|
||||||
|
const compose_1 = require("./compose");
|
||||||
|
const context_1 = require("./context");
|
||||||
|
const request_1 = require("./request");
|
||||||
|
const router_1 = require("./router");
|
||||||
|
const trie_router_1 = require("./router/trie-router"); // Default Router
|
||||||
|
const url_1 = require("./utils/url");
|
||||||
|
const methods = ['get', 'post', 'put', 'delete', 'head', 'options', 'patch'];
|
||||||
|
function defineDynamicClass() {
|
||||||
|
return class {
|
||||||
|
};
|
||||||
|
}
|
||||||
|
class Hono extends defineDynamicClass() {
|
||||||
|
constructor(init = {}) {
|
||||||
|
super();
|
||||||
|
this.router = new trie_router_1.TrieRouter();
|
||||||
|
this.strict = true; // strict routing - default is true
|
||||||
|
this._tempPath = '';
|
||||||
|
this.path = '/';
|
||||||
|
this.routes = [];
|
||||||
|
this.notFoundHandler = (c) => {
|
||||||
|
const message = '404 Not Found';
|
||||||
|
return c.text(message, 404);
|
||||||
|
};
|
||||||
|
this.errorHandler = (err, c) => {
|
||||||
|
console.error(`${err.stack || err.message}`);
|
||||||
|
const message = 'Internal Server Error';
|
||||||
|
return c.text(message, 500);
|
||||||
|
};
|
||||||
|
this.fetch = (request, env, executionCtx) => {
|
||||||
|
return this.dispatch(request, executionCtx, env);
|
||||||
|
};
|
||||||
|
(0, request_1.extendRequestPrototype)();
|
||||||
|
const allMethods = [...methods, router_1.METHOD_NAME_ALL_LOWERCASE];
|
||||||
|
allMethods.map((method) => {
|
||||||
|
this[method] = (args1, ...args) => {
|
||||||
|
if (typeof args1 === 'string') {
|
||||||
|
this.path = args1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.addRoute(method, this.path, args1);
|
||||||
|
}
|
||||||
|
args.map((handler) => {
|
||||||
|
if (typeof handler !== 'string') {
|
||||||
|
this.addRoute(method, this.path, handler);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
Object.assign(this, init);
|
||||||
|
}
|
||||||
|
route(path, app) {
|
||||||
|
this._tempPath = path;
|
||||||
|
if (app) {
|
||||||
|
app.routes.map((r) => {
|
||||||
|
this.addRoute(r.method, r.path, r.handler);
|
||||||
|
});
|
||||||
|
this._tempPath = '';
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
use(arg1, ...handlers) {
|
||||||
|
if (typeof arg1 === 'string') {
|
||||||
|
this.path = arg1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
handlers.unshift(arg1);
|
||||||
|
}
|
||||||
|
handlers.map((handler) => {
|
||||||
|
this.addRoute(router_1.METHOD_NAME_ALL, this.path, handler);
|
||||||
|
});
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
onError(handler) {
|
||||||
|
this.errorHandler = handler;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
notFound(handler) {
|
||||||
|
this.notFoundHandler = handler;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
addRoute(method, path, handler) {
|
||||||
|
method = method.toUpperCase();
|
||||||
|
if (this._tempPath) {
|
||||||
|
path = (0, url_1.mergePath)(this._tempPath, path);
|
||||||
|
}
|
||||||
|
this.router.add(method, path, handler);
|
||||||
|
const r = { path: path, method: method, handler: handler };
|
||||||
|
this.routes.push(r);
|
||||||
|
}
|
||||||
|
matchRoute(method, path) {
|
||||||
|
return this.router.match(method, path);
|
||||||
|
}
|
||||||
|
async dispatch(request, eventOrExecutionCtx, env) {
|
||||||
|
const path = (0, url_1.getPathFromURL)(request.url, this.strict);
|
||||||
|
const method = request.method;
|
||||||
|
const result = this.matchRoute(method, path);
|
||||||
|
request.paramData = result?.params;
|
||||||
|
const handlers = result ? result.handlers : [this.notFoundHandler];
|
||||||
|
const c = new context_1.HonoContext(request, env, eventOrExecutionCtx, this.notFoundHandler);
|
||||||
|
const composed = (0, compose_1.compose)(handlers, this.errorHandler, this.notFoundHandler);
|
||||||
|
let context;
|
||||||
|
try {
|
||||||
|
context = await composed(c);
|
||||||
|
if (!context.finalized) {
|
||||||
|
throw new Error('Context is not finalized. You may forget returning Response object or `await next()`');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
if (err instanceof Error) {
|
||||||
|
return this.errorHandler(err, c);
|
||||||
|
}
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
return context.res;
|
||||||
|
}
|
||||||
|
handleEvent(event) {
|
||||||
|
return this.dispatch(event.request, event);
|
||||||
|
}
|
||||||
|
request(input, requestInit) {
|
||||||
|
const req = input instanceof Request ? input : new Request(input, requestInit);
|
||||||
|
return this.dispatch(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Hono = Hono;
|
10
cli/bench/testdata/npm/hono/dist/index.d.ts
vendored
Normal file
10
cli/bench/testdata/npm/hono/dist/index.d.ts
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/// <reference path="request.d.ts" />
|
||||||
|
import { Hono } from './hono';
|
||||||
|
export type { Handler, Next } from './hono';
|
||||||
|
export type { Context } from './context';
|
||||||
|
declare module './hono' {
|
||||||
|
interface Hono {
|
||||||
|
fire(): void;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export { Hono };
|
13
cli/bench/testdata/npm/hono/dist/index.js
vendored
Normal file
13
cli/bench/testdata/npm/hono/dist/index.js
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
"use strict";
|
||||||
|
// @denoify-ignore
|
||||||
|
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
||||||
|
/// <reference path="./request.ts" /> Import "declare global" for the Request interface.
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.Hono = void 0;
|
||||||
|
const hono_1 = require("./hono");
|
||||||
|
Object.defineProperty(exports, "Hono", { enumerable: true, get: function () { return hono_1.Hono; } });
|
||||||
|
hono_1.Hono.prototype.fire = function () {
|
||||||
|
addEventListener('fetch', (event) => {
|
||||||
|
void event.respondWith(this.handleEvent(event));
|
||||||
|
});
|
||||||
|
};
|
11
cli/bench/testdata/npm/hono/dist/middleware/basic-auth/index.d.ts
vendored
Normal file
11
cli/bench/testdata/npm/hono/dist/middleware/basic-auth/index.d.ts
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
export declare const basicAuth: (options: {
|
||||||
|
username: string;
|
||||||
|
password: string;
|
||||||
|
realm?: string;
|
||||||
|
hashFunction?: Function;
|
||||||
|
}, ...users: {
|
||||||
|
username: string;
|
||||||
|
password: string;
|
||||||
|
}[]) => (ctx: Context, next: Next) => Promise<void>;
|
48
cli/bench/testdata/npm/hono/dist/middleware/basic-auth/index.js
vendored
Normal file
48
cli/bench/testdata/npm/hono/dist/middleware/basic-auth/index.js
vendored
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.basicAuth = void 0;
|
||||||
|
const buffer_1 = require("../../utils/buffer");
|
||||||
|
const encode_1 = require("../../utils/encode");
|
||||||
|
const CREDENTIALS_REGEXP = /^ *(?:[Bb][Aa][Ss][Ii][Cc]) +([A-Za-z0-9._~+/-]+=*) *$/;
|
||||||
|
const USER_PASS_REGEXP = /^([^:]*):(.*)$/;
|
||||||
|
const auth = (req) => {
|
||||||
|
const match = CREDENTIALS_REGEXP.exec(req.headers.get('Authorization') || '');
|
||||||
|
if (!match) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const userPass = USER_PASS_REGEXP.exec((0, encode_1.decodeBase64)(match[1]));
|
||||||
|
if (!userPass) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return { username: userPass[1], password: userPass[2] };
|
||||||
|
};
|
||||||
|
const basicAuth = (options, ...users) => {
|
||||||
|
if (!options) {
|
||||||
|
throw new Error('basic auth middleware requires options for "username and password"');
|
||||||
|
}
|
||||||
|
if (!options.realm) {
|
||||||
|
options.realm = 'Secure Area';
|
||||||
|
}
|
||||||
|
users.unshift({ username: options.username, password: options.password });
|
||||||
|
return async (ctx, next) => {
|
||||||
|
const requestUser = auth(ctx.req);
|
||||||
|
if (requestUser) {
|
||||||
|
for (const user of users) {
|
||||||
|
const usernameEqual = await (0, buffer_1.timingSafeEqual)(user.username, requestUser.username, options.hashFunction);
|
||||||
|
const passwordEqual = await (0, buffer_1.timingSafeEqual)(user.password, requestUser.password, options.hashFunction);
|
||||||
|
if (usernameEqual && passwordEqual) {
|
||||||
|
// Authorized OK
|
||||||
|
await next();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx.res = new Response('Unauthorized', {
|
||||||
|
status: 401,
|
||||||
|
headers: {
|
||||||
|
'WWW-Authenticate': 'Basic realm="' + options.realm?.replace(/"/g, '\\"') + '"',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.basicAuth = basicAuth;
|
8
cli/bench/testdata/npm/hono/dist/middleware/bearer-auth/index.d.ts
vendored
Normal file
8
cli/bench/testdata/npm/hono/dist/middleware/bearer-auth/index.d.ts
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
export declare const bearerAuth: (options: {
|
||||||
|
token: string;
|
||||||
|
realm?: string;
|
||||||
|
prefix?: string;
|
||||||
|
hashFunction?: Function;
|
||||||
|
}) => (c: Context, next: Next) => Promise<void>;
|
61
cli/bench/testdata/npm/hono/dist/middleware/bearer-auth/index.js
vendored
Normal file
61
cli/bench/testdata/npm/hono/dist/middleware/bearer-auth/index.js
vendored
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.bearerAuth = void 0;
|
||||||
|
const buffer_1 = require("../../utils/buffer");
|
||||||
|
const TOKEN_STRINGS = '[A-Za-z0-9._~+/-]+=*';
|
||||||
|
const PREFIX = 'Bearer';
|
||||||
|
const bearerAuth = (options) => {
|
||||||
|
if (!options.token) {
|
||||||
|
throw new Error('bearer auth middleware requires options for "token"');
|
||||||
|
}
|
||||||
|
if (!options.realm) {
|
||||||
|
options.realm = '';
|
||||||
|
}
|
||||||
|
if (!options.prefix) {
|
||||||
|
options.prefix = PREFIX;
|
||||||
|
}
|
||||||
|
const realm = options.realm?.replace(/"/g, '\\"');
|
||||||
|
return async (c, next) => {
|
||||||
|
const headerToken = c.req.headers.get('Authorization');
|
||||||
|
if (!headerToken) {
|
||||||
|
// No Authorization header
|
||||||
|
c.res = new Response('Unauthorized', {
|
||||||
|
status: 401,
|
||||||
|
headers: {
|
||||||
|
'WWW-Authenticate': `${options.prefix} realm="` + realm + '"',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const regexp = new RegExp('^' + options.prefix + ' +(' + TOKEN_STRINGS + ') *$');
|
||||||
|
const match = regexp.exec(headerToken);
|
||||||
|
if (!match) {
|
||||||
|
// Invalid Request
|
||||||
|
c.res = new Response('Bad Request', {
|
||||||
|
status: 400,
|
||||||
|
headers: {
|
||||||
|
'WWW-Authenticate': `${options.prefix} error="invalid_request"`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const equal = await (0, buffer_1.timingSafeEqual)(options.token, match[1], options.hashFunction);
|
||||||
|
if (!equal) {
|
||||||
|
// Invalid Token
|
||||||
|
c.res = new Response('Unauthorized', {
|
||||||
|
status: 401,
|
||||||
|
headers: {
|
||||||
|
'WWW-Authenticate': `${options.prefix} error="invalid_token"`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Authorize OK
|
||||||
|
await next();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.bearerAuth = bearerAuth;
|
7
cli/bench/testdata/npm/hono/dist/middleware/cache/index.d.ts
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/middleware/cache/index.d.ts
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
export declare const cache: (options: {
|
||||||
|
cacheName: string;
|
||||||
|
wait?: boolean;
|
||||||
|
cacheControl?: string;
|
||||||
|
}) => (c: Context, next: Next) => Promise<Response | undefined>;
|
32
cli/bench/testdata/npm/hono/dist/middleware/cache/index.js
vendored
Normal file
32
cli/bench/testdata/npm/hono/dist/middleware/cache/index.js
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.cache = void 0;
|
||||||
|
const cache = (options) => {
|
||||||
|
if (options.wait === undefined) {
|
||||||
|
options.wait = false;
|
||||||
|
}
|
||||||
|
const addHeader = (response) => {
|
||||||
|
if (options.cacheControl)
|
||||||
|
response.headers.append('Cache-Control', options.cacheControl);
|
||||||
|
};
|
||||||
|
return async (c, next) => {
|
||||||
|
const key = c.req;
|
||||||
|
const cache = await caches.open(options.cacheName);
|
||||||
|
const response = await cache.match(key);
|
||||||
|
if (!response) {
|
||||||
|
await next();
|
||||||
|
addHeader(c.res);
|
||||||
|
const response = c.res.clone();
|
||||||
|
if (options.wait) {
|
||||||
|
await cache.put(key, response);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
c.executionCtx.waitUntil(cache.put(key, response));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.cache = cache;
|
8
cli/bench/testdata/npm/hono/dist/middleware/compress/index.d.ts
vendored
Normal file
8
cli/bench/testdata/npm/hono/dist/middleware/compress/index.d.ts
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
declare type EncodingType = 'gzip' | 'deflate';
|
||||||
|
interface CompressionOptions {
|
||||||
|
encoding?: EncodingType;
|
||||||
|
}
|
||||||
|
export declare const compress: (options?: CompressionOptions) => (ctx: Context, next: Next) => Promise<void>;
|
||||||
|
export {};
|
19
cli/bench/testdata/npm/hono/dist/middleware/compress/index.js
vendored
Normal file
19
cli/bench/testdata/npm/hono/dist/middleware/compress/index.js
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.compress = void 0;
|
||||||
|
const compress = (options) => {
|
||||||
|
return async (ctx, next) => {
|
||||||
|
await next();
|
||||||
|
const accepted = ctx.req.headers.get('Accept-Encoding');
|
||||||
|
const pattern = options?.encoding ?? /gzip|deflate/;
|
||||||
|
const match = accepted?.match(pattern);
|
||||||
|
if (!accepted || !match || !ctx.res.body) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const encoding = match[0];
|
||||||
|
const stream = new CompressionStream(encoding);
|
||||||
|
ctx.res = new Response(ctx.res.body.pipeThrough(stream), ctx.res.clone());
|
||||||
|
ctx.res.headers.set('Content-Encoding', encoding);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.compress = compress;
|
12
cli/bench/testdata/npm/hono/dist/middleware/cors/index.d.ts
vendored
Normal file
12
cli/bench/testdata/npm/hono/dist/middleware/cors/index.d.ts
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
declare type CORSOptions = {
|
||||||
|
origin: string;
|
||||||
|
allowMethods?: string[];
|
||||||
|
allowHeaders?: string[];
|
||||||
|
maxAge?: number;
|
||||||
|
credentials?: boolean;
|
||||||
|
exposeHeaders?: string[];
|
||||||
|
};
|
||||||
|
export declare const cors: (options?: CORSOptions) => (c: Context, next: Next) => Promise<void>;
|
||||||
|
export {};
|
61
cli/bench/testdata/npm/hono/dist/middleware/cors/index.js
vendored
Normal file
61
cli/bench/testdata/npm/hono/dist/middleware/cors/index.js
vendored
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.cors = void 0;
|
||||||
|
const cors = (options) => {
|
||||||
|
const defaults = {
|
||||||
|
origin: '*',
|
||||||
|
allowMethods: ['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH'],
|
||||||
|
allowHeaders: [],
|
||||||
|
exposeHeaders: [],
|
||||||
|
};
|
||||||
|
const opts = {
|
||||||
|
...defaults,
|
||||||
|
...options,
|
||||||
|
};
|
||||||
|
return async (c, next) => {
|
||||||
|
await next();
|
||||||
|
function set(key, value) {
|
||||||
|
c.res.headers.append(key, value);
|
||||||
|
}
|
||||||
|
set('Access-Control-Allow-Origin', opts.origin);
|
||||||
|
// Suppose the server sends a response with an Access-Control-Allow-Origin value with an explicit origin (rather than the "*" wildcard).
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
|
||||||
|
if (opts.origin !== '*') {
|
||||||
|
set('Vary', 'Origin');
|
||||||
|
}
|
||||||
|
if (opts.credentials) {
|
||||||
|
set('Access-Control-Allow-Credentials', 'true');
|
||||||
|
}
|
||||||
|
if (opts.exposeHeaders?.length) {
|
||||||
|
set('Access-Control-Expose-Headers', opts.exposeHeaders.join(','));
|
||||||
|
}
|
||||||
|
if (c.req.method === 'OPTIONS') {
|
||||||
|
// Preflight
|
||||||
|
if (opts.maxAge != null) {
|
||||||
|
set('Access-Control-Max-Age', opts.maxAge.toString());
|
||||||
|
}
|
||||||
|
if (opts.allowMethods?.length) {
|
||||||
|
set('Access-Control-Allow-Methods', opts.allowMethods.join(','));
|
||||||
|
}
|
||||||
|
let headers = opts.allowHeaders;
|
||||||
|
if (!headers?.length) {
|
||||||
|
const requestHeaders = c.req.headers.get('Access-Control-Request-Headers');
|
||||||
|
if (requestHeaders) {
|
||||||
|
headers = requestHeaders.split(/\s*,\s*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (headers?.length) {
|
||||||
|
set('Access-Control-Allow-Headers', headers.join(','));
|
||||||
|
set('Vary', 'Access-Control-Request-Headers');
|
||||||
|
}
|
||||||
|
c.res.headers.delete('Content-Length');
|
||||||
|
c.res.headers.delete('Content-Type');
|
||||||
|
c.res = new Response(null, {
|
||||||
|
headers: c.res.headers,
|
||||||
|
status: 204,
|
||||||
|
statusText: c.res.statusText,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.cors = cors;
|
7
cli/bench/testdata/npm/hono/dist/middleware/etag/index.d.ts
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/middleware/etag/index.d.ts
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
declare type ETagOptions = {
|
||||||
|
weak: boolean;
|
||||||
|
};
|
||||||
|
export declare const etag: (options?: ETagOptions) => (c: Context, next: Next) => Promise<void>;
|
||||||
|
export {};
|
27
cli/bench/testdata/npm/hono/dist/middleware/etag/index.js
vendored
Normal file
27
cli/bench/testdata/npm/hono/dist/middleware/etag/index.js
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.etag = void 0;
|
||||||
|
const crypto_1 = require("../../utils/crypto");
|
||||||
|
const etag = (options = { weak: false }) => {
|
||||||
|
return async (c, next) => {
|
||||||
|
const ifNoneMatch = c.req.header('If-None-Match') || c.req.header('if-none-match');
|
||||||
|
await next();
|
||||||
|
const res = c.res;
|
||||||
|
const clone = res.clone();
|
||||||
|
const hash = await (0, crypto_1.sha1)(res.body || '');
|
||||||
|
const etag = options.weak ? `W/"${hash}"` : `"${hash}"`;
|
||||||
|
if (ifNoneMatch && ifNoneMatch === etag) {
|
||||||
|
await clone.blob(); // Force using body
|
||||||
|
c.res = new Response(null, {
|
||||||
|
status: 304,
|
||||||
|
statusText: 'Not Modified',
|
||||||
|
});
|
||||||
|
c.res.headers.delete('Content-Length');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
c.res = new Response(clone.body, clone);
|
||||||
|
c.res.headers.append('ETag', etag);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.etag = etag;
|
3
cli/bench/testdata/npm/hono/dist/middleware/html/index.d.ts
vendored
Normal file
3
cli/bench/testdata/npm/hono/dist/middleware/html/index.d.ts
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import type { HtmlEscapedString } from '../../utils/html';
|
||||||
|
export declare const raw: (value: any) => HtmlEscapedString;
|
||||||
|
export declare const html: (strings: TemplateStringsArray, ...values: any[]) => HtmlEscapedString;
|
36
cli/bench/testdata/npm/hono/dist/middleware/html/index.js
vendored
Normal file
36
cli/bench/testdata/npm/hono/dist/middleware/html/index.js
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.html = exports.raw = void 0;
|
||||||
|
const html_1 = require("../../utils/html");
|
||||||
|
const raw = (value) => {
|
||||||
|
const escapedString = new String(value);
|
||||||
|
escapedString.isEscaped = true;
|
||||||
|
return escapedString;
|
||||||
|
};
|
||||||
|
exports.raw = raw;
|
||||||
|
const html = (strings, ...values) => {
|
||||||
|
const buffer = [''];
|
||||||
|
for (let i = 0, len = strings.length - 1; i < len; i++) {
|
||||||
|
buffer[0] += strings[i];
|
||||||
|
const children = values[i] instanceof Array ? values[i].flat(Infinity) : [values[i]];
|
||||||
|
for (let i = 0, len = children.length; i < len; i++) {
|
||||||
|
const child = children[i];
|
||||||
|
if (typeof child === 'string') {
|
||||||
|
(0, html_1.escapeToBuffer)(child, buffer);
|
||||||
|
}
|
||||||
|
else if (typeof child === 'boolean' || child === null || child === undefined) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if ((typeof child === 'object' && child.isEscaped) ||
|
||||||
|
typeof child === 'number') {
|
||||||
|
buffer[0] += child;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(0, html_1.escapeToBuffer)(child.toString(), buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buffer[0] += strings[strings.length - 1];
|
||||||
|
return (0, exports.raw)(buffer[0]);
|
||||||
|
};
|
||||||
|
exports.html = html;
|
26
cli/bench/testdata/npm/hono/dist/middleware/jsx/index.d.ts
vendored
Normal file
26
cli/bench/testdata/npm/hono/dist/middleware/jsx/index.d.ts
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import type { StringBuffer, HtmlEscaped, HtmlEscapedString } from '../../utils/html';
|
||||||
|
declare global {
|
||||||
|
namespace jsx.JSX {
|
||||||
|
interface IntrinsicElements {
|
||||||
|
[tagName: string]: Record<string, any>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare type Child = string | number | JSXNode | Child[];
|
||||||
|
export declare class JSXNode implements HtmlEscaped {
|
||||||
|
tag: string | Function;
|
||||||
|
props: Record<string, any>;
|
||||||
|
children: Child[];
|
||||||
|
isEscaped: true;
|
||||||
|
constructor(tag: string | Function, props: Record<string, any>, children: Child[]);
|
||||||
|
toString(): string;
|
||||||
|
toStringToBuffer(buffer: StringBuffer): void;
|
||||||
|
}
|
||||||
|
export { jsxFn as jsx };
|
||||||
|
declare const jsxFn: (tag: string | Function, props: Record<string, any>, ...children: (string | HtmlEscapedString)[]) => JSXNode;
|
||||||
|
declare type FC<T = Record<string, any>> = (props: T) => HtmlEscapedString;
|
||||||
|
export declare const memo: <T>(component: FC<T>, propsAreEqual?: (prevProps: Readonly<T>, nextProps: Readonly<T>) => boolean) => FC<T>;
|
||||||
|
export declare const Fragment: (props: {
|
||||||
|
key?: string;
|
||||||
|
children?: any;
|
||||||
|
}) => JSXNode;
|
193
cli/bench/testdata/npm/hono/dist/middleware/jsx/index.js
vendored
Normal file
193
cli/bench/testdata/npm/hono/dist/middleware/jsx/index.js
vendored
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.Fragment = exports.memo = exports.jsx = exports.JSXNode = void 0;
|
||||||
|
const html_1 = require("../../utils/html");
|
||||||
|
const emptyTags = [
|
||||||
|
'area',
|
||||||
|
'base',
|
||||||
|
'br',
|
||||||
|
'col',
|
||||||
|
'embed',
|
||||||
|
'hr',
|
||||||
|
'img',
|
||||||
|
'input',
|
||||||
|
'keygen',
|
||||||
|
'link',
|
||||||
|
'meta',
|
||||||
|
'param',
|
||||||
|
'source',
|
||||||
|
'track',
|
||||||
|
'wbr',
|
||||||
|
];
|
||||||
|
const booleanAttributes = [
|
||||||
|
'allowfullscreen',
|
||||||
|
'async',
|
||||||
|
'autofocus',
|
||||||
|
'autoplay',
|
||||||
|
'checked',
|
||||||
|
'controls',
|
||||||
|
'default',
|
||||||
|
'defer',
|
||||||
|
'disabled',
|
||||||
|
'formnovalidate',
|
||||||
|
'hidden',
|
||||||
|
'inert',
|
||||||
|
'ismap',
|
||||||
|
'itemscope',
|
||||||
|
'loop',
|
||||||
|
'multiple',
|
||||||
|
'muted',
|
||||||
|
'nomodule',
|
||||||
|
'novalidate',
|
||||||
|
'open',
|
||||||
|
'playsinline',
|
||||||
|
'readonly',
|
||||||
|
'required',
|
||||||
|
'reversed',
|
||||||
|
'selected',
|
||||||
|
];
|
||||||
|
const childrenToStringToBuffer = (children, buffer) => {
|
||||||
|
for (let i = 0, len = children.length; i < len; i++) {
|
||||||
|
const child = children[i];
|
||||||
|
if (typeof child === 'string') {
|
||||||
|
(0, html_1.escapeToBuffer)(child, buffer);
|
||||||
|
}
|
||||||
|
else if (typeof child === 'boolean' || child === null || child === undefined) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (child instanceof JSXNode) {
|
||||||
|
child.toStringToBuffer(buffer);
|
||||||
|
}
|
||||||
|
else if (typeof child === 'number' || child.isEscaped) {
|
||||||
|
buffer[0] += child;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// `child` type is `Child[]`, so stringify recursively
|
||||||
|
childrenToStringToBuffer(child, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class JSXNode {
|
||||||
|
constructor(tag, props, children) {
|
||||||
|
this.isEscaped = true;
|
||||||
|
this.tag = tag;
|
||||||
|
this.props = props;
|
||||||
|
this.children = children;
|
||||||
|
}
|
||||||
|
toString() {
|
||||||
|
const buffer = [''];
|
||||||
|
this.toStringToBuffer(buffer);
|
||||||
|
return buffer[0];
|
||||||
|
}
|
||||||
|
toStringToBuffer(buffer) {
|
||||||
|
const tag = this.tag;
|
||||||
|
const props = this.props;
|
||||||
|
let { children } = this;
|
||||||
|
buffer[0] += `<${tag}`;
|
||||||
|
const propsKeys = Object.keys(props || {});
|
||||||
|
for (let i = 0, len = propsKeys.length; i < len; i++) {
|
||||||
|
const v = props[propsKeys[i]];
|
||||||
|
if (typeof v === 'string') {
|
||||||
|
buffer[0] += ` ${propsKeys[i]}="`;
|
||||||
|
(0, html_1.escapeToBuffer)(v, buffer);
|
||||||
|
buffer[0] += '"';
|
||||||
|
}
|
||||||
|
else if (typeof v === 'number') {
|
||||||
|
buffer[0] += ` ${propsKeys[i]}="${v}"`;
|
||||||
|
}
|
||||||
|
else if (v === null || v === undefined) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
else if (typeof v === 'boolean' && booleanAttributes.includes(propsKeys[i])) {
|
||||||
|
if (v) {
|
||||||
|
buffer[0] += ` ${propsKeys[i]}=""`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (propsKeys[i] === 'dangerouslySetInnerHTML') {
|
||||||
|
if (children.length > 0) {
|
||||||
|
throw 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.';
|
||||||
|
}
|
||||||
|
const escapedString = new String(v.__html);
|
||||||
|
escapedString.isEscaped = true;
|
||||||
|
children = [escapedString];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
buffer[0] += ` ${propsKeys[i]}="`;
|
||||||
|
(0, html_1.escapeToBuffer)(v.toString(), buffer);
|
||||||
|
buffer[0] += '"';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (emptyTags.includes(tag)) {
|
||||||
|
buffer[0] += '/>';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
buffer[0] += '>';
|
||||||
|
childrenToStringToBuffer(children, buffer);
|
||||||
|
buffer[0] += `</${tag}>`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.JSXNode = JSXNode;
|
||||||
|
class JSXFunctionNode extends JSXNode {
|
||||||
|
toStringToBuffer(buffer) {
|
||||||
|
const { children } = this;
|
||||||
|
const res = this.tag.call(null, {
|
||||||
|
...this.props,
|
||||||
|
children: children.length <= 1 ? children[0] : children,
|
||||||
|
});
|
||||||
|
if (res instanceof JSXNode) {
|
||||||
|
res.toStringToBuffer(buffer);
|
||||||
|
}
|
||||||
|
else if (typeof res === 'number' || res.isEscaped) {
|
||||||
|
buffer[0] += res;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(0, html_1.escapeToBuffer)(res, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class JSXFragmentNode extends JSXNode {
|
||||||
|
toStringToBuffer(buffer) {
|
||||||
|
childrenToStringToBuffer(this.children, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const jsxFn = (tag, props, ...children) => {
|
||||||
|
if (typeof tag === 'function') {
|
||||||
|
return new JSXFunctionNode(tag, props, children);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new JSXNode(tag, props, children);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
exports.jsx = jsxFn;
|
||||||
|
const shallowEqual = (a, b) => {
|
||||||
|
if (a === b) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
const aKeys = Object.keys(a);
|
||||||
|
const bKeys = Object.keys(b);
|
||||||
|
if (aKeys.length !== bKeys.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (let i = 0, len = aKeys.length; i < len; i++) {
|
||||||
|
if (a[aKeys[i]] !== b[aKeys[i]]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
const memo = (component, propsAreEqual = shallowEqual) => {
|
||||||
|
let computed = undefined;
|
||||||
|
let prevProps = undefined;
|
||||||
|
return ((props) => {
|
||||||
|
if (prevProps && !propsAreEqual(prevProps, props)) {
|
||||||
|
computed = undefined;
|
||||||
|
}
|
||||||
|
prevProps = props;
|
||||||
|
return (computed || (computed = component(props)));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
exports.memo = memo;
|
||||||
|
const Fragment = (props) => {
|
||||||
|
return new JSXFragmentNode('', {}, props.children || []);
|
||||||
|
};
|
||||||
|
exports.Fragment = Fragment;
|
2
cli/bench/testdata/npm/hono/dist/middleware/jsx/jsx-dev-runtime.d.ts
vendored
Normal file
2
cli/bench/testdata/npm/hono/dist/middleware/jsx/jsx-dev-runtime.d.ts
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
import type { JSXNode } from '.';
|
||||||
|
export declare function jsxDEV(tag: string | Function, props: Record<string, any>): JSXNode;
|
10
cli/bench/testdata/npm/hono/dist/middleware/jsx/jsx-dev-runtime.js
vendored
Normal file
10
cli/bench/testdata/npm/hono/dist/middleware/jsx/jsx-dev-runtime.js
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.jsxDEV = void 0;
|
||||||
|
const _1 = require(".");
|
||||||
|
function jsxDEV(tag, props) {
|
||||||
|
const children = props.children ?? [];
|
||||||
|
delete props['children'];
|
||||||
|
return (0, _1.jsx)(tag, props, children);
|
||||||
|
}
|
||||||
|
exports.jsxDEV = jsxDEV;
|
2
cli/bench/testdata/npm/hono/dist/middleware/jsx/jsx-runtime.d.ts
vendored
Normal file
2
cli/bench/testdata/npm/hono/dist/middleware/jsx/jsx-runtime.d.ts
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
export { jsxDEV as jsx } from './jsx-dev-runtime';
|
||||||
|
export { jsxDEV as jsxs } from './jsx-dev-runtime';
|
7
cli/bench/testdata/npm/hono/dist/middleware/jsx/jsx-runtime.js
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/middleware/jsx/jsx-runtime.js
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.jsxs = exports.jsx = void 0;
|
||||||
|
var jsx_dev_runtime_1 = require("./jsx-dev-runtime");
|
||||||
|
Object.defineProperty(exports, "jsx", { enumerable: true, get: function () { return jsx_dev_runtime_1.jsxDEV; } });
|
||||||
|
var jsx_dev_runtime_2 = require("./jsx-dev-runtime");
|
||||||
|
Object.defineProperty(exports, "jsxs", { enumerable: true, get: function () { return jsx_dev_runtime_2.jsxDEV; } });
|
7
cli/bench/testdata/npm/hono/dist/middleware/jwt/index.d.ts
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/middleware/jwt/index.d.ts
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
export declare const jwt: (options: {
|
||||||
|
secret: string;
|
||||||
|
cookie?: string;
|
||||||
|
alg?: string;
|
||||||
|
}) => (ctx: Context, next: Next) => Promise<void>;
|
63
cli/bench/testdata/npm/hono/dist/middleware/jwt/index.js
vendored
Normal file
63
cli/bench/testdata/npm/hono/dist/middleware/jwt/index.js
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.jwt = void 0;
|
||||||
|
const jwt_1 = require("../../utils/jwt");
|
||||||
|
const jwt = (options) => {
|
||||||
|
if (!options) {
|
||||||
|
throw new Error('JWT auth middleware requires options for "secret');
|
||||||
|
}
|
||||||
|
if (!crypto.subtle || !crypto.subtle.importKey) {
|
||||||
|
throw new Error('`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.');
|
||||||
|
}
|
||||||
|
return async (ctx, next) => {
|
||||||
|
const credentials = ctx.req.headers.get('Authorization');
|
||||||
|
let token;
|
||||||
|
if (credentials) {
|
||||||
|
const parts = credentials.split(/\s+/);
|
||||||
|
if (parts.length !== 2) {
|
||||||
|
ctx.res = new Response('Unauthorized', {
|
||||||
|
status: 401,
|
||||||
|
headers: {
|
||||||
|
'WWW-Authenticate': `Bearer realm="${ctx.req.url}",error="invalid_request",error_description="invalid credentials structure"`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
token = parts[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (options.cookie) {
|
||||||
|
token = ctx.req.cookie(options.cookie);
|
||||||
|
}
|
||||||
|
if (!token) {
|
||||||
|
ctx.res = new Response('Unauthorized', {
|
||||||
|
status: 401,
|
||||||
|
headers: {
|
||||||
|
'WWW-Authenticate': `Bearer realm="${ctx.req.url}",error="invalid_request",error_description="no authorization included in request"`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let authorized = false;
|
||||||
|
let msg = '';
|
||||||
|
try {
|
||||||
|
authorized = await jwt_1.Jwt.verify(token, options.secret, options.alg);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
msg = `${e}`;
|
||||||
|
}
|
||||||
|
if (!authorized) {
|
||||||
|
ctx.res = new Response('Unauthorized', {
|
||||||
|
status: 401,
|
||||||
|
statusText: msg,
|
||||||
|
headers: {
|
||||||
|
'WWW-Authenticate': `Bearer realm="${ctx.req.url}",error="invalid_token",error_description="token verification failure"`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await next();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.jwt = jwt;
|
5
cli/bench/testdata/npm/hono/dist/middleware/logger/index.d.ts
vendored
Normal file
5
cli/bench/testdata/npm/hono/dist/middleware/logger/index.d.ts
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
declare type PrintFunc = (str: string, ...rest: string[]) => void;
|
||||||
|
export declare const logger: (fn?: PrintFunc) => (c: Context, next: Next) => Promise<void>;
|
||||||
|
export {};
|
49
cli/bench/testdata/npm/hono/dist/middleware/logger/index.js
vendored
Normal file
49
cli/bench/testdata/npm/hono/dist/middleware/logger/index.js
vendored
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.logger = void 0;
|
||||||
|
const url_1 = require("../../utils/url");
|
||||||
|
var LogPrefix;
|
||||||
|
(function (LogPrefix) {
|
||||||
|
LogPrefix["Outgoing"] = "-->";
|
||||||
|
LogPrefix["Incoming"] = "<--";
|
||||||
|
LogPrefix["Error"] = "xxx";
|
||||||
|
})(LogPrefix || (LogPrefix = {}));
|
||||||
|
const humanize = (times) => {
|
||||||
|
const [delimiter, separator] = [',', '.'];
|
||||||
|
const orderTimes = times.map((v) => v.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1' + delimiter));
|
||||||
|
return orderTimes.join(separator);
|
||||||
|
};
|
||||||
|
const time = (start) => {
|
||||||
|
const delta = Date.now() - start;
|
||||||
|
return humanize([delta < 1000 ? delta + 'ms' : Math.round(delta / 1000) + 's']);
|
||||||
|
};
|
||||||
|
const colorStatus = (status) => {
|
||||||
|
const out = {
|
||||||
|
7: `\x1b[35m${status}\x1b[0m`,
|
||||||
|
5: `\x1b[31m${status}\x1b[0m`,
|
||||||
|
4: `\x1b[33m${status}\x1b[0m`,
|
||||||
|
3: `\x1b[36m${status}\x1b[0m`,
|
||||||
|
2: `\x1b[32m${status}\x1b[0m`,
|
||||||
|
1: `\x1b[32m${status}\x1b[0m`,
|
||||||
|
0: `\x1b[33m${status}\x1b[0m`,
|
||||||
|
};
|
||||||
|
const calculateStatus = (status / 100) | 0;
|
||||||
|
return out[calculateStatus];
|
||||||
|
};
|
||||||
|
function log(fn, prefix, method, path, status = 0, elapsed) {
|
||||||
|
const out = prefix === LogPrefix.Incoming
|
||||||
|
? ` ${prefix} ${method} ${path}`
|
||||||
|
: ` ${prefix} ${method} ${path} ${colorStatus(status)} ${elapsed}`;
|
||||||
|
fn(out);
|
||||||
|
}
|
||||||
|
const logger = (fn = console.log) => {
|
||||||
|
return async (c, next) => {
|
||||||
|
const { method } = c.req;
|
||||||
|
const path = (0, url_1.getPathFromURL)(c.req.url);
|
||||||
|
log(fn, LogPrefix.Incoming, method, path);
|
||||||
|
const start = Date.now();
|
||||||
|
await next();
|
||||||
|
log(fn, LogPrefix.Outgoing, method, path, c.res.status, time(start));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.logger = logger;
|
3
cli/bench/testdata/npm/hono/dist/middleware/powered-by/index.d.ts
vendored
Normal file
3
cli/bench/testdata/npm/hono/dist/middleware/powered-by/index.d.ts
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
export declare const poweredBy: () => (c: Context, next: Next) => Promise<void>;
|
10
cli/bench/testdata/npm/hono/dist/middleware/powered-by/index.js
vendored
Normal file
10
cli/bench/testdata/npm/hono/dist/middleware/powered-by/index.js
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.poweredBy = void 0;
|
||||||
|
const poweredBy = () => {
|
||||||
|
return async (c, next) => {
|
||||||
|
await next();
|
||||||
|
c.res.headers.append('X-Powered-By', 'Hono');
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.poweredBy = poweredBy;
|
7
cli/bench/testdata/npm/hono/dist/middleware/pretty-json/index.d.ts
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/middleware/pretty-json/index.d.ts
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
declare type prettyOptions = {
|
||||||
|
space: number;
|
||||||
|
};
|
||||||
|
export declare const prettyJSON: (options?: prettyOptions) => (c: Context, next: Next) => Promise<void>;
|
||||||
|
export {};
|
11
cli/bench/testdata/npm/hono/dist/middleware/pretty-json/index.js
vendored
Normal file
11
cli/bench/testdata/npm/hono/dist/middleware/pretty-json/index.js
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.prettyJSON = void 0;
|
||||||
|
const prettyJSON = (options = { space: 2 }) => {
|
||||||
|
return async (c, next) => {
|
||||||
|
const pretty = c.req.query('pretty') || c.req.query('pretty') === '' ? true : false;
|
||||||
|
c.pretty(pretty, options.space);
|
||||||
|
await next();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.prettyJSON = prettyJSON;
|
7
cli/bench/testdata/npm/hono/dist/middleware/serve-static/bun.d.ts
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/middleware/serve-static/bun.d.ts
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import type { Context } from '../../context';
|
||||||
|
import type { Next } from '../../hono';
|
||||||
|
export declare type ServeStaticOptions = {
|
||||||
|
root?: string;
|
||||||
|
path?: string;
|
||||||
|
};
|
||||||
|
export declare const serveStatic: (options?: ServeStaticOptions) => (c: Context, next: Next) => Promise<Response | undefined>;
|
38
cli/bench/testdata/npm/hono/dist/middleware/serve-static/bun.js
vendored
Normal file
38
cli/bench/testdata/npm/hono/dist/middleware/serve-static/bun.js
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.serveStatic = void 0;
|
||||||
|
const filepath_1 = require("../../utils/filepath");
|
||||||
|
const mime_1 = require("../../utils/mime");
|
||||||
|
// @ts-ignore
|
||||||
|
const { file } = Bun;
|
||||||
|
const DEFAULT_DOCUMENT = 'index.html';
|
||||||
|
const serveStatic = (options = { root: '' }) => {
|
||||||
|
return async (c, next) => {
|
||||||
|
// Do nothing if Response is already set
|
||||||
|
if (c.res && c.finalized) {
|
||||||
|
await next();
|
||||||
|
}
|
||||||
|
const url = new URL(c.req.url);
|
||||||
|
let path = (0, filepath_1.getFilePath)({
|
||||||
|
filename: options.path ?? url.pathname,
|
||||||
|
root: options.root,
|
||||||
|
defaultDocument: DEFAULT_DOCUMENT,
|
||||||
|
});
|
||||||
|
path = `./${path}`;
|
||||||
|
const content = file(path);
|
||||||
|
if (content) {
|
||||||
|
const mimeType = (0, mime_1.getMimeType)(path);
|
||||||
|
if (mimeType) {
|
||||||
|
c.header('Content-Type', mimeType);
|
||||||
|
}
|
||||||
|
// Return Response object
|
||||||
|
return c.body(content);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.warn(`Static file: ${path} is not found`);
|
||||||
|
await next();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.serveStatic = serveStatic;
|
1
cli/bench/testdata/npm/hono/dist/middleware/serve-static/index.d.ts
vendored
Normal file
1
cli/bench/testdata/npm/hono/dist/middleware/serve-static/index.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export { serveStatic } from './serve-static';
|
5
cli/bench/testdata/npm/hono/dist/middleware/serve-static/index.js
vendored
Normal file
5
cli/bench/testdata/npm/hono/dist/middleware/serve-static/index.js
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.serveStatic = void 0;
|
||||||
|
var serve_static_1 = require("./serve-static");
|
||||||
|
Object.defineProperty(exports, "serveStatic", { enumerable: true, get: function () { return serve_static_1.serveStatic; } });
|
5
cli/bench/testdata/npm/hono/dist/middleware/serve-static/module.d.mts
vendored
Normal file
5
cli/bench/testdata/npm/hono/dist/middleware/serve-static/module.d.mts
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import type { ServeStaticOptions } from './serve-static';
|
||||||
|
declare const module: (options?: ServeStaticOptions) => import("../../hono").Handler<string, {
|
||||||
|
[x: string]: any;
|
||||||
|
}>;
|
||||||
|
export { module as serveStatic };
|
13
cli/bench/testdata/npm/hono/dist/middleware/serve-static/module.mjs
vendored
Normal file
13
cli/bench/testdata/npm/hono/dist/middleware/serve-static/module.mjs
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore
|
||||||
|
// For ES module mode
|
||||||
|
import manifest from '__STATIC_CONTENT_MANIFEST';
|
||||||
|
import { serveStatic } from './serve-static';
|
||||||
|
const module = (options = { root: '' }) => {
|
||||||
|
return serveStatic({
|
||||||
|
root: options.root,
|
||||||
|
path: options.path,
|
||||||
|
manifest: options.manifest ? options.manifest : manifest,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export { module as serveStatic };
|
9
cli/bench/testdata/npm/hono/dist/middleware/serve-static/serve-static.d.ts
vendored
Normal file
9
cli/bench/testdata/npm/hono/dist/middleware/serve-static/serve-static.d.ts
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
/// <reference types="@cloudflare/workers-types" />
|
||||||
|
import type { Handler } from '../../hono';
|
||||||
|
export declare type ServeStaticOptions = {
|
||||||
|
root?: string;
|
||||||
|
path?: string;
|
||||||
|
manifest?: object | string;
|
||||||
|
namespace?: KVNamespace;
|
||||||
|
};
|
||||||
|
export declare const serveStatic: (options?: ServeStaticOptions) => Handler;
|
40
cli/bench/testdata/npm/hono/dist/middleware/serve-static/serve-static.js
vendored
Normal file
40
cli/bench/testdata/npm/hono/dist/middleware/serve-static/serve-static.js
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.serveStatic = void 0;
|
||||||
|
const cloudflare_1 = require("../../utils/cloudflare");
|
||||||
|
const filepath_1 = require("../../utils/filepath");
|
||||||
|
const mime_1 = require("../../utils/mime");
|
||||||
|
const DEFAULT_DOCUMENT = 'index.html';
|
||||||
|
// This middleware is available only on Cloudflare Workers.
|
||||||
|
const serveStatic = (options = { root: '' }) => {
|
||||||
|
return async (c, next) => {
|
||||||
|
// Do nothing if Response is already set
|
||||||
|
if (c.res && c.finalized) {
|
||||||
|
await next();
|
||||||
|
}
|
||||||
|
const url = new URL(c.req.url);
|
||||||
|
const path = (0, filepath_1.getFilePath)({
|
||||||
|
filename: options.path ?? url.pathname,
|
||||||
|
root: options.root,
|
||||||
|
defaultDocument: DEFAULT_DOCUMENT,
|
||||||
|
});
|
||||||
|
const content = await (0, cloudflare_1.getContentFromKVAsset)(path, {
|
||||||
|
manifest: options.manifest,
|
||||||
|
namespace: options.namespace ? options.namespace : c.env ? c.env.__STATIC_CONTENT : undefined,
|
||||||
|
});
|
||||||
|
if (content) {
|
||||||
|
const mimeType = (0, mime_1.getMimeType)(path);
|
||||||
|
if (mimeType) {
|
||||||
|
c.header('Content-Type', mimeType);
|
||||||
|
}
|
||||||
|
// Return Response object
|
||||||
|
return c.body(content);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.warn(`Static file: ${path} is not found`);
|
||||||
|
await next();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
exports.serveStatic = serveStatic;
|
32
cli/bench/testdata/npm/hono/dist/request.d.ts
vendored
Normal file
32
cli/bench/testdata/npm/hono/dist/request.d.ts
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import type { Body } from './utils/body';
|
||||||
|
import type { Cookie } from './utils/cookie';
|
||||||
|
declare global {
|
||||||
|
interface Request<ParamKeyType extends string = string> {
|
||||||
|
param: {
|
||||||
|
(key: ParamKeyType): string;
|
||||||
|
(): Record<ParamKeyType, string>;
|
||||||
|
};
|
||||||
|
paramData?: Record<ParamKeyType, string>;
|
||||||
|
query: {
|
||||||
|
(key: string): string;
|
||||||
|
(): Record<string, string>;
|
||||||
|
};
|
||||||
|
queries: {
|
||||||
|
(key: string): string[];
|
||||||
|
(): Record<string, string[]>;
|
||||||
|
};
|
||||||
|
header: {
|
||||||
|
(name: string): string;
|
||||||
|
(): Record<string, string>;
|
||||||
|
};
|
||||||
|
cookie: {
|
||||||
|
(name: string): string;
|
||||||
|
(): Cookie;
|
||||||
|
};
|
||||||
|
parsedBody?: Promise<Body>;
|
||||||
|
parseBody: {
|
||||||
|
(): Promise<Body>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export declare function extendRequestPrototype(): void;
|
78
cli/bench/testdata/npm/hono/dist/request.js
vendored
Normal file
78
cli/bench/testdata/npm/hono/dist/request.js
vendored
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.extendRequestPrototype = void 0;
|
||||||
|
const body_1 = require("./utils/body");
|
||||||
|
const cookie_1 = require("./utils/cookie");
|
||||||
|
function extendRequestPrototype() {
|
||||||
|
if (!!Request.prototype.param) {
|
||||||
|
// already extended
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Request.prototype.param = function (key) {
|
||||||
|
if (this.paramData) {
|
||||||
|
if (key) {
|
||||||
|
return this.paramData[key];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return this.paramData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
Request.prototype.header = function (name) {
|
||||||
|
if (name) {
|
||||||
|
return this.headers.get(name);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const result = {};
|
||||||
|
for (const [key, value] of this.headers) {
|
||||||
|
result[key] = value;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Request.prototype.query = function (key) {
|
||||||
|
const url = new URL(this.url);
|
||||||
|
if (key) {
|
||||||
|
return url.searchParams.get(key);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const result = {};
|
||||||
|
for (const key of url.searchParams.keys()) {
|
||||||
|
result[key] = url.searchParams.get(key) || '';
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Request.prototype.queries = function (key) {
|
||||||
|
const url = new URL(this.url);
|
||||||
|
if (key) {
|
||||||
|
return url.searchParams.getAll(key);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const result = {};
|
||||||
|
for (const key of url.searchParams.keys()) {
|
||||||
|
result[key] = url.searchParams.getAll(key);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Request.prototype.cookie = function (key) {
|
||||||
|
const cookie = this.headers.get('Cookie') || '';
|
||||||
|
const obj = (0, cookie_1.parse)(cookie);
|
||||||
|
if (key) {
|
||||||
|
const value = obj[key];
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Request.prototype.parseBody = function () {
|
||||||
|
if (!this.parsedBody) {
|
||||||
|
this.parsedBody = (0, body_1.parseBody)(this);
|
||||||
|
}
|
||||||
|
return this.parsedBody;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
exports.extendRequestPrototype = extendRequestPrototype;
|
10
cli/bench/testdata/npm/hono/dist/router.d.ts
vendored
Normal file
10
cli/bench/testdata/npm/hono/dist/router.d.ts
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
export declare const METHOD_NAME_ALL: "ALL";
|
||||||
|
export declare const METHOD_NAME_ALL_LOWERCASE: "all";
|
||||||
|
export interface Router<T> {
|
||||||
|
add(method: string, path: string, handler: T): void;
|
||||||
|
match(method: string, path: string): Result<T> | null;
|
||||||
|
}
|
||||||
|
export interface Result<T> {
|
||||||
|
handlers: T[];
|
||||||
|
params: Record<string, string>;
|
||||||
|
}
|
5
cli/bench/testdata/npm/hono/dist/router.js
vendored
Normal file
5
cli/bench/testdata/npm/hono/dist/router.js
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.METHOD_NAME_ALL_LOWERCASE = exports.METHOD_NAME_ALL = void 0;
|
||||||
|
exports.METHOD_NAME_ALL = 'ALL';
|
||||||
|
exports.METHOD_NAME_ALL_LOWERCASE = 'all';
|
1
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/index.d.ts
vendored
Normal file
1
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/index.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export { RegExpRouter } from './router';
|
5
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/index.js
vendored
Normal file
5
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/index.js
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.RegExpRouter = void 0;
|
||||||
|
var router_1 = require("./router");
|
||||||
|
Object.defineProperty(exports, "RegExpRouter", { enumerable: true, get: function () { return router_1.RegExpRouter; } });
|
14
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/node.d.ts
vendored
Normal file
14
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/node.d.ts
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
export declare type ParamMap = Array<[string, number]>;
|
||||||
|
export interface Context {
|
||||||
|
varIndex: number;
|
||||||
|
}
|
||||||
|
export declare class Node {
|
||||||
|
index?: number;
|
||||||
|
varIndex?: number;
|
||||||
|
children: Record<string, Node>;
|
||||||
|
reverse: boolean;
|
||||||
|
constructor({ reverse }?: Partial<Node>);
|
||||||
|
newChildNode(): Node;
|
||||||
|
insert(tokens: readonly string[], index: number, paramMap: ParamMap, context: Context): void;
|
||||||
|
buildRegExpStr(): string;
|
||||||
|
}
|
100
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/node.js
vendored
Normal file
100
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/node.js
vendored
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.Node = void 0;
|
||||||
|
const LABEL_REG_EXP_STR = '[^/]+';
|
||||||
|
const ONLY_WILDCARD_REG_EXP_STR = '.*';
|
||||||
|
const TAIL_WILDCARD_REG_EXP_STR = '(?:|/.*)';
|
||||||
|
/**
|
||||||
|
* Sort order:
|
||||||
|
* 1. literal
|
||||||
|
* 2. special pattern (e.g. :label{[0-9]+})
|
||||||
|
* 3. common label pattern (e.g. :label)
|
||||||
|
* 4. wildcard
|
||||||
|
*/
|
||||||
|
function compareKey(a, b) {
|
||||||
|
if (a.length === 1) {
|
||||||
|
return b.length === 1 ? (a < b ? -1 : 1) : -1;
|
||||||
|
}
|
||||||
|
if (b.length === 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// wildcard
|
||||||
|
if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// label
|
||||||
|
if (a === LABEL_REG_EXP_STR) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (b === LABEL_REG_EXP_STR) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return a.length === b.length ? (a < b ? -1 : 1) : b.length - a.length;
|
||||||
|
}
|
||||||
|
class Node {
|
||||||
|
constructor({ reverse } = { reverse: false }) {
|
||||||
|
this.children = {};
|
||||||
|
this.reverse = reverse;
|
||||||
|
}
|
||||||
|
newChildNode() {
|
||||||
|
return new Node({ reverse: this.reverse });
|
||||||
|
}
|
||||||
|
insert(tokens, index, paramMap, context) {
|
||||||
|
var _a;
|
||||||
|
if (tokens.length === 0) {
|
||||||
|
this.index = index;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const [token, ...restTokens] = tokens;
|
||||||
|
const pattern = token === '*'
|
||||||
|
? restTokens.length === 0
|
||||||
|
? ['', '', ONLY_WILDCARD_REG_EXP_STR] // '*' matches to all the trailing paths
|
||||||
|
: ['', '', LABEL_REG_EXP_STR]
|
||||||
|
: token === '/*'
|
||||||
|
? ['', '', TAIL_WILDCARD_REG_EXP_STR] // '/path/to/*' is /\/path\/to(?:|/.*)$
|
||||||
|
: token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);
|
||||||
|
let node;
|
||||||
|
if (pattern) {
|
||||||
|
const name = pattern[1];
|
||||||
|
const regexpStr = pattern[2] || LABEL_REG_EXP_STR;
|
||||||
|
node = this.children[regexpStr];
|
||||||
|
if (!node) {
|
||||||
|
node = this.children[regexpStr] = this.newChildNode();
|
||||||
|
if (name !== '') {
|
||||||
|
node.varIndex = context.varIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (name !== '') {
|
||||||
|
paramMap.push([name, node.varIndex]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
node = (_a = this.children)[token] || (_a[token] = this.newChildNode());
|
||||||
|
}
|
||||||
|
node.insert(restTokens, index, paramMap, context);
|
||||||
|
}
|
||||||
|
buildRegExpStr() {
|
||||||
|
let childKeys = Object.keys(this.children).sort(compareKey);
|
||||||
|
if (this.reverse) {
|
||||||
|
childKeys = childKeys.reverse();
|
||||||
|
}
|
||||||
|
const strList = childKeys.map((k) => {
|
||||||
|
const c = this.children[k];
|
||||||
|
return (typeof c.varIndex === 'number' ? `(${k})@${c.varIndex}` : k) + c.buildRegExpStr();
|
||||||
|
});
|
||||||
|
if (typeof this.index === 'number') {
|
||||||
|
strList.unshift(`#${this.index}`);
|
||||||
|
}
|
||||||
|
if (strList.length === 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (strList.length === 1) {
|
||||||
|
return strList[0];
|
||||||
|
}
|
||||||
|
return '(?:' + strList.join('|') + ')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Node = Node;
|
34
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/router.d.ts
vendored
Normal file
34
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/router.d.ts
vendored
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import type { Router, Result } from '../../router';
|
||||||
|
interface Hint {
|
||||||
|
components: string[];
|
||||||
|
regExpComponents: Array<true | string>;
|
||||||
|
componentsLength: number;
|
||||||
|
endWithWildcard: boolean;
|
||||||
|
paramIndexList: number[];
|
||||||
|
maybeHandler: boolean;
|
||||||
|
namedParams: [number, string, string][];
|
||||||
|
}
|
||||||
|
interface HandlerWithSortIndex<T> {
|
||||||
|
handler: T;
|
||||||
|
index: number;
|
||||||
|
}
|
||||||
|
interface Route<T> {
|
||||||
|
method: string;
|
||||||
|
path: string;
|
||||||
|
hint: Hint;
|
||||||
|
handlers: HandlerWithSortIndex<T>[];
|
||||||
|
middleware: HandlerWithSortIndex<T>[];
|
||||||
|
paramAliasMap: Record<string, string[]>;
|
||||||
|
}
|
||||||
|
export declare class RegExpRouter<T> implements Router<T> {
|
||||||
|
routeData?: {
|
||||||
|
index: number;
|
||||||
|
routes: Route<T>[];
|
||||||
|
methods: Set<string>;
|
||||||
|
};
|
||||||
|
add(method: string, path: string, handler: T): void;
|
||||||
|
match(method: string, path: string): Result<T> | null;
|
||||||
|
private buildAllMatchers;
|
||||||
|
private buildMatcher;
|
||||||
|
}
|
||||||
|
export {};
|
360
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/router.js
vendored
Normal file
360
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/router.js
vendored
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.RegExpRouter = void 0;
|
||||||
|
const router_1 = require("../../router");
|
||||||
|
const trie_1 = require("./trie");
|
||||||
|
const emptyParam = {};
|
||||||
|
const nullMatcher = [/^$/, []];
|
||||||
|
function initHint(path) {
|
||||||
|
const components = path.match(/\/(?::\w+{[^}]+}|[^\/]*)/g) || [];
|
||||||
|
let componentsLength = components.length;
|
||||||
|
const paramIndexList = [];
|
||||||
|
const regExpComponents = [];
|
||||||
|
const namedParams = [];
|
||||||
|
for (let i = 0, len = components.length; i < len; i++) {
|
||||||
|
if (i === len - 1 && components[i] === '/*') {
|
||||||
|
componentsLength--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const m = components[i].match(/^\/:(\w+)({[^}]+})?/);
|
||||||
|
if (m) {
|
||||||
|
namedParams.push([i, m[1], m[2] || '[^/]+']);
|
||||||
|
regExpComponents[i] = m[2] || true;
|
||||||
|
}
|
||||||
|
else if (components[i] === '/*') {
|
||||||
|
regExpComponents[i] = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
regExpComponents[i] = components[i];
|
||||||
|
}
|
||||||
|
if (/\/(?::|\*)/.test(components[i])) {
|
||||||
|
paramIndexList.push(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
components,
|
||||||
|
regExpComponents,
|
||||||
|
componentsLength,
|
||||||
|
endWithWildcard: path.endsWith('*'),
|
||||||
|
paramIndexList,
|
||||||
|
namedParams,
|
||||||
|
maybeHandler: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function compareRoute(a, b) {
|
||||||
|
if (a.path === '*') {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
let i = 0;
|
||||||
|
const len = a.hint.regExpComponents.length;
|
||||||
|
for (; i < len; i++) {
|
||||||
|
if (a.hint.regExpComponents[i] !== b.hint.regExpComponents[i]) {
|
||||||
|
if (a.hint.regExpComponents[i] === true) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// may be ambiguous
|
||||||
|
for (; i < len; i++) {
|
||||||
|
if (a.hint.regExpComponents[i] !== true &&
|
||||||
|
a.hint.regExpComponents[i] !== b.hint.regExpComponents[i]) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i === b.hint.regExpComponents.length || a.hint.endWithWildcard ? 1 : 0;
|
||||||
|
}
|
||||||
|
function compareHandler(a, b) {
|
||||||
|
return a.index - b.index;
|
||||||
|
}
|
||||||
|
function getSortedHandlers(handlers) {
|
||||||
|
return [...handlers].sort(compareHandler).map((h) => h.handler);
|
||||||
|
}
|
||||||
|
function buildMatcherFromPreprocessedRoutes(routes, hasAmbiguous = false) {
|
||||||
|
const trie = new trie_1.Trie({ reverse: hasAmbiguous });
|
||||||
|
const handlers = [];
|
||||||
|
if (routes.length === 0) {
|
||||||
|
return nullMatcher;
|
||||||
|
}
|
||||||
|
for (let i = 0, len = routes.length; i < len; i++) {
|
||||||
|
const paramMap = trie.insert(routes[i].path, i);
|
||||||
|
handlers[i] = [
|
||||||
|
[...routes[i].middleware, ...routes[i].handlers],
|
||||||
|
Object.keys(paramMap).length !== 0 ? paramMap : null,
|
||||||
|
];
|
||||||
|
if (!hasAmbiguous) {
|
||||||
|
handlers[i][0] = getSortedHandlers(handlers[i][0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();
|
||||||
|
for (let i = 0, len = handlers.length; i < len; i++) {
|
||||||
|
const paramMap = handlers[i][1];
|
||||||
|
if (paramMap) {
|
||||||
|
for (let j = 0, len = paramMap.length; j < len; j++) {
|
||||||
|
paramMap[j][1] = paramReplacementMap[paramMap[j][1]];
|
||||||
|
const aliasTo = routes[i].paramAliasMap[paramMap[j][0]];
|
||||||
|
if (aliasTo) {
|
||||||
|
for (let k = 0, len = aliasTo.length; k < len; k++) {
|
||||||
|
paramMap.push([aliasTo[k], paramMap[j][1]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const handlerMap = [];
|
||||||
|
// using `in` because indexReplacementMap is a sparse array
|
||||||
|
for (const i in indexReplacementMap) {
|
||||||
|
handlerMap[i] = handlers[indexReplacementMap[i]];
|
||||||
|
}
|
||||||
|
return [regexp, handlerMap];
|
||||||
|
}
|
||||||
|
function verifyDuplicateParam(routes) {
|
||||||
|
const nameMap = {};
|
||||||
|
for (let i = 0, len = routes.length; i < len; i++) {
|
||||||
|
const route = routes[i];
|
||||||
|
for (let k = 0, len = route.hint.namedParams.length; k < len; k++) {
|
||||||
|
const [index, name] = route.hint.namedParams[k];
|
||||||
|
if (name in nameMap && index !== nameMap[name]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nameMap[name] = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const paramAliasMap = route.paramAliasMap;
|
||||||
|
const paramAliasMapKeys = Object.keys(paramAliasMap);
|
||||||
|
for (let k = 0, len = paramAliasMapKeys.length; k < len; k++) {
|
||||||
|
const aliasFrom = paramAliasMapKeys[k];
|
||||||
|
for (let l = 0, len = paramAliasMap[aliasFrom].length; l < len; l++) {
|
||||||
|
const aliasTo = paramAliasMap[aliasFrom][l];
|
||||||
|
const index = nameMap[aliasFrom];
|
||||||
|
if (aliasTo in nameMap && index !== nameMap[aliasTo]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nameMap[aliasTo] = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
class RegExpRouter {
|
||||||
|
constructor() {
|
||||||
|
this.routeData = { index: 0, routes: [], methods: new Set() };
|
||||||
|
}
|
||||||
|
add(method, path, handler) {
|
||||||
|
if (!this.routeData) {
|
||||||
|
throw new Error('Can not add a route since the matcher is already built.');
|
||||||
|
}
|
||||||
|
this.routeData.index++;
|
||||||
|
const { index, routes, methods } = this.routeData;
|
||||||
|
if (path === '/*') {
|
||||||
|
path = '*';
|
||||||
|
}
|
||||||
|
const hint = initHint(path);
|
||||||
|
const handlerWithSortIndex = {
|
||||||
|
index,
|
||||||
|
handler,
|
||||||
|
};
|
||||||
|
for (let i = 0, len = routes.length; i < len; i++) {
|
||||||
|
if (routes[i].method === method && routes[i].path === path) {
|
||||||
|
routes[i].handlers.push(handlerWithSortIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
methods.add(method);
|
||||||
|
routes.push({
|
||||||
|
method,
|
||||||
|
path,
|
||||||
|
hint,
|
||||||
|
handlers: [handlerWithSortIndex],
|
||||||
|
middleware: [],
|
||||||
|
paramAliasMap: {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
match(method, path) {
|
||||||
|
const [primaryMatchers, secondaryMatchers, hasAmbiguous] = this.buildAllMatchers();
|
||||||
|
this.match = hasAmbiguous
|
||||||
|
? (method, path) => {
|
||||||
|
const matcher = (primaryMatchers[method] ||
|
||||||
|
primaryMatchers[router_1.METHOD_NAME_ALL]);
|
||||||
|
let match = path.match(matcher[0]);
|
||||||
|
if (!match) {
|
||||||
|
// do not support secondary matchers here.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const params = {};
|
||||||
|
const handlers = new Set();
|
||||||
|
let regExpSrc = matcher[0].source;
|
||||||
|
while (match) {
|
||||||
|
let index = match.indexOf('', 1);
|
||||||
|
for (;;) {
|
||||||
|
const [handler, paramMap] = matcher[1][index];
|
||||||
|
if (paramMap) {
|
||||||
|
for (let i = 0, len = paramMap.length; i < len; i++) {
|
||||||
|
params[paramMap[i][0]] = match[paramMap[i][1]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i = 0, len = handler.length; i < len; i++) {
|
||||||
|
handlers.add(handler[i]);
|
||||||
|
}
|
||||||
|
const newIndex = match.indexOf('', index + 1);
|
||||||
|
if (newIndex === -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
index = newIndex;
|
||||||
|
}
|
||||||
|
regExpSrc = regExpSrc.replace(new RegExp(`((?:(?:\\(\\?:|.)*?\\([^)]*\\)){${index - 1}}.*?)\\(\\)`), '$1(^)');
|
||||||
|
match = path.match(new RegExp(regExpSrc));
|
||||||
|
}
|
||||||
|
return { handlers: getSortedHandlers(handlers.values()), params };
|
||||||
|
}
|
||||||
|
: (method, path) => {
|
||||||
|
let matcher = (primaryMatchers[method] || primaryMatchers[router_1.METHOD_NAME_ALL]);
|
||||||
|
let match = path.match(matcher[0]);
|
||||||
|
if (!match) {
|
||||||
|
const matchers = secondaryMatchers[method] || secondaryMatchers[router_1.METHOD_NAME_ALL];
|
||||||
|
for (let i = 0, len = matchers.length; i < len && !match; i++) {
|
||||||
|
matcher = matchers[i];
|
||||||
|
match = path.match(matcher[0]);
|
||||||
|
}
|
||||||
|
if (!match) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const index = match.indexOf('', 1);
|
||||||
|
const [handlers, paramMap] = matcher[1][index];
|
||||||
|
if (!paramMap) {
|
||||||
|
return { handlers, params: emptyParam };
|
||||||
|
}
|
||||||
|
const params = {};
|
||||||
|
for (let i = 0, len = paramMap.length; i < len; i++) {
|
||||||
|
params[paramMap[i][0]] = match[paramMap[i][1]];
|
||||||
|
}
|
||||||
|
return { handlers, params };
|
||||||
|
};
|
||||||
|
return this.match(method, path);
|
||||||
|
}
|
||||||
|
buildAllMatchers() {
|
||||||
|
// @ts-ignore
|
||||||
|
this.routeData.routes.sort(({ hint: a }, { hint: b }) => {
|
||||||
|
if (a.componentsLength !== b.componentsLength) {
|
||||||
|
return a.componentsLength - b.componentsLength;
|
||||||
|
}
|
||||||
|
for (let i = 0, len = Math.min(a.paramIndexList.length, b.paramIndexList.length) + 1; i < len; i++) {
|
||||||
|
if (a.paramIndexList[i] !== b.paramIndexList[i]) {
|
||||||
|
if (a.paramIndexList[i] === undefined) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else if (b.paramIndexList[i] === undefined) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return a.paramIndexList[i] - b.paramIndexList[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (a.endWithWildcard !== b.endWithWildcard) {
|
||||||
|
return a.endWithWildcard ? -1 : 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
const primaryMatchers = {};
|
||||||
|
const secondaryMatchers = {};
|
||||||
|
let hasAmbiguous = false;
|
||||||
|
// @ts-ignore
|
||||||
|
this.routeData.methods.forEach((method) => {
|
||||||
|
let _hasAmbiguous;
|
||||||
|
[primaryMatchers[method], secondaryMatchers[method], _hasAmbiguous] =
|
||||||
|
this.buildMatcher(method);
|
||||||
|
hasAmbiguous = hasAmbiguous || _hasAmbiguous;
|
||||||
|
});
|
||||||
|
primaryMatchers[router_1.METHOD_NAME_ALL] || (primaryMatchers[router_1.METHOD_NAME_ALL] = nullMatcher);
|
||||||
|
secondaryMatchers[router_1.METHOD_NAME_ALL] || (secondaryMatchers[router_1.METHOD_NAME_ALL] = []);
|
||||||
|
delete this.routeData; // to reduce memory usage
|
||||||
|
return [primaryMatchers, secondaryMatchers, hasAmbiguous];
|
||||||
|
}
|
||||||
|
buildMatcher(method) {
|
||||||
|
var _a, _b;
|
||||||
|
let hasAmbiguous = false;
|
||||||
|
const targetMethods = new Set([method, router_1.METHOD_NAME_ALL]);
|
||||||
|
// @ts-ignore
|
||||||
|
const routes = this.routeData.routes.filter(({ method }) => targetMethods.has(method));
|
||||||
|
// Reset temporary data per method
|
||||||
|
for (let i = 0, len = routes.length; i < len; i++) {
|
||||||
|
routes[i].middleware = [];
|
||||||
|
routes[i].paramAliasMap = {};
|
||||||
|
}
|
||||||
|
// preprocess routes
|
||||||
|
for (let i = 0, len = routes.length; i < len; i++) {
|
||||||
|
for (let j = i + 1; j < len; j++) {
|
||||||
|
const compareResult = compareRoute(routes[i], routes[j]);
|
||||||
|
// i includes j
|
||||||
|
if (compareResult === 1) {
|
||||||
|
const components = routes[j].hint.components;
|
||||||
|
const namedParams = routes[i].hint.namedParams;
|
||||||
|
for (let k = 0, len = namedParams.length; k < len; k++) {
|
||||||
|
const c = components[namedParams[k][0]];
|
||||||
|
const m = c.match(/^\/:(\w+)({[^}]+})?/);
|
||||||
|
if (m && namedParams[k][1] === m[1]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (m) {
|
||||||
|
(_a = routes[j].paramAliasMap)[_b = m[1]] || (_a[_b] = []);
|
||||||
|
routes[j].paramAliasMap[m[1]].push(namedParams[k][1]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
components[namedParams[k][0]] = `/:${namedParams[k][1]}{${c.substring(1)}}`;
|
||||||
|
routes[j].hint.namedParams.push([
|
||||||
|
namedParams[k][0],
|
||||||
|
namedParams[k][1],
|
||||||
|
c.substring(1),
|
||||||
|
]);
|
||||||
|
routes[j].path = components.join('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (routes[j].hint.components.length < routes[i].hint.components.length) {
|
||||||
|
routes[j].middleware.push(...routes[i].handlers.map((h) => ({
|
||||||
|
index: h.index,
|
||||||
|
handler: h.handler,
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
routes[j].middleware.push(...routes[i].handlers);
|
||||||
|
}
|
||||||
|
routes[i].hint.maybeHandler = false;
|
||||||
|
}
|
||||||
|
else if (compareResult === 2) {
|
||||||
|
// ambiguous
|
||||||
|
hasAmbiguous = true;
|
||||||
|
if (!verifyDuplicateParam([routes[i], routes[j]])) {
|
||||||
|
throw new Error('Duplicate param name');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!verifyDuplicateParam([routes[i]])) {
|
||||||
|
throw new Error('Duplicate param name');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasAmbiguous) {
|
||||||
|
return [buildMatcherFromPreprocessedRoutes(routes, hasAmbiguous), [], hasAmbiguous];
|
||||||
|
}
|
||||||
|
const primaryRoutes = [];
|
||||||
|
const secondaryRoutes = [];
|
||||||
|
for (let i = 0, len = routes.length; i < len; i++) {
|
||||||
|
if (routes[i].hint.maybeHandler || !routes[i].hint.endWithWildcard) {
|
||||||
|
primaryRoutes.push(routes[i]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
secondaryRoutes.push(routes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [
|
||||||
|
buildMatcherFromPreprocessedRoutes(primaryRoutes, hasAmbiguous),
|
||||||
|
[buildMatcherFromPreprocessedRoutes(secondaryRoutes, hasAmbiguous)],
|
||||||
|
hasAmbiguous,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.RegExpRouter = RegExpRouter;
|
14
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/trie.d.ts
vendored
Normal file
14
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/trie.d.ts
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import type { ParamMap, Context } from './node';
|
||||||
|
import { Node } from './node';
|
||||||
|
export type { ParamMap } from './node';
|
||||||
|
export declare type ReplacementMap = number[];
|
||||||
|
interface InitOptions {
|
||||||
|
reverse: boolean;
|
||||||
|
}
|
||||||
|
export declare class Trie {
|
||||||
|
context: Context;
|
||||||
|
root: Node;
|
||||||
|
constructor({ reverse }?: InitOptions);
|
||||||
|
insert(path: string, index: number): ParamMap;
|
||||||
|
buildRegExp(): [RegExp, ReplacementMap, ReplacementMap];
|
||||||
|
}
|
42
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/trie.js
vendored
Normal file
42
cli/bench/testdata/npm/hono/dist/router/reg-exp-router/trie.js
vendored
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.Trie = void 0;
|
||||||
|
const node_1 = require("./node");
|
||||||
|
class Trie {
|
||||||
|
constructor({ reverse } = { reverse: false }) {
|
||||||
|
this.context = { varIndex: 0 };
|
||||||
|
this.root = new node_1.Node({ reverse });
|
||||||
|
}
|
||||||
|
insert(path, index) {
|
||||||
|
const paramMap = [];
|
||||||
|
/**
|
||||||
|
* - pattern (:label, :label{0-9]+}, ...)
|
||||||
|
* - /* wildcard
|
||||||
|
* - character
|
||||||
|
*/
|
||||||
|
const tokens = path.match(/(?::[^\/]+)|(?:\/\*$)|./g);
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore
|
||||||
|
this.root.insert(tokens, index, paramMap, this.context);
|
||||||
|
return paramMap;
|
||||||
|
}
|
||||||
|
buildRegExp() {
|
||||||
|
let regexp = this.root.buildRegExpStr();
|
||||||
|
let captureIndex = 0;
|
||||||
|
const indexReplacementMap = [];
|
||||||
|
const paramReplacementMap = [];
|
||||||
|
regexp = regexp.replace(/#(\d+)|@(\d+)|\.\*\$/g, (_, handlerIndex, paramIndex) => {
|
||||||
|
if (typeof handlerIndex !== 'undefined') {
|
||||||
|
indexReplacementMap[++captureIndex] = Number(handlerIndex);
|
||||||
|
return '$()';
|
||||||
|
}
|
||||||
|
if (typeof paramIndex !== 'undefined') {
|
||||||
|
paramReplacementMap[Number(paramIndex)] = ++captureIndex;
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Trie = Trie;
|
1
cli/bench/testdata/npm/hono/dist/router/trie-router/index.d.ts
vendored
Normal file
1
cli/bench/testdata/npm/hono/dist/router/trie-router/index.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export { TrieRouter } from './router';
|
5
cli/bench/testdata/npm/hono/dist/router/trie-router/index.js
vendored
Normal file
5
cli/bench/testdata/npm/hono/dist/router/trie-router/index.js
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.TrieRouter = void 0;
|
||||||
|
var router_1 = require("./router");
|
||||||
|
Object.defineProperty(exports, "TrieRouter", { enumerable: true, get: function () { return router_1.TrieRouter; } });
|
20
cli/bench/testdata/npm/hono/dist/router/trie-router/node.d.ts
vendored
Normal file
20
cli/bench/testdata/npm/hono/dist/router/trie-router/node.d.ts
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import type { Result } from '../../router';
|
||||||
|
import type { Pattern } from '../../utils/url';
|
||||||
|
declare type HandlerSet<T> = {
|
||||||
|
handler: T;
|
||||||
|
score: number;
|
||||||
|
name: string;
|
||||||
|
};
|
||||||
|
export declare class Node<T> {
|
||||||
|
methods: Record<string, HandlerSet<T>>[];
|
||||||
|
children: Record<string, Node<T>>;
|
||||||
|
patterns: Pattern[];
|
||||||
|
order: number;
|
||||||
|
name: string;
|
||||||
|
handlerSetCache: Record<string, HandlerSet<T>[]>;
|
||||||
|
constructor(method?: string, handler?: T, children?: Record<string, Node<T>>);
|
||||||
|
insert(method: string, path: string, handler: T): Node<T>;
|
||||||
|
private getHandlerSets;
|
||||||
|
search(method: string, path: string): Result<T> | null;
|
||||||
|
}
|
||||||
|
export {};
|
168
cli/bench/testdata/npm/hono/dist/router/trie-router/node.js
vendored
Normal file
168
cli/bench/testdata/npm/hono/dist/router/trie-router/node.js
vendored
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.Node = void 0;
|
||||||
|
const router_1 = require("../../router");
|
||||||
|
const url_1 = require("../../utils/url");
|
||||||
|
function findParam(node, name) {
|
||||||
|
for (let i = 0, len = node.patterns.length; i < len; i++) {
|
||||||
|
if (typeof node.patterns[i] === 'object' && node.patterns[i][1] === name) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const nodes = Object.values(node.children);
|
||||||
|
for (let i = 0, len = nodes.length; i < len; i++) {
|
||||||
|
if (findParam(nodes[i], name)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
class Node {
|
||||||
|
constructor(method, handler, children) {
|
||||||
|
this.order = 0;
|
||||||
|
this.children = children || {};
|
||||||
|
this.methods = [];
|
||||||
|
this.name = '';
|
||||||
|
if (method && handler) {
|
||||||
|
const m = {};
|
||||||
|
m[method] = { handler: handler, score: 0, name: this.name };
|
||||||
|
this.methods = [m];
|
||||||
|
}
|
||||||
|
this.patterns = [];
|
||||||
|
this.handlerSetCache = {};
|
||||||
|
}
|
||||||
|
insert(method, path, handler) {
|
||||||
|
this.name = `${method} ${path}`;
|
||||||
|
this.order = ++this.order;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
||||||
|
let curNode = this;
|
||||||
|
const parts = (0, url_1.splitPath)(path);
|
||||||
|
const parentPatterns = [];
|
||||||
|
const errorMessage = (name) => {
|
||||||
|
return `Duplicate param name, use another name instead of '${name}' - ${method} ${path} <--- '${name}'`;
|
||||||
|
};
|
||||||
|
for (let i = 0, len = parts.length; i < len; i++) {
|
||||||
|
const p = parts[i];
|
||||||
|
if (Object.keys(curNode.children).includes(p)) {
|
||||||
|
parentPatterns.push(...curNode.patterns);
|
||||||
|
curNode = curNode.children[p];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
curNode.children[p] = new Node();
|
||||||
|
const pattern = (0, url_1.getPattern)(p);
|
||||||
|
if (pattern) {
|
||||||
|
if (typeof pattern === 'object') {
|
||||||
|
for (let j = 0, len = parentPatterns.length; j < len; j++) {
|
||||||
|
if (typeof parentPatterns[j] === 'object' && parentPatterns[j][1] === pattern[1]) {
|
||||||
|
throw new Error(errorMessage(pattern[1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Object.values(curNode.children).some((n) => findParam(n, pattern[1]))) {
|
||||||
|
throw new Error(errorMessage(pattern[1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curNode.patterns.push(pattern);
|
||||||
|
parentPatterns.push(...curNode.patterns);
|
||||||
|
}
|
||||||
|
parentPatterns.push(...curNode.patterns);
|
||||||
|
curNode = curNode.children[p];
|
||||||
|
}
|
||||||
|
if (!curNode.methods.length) {
|
||||||
|
curNode.methods = [];
|
||||||
|
}
|
||||||
|
const m = {};
|
||||||
|
const handlerSet = { handler: handler, name: this.name, score: this.order };
|
||||||
|
m[method] = handlerSet;
|
||||||
|
curNode.methods.push(m);
|
||||||
|
return curNode;
|
||||||
|
}
|
||||||
|
getHandlerSets(node, method, wildcard) {
|
||||||
|
var _a, _b;
|
||||||
|
return ((_a = node.handlerSetCache)[_b = `${method}:${wildcard ? '1' : '0'}`] || (_a[_b] = (() => {
|
||||||
|
const handlerSets = [];
|
||||||
|
node.methods.map((m) => {
|
||||||
|
const handlerSet = m[method] || m[router_1.METHOD_NAME_ALL];
|
||||||
|
if (handlerSet !== undefined) {
|
||||||
|
const hs = { ...handlerSet };
|
||||||
|
handlerSets.push(hs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return handlerSets;
|
||||||
|
})()));
|
||||||
|
}
|
||||||
|
search(method, path) {
|
||||||
|
const handlerSets = [];
|
||||||
|
const params = {};
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
||||||
|
const curNode = this;
|
||||||
|
let curNodes = [curNode];
|
||||||
|
const parts = (0, url_1.splitPath)(path);
|
||||||
|
for (let i = 0, len = parts.length; i < len; i++) {
|
||||||
|
const part = parts[i];
|
||||||
|
const isLast = i === len - 1;
|
||||||
|
const tempNodes = [];
|
||||||
|
let matched = false;
|
||||||
|
for (let j = 0, len2 = curNodes.length; j < len2; j++) {
|
||||||
|
const node = curNodes[j];
|
||||||
|
const nextNode = node.children[part];
|
||||||
|
if (nextNode) {
|
||||||
|
if (isLast === true) {
|
||||||
|
// '/hello/*' => match '/hello'
|
||||||
|
if (nextNode.children['*']) {
|
||||||
|
handlerSets.push(...this.getHandlerSets(nextNode.children['*'], method, true));
|
||||||
|
}
|
||||||
|
handlerSets.push(...this.getHandlerSets(nextNode, method));
|
||||||
|
matched = true;
|
||||||
|
}
|
||||||
|
tempNodes.push(nextNode);
|
||||||
|
}
|
||||||
|
for (let k = 0, len3 = node.patterns.length; k < len3; k++) {
|
||||||
|
const pattern = node.patterns[k];
|
||||||
|
// Wildcard
|
||||||
|
// '/hello/*/foo' => match /hello/bar/foo
|
||||||
|
if (pattern === '*') {
|
||||||
|
const astNode = node.children['*'];
|
||||||
|
if (astNode) {
|
||||||
|
handlerSets.push(...this.getHandlerSets(astNode, method));
|
||||||
|
tempNodes.push(astNode);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (part === '')
|
||||||
|
continue;
|
||||||
|
// Named match
|
||||||
|
// `/posts/:id` => match /posts/123
|
||||||
|
const [key, name, matcher] = pattern;
|
||||||
|
if (matcher === true || (matcher instanceof RegExp && matcher.test(part))) {
|
||||||
|
if (typeof key === 'string') {
|
||||||
|
if (isLast === true) {
|
||||||
|
handlerSets.push(...this.getHandlerSets(node.children[key], method));
|
||||||
|
}
|
||||||
|
tempNodes.push(node.children[key]);
|
||||||
|
}
|
||||||
|
// '/book/a' => not-slug
|
||||||
|
// '/book/:slug' => slug
|
||||||
|
// GET /book/a ~> no-slug, param['slug'] => undefined
|
||||||
|
// GET /book/foo ~> slug, param['slug'] => foo
|
||||||
|
if (typeof name === 'string' && !matched) {
|
||||||
|
params[name] = part;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curNodes = tempNodes;
|
||||||
|
}
|
||||||
|
if (handlerSets.length <= 0)
|
||||||
|
return null;
|
||||||
|
const handlers = handlerSets
|
||||||
|
.sort((a, b) => {
|
||||||
|
return a.score - b.score;
|
||||||
|
})
|
||||||
|
.map((s) => {
|
||||||
|
return s.handler;
|
||||||
|
});
|
||||||
|
return { handlers, params };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Node = Node;
|
8
cli/bench/testdata/npm/hono/dist/router/trie-router/router.d.ts
vendored
Normal file
8
cli/bench/testdata/npm/hono/dist/router/trie-router/router.d.ts
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import type { Result, Router } from '../../router';
|
||||||
|
import { Node } from './node';
|
||||||
|
export declare class TrieRouter<T> implements Router<T> {
|
||||||
|
node: Node<T>;
|
||||||
|
constructor();
|
||||||
|
add(method: string, path: string, handler: T): void;
|
||||||
|
match(method: string, path: string): Result<T> | null;
|
||||||
|
}
|
16
cli/bench/testdata/npm/hono/dist/router/trie-router/router.js
vendored
Normal file
16
cli/bench/testdata/npm/hono/dist/router/trie-router/router.js
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.TrieRouter = void 0;
|
||||||
|
const node_1 = require("./node");
|
||||||
|
class TrieRouter {
|
||||||
|
constructor() {
|
||||||
|
this.node = new node_1.Node();
|
||||||
|
}
|
||||||
|
add(method, path, handler) {
|
||||||
|
this.node.insert(method, path, handler);
|
||||||
|
}
|
||||||
|
match(method, path) {
|
||||||
|
return this.node.search(method, path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.TrieRouter = TrieRouter;
|
2
cli/bench/testdata/npm/hono/dist/utils/body.d.ts
vendored
Normal file
2
cli/bench/testdata/npm/hono/dist/utils/body.d.ts
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
export declare type Body = string | object | Record<string, string | File> | ArrayBuffer;
|
||||||
|
export declare const parseBody: (r: Request | Response) => Promise<Body>;
|
31
cli/bench/testdata/npm/hono/dist/utils/body.js
vendored
Normal file
31
cli/bench/testdata/npm/hono/dist/utils/body.js
vendored
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.parseBody = void 0;
|
||||||
|
const parseBody = async (r) => {
|
||||||
|
const contentType = r.headers.get('Content-Type') || '';
|
||||||
|
if (contentType.includes('application/json')) {
|
||||||
|
let body = {};
|
||||||
|
try {
|
||||||
|
body = await r.json();
|
||||||
|
}
|
||||||
|
catch { } // Do nothing
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
else if (contentType.includes('application/text')) {
|
||||||
|
return await r.text();
|
||||||
|
}
|
||||||
|
else if (contentType.startsWith('text')) {
|
||||||
|
return await r.text();
|
||||||
|
}
|
||||||
|
else if (contentType.includes('form')) {
|
||||||
|
const form = {};
|
||||||
|
const data = [...(await r.formData())].reduce((acc, cur) => {
|
||||||
|
acc[cur[0]] = cur[1];
|
||||||
|
return acc;
|
||||||
|
}, form);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
const arrayBuffer = await r.arrayBuffer();
|
||||||
|
return arrayBuffer;
|
||||||
|
};
|
||||||
|
exports.parseBody = parseBody;
|
3
cli/bench/testdata/npm/hono/dist/utils/buffer.d.ts
vendored
Normal file
3
cli/bench/testdata/npm/hono/dist/utils/buffer.d.ts
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export declare const equal: (a: ArrayBuffer, b: ArrayBuffer) => boolean;
|
||||||
|
export declare const timingSafeEqual: (a: string | object | boolean, b: string | object | boolean, hashFunction?: Function) => Promise<boolean>;
|
||||||
|
export declare const bufferToString: (buffer: ArrayBuffer) => string;
|
39
cli/bench/testdata/npm/hono/dist/utils/buffer.js
vendored
Normal file
39
cli/bench/testdata/npm/hono/dist/utils/buffer.js
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.bufferToString = exports.timingSafeEqual = exports.equal = void 0;
|
||||||
|
const crypto_1 = require("./crypto");
|
||||||
|
const equal = (a, b) => {
|
||||||
|
if (a === b) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (a.byteLength !== b.byteLength) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const va = new DataView(a);
|
||||||
|
const vb = new DataView(b);
|
||||||
|
let i = va.byteLength;
|
||||||
|
while (i--) {
|
||||||
|
if (va.getUint8(i) !== vb.getUint8(i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
exports.equal = equal;
|
||||||
|
const timingSafeEqual = async (a, b, hashFunction) => {
|
||||||
|
if (!hashFunction) {
|
||||||
|
hashFunction = crypto_1.sha256;
|
||||||
|
}
|
||||||
|
const sa = await hashFunction(a);
|
||||||
|
const sb = await hashFunction(b);
|
||||||
|
return sa === sb && a === b;
|
||||||
|
};
|
||||||
|
exports.timingSafeEqual = timingSafeEqual;
|
||||||
|
const bufferToString = (buffer) => {
|
||||||
|
if (buffer instanceof ArrayBuffer) {
|
||||||
|
const enc = new TextDecoder('utf-8');
|
||||||
|
return enc.decode(buffer);
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
exports.bufferToString = bufferToString;
|
6
cli/bench/testdata/npm/hono/dist/utils/cloudflare.d.ts
vendored
Normal file
6
cli/bench/testdata/npm/hono/dist/utils/cloudflare.d.ts
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
/// <reference types="@cloudflare/workers-types" />
|
||||||
|
export declare type KVAssetOptions = {
|
||||||
|
manifest?: object | string;
|
||||||
|
namespace?: KVNamespace;
|
||||||
|
};
|
||||||
|
export declare const getContentFromKVAsset: (path: string, options?: KVAssetOptions) => Promise<ArrayBuffer | null>;
|
39
cli/bench/testdata/npm/hono/dist/utils/cloudflare.js
vendored
Normal file
39
cli/bench/testdata/npm/hono/dist/utils/cloudflare.js
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.getContentFromKVAsset = void 0;
|
||||||
|
const getContentFromKVAsset = async (path, options) => {
|
||||||
|
let ASSET_MANIFEST = {};
|
||||||
|
if (options && options.manifest) {
|
||||||
|
if (typeof options.manifest === 'string') {
|
||||||
|
ASSET_MANIFEST = JSON.parse(options.manifest);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ASSET_MANIFEST = options.manifest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (typeof __STATIC_CONTENT_MANIFEST === 'string') {
|
||||||
|
ASSET_MANIFEST = JSON.parse(__STATIC_CONTENT_MANIFEST);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ASSET_MANIFEST = __STATIC_CONTENT_MANIFEST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let ASSET_NAMESPACE;
|
||||||
|
if (options && options.namespace) {
|
||||||
|
ASSET_NAMESPACE = options.namespace;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ASSET_NAMESPACE = __STATIC_CONTENT;
|
||||||
|
}
|
||||||
|
const key = ASSET_MANIFEST[path] || path;
|
||||||
|
if (!key) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
let content = await ASSET_NAMESPACE.get(key, { type: 'arrayBuffer' });
|
||||||
|
if (content) {
|
||||||
|
content = content;
|
||||||
|
}
|
||||||
|
return content;
|
||||||
|
};
|
||||||
|
exports.getContentFromKVAsset = getContentFromKVAsset;
|
13
cli/bench/testdata/npm/hono/dist/utils/cookie.d.ts
vendored
Normal file
13
cli/bench/testdata/npm/hono/dist/utils/cookie.d.ts
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
export declare type Cookie = Record<string, string>;
|
||||||
|
export declare type CookieOptions = {
|
||||||
|
domain?: string;
|
||||||
|
expires?: Date;
|
||||||
|
httpOnly?: boolean;
|
||||||
|
maxAge?: number;
|
||||||
|
path?: string;
|
||||||
|
secure?: boolean;
|
||||||
|
signed?: boolean;
|
||||||
|
sameSite?: 'Strict' | 'Lax' | 'None';
|
||||||
|
};
|
||||||
|
export declare const parse: (cookie: string) => Cookie;
|
||||||
|
export declare const serialize: (name: string, value: string, opt?: CookieOptions) => string;
|
40
cli/bench/testdata/npm/hono/dist/utils/cookie.js
vendored
Normal file
40
cli/bench/testdata/npm/hono/dist/utils/cookie.js
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.serialize = exports.parse = void 0;
|
||||||
|
const parse = (cookie) => {
|
||||||
|
const pairs = cookie.split(/;\s*/g);
|
||||||
|
const parsedCookie = {};
|
||||||
|
for (let i = 0, len = pairs.length; i < len; i++) {
|
||||||
|
const pair = pairs[i].split(/\s*=\s*([^\s]+)/);
|
||||||
|
parsedCookie[pair[0]] = decodeURIComponent(pair[1]);
|
||||||
|
}
|
||||||
|
return parsedCookie;
|
||||||
|
};
|
||||||
|
exports.parse = parse;
|
||||||
|
const serialize = (name, value, opt = {}) => {
|
||||||
|
value = encodeURIComponent(value);
|
||||||
|
let cookie = `${name}=${value}`;
|
||||||
|
if (opt.maxAge) {
|
||||||
|
cookie += `; Max-Age=${Math.floor(opt.maxAge)}`;
|
||||||
|
}
|
||||||
|
if (opt.domain) {
|
||||||
|
cookie += '; Domain=' + opt.domain;
|
||||||
|
}
|
||||||
|
if (opt.path) {
|
||||||
|
cookie += '; Path=' + opt.path;
|
||||||
|
}
|
||||||
|
if (opt.expires) {
|
||||||
|
cookie += '; Expires=' + opt.expires.toUTCString();
|
||||||
|
}
|
||||||
|
if (opt.httpOnly) {
|
||||||
|
cookie += '; HttpOnly';
|
||||||
|
}
|
||||||
|
if (opt.secure) {
|
||||||
|
cookie += '; Secure';
|
||||||
|
}
|
||||||
|
if (opt.sameSite) {
|
||||||
|
cookie += `; SameSite=${opt.sameSite}`;
|
||||||
|
}
|
||||||
|
return cookie;
|
||||||
|
};
|
||||||
|
exports.serialize = serialize;
|
10
cli/bench/testdata/npm/hono/dist/utils/crypto.d.ts
vendored
Normal file
10
cli/bench/testdata/npm/hono/dist/utils/crypto.d.ts
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
declare type Algorithm = {
|
||||||
|
name: string;
|
||||||
|
alias: string;
|
||||||
|
};
|
||||||
|
declare type Data = string | boolean | number | object | ArrayBufferView | ArrayBuffer | ReadableStream;
|
||||||
|
export declare const sha256: (data: Data) => Promise<string | null>;
|
||||||
|
export declare const sha1: (data: Data) => Promise<string | null>;
|
||||||
|
export declare const md5: (data: Data) => Promise<string | null>;
|
||||||
|
export declare const createHash: (data: Data, algorithm: Algorithm) => Promise<string | null>;
|
||||||
|
export {};
|
53
cli/bench/testdata/npm/hono/dist/utils/crypto.js
vendored
Normal file
53
cli/bench/testdata/npm/hono/dist/utils/crypto.js
vendored
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.createHash = exports.md5 = exports.sha1 = exports.sha256 = void 0;
|
||||||
|
const sha256 = async (data) => {
|
||||||
|
const algorithm = { name: 'SHA-256', alias: 'sha256' };
|
||||||
|
const hash = await (0, exports.createHash)(data, algorithm);
|
||||||
|
return hash;
|
||||||
|
};
|
||||||
|
exports.sha256 = sha256;
|
||||||
|
const sha1 = async (data) => {
|
||||||
|
const algorithm = { name: 'SHA-1', alias: 'sha1' };
|
||||||
|
const hash = await (0, exports.createHash)(data, algorithm);
|
||||||
|
return hash;
|
||||||
|
};
|
||||||
|
exports.sha1 = sha1;
|
||||||
|
const md5 = async (data) => {
|
||||||
|
const algorithm = { name: 'MD5', alias: 'md5' };
|
||||||
|
const hash = await (0, exports.createHash)(data, algorithm);
|
||||||
|
return hash;
|
||||||
|
};
|
||||||
|
exports.md5 = md5;
|
||||||
|
const createHash = async (data, algorithm) => {
|
||||||
|
let sourceBuffer;
|
||||||
|
if (data instanceof ReadableStream) {
|
||||||
|
let body = '';
|
||||||
|
const reader = data.getReader();
|
||||||
|
await reader?.read().then(async (chuck) => {
|
||||||
|
const value = await (0, exports.createHash)(chuck.value || '', algorithm);
|
||||||
|
body += value;
|
||||||
|
});
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
if (ArrayBuffer.isView(data) || data instanceof ArrayBuffer) {
|
||||||
|
sourceBuffer = data;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (typeof data === 'object') {
|
||||||
|
data = JSON.stringify(data);
|
||||||
|
}
|
||||||
|
sourceBuffer = new TextEncoder().encode(String(data));
|
||||||
|
}
|
||||||
|
if (crypto && crypto.subtle) {
|
||||||
|
const buffer = await crypto.subtle.digest({
|
||||||
|
name: algorithm.name,
|
||||||
|
}, sourceBuffer);
|
||||||
|
const hash = Array.prototype.map
|
||||||
|
.call(new Uint8Array(buffer), (x) => ('00' + x.toString(16)).slice(-2))
|
||||||
|
.join('');
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
exports.createHash = createHash;
|
7
cli/bench/testdata/npm/hono/dist/utils/encode.d.ts
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/utils/encode.d.ts
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
export declare const encodeBase64: (str: string) => string;
|
||||||
|
export declare const decodeBase64: (str: string) => string;
|
||||||
|
export declare const encodeBase64URL: (str: string) => string;
|
||||||
|
export declare const decodeBase64URL: (str: string) => string;
|
||||||
|
export declare const utf8ToUint8Array: (str: string) => Uint8Array;
|
||||||
|
export declare const arrayBufferToBase64: (buf: ArrayBuffer) => Promise<string>;
|
||||||
|
export declare const arrayBufferToBase64URL: (buf: ArrayBuffer) => Promise<string>;
|
80
cli/bench/testdata/npm/hono/dist/utils/encode.js
vendored
Normal file
80
cli/bench/testdata/npm/hono/dist/utils/encode.js
vendored
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.arrayBufferToBase64URL = exports.arrayBufferToBase64 = exports.utf8ToUint8Array = exports.decodeBase64URL = exports.encodeBase64URL = exports.decodeBase64 = exports.encodeBase64 = void 0;
|
||||||
|
const encodeBase64 = (str) => {
|
||||||
|
if (str === null) {
|
||||||
|
throw new TypeError('1st argument of "encodeBase64" should not be null.');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const encoder = new TextEncoder();
|
||||||
|
const bytes = encoder.encode(str);
|
||||||
|
return btoa(String.fromCharCode(...bytes));
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
try {
|
||||||
|
return Buffer.from(str).toString('base64');
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error('If you want to do "encodeBase64", polyfill "buffer" module.');
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
exports.encodeBase64 = encodeBase64;
|
||||||
|
const decodeBase64 = (str) => {
|
||||||
|
if (str === null) {
|
||||||
|
throw new TypeError('1st argument of "decodeBase64" should not be null.');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const text = atob(str);
|
||||||
|
const bytes = new Uint8Array(text.split('').map((c) => c.charCodeAt(0)));
|
||||||
|
const decoder = new TextDecoder();
|
||||||
|
return decoder.decode(bytes);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
try {
|
||||||
|
return Buffer.from(str, 'base64').toString();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error('If you want to do "decodeBase64", polyfill "buffer" module.');
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
exports.decodeBase64 = decodeBase64;
|
||||||
|
const encodeBase64URL = (str) => {
|
||||||
|
return (0, exports.encodeBase64)(str).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
||||||
|
};
|
||||||
|
exports.encodeBase64URL = encodeBase64URL;
|
||||||
|
const decodeBase64URL = (str) => {
|
||||||
|
const pad = (s) => {
|
||||||
|
const diff = s.length % 4;
|
||||||
|
if (diff === 2) {
|
||||||
|
return `${s}==`;
|
||||||
|
}
|
||||||
|
if (diff === 3) {
|
||||||
|
return `${s}=`;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
};
|
||||||
|
return (0, exports.decodeBase64)(pad(str).replace(/-/g, '+').replace('_', '/'));
|
||||||
|
};
|
||||||
|
exports.decodeBase64URL = decodeBase64URL;
|
||||||
|
const utf8ToUint8Array = (str) => {
|
||||||
|
const encoder = new TextEncoder();
|
||||||
|
return encoder.encode(str);
|
||||||
|
};
|
||||||
|
exports.utf8ToUint8Array = utf8ToUint8Array;
|
||||||
|
const arrayBufferToBase64 = async (buf) => {
|
||||||
|
if (typeof btoa === 'function') {
|
||||||
|
return btoa(String.fromCharCode(...new Uint8Array(buf)));
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Buffer.from(String.fromCharCode(...new Uint8Array(buf))).toString('base64');
|
||||||
|
}
|
||||||
|
catch (e) { }
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
exports.arrayBufferToBase64 = arrayBufferToBase64;
|
||||||
|
const arrayBufferToBase64URL = async (buf) => {
|
||||||
|
return (await (0, exports.arrayBufferToBase64)(buf)).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
||||||
|
};
|
||||||
|
exports.arrayBufferToBase64URL = arrayBufferToBase64URL;
|
7
cli/bench/testdata/npm/hono/dist/utils/filepath.d.ts
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/utils/filepath.d.ts
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
declare type FilePathOptions = {
|
||||||
|
filename: string;
|
||||||
|
root?: string;
|
||||||
|
defaultDocument?: string;
|
||||||
|
};
|
||||||
|
export declare const getFilePath: (options: FilePathOptions) => string;
|
||||||
|
export {};
|
25
cli/bench/testdata/npm/hono/dist/utils/filepath.js
vendored
Normal file
25
cli/bench/testdata/npm/hono/dist/utils/filepath.js
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.getFilePath = void 0;
|
||||||
|
const getFilePath = (options) => {
|
||||||
|
let filename = options.filename;
|
||||||
|
let root = options.root || '';
|
||||||
|
const defaultDocument = options.defaultDocument || 'index.html';
|
||||||
|
if (filename.endsWith('/')) {
|
||||||
|
// /top/ => /top/index.html
|
||||||
|
filename = filename.concat(defaultDocument);
|
||||||
|
}
|
||||||
|
else if (!filename.match(/\.[a-zA-Z0-9]+$/)) {
|
||||||
|
// /top => /top/index.html
|
||||||
|
filename = filename.concat('/' + defaultDocument);
|
||||||
|
}
|
||||||
|
// /foo.html => foo.html
|
||||||
|
filename = filename.replace(/^\.?\//, '');
|
||||||
|
// assets/ => assets
|
||||||
|
root = root.replace(/\/$/, '');
|
||||||
|
// ./assets/foo.html => assets/foo.html
|
||||||
|
let path = root ? root + '/' + filename : filename;
|
||||||
|
path = path.replace(/^\.?\//, '');
|
||||||
|
return path;
|
||||||
|
};
|
||||||
|
exports.getFilePath = getFilePath;
|
6
cli/bench/testdata/npm/hono/dist/utils/html.d.ts
vendored
Normal file
6
cli/bench/testdata/npm/hono/dist/utils/html.d.ts
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
export declare type HtmlEscaped = {
|
||||||
|
isEscaped: true;
|
||||||
|
};
|
||||||
|
export declare type HtmlEscapedString = string & HtmlEscaped;
|
||||||
|
export declare type StringBuffer = [string];
|
||||||
|
export declare const escapeToBuffer: (str: string, buffer: StringBuffer) => void;
|
38
cli/bench/testdata/npm/hono/dist/utils/html.js
vendored
Normal file
38
cli/bench/testdata/npm/hono/dist/utils/html.js
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.escapeToBuffer = void 0;
|
||||||
|
// The `escapeToBuffer` implementation is based on code from the MIT licensed `react-dom` package.
|
||||||
|
// https://github.com/facebook/react/blob/main/packages/react-dom/src/server/escapeTextForBrowser.js
|
||||||
|
const escapeRe = /[&<>"]/;
|
||||||
|
const escapeToBuffer = (str, buffer) => {
|
||||||
|
const match = str.search(escapeRe);
|
||||||
|
if (match === -1) {
|
||||||
|
buffer[0] += str;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let escape;
|
||||||
|
let index;
|
||||||
|
let lastIndex = 0;
|
||||||
|
for (index = match; index < str.length; index++) {
|
||||||
|
switch (str.charCodeAt(index)) {
|
||||||
|
case 34: // "
|
||||||
|
escape = '"';
|
||||||
|
break;
|
||||||
|
case 38: // &
|
||||||
|
escape = '&';
|
||||||
|
break;
|
||||||
|
case 60: // <
|
||||||
|
escape = '<';
|
||||||
|
break;
|
||||||
|
case 62: // >
|
||||||
|
escape = '>';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
buffer[0] += str.substring(lastIndex, index) + escape;
|
||||||
|
lastIndex = index + 1;
|
||||||
|
}
|
||||||
|
buffer[0] += str.substring(lastIndex, index);
|
||||||
|
};
|
||||||
|
exports.escapeToBuffer = escapeToBuffer;
|
2
cli/bench/testdata/npm/hono/dist/utils/http-status.d.ts
vendored
Normal file
2
cli/bench/testdata/npm/hono/dist/utils/http-status.d.ts
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
export declare const getStatusText: (statusCode: StatusCode) => string;
|
||||||
|
export declare type StatusCode = 100 | 101 | 102 | 103 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 444 | 449 | 450 | 451 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 598 | 599;
|
50
cli/bench/testdata/npm/hono/dist/utils/http-status.js
vendored
Normal file
50
cli/bench/testdata/npm/hono/dist/utils/http-status.js
vendored
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.getStatusText = void 0;
|
||||||
|
const getStatusText = (statusCode) => {
|
||||||
|
const text = statuses[statusCode];
|
||||||
|
return text;
|
||||||
|
};
|
||||||
|
exports.getStatusText = getStatusText;
|
||||||
|
const statuses = {
|
||||||
|
100: 'Continue',
|
||||||
|
101: 'Switching Protocols',
|
||||||
|
102: 'Processing',
|
||||||
|
103: 'Early Hints',
|
||||||
|
200: 'OK',
|
||||||
|
201: 'Created',
|
||||||
|
202: 'Accepted',
|
||||||
|
204: 'No Content',
|
||||||
|
206: 'Partial Content',
|
||||||
|
301: 'Moved Permanently',
|
||||||
|
302: 'Moved Temporarily',
|
||||||
|
303: 'See Other',
|
||||||
|
304: 'Not Modified',
|
||||||
|
307: 'Temporary Redirect',
|
||||||
|
308: 'Permanent Redirect',
|
||||||
|
400: 'Bad Request',
|
||||||
|
401: 'Unauthorized',
|
||||||
|
402: 'Payment Required',
|
||||||
|
403: 'Forbidden',
|
||||||
|
404: 'Not Found',
|
||||||
|
405: 'Not Allowed',
|
||||||
|
406: 'Not Acceptable',
|
||||||
|
408: 'Request Time-out',
|
||||||
|
409: 'Conflict',
|
||||||
|
410: 'Gone',
|
||||||
|
411: 'Length Required',
|
||||||
|
412: 'Precondition Failed',
|
||||||
|
413: 'Request Entity Too Large',
|
||||||
|
414: 'Request-URI Too Large',
|
||||||
|
415: 'Unsupported Media Type',
|
||||||
|
416: 'Requested Range Not Satisfiable',
|
||||||
|
421: 'Misdirected Request',
|
||||||
|
429: 'Too Many Requests',
|
||||||
|
500: 'Internal Server Error',
|
||||||
|
501: 'Not Implemented',
|
||||||
|
502: 'Bad Gateway',
|
||||||
|
503: 'Service Temporarily Unavailable',
|
||||||
|
504: 'Gateway Time-out',
|
||||||
|
505: 'HTTP Version Not Supported',
|
||||||
|
507: 'Insufficient Storage',
|
||||||
|
};
|
1
cli/bench/testdata/npm/hono/dist/utils/jwt/index.d.ts
vendored
Normal file
1
cli/bench/testdata/npm/hono/dist/utils/jwt/index.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export * as Jwt from './jwt';
|
27
cli/bench/testdata/npm/hono/dist/utils/jwt/index.js
vendored
Normal file
27
cli/bench/testdata/npm/hono/dist/utils/jwt/index.js
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
"use strict";
|
||||||
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||||
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||||
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||||
|
}
|
||||||
|
Object.defineProperty(o, k2, desc);
|
||||||
|
}) : (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
o[k2] = m[k];
|
||||||
|
}));
|
||||||
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||||
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||||
|
}) : function(o, v) {
|
||||||
|
o["default"] = v;
|
||||||
|
});
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||||
|
__setModuleDefault(result, mod);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.Jwt = void 0;
|
||||||
|
exports.Jwt = __importStar(require("./jwt"));
|
7
cli/bench/testdata/npm/hono/dist/utils/jwt/jwt.d.ts
vendored
Normal file
7
cli/bench/testdata/npm/hono/dist/utils/jwt/jwt.d.ts
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import { AlgorithmTypes } from './types';
|
||||||
|
export declare const sign: (payload: unknown, secret: string, alg?: AlgorithmTypes) => Promise<string>;
|
||||||
|
export declare const verify: (token: string, secret: string, alg?: AlgorithmTypes) => Promise<boolean>;
|
||||||
|
export declare const decode: (token: string) => {
|
||||||
|
header: any;
|
||||||
|
payload: any;
|
||||||
|
};
|
101
cli/bench/testdata/npm/hono/dist/utils/jwt/jwt.js
vendored
Normal file
101
cli/bench/testdata/npm/hono/dist/utils/jwt/jwt.js
vendored
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.decode = exports.verify = exports.sign = void 0;
|
||||||
|
const encode_1 = require("../../utils/encode");
|
||||||
|
const types_1 = require("./types");
|
||||||
|
const types_2 = require("./types");
|
||||||
|
var CryptoKeyFormat;
|
||||||
|
(function (CryptoKeyFormat) {
|
||||||
|
CryptoKeyFormat["RAW"] = "raw";
|
||||||
|
CryptoKeyFormat["PKCS8"] = "pkcs8";
|
||||||
|
CryptoKeyFormat["SPKI"] = "spki";
|
||||||
|
CryptoKeyFormat["JWK"] = "jwk";
|
||||||
|
})(CryptoKeyFormat || (CryptoKeyFormat = {}));
|
||||||
|
var CryptoKeyUsage;
|
||||||
|
(function (CryptoKeyUsage) {
|
||||||
|
CryptoKeyUsage["Ecrypt"] = "encrypt";
|
||||||
|
CryptoKeyUsage["Decrypt"] = "decrypt";
|
||||||
|
CryptoKeyUsage["Sign"] = "sign";
|
||||||
|
CryptoKeyUsage["Verify"] = "verify";
|
||||||
|
CryptoKeyUsage["Deriverkey"] = "deriveKey";
|
||||||
|
CryptoKeyUsage["DeriveBits"] = "deriveBits";
|
||||||
|
CryptoKeyUsage["WrapKey"] = "wrapKey";
|
||||||
|
CryptoKeyUsage["UnwrapKey"] = "unwrapKey";
|
||||||
|
})(CryptoKeyUsage || (CryptoKeyUsage = {}));
|
||||||
|
const param = (name) => {
|
||||||
|
switch (name.toUpperCase()) {
|
||||||
|
case 'HS256':
|
||||||
|
return {
|
||||||
|
name: 'HMAC',
|
||||||
|
hash: {
|
||||||
|
name: 'SHA-256',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
case 'HS384':
|
||||||
|
return {
|
||||||
|
name: 'HMAC',
|
||||||
|
hash: {
|
||||||
|
name: 'SHA-384',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
case 'HS512':
|
||||||
|
return {
|
||||||
|
name: 'HMAC',
|
||||||
|
hash: {
|
||||||
|
name: 'SHA-512',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
default:
|
||||||
|
throw new types_2.JwtAlgorithmNotImplemented(name);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const signing = async (data, secret, alg = types_1.AlgorithmTypes.HS256) => {
|
||||||
|
if (!crypto.subtle || !crypto.subtle.importKey) {
|
||||||
|
throw new Error('`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.');
|
||||||
|
}
|
||||||
|
const cryptoKey = await crypto.subtle.importKey(CryptoKeyFormat.RAW, (0, encode_1.utf8ToUint8Array)(secret), param(alg), false, [CryptoKeyUsage.Sign]);
|
||||||
|
return await crypto.subtle.sign(param(alg), cryptoKey, (0, encode_1.utf8ToUint8Array)(data));
|
||||||
|
};
|
||||||
|
const sign = async (payload, secret, alg = types_1.AlgorithmTypes.HS256) => {
|
||||||
|
const encodedPayload = await (0, encode_1.encodeBase64URL)(JSON.stringify(payload));
|
||||||
|
const encodedHeader = await (0, encode_1.encodeBase64URL)(JSON.stringify({ alg, typ: 'JWT' }));
|
||||||
|
const partialToken = `${encodedHeader}.${encodedPayload}`;
|
||||||
|
const signature = await (0, encode_1.arrayBufferToBase64URL)(await signing(partialToken, secret, alg));
|
||||||
|
return `${partialToken}.${signature}`;
|
||||||
|
};
|
||||||
|
exports.sign = sign;
|
||||||
|
const verify = async (token, secret, alg = types_1.AlgorithmTypes.HS256) => {
|
||||||
|
const tokenParts = token.split('.');
|
||||||
|
if (tokenParts.length !== 3) {
|
||||||
|
throw new types_2.JwtTokenInvalid(token);
|
||||||
|
}
|
||||||
|
const { payload } = (0, exports.decode)(token);
|
||||||
|
if (payload.nbf && payload.nbf > Math.floor(Date.now() / 1000)) {
|
||||||
|
throw new types_2.JwtTokenNotBefore(token);
|
||||||
|
}
|
||||||
|
if (payload.exp && payload.exp <= Math.floor(Date.now() / 1000)) {
|
||||||
|
throw new types_2.JwtTokenExpired(token);
|
||||||
|
}
|
||||||
|
const signature = await (0, encode_1.arrayBufferToBase64URL)(await signing(tokenParts.slice(0, 2).join('.'), secret, alg));
|
||||||
|
if (signature !== tokenParts[2]) {
|
||||||
|
throw new types_2.JwtTokenSignatureMismatched(token);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
exports.verify = verify;
|
||||||
|
// eslint-disable-next-line
|
||||||
|
const decode = (token) => {
|
||||||
|
try {
|
||||||
|
const [h, p] = token.split('.');
|
||||||
|
const header = JSON.parse((0, encode_1.decodeBase64URL)(h));
|
||||||
|
const payload = JSON.parse((0, encode_1.decodeBase64URL)(p));
|
||||||
|
return {
|
||||||
|
header,
|
||||||
|
payload,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
throw new types_2.JwtTokenInvalid(token);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
exports.decode = decode;
|
25
cli/bench/testdata/npm/hono/dist/utils/jwt/types.d.ts
vendored
Normal file
25
cli/bench/testdata/npm/hono/dist/utils/jwt/types.d.ts
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
export declare class JwtAlgorithmNotImplemented extends Error {
|
||||||
|
constructor(token: string);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Export for backward compatibility
|
||||||
|
* @deprecated Use JwtAlgorithmNotImplemented instead
|
||||||
|
**/
|
||||||
|
export declare const JwtAlorithmNotImplemented: typeof JwtAlgorithmNotImplemented;
|
||||||
|
export declare class JwtTokenInvalid extends Error {
|
||||||
|
constructor(token: string);
|
||||||
|
}
|
||||||
|
export declare class JwtTokenNotBefore extends Error {
|
||||||
|
constructor(token: string);
|
||||||
|
}
|
||||||
|
export declare class JwtTokenExpired extends Error {
|
||||||
|
constructor(token: string);
|
||||||
|
}
|
||||||
|
export declare class JwtTokenSignatureMismatched extends Error {
|
||||||
|
constructor(token: string);
|
||||||
|
}
|
||||||
|
export declare enum AlgorithmTypes {
|
||||||
|
HS256 = "HS256",
|
||||||
|
HS384 = "HS384",
|
||||||
|
HS512 = "HS512"
|
||||||
|
}
|
49
cli/bench/testdata/npm/hono/dist/utils/jwt/types.js
vendored
Normal file
49
cli/bench/testdata/npm/hono/dist/utils/jwt/types.js
vendored
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.AlgorithmTypes = exports.JwtTokenSignatureMismatched = exports.JwtTokenExpired = exports.JwtTokenNotBefore = exports.JwtTokenInvalid = exports.JwtAlorithmNotImplemented = exports.JwtAlgorithmNotImplemented = void 0;
|
||||||
|
class JwtAlgorithmNotImplemented extends Error {
|
||||||
|
constructor(token) {
|
||||||
|
super(`invalid JWT token: ${token}`);
|
||||||
|
this.name = 'JwtAlgorithmNotImplemented';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.JwtAlgorithmNotImplemented = JwtAlgorithmNotImplemented;
|
||||||
|
/**
|
||||||
|
* Export for backward compatibility
|
||||||
|
* @deprecated Use JwtAlgorithmNotImplemented instead
|
||||||
|
**/
|
||||||
|
exports.JwtAlorithmNotImplemented = JwtAlgorithmNotImplemented;
|
||||||
|
class JwtTokenInvalid extends Error {
|
||||||
|
constructor(token) {
|
||||||
|
super(`invalid JWT token: ${token}`);
|
||||||
|
this.name = 'JwtTokenInvalid';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.JwtTokenInvalid = JwtTokenInvalid;
|
||||||
|
class JwtTokenNotBefore extends Error {
|
||||||
|
constructor(token) {
|
||||||
|
super(`token (${token}) is being used before it's valid`);
|
||||||
|
this.name = 'JwtTokenNotBefore';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.JwtTokenNotBefore = JwtTokenNotBefore;
|
||||||
|
class JwtTokenExpired extends Error {
|
||||||
|
constructor(token) {
|
||||||
|
super(`token (${token}) expired`);
|
||||||
|
this.name = 'JwtTokenExpired';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.JwtTokenExpired = JwtTokenExpired;
|
||||||
|
class JwtTokenSignatureMismatched extends Error {
|
||||||
|
constructor(token) {
|
||||||
|
super(`token(${token}) signature mismatched`);
|
||||||
|
this.name = 'JwtTokenSignatureMismatched';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.JwtTokenSignatureMismatched = JwtTokenSignatureMismatched;
|
||||||
|
var AlgorithmTypes;
|
||||||
|
(function (AlgorithmTypes) {
|
||||||
|
AlgorithmTypes["HS256"] = "HS256";
|
||||||
|
AlgorithmTypes["HS384"] = "HS384";
|
||||||
|
AlgorithmTypes["HS512"] = "HS512";
|
||||||
|
})(AlgorithmTypes = exports.AlgorithmTypes || (exports.AlgorithmTypes = {}));
|
1
cli/bench/testdata/npm/hono/dist/utils/mime.d.ts
vendored
Normal file
1
cli/bench/testdata/npm/hono/dist/utils/mime.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export declare const getMimeType: (filename: string) => string | undefined;
|
92
cli/bench/testdata/npm/hono/dist/utils/mime.js
vendored
Normal file
92
cli/bench/testdata/npm/hono/dist/utils/mime.js
vendored
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.getMimeType = void 0;
|
||||||
|
const getMimeType = (filename) => {
|
||||||
|
const regexp = /\.([a-zA-Z0-9]+?)$/;
|
||||||
|
const match = filename.match(regexp);
|
||||||
|
if (!match)
|
||||||
|
return;
|
||||||
|
let mimeType = mimes[match[1]];
|
||||||
|
if ((mimeType && mimeType.startsWith('text')) || mimeType === 'application/json') {
|
||||||
|
mimeType += '; charset=utf-8';
|
||||||
|
}
|
||||||
|
return mimeType;
|
||||||
|
};
|
||||||
|
exports.getMimeType = getMimeType;
|
||||||
|
const mimes = {
|
||||||
|
aac: 'audio/aac',
|
||||||
|
abw: 'application/x-abiword',
|
||||||
|
arc: 'application/x-freearc',
|
||||||
|
avi: 'video/x-msvideo',
|
||||||
|
azw: 'application/vnd.amazon.ebook',
|
||||||
|
bin: 'application/octet-stream',
|
||||||
|
bmp: 'image/bmp',
|
||||||
|
bz: 'application/x-bzip',
|
||||||
|
bz2: 'application/x-bzip2',
|
||||||
|
csh: 'application/x-csh',
|
||||||
|
css: 'text/css',
|
||||||
|
csv: 'text/csv',
|
||||||
|
doc: 'application/msword',
|
||||||
|
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||||
|
eot: 'application/vnd.ms-fontobject',
|
||||||
|
epub: 'application/epub+zip',
|
||||||
|
gz: 'application/gzip',
|
||||||
|
gif: 'image/gif',
|
||||||
|
htm: 'text/html',
|
||||||
|
html: 'text/html',
|
||||||
|
ico: 'image/x-icon',
|
||||||
|
ics: 'text/calendar',
|
||||||
|
jar: 'application/java-archive',
|
||||||
|
jpeg: 'image/jpeg',
|
||||||
|
jpg: 'image/jpeg',
|
||||||
|
js: 'text/javascript',
|
||||||
|
json: 'application/json',
|
||||||
|
jsonld: 'application/ld+json',
|
||||||
|
map: 'application/json',
|
||||||
|
mid: 'audio/x-midi',
|
||||||
|
midi: 'audio/x-midi',
|
||||||
|
mjs: 'text/javascript',
|
||||||
|
mp3: 'audio/mpeg',
|
||||||
|
mpeg: 'video/mpeg',
|
||||||
|
mpkg: 'application/vnd.apple.installer+xml',
|
||||||
|
odp: 'application/vnd.oasis.opendocument.presentation',
|
||||||
|
ods: 'application/vnd.oasis.opendocument.spreadsheet',
|
||||||
|
odt: 'application/vnd.oasis.opendocument.text',
|
||||||
|
oga: 'audio/ogg',
|
||||||
|
ogv: 'video/ogg',
|
||||||
|
ogx: 'application/ogg',
|
||||||
|
opus: 'audio/opus',
|
||||||
|
otf: 'font/otf',
|
||||||
|
png: 'image/png',
|
||||||
|
pdf: 'application/pdf',
|
||||||
|
php: 'application/php',
|
||||||
|
ppt: 'application/vnd.ms-powerpoint',
|
||||||
|
pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||||||
|
rar: 'application/vnd.rar',
|
||||||
|
rtf: 'application/rtf',
|
||||||
|
sh: 'application/x-sh',
|
||||||
|
svg: 'image/svg+xml',
|
||||||
|
swf: 'application/x-shockwave-flash',
|
||||||
|
tar: 'application/x-tar',
|
||||||
|
tif: 'image/tiff',
|
||||||
|
tiff: 'image/tiff',
|
||||||
|
ts: 'video/mp2t',
|
||||||
|
ttf: 'font/ttf',
|
||||||
|
txt: 'text/plain',
|
||||||
|
vsd: 'application/vnd.visio',
|
||||||
|
wav: 'audio/wav',
|
||||||
|
weba: 'audio/webm',
|
||||||
|
webm: 'video/webm',
|
||||||
|
webp: 'image/webp',
|
||||||
|
woff: 'font/woff',
|
||||||
|
woff2: 'font/woff2',
|
||||||
|
xhtml: 'application/xhtml+xml',
|
||||||
|
xls: 'application/vnd.ms-excel',
|
||||||
|
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||||
|
xml: 'application/xml',
|
||||||
|
xul: 'application/vnd.mozilla.xul+xml',
|
||||||
|
zip: 'application/zip',
|
||||||
|
'3gp': 'video/3gpp',
|
||||||
|
'3g2': 'video/3gpp2',
|
||||||
|
'7z': 'application/x-7z-compressed',
|
||||||
|
};
|
6
cli/bench/testdata/npm/hono/dist/utils/url.d.ts
vendored
Normal file
6
cli/bench/testdata/npm/hono/dist/utils/url.d.ts
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
export declare type Pattern = readonly [string, string, RegExp | true] | '*';
|
||||||
|
export declare const splitPath: (path: string) => string[];
|
||||||
|
export declare const getPattern: (label: string) => Pattern | null;
|
||||||
|
export declare const getPathFromURL: (url: string, strict?: boolean) => string;
|
||||||
|
export declare const isAbsoluteURL: (url: string) => boolean;
|
||||||
|
export declare const mergePath: (...paths: string[]) => string;
|
83
cli/bench/testdata/npm/hono/dist/utils/url.js
vendored
Normal file
83
cli/bench/testdata/npm/hono/dist/utils/url.js
vendored
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.mergePath = exports.isAbsoluteURL = exports.getPathFromURL = exports.getPattern = exports.splitPath = void 0;
|
||||||
|
const URL_REGEXP = /^https?:\/\/[a-zA-Z0-9\-\.:]+(\/?[^?#]*)/;
|
||||||
|
const splitPath = (path) => {
|
||||||
|
const paths = path.split(/\//); // faster than path.split('/')
|
||||||
|
if (paths[0] === '') {
|
||||||
|
paths.shift();
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
|
};
|
||||||
|
exports.splitPath = splitPath;
|
||||||
|
const patternCache = {};
|
||||||
|
const getPattern = (label) => {
|
||||||
|
// * => wildcard
|
||||||
|
// :id{[0-9]+} => ([0-9]+)
|
||||||
|
// :id => (.+)
|
||||||
|
//const name = ''
|
||||||
|
if (label === '*') {
|
||||||
|
return '*';
|
||||||
|
}
|
||||||
|
const match = label.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);
|
||||||
|
if (match) {
|
||||||
|
if (!patternCache[label]) {
|
||||||
|
if (match[2]) {
|
||||||
|
patternCache[label] = [label, match[1], new RegExp('^' + match[2] + '$')];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
patternCache[label] = [label, match[1], true];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return patternCache[label];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
exports.getPattern = getPattern;
|
||||||
|
const getPathFromURL = (url, strict = true) => {
|
||||||
|
const queryIndex = url.indexOf('?');
|
||||||
|
const result = url.substring(url.indexOf('/', 8), queryIndex === -1 ? url.length : queryIndex);
|
||||||
|
// if strict routing is false => `/hello/hey/` and `/hello/hey` are treated the same
|
||||||
|
// default is true
|
||||||
|
if (strict === false && result.endsWith('/')) {
|
||||||
|
return result.slice(0, -1);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
exports.getPathFromURL = getPathFromURL;
|
||||||
|
const isAbsoluteURL = (url) => {
|
||||||
|
const match = url.match(URL_REGEXP);
|
||||||
|
if (match) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
exports.isAbsoluteURL = isAbsoluteURL;
|
||||||
|
const mergePath = (...paths) => {
|
||||||
|
let p = '';
|
||||||
|
let endsWithSlash = false;
|
||||||
|
for (let path of paths) {
|
||||||
|
/* ['/hey/','/say'] => ['/hey', '/say'] */
|
||||||
|
if (p.endsWith('/')) {
|
||||||
|
p = p.slice(0, -1);
|
||||||
|
endsWithSlash = true;
|
||||||
|
}
|
||||||
|
/* ['/hey','say'] => ['/hey', '/say'] */
|
||||||
|
if (!path.startsWith('/')) {
|
||||||
|
path = `/${path}`;
|
||||||
|
}
|
||||||
|
/* ['/hey/', '/'] => `/hey/` */
|
||||||
|
if (path === '/' && endsWithSlash) {
|
||||||
|
p = `${p}/`;
|
||||||
|
}
|
||||||
|
else if (path !== '/') {
|
||||||
|
p = `${p}${path}`;
|
||||||
|
}
|
||||||
|
/* ['/', '/'] => `/` */
|
||||||
|
if (path === '/' && p === '') {
|
||||||
|
p = '/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
};
|
||||||
|
exports.mergePath = mergePath;
|
168
cli/bench/testdata/npm/hono/package.json
vendored
Normal file
168
cli/bench/testdata/npm/hono/package.json
vendored
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
{
|
||||||
|
"name": "hono",
|
||||||
|
"version": "2.0.9",
|
||||||
|
"description": "Ultrafast web framework for Cloudflare Workers.",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"types": "dist/index.d.ts",
|
||||||
|
"files": [
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"test": "jest",
|
||||||
|
"test:deno": "deno test --allow-read deno_test",
|
||||||
|
"test:bun": "bun wiptest --jsx-import-source ../src/middleware/jsx/jsx-dev-runtime bun_test/index.test.tsx",
|
||||||
|
"test:all": "yarn test && yarn test:deno && yarn test:bun",
|
||||||
|
"lint": "eslint --ext js,ts src .eslintrc.js",
|
||||||
|
"lint:fix": "eslint --ext js,ts src .eslintrc.js --fix",
|
||||||
|
"denoify": "rimraf deno_dist && denoify && rimraf 'deno_dist/**/*.test.ts'",
|
||||||
|
"build": "rimraf dist && tsc --project tsconfig.build.esm.json && tsc --project tsconfig.build.json",
|
||||||
|
"watch": "tsc --project tsconfig.build.json -w",
|
||||||
|
"prerelease": "yarn denoify && yarn test:deno && yarn build",
|
||||||
|
"release": "np"
|
||||||
|
},
|
||||||
|
"exports": {
|
||||||
|
".": "./dist/index.js",
|
||||||
|
"./basic-auth": "./dist/middleware/basic-auth/index.js",
|
||||||
|
"./bearer-auth": "./dist/middleware/bearer-auth/index.js",
|
||||||
|
"./cache": "./dist/middleware/cache/index.js",
|
||||||
|
"./compress": "./dist/middleware/compress/index.js",
|
||||||
|
"./cors": "./dist/middleware/cors/index.js",
|
||||||
|
"./etag": "./dist/middleware/etag/index.js",
|
||||||
|
"./html": "./dist/middleware/html/index.js",
|
||||||
|
"./jsx": "./dist/middleware/jsx/index.js",
|
||||||
|
"./jsx/jsx-dev-runtime": "./dist/middleware/jsx/jsx-dev-runtime.js",
|
||||||
|
"./jsx/jsx-runtime": "./dist/middleware/jsx/jsx-runtime.js",
|
||||||
|
"./jwt": "./dist/middleware/jwt/index.js",
|
||||||
|
"./logger": "./dist/middleware/logger/index.js",
|
||||||
|
"./powered-by": "./dist/middleware/powered-by/index.js",
|
||||||
|
"./pretty-json": "./dist/middleware/pretty-json/index.js",
|
||||||
|
"./serve-static": "./dist/middleware/serve-static/index.js",
|
||||||
|
"./serve-static.bun": "./dist/middleware/serve-static/bun.js",
|
||||||
|
"./serve-static.module": "./dist/middleware/serve-static/module.mjs",
|
||||||
|
"./router/trie-router": "./dist/router/trie-router/index.js",
|
||||||
|
"./router/reg-exp-router": "./dist/router/reg-exp-router/index.js",
|
||||||
|
"./utils/jwt": "./dist/utils/jwt/index.js",
|
||||||
|
"./utils/*": "./dist/utils/*.js"
|
||||||
|
},
|
||||||
|
"typesVersions": {
|
||||||
|
"*": {
|
||||||
|
"basic-auth": [
|
||||||
|
"./dist/middleware/basic-auth"
|
||||||
|
],
|
||||||
|
"bearer-auth": [
|
||||||
|
"./dist/middleware/bearer-auth"
|
||||||
|
],
|
||||||
|
"cache": [
|
||||||
|
"./dist/middleware/cache"
|
||||||
|
],
|
||||||
|
"compress": [
|
||||||
|
"./dist/middleware/compress"
|
||||||
|
],
|
||||||
|
"cors": [
|
||||||
|
"./dist/middleware/cors"
|
||||||
|
],
|
||||||
|
"etag": [
|
||||||
|
"./dist/middleware/etag"
|
||||||
|
],
|
||||||
|
"html": [
|
||||||
|
"./dist/middleware/html"
|
||||||
|
],
|
||||||
|
"jsx": [
|
||||||
|
"./dist/middleware/jsx"
|
||||||
|
],
|
||||||
|
"jsx/jsx-runtime": [
|
||||||
|
"./dist/middleware/jsx/jsx-runtime.d.ts"
|
||||||
|
],
|
||||||
|
"jsx/jsx-dev-runtime": [
|
||||||
|
"./dist/middleware/jsx/jsx-dev-runtime.d.ts"
|
||||||
|
],
|
||||||
|
"jwt": [
|
||||||
|
"./dist/middleware/jwt"
|
||||||
|
],
|
||||||
|
"logger": [
|
||||||
|
"./dist/middleware/logger"
|
||||||
|
],
|
||||||
|
"powered-by": [
|
||||||
|
"./dist/middleware/powered-by"
|
||||||
|
],
|
||||||
|
"pretty-json": [
|
||||||
|
"./dist/middleware/pretty-json"
|
||||||
|
],
|
||||||
|
"serve-static": [
|
||||||
|
"./dist/middleware/serve-static/index.d.ts"
|
||||||
|
],
|
||||||
|
"serve-static.bun": [
|
||||||
|
"./dist/middleware/serve-static/bun.d.ts"
|
||||||
|
],
|
||||||
|
"serve-static.module": [
|
||||||
|
"./dist/middleware/serve-static/module.d.mts"
|
||||||
|
],
|
||||||
|
"router/trie-router": [
|
||||||
|
"./dist/router/trie-router/router.d.ts"
|
||||||
|
],
|
||||||
|
"router/reg-exp-router": [
|
||||||
|
"./dist/router/reg-exp-router/router.d.ts"
|
||||||
|
],
|
||||||
|
"utils/jwt": [
|
||||||
|
"./dist/utils/jwt/index.d.ts"
|
||||||
|
],
|
||||||
|
"utils/*": [
|
||||||
|
"./dist/utils/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"author": "Yusuke Wada <yusuke@kamawada.com> (https://github.com/yusukebe)",
|
||||||
|
"license": "MIT",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/honojs/hono.git"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "https://registry.npmjs.org"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/honojs/hono",
|
||||||
|
"keywords": [
|
||||||
|
"hono",
|
||||||
|
"web",
|
||||||
|
"app",
|
||||||
|
"http",
|
||||||
|
"application",
|
||||||
|
"framework",
|
||||||
|
"router",
|
||||||
|
"cloudflare",
|
||||||
|
"workers",
|
||||||
|
"fastly",
|
||||||
|
"compute@edge",
|
||||||
|
"deno",
|
||||||
|
"bun"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"@cloudflare/workers-types": "^3.7.1",
|
||||||
|
"@types/crypto-js": "^4.1.1",
|
||||||
|
"@types/jest": "^27.4.1",
|
||||||
|
"@types/node": "^17.0.29",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.21.0",
|
||||||
|
"@typescript-eslint/parser": "^5.21.0",
|
||||||
|
"crypto-js": "^4.1.1",
|
||||||
|
"denoify": "^0.11.1",
|
||||||
|
"eslint": "^8.14.0",
|
||||||
|
"eslint-config-prettier": "^8.5.0",
|
||||||
|
"eslint-define-config": "^1.4.0",
|
||||||
|
"eslint-import-resolver-typescript": "^2.7.1",
|
||||||
|
"eslint-plugin-eslint-comments": "^3.2.0",
|
||||||
|
"eslint-plugin-flowtype": "^8.0.3",
|
||||||
|
"eslint-plugin-import": "^2.26.0",
|
||||||
|
"eslint-plugin-node": "^11.1.0",
|
||||||
|
"form-data": "^4.0.0",
|
||||||
|
"jest": "27.5.1",
|
||||||
|
"jest-environment-miniflare": "^2.6.0",
|
||||||
|
"np": "^7.6.2",
|
||||||
|
"prettier": "^2.6.2",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"ts-jest": "^27.1.4",
|
||||||
|
"typescript": "^4.6.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=11.0.0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,7 @@ async function dlint() {
|
||||||
":!:cli/tests/testdata/038_checkjs.js",
|
":!:cli/tests/testdata/038_checkjs.js",
|
||||||
":!:cli/tests/testdata/error_008_checkjs.js",
|
":!:cli/tests/testdata/error_008_checkjs.js",
|
||||||
":!:cli/bench/http/node*.js",
|
":!:cli/bench/http/node*.js",
|
||||||
|
":!:cli/bench/testdata/npm/*",
|
||||||
":!:cli/bench/testdata/express-router.js",
|
":!:cli/bench/testdata/express-router.js",
|
||||||
":!:cli/bench/testdata/react-dom.js",
|
":!:cli/bench/testdata/react-dom.js",
|
||||||
":!:cli/compilers/wasm_wrap.js",
|
":!:cli/compilers/wasm_wrap.js",
|
||||||
|
|
Loading…
Reference in a new issue