@nifrajs/middleware 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/_utils.d.ts +27 -0
- package/dist/_utils.d.ts.map +1 -0
- package/dist/_utils.js +141 -0
- package/dist/_utils.js.map +1 -0
- package/dist/basic-auth.d.ts +27 -0
- package/dist/basic-auth.d.ts.map +1 -0
- package/dist/basic-auth.js +64 -0
- package/dist/basic-auth.js.map +1 -0
- package/dist/body-limit.d.ts +19 -0
- package/dist/body-limit.d.ts.map +1 -0
- package/dist/body-limit.js +42 -0
- package/dist/body-limit.js.map +1 -0
- package/dist/cache-control.d.ts +23 -0
- package/dist/cache-control.d.ts.map +1 -0
- package/dist/cache-control.js +35 -0
- package/dist/cache-control.js.map +1 -0
- package/dist/cache.d.ts +60 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +224 -0
- package/dist/cache.js.map +1 -0
- package/dist/combine.d.ts +7 -0
- package/dist/combine.d.ts.map +1 -0
- package/dist/combine.js +21 -0
- package/dist/combine.js.map +1 -0
- package/dist/compression.d.ts +29 -0
- package/dist/compression.d.ts.map +1 -0
- package/dist/compression.js +105 -0
- package/dist/compression.js.map +1 -0
- package/dist/context-storage.d.ts +14 -0
- package/dist/context-storage.d.ts.map +1 -0
- package/dist/context-storage.js +30 -0
- package/dist/context-storage.js.map +1 -0
- package/dist/cors.d.ts +25 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +75 -0
- package/dist/cors.js.map +1 -0
- package/dist/csrf.d.ts +23 -0
- package/dist/csrf.d.ts.map +1 -0
- package/dist/csrf.js +68 -0
- package/dist/csrf.js.map +1 -0
- package/dist/etag.d.ts +14 -0
- package/dist/etag.d.ts.map +1 -0
- package/dist/etag.js +95 -0
- package/dist/etag.js.map +1 -0
- package/dist/healthcheck.d.ts +25 -0
- package/dist/healthcheck.d.ts.map +1 -0
- package/dist/healthcheck.js +41 -0
- package/dist/healthcheck.js.map +1 -0
- package/dist/idempotency.d.ts +83 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +217 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/ip-restriction.d.ts +21 -0
- package/dist/ip-restriction.d.ts.map +1 -0
- package/dist/ip-restriction.js +161 -0
- package/dist/ip-restriction.js.map +1 -0
- package/dist/jwt.d.ts +82 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +327 -0
- package/dist/jwt.js.map +1 -0
- package/dist/language.d.ts +20 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +94 -0
- package/dist/language.js.map +1 -0
- package/dist/logger.d.ts +19 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +28 -0
- package/dist/logger.js.map +1 -0
- package/dist/method-override.d.ts +28 -0
- package/dist/method-override.d.ts.map +1 -0
- package/dist/method-override.js +67 -0
- package/dist/method-override.js.map +1 -0
- package/dist/openapi.d.ts +83 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +100 -0
- package/dist/openapi.js.map +1 -0
- package/dist/powered-by.d.ts +15 -0
- package/dist/powered-by.d.ts.map +1 -0
- package/dist/powered-by.js +23 -0
- package/dist/powered-by.js.map +1 -0
- package/dist/pretty-json.d.ts +18 -0
- package/dist/pretty-json.d.ts.map +1 -0
- package/dist/pretty-json.js +88 -0
- package/dist/pretty-json.js.map +1 -0
- package/dist/rate-limit.d.ts +92 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +172 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/request-id.d.ts +18 -0
- package/dist/request-id.d.ts.map +1 -0
- package/dist/request-id.js +21 -0
- package/dist/request-id.js.map +1 -0
- package/dist/security-headers.d.ts +23 -0
- package/dist/security-headers.d.ts.map +1 -0
- package/dist/security-headers.js +36 -0
- package/dist/security-headers.js.map +1 -0
- package/dist/timing.d.ts +25 -0
- package/dist/timing.d.ts.map +1 -0
- package/dist/timing.js +101 -0
- package/dist/timing.js.map +1 -0
- package/dist/token-auth.d.ts +65 -0
- package/dist/token-auth.d.ts.map +1 -0
- package/dist/token-auth.js +90 -0
- package/dist/token-auth.js.map +1 -0
- package/dist/trailing-slash.d.ts +23 -0
- package/dist/trailing-slash.d.ts.map +1 -0
- package/dist/trailing-slash.js +70 -0
- package/dist/trailing-slash.js.map +1 -0
- package/package.json +68 -0
- package/src/_utils.ts +163 -0
- package/src/basic-auth.ts +109 -0
- package/src/body-limit.ts +53 -0
- package/src/cache-control.ts +45 -0
- package/src/cache.ts +277 -0
- package/src/combine.ts +24 -0
- package/src/compression.ts +111 -0
- package/src/context-storage.ts +36 -0
- package/src/cors.ts +90 -0
- package/src/csrf.ts +102 -0
- package/src/etag.ts +99 -0
- package/src/healthcheck.ts +59 -0
- package/src/idempotency.ts +313 -0
- package/src/index.ts +110 -0
- package/src/ip-restriction.ts +187 -0
- package/src/jwt.ts +441 -0
- package/src/language.ts +109 -0
- package/src/logger.ts +44 -0
- package/src/method-override.ts +87 -0
- package/src/openapi.ts +174 -0
- package/src/powered-by.ts +31 -0
- package/src/pretty-json.ts +97 -0
- package/src/rate-limit.ts +248 -0
- package/src/request-id.ts +30 -0
- package/src/security-headers.ts +51 -0
- package/src/timing.ts +133 -0
- package/src/token-auth.ts +172 -0
- package/src/trailing-slash.ts +94 -0
package/dist/jwt.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface LanguageMatch {
|
|
2
|
+
readonly language: string;
|
|
3
|
+
readonly matched: "exact" | "base" | "wildcard" | "default";
|
|
4
|
+
}
|
|
5
|
+
export interface LanguageOptions<L extends readonly string[]> {
|
|
6
|
+
readonly supported: L;
|
|
7
|
+
readonly defaultLanguage: L[number];
|
|
8
|
+
/** Emit `Content-Language`. Default `true`. */
|
|
9
|
+
readonly header?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Pick the best supported language for an `Accept-Language` header. Exact tags win, then compatible
|
|
13
|
+
* base-language matches, then `*`, then the configured default.
|
|
14
|
+
*/
|
|
15
|
+
export declare function pickLanguage<const L extends readonly string[]>(header: string | null, supported: L, defaultLanguage: L[number]): LanguageMatch;
|
|
16
|
+
/**
|
|
17
|
+
* Derives `c.language` from `Accept-Language` and emits `Content-Language` by default.
|
|
18
|
+
*/
|
|
19
|
+
export declare function language<const L extends readonly string[]>(options: LanguageOptions<L>): import("@nifrajs/core").NifraPlugin<import("@nifrajs/core").AnyServer, import("@nifrajs/core").Server<any, any>>;
|
|
20
|
+
//# sourceMappingURL=language.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../src/language.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;CAC5D;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE;IAC1D,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;IACrB,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAsCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EAC5D,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,SAAS,EAAE,CAAC,EACZ,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,GACzB,aAAa,CAkBf;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,oHA2BtF"}
|
package/dist/language.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { definePlugin } from "@nifrajs/core";
|
|
2
|
+
function parseAcceptLanguage(header) {
|
|
3
|
+
if (header === null)
|
|
4
|
+
return [];
|
|
5
|
+
const ranges = [];
|
|
6
|
+
let order = 0;
|
|
7
|
+
for (const part of header.split(",")) {
|
|
8
|
+
const pieces = part.split(";").map((p) => p.trim());
|
|
9
|
+
const tag = (pieces[0] ?? "").toLowerCase();
|
|
10
|
+
if (tag === "")
|
|
11
|
+
continue;
|
|
12
|
+
let q = 1;
|
|
13
|
+
for (const piece of pieces.slice(1)) {
|
|
14
|
+
const [name, raw] = piece.split("=");
|
|
15
|
+
if (name?.toLowerCase() !== "q" || raw === undefined)
|
|
16
|
+
continue;
|
|
17
|
+
const parsed = Number(raw);
|
|
18
|
+
if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
|
|
19
|
+
q = 0;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
q = parsed;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (q > 0)
|
|
26
|
+
ranges.push({ tag, q, order });
|
|
27
|
+
order += 1;
|
|
28
|
+
}
|
|
29
|
+
return ranges.sort((a, b) => b.q - a.q || a.order - b.order);
|
|
30
|
+
}
|
|
31
|
+
function baseOf(tag) {
|
|
32
|
+
const dash = tag.indexOf("-");
|
|
33
|
+
return dash === -1 ? tag : tag.slice(0, dash);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Pick the best supported language for an `Accept-Language` header. Exact tags win, then compatible
|
|
37
|
+
* base-language matches, then `*`, then the configured default.
|
|
38
|
+
*/
|
|
39
|
+
export function pickLanguage(header, supported, defaultLanguage) {
|
|
40
|
+
if (supported.length === 0)
|
|
41
|
+
throw new Error("pickLanguage: supported must not be empty");
|
|
42
|
+
if (!supported.includes(defaultLanguage)) {
|
|
43
|
+
throw new Error("pickLanguage: defaultLanguage must be in supported");
|
|
44
|
+
}
|
|
45
|
+
const lower = new Map(supported.map((value) => [value.toLowerCase(), value]));
|
|
46
|
+
const ranges = parseAcceptLanguage(header);
|
|
47
|
+
for (const range of ranges) {
|
|
48
|
+
if (range.tag === "*")
|
|
49
|
+
return { language: defaultLanguage, matched: "wildcard" };
|
|
50
|
+
const exact = lower.get(range.tag);
|
|
51
|
+
if (exact !== undefined)
|
|
52
|
+
return { language: exact, matched: "exact" };
|
|
53
|
+
const requestedBase = baseOf(range.tag);
|
|
54
|
+
for (const value of supported) {
|
|
55
|
+
const candidate = value.toLowerCase();
|
|
56
|
+
if (baseOf(candidate) === requestedBase)
|
|
57
|
+
return { language: value, matched: "base" };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { language: defaultLanguage, matched: "default" };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Derives `c.language` from `Accept-Language` and emits `Content-Language` by default.
|
|
64
|
+
*/
|
|
65
|
+
export function language(options) {
|
|
66
|
+
const { supported, defaultLanguage } = options;
|
|
67
|
+
if (supported.length === 0)
|
|
68
|
+
throw new Error("language: supported must not be empty");
|
|
69
|
+
if (!supported.includes(defaultLanguage)) {
|
|
70
|
+
throw new Error("language: defaultLanguage must be in supported");
|
|
71
|
+
}
|
|
72
|
+
const emitHeader = options.header !== false;
|
|
73
|
+
const matches = new WeakMap();
|
|
74
|
+
return definePlugin("language", (app) => app
|
|
75
|
+
.derive((c) => {
|
|
76
|
+
const match = pickLanguage(c.req.headers.get("accept-language"), supported, defaultLanguage);
|
|
77
|
+
matches.set(c.req, match);
|
|
78
|
+
return { language: match.language, languageMatch: match };
|
|
79
|
+
})
|
|
80
|
+
.onResponse((res, req) => {
|
|
81
|
+
if (!emitHeader)
|
|
82
|
+
return res;
|
|
83
|
+
const match = matches.get(req);
|
|
84
|
+
if (match === undefined)
|
|
85
|
+
return res;
|
|
86
|
+
matches.delete(req);
|
|
87
|
+
if (res.headers.has("content-language"))
|
|
88
|
+
return res;
|
|
89
|
+
const headers = new Headers(res.headers);
|
|
90
|
+
headers.set("content-language", match.language);
|
|
91
|
+
return new Response(res.body, { status: res.status, statusText: res.statusText, headers });
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language.js","sourceRoot":"","sources":["../src/language.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Structured fields logged per request. */
|
|
2
|
+
export interface RequestLogFields {
|
|
3
|
+
readonly method: string;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly status: number;
|
|
6
|
+
/** Wall-clock duration in ms (0 if the start couldn't be paired). */
|
|
7
|
+
readonly ms: number;
|
|
8
|
+
}
|
|
9
|
+
export interface LoggerOptions {
|
|
10
|
+
/** Sink for each line. Default: `console.log(JSON.stringify(fields))`. Route to your own logger here. */
|
|
11
|
+
readonly log?: (fields: RequestLogFields) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A {@link definePlugin} plugin that logs one structured line per request — method, path, status,
|
|
15
|
+
* and duration — via `onRequest`/`onResponse` (so it covers 404s and errors too). The start time is
|
|
16
|
+
* paired to the request through a `WeakMap` (no per-request allocation leak). Idempotent.
|
|
17
|
+
*/
|
|
18
|
+
export declare function logger(options?: LoggerOptions): import("@nifrajs/core").NifraPlugin<import("@nifrajs/core").AnyServer, import("@nifrajs/core").AnyServer>;
|
|
19
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,yGAAyG;IACzG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAClD;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,6GAsBjD"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { definePlugin } from "@nifrajs/core";
|
|
2
|
+
/**
|
|
3
|
+
* A {@link definePlugin} plugin that logs one structured line per request — method, path, status,
|
|
4
|
+
* and duration — via `onRequest`/`onResponse` (so it covers 404s and errors too). The start time is
|
|
5
|
+
* paired to the request through a `WeakMap` (no per-request allocation leak). Idempotent.
|
|
6
|
+
*/
|
|
7
|
+
export function logger(options = {}) {
|
|
8
|
+
// A request logger's whole job is to log; the default writes JSON to stdout, routable via `log`.
|
|
9
|
+
const sink = options.log ?? ((fields) => console.log(JSON.stringify(fields)));
|
|
10
|
+
const starts = new WeakMap();
|
|
11
|
+
return definePlugin("logger", (app) => app
|
|
12
|
+
.onRequest((req) => {
|
|
13
|
+
starts.set(req, performance.now());
|
|
14
|
+
return undefined;
|
|
15
|
+
})
|
|
16
|
+
.onResponse((res, req) => {
|
|
17
|
+
const start = starts.get(req);
|
|
18
|
+
starts.delete(req);
|
|
19
|
+
sink({
|
|
20
|
+
method: req.method,
|
|
21
|
+
path: new URL(req.url).pathname,
|
|
22
|
+
status: res.status,
|
|
23
|
+
ms: start === undefined ? 0 : Math.round(performance.now() - start),
|
|
24
|
+
});
|
|
25
|
+
return res;
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAgB5C;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,UAAyB,EAAE;IAChD,iGAAiG;IACjG,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAwB,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC/F,MAAM,MAAM,GAAG,IAAI,OAAO,EAAmB,CAAA;IAC7C,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CACpC,GAAG;SACA,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;QACjB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAA;QAClC,OAAO,SAAS,CAAA;IAClB,CAAC,CAAC;SACD,UAAU,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;YAC/B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,EAAE,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;SACpE,CAAC,CAAA;QACF,OAAO,GAAG,CAAA;IACZ,CAAC,CAAC,CACL,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type Method } from "@nifrajs/core";
|
|
2
|
+
export interface MethodOverrideOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Header carrying the desired method. Default `"x-http-method-override"`.
|
|
5
|
+
* Set `false` to disable header-based override.
|
|
6
|
+
*/
|
|
7
|
+
readonly header?: string | false;
|
|
8
|
+
/**
|
|
9
|
+
* Query parameter carrying the desired method. Disabled by default because query-tunneled writes are
|
|
10
|
+
* easier to trigger accidentally from links/forms. Use only with CSRF protection on browser routes.
|
|
11
|
+
*/
|
|
12
|
+
readonly query?: string | false;
|
|
13
|
+
/** Original request methods allowed to tunnel. Default `["POST"]`. */
|
|
14
|
+
readonly methods?: readonly string[];
|
|
15
|
+
/** Target methods accepted from the override source. Default `["PUT", "PATCH", "DELETE"]`. */
|
|
16
|
+
readonly allowed?: readonly Method[];
|
|
17
|
+
/** Invalid override values reject with `400` by default. Use `"ignore"` for legacy clients. */
|
|
18
|
+
readonly onInvalid?: "reject" | "ignore";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* HTTP method override for clients that can only send `POST`. The middleware rewrites the request
|
|
22
|
+
* before routing, so handlers, validation, and response hooks all see the overridden method.
|
|
23
|
+
*
|
|
24
|
+
* Header override is enabled by default; query override is opt-in. Form-body override is deliberately
|
|
25
|
+
* not implemented because reading the body before routing would consume or buffer it for every write.
|
|
26
|
+
*/
|
|
27
|
+
export declare function methodOverride(options?: MethodOverrideOptions): import("@nifrajs/core").NifraPlugin<import("@nifrajs/core").AnyServer, import("@nifrajs/core").AnyServer>;
|
|
28
|
+
//# sourceMappingURL=method-override.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-override.d.ts","sourceRoot":"","sources":["../src/method-override.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAGlE,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CACzC;AAsBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,6GAqCjE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { definePlugin, METHODS } from "@nifrajs/core";
|
|
2
|
+
import { jsonError } from "./_utils.js";
|
|
3
|
+
const SUPPORTED = new Set(METHODS);
|
|
4
|
+
const DEFAULT_ALLOWED = ["PUT", "PATCH", "DELETE"];
|
|
5
|
+
function normalizeMethod(value) {
|
|
6
|
+
const method = value.trim().toUpperCase();
|
|
7
|
+
if (!SUPPORTED.has(method))
|
|
8
|
+
return null;
|
|
9
|
+
return method;
|
|
10
|
+
}
|
|
11
|
+
function singleQueryValue(req, name) {
|
|
12
|
+
const values = new URL(req.url).searchParams.getAll(name);
|
|
13
|
+
if (values.length === 0)
|
|
14
|
+
return null;
|
|
15
|
+
if (values.length > 1)
|
|
16
|
+
return false;
|
|
17
|
+
return values[0] ?? null;
|
|
18
|
+
}
|
|
19
|
+
function replacement(req, method) {
|
|
20
|
+
return new Request(req, { method });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* HTTP method override for clients that can only send `POST`. The middleware rewrites the request
|
|
24
|
+
* before routing, so handlers, validation, and response hooks all see the overridden method.
|
|
25
|
+
*
|
|
26
|
+
* Header override is enabled by default; query override is opt-in. Form-body override is deliberately
|
|
27
|
+
* not implemented because reading the body before routing would consume or buffer it for every write.
|
|
28
|
+
*/
|
|
29
|
+
export function methodOverride(options = {}) {
|
|
30
|
+
const header = options.header === undefined ? "x-http-method-override" : options.header;
|
|
31
|
+
const query = options.query ?? false;
|
|
32
|
+
const sourceMethods = new Set((options.methods ?? ["POST"]).map((m) => m.toUpperCase()));
|
|
33
|
+
const allowed = new Set(options.allowed ?? DEFAULT_ALLOWED);
|
|
34
|
+
const rejectInvalid = options.onInvalid !== "ignore";
|
|
35
|
+
if (header !== false && header.trim() === "")
|
|
36
|
+
throw new Error("methodOverride: header is empty");
|
|
37
|
+
if (query !== false && query.trim() === "")
|
|
38
|
+
throw new Error("methodOverride: query is empty");
|
|
39
|
+
return definePlugin("methodOverride", (app) => app.onRequest((req) => {
|
|
40
|
+
if (!sourceMethods.has(req.method.toUpperCase()))
|
|
41
|
+
return undefined;
|
|
42
|
+
const values = [];
|
|
43
|
+
if (header !== false) {
|
|
44
|
+
const value = req.headers.get(header);
|
|
45
|
+
if (value !== null)
|
|
46
|
+
values.push(value);
|
|
47
|
+
}
|
|
48
|
+
if (query !== false) {
|
|
49
|
+
const value = singleQueryValue(req, query);
|
|
50
|
+
if (value === false)
|
|
51
|
+
return rejectInvalid ? jsonError(400, "invalid_method_override") : undefined;
|
|
52
|
+
if (value !== null)
|
|
53
|
+
values.push(value);
|
|
54
|
+
}
|
|
55
|
+
if (values.length === 0)
|
|
56
|
+
return undefined;
|
|
57
|
+
if (values.length > 1 && new Set(values.map((v) => v.trim().toUpperCase())).size > 1) {
|
|
58
|
+
return rejectInvalid ? jsonError(400, "invalid_method_override") : undefined;
|
|
59
|
+
}
|
|
60
|
+
const method = normalizeMethod(values[0] ?? "");
|
|
61
|
+
if (method === null || !allowed.has(method)) {
|
|
62
|
+
return rejectInvalid ? jsonError(400, "invalid_method_override") : undefined;
|
|
63
|
+
}
|
|
64
|
+
return method === req.method ? undefined : replacement(req, method);
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=method-override.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-override.js","sourceRoot":"","sources":["../src/method-override.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** A registered route as seen by {@link buildOpenApiDocument} — structurally a `@nifrajs/core`
|
|
2
|
+
* `RouteDescriptor` (so `app.routes()` is passed straight through). */
|
|
3
|
+
export interface RouteLike {
|
|
4
|
+
readonly method: string;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly schema?: {
|
|
7
|
+
readonly body?: unknown;
|
|
8
|
+
readonly query?: unknown;
|
|
9
|
+
readonly response?: unknown;
|
|
10
|
+
} | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface OpenApiInfo {
|
|
13
|
+
readonly title?: string;
|
|
14
|
+
readonly version?: string;
|
|
15
|
+
readonly description?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface OpenApiServer {
|
|
18
|
+
readonly url: string;
|
|
19
|
+
readonly description?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface OpenApiTag {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly description?: string;
|
|
24
|
+
}
|
|
25
|
+
/** A security requirement: scheme name → required scopes (`[]` = no scopes). */
|
|
26
|
+
export type SecurityRequirement = Readonly<Record<string, readonly string[]>>;
|
|
27
|
+
/** Scalar API-reference UI options. */
|
|
28
|
+
export interface OpenApiUiOptions {
|
|
29
|
+
/** Where to serve the UI page. Default `"/reference"`. */
|
|
30
|
+
readonly path?: string;
|
|
31
|
+
/** Page title. Defaults to `info.title`. */
|
|
32
|
+
readonly title?: string;
|
|
33
|
+
/** The Scalar script URL (loaded from a CDN). Default jsDelivr's `@scalar/api-reference`. */
|
|
34
|
+
readonly cdn?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface OpenApiOptions {
|
|
37
|
+
readonly info?: OpenApiInfo;
|
|
38
|
+
readonly servers?: readonly OpenApiServer[];
|
|
39
|
+
/** Tag definitions (top-level `tags`). Reference them from an operation via `operations`. */
|
|
40
|
+
readonly tags?: readonly OpenApiTag[];
|
|
41
|
+
/** Reusable security schemes → `components.securitySchemes` (e.g. `{ bearer: { type: "http", scheme: "bearer" } }`). */
|
|
42
|
+
readonly securitySchemes?: Readonly<Record<string, Record<string, unknown>>>;
|
|
43
|
+
/** Document-wide security requirement; override per-operation via `operations`. */
|
|
44
|
+
readonly security?: readonly SecurityRequirement[];
|
|
45
|
+
/** Where the plugin serves the document. Default `"/openapi.json"`. */
|
|
46
|
+
readonly path?: string;
|
|
47
|
+
/** Exclude routes from the document (the doc path itself is always excluded). */
|
|
48
|
+
readonly exclude?: (route: {
|
|
49
|
+
readonly method: string;
|
|
50
|
+
readonly path: string;
|
|
51
|
+
}) => boolean;
|
|
52
|
+
/** Per-operation overrides keyed by `"GET /users/:id"`, shallow-merged over the generated skeleton —
|
|
53
|
+
* the escape hatch for rich request/response schemas, tags, and per-op security (Standard Schema
|
|
54
|
+
* can't be introspected). */
|
|
55
|
+
readonly operations?: Readonly<Record<string, Record<string, unknown>>>;
|
|
56
|
+
/** Also serve a Scalar API-reference UI page rendering the spec (`true` → `/reference`). */
|
|
57
|
+
readonly ui?: boolean | OpenApiUiOptions;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Build an OpenAPI 3.1 document from a route list. Delegates to `@nifrajs/schema`'s `toOpenAPI`, so a
|
|
61
|
+
* route validated with `t` (TypeBox) emits full field-level request/query/response schemas plus
|
|
62
|
+
* `$ref`-reused `components.schemas`; a BYO Standard Schema (zod/valibot/arktype) exposes no portable
|
|
63
|
+
* JSON-Schema form, so its body/response is omitted (supply it via `options.operations`). Path params,
|
|
64
|
+
* wildcards, tags, security, and servers always emit. Exported so you can also generate the doc at
|
|
65
|
+
* build time (write it to disk in CI) without booting the server.
|
|
66
|
+
*/
|
|
67
|
+
export declare function buildOpenApiDocument(routes: readonly RouteLike[], options?: OpenApiOptions): Record<string, unknown>;
|
|
68
|
+
/**
|
|
69
|
+
* Serve an OpenAPI 3.1 document (a structural subset — see {@link buildOpenApiDocument}) at
|
|
70
|
+
* `options.path` (default `/openapi.json`), generated from the app's registered routes. Generation is
|
|
71
|
+
* **lazy + memoized**: it reads `app.routes()` on the first request, by which point every route is
|
|
72
|
+
* registered — so the plugin's own position in the chain doesn't matter.
|
|
73
|
+
*
|
|
74
|
+
* Pass `ui: true` (or `ui: { path, title, cdn }`) to also serve a Scalar API-reference page (default
|
|
75
|
+
* `/reference`) that renders the spec. The page loads Scalar from a CDN; pin/self-host via `ui.cdn`,
|
|
76
|
+
* and remember to allow that origin if you ship a `script-src` Content-Security-Policy.
|
|
77
|
+
*
|
|
78
|
+
* ```ts
|
|
79
|
+
* app.use(openapi({ info: { title: "My API", version: "1.0.0" }, ui: true }))
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare function openapi(options?: OpenApiOptions): import("@nifrajs/core").NifraPlugin<import("@nifrajs/core").AnyServer, import("@nifrajs/core").AnyServer>;
|
|
83
|
+
//# sourceMappingURL=openapi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAKA;uEACuE;AACvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAGrB,QAAQ,CAAC,MAAM,CAAC,EACZ;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAClF,SAAS,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,gFAAgF;AAChF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAA;AAE7E,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAA;IAC3C,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,UAAU,EAAE,CAAA;IACrC,wHAAwH;IACxH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5E,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAA;IAClD,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,iFAAiF;IACjF,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAA;IACzF;;iCAE6B;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACvE,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAA;CACzC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,OAAO,GAAE,cAAmB,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwBzB;AA0BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,6GA+BnD"}
|
package/dist/openapi.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { definePlugin } from "@nifrajs/core";
|
|
2
|
+
// The OpenAPI generator only — `@nifrajs/schema/openapi` is pure (no TypeBox runtime), so the openapi()
|
|
3
|
+
// plugin gets full `t`-schema introspection without pulling the `t` builder into every consumer.
|
|
4
|
+
import { toOpenAPI } from "@nifrajs/schema/openapi";
|
|
5
|
+
/**
|
|
6
|
+
* Build an OpenAPI 3.1 document from a route list. Delegates to `@nifrajs/schema`'s `toOpenAPI`, so a
|
|
7
|
+
* route validated with `t` (TypeBox) emits full field-level request/query/response schemas plus
|
|
8
|
+
* `$ref`-reused `components.schemas`; a BYO Standard Schema (zod/valibot/arktype) exposes no portable
|
|
9
|
+
* JSON-Schema form, so its body/response is omitted (supply it via `options.operations`). Path params,
|
|
10
|
+
* wildcards, tags, security, and servers always emit. Exported so you can also generate the doc at
|
|
11
|
+
* build time (write it to disk in CI) without booting the server.
|
|
12
|
+
*/
|
|
13
|
+
export function buildOpenApiDocument(routes, options = {}) {
|
|
14
|
+
const docPath = options.path ?? "/openapi.json";
|
|
15
|
+
// toOpenAPI has no exclude hook, so filter here: never document the doc endpoint itself, then apply
|
|
16
|
+
// the caller's exclude predicate.
|
|
17
|
+
const included = routes.filter((route) => route.path !== docPath &&
|
|
18
|
+
options.exclude?.({ method: route.method, path: route.path }) !== true);
|
|
19
|
+
// toOpenAPI duck-types an "app" by a `routes()` method (its `isApp`); this shim lets the runtime
|
|
20
|
+
// plugin reuse the rich generator over a plain route list without holding a live Server reference.
|
|
21
|
+
// The cast is required because toOpenAPI's parameter is a nominal `ContractShape | Server` union,
|
|
22
|
+
// and the shim only satisfies it structurally.
|
|
23
|
+
const appShim = { routes: () => included };
|
|
24
|
+
return toOpenAPI(appShim, {
|
|
25
|
+
title: options.info?.title ?? "nifra API",
|
|
26
|
+
version: options.info?.version ?? "0.0.0",
|
|
27
|
+
...(options.info?.description !== undefined ? { description: options.info.description } : {}),
|
|
28
|
+
...(options.servers !== undefined ? { servers: options.servers } : {}),
|
|
29
|
+
...(options.tags !== undefined ? { tags: options.tags } : {}),
|
|
30
|
+
...(options.security !== undefined ? { security: options.security } : {}),
|
|
31
|
+
...(options.securitySchemes !== undefined ? { securitySchemes: options.securitySchemes } : {}),
|
|
32
|
+
...(options.operations !== undefined ? { operations: options.operations } : {}),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const SCALAR_CDN = "https://cdn.jsdelivr.net/npm/@scalar/api-reference";
|
|
36
|
+
/**
|
|
37
|
+
* Minimal HTML that mounts the Scalar API reference against a spec URL. The interpolated values are
|
|
38
|
+
* dev-provided config (not request input), but they're still escaped so a stray quote or `<` can't
|
|
39
|
+
* break the markup.
|
|
40
|
+
*/
|
|
41
|
+
function scalarPage(specUrl, title, cdn) {
|
|
42
|
+
const attr = (s) => s.replace(/&/g, "&").replace(/"/g, """);
|
|
43
|
+
const text = (s) => s.replace(/&/g, "&").replace(/</g, "<");
|
|
44
|
+
return `<!doctype html>
|
|
45
|
+
<html>
|
|
46
|
+
<head>
|
|
47
|
+
<title>${text(title)}</title>
|
|
48
|
+
<meta charset="utf-8" />
|
|
49
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
50
|
+
</head>
|
|
51
|
+
<body>
|
|
52
|
+
<script id="api-reference" data-url="${attr(specUrl)}"></script>
|
|
53
|
+
<script src="${attr(cdn)}"></script>
|
|
54
|
+
</body>
|
|
55
|
+
</html>`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Serve an OpenAPI 3.1 document (a structural subset — see {@link buildOpenApiDocument}) at
|
|
59
|
+
* `options.path` (default `/openapi.json`), generated from the app's registered routes. Generation is
|
|
60
|
+
* **lazy + memoized**: it reads `app.routes()` on the first request, by which point every route is
|
|
61
|
+
* registered — so the plugin's own position in the chain doesn't matter.
|
|
62
|
+
*
|
|
63
|
+
* Pass `ui: true` (or `ui: { path, title, cdn }`) to also serve a Scalar API-reference page (default
|
|
64
|
+
* `/reference`) that renders the spec. The page loads Scalar from a CDN; pin/self-host via `ui.cdn`,
|
|
65
|
+
* and remember to allow that origin if you ship a `script-src` Content-Security-Policy.
|
|
66
|
+
*
|
|
67
|
+
* ```ts
|
|
68
|
+
* app.use(openapi({ info: { title: "My API", version: "1.0.0" }, ui: true }))
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export function openapi(options = {}) {
|
|
72
|
+
const docPath = options.path ?? "/openapi.json";
|
|
73
|
+
const ui = options.ui === true ? {} : options.ui === false ? undefined : options.ui;
|
|
74
|
+
const uiPath = ui !== undefined ? (ui.path ?? "/reference") : undefined;
|
|
75
|
+
let cached;
|
|
76
|
+
let uiCached;
|
|
77
|
+
return definePlugin("openapi", (app) => {
|
|
78
|
+
// Capture `app` (the same mutable builder every later `.get()`/`.post()` registers on) and read its
|
|
79
|
+
// routes lazily, at request time — so all routes exist regardless of where the plugin sits.
|
|
80
|
+
app.register("GET", docPath, undefined, () => {
|
|
81
|
+
cached ??= JSON.stringify(buildOpenApiDocument(app.routes(), {
|
|
82
|
+
...options,
|
|
83
|
+
path: docPath,
|
|
84
|
+
// Don't document the UI page itself (the doc path is already excluded by buildOpenApiDocument).
|
|
85
|
+
exclude: (route) => route.path === uiPath || options.exclude?.(route) === true,
|
|
86
|
+
}));
|
|
87
|
+
return new Response(cached, { headers: { "content-type": "application/json" } });
|
|
88
|
+
});
|
|
89
|
+
if (ui !== undefined && uiPath !== undefined) {
|
|
90
|
+
const title = ui.title ?? options.info?.title ?? "nifra API";
|
|
91
|
+
const cdn = ui.cdn ?? SCALAR_CDN;
|
|
92
|
+
app.register("GET", uiPath, undefined, () => {
|
|
93
|
+
uiCached ??= scalarPage(docPath, title, cdn);
|
|
94
|
+
return new Response(uiCached, { headers: { "content-type": "text/html; charset=utf-8" } });
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return app;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=openapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Middleware } from "@nifrajs/core";
|
|
2
|
+
export interface PoweredByOptions {
|
|
3
|
+
/** Header name. Default `"x-powered-by"`. */
|
|
4
|
+
readonly header?: string;
|
|
5
|
+
/** Header value. Default `"Nifra"`. */
|
|
6
|
+
readonly value?: string;
|
|
7
|
+
/** Do not overwrite an existing header by default. */
|
|
8
|
+
readonly respectExisting?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Opt-in `X-Powered-By` style header. Nifra does not emit this by default; use it only when you want a
|
|
12
|
+
* public framework/product marker.
|
|
13
|
+
*/
|
|
14
|
+
export declare function poweredBy(options?: PoweredByOptions): Middleware;
|
|
15
|
+
//# sourceMappingURL=powered-by.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"powered-by.d.ts","sourceRoot":"","sources":["../src/powered-by.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG/C,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,sDAAsD;IACtD,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CACnC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,UAAU,CAcpE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { withHeaders } from "./_utils.js";
|
|
2
|
+
/**
|
|
3
|
+
* Opt-in `X-Powered-By` style header. Nifra does not emit this by default; use it only when you want a
|
|
4
|
+
* public framework/product marker.
|
|
5
|
+
*/
|
|
6
|
+
export function poweredBy(options = {}) {
|
|
7
|
+
const header = options.header ?? "x-powered-by";
|
|
8
|
+
const value = options.value ?? "Nifra";
|
|
9
|
+
const respectExisting = options.respectExisting !== false;
|
|
10
|
+
if (header.trim() === "")
|
|
11
|
+
throw new Error("poweredBy: header is empty");
|
|
12
|
+
if (/[\r\n]/.test(value))
|
|
13
|
+
throw new Error("poweredBy: value contains a newline");
|
|
14
|
+
return {
|
|
15
|
+
name: "powered-by",
|
|
16
|
+
onResponse(res) {
|
|
17
|
+
if (respectExisting && res.headers.has(header))
|
|
18
|
+
return res;
|
|
19
|
+
return withHeaders(res, (headers) => headers.set(header, value));
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=powered-by.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"powered-by.js","sourceRoot":"","sources":["../src/powered-by.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAWzC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,UAA4B,EAAE;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAA;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAA;IACtC,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK,CAAA;IACzD,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;IACvE,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAEhF,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,UAAU,CAAC,GAAG;YACZ,IAAI,eAAe,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,GAAG,CAAA;YAC1D,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;QAClE,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface PrettyJsonOptions {
|
|
2
|
+
/** JSON indentation spaces. Default `2`. */
|
|
3
|
+
readonly spaces?: number;
|
|
4
|
+
/** Maximum response bytes to inspect. Default `1_000_000`; larger responses pass through. */
|
|
5
|
+
readonly maxBytes?: number;
|
|
6
|
+
/** Append a final newline. Default `true`. */
|
|
7
|
+
readonly newline?: boolean;
|
|
8
|
+
/** Optional query toggle. When set, pretty printing runs only when the parameter is present. */
|
|
9
|
+
readonly query?: string | false;
|
|
10
|
+
/** Only pretty-print matching requests. Default `true`. */
|
|
11
|
+
readonly enabled?: boolean | ((request: Request) => boolean);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Pretty-print JSON responses for debugging and developer-facing APIs. It only touches JSON content,
|
|
15
|
+
* skips encoded responses, caps inspection size, and leaves invalid JSON untouched.
|
|
16
|
+
*/
|
|
17
|
+
export declare function prettyJson(options?: PrettyJsonOptions): import("@nifrajs/core").NifraPlugin<import("@nifrajs/core").AnyServer, import("@nifrajs/core").AnyServer>;
|
|
18
|
+
//# sourceMappingURL=pretty-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretty-json.d.ts","sourceRoot":"","sources":["../src/pretty-json.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,gGAAgG;IAChG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAA;CAC7D;AAqCD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,6GA0CzD"}
|