@tonycodes/auth-react 1.0.1 → 1.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.
@@ -1,7 +1,7 @@
1
1
  import { type ReactNode } from 'react';
2
- import type { AuthConfig, AuthState } from './types.js';
2
+ import type { AuthConfig, ResolvedAuthConfig, AuthState } from './types.js';
3
3
  export declare const AuthContext: import("react").Context<AuthState | null>;
4
- export declare const AuthConfigContext: import("react").Context<AuthConfig | null>;
4
+ export declare const AuthConfigContext: import("react").Context<ResolvedAuthConfig | null>;
5
5
  interface AuthProviderProps {
6
6
  config: AuthConfig;
7
7
  children: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAA8B,SAAS,EAAE,MAAM,YAAY,CAAC;AAkBpF,eAAO,MAAM,WAAW,2CAAwC,CAAC;AACjE,eAAO,MAAM,iBAAiB,4CAAyC,CAAC;AAExE,UAAU,iBAAiB;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAwNnE"}
1
+ {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAA8B,SAAS,EAAE,MAAM,YAAY,CAAC;AA0BxG,eAAO,MAAM,WAAW,2CAAwC,CAAC;AACjE,eAAO,MAAM,iBAAiB,oDAAiD,CAAC;AAEhF,UAAU,iBAAiB;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AA4CD,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CA6PnE"}
@@ -1,15 +1,76 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createContext, useCallback, useEffect, useRef, useState } from 'react';
3
+ import { validateConfig } from './validateConfig.js';
4
+ const DEFAULT_AUTH_URL = 'https://auth.tony.codes';
3
5
  function decodeJWT(token) {
4
- const base64 = token.split('.')[1];
5
- const json = atob(base64.replace(/-/g, '+').replace(/_/g, '/'));
6
- return JSON.parse(json);
6
+ try {
7
+ const base64 = token.split('.')[1];
8
+ if (!base64)
9
+ throw new Error('Invalid token structure');
10
+ const json = atob(base64.replace(/-/g, '+').replace(/_/g, '/'));
11
+ return JSON.parse(json);
12
+ }
13
+ catch {
14
+ throw new Error('Failed to decode access token — the token may be malformed');
15
+ }
7
16
  }
8
17
  export const AuthContext = createContext(null);
9
18
  export const AuthConfigContext = createContext(null);
19
+ /**
20
+ * Resolve config by discovering missing URLs from the auth service.
21
+ * 1. If appUrl provided explicitly → use it, skip discovery
22
+ * 2. Otherwise → fetch from /api/client-apps/:clientId/config
23
+ * 3. Fallback → use window.location.origin
24
+ */
25
+ async function resolveConfig(config) {
26
+ const authUrl = config.authUrl || DEFAULT_AUTH_URL;
27
+ let appUrl = config.appUrl;
28
+ let apiUrl = config.apiUrl;
29
+ // If appUrl is already provided, skip discovery
30
+ if (!appUrl) {
31
+ try {
32
+ const res = await fetch(`${authUrl}/api/client-apps/${config.clientId}/config`);
33
+ if (res.ok) {
34
+ const data = await res.json();
35
+ appUrl = data.appUrl || undefined;
36
+ if (!apiUrl)
37
+ apiUrl = data.apiUrl || undefined;
38
+ }
39
+ }
40
+ catch {
41
+ // Discovery failed — use fallback
42
+ }
43
+ }
44
+ // Fallback to window.location.origin
45
+ if (!appUrl && typeof window !== 'undefined') {
46
+ appUrl = window.location.origin;
47
+ }
48
+ if (!appUrl) {
49
+ appUrl = authUrl; // Last resort
50
+ }
51
+ return {
52
+ clientId: config.clientId,
53
+ authUrl,
54
+ appUrl,
55
+ apiUrl: apiUrl || appUrl,
56
+ };
57
+ }
10
58
  export function AuthProvider({ config, children }) {
11
- const { authUrl, clientId, appUrl, apiUrl } = config;
12
- const baseApiUrl = apiUrl || appUrl;
59
+ // Validate config on initialization (throws if invalid)
60
+ validateConfig(config);
61
+ const [resolved, setResolved] = useState(() => {
62
+ // If all URLs are provided, resolve synchronously
63
+ const authUrl = config.authUrl || DEFAULT_AUTH_URL;
64
+ if (config.appUrl) {
65
+ return {
66
+ clientId: config.clientId,
67
+ authUrl,
68
+ appUrl: config.appUrl,
69
+ apiUrl: config.apiUrl || config.appUrl,
70
+ };
71
+ }
72
+ return null;
73
+ });
13
74
  const [accessToken, setAccessToken] = useState(null);
14
75
  const [user, setUser] = useState(null);
15
76
  const [organization, setOrganization] = useState(null);
@@ -20,6 +81,17 @@ export function AuthProvider({ config, children }) {
20
81
  const [isLoggingOut, setIsLoggingOut] = useState(false);
21
82
  const refreshTimerRef = useRef();
22
83
  const refreshLockRef = useRef(false);
84
+ // Discover config if needed
85
+ useEffect(() => {
86
+ if (resolved)
87
+ return; // Already resolved synchronously
88
+ let mounted = true;
89
+ resolveConfig(config).then((r) => {
90
+ if (mounted)
91
+ setResolved(r);
92
+ });
93
+ return () => { mounted = false; };
94
+ }, [config, resolved]);
23
95
  const updateFromToken = useCallback((token) => {
24
96
  const payload = decodeJWT(token);
25
97
  setUser({
@@ -47,11 +119,13 @@ export function AuthProvider({ config, children }) {
47
119
  return payload;
48
120
  }, []);
49
121
  const refreshToken = useCallback(async () => {
122
+ if (!resolved)
123
+ return null;
50
124
  if (refreshLockRef.current)
51
125
  return null;
52
126
  refreshLockRef.current = true;
53
127
  try {
54
- const res = await fetch(`${baseApiUrl}/auth/refresh`, {
128
+ const res = await fetch(`${resolved.apiUrl}/auth/refresh`, {
55
129
  method: 'POST',
56
130
  credentials: 'include',
57
131
  headers: { 'Content-Type': 'application/json' },
@@ -80,11 +154,13 @@ export function AuthProvider({ config, children }) {
80
154
  finally {
81
155
  refreshLockRef.current = false;
82
156
  }
83
- }, [baseApiUrl, updateFromToken]);
157
+ }, [resolved, updateFromToken]);
84
158
  // Fetch user organizations list
85
159
  const fetchOrganizations = useCallback(async (token) => {
160
+ if (!resolved)
161
+ return;
86
162
  try {
87
- const res = await fetch(`${authUrl}/api/organizations`, {
163
+ const res = await fetch(`${resolved.authUrl}/api/organizations`, {
88
164
  headers: { Authorization: `Bearer ${token}` },
89
165
  });
90
166
  if (res.ok) {
@@ -95,9 +171,11 @@ export function AuthProvider({ config, children }) {
95
171
  catch {
96
172
  // Silent failure — orgs list is supplementary
97
173
  }
98
- }, [authUrl]);
99
- // Initial auth check — try to refresh on mount
174
+ }, [resolved]);
175
+ // Initial auth check — try to refresh on mount (after config resolves)
100
176
  useEffect(() => {
177
+ if (!resolved)
178
+ return;
101
179
  let mounted = true;
102
180
  async function init() {
103
181
  const token = await refreshToken();
@@ -114,23 +192,27 @@ export function AuthProvider({ config, children }) {
114
192
  if (refreshTimerRef.current)
115
193
  clearTimeout(refreshTimerRef.current);
116
194
  };
117
- }, [refreshToken, fetchOrganizations]);
195
+ }, [resolved, refreshToken, fetchOrganizations]);
118
196
  const login = useCallback((provider) => {
119
- const redirectUri = `${appUrl}/auth/callback`;
197
+ if (!resolved)
198
+ return;
199
+ const redirectUri = `${resolved.appUrl}/auth/callback`;
120
200
  const state = btoa(JSON.stringify({ returnTo: window.location.pathname }));
121
201
  const params = new URLSearchParams({
122
- client_id: clientId,
202
+ client_id: resolved.clientId,
123
203
  redirect_uri: redirectUri,
124
204
  state,
125
205
  });
126
206
  if (provider)
127
207
  params.set('provider', provider);
128
- window.location.href = `${authUrl}/authorize?${params}`;
129
- }, [authUrl, clientId, appUrl]);
208
+ window.location.href = `${resolved.authUrl}/authorize?${params}`;
209
+ }, [resolved]);
130
210
  const logout = useCallback(async () => {
211
+ if (!resolved)
212
+ return;
131
213
  setIsLoggingOut(true);
132
214
  try {
133
- await fetch(`${baseApiUrl}/auth/logout`, {
215
+ await fetch(`${resolved.apiUrl}/auth/logout`, {
134
216
  method: 'POST',
135
217
  credentials: 'include',
136
218
  });
@@ -145,10 +227,12 @@ export function AuthProvider({ config, children }) {
145
227
  setOrganization(null);
146
228
  setOrganizations([]);
147
229
  setIsLoggingOut(false);
148
- }, [baseApiUrl]);
230
+ }, [resolved]);
149
231
  const switchOrganization = useCallback(async (orgId) => {
232
+ if (!resolved)
233
+ return;
150
234
  try {
151
- const res = await fetch(`${baseApiUrl}/auth/switch-org`, {
235
+ const res = await fetch(`${resolved.apiUrl}/auth/switch-org`, {
152
236
  method: 'POST',
153
237
  credentials: 'include',
154
238
  headers: { 'Content-Type': 'application/json' },
@@ -162,12 +246,11 @@ export function AuthProvider({ config, children }) {
162
246
  catch {
163
247
  // Silent failure
164
248
  }
165
- }, [baseApiUrl, updateFromToken]);
249
+ }, [resolved, updateFromToken]);
166
250
  const isAdmin = orgRole === 'admin' || orgRole === 'owner';
167
251
  const isOwner = orgRole === 'owner';
168
252
  const getAccessToken = useCallback(async () => {
169
253
  if (accessToken) {
170
- // Check if token expires within 60 seconds
171
254
  try {
172
255
  const payload = decodeJWT(accessToken);
173
256
  if (payload.exp * 1000 - Date.now() > 60000) {
@@ -182,7 +265,7 @@ export function AuthProvider({ config, children }) {
182
265
  }, [accessToken, refreshToken]);
183
266
  const value = {
184
267
  isAuthenticated: !!accessToken && !!organization,
185
- isLoading,
268
+ isLoading: isLoading || !resolved,
186
269
  user,
187
270
  organization,
188
271
  tenant: organization ? { id: organization.id, name: organization.name, slug: organization.slug } : null,
@@ -202,6 +285,13 @@ export function AuthProvider({ config, children }) {
202
285
  loginError: null,
203
286
  impersonating: false,
204
287
  };
205
- return (_jsx(AuthConfigContext.Provider, { value: config, children: _jsx(AuthContext.Provider, { value: value, children: children }) }));
288
+ // Use resolved config for context, or a placeholder during discovery
289
+ const configValue = resolved || {
290
+ clientId: config.clientId,
291
+ authUrl: config.authUrl || DEFAULT_AUTH_URL,
292
+ appUrl: config.appUrl || '',
293
+ apiUrl: config.apiUrl || config.appUrl || '',
294
+ };
295
+ return (_jsx(AuthConfigContext.Provider, { value: configValue, children: _jsx(AuthContext.Provider, { value: value, children: children }) }));
206
296
  }
207
297
  //# sourceMappingURL=AuthProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"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"}
@@ -1,14 +1,11 @@
1
- type Mode = 'signin' | 'signup';
1
+ import { type SSOProvider } from './useProviders.js';
2
2
  interface SignInFormProps {
3
- /** List of provider IDs to show. If not provided, auto-fetches from auth service. */
4
- providers?: string[];
5
- /** Whether to auto-fetch available providers from the auth service. Default: true */
3
+ /** List of provider IDs to show (for manual control). Overrides autoFetch when provided. */
4
+ providers?: SSOProvider[];
5
+ /** Whether to automatically fetch providers from the auth service. Defaults to true. */
6
6
  autoFetch?: boolean;
7
- /** Additional CSS class names */
8
7
  className?: string;
9
- /** Mode to display the form in */
10
- mode?: Mode;
11
8
  }
12
- export declare function SignInForm({ providers: providersProp, autoFetch, className, mode: modeProp, }: SignInFormProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function SignInForm({ providers: propProviders, autoFetch, className }: SignInFormProps): import("react/jsx-runtime").JSX.Element;
13
10
  export {};
14
11
  //# sourceMappingURL=SignInForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SignInForm.d.ts","sourceRoot":"","sources":["../src/SignInForm.tsx"],"names":[],"mappings":"AAIA,KAAK,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAoChC,UAAU,eAAe;IACvB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,qFAAqF;IACrF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,wBAAgB,UAAU,CAAC,EACzB,SAAS,EAAE,aAAa,EACxB,SAAgB,EAChB,SAAS,EACT,IAAI,EAAE,QAAQ,GACf,EAAE,eAAe,2CA0JjB"}
1
+ {"version":3,"file":"SignInForm.d.ts","sourceRoot":"","sources":["../src/SignInForm.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAsCnE,UAAU,eAAe;IACvB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,wFAAwF;IACxF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,SAAgB,EAAE,SAAS,EAAE,EAAE,eAAe,2CAyJpG"}
@@ -11,19 +11,19 @@ const ERROR_MESSAGES = {
11
11
  const GITHUB_ICON = (_jsx("svg", { viewBox: "0 0 24 24", width: "20", height: "20", fill: "currentColor", children: _jsx("path", { d: "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z" }) }));
12
12
  const GOOGLE_ICON = (_jsxs("svg", { viewBox: "0 0 24 24", width: "20", height: "20", children: [_jsx("path", { fill: "#4285F4", d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" }), _jsx("path", { fill: "#34A853", d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" }), _jsx("path", { fill: "#FBBC05", d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" }), _jsx("path", { fill: "#EA4335", d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" })] }));
13
13
  const APPLE_ICON = (_jsx("svg", { viewBox: "0 0 24 24", width: "20", height: "20", fill: "currentColor", children: _jsx("path", { d: "M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z" }) }));
14
- const BITBUCKET_ICON = (_jsx("svg", { viewBox: "0 0 24 24", width: "20", height: "20", fill: "currentColor", children: _jsx("path", { d: "M.778 1.213a.768.768 0 00-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 00.77-.646l3.27-20.03a.768.768 0 00-.768-.891zM14.52 15.53H9.522L8.17 8.466h7.561z" }) }));
15
- export function SignInForm({ providers: providersProp, autoFetch = true, className, mode: modeProp, }) {
14
+ const BITBUCKET_ICON = (_jsx("svg", { viewBox: "0 0 24 24", width: "20", height: "20", fill: "currentColor", children: _jsx("path", { d: "M.778 1.213a.768.768 0 0 0-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 0 0 .77-.646l3.27-20.03a.768.768 0 0 0-.768-.891L.778 1.213zM14.52 15.53H9.522L8.17 8.466h7.561l-1.211 7.064z" }) }));
15
+ export function SignInForm({ providers: propProviders, autoFetch = true, className }) {
16
16
  const config = useAuthConfig();
17
17
  const { providers: fetchedProviders, isLoading: providersLoading } = useProviders();
18
- const [activeTab, setActiveTab] = useState(modeProp || 'signin');
18
+ const [activeTab, setActiveTab] = useState('signin');
19
19
  const [errorMessage, setErrorMessage] = useState(null);
20
20
  const [returnTo, setReturnTo] = useState('/');
21
- // Determine which providers to show
22
- const enabledProviderIds = providersProp
23
- ? providersProp
21
+ // Use prop providers if explicitly provided, otherwise use fetched providers
22
+ const enabledProviders = propProviders
23
+ ? propProviders
24
24
  : autoFetch
25
- ? fetchedProviders.filter((p) => p.enabled).map((p) => p.id)
26
- : ['github'];
25
+ ? fetchedProviders.map((p) => p.id)
26
+ : ['github']; // fallback default
27
27
  useEffect(() => {
28
28
  const params = new URLSearchParams(window.location.search);
29
29
  const errorParam = params.get('error');
@@ -37,10 +37,10 @@ export function SignInForm({ providers: providersProp, autoFetch = true, classNa
37
37
  setActiveTab('signup');
38
38
  }
39
39
  }
40
- if (!modeProp && (tabParam === 'signin' || tabParam === 'signup')) {
40
+ if (tabParam === 'signin' || tabParam === 'signup') {
41
41
  setActiveTab(tabParam);
42
42
  }
43
- }, [modeProp]);
43
+ }, []);
44
44
  function handleOAuth(provider) {
45
45
  const redirectUri = `${config.appUrl}/auth/callback`;
46
46
  const state = btoa(JSON.stringify({ returnTo }));
@@ -64,22 +64,16 @@ export function SignInForm({ providers: providersProp, autoFetch = true, classNa
64
64
  isActive ? 'bg-white text-zinc-900 shadow-sm' : 'text-zinc-500 hover:text-zinc-700',
65
65
  ].join(' ');
66
66
  }
67
- function getProviderButton(providerId) {
68
- const actionText = activeTab === 'signin' ? 'Sign in with' : 'Sign up with';
69
- switch (providerId) {
70
- case 'github':
71
- return (_jsxs("button", { type: "button", className: "w-full flex items-center justify-center gap-3 px-6 py-3 bg-zinc-900 text-white font-medium rounded-xl hover:bg-zinc-800 transition-colors cursor-pointer", onClick: () => handleOAuth('github'), children: [GITHUB_ICON, _jsxs("span", { children: [actionText, " GitHub"] })] }, "github"));
72
- case 'google':
73
- return (_jsxs("button", { type: "button", className: "w-full flex items-center justify-center gap-3 px-6 py-3 bg-white text-zinc-700 font-medium rounded-xl border border-zinc-300 hover:bg-zinc-50 transition-colors cursor-pointer", onClick: () => handleOAuth('google'), children: [GOOGLE_ICON, _jsxs("span", { children: [actionText, " Google"] })] }, "google"));
74
- case 'apple':
75
- return (_jsxs("button", { type: "button", className: "w-full flex items-center justify-center gap-3 px-6 py-3 bg-black text-white font-medium rounded-xl hover:bg-zinc-900 transition-colors cursor-pointer", onClick: () => handleOAuth('apple'), children: [APPLE_ICON, _jsxs("span", { children: [actionText, " Apple"] })] }, "apple"));
76
- case 'bitbucket':
77
- return (_jsxs("button", { type: "button", className: "w-full flex items-center justify-center gap-3 px-6 py-3 bg-blue-600 text-white font-medium rounded-xl hover:bg-blue-700 transition-colors cursor-pointer", onClick: () => handleOAuth('bitbucket'), children: [BITBUCKET_ICON, _jsxs("span", { children: [actionText, " Bitbucket"] })] }, "bitbucket"));
78
- default:
79
- return null;
80
- }
81
- }
82
- const showLoading = autoFetch && providersLoading && !providersProp;
83
- return (_jsxs("div", { className: className || '', children: [_jsxs("div", { className: "flex gap-1 p-1 bg-zinc-100 rounded-xl mb-6", children: [_jsx("button", { type: "button", className: tabClass('signin'), onClick: () => switchTab('signin'), children: "Sign In" }), _jsx("button", { type: "button", className: tabClass('signup'), onClick: () => switchTab('signup'), children: "Sign Up" })] }), errorMessage && (_jsx("div", { className: "mb-4 p-3 rounded-lg bg-red-50 border border-red-200 text-red-700 text-sm", children: errorMessage })), showLoading ? (_jsx("div", { className: "text-center py-4 text-zinc-500 text-sm", children: "Loading providers..." })) : (_jsx("div", { className: "space-y-3", children: enabledProviderIds.map((providerId) => getProviderButton(providerId)) })), _jsx("p", { className: "mt-6 text-center text-xs text-zinc-400", children: "By continuing, you agree to our terms of service." })] }));
67
+ const buttonText = (provider) => {
68
+ const providerNames = {
69
+ github: 'GitHub',
70
+ google: 'Google',
71
+ apple: 'Apple',
72
+ bitbucket: 'Bitbucket',
73
+ };
74
+ const name = providerNames[provider] || provider;
75
+ return activeTab === 'signin' ? `Sign in with ${name}` : `Sign up with ${name}`;
76
+ };
77
+ return (_jsxs("div", { className: className || '', children: [_jsxs("div", { className: "flex gap-1 p-1 bg-zinc-100 rounded-xl mb-6", children: [_jsx("button", { type: "button", className: tabClass('signin'), onClick: () => switchTab('signin'), children: "Sign In" }), _jsx("button", { type: "button", className: tabClass('signup'), onClick: () => switchTab('signup'), children: "Sign Up" })] }), errorMessage && (_jsx("div", { className: "mb-4 p-3 rounded-lg bg-red-50 border border-red-200 text-red-700 text-sm", children: errorMessage })), autoFetch && !propProviders && providersLoading ? (_jsx("div", { className: "flex items-center justify-center py-4", children: _jsx("div", { className: "h-5 w-5 animate-spin rounded-full border-2 border-zinc-300 border-t-zinc-600" }) })) : (_jsxs("div", { className: "space-y-3", children: [enabledProviders.includes('github') && (_jsxs("button", { type: "button", className: "w-full flex items-center justify-center gap-3 px-6 py-3 bg-zinc-900 text-white font-medium rounded-xl hover:bg-zinc-800 transition-colors cursor-pointer", onClick: () => handleOAuth('github'), children: [GITHUB_ICON, _jsx("span", { children: buttonText('github') })] })), enabledProviders.includes('google') && (_jsxs("button", { type: "button", className: "w-full flex items-center justify-center gap-3 px-6 py-3 bg-white text-zinc-900 font-medium rounded-xl border border-zinc-300 hover:bg-zinc-50 transition-colors cursor-pointer", onClick: () => handleOAuth('google'), children: [GOOGLE_ICON, _jsx("span", { children: buttonText('google') })] })), enabledProviders.includes('apple') && (_jsxs("button", { type: "button", className: "w-full flex items-center justify-center gap-3 px-6 py-3 bg-black text-white font-medium rounded-xl hover:bg-zinc-900 transition-colors cursor-pointer", onClick: () => handleOAuth('apple'), children: [APPLE_ICON, _jsx("span", { children: buttonText('apple') })] })), enabledProviders.includes('bitbucket') && (_jsxs("button", { type: "button", className: "w-full flex items-center justify-center gap-3 px-6 py-3 bg-blue-600 text-white font-medium rounded-xl hover:bg-blue-700 transition-colors cursor-pointer", onClick: () => handleOAuth('bitbucket'), children: [BITBUCKET_ICON, _jsx("span", { children: buttonText('bitbucket') })] }))] })), _jsx("p", { className: "mt-6 text-center text-xs text-zinc-400", children: "By continuing, you agree to our terms of service." })] }));
84
78
  }
85
79
  //# sourceMappingURL=SignInForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SignInForm.js","sourceRoot":"","sources":["../src/SignInForm.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SignInForm.js","sourceRoot":"","sources":["../src/SignInForm.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  export { AuthProvider } from './AuthProvider.js';
2
2
  export { useAuth, useAuthConfig } from './useAuth.js';
3
- export { useProviders } from './useProviders.js';
3
+ export { useProviders, type SSOProvider, type ProviderInfo, type UseProvidersResult } from './useProviders.js';
4
4
  export { SignedIn, SignedOut, RedirectToSignIn } from './components.js';
5
5
  export { OrganizationSwitcher } from './OrganizationSwitcher.js';
6
6
  export { AuthCallback } from './AuthCallback.js';
7
7
  export { SignInForm } from './SignInForm.js';
8
- export type { AuthConfig, AuthUser, AuthOrganization, AuthState } from './types.js';
9
- export type { ProviderInfo, UseProvidersResult } from './useProviders.js';
8
+ export { AuthConfigError } from './validateConfig.js';
9
+ export type { AuthConfig, ResolvedAuthConfig, AuthUser, AuthOrganization, AuthState } from './types.js';
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACpF,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -5,4 +5,5 @@ export { SignedIn, SignedOut, RedirectToSignIn } from './components.js';
5
5
  export { OrganizationSwitcher } from './OrganizationSwitcher.js';
6
6
  export { AuthCallback } from './AuthCallback.js';
7
7
  export { SignInForm } from './SignInForm.js';
8
+ export { AuthConfigError } from './validateConfig.js';
8
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAgE,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .absolute{position:absolute}.relative{position:relative}.left-0{left:0}.top-full{top:100%}.z-50{z-index:50}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.h-4{height:1rem}.w-4{width:1rem}.w-64{width:16rem}.w-full{width:100%}.flex-1{flex:1 1 0%}.rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1))}.bg-black{background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black,.bg-blue-50{--tw-bg-opacity:1}.bg-blue-50{background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-red-50{background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-red-50,.bg-white{--tw-bg-opacity:1}.bg-white{background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1))}.bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.p-1{padding:.25rem}.p-3{padding:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-zinc-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity,1))}.hover\:bg-zinc-800:hover{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.hover\:bg-zinc-900:hover{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}@media (prefers-color-scheme:dark){.dark\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.dark\:bg-blue-900\/20{background-color:rgba(30,58,138,.2)}.dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.dark\:text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.dark\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}}
1
+ .absolute{position:absolute}.relative{position:relative}.left-0{left:0}.top-full{top:100%}.z-50{z-index:50}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.h-4{height:1rem}.h-5{height:1.25rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-full{width:100%}.flex-1{flex:1 1 0%}.rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1))}.border-t-zinc-600{--tw-border-opacity:1;border-top-color:rgb(82 82 91/var(--tw-border-opacity,1))}.bg-black{background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black,.bg-blue-50{--tw-bg-opacity:1}.bg-blue-50{background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-red-50{background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-red-50,.bg-white{--tw-bg-opacity:1}.bg-white{background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1))}.bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.p-1{padding:.25rem}.p-3{padding:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-zinc-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity,1))}.hover\:bg-zinc-800:hover{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.hover\:bg-zinc-900:hover{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}@media (prefers-color-scheme:dark){.dark\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.dark\:bg-blue-900\/20{background-color:rgba(30,58,138,.2)}.dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.dark\:text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.dark\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}}
package/dist/types.d.ts CHANGED
@@ -1,18 +1,25 @@
1
1
  export interface AuthConfig {
2
- /** Auth service URL (e.g., https://auth.tony.codes or https://auth.test) */
3
- authUrl: string;
4
2
  /** Client ID registered with auth service */
5
3
  clientId: string;
6
- /** This app's base URL (for redirect_uri construction) */
7
- appUrl: string;
4
+ /** Auth service URL. Defaults to https://auth.tony.codes */
5
+ authUrl?: string;
6
+ /** This app's base URL. Auto-discovered from server or defaults to window.location.origin */
7
+ appUrl?: string;
8
8
  /**
9
9
  * API base URL for proxied auth endpoints (callback, refresh, logout).
10
10
  * Required if your API runs on a different subdomain than your frontend
11
11
  * (e.g., api.myapp.test vs myapp.test).
12
- * Defaults to appUrl if not specified.
12
+ * Auto-discovered from server or defaults to appUrl.
13
13
  */
14
14
  apiUrl?: string;
15
15
  }
16
+ /** Resolved config with all URLs populated (after discovery) */
17
+ export interface ResolvedAuthConfig {
18
+ clientId: string;
19
+ authUrl: string;
20
+ appUrl: string;
21
+ apiUrl: string;
22
+ }
16
23
  export interface AuthUser {
17
24
  id: string;
18
25
  email: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACtC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACtC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB"}
package/dist/useAuth.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { AuthConfig, AuthState } from './types.js';
1
+ import type { ResolvedAuthConfig, AuthState } from './types.js';
2
2
  export declare function useAuth(): AuthState;
3
- export declare function useAuthConfig(): AuthConfig;
3
+ export declare function useAuthConfig(): ResolvedAuthConfig;
4
4
  //# sourceMappingURL=useAuth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,wBAAgB,OAAO,IAAI,SAAS,CAMnC;AAED,wBAAgB,aAAa,IAAI,UAAU,CAM1C"}
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEhE,wBAAgB,OAAO,IAAI,SAAS,CAMnC;AAED,wBAAgB,aAAa,IAAI,kBAAkB,CAMlD"}
@@ -1,5 +1,6 @@
1
+ export type SSOProvider = 'github' | 'google' | 'apple' | 'bitbucket';
1
2
  export interface ProviderInfo {
2
- id: string;
3
+ id: SSOProvider;
3
4
  name: string;
4
5
  enabled: boolean;
5
6
  }
@@ -7,10 +8,13 @@ export interface UseProvidersResult {
7
8
  providers: ProviderInfo[];
8
9
  isLoading: boolean;
9
10
  error: string | null;
11
+ /** Force refetch, bypassing cache */
12
+ refresh: () => void;
10
13
  }
11
14
  /**
12
- * Hook to fetch available SSO providers for the current organization.
13
- * Automatically fetches providers based on the client_id from AuthProvider config.
15
+ * Hook to fetch available SSO providers from the auth service.
16
+ * Uses module-level cache with 60s TTL and stale-while-revalidate.
17
+ * Clears cache on window.focus for admin changes to take effect.
14
18
  */
15
19
  export declare function useProviders(): UseProvidersResult;
16
20
  //# sourceMappingURL=useProviders.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useProviders.d.ts","sourceRoot":"","sources":["../src/useProviders.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,kBAAkB,CA6CjD"}
1
+ {"version":3,"file":"useProviders.d.ts","sourceRoot":"","sources":["../src/useProviders.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,WAAW,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,qCAAqC;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAyCD;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,kBAAkB,CAwEjD"}
@@ -1,47 +1,103 @@
1
- import { useEffect, useState } from 'react';
1
+ import { useCallback, useEffect, useState } from 'react';
2
2
  import { useAuthConfig } from './useAuth.js';
3
+ const CACHE_TTL = 60000; // 60 seconds
4
+ const cache = new Map();
5
+ function getCacheKey(authUrl, clientId) {
6
+ return `${authUrl}::${clientId}`;
7
+ }
8
+ function getCachedProviders(key) {
9
+ const entry = cache.get(key);
10
+ if (!entry)
11
+ return null;
12
+ return entry;
13
+ }
14
+ function isStale(entry) {
15
+ return Date.now() - entry.fetchedAt > CACHE_TTL;
16
+ }
17
+ async function fetchProviders(authUrl, clientId) {
18
+ const url = new URL(`${authUrl}/providers`);
19
+ url.searchParams.set('client_id', clientId);
20
+ const res = await fetch(url.toString());
21
+ if (!res.ok) {
22
+ throw new Error('Failed to fetch providers');
23
+ }
24
+ const data = await res.json();
25
+ return data.providers || [];
26
+ }
27
+ // ─── Hook ────────────────────────────────────────────────────────────────
3
28
  /**
4
- * Hook to fetch available SSO providers for the current organization.
5
- * Automatically fetches providers based on the client_id from AuthProvider config.
29
+ * Hook to fetch available SSO providers from the auth service.
30
+ * Uses module-level cache with 60s TTL and stale-while-revalidate.
31
+ * Clears cache on window.focus for admin changes to take effect.
6
32
  */
7
33
  export function useProviders() {
8
34
  const config = useAuthConfig();
9
- const [providers, setProviders] = useState([]);
10
- const [isLoading, setIsLoading] = useState(true);
35
+ const cacheKey = getCacheKey(config.authUrl, config.clientId);
36
+ // Initialize from cache if available
37
+ const cached = getCachedProviders(cacheKey);
38
+ const [providers, setProviders] = useState(cached?.providers || []);
39
+ const [isLoading, setIsLoading] = useState(!cached);
11
40
  const [error, setError] = useState(null);
41
+ const [refreshCounter, setRefreshCounter] = useState(0);
42
+ const refresh = useCallback(() => {
43
+ cache.delete(cacheKey);
44
+ setRefreshCounter((c) => c + 1);
45
+ }, [cacheKey]);
12
46
  useEffect(() => {
13
47
  let mounted = true;
14
- async function fetchProviders() {
15
- try {
48
+ async function doFetch(showLoading) {
49
+ if (showLoading)
16
50
  setIsLoading(true);
17
- setError(null);
18
- const url = new URL(`${config.authUrl}/providers`);
19
- url.searchParams.set('client_id', config.clientId);
20
- const res = await fetch(url.toString());
21
- if (!res.ok) {
22
- throw new Error(`Failed to fetch providers: ${res.status}`);
23
- }
24
- const data = await res.json();
51
+ try {
52
+ const result = await fetchProviders(config.authUrl, config.clientId);
53
+ cache.set(cacheKey, { providers: result, fetchedAt: Date.now() });
25
54
  if (mounted) {
26
- setProviders(data.providers || []);
55
+ setProviders(result);
56
+ setError(null);
27
57
  }
28
58
  }
29
59
  catch (err) {
30
60
  if (mounted) {
31
61
  setError(err instanceof Error ? err.message : 'Failed to fetch providers');
62
+ // Keep stale data if we have it
63
+ if (!cached)
64
+ setProviders([]);
32
65
  }
33
66
  }
34
67
  finally {
35
- if (mounted) {
68
+ if (mounted)
36
69
  setIsLoading(false);
37
- }
38
70
  }
39
71
  }
40
- fetchProviders();
72
+ const entry = getCachedProviders(cacheKey);
73
+ if (!entry) {
74
+ // No cache — fetch with loading state
75
+ doFetch(true);
76
+ }
77
+ else if (isStale(entry)) {
78
+ // Stale cache — show cached data, refresh in background
79
+ setProviders(entry.providers);
80
+ setIsLoading(false);
81
+ doFetch(false);
82
+ }
83
+ else {
84
+ // Fresh cache — use it directly
85
+ setProviders(entry.providers);
86
+ setIsLoading(false);
87
+ }
88
+ // Refetch on window focus (admin changes take effect when tab refocused)
89
+ function handleFocus() {
90
+ const current = getCachedProviders(cacheKey);
91
+ if (!current || isStale(current)) {
92
+ doFetch(false);
93
+ }
94
+ }
95
+ window.addEventListener('focus', handleFocus);
41
96
  return () => {
42
97
  mounted = false;
98
+ window.removeEventListener('focus', handleFocus);
43
99
  };
44
- }, [config.authUrl, config.clientId]);
45
- return { providers, isLoading, error };
100
+ }, [config.authUrl, config.clientId, cacheKey, refreshCounter]);
101
+ return { providers, isLoading, error, refresh };
46
102
  }
47
103
  //# sourceMappingURL=useProviders.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useProviders.js","sourceRoot":"","sources":["../src/useProviders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAc7C;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,KAAK,UAAU,cAAc;YAC3B,IAAI,CAAC;gBACH,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAEf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC;gBACnD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAEnD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,IAAI,OAAO,EAAE,CAAC;oBACZ,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO,EAAE,CAAC;oBACZ,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,OAAO,EAAE,CAAC;oBACZ,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,cAAc,EAAE,CAAC;QAEjB,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"useProviders.js","sourceRoot":"","sources":["../src/useProviders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { AuthConfig } from './types.js';
2
+ /**
3
+ * Configuration validation errors for better developer experience.
4
+ */
5
+ export declare class AuthConfigError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ /**
9
+ * Validates AuthConfig and throws descriptive errors if invalid.
10
+ * Called at initialization time to fail fast with helpful messages.
11
+ * Only clientId is required — authUrl and appUrl can be auto-discovered.
12
+ */
13
+ export declare function validateConfig(config: AuthConfig): void;
14
+ //# sourceMappingURL=validateConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateConfig.d.ts","sourceRoot":"","sources":["../src/validateConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CA4EvD"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Configuration validation errors for better developer experience.
3
+ */
4
+ export class AuthConfigError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = 'AuthConfigError';
8
+ }
9
+ }
10
+ /**
11
+ * Validates AuthConfig and throws descriptive errors if invalid.
12
+ * Called at initialization time to fail fast with helpful messages.
13
+ * Only clientId is required — authUrl and appUrl can be auto-discovered.
14
+ */
15
+ export function validateConfig(config) {
16
+ if (!config) {
17
+ throw new AuthConfigError('AuthProvider requires a config prop. ' +
18
+ 'At minimum, provide { clientId: "your-app-id" }.');
19
+ }
20
+ // Required field
21
+ if (!config.clientId) {
22
+ throw new AuthConfigError('Missing required config: clientId. ' +
23
+ 'This is the client ID registered with the auth service.');
24
+ }
25
+ // URL format validation (only if provided)
26
+ if (config.authUrl) {
27
+ try {
28
+ new URL(config.authUrl);
29
+ }
30
+ catch {
31
+ throw new AuthConfigError(`Invalid authUrl: "${config.authUrl}" is not a valid URL. ` +
32
+ 'It should include the protocol (e.g., "https://auth.tony.codes").');
33
+ }
34
+ }
35
+ if (config.appUrl) {
36
+ try {
37
+ new URL(config.appUrl);
38
+ }
39
+ catch {
40
+ throw new AuthConfigError(`Invalid appUrl: "${config.appUrl}" is not a valid URL. ` +
41
+ 'It should include the protocol (e.g., "https://myapp.tony.codes").');
42
+ }
43
+ }
44
+ if (config.apiUrl) {
45
+ try {
46
+ new URL(config.apiUrl);
47
+ }
48
+ catch {
49
+ throw new AuthConfigError(`Invalid apiUrl: "${config.apiUrl}" is not a valid URL. ` +
50
+ 'It should include the protocol (e.g., "https://api.myapp.tony.codes").');
51
+ }
52
+ }
53
+ // Common misconfiguration warnings (logged but don't throw)
54
+ if (typeof window !== 'undefined') {
55
+ const isProduction = !window.location.hostname.includes('test') &&
56
+ !window.location.hostname.includes('localhost');
57
+ if (isProduction && config.authUrl?.includes('localhost')) {
58
+ console.warn('[auth-react] Warning: authUrl contains "localhost" but app appears to be in production. ' +
59
+ 'Make sure to update authUrl for production.');
60
+ }
61
+ if (config.authUrl?.endsWith('/')) {
62
+ console.warn('[auth-react] Warning: authUrl has a trailing slash. ' +
63
+ 'This may cause double slashes in URLs.');
64
+ }
65
+ if (config.appUrl?.endsWith('/')) {
66
+ console.warn('[auth-react] Warning: appUrl has a trailing slash. ' +
67
+ 'This may cause double slashes in URLs.');
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=validateConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateConfig.js","sourceRoot":"","sources":["../src/validateConfig.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,eAAe,CACvB,uCAAuC;YACrC,kDAAkD,CACrD,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,eAAe,CACvB,qCAAqC;YACnC,yDAAyD,CAC5D,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CACvB,qBAAqB,MAAM,CAAC,OAAO,wBAAwB;gBACzD,mEAAmE,CACtE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CACvB,oBAAoB,MAAM,CAAC,MAAM,wBAAwB;gBACvD,oEAAoE,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CACvB,oBAAoB,MAAM,CAAC,MAAM,wBAAwB;gBACvD,wEAAwE,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1C,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAErE,IAAI,YAAY,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,CACV,0FAA0F;gBACxF,6CAA6C,CAChD,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CACV,sDAAsD;gBACpD,wCAAwC,CAC3C,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CACV,qDAAqD;gBACnD,wCAAwC,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonycodes/auth-react",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "React SDK for Tony Auth service",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",