@bstockwelldev/auth-next 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/CONSUMER.md ADDED
@@ -0,0 +1,25 @@
1
+ # Consumer guide: @bstockwelldev/auth-next
2
+
3
+ ## Trust boundaries
4
+
5
+ **In package:**
6
+
7
+ - `validateNextAuthUrl` — no module-level side effects
8
+ - `resolveAuthEnvStatus` — pure function over `process.env` (or injected env)
9
+ - `buildOAuthProvidersFromEnv` — OAuth providers from env keys
10
+ - `createAuthOptions` — thin factory (~80 lines): providers + secret + callbacks
11
+
12
+ **Stay in your app:**
13
+
14
+ - Credentials / E2E test providers
15
+ - `ensureSupabaseAuthUser`, signup telemetry, admin email
16
+ - JWT callbacks with DB role sync and OAuth account persistence
17
+ - `supabaseAdmin` and billing hooks
18
+
19
+ ## Dedup
20
+
21
+ `validateNextAuthUrl` consolidates checks previously duplicated in `check-env.ts` and `validateAuthEnv.ts`. Call from `resolveAuthEnvStatus` or standalone at startup.
22
+
23
+ ## Optional peer
24
+
25
+ `@bstockwelldev/env-kit` — use `nextAuthEnvSchema` in app preflight; not required at runtime by this package.
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # @bstockwelldev/auth-next
2
+
3
+ NextAuth options factory, OAuth provider env resolution, and `NEXTAUTH_URL` validation.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @bstockwelldev/auth-next next-auth @bstockwelldev/env-kit
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import {
15
+ resolveAuthEnvStatus,
16
+ buildOAuthProvidersFromEnv,
17
+ createAuthOptions,
18
+ } from '@bstockwelldev/auth-next';
19
+ import GoogleProvider from 'next-auth/providers/google';
20
+
21
+ const authEnv = resolveAuthEnvStatus({
22
+ log: logger,
23
+ providers: [
24
+ { name: 'Google', idKey: 'GOOGLE_CLIENT_ID', secretKey: 'GOOGLE_CLIENT_SECRET' },
25
+ ],
26
+ });
27
+
28
+ const providers = buildOAuthProvidersFromEnv(
29
+ [{ name: 'Google', idKey: 'GOOGLE_CLIENT_ID', secretKey: 'GOOGLE_CLIENT_SECRET', create: GoogleProvider }],
30
+ { log: logger },
31
+ );
32
+
33
+ export const authOptions = createAuthOptions({
34
+ enabled: authEnv.enabled,
35
+ providers,
36
+ secret: process.env.NEXTAUTH_SECRET,
37
+ callbacks: { /* app jwt/session */ },
38
+ });
39
+ ```
40
+
41
+ See [CONSUMER.md](./CONSUMER.md).
@@ -0,0 +1,61 @@
1
+ import type { NextAuthOptions } from 'next-auth';
2
+ import type { OAuthConfig, OAuthUserConfig } from 'next-auth/providers/oauth';
3
+ export type AuthLogger = {
4
+ debug?: (message: string, meta?: Record<string, unknown>) => void;
5
+ info?: (message: string, meta?: Record<string, unknown>) => void;
6
+ warn?: (message: string, meta?: Record<string, unknown>) => void;
7
+ error?: (message: string, meta?: Record<string, unknown>) => void;
8
+ };
9
+ export type ProviderStatus = {
10
+ enabled: boolean;
11
+ missingKeys: string[];
12
+ };
13
+ export type AuthEnvStatus = {
14
+ enabled: boolean;
15
+ providers: Record<string, ProviderStatus>;
16
+ enabledProviders: string[];
17
+ };
18
+ export type DeprecatedProviderKeys = {
19
+ id: string;
20
+ secret: string;
21
+ };
22
+ export type OAuthProviderEnvConfig = {
23
+ name: string;
24
+ idKey: string;
25
+ secretKey: string;
26
+ deprecated?: DeprecatedProviderKeys;
27
+ /** When false, provider is reported disabled without env key checks. */
28
+ isEnabled?: (env: NodeJS.ProcessEnv) => boolean;
29
+ /** Optional missing-key placeholder when disabled by feature flag. */
30
+ disabledMissingKeys?: string[];
31
+ };
32
+ export type OAuthFactory = (options: OAuthUserConfig<Record<string, unknown>>) => OAuthConfig<Record<string, unknown>>;
33
+ export type OAuthProviderDefinition = OAuthProviderEnvConfig & {
34
+ create: OAuthFactory;
35
+ configure?: (options: OAuthUserConfig<Record<string, unknown>>, env: NodeJS.ProcessEnv) => void;
36
+ };
37
+ export type ResolveAuthEnvOptions = {
38
+ env?: NodeJS.ProcessEnv;
39
+ log?: AuthLogger;
40
+ providers?: OAuthProviderEnvConfig[];
41
+ };
42
+ export type ValidateNextAuthUrlOptions = {
43
+ env?: NodeJS.ProcessEnv;
44
+ log?: AuthLogger;
45
+ };
46
+ export type CreateAuthOptionsInput = {
47
+ enabled: boolean;
48
+ providers: NextAuthOptions['providers'];
49
+ secret?: string;
50
+ trustHost?: boolean;
51
+ callbacks?: NextAuthOptions['callbacks'];
52
+ log?: AuthLogger;
53
+ };
54
+ export declare function validateNextAuthUrl(options?: ValidateNextAuthUrlOptions): void;
55
+ export declare function resolveAuthEnvStatus(options?: ResolveAuthEnvOptions): AuthEnvStatus;
56
+ export declare function buildOAuthProvidersFromEnv(definitions: OAuthProviderDefinition[], options?: {
57
+ env?: NodeJS.ProcessEnv;
58
+ log?: AuthLogger;
59
+ }): NextAuthOptions['providers'];
60
+ export declare function createAuthOptions(input: CreateAuthOptionsInput): NextAuthOptions | null;
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,166 @@
1
+ function resolveEnv(env) {
2
+ return env ?? process.env;
3
+ }
4
+ export function validateNextAuthUrl(options = {}) {
5
+ const env = resolveEnv(options.env);
6
+ const log = options.log;
7
+ const nextAuthUrl = env.NEXTAUTH_URL;
8
+ if (!nextAuthUrl) {
9
+ log?.warn?.('[Auth] NEXTAUTH_URL not set. Host validation may fail.');
10
+ return;
11
+ }
12
+ if (nextAuthUrl.endsWith('/')) {
13
+ log?.warn?.('[Auth] NEXTAUTH_URL has a trailing slash. Remove it to avoid issues.', { nextAuthUrl });
14
+ }
15
+ try {
16
+ const url = new URL(nextAuthUrl);
17
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
18
+ log?.error?.('[Auth] NEXTAUTH_URL has invalid protocol. Must be http:// or https://', { protocol: url.protocol, nextAuthUrl });
19
+ return;
20
+ }
21
+ const hostname = url.hostname;
22
+ if (hostname === '127.0.0.1' && env.NODE_ENV === 'development') {
23
+ log?.warn?.("[Auth] NEXTAUTH_URL uses 127.0.0.1. Consider using 'localhost' for consistency.", { nextAuthUrl });
24
+ }
25
+ if (env.NODE_ENV === 'development') {
26
+ const port = url.port || (url.protocol === 'https:' ? '443' : '80');
27
+ const expectedPort = env.PORT || '3000';
28
+ if (port !== expectedPort) {
29
+ log?.warn?.("[Auth] NEXTAUTH_URL port doesn't match expected port. Ensure your dev server runs on the port specified in NEXTAUTH_URL.", {
30
+ nextAuthUrl,
31
+ urlPort: port,
32
+ expectedPort,
33
+ });
34
+ }
35
+ }
36
+ if (url.pathname !== '/' && url.pathname !== '') {
37
+ log?.warn?.('[Auth] NEXTAUTH_URL has a pathname. This is unusual and may cause issues.', { nextAuthUrl, pathname: url.pathname });
38
+ }
39
+ if (url.search || url.hash) {
40
+ log?.warn?.('[Auth] NEXTAUTH_URL contains query parameters or hash. These are ignored.', { nextAuthUrl });
41
+ }
42
+ log?.debug?.('[Auth] NEXTAUTH_URL format is valid', {
43
+ nextAuthUrl: `${url.protocol}//${url.host}`,
44
+ });
45
+ }
46
+ catch (error) {
47
+ log?.error?.('[Auth] NEXTAUTH_URL is not a valid URL', {
48
+ nextAuthUrl,
49
+ error: error instanceof Error ? error.message : String(error),
50
+ });
51
+ }
52
+ }
53
+ function checkProviderEnv(env, config, log) {
54
+ if (config.isEnabled && !config.isEnabled(env)) {
55
+ return {
56
+ enabled: false,
57
+ missingKeys: config.disabledMissingKeys ?? [],
58
+ };
59
+ }
60
+ let id = env[config.idKey];
61
+ let secret = env[config.secretKey];
62
+ if ((!id || !secret) && config.deprecated) {
63
+ const depId = env[config.deprecated.id];
64
+ const depSecret = env[config.deprecated.secret];
65
+ if (depId && depSecret) {
66
+ id = depId;
67
+ secret = depSecret;
68
+ log?.warn?.(`[Auth] Detected ${config.deprecated.id}/${config.deprecated.secret}; use ${config.idKey}/${config.secretKey}`);
69
+ }
70
+ else if (depId || depSecret) {
71
+ log?.warn?.(`[Auth] Detected ${config.deprecated.id}/${config.deprecated.secret}; use ${config.idKey}/${config.secretKey}`);
72
+ }
73
+ }
74
+ const missing = [];
75
+ if (!id)
76
+ missing.push(config.idKey);
77
+ if (!secret)
78
+ missing.push(config.secretKey);
79
+ const enabled = missing.length === 0;
80
+ if (!enabled) {
81
+ log?.warn?.(`[Auth] ${config.name} provider disabled. Missing: ${missing.join(', ')}`);
82
+ }
83
+ return { enabled, missingKeys: missing };
84
+ }
85
+ export function resolveAuthEnvStatus(options = {}) {
86
+ const env = resolveEnv(options.env);
87
+ const log = options.log;
88
+ const providerConfigs = options.providers ?? [];
89
+ const enabled = Boolean(env.NEXTAUTH_SECRET);
90
+ validateNextAuthUrl({ env, log });
91
+ if (!enabled) {
92
+ log?.warn?.('[Auth] NEXTAUTH_SECRET not set. Authentication disabled.');
93
+ }
94
+ else {
95
+ const secret = env.NEXTAUTH_SECRET;
96
+ if (secret && secret.length < 32) {
97
+ log?.warn?.('[Auth] NEXTAUTH_SECRET is shorter than 32 characters. Consider using a longer secret for better security.');
98
+ }
99
+ const weakSecrets = [
100
+ 'secret',
101
+ 'changeme',
102
+ 'your-secret-key',
103
+ 'nextauth-secret',
104
+ ];
105
+ if (secret &&
106
+ weakSecrets.some((weak) => secret.toLowerCase().includes(weak))) {
107
+ log?.warn?.('[Auth] NEXTAUTH_SECRET appears to be a placeholder or weak secret. Use a strong, random secret in production.');
108
+ }
109
+ }
110
+ const providers = {};
111
+ for (const config of providerConfigs) {
112
+ const key = config.name.toLowerCase();
113
+ providers[key] = checkProviderEnv(env, config, log);
114
+ }
115
+ const enabledProviders = Object.entries(providers)
116
+ .filter(([, info]) => info.enabled)
117
+ .map(([name]) => name);
118
+ return { enabled, providers, enabledProviders };
119
+ }
120
+ export function buildOAuthProvidersFromEnv(definitions, options = {}) {
121
+ const env = resolveEnv(options.env);
122
+ const log = options.log;
123
+ const providers = [];
124
+ for (const definition of definitions) {
125
+ const status = checkProviderEnv(env, definition, log);
126
+ if (!status.enabled) {
127
+ continue;
128
+ }
129
+ const clientId = env[definition.idKey];
130
+ const clientSecret = env[definition.secretKey];
131
+ const oauthOptions = {
132
+ clientId,
133
+ clientSecret,
134
+ };
135
+ definition.configure?.(oauthOptions, env);
136
+ providers.push(definition.create(oauthOptions));
137
+ }
138
+ return providers;
139
+ }
140
+ export function createAuthOptions(input) {
141
+ if (!input.enabled) {
142
+ return null;
143
+ }
144
+ const env = process.env;
145
+ const nextAuthUrl = env.NEXTAUTH_URL;
146
+ if (!nextAuthUrl) {
147
+ input.log?.warn?.('[Auth] NEXTAUTH_URL is missing. This may cause redirect issues.');
148
+ }
149
+ else {
150
+ const isLocal = nextAuthUrl.includes('localhost') || nextAuthUrl.includes('127.0.0.1');
151
+ const isProd = env.NODE_ENV === 'production';
152
+ if (isProd && isLocal) {
153
+ input.log?.warn?.(`[Auth] NEXTAUTH_URL (${nextAuthUrl}) points to localhost in production. This will break OAuth redirects.`);
154
+ }
155
+ else if (!isProd && !isLocal) {
156
+ input.log?.info?.(`[Auth] NEXTAUTH_URL (${nextAuthUrl}) points to a remote domain in development. Ensure OAuth providers allow this.`);
157
+ }
158
+ }
159
+ return {
160
+ providers: input.providers,
161
+ secret: input.secret,
162
+ trustHost: input.trustHost,
163
+ callbacks: input.callbacks,
164
+ };
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,60 @@
1
+ {
2
+ "name": "@bstockwelldev/auth-next",
3
+ "version": "0.1.0",
4
+ "description": "NextAuth options factory and auth env validation for @bstockwelldev SaaS apps",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "CONSUMER.md"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "typecheck": "tsc --noEmit",
23
+ "test": "vitest run",
24
+ "prepare": "tsc -p tsconfig.json"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/bstockwelldev/codex-apps.git",
29
+ "directory": "packages/auth-next"
30
+ },
31
+ "keywords": [
32
+ "nextauth",
33
+ "auth",
34
+ "oauth",
35
+ "saas"
36
+ ],
37
+ "license": "MIT",
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "peerDependencies": {
42
+ "@bstockwelldev/env-kit": "^0.1.0",
43
+ "next-auth": "^4.24.0"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "@bstockwelldev/env-kit": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "devDependencies": {
51
+ "@bstockwelldev/env-kit": "workspace:*",
52
+ "@types/node": "^20.17.10",
53
+ "next-auth": "^4.24.11",
54
+ "typescript": "^5.7.2",
55
+ "vitest": "^3.2.4"
56
+ },
57
+ "engines": {
58
+ "node": ">=20.0.0"
59
+ }
60
+ }