@daloyjs/core 0.32.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -2
- package/bin/daloy.mjs +0 -0
- package/dist/adapters/bun.d.ts.map +1 -1
- package/dist/adapters/bun.js +5 -1
- package/dist/adapters/bun.js.map +1 -1
- package/dist/adapters/node.d.ts.map +1 -1
- package/dist/adapters/node.js +7 -2
- package/dist/adapters/node.js.map +1 -1
- package/dist/app.d.ts +37 -37
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +103 -63
- package/dist/app.js.map +1 -1
- package/dist/banner.d.ts +2 -0
- package/dist/banner.d.ts.map +1 -1
- package/dist/banner.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -31
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +10 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/compression.d.ts +2 -2
- package/dist/compression.js +2 -2
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/conn-info.d.ts +5 -5
- package/dist/conn-info.js +4 -4
- package/dist/contract.d.ts +19 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +10 -0
- package/dist/contract.js.map +1 -1
- package/dist/cookie.d.ts +15 -1
- package/dist/cookie.d.ts.map +1 -1
- package/dist/cookie.js +24 -4
- package/dist/cookie.js.map +1 -1
- package/dist/dependency.d.ts +1 -1
- package/dist/dependency.js +1 -1
- package/dist/discriminator.d.ts +9 -0
- package/dist/discriminator.d.ts.map +1 -1
- package/dist/discriminator.js.map +1 -1
- package/dist/docs.d.ts +49 -2
- package/dist/docs.d.ts.map +1 -1
- package/dist/docs.js +26 -2
- package/dist/docs.js.map +1 -1
- package/dist/errors.d.ts +5 -5
- package/dist/errors.js +7 -7
- package/dist/errors.js.map +1 -1
- package/dist/etag.d.ts +1 -1
- package/dist/etag.js +1 -1
- package/dist/fetch-guard.d.ts +163 -0
- package/dist/fetch-guard.d.ts.map +1 -0
- package/dist/fetch-guard.js +265 -0
- package/dist/fetch-guard.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/ip-restriction.d.ts +17 -0
- package/dist/ip-restriction.d.ts.map +1 -1
- package/dist/ip-restriction.js +6 -3
- package/dist/ip-restriction.js.map +1 -1
- package/dist/jwk.d.ts +1 -1
- package/dist/jwk.d.ts.map +1 -1
- package/dist/jwk.js +3 -3
- package/dist/jwt.d.ts +3 -3
- package/dist/jwt.d.ts.map +1 -1
- package/dist/jwt.js +19 -7
- package/dist/jwt.js.map +1 -1
- package/dist/load-shedding.d.ts +1 -1
- package/dist/load-shedding.js +1 -1
- package/dist/logger.d.ts +14 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +66 -4
- package/dist/logger.js.map +1 -1
- package/dist/middleware.d.ts +40 -15
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +18 -14
- package/dist/middleware.js.map +1 -1
- package/dist/multipart.d.ts +22 -0
- package/dist/multipart.d.ts.map +1 -1
- package/dist/multipart.js +69 -0
- package/dist/multipart.js.map +1 -1
- package/dist/openapi.d.ts +13 -0
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +5 -0
- package/dist/openapi.js.map +1 -1
- package/dist/router.d.ts +9 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +6 -0
- package/dist/router.js.map +1 -1
- package/dist/sbom.cdx.json +60 -0
- package/dist/sbom.spdx.json +42 -0
- package/dist/security-schemes.d.ts +29 -0
- package/dist/security-schemes.d.ts.map +1 -1
- package/dist/security-schemes.js +11 -0
- package/dist/security-schemes.js.map +1 -1
- package/dist/security.d.ts +53 -2
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +67 -2
- package/dist/security.js.map +1 -1
- package/dist/session.d.ts +4 -2
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +2 -2
- package/dist/session.js.map +1 -1
- package/dist/streaming.d.ts +8 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js.map +1 -1
- package/dist/subdomains.d.ts +1 -1
- package/dist/subdomains.js +1 -1
- package/dist/time-claims.d.ts +1 -2
- package/dist/time-claims.d.ts.map +1 -1
- package/dist/time-claims.js +1 -2
- package/dist/time-claims.js.map +1 -1
- package/dist/tracing.d.ts +10 -0
- package/dist/tracing.d.ts.map +1 -1
- package/dist/tracing.js +5 -0
- package/dist/tracing.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/websocket.d.ts +67 -2
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +81 -0
- package/dist/websocket.js.map +1 -1
- package/package.json +30 -10
package/dist/docs.d.ts
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Built-in API documentation handlers.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* `specUrl` from a CDN. No build step,
|
|
4
|
+
* Scalar and Swagger UI helpers serve a single HTML page that loads the spec
|
|
5
|
+
* at `specUrl` and fetches UI assets from a CDN by default. No build step,
|
|
6
|
+
* no extra deps.
|
|
6
7
|
*
|
|
7
8
|
* (You can self-host the assets if your CSP forbids CDNs.)
|
|
8
9
|
*/
|
|
10
|
+
/** JSON primitive accepted by {@link ScalarReferenceConfiguration}. */
|
|
9
11
|
export type ScalarJsonPrimitive = string | number | boolean | null;
|
|
12
|
+
/** Recursive JSON value accepted by Scalar configuration fields. */
|
|
10
13
|
export type ScalarJsonValue = ScalarJsonPrimitive | ScalarJsonValue[] | {
|
|
11
14
|
[key: string]: ScalarJsonValue | undefined;
|
|
12
15
|
};
|
|
16
|
+
/** Built-in Scalar API Reference color theme names. */
|
|
13
17
|
export type ScalarTheme = "alternate" | "default" | "moon" | "purple" | "solarized" | "bluePlanet" | "saturn" | "kepler" | "mars" | "deepSpace" | "laserwave" | "none";
|
|
18
|
+
/**
|
|
19
|
+
* Subset of Scalar API Reference configuration safe to serialize from the
|
|
20
|
+
* server (function callbacks and inline `spec` are intentionally excluded).
|
|
21
|
+
*
|
|
22
|
+
* Forwarded verbatim as the `data-configuration` attribute on the Scalar
|
|
23
|
+
* script tag.
|
|
24
|
+
*/
|
|
14
25
|
export interface ScalarReferenceConfiguration {
|
|
15
26
|
[key: string]: ScalarJsonValue | undefined;
|
|
16
27
|
theme?: ScalarTheme;
|
|
@@ -81,29 +92,65 @@ export interface ScalarReferenceConfiguration {
|
|
|
81
92
|
spec?: never;
|
|
82
93
|
url?: never;
|
|
83
94
|
}
|
|
95
|
+
/** Shared options for {@link scalarHtml} and {@link swaggerUiHtml}. */
|
|
84
96
|
export interface DocsOptions {
|
|
97
|
+
/** Absolute or relative URL of the OpenAPI document to render. */
|
|
85
98
|
specUrl: string;
|
|
99
|
+
/** `<title>` of the generated HTML page. */
|
|
86
100
|
title?: string;
|
|
101
|
+
/** Override CDN URLs for the docs UI assets (useful for self-hosting). */
|
|
87
102
|
assets?: {
|
|
88
103
|
scalarScriptUrl?: string;
|
|
89
104
|
swaggerUiCssUrl?: string;
|
|
90
105
|
swaggerUiBundleUrl?: string;
|
|
91
106
|
};
|
|
107
|
+
/** CSP `nonce` to apply to inline/script tags; must match the response CSP. */
|
|
92
108
|
scriptNonce?: string;
|
|
93
109
|
}
|
|
110
|
+
/** Options for {@link scalarHtml}; adds Scalar-specific UI configuration. */
|
|
94
111
|
export interface ScalarHtmlOptions extends DocsOptions {
|
|
112
|
+
/** Forwarded to the Scalar `<script id="api-reference">` tag. */
|
|
95
113
|
configuration?: ScalarReferenceConfiguration;
|
|
96
114
|
}
|
|
115
|
+
/** Options for {@link docsContentSecurityPolicy}. */
|
|
97
116
|
export interface DocsContentSecurityPolicyOptions {
|
|
117
|
+
/** Extra origins to allow for `script-src` / `style-src` (defaults to jsDelivr). */
|
|
98
118
|
assetOrigins?: string[];
|
|
119
|
+
/** When set, allows nonce-protected inline scripts instead of `'unsafe-inline'`. */
|
|
99
120
|
scriptNonce?: string;
|
|
121
|
+
/** When `false`, omits `'unsafe-inline'` from `style-src`. Defaults to `true`. */
|
|
100
122
|
allowInlineStyles?: boolean;
|
|
101
123
|
}
|
|
124
|
+
/** Options for {@link htmlResponse}. */
|
|
102
125
|
export interface HtmlResponseOptions extends DocsContentSecurityPolicyOptions {
|
|
126
|
+
/** Override the computed `content-security-policy` header verbatim. */
|
|
103
127
|
contentSecurityPolicy?: string;
|
|
104
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Render a Scalar API Reference HTML page that loads `opts.specUrl`.
|
|
131
|
+
*
|
|
132
|
+
* The output is a single HTML document with configurable external assets;
|
|
133
|
+
* pair it with {@link htmlResponse} (or your own `Response`) and serve from
|
|
134
|
+
* any route.
|
|
135
|
+
*/
|
|
105
136
|
export declare function scalarHtml(opts: ScalarHtmlOptions): string;
|
|
137
|
+
/**
|
|
138
|
+
* Render a Swagger UI HTML page that loads `opts.specUrl`. Same usage as
|
|
139
|
+
* {@link scalarHtml} but emits the classic Swagger UI bundle.
|
|
140
|
+
*/
|
|
106
141
|
export declare function swaggerUiHtml(opts: DocsOptions): string;
|
|
142
|
+
/**
|
|
143
|
+
* Build a Content-Security-Policy string compatible with the docs HTML
|
|
144
|
+
* produced by {@link scalarHtml} / {@link swaggerUiHtml}.
|
|
145
|
+
*
|
|
146
|
+
* Allows `'self'` plus the listed `assetOrigins` (default: jsDelivr) and
|
|
147
|
+
* either `'unsafe-inline'` or the provided `scriptNonce` for scripts.
|
|
148
|
+
*/
|
|
107
149
|
export declare function docsContentSecurityPolicy(opts?: DocsContentSecurityPolicyOptions): string;
|
|
150
|
+
/**
|
|
151
|
+
* Wrap a docs HTML string in a `Response` with safe defaults:
|
|
152
|
+
* `text/html` content type, `nosniff`, `no-referrer`, and a CSP from
|
|
153
|
+
* {@link docsContentSecurityPolicy} (or a caller-supplied override).
|
|
154
|
+
*/
|
|
108
155
|
export declare function htmlResponse(html: string, opts?: HtmlResponseOptions): Response;
|
|
109
156
|
//# sourceMappingURL=docs.d.ts.map
|
package/dist/docs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uEAAuE;AACvE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACnE,oEAAoE;AACpE,MAAM,MAAM,eAAe,GACvB,mBAAmB,GACnB,eAAe,EAAE,GACjB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;CAAE,CAAC;AAEnD,uDAAuD;AACvD,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,SAAS,GACT,MAAM,GACN,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,WAAW,GACX,WAAW,GACX,MAAM,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,WAAW,4BAA4B;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpE,oBAAoB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1C,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,uBAAuB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACtC,cAAc,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IAChE,iBAAiB,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IACnE,QAAQ,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IAC1D,GAAG,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IACrD,WAAW,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IAC7D,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mBAAmB,CAAC,EAAE,KAAK,CAAC;IAC5B,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,qBAAqB,CAAC,EAAE,KAAK,CAAC;IAC9B,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,mBAAmB,CAAC,EAAE,KAAK,CAAC;IAC5B,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,GAAG,CAAC,EAAE,KAAK,CAAC;CACb;AAED,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,CAAC,EAAE;QACP,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,iEAAiE;IACjE,aAAa,CAAC,EAAE,4BAA4B,CAAC;CAC9C;AAED,qDAAqD;AACrD,MAAM,WAAW,gCAAgC;IAC/C,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAoB,SAAQ,gCAAgC;IAC3E,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAQD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAqB1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAuBvD;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,GAAE,gCAAqC,GAC1C,MAAM,CAgBR;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,mBAAwB,GAC7B,QAAQ,CAeV"}
|
package/dist/docs.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Built-in API documentation handlers.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* `specUrl` from a CDN. No build step,
|
|
4
|
+
* Scalar and Swagger UI helpers serve a single HTML page that loads the spec
|
|
5
|
+
* at `specUrl` and fetches UI assets from a CDN by default. No build step,
|
|
6
|
+
* no extra deps.
|
|
6
7
|
*
|
|
7
8
|
* (You can self-host the assets if your CSP forbids CDNs.)
|
|
8
9
|
*/
|
|
@@ -10,6 +11,13 @@ const JSDELIVR_ORIGIN = "https://cdn.jsdelivr.net";
|
|
|
10
11
|
function nonceAttr(nonce) {
|
|
11
12
|
return nonce ? ` nonce="${escapeHtml(nonce)}"` : "";
|
|
12
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Render a Scalar API Reference HTML page that loads `opts.specUrl`.
|
|
16
|
+
*
|
|
17
|
+
* The output is a single HTML document with configurable external assets;
|
|
18
|
+
* pair it with {@link htmlResponse} (or your own `Response`) and serve from
|
|
19
|
+
* any route.
|
|
20
|
+
*/
|
|
13
21
|
export function scalarHtml(opts) {
|
|
14
22
|
const title = escapeHtml(opts.title ?? "API Reference");
|
|
15
23
|
const url = escapeHtml(opts.specUrl);
|
|
@@ -27,6 +35,10 @@ export function scalarHtml(opts) {
|
|
|
27
35
|
<script src="${scriptUrl}"${nonce}></script>
|
|
28
36
|
</body></html>`;
|
|
29
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Render a Swagger UI HTML page that loads `opts.specUrl`. Same usage as
|
|
40
|
+
* {@link scalarHtml} but emits the classic Swagger UI bundle.
|
|
41
|
+
*/
|
|
30
42
|
export function swaggerUiHtml(opts) {
|
|
31
43
|
const title = escapeHtml(opts.title ?? "API Docs");
|
|
32
44
|
const url = escapeHtml(opts.specUrl);
|
|
@@ -47,6 +59,13 @@ export function swaggerUiHtml(opts) {
|
|
|
47
59
|
<script${nonce}>window.onload=()=>SwaggerUIBundle({url:"${url}",dom_id:"#swagger"});</script>
|
|
48
60
|
</body></html>`;
|
|
49
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Build a Content-Security-Policy string compatible with the docs HTML
|
|
64
|
+
* produced by {@link scalarHtml} / {@link swaggerUiHtml}.
|
|
65
|
+
*
|
|
66
|
+
* Allows `'self'` plus the listed `assetOrigins` (default: jsDelivr) and
|
|
67
|
+
* either `'unsafe-inline'` or the provided `scriptNonce` for scripts.
|
|
68
|
+
*/
|
|
50
69
|
export function docsContentSecurityPolicy(opts = {}) {
|
|
51
70
|
const assetOrigins = opts.assetOrigins ?? [JSDELIVR_ORIGIN];
|
|
52
71
|
const scriptSrc = ["'self'", ...assetOrigins];
|
|
@@ -65,6 +84,11 @@ export function docsContentSecurityPolicy(opts = {}) {
|
|
|
65
84
|
"connect-src 'self'",
|
|
66
85
|
].join("; ");
|
|
67
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Wrap a docs HTML string in a `Response` with safe defaults:
|
|
89
|
+
* `text/html` content type, `nosniff`, `no-referrer`, and a CSP from
|
|
90
|
+
* {@link docsContentSecurityPolicy} (or a caller-supplied override).
|
|
91
|
+
*/
|
|
68
92
|
export function htmlResponse(html, opts = {}) {
|
|
69
93
|
return new Response(html, {
|
|
70
94
|
headers: {
|
package/dist/docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -50,7 +50,7 @@ export interface ProblemRenderOptions {
|
|
|
50
50
|
/** Request id stamped into `instance` as `urn:request:<id>` for log correlation. */
|
|
51
51
|
requestId?: string;
|
|
52
52
|
/**
|
|
53
|
-
*
|
|
53
|
+
* Extra response headers (typically `ctx.set.headers`) to merge
|
|
54
54
|
* onto the rendered problem response so per-request state (CSRF rotation,
|
|
55
55
|
* session renewal, request-id, secure-headers) is not lost when a handler
|
|
56
56
|
* throws an {@link HttpError}. Existing headers baked into the error
|
|
@@ -63,7 +63,7 @@ export interface ProblemRenderOptions {
|
|
|
63
63
|
contextHeaders?: Headers | HeadersInit;
|
|
64
64
|
}
|
|
65
65
|
/**
|
|
66
|
-
*
|
|
66
|
+
* Headers that are safe to attach to a custom error response
|
|
67
67
|
* (typically a `WWW-Authenticate` challenge built by an auth helper). Any
|
|
68
68
|
* header outside this allowlist on a custom response would leak state from
|
|
69
69
|
* the request scope into a generic error response and is refused at
|
|
@@ -73,7 +73,7 @@ export interface ProblemRenderOptions {
|
|
|
73
73
|
*/
|
|
74
74
|
export declare const SAFE_CUSTOM_ERROR_RESPONSE_HEADERS: ReadonlySet<string>;
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
76
|
+
* Thrown when {@link httpError} is asked to attach a custom
|
|
77
77
|
* `Response` whose headers would leak request-scoped state (cookies,
|
|
78
78
|
* caching directives other than `no-store` / `no-cache`, server-timing,
|
|
79
79
|
* `X-*-Token` debug headers) into the error response.
|
|
@@ -92,14 +92,14 @@ export declare class MessageLeakError extends Error {
|
|
|
92
92
|
}
|
|
93
93
|
/**
|
|
94
94
|
* @internal — header-safety check applied by {@link httpError} when a custom
|
|
95
|
-
* `res` is supplied. Exported for
|
|
95
|
+
* `res` is supplied. Exported for audits and tests.
|
|
96
96
|
*/
|
|
97
97
|
export declare function checkCustomErrorResponseHeaders(headers: Headers): Array<{
|
|
98
98
|
name: string;
|
|
99
99
|
reason: string;
|
|
100
100
|
}>;
|
|
101
101
|
/**
|
|
102
|
-
*
|
|
102
|
+
* Factory for constructing an {@link HttpError} with an optional
|
|
103
103
|
* custom `res` (typically a `WWW-Authenticate` challenge). Refuses-at-
|
|
104
104
|
* construction in production under `secureDefaults` when the custom
|
|
105
105
|
* response carries headers that would leak request-scoped state — see
|
package/dist/errors.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* messages never leak to clients (security: information disclosure).
|
|
10
10
|
*/
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Headers that are safe to attach to a custom error response
|
|
13
13
|
* (typically a `WWW-Authenticate` challenge built by an auth helper). Any
|
|
14
14
|
* header outside this allowlist on a custom response would leak state from
|
|
15
15
|
* the request scope into a generic error response and is refused at
|
|
@@ -29,7 +29,7 @@ export const SAFE_CUSTOM_ERROR_RESPONSE_HEADERS = new Set([
|
|
|
29
29
|
"cache-control",
|
|
30
30
|
]);
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* Thrown when {@link httpError} is asked to attach a custom
|
|
33
33
|
* `Response` whose headers would leak request-scoped state (cookies,
|
|
34
34
|
* caching directives other than `no-store` / `no-cache`, server-timing,
|
|
35
35
|
* `X-*-Token` debug headers) into the error response.
|
|
@@ -52,7 +52,7 @@ export class MessageLeakError extends Error {
|
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
54
|
* @internal — header-safety check applied by {@link httpError} when a custom
|
|
55
|
-
* `res` is supplied. Exported for
|
|
55
|
+
* `res` is supplied. Exported for audits and tests.
|
|
56
56
|
*/
|
|
57
57
|
export function checkCustomErrorResponseHeaders(headers) {
|
|
58
58
|
const offending = [];
|
|
@@ -205,7 +205,7 @@ export class HttpError extends Error {
|
|
|
205
205
|
for (const [name, value] of Object.entries(this.headers ?? {})) {
|
|
206
206
|
headers.set(name, value);
|
|
207
207
|
}
|
|
208
|
-
//
|
|
208
|
+
// Merge Context.set.headers (CSRF rotation, session renewal,
|
|
209
209
|
// request-id, secureHeaders output) without overriding headers the
|
|
210
210
|
// error class baked in (e.g. `cache-control: no-store` on auth
|
|
211
211
|
// failures). The framework already merges these at the dispatch
|
|
@@ -301,7 +301,7 @@ export class UnauthorizedError extends HttpError {
|
|
|
301
301
|
title: "Unauthorized",
|
|
302
302
|
...(detail ? { detail } : {}),
|
|
303
303
|
},
|
|
304
|
-
//
|
|
304
|
+
// Auth-failure responses must never be cached. `no-store`
|
|
305
305
|
// already forbids both shared and private caches per RFC 9111 §5.2.2.5.
|
|
306
306
|
{ "cache-control": "no-store" });
|
|
307
307
|
this.name = "UnauthorizedError";
|
|
@@ -322,7 +322,7 @@ export class ForbiddenError extends HttpError {
|
|
|
322
322
|
title: "Forbidden",
|
|
323
323
|
...(detail ? { detail } : {}),
|
|
324
324
|
},
|
|
325
|
-
//
|
|
325
|
+
// Authorization-failure responses must never be cached.
|
|
326
326
|
{ "cache-control": "no-store" });
|
|
327
327
|
this.name = "ForbiddenError";
|
|
328
328
|
}
|
|
@@ -398,7 +398,7 @@ export class TooManyRequestsError extends HttpError {
|
|
|
398
398
|
type: "https://daloyjs.dev/errors/too-many-requests",
|
|
399
399
|
title: "Too Many Requests",
|
|
400
400
|
},
|
|
401
|
-
//
|
|
401
|
+
// Rate-limit responses must never be cached so a 429 from a
|
|
402
402
|
// private cache cannot extend the throttle window past `Retry-After`.
|
|
403
403
|
retryAfterSeconds !== undefined
|
|
404
404
|
? { "retry-after": String(retryAfterSeconds), "cache-control": "no-store" }
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/etag.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* First-party `etag()` helper with strong-validation default.
|
|
3
3
|
*
|
|
4
4
|
* Automatically computes a SHA-1 strong ETag for successful `GET` / `HEAD`
|
|
5
5
|
* responses, responds `304 Not Modified` on a matching `If-None-Match`, and
|
package/dist/etag.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* First-party `etag()` helper with strong-validation default.
|
|
3
3
|
*
|
|
4
4
|
* Automatically computes a SHA-1 strong ETag for successful `GET` / `HEAD`
|
|
5
5
|
* responses, responds `304 Not Modified` on a matching `If-None-Match`, and
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `fetchGuard()` — SSRF-hardened wrapper around the global `fetch` for
|
|
3
|
+
* outbound calls a handler makes on behalf of a user.
|
|
4
|
+
*
|
|
5
|
+
* The classic SSRF chain documented by the
|
|
6
|
+
* [Aikido write-up](https://www.aikido.dev/blog/how-a-startups-cloud-got-taken-over-by-a-simple-form-that-sends-an-email)
|
|
7
|
+
* starts with a handler that fetches a user-supplied URL (an email avatar,
|
|
8
|
+
* a webhook target, an "import from URL" feature) and ends with the
|
|
9
|
+
* attacker pivoting through the cloud metadata service
|
|
10
|
+
* (`http://169.254.169.254/...` on AWS/Azure/DigitalOcean,
|
|
11
|
+
* `http://100.100.100.200/...` on Alibaba, `http://192.0.0.192/...` on
|
|
12
|
+
* Oracle Cloud) to steal short-lived IAM credentials.
|
|
13
|
+
*
|
|
14
|
+
* `fetchGuard()` rejects requests that resolve to any of the following
|
|
15
|
+
* address ranges unless explicitly opted-in:
|
|
16
|
+
*
|
|
17
|
+
* - Loopback: `127.0.0.0/8`, `::1` (opt in: `allowLoopback`).
|
|
18
|
+
* - RFC1918 private: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`
|
|
19
|
+
* (opt in: `allowPrivate`).
|
|
20
|
+
* - Link-local **including every documented cloud metadata IP**:
|
|
21
|
+
* `169.254.0.0/16`, `fe80::/10` (opt in: `allowLinkLocal`).
|
|
22
|
+
* - Unique-local IPv6: `fc00::/7` (opt in: `allowUniqueLocal`).
|
|
23
|
+
*
|
|
24
|
+
* Plus an always-deny floor that no flag can lift:
|
|
25
|
+
*
|
|
26
|
+
* - `0.0.0.0/8` (this-network), `100.64.0.0/10` (carrier-grade NAT — covers
|
|
27
|
+
* Alibaba `100.100.100.200`), `192.0.0.0/24` (covers Oracle Cloud
|
|
28
|
+
* `192.0.0.192`), `192.0.2.0/24`, `198.18.0.0/15`, `198.51.100.0/24`,
|
|
29
|
+
* `203.0.113.0/24` (IANA-reserved), `224.0.0.0/4` (multicast),
|
|
30
|
+
* `240.0.0.0/4` (reserved), `255.255.255.255` (broadcast).
|
|
31
|
+
* - IPv6: `::/128` (unspecified), `ff00::/8` (multicast), IPv4-mapped
|
|
32
|
+
* `::ffff:0:0/96` is re-checked against the embedded IPv4 address.
|
|
33
|
+
*
|
|
34
|
+
* Redirects are followed **manually** with re-validation at each hop so
|
|
35
|
+
* an attacker cannot bypass the check via a `302 → http://169.254...`.
|
|
36
|
+
* `non-http(s)` protocols (`file:`, `ftp:`, `gopher:`, `data:`) are
|
|
37
|
+
* rejected before any network call.
|
|
38
|
+
*
|
|
39
|
+
* @since 0.34.0
|
|
40
|
+
* @module
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Reason an SSRF guard refused to dispatch a request. Surfaced on
|
|
44
|
+
* {@link SsrfBlockedError.reason} so callers can branch in tests / logs.
|
|
45
|
+
*
|
|
46
|
+
* @since 0.34.0
|
|
47
|
+
*/
|
|
48
|
+
export type SsrfBlockReason = "protocol-not-allowed" | "host-not-allowed" | "dns-resolution-failed" | "address-not-allowed" | "too-many-redirects" | "invalid-url";
|
|
49
|
+
/**
|
|
50
|
+
* Thrown by {@link fetchGuard} when an outbound request is refused. Never
|
|
51
|
+
* thrown for ordinary network failures — those bubble through unchanged
|
|
52
|
+
* so retry logic can distinguish "we refused" from "the network is sad".
|
|
53
|
+
*
|
|
54
|
+
* @since 0.34.0
|
|
55
|
+
*/
|
|
56
|
+
export declare class SsrfBlockedError extends Error {
|
|
57
|
+
readonly url: string;
|
|
58
|
+
readonly reason: SsrfBlockReason;
|
|
59
|
+
readonly address?: string;
|
|
60
|
+
constructor(url: string, reason: SsrfBlockReason, address?: string);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Options for {@link fetchGuard}. All defaults bias toward the safe
|
|
64
|
+
* posture: only public IPs reachable over `http:` / `https:` are allowed.
|
|
65
|
+
*
|
|
66
|
+
* @since 0.34.0
|
|
67
|
+
*/
|
|
68
|
+
export interface FetchGuardOptions {
|
|
69
|
+
/**
|
|
70
|
+
* URL schemes the guard will permit. Defaults to
|
|
71
|
+
* `["http:", "https:"]`. Anything else (`file:`, `data:`, `ftp:`,
|
|
72
|
+
* `gopher:`, `dict:`, `ldap:`) is rejected with
|
|
73
|
+
* `protocol-not-allowed`.
|
|
74
|
+
*/
|
|
75
|
+
allowProtocols?: readonly string[];
|
|
76
|
+
/**
|
|
77
|
+
* IP literals, IPv4/IPv6 addresses, or CIDR ranges that bypass the
|
|
78
|
+
* deny defaults. Use this for an explicit allowlist of public
|
|
79
|
+
* upstreams. Hostnames are matched case-insensitively against the
|
|
80
|
+
* post-DNS address set — pass an IP / CIDR, not a domain name.
|
|
81
|
+
*
|
|
82
|
+
* @example `["198.51.100.42", "2001:db8::/32"]`
|
|
83
|
+
*/
|
|
84
|
+
allowAddresses?: readonly string[];
|
|
85
|
+
/**
|
|
86
|
+
* Hostnames that bypass DNS-based checks entirely. Useful when the
|
|
87
|
+
* caller already verified the target out of band (e.g. internal
|
|
88
|
+
* services on a known DNS name). Compared case-insensitively against
|
|
89
|
+
* the URL hostname.
|
|
90
|
+
*/
|
|
91
|
+
allowHosts?: readonly string[];
|
|
92
|
+
/**
|
|
93
|
+
* Extra IP / CIDR matchers to deny on top of the default floor.
|
|
94
|
+
* Always wins against `allowAddresses`.
|
|
95
|
+
*/
|
|
96
|
+
denyAddresses?: readonly string[];
|
|
97
|
+
/**
|
|
98
|
+
* Allow loopback addresses (`127.0.0.0/8`, `::1`). Default `false`.
|
|
99
|
+
* Enable only for local-dev fixtures.
|
|
100
|
+
*/
|
|
101
|
+
allowLoopback?: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Allow RFC1918 private ranges (`10.0.0.0/8`, `172.16.0.0/12`,
|
|
104
|
+
* `192.168.0.0/16`). Default `false`.
|
|
105
|
+
*/
|
|
106
|
+
allowPrivate?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Allow link-local ranges (`169.254.0.0/16`, `fe80::/10`). Default
|
|
109
|
+
* `false`. **Leaving this off blocks every documented cloud
|
|
110
|
+
* metadata service IP** (AWS/Azure/DigitalOcean `169.254.169.254`,
|
|
111
|
+
* GCP `metadata.google.internal`).
|
|
112
|
+
*/
|
|
113
|
+
allowLinkLocal?: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Allow IPv6 unique-local addresses (`fc00::/7`). Default `false`.
|
|
116
|
+
*/
|
|
117
|
+
allowUniqueLocal?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Maximum number of redirects to follow with re-validation. Default
|
|
120
|
+
* `5`. Set `0` to refuse all redirects (returns the 3xx response
|
|
121
|
+
* directly).
|
|
122
|
+
*/
|
|
123
|
+
maxRedirects?: number;
|
|
124
|
+
/**
|
|
125
|
+
* Underlying fetch implementation. Defaults to `globalThis.fetch`.
|
|
126
|
+
* Useful for tests or for layering on top of an instrumented client.
|
|
127
|
+
*/
|
|
128
|
+
fetch?: typeof fetch;
|
|
129
|
+
/**
|
|
130
|
+
* DNS resolver. Defaults to `node:dns/promises.lookup(host, { all: true })`.
|
|
131
|
+
* Provide a custom resolver on non-Node runtimes (Workers, Deno
|
|
132
|
+
* without `--allow-net`) or to enforce an in-memory test fixture.
|
|
133
|
+
*/
|
|
134
|
+
resolve?: (hostname: string) => Promise<readonly string[]>;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Wrap `fetch` with an SSRF-hardened guard. The returned function has
|
|
138
|
+
* the same call signature as the global `fetch` and throws
|
|
139
|
+
* {@link SsrfBlockedError} when an outbound request would target a
|
|
140
|
+
* dangerous internal address.
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```ts
|
|
144
|
+
* import { fetchGuard } from "@daloyjs/core";
|
|
145
|
+
*
|
|
146
|
+
* const safeFetch = fetchGuard();
|
|
147
|
+
*
|
|
148
|
+
* app.route({
|
|
149
|
+
* method: "POST", path: "/import", operationId: "import",
|
|
150
|
+
* request: { json: z.object({ url: z.string().url() }) },
|
|
151
|
+
* responses: { 200: { description: "ok" } },
|
|
152
|
+
* handler: async ({ request }) => {
|
|
153
|
+
* const { url } = await request.json();
|
|
154
|
+
* const upstream = await safeFetch(url); // refuses 169.254.169.254
|
|
155
|
+
* return { status: 200 as const, body: await upstream.text() };
|
|
156
|
+
* },
|
|
157
|
+
* });
|
|
158
|
+
* ```
|
|
159
|
+
*
|
|
160
|
+
* @since 0.34.0
|
|
161
|
+
*/
|
|
162
|
+
export declare function fetchGuard(options?: FetchGuardOptions): typeof fetch;
|
|
163
|
+
//# sourceMappingURL=fetch-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-guard.d.ts","sourceRoot":"","sources":["../src/fetch-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAKH;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB,sBAAsB,GACtB,kBAAkB,GAClB,uBAAuB,GACvB,qBAAqB,GACrB,oBAAoB,GACpB,aAAa,CAAC;AAElB;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBACd,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,MAAM;CAQnE;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CAC5D;AAsBD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,KAAK,CAqHxE"}
|