princejs 2.2.2 → 2.2.3
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 +101 -1
- package/dist/middleware.d.ts +4 -0
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +51 -0
- package/dist/prince.d.ts +3 -25
- package/dist/prince.d.ts.map +1 -1
- package/dist/prince.js +12 -0
- package/package.json +1 -1
package/Readme.md
CHANGED
|
@@ -62,7 +62,7 @@ app.listen(3000);
|
|
|
62
62
|
| Feature | Import |
|
|
63
63
|
|---------|--------|
|
|
64
64
|
| Routing, Route Grouping, WebSockets, OpenAPI, Plugins, Lifecycle Hooks, Cookies, IP | `princejs` |
|
|
65
|
-
| CORS, Logger, JWT, JWKS, Auth, Rate Limit, Validate, Compress, Session, API Key, Secure Headers, Timeout, Request ID, IP Restriction, Static Files | `princejs/middleware` |
|
|
65
|
+
| CORS, Logger, JWT, JWKS, Auth, Rate Limit, Validate, Compress, Session, API Key, Secure Headers, Timeout, Request ID, IP Restriction, Static Files, Trim Trailing Slash, Middleware Combinators (`every`, `some`, `except`), `guard()` | `princejs/middleware` |
|
|
66
66
|
| File Uploads, SSE, Streaming, In-memory Cache | `princejs/helpers` |
|
|
67
67
|
| Cron Scheduler | `princejs/scheduler` |
|
|
68
68
|
| JSX / SSR | `princejs/jsx` |
|
|
@@ -268,6 +268,90 @@ app.use(ipRestriction({ denyList: ["1.2.3.4"] }));
|
|
|
268
268
|
|
|
269
269
|
---
|
|
270
270
|
|
|
271
|
+
## ✂️ Trim Trailing Slash
|
|
272
|
+
|
|
273
|
+
Automatically redirect `/users/` → `/users` so you never get mysterious 404s from a stray trailing slash:
|
|
274
|
+
|
|
275
|
+
```ts
|
|
276
|
+
import { trimTrailingSlash } from "princejs/middleware";
|
|
277
|
+
|
|
278
|
+
app.use(trimTrailingSlash()); // 301 by default
|
|
279
|
+
app.use(trimTrailingSlash(302)); // or 302 temporary redirect
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Root `/` is never redirected. Query strings are preserved — `/search/?q=bun` → `/search?q=bun`.
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 🔀 Middleware Combinators
|
|
287
|
+
|
|
288
|
+
Compose complex auth rules in a single readable line.
|
|
289
|
+
|
|
290
|
+
### `every()` — all must pass
|
|
291
|
+
|
|
292
|
+
```ts
|
|
293
|
+
import { every } from "princejs/middleware";
|
|
294
|
+
|
|
295
|
+
const isAdmin = async (req, next) => {
|
|
296
|
+
if (req.user?.role !== "admin")
|
|
297
|
+
return new Response(JSON.stringify({ error: "Forbidden" }), { status: 403 });
|
|
298
|
+
return next();
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
app.get("/admin", every(auth(), isAdmin), () => ({ ok: true }));
|
|
302
|
+
// short-circuits on first rejection — isAdmin never runs if auth() fails
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### `some()` — either must pass
|
|
306
|
+
|
|
307
|
+
```ts
|
|
308
|
+
import { some } from "princejs/middleware";
|
|
309
|
+
|
|
310
|
+
// Accept a JWT token OR an API key — whichever the client sends
|
|
311
|
+
app.get("/resource", some(auth(), apiKey({ keys: ["key_123"] })), () => ({ ok: true }));
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### `except()` — skip middleware for certain paths
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
import { except } from "princejs/middleware";
|
|
318
|
+
|
|
319
|
+
// Apply auth everywhere except /health and /
|
|
320
|
+
app.use(except(["/health", "/"], auth()));
|
|
321
|
+
|
|
322
|
+
app.get("/health", () => ({ ok: true })); // no auth
|
|
323
|
+
app.get("/private", (req) => ({ user: req.user })); // auth required
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 🛡️ guard()
|
|
329
|
+
|
|
330
|
+
Apply a validation schema to every route in a group at once — no need to repeat `validate()` on each handler:
|
|
331
|
+
|
|
332
|
+
```ts
|
|
333
|
+
import { guard } from "princejs/middleware";
|
|
334
|
+
import { z } from "zod";
|
|
335
|
+
|
|
336
|
+
app.group("/users", guard({ body: z.object({ name: z.string().min(1) }) }), (r) => {
|
|
337
|
+
r.post("/", (req) => ({ created: req.parsedBody.name })); // auto-validated
|
|
338
|
+
r.put("/:id", (req) => ({ updated: req.parsedBody.name })); // auto-validated
|
|
339
|
+
});
|
|
340
|
+
// Bad body → 400 { error: "Validation failed", details: [...] }
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Also works as standalone route middleware:
|
|
344
|
+
|
|
345
|
+
```ts
|
|
346
|
+
app.post(
|
|
347
|
+
"/items",
|
|
348
|
+
guard({ body: z.object({ name: z.string(), price: z.number() }) }),
|
|
349
|
+
(req) => ({ created: req.parsedBody })
|
|
350
|
+
);
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
271
355
|
## 📁 Static Files
|
|
272
356
|
|
|
273
357
|
Serve a directory of static files. Falls through to your routes if the file doesn't exist:
|
|
@@ -537,6 +621,11 @@ import {
|
|
|
537
621
|
secureHeaders,
|
|
538
622
|
timeout,
|
|
539
623
|
requestId,
|
|
624
|
+
trimTrailingSlash,
|
|
625
|
+
every,
|
|
626
|
+
some,
|
|
627
|
+
except,
|
|
628
|
+
guard,
|
|
540
629
|
} from "princejs/middleware";
|
|
541
630
|
import { cache, upload, sse, stream } from "princejs/helpers";
|
|
542
631
|
import { cron } from "princejs/scheduler";
|
|
@@ -559,6 +648,7 @@ app.onError((err, req, path, method) => {
|
|
|
559
648
|
// ── Global middleware ─────────────────────────────────────
|
|
560
649
|
app.use(secureHeaders());
|
|
561
650
|
app.use(requestId());
|
|
651
|
+
app.use(trimTrailingSlash());
|
|
562
652
|
app.use(timeout(10000));
|
|
563
653
|
app.use(cors());
|
|
564
654
|
app.use(logger());
|
|
@@ -600,6 +690,16 @@ app.ws("/chat", {
|
|
|
600
690
|
// ── Auth & API keys ───────────────────────────────────────
|
|
601
691
|
app.get("/protected", auth(), (req) => ({ user: req.user }));
|
|
602
692
|
app.get("/api", apiKey({ keys: ["key_123"] }), () => ({ ok: true }));
|
|
693
|
+
app.get("/admin", every(auth(), async (req, next) => {
|
|
694
|
+
if (req.user?.role !== "admin")
|
|
695
|
+
return new Response(JSON.stringify({ error: "Forbidden" }), { status: 403 });
|
|
696
|
+
return next();
|
|
697
|
+
}), () => ({ admin: true }));
|
|
698
|
+
|
|
699
|
+
// ── Validated route group ─────────────────────────────────
|
|
700
|
+
app.group("/items", guard({ body: z.object({ name: z.string().min(1) }) }), (r) => {
|
|
701
|
+
r.post("/", (req) => ({ created: req.parsedBody.name }));
|
|
702
|
+
});
|
|
603
703
|
|
|
604
704
|
// ── Helpers ───────────────────────────────────────────────
|
|
605
705
|
app.get("/cached", cache(60)(() => ({ time: Date.now() })));
|
package/dist/middleware.d.ts
CHANGED
|
@@ -57,5 +57,9 @@ export declare const serveStatic: (root: string) => (req: PrinceRequest, next: N
|
|
|
57
57
|
export declare const jwks: (jwksUrl: string, options?: {
|
|
58
58
|
algorithms?: string[];
|
|
59
59
|
}) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
60
|
+
export declare const trimTrailingSlash: (statusCode?: 301 | 302) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
61
|
+
export declare const every: (...middlewares: ((req: PrinceRequest, next: Next) => any)[]) => (req: PrinceRequest, next: Next) => Promise<Response>;
|
|
62
|
+
export declare const some: (...middlewares: ((req: PrinceRequest, next: Next) => any)[]) => (req: PrinceRequest, next: Next) => Promise<any>;
|
|
63
|
+
export declare const except: (paths: string | string[], ...middlewares: ((req: PrinceRequest, next: Next) => any)[]) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
60
64
|
export {};
|
|
61
65
|
//# sourceMappingURL=middleware.d.ts.map
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
package/dist/middleware.js
CHANGED
|
@@ -4405,9 +4405,58 @@ var jwks = (jwksUrl, options) => {
|
|
|
4405
4405
|
return next();
|
|
4406
4406
|
};
|
|
4407
4407
|
};
|
|
4408
|
+
var trimTrailingSlash = (statusCode = 301) => {
|
|
4409
|
+
const mw = async (req, next) => next();
|
|
4410
|
+
mw.__trimTrailingSlash = statusCode;
|
|
4411
|
+
return mw;
|
|
4412
|
+
};
|
|
4413
|
+
var every = (...middlewares) => {
|
|
4414
|
+
return async (req, next) => {
|
|
4415
|
+
let idx = 0;
|
|
4416
|
+
const run = async () => {
|
|
4417
|
+
if (idx >= middlewares.length)
|
|
4418
|
+
return next();
|
|
4419
|
+
const mw = middlewares[idx++];
|
|
4420
|
+
return mw(req, run);
|
|
4421
|
+
};
|
|
4422
|
+
return run();
|
|
4423
|
+
};
|
|
4424
|
+
};
|
|
4425
|
+
var some = (...middlewares) => {
|
|
4426
|
+
return async (req, next) => {
|
|
4427
|
+
let lastRejection;
|
|
4428
|
+
for (const mw of middlewares) {
|
|
4429
|
+
let passed = false;
|
|
4430
|
+
const result = await mw(req, async () => {
|
|
4431
|
+
passed = true;
|
|
4432
|
+
return next();
|
|
4433
|
+
});
|
|
4434
|
+
if (passed)
|
|
4435
|
+
return result;
|
|
4436
|
+
lastRejection = result;
|
|
4437
|
+
}
|
|
4438
|
+
return lastRejection;
|
|
4439
|
+
};
|
|
4440
|
+
};
|
|
4441
|
+
var except = (paths, ...middlewares) => {
|
|
4442
|
+
const excluded = new Set(Array.isArray(paths) ? paths : [paths]);
|
|
4443
|
+
const combined = every(...middlewares);
|
|
4444
|
+
return async (req, next) => {
|
|
4445
|
+
const url = req.url;
|
|
4446
|
+
const ss = url.indexOf("//");
|
|
4447
|
+
const pathStart = ss === -1 ? 0 : url.indexOf("/", ss + 2);
|
|
4448
|
+
const qIdx = url.indexOf("?", pathStart);
|
|
4449
|
+
const pathname = pathStart === -1 ? "/" : qIdx === -1 ? url.slice(pathStart) : url.slice(pathStart, qIdx);
|
|
4450
|
+
if (excluded.has(pathname))
|
|
4451
|
+
return next();
|
|
4452
|
+
return combined(req, next);
|
|
4453
|
+
};
|
|
4454
|
+
};
|
|
4408
4455
|
export {
|
|
4409
4456
|
validate,
|
|
4457
|
+
trimTrailingSlash,
|
|
4410
4458
|
timeout,
|
|
4459
|
+
some,
|
|
4411
4460
|
signJWT,
|
|
4412
4461
|
session,
|
|
4413
4462
|
serveStatic,
|
|
@@ -4418,6 +4467,8 @@ export {
|
|
|
4418
4467
|
jwt,
|
|
4419
4468
|
jwks,
|
|
4420
4469
|
ipRestriction,
|
|
4470
|
+
except,
|
|
4471
|
+
every,
|
|
4421
4472
|
cors,
|
|
4422
4473
|
compress2 as compress,
|
|
4423
4474
|
auth,
|
package/dist/prince.d.ts
CHANGED
|
@@ -69,6 +69,9 @@ export interface RouteOperation {
|
|
|
69
69
|
responses?: Record<string, unknown>;
|
|
70
70
|
[key: string]: unknown;
|
|
71
71
|
}
|
|
72
|
+
export declare function guard(schema: {
|
|
73
|
+
body?: z.ZodTypeAny;
|
|
74
|
+
}): Middleware;
|
|
72
75
|
export interface GroupRouter {
|
|
73
76
|
get(path: string, ...args: (RouteHandler | Middleware)[]): GroupRouter;
|
|
74
77
|
post(path: string, ...args: (RouteHandler | Middleware)[]): GroupRouter;
|
|
@@ -149,31 +152,6 @@ export declare class Prince {
|
|
|
149
152
|
private executeHandler;
|
|
150
153
|
handleFetch(req: Request): Promise<Response>;
|
|
151
154
|
fetch(req: Request): Promise<Response>;
|
|
152
|
-
/**
|
|
153
|
-
* Mounts an OpenAPI spec + Scalar UI onto this Prince app.
|
|
154
|
-
*
|
|
155
|
-
* Calling this method returns an `OpenAPIBuilder` whose `.route()` method
|
|
156
|
-
* registers a route on the Prince app **and** writes the matching path entry
|
|
157
|
-
* into the OpenAPI spec simultaneously — so the two can never drift.
|
|
158
|
-
*
|
|
159
|
-
* Two routes are auto-registered:
|
|
160
|
-
* GET `docsPath` → Scalar UI (e.g. /docs)
|
|
161
|
-
* GET `docsPath`.json → Raw spec (e.g. /docs.json)
|
|
162
|
-
*
|
|
163
|
-
* @example
|
|
164
|
-
* const app = prince();
|
|
165
|
-
* const api = app.openapi({ title: "My API", version: "1.0.0" }, "/docs");
|
|
166
|
-
*
|
|
167
|
-
* // Registers GET /hello on Prince AND adds it to the OpenAPI spec
|
|
168
|
-
* api.route("GET", "/hello", {
|
|
169
|
-
* summary: "Say hello",
|
|
170
|
-
* responses: { 200: { description: "OK" } },
|
|
171
|
-
* }, (req) => ({ message: "hello" }));
|
|
172
|
-
*
|
|
173
|
-
* app.listen(3000);
|
|
174
|
-
* // → GET /docs → Scalar UI
|
|
175
|
-
* // → GET /docs.json → raw OpenAPI JSON
|
|
176
|
-
*/
|
|
177
155
|
openapi(info: {
|
|
178
156
|
title: string;
|
|
179
157
|
version: string;
|
package/dist/prince.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prince.d.ts","sourceRoot":"","sources":["../src/prince.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prince.d.ts","sourceRoot":"","sources":["../src/prince.ts"],"names":[],"mappings":"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"}
|
package/dist/prince.js
CHANGED
|
@@ -366,6 +366,11 @@ function buildResponses(responseSchema, existingResponses) {
|
|
|
366
366
|
...base
|
|
367
367
|
};
|
|
368
368
|
}
|
|
369
|
+
function guard(schema) {
|
|
370
|
+
if (!schema.body)
|
|
371
|
+
return (_req, next) => next();
|
|
372
|
+
return validate(schema.body);
|
|
373
|
+
}
|
|
369
374
|
|
|
370
375
|
class Prince {
|
|
371
376
|
devMode;
|
|
@@ -767,6 +772,12 @@ class Prince {
|
|
|
767
772
|
}
|
|
768
773
|
const routeMatch = this.findRoute(method, pathname);
|
|
769
774
|
if (!routeMatch) {
|
|
775
|
+
if (pathname.length > 1 && pathname.endsWith("/")) {
|
|
776
|
+
const search2 = extractSearch(rawUrl);
|
|
777
|
+
const trimmed = pathname.slice(0, -1) + (search2 ? `?${search2}` : "");
|
|
778
|
+
const status = this.middlewares.find((m) => m.__trimTrailingSlash)?.__trimTrailingSlash ?? 301;
|
|
779
|
+
return new Response(null, { status, headers: { Location: trimmed } });
|
|
780
|
+
}
|
|
770
781
|
return this.json({ error: "Not Found" }, 404);
|
|
771
782
|
}
|
|
772
783
|
if (routeMatch.allowedMethods && !routeMatch.handler) {
|
|
@@ -927,5 +938,6 @@ function renderScalarHTML(spec, options = {}) {
|
|
|
927
938
|
var prince = (dev = false) => new Prince(dev);
|
|
928
939
|
export {
|
|
929
940
|
prince,
|
|
941
|
+
guard,
|
|
930
942
|
Prince
|
|
931
943
|
};
|
package/package.json
CHANGED