@neutron-build/auth 0.1.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 Tyler
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,25 @@
1
+ # @neutron-build/auth
2
+
3
+ Authentication middleware for Neutron.
4
+
5
+ Integrates with better-auth and next-auth. Session management, RBAC, and multi-tenant support.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @neutron-build/auth
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```typescript
16
+ import { authMiddleware } from "@neutron-build/auth";
17
+ ```
18
+
19
+ ## Documentation
20
+
21
+ [neutron.build](https://neutron.build)
22
+
23
+ ## License
24
+
25
+ MIT
@@ -0,0 +1,61 @@
1
+ import type { AppContext, MiddlewareFn } from "@neutron-build/core";
2
+ export interface AuthUser {
3
+ id?: string;
4
+ email?: string;
5
+ name?: string;
6
+ [key: string]: unknown;
7
+ }
8
+ export interface AuthSession<TUser extends AuthUser = AuthUser> {
9
+ user?: TUser | null;
10
+ expiresAt?: string | number | Date;
11
+ [key: string]: unknown;
12
+ }
13
+ export interface NeutronAuthState<TUser extends AuthUser = AuthUser> {
14
+ adapter: string;
15
+ session: AuthSession<TUser> | null;
16
+ user: TUser | null;
17
+ isAuthenticated: boolean;
18
+ }
19
+ export interface AuthAdapter<TUser extends AuthUser = AuthUser> {
20
+ name: string;
21
+ getSession(request: Request): Promise<AuthSession<TUser> | null>;
22
+ }
23
+ export interface AuthContextMiddlewareOptions<TUser extends AuthUser = AuthUser> {
24
+ adapter: AuthAdapter<TUser>;
25
+ contextKey?: string;
26
+ }
27
+ export interface ProtectedRouteOptions<TUser extends AuthUser = AuthUser> {
28
+ adapter?: AuthAdapter<TUser>;
29
+ contextKey?: string;
30
+ redirectTo?: string;
31
+ unauthorizedStatus?: number;
32
+ }
33
+ export declare function createAuthContextMiddleware<TUser extends AuthUser = AuthUser>(options: AuthContextMiddlewareOptions<TUser>): MiddlewareFn;
34
+ export declare function createProtectedRouteMiddleware<TUser extends AuthUser = AuthUser>(options?: ProtectedRouteOptions<TUser>): MiddlewareFn;
35
+ export declare function getAuthFromContext<TUser extends AuthUser = AuthUser>(context: AppContext, contextKey?: string): NeutronAuthState<TUser> | null;
36
+ export declare function requireAuth<TUser extends AuthUser = AuthUser>(context: AppContext, contextKey?: string): NeutronAuthState<TUser>;
37
+ export interface BetterAuthAdapterOptions<TUser extends AuthUser = AuthUser> {
38
+ auth: BetterAuthLike;
39
+ name?: string;
40
+ }
41
+ interface BetterAuthLike {
42
+ api?: {
43
+ getSession?: (args: {
44
+ headers: Headers;
45
+ request: Request;
46
+ }) => Promise<unknown>;
47
+ };
48
+ getSession?: (request: Request) => Promise<unknown>;
49
+ }
50
+ export declare function createBetterAuthAdapter<TUser extends AuthUser = AuthUser>(options: BetterAuthAdapterOptions<TUser>): AuthAdapter<TUser>;
51
+ export interface AuthJsAdapterOptions<TUser extends AuthUser = AuthUser> {
52
+ auth: AuthJsLike;
53
+ name?: string;
54
+ }
55
+ type AuthJsLike = ((request: Request) => Promise<unknown>) | {
56
+ auth?: (request: Request) => Promise<unknown>;
57
+ getSession?: (request: Request) => Promise<unknown>;
58
+ };
59
+ export declare function createAuthJsAdapter<TUser extends AuthUser = AuthUser>(options: AuthJsAdapterOptions<TUser>): AuthAdapter<TUser>;
60
+ export {};
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,WAAW,QAAQ;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ;IAC5D,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,4BAA4B,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ;IAC7E,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ;IACtE,OAAO,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,wBAAgB,2BAA2B,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EAC3E,OAAO,EAAE,4BAA4B,CAAC,KAAK,CAAC,GAC3C,YAAY,CAgBd;AAED,wBAAgB,8BAA8B,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EAC9E,OAAO,GAAE,qBAAqB,CAAC,KAAK,CAAM,GACzC,YAAY,CAgCd;AAED,wBAAgB,kBAAkB,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EAClE,OAAO,EAAE,UAAU,EACnB,UAAU,GAAE,MAAiC,GAC5C,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAMhC;AAED,wBAAgB,WAAW,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EAC3D,OAAO,EAAE,UAAU,EACnB,UAAU,GAAE,MAAiC,GAC5C,gBAAgB,CAAC,KAAK,CAAC,CAMzB;AAED,MAAM,WAAW,wBAAwB,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ;IACzE,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,GAAG,CAAC,EAAE;QACJ,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,OAAO,EAAE,OAAO,CAAA;SAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KACjF,CAAC;IACF,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACvE,OAAO,EAAE,wBAAwB,CAAC,KAAK,CAAC,GACvC,WAAW,CAAC,KAAK,CAAC,CAapB;AAED,MAAM,WAAW,oBAAoB,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ;IACrE,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,KAAK,UAAU,GACX,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GACxC;IACE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD,CAAC;AAEN,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACnE,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC,GACnC,WAAW,CAAC,KAAK,CAAC,CAepB"}
package/dist/index.js ADDED
@@ -0,0 +1,166 @@
1
+ const DEFAULT_AUTH_CONTEXT_KEY = "auth";
2
+ export function createAuthContextMiddleware(options) {
3
+ const contextKey = options.contextKey || DEFAULT_AUTH_CONTEXT_KEY;
4
+ const adapter = options.adapter;
5
+ return async (request, context, next) => {
6
+ const session = await adapter.getSession(request);
7
+ const user = resolveUserFromSession(session);
8
+ context[contextKey] = {
9
+ adapter: adapter.name,
10
+ session,
11
+ user,
12
+ isAuthenticated: Boolean(user),
13
+ };
14
+ return await next();
15
+ };
16
+ }
17
+ export function createProtectedRouteMiddleware(options = {}) {
18
+ const contextKey = options.contextKey || DEFAULT_AUTH_CONTEXT_KEY;
19
+ const redirectTo = options.redirectTo;
20
+ const unauthorizedStatus = options.unauthorizedStatus ?? 401;
21
+ return async (request, context, next) => {
22
+ const existing = getAuthFromContext(context, contextKey);
23
+ let authState = existing;
24
+ if (!authState && options.adapter) {
25
+ const session = await options.adapter.getSession(request);
26
+ const user = resolveUserFromSession(session);
27
+ authState = {
28
+ adapter: options.adapter.name,
29
+ session,
30
+ user,
31
+ isAuthenticated: Boolean(user),
32
+ };
33
+ context[contextKey] = authState;
34
+ }
35
+ if (!authState?.isAuthenticated) {
36
+ if (redirectTo) {
37
+ return new Response(null, {
38
+ status: 302,
39
+ headers: { Location: safeRedirectLocation(redirectTo, request) },
40
+ });
41
+ }
42
+ return new Response("Unauthorized", { status: unauthorizedStatus });
43
+ }
44
+ return await next();
45
+ };
46
+ }
47
+ export function getAuthFromContext(context, contextKey = DEFAULT_AUTH_CONTEXT_KEY) {
48
+ const value = context[contextKey];
49
+ if (!value || typeof value !== "object") {
50
+ return null;
51
+ }
52
+ return value;
53
+ }
54
+ export function requireAuth(context, contextKey = DEFAULT_AUTH_CONTEXT_KEY) {
55
+ const auth = getAuthFromContext(context, contextKey);
56
+ if (!auth?.isAuthenticated) {
57
+ throw new Response("Unauthorized", { status: 401 });
58
+ }
59
+ return auth;
60
+ }
61
+ export function createBetterAuthAdapter(options) {
62
+ return {
63
+ name: options.name || "better-auth",
64
+ async getSession(request) {
65
+ let raw = null;
66
+ if (options.auth.api?.getSession) {
67
+ raw = await options.auth.api.getSession({ headers: request.headers, request });
68
+ }
69
+ else if (options.auth.getSession) {
70
+ raw = await options.auth.getSession(request);
71
+ }
72
+ return normalizeSession(raw);
73
+ },
74
+ };
75
+ }
76
+ export function createAuthJsAdapter(options) {
77
+ return {
78
+ name: options.name || "authjs",
79
+ async getSession(request) {
80
+ let raw = null;
81
+ if (typeof options.auth === "function") {
82
+ raw = await options.auth(request);
83
+ }
84
+ else if (options.auth.auth) {
85
+ raw = await options.auth.auth(request);
86
+ }
87
+ else if (options.auth.getSession) {
88
+ raw = await options.auth.getSession(request);
89
+ }
90
+ return normalizeSession(raw);
91
+ },
92
+ };
93
+ }
94
+ function normalizeSession(value) {
95
+ if (!value || typeof value !== "object") {
96
+ return null;
97
+ }
98
+ const candidate = value;
99
+ if ("session" in candidate && candidate.session && typeof candidate.session === "object") {
100
+ return candidate.session;
101
+ }
102
+ // Auth.js commonly returns the session object directly.
103
+ return candidate;
104
+ }
105
+ function resolveUserFromSession(session) {
106
+ if (!session || typeof session !== "object") {
107
+ return null;
108
+ }
109
+ // Enforce expiry: an expired session is not authenticated even if an adapter
110
+ // still returns a user object attached to it.
111
+ if (isSessionExpired(session)) {
112
+ return null;
113
+ }
114
+ const user = session.user;
115
+ if (!user || typeof user !== "object") {
116
+ return null;
117
+ }
118
+ return user;
119
+ }
120
+ function isSessionExpired(session) {
121
+ const exp = session.expiresAt;
122
+ if (exp === undefined || exp === null) {
123
+ return false;
124
+ }
125
+ let ms;
126
+ if (exp instanceof Date) {
127
+ ms = exp.getTime();
128
+ }
129
+ else if (typeof exp === "number") {
130
+ // Accept both seconds- and milliseconds-epoch values.
131
+ ms = exp < 1e12 ? exp * 1000 : exp;
132
+ }
133
+ else {
134
+ ms = Date.parse(String(exp));
135
+ }
136
+ if (Number.isNaN(ms)) {
137
+ return false;
138
+ }
139
+ return ms <= Date.now();
140
+ }
141
+ /**
142
+ * Resolve a post-auth redirect target to a safe, same-origin Location. Relative
143
+ * paths are allowed as-is; absolute URLs are permitted only when same-origin;
144
+ * protocol-relative (`//host`), backslash, and cross-origin targets fall back
145
+ * to "/" — preventing an open redirect if `redirectTo` is ever derived from
146
+ * request input.
147
+ */
148
+ function safeRedirectLocation(target, request) {
149
+ // Browsers strip TAB/LF/CR from URLs, so "/\t/evil" would resolve to
150
+ // "//evil" client-side — remove them before the same-origin checks.
151
+ const cleaned = target.replace(/[\t\n\r]/g, "");
152
+ if (cleaned.startsWith("/") && !cleaned.startsWith("//") && !cleaned.startsWith("/\\")) {
153
+ return cleaned;
154
+ }
155
+ try {
156
+ const url = new URL(cleaned, request.url);
157
+ if (url.origin === new URL(request.url).origin) {
158
+ return url.pathname + url.search + url.hash;
159
+ }
160
+ }
161
+ catch {
162
+ // fall through to safe default
163
+ }
164
+ return "/";
165
+ }
166
+ //# 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,63 @@
1
+ {
2
+ "name": "@neutron-build/auth",
3
+ "version": "0.1.0",
4
+ "description": "Auth middleware for Neutron. Better Auth and Auth.js adapters with protected route helpers.",
5
+ "author": "Tyler",
6
+ "license": "MIT",
7
+ "homepage": "https://neutron.build",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/neutron-build/neutron",
11
+ "directory": "typescript/packages/neutron-auth"
12
+ },
13
+ "keywords": [
14
+ "neutron",
15
+ "auth",
16
+ "authentication",
17
+ "better-auth",
18
+ "middleware"
19
+ ],
20
+ "type": "module",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "!dist/**/*.test.*"
30
+ ],
31
+ "dependencies": {
32
+ "@neutron-build/core": "0.1.0"
33
+ },
34
+ "peerDependencies": {
35
+ "better-auth": "*",
36
+ "next-auth": "*"
37
+ },
38
+ "peerDependenciesMeta": {
39
+ "better-auth": {
40
+ "optional": true
41
+ },
42
+ "next-auth": {
43
+ "optional": true
44
+ }
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^22.10.7",
48
+ "typescript": "^5.7.2"
49
+ },
50
+ "publishConfig": {
51
+ "access": "public"
52
+ },
53
+ "engines": {
54
+ "node": ">=20"
55
+ },
56
+ "sideEffects": false,
57
+ "scripts": {
58
+ "build": "tsc",
59
+ "dev": "tsc --watch",
60
+ "lint": "tsc --noEmit --pretty false",
61
+ "test": "pnpm run build && node --test --experimental-test-isolation=none dist/index.test.js"
62
+ }
63
+ }