@tonycodes/auth-react 1.0.1 → 1.1.1
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/dist/AuthProvider.d.ts +2 -2
- package/dist/AuthProvider.d.ts.map +1 -1
- package/dist/AuthProvider.js +113 -23
- package/dist/AuthProvider.js.map +1 -1
- package/dist/SignInForm.d.ts +5 -8
- package/dist/SignInForm.d.ts.map +1 -1
- package/dist/SignInForm.js +21 -27
- package/dist/SignInForm.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types.d.ts +17 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/useAuth.d.ts +2 -2
- package/dist/useAuth.d.ts.map +1 -1
- package/dist/useProviders.d.ts +7 -3
- package/dist/useProviders.d.ts.map +1 -1
- package/dist/useProviders.js +77 -21
- package/dist/useProviders.js.map +1 -1
- package/dist/validateConfig.d.ts +14 -0
- package/dist/validateConfig.d.ts.map +1 -0
- package/dist/validateConfig.js +71 -0
- package/dist/validateConfig.js.map +1 -0
- package/package.json +2 -25
- package/src/AuthCallback.tsx +128 -0
- package/src/AuthProvider.tsx +331 -0
- package/src/OrganizationSwitcher.tsx +75 -0
- package/src/SignInForm.tsx +202 -0
- package/src/components.tsx +40 -0
- package/src/index.ts +9 -0
- package/src/style.css +1 -0
- package/src/types.ts +66 -0
- package/src/useAuth.ts +19 -0
- package/src/useProviders.ts +136 -0
- package/src/validateConfig.ts +94 -0
- package/tailwind.config.js +7 -0
- package/tsconfig.json +18 -0
- package/LICENSE +0 -21
package/dist/AuthProvider.d.ts
CHANGED
|
@@ -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<
|
|
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;
|
|
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"}
|
package/dist/AuthProvider.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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(`${
|
|
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
|
-
}, [
|
|
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
|
-
}, [
|
|
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
|
-
|
|
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
|
-
}, [
|
|
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(`${
|
|
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
|
-
}, [
|
|
230
|
+
}, [resolved]);
|
|
149
231
|
const switchOrganization = useCallback(async (orgId) => {
|
|
232
|
+
if (!resolved)
|
|
233
|
+
return;
|
|
150
234
|
try {
|
|
151
|
-
const res = await fetch(`${
|
|
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
|
-
}, [
|
|
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) {
|
|
@@ -181,8 +264,8 @@ export function AuthProvider({ config, children }) {
|
|
|
181
264
|
return refreshToken();
|
|
182
265
|
}, [accessToken, refreshToken]);
|
|
183
266
|
const value = {
|
|
184
|
-
isAuthenticated: !!accessToken && !!organization,
|
|
185
|
-
isLoading,
|
|
267
|
+
isAuthenticated: !!accessToken && (config.requireOrg === false || !!organization),
|
|
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
|
-
|
|
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
|
package/dist/AuthProvider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"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"}
|
package/dist/SignInForm.d.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
type
|
|
1
|
+
import { type SSOProvider } from './useProviders.js';
|
|
2
2
|
interface SignInFormProps {
|
|
3
|
-
/** List of provider IDs to show
|
|
4
|
-
providers?:
|
|
5
|
-
/** Whether to
|
|
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:
|
|
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
|
package/dist/SignInForm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInForm.d.ts","sourceRoot":"","sources":["../src/SignInForm.tsx"],"names":[],"mappings":"
|
|
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"}
|
package/dist/SignInForm.js
CHANGED
|
@@ -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
|
|
15
|
-
export function SignInForm({ providers:
|
|
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(
|
|
18
|
+
const [activeTab, setActiveTab] = useState('signin');
|
|
19
19
|
const [errorMessage, setErrorMessage] = useState(null);
|
|
20
20
|
const [returnTo, setReturnTo] = useState('/');
|
|
21
|
-
//
|
|
22
|
-
const
|
|
23
|
-
?
|
|
21
|
+
// Use prop providers if explicitly provided, otherwise use fetched providers
|
|
22
|
+
const enabledProviders = propProviders
|
|
23
|
+
? propProviders
|
|
24
24
|
: autoFetch
|
|
25
|
-
? fetchedProviders.
|
|
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 (
|
|
40
|
+
if (tabParam === 'signin' || tabParam === 'signup') {
|
|
41
41
|
setActiveTab(tabParam);
|
|
42
42
|
}
|
|
43
|
-
}, [
|
|
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
|
-
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
package/dist/SignInForm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInForm.js","sourceRoot":"","sources":["../src/SignInForm.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,
|
|
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
|
|
9
|
-
export type {
|
|
8
|
+
export { AuthConfigError } from './validateConfig.js';
|
|
9
|
+
export type { AuthConfig, ResolvedAuthConfig, AuthUser, AuthOrganization, AuthState } from './types.js';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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-
|
|
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,17 +1,29 @@
|
|
|
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
|
-
/**
|
|
7
|
-
|
|
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
|
-
*
|
|
12
|
+
* Auto-discovered from server or defaults to appUrl.
|
|
13
13
|
*/
|
|
14
14
|
apiUrl?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Whether to require an organization for the user to be considered authenticated.
|
|
17
|
+
* Defaults to true. Set to false for single-user apps without org context.
|
|
18
|
+
*/
|
|
19
|
+
requireOrg?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Resolved config with all URLs populated (after discovery) */
|
|
22
|
+
export interface ResolvedAuthConfig {
|
|
23
|
+
clientId: string;
|
|
24
|
+
authUrl: string;
|
|
25
|
+
appUrl: string;
|
|
26
|
+
apiUrl: string;
|
|
15
27
|
}
|
|
16
28
|
export interface AuthUser {
|
|
17
29
|
id: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,
|
|
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;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;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 {
|
|
1
|
+
import type { ResolvedAuthConfig, AuthState } from './types.js';
|
|
2
2
|
export declare function useAuth(): AuthState;
|
|
3
|
-
export declare function useAuthConfig():
|
|
3
|
+
export declare function useAuthConfig(): ResolvedAuthConfig;
|
|
4
4
|
//# sourceMappingURL=useAuth.d.ts.map
|
package/dist/useAuth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
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"}
|
package/dist/useProviders.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
export type SSOProvider = 'github' | 'google' | 'apple' | 'bitbucket';
|
|
1
2
|
export interface ProviderInfo {
|
|
2
|
-
id:
|
|
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
|
|
13
|
-
*
|
|
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,
|
|
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"}
|