@nexus_js/middleware 0.6.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nexus Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # @nexus_js/middleware
2
+
3
+ Nexus middleware — edge-compatible request pipeline with Web Standard APIs.
4
+
5
+ ## Documentation
6
+
7
+ All guides, API reference, and examples live on **[nexusjs.dev](https://nexusjs.dev)**.
8
+
9
+ ## Links
10
+
11
+ - **Website:** [https://nexusjs.dev](https://nexusjs.dev)
12
+ - **Repository:** [github.com/bierfor/nexus](https://github.com/bierfor/nexus) (see `packages/middleware/`)
13
+ - **Issues:** [github.com/bierfor/nexus/issues](https://github.com/bierfor/nexus/issues)
14
+
15
+ ## License
16
+
17
+ MIT © Nexus contributors
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Nexus Middleware — Web-standard request pipeline.
3
+ *
4
+ * 100% based on `Request` / `Response` — runs identically on:
5
+ * - Node.js 20+
6
+ * - Bun
7
+ * - Deno
8
+ * - Cloudflare Workers
9
+ * - Vercel Edge Runtime
10
+ * - Netlify Edge Functions
11
+ *
12
+ * Usage in src/middleware.ts:
13
+ * import { defineMiddleware, sequence, auth, cors, rateLimit } from '@nexus_js/middleware';
14
+ *
15
+ * export default defineMiddleware(
16
+ * sequence(
17
+ * cors({ origins: ['https://myapp.com'] }),
18
+ * rateLimit({ max: 100, window: 60 }),
19
+ * auth({ public: ['/login', '/register'] }),
20
+ * )
21
+ * );
22
+ */
23
+ export type MiddlewareFn = (request: Request, next: () => Promise<Response>) => Promise<Response> | Response;
24
+ export type Middleware = MiddlewareFn;
25
+ /**
26
+ * Defines the middleware entry point.
27
+ * Export this from `src/middleware.ts`.
28
+ */
29
+ export declare function defineMiddleware(fn: MiddlewareFn): MiddlewareFn;
30
+ /**
31
+ * Composes multiple middlewares into a single pipeline.
32
+ * They run left-to-right.
33
+ */
34
+ export declare function sequence(...middlewares: MiddlewareFn[]): MiddlewareFn;
35
+ export interface CORSOptions {
36
+ /** Allowed origins. Use '*' for any. Default: '*' */
37
+ origins?: string | string[] | ((origin: string) => boolean);
38
+ methods?: string[];
39
+ headers?: string[];
40
+ credentials?: boolean;
41
+ maxAge?: number;
42
+ }
43
+ /**
44
+ * CORS middleware — handles preflight and injects CORS headers.
45
+ */
46
+ export declare function cors(opts?: CORSOptions): MiddlewareFn;
47
+ export interface RateLimitOptions {
48
+ /** Max requests per window */
49
+ max: number;
50
+ /** Window size in seconds */
51
+ window: number;
52
+ /** Key function to identify clients (default: IP-based) */
53
+ keyFn?: (request: Request) => string;
54
+ /** Message returned when rate limited */
55
+ message?: string;
56
+ }
57
+ /**
58
+ * Rate limiting middleware using a sliding window algorithm.
59
+ */
60
+ export declare function rateLimit(opts: RateLimitOptions): MiddlewareFn;
61
+ export interface AuthOptions {
62
+ /** Public paths that skip auth (supports wildcards like '/api/*') */
63
+ public?: string[];
64
+ /** Where to redirect unauthenticated users */
65
+ loginUrl?: string;
66
+ /** Custom session validator — return truthy if valid */
67
+ validate?: (request: Request) => boolean | Promise<boolean>;
68
+ }
69
+ /**
70
+ * Authentication guard middleware.
71
+ * Redirects to loginUrl if the user is not authenticated.
72
+ */
73
+ export declare function auth(opts?: AuthOptions): MiddlewareFn;
74
+ export interface GeoOptions {
75
+ /** Block requests from these country codes */
76
+ blocked?: string[];
77
+ /** Allow only these country codes */
78
+ allowed?: string[];
79
+ }
80
+ /**
81
+ * Geo-blocking middleware — uses Cloudflare/Vercel edge headers.
82
+ */
83
+ export declare function geo(opts: GeoOptions): MiddlewareFn;
84
+ /**
85
+ * Security headers middleware — HSTS, CSP, X-Frame-Options, etc.
86
+ */
87
+ export declare function securityHeaders(opts?: {
88
+ csp?: string;
89
+ hsts?: boolean;
90
+ noSniff?: boolean;
91
+ frameOptions?: 'DENY' | 'SAMEORIGIN';
92
+ }): MiddlewareFn;
93
+ /**
94
+ * Request logger middleware — logs method, path, status and duration.
95
+ */
96
+ export declare function logger(opts?: {
97
+ format?: 'tiny' | 'combined';
98
+ }): MiddlewareFn;
99
+ /**
100
+ * Wraps the Nexus middleware pipeline in a Cloudflare Worker handler.
101
+ */
102
+ export declare function toCloudflareHandler(middleware: MiddlewareFn): {
103
+ fetch(request: Request, env: unknown, ctx: {
104
+ waitUntil: (p: Promise<unknown>) => void;
105
+ }): Promise<Response>;
106
+ };
107
+ /**
108
+ * Wraps the middleware for Vercel Edge Functions.
109
+ */
110
+ export declare function toVercelEdge(middleware: MiddlewareFn): (request: Request) => Promise<Response>;
111
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,KAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AAElC,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC;AAItC;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,YAAY,CAE/D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,WAAW,EAAE,YAAY,EAAE,GAAG,YAAY,CAgBrE;AAID,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,GAAE,WAAgB,GAAG,YAAY,CAuCzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IACrC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAsC9D;AAED,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,GAAE,WAAgB,GAAG,YAAY,CA6BzD;AAED,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAwBlD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;CACjC,GAAG,YAAY,CAuBpB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;CAAO,GAAG,YAAY,CAehF;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,YAAY;mBAEnC,OAAO,OAAO,OAAO,OAAO;QAAE,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;EAIpH;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,YAAY,IACrC,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CAGnD"}
package/dist/index.js ADDED
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Nexus Middleware — Web-standard request pipeline.
3
+ *
4
+ * 100% based on `Request` / `Response` — runs identically on:
5
+ * - Node.js 20+
6
+ * - Bun
7
+ * - Deno
8
+ * - Cloudflare Workers
9
+ * - Vercel Edge Runtime
10
+ * - Netlify Edge Functions
11
+ *
12
+ * Usage in src/middleware.ts:
13
+ * import { defineMiddleware, sequence, auth, cors, rateLimit } from '@nexus_js/middleware';
14
+ *
15
+ * export default defineMiddleware(
16
+ * sequence(
17
+ * cors({ origins: ['https://myapp.com'] }),
18
+ * rateLimit({ max: 100, window: 60 }),
19
+ * auth({ public: ['/login', '/register'] }),
20
+ * )
21
+ * );
22
+ */
23
+ // ── Core ──────────────────────────────────────────────────────────────────────
24
+ /**
25
+ * Defines the middleware entry point.
26
+ * Export this from `src/middleware.ts`.
27
+ */
28
+ export function defineMiddleware(fn) {
29
+ return fn;
30
+ }
31
+ /**
32
+ * Composes multiple middlewares into a single pipeline.
33
+ * They run left-to-right.
34
+ */
35
+ export function sequence(...middlewares) {
36
+ return async (request, next) => {
37
+ let index = -1;
38
+ const dispatch = async (i) => {
39
+ if (i <= index)
40
+ throw new Error('next() called multiple times');
41
+ index = i;
42
+ const fn = middlewares[i];
43
+ if (!fn)
44
+ return next();
45
+ return fn(request, () => dispatch(i + 1));
46
+ };
47
+ return dispatch(0);
48
+ };
49
+ }
50
+ /**
51
+ * CORS middleware — handles preflight and injects CORS headers.
52
+ */
53
+ export function cors(opts = {}) {
54
+ const allowedMethods = (opts.methods ?? ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS']).join(', ');
55
+ const allowedHeaders = (opts.headers ?? ['Content-Type', 'Authorization', 'X-Nexus-Action']).join(', ');
56
+ return async (request, next) => {
57
+ const origin = request.headers.get('origin') ?? '';
58
+ const isAllowed = (() => {
59
+ const o = opts.origins ?? '*';
60
+ if (o === '*')
61
+ return true;
62
+ if (typeof o === 'function')
63
+ return o(origin);
64
+ if (Array.isArray(o))
65
+ return o.includes(origin);
66
+ return o === origin;
67
+ })();
68
+ // Preflight
69
+ if (request.method === 'OPTIONS') {
70
+ return new Response(null, {
71
+ status: 204,
72
+ headers: {
73
+ 'access-control-allow-origin': isAllowed ? origin || '*' : '',
74
+ 'access-control-allow-methods': allowedMethods,
75
+ 'access-control-allow-headers': allowedHeaders,
76
+ 'access-control-max-age': String(opts.maxAge ?? 86400),
77
+ ...(opts.credentials ? { 'access-control-allow-credentials': 'true' } : {}),
78
+ },
79
+ });
80
+ }
81
+ const response = await next();
82
+ const headers = new Headers(response.headers);
83
+ if (isAllowed) {
84
+ headers.set('access-control-allow-origin', origin || '*');
85
+ if (opts.credentials)
86
+ headers.set('access-control-allow-credentials', 'true');
87
+ }
88
+ return new Response(response.body, { status: response.status, headers });
89
+ };
90
+ }
91
+ /** In-memory rate limit store (use Redis adapter in production) */
92
+ const rateLimitStore = new Map();
93
+ /**
94
+ * Rate limiting middleware using a sliding window algorithm.
95
+ */
96
+ export function rateLimit(opts) {
97
+ return async (request, next) => {
98
+ const key = opts.keyFn?.(request) ?? getClientIP(request);
99
+ const now = Date.now();
100
+ const windowMs = opts.window * 1000;
101
+ const entry = rateLimitStore.get(key);
102
+ if (!entry || now > entry.resetAt) {
103
+ rateLimitStore.set(key, { count: 1, resetAt: now + windowMs });
104
+ const response = await next();
105
+ return addRateLimitHeaders(response, opts.max, opts.max - 1, Math.floor((now + windowMs) / 1000));
106
+ }
107
+ entry.count++;
108
+ if (entry.count > opts.max) {
109
+ const retryAfter = Math.ceil((entry.resetAt - now) / 1000);
110
+ return new Response(opts.message ?? 'Too Many Requests', {
111
+ status: 429,
112
+ headers: {
113
+ 'retry-after': String(retryAfter),
114
+ 'x-ratelimit-limit': String(opts.max),
115
+ 'x-ratelimit-remaining': '0',
116
+ 'x-ratelimit-reset': String(Math.floor(entry.resetAt / 1000)),
117
+ 'content-type': 'text/plain',
118
+ },
119
+ });
120
+ }
121
+ const response = await next();
122
+ return addRateLimitHeaders(response, opts.max, opts.max - entry.count, Math.floor(entry.resetAt / 1000));
123
+ };
124
+ }
125
+ /**
126
+ * Authentication guard middleware.
127
+ * Redirects to loginUrl if the user is not authenticated.
128
+ */
129
+ export function auth(opts = {}) {
130
+ const publicPaths = opts.public ?? [];
131
+ const loginUrl = opts.loginUrl ?? '/login';
132
+ return async (request, next) => {
133
+ const url = new URL(request.url);
134
+ const path = url.pathname;
135
+ // Check if path is public
136
+ const isPublic = publicPaths.some((p) => {
137
+ if (p.endsWith('*'))
138
+ return path.startsWith(p.slice(0, -1));
139
+ return path === p;
140
+ });
141
+ if (isPublic)
142
+ return next();
143
+ // Custom validator
144
+ if (opts.validate) {
145
+ const valid = await opts.validate(request);
146
+ if (valid)
147
+ return next();
148
+ }
149
+ else {
150
+ // Default: check for session cookie
151
+ const cookie = request.headers.get('cookie') ?? '';
152
+ if (cookie.includes('nx-session='))
153
+ return next();
154
+ }
155
+ // Not authenticated — redirect
156
+ return Response.redirect(loginUrl, 302);
157
+ };
158
+ }
159
+ /**
160
+ * Geo-blocking middleware — uses Cloudflare/Vercel edge headers.
161
+ */
162
+ export function geo(opts) {
163
+ return async (request, next) => {
164
+ const country = request.headers.get('cf-ipcountry') ??
165
+ request.headers.get('x-vercel-ip-country') ??
166
+ request.headers.get('x-country-code') ??
167
+ 'XX';
168
+ if (opts.blocked?.includes(country)) {
169
+ return new Response('Access denied from your region.', {
170
+ status: 403,
171
+ headers: { 'content-type': 'text/plain' },
172
+ });
173
+ }
174
+ if (opts.allowed && !opts.allowed.includes(country)) {
175
+ return new Response('Access denied from your region.', {
176
+ status: 403,
177
+ headers: { 'content-type': 'text/plain' },
178
+ });
179
+ }
180
+ return next();
181
+ };
182
+ }
183
+ /**
184
+ * Security headers middleware — HSTS, CSP, X-Frame-Options, etc.
185
+ */
186
+ export function securityHeaders(opts = {}) {
187
+ return async (request, next) => {
188
+ const response = await next();
189
+ const headers = new Headers(response.headers);
190
+ if (opts.hsts !== false) {
191
+ headers.set('strict-transport-security', 'max-age=31536000; includeSubDomains');
192
+ }
193
+ if (opts.noSniff !== false) {
194
+ headers.set('x-content-type-options', 'nosniff');
195
+ }
196
+ if (opts.frameOptions !== undefined) {
197
+ headers.set('x-frame-options', opts.frameOptions);
198
+ }
199
+ if (opts.csp) {
200
+ headers.set('content-security-policy', opts.csp);
201
+ }
202
+ headers.set('referrer-policy', 'strict-origin-when-cross-origin');
203
+ headers.set('permissions-policy', 'camera=(), microphone=(), geolocation=()');
204
+ return new Response(response.body, { status: response.status, headers });
205
+ };
206
+ }
207
+ /**
208
+ * Request logger middleware — logs method, path, status and duration.
209
+ */
210
+ export function logger(opts = {}) {
211
+ return async (request, next) => {
212
+ const start = Date.now();
213
+ const url = new URL(request.url);
214
+ const response = await next();
215
+ const ms = Date.now() - start;
216
+ const status = response.status;
217
+ const color = status >= 500 ? '\x1b[31m' : status >= 400 ? '\x1b[33m' : '\x1b[32m';
218
+ console.log(` ${color}${status}\x1b[0m ${request.method} ${url.pathname} \x1b[2m${ms}ms\x1b[0m`);
219
+ return response;
220
+ };
221
+ }
222
+ // ── Edge adapter factory ───────────────────────────────────────────────────────
223
+ /**
224
+ * Wraps the Nexus middleware pipeline in a Cloudflare Worker handler.
225
+ */
226
+ export function toCloudflareHandler(middleware) {
227
+ return {
228
+ async fetch(request, env, ctx) {
229
+ return middleware(request, () => Promise.resolve(new Response('Not Found', { status: 404 })));
230
+ },
231
+ };
232
+ }
233
+ /**
234
+ * Wraps the middleware for Vercel Edge Functions.
235
+ */
236
+ export function toVercelEdge(middleware) {
237
+ return async (request) => {
238
+ return middleware(request, () => Promise.resolve(new Response('Not Found', { status: 404 })));
239
+ };
240
+ }
241
+ // ─────────────────────────────────────────────────────────────────────────────
242
+ // Helpers
243
+ // ─────────────────────────────────────────────────────────────────────────────
244
+ function getClientIP(request) {
245
+ return (request.headers.get('cf-connecting-ip') ??
246
+ request.headers.get('x-real-ip') ??
247
+ request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ??
248
+ 'unknown');
249
+ }
250
+ function addRateLimitHeaders(response, limit, remaining, reset) {
251
+ const headers = new Headers(response.headers);
252
+ headers.set('x-ratelimit-limit', String(limit));
253
+ headers.set('x-ratelimit-remaining', String(Math.max(0, remaining)));
254
+ headers.set('x-ratelimit-reset', String(reset));
255
+ return new Response(response.body, { status: response.status, headers });
256
+ }
257
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@nexus_js/middleware",
3
+ "version": "0.6.0",
4
+ "description": "Nexus middleware — edge-compatible request pipeline with Web Standard APIs",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "devDependencies": {
15
+ "@types/node": "^22.0.0",
16
+ "typescript": "^5.5.0"
17
+ },
18
+ "license": "MIT",
19
+ "homepage": "https://nexusjs.dev",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/bierfor/nexus.git",
23
+ "directory": "packages/middleware"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/bierfor/nexus/issues"
27
+ },
28
+ "keywords": [
29
+ "nexus",
30
+ "framework",
31
+ "full-stack",
32
+ "svelte",
33
+ "islands",
34
+ "ssr",
35
+ "vite",
36
+ "server-actions"
37
+ ],
38
+ "files": [
39
+ "dist",
40
+ "README.md"
41
+ ],
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "registry": "https://registry.npmjs.org/"
45
+ },
46
+ "scripts": {
47
+ "build": "tsc -p tsconfig.json",
48
+ "dev": "tsc -p tsconfig.json --watch",
49
+ "clean": "rm -rf dist"
50
+ }
51
+ }