@propelauth/nextjs 0.0.60
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/README.md +215 -0
- package/dist/client/index.d.ts +95 -0
- package/dist/client/index.js +543 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +500 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/server/index.d.ts +94 -0
- package/dist/server/index.js +622 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +584 -0
- package/dist/server/index.mjs.map +1 -0
- package/package.json +47 -0
@@ -0,0 +1,543 @@
|
|
1
|
+
"use client";
|
2
|
+
"use strict";
|
3
|
+
var __create = Object.create;
|
4
|
+
var __defProp = Object.defineProperty;
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
9
|
+
var __export = (target, all) => {
|
10
|
+
for (var name in all)
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
12
|
+
};
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
15
|
+
for (let key of __getOwnPropNames(from))
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
18
|
+
}
|
19
|
+
return to;
|
20
|
+
};
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
27
|
+
mod
|
28
|
+
));
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
30
|
+
var __async = (__this, __arguments, generator) => {
|
31
|
+
return new Promise((resolve, reject) => {
|
32
|
+
var fulfilled = (value) => {
|
33
|
+
try {
|
34
|
+
step(generator.next(value));
|
35
|
+
} catch (e) {
|
36
|
+
reject(e);
|
37
|
+
}
|
38
|
+
};
|
39
|
+
var rejected = (value) => {
|
40
|
+
try {
|
41
|
+
step(generator.throw(value));
|
42
|
+
} catch (e) {
|
43
|
+
reject(e);
|
44
|
+
}
|
45
|
+
};
|
46
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
47
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
48
|
+
});
|
49
|
+
};
|
50
|
+
|
51
|
+
// src/client/index.ts
|
52
|
+
var client_exports = {};
|
53
|
+
__export(client_exports, {
|
54
|
+
AuthProvider: () => AuthProvider,
|
55
|
+
RedirectToLogin: () => RedirectToLogin,
|
56
|
+
RedirectToSignup: () => RedirectToSignup,
|
57
|
+
useHostedPageUrls: () => useHostedPageUrls,
|
58
|
+
useLogoutFunction: () => useLogoutFunction,
|
59
|
+
useRedirectFunctions: () => useRedirectFunctions,
|
60
|
+
useRefreshAuth: () => useRefreshAuth,
|
61
|
+
useUser: () => useUser
|
62
|
+
});
|
63
|
+
module.exports = __toCommonJS(client_exports);
|
64
|
+
|
65
|
+
// src/client/AuthProvider.tsx
|
66
|
+
var import_react = __toESM(require("react"));
|
67
|
+
|
68
|
+
// src/user.ts
|
69
|
+
var User = class {
|
70
|
+
constructor(userId, email, orgIdToOrgMemberInfo, firstName, lastName, username, legacyUserId, impersonatorUserId) {
|
71
|
+
this.userId = userId;
|
72
|
+
this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo;
|
73
|
+
this.email = email;
|
74
|
+
this.firstName = firstName;
|
75
|
+
this.lastName = lastName;
|
76
|
+
this.username = username;
|
77
|
+
this.legacyUserId = legacyUserId;
|
78
|
+
this.impersonatorUserId = impersonatorUserId;
|
79
|
+
}
|
80
|
+
getOrg(orgId) {
|
81
|
+
if (!this.orgIdToOrgMemberInfo) {
|
82
|
+
return void 0;
|
83
|
+
}
|
84
|
+
return this.orgIdToOrgMemberInfo[orgId];
|
85
|
+
}
|
86
|
+
getOrgByName(orgName) {
|
87
|
+
if (!this.orgIdToOrgMemberInfo) {
|
88
|
+
return void 0;
|
89
|
+
}
|
90
|
+
const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, "-");
|
91
|
+
for (const orgId in this.orgIdToOrgMemberInfo) {
|
92
|
+
const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId];
|
93
|
+
if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {
|
94
|
+
return orgMemberInfo;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
return void 0;
|
98
|
+
}
|
99
|
+
getOrgs() {
|
100
|
+
if (!this.orgIdToOrgMemberInfo) {
|
101
|
+
return [];
|
102
|
+
}
|
103
|
+
return Object.values(this.orgIdToOrgMemberInfo);
|
104
|
+
}
|
105
|
+
isImpersonating() {
|
106
|
+
return !!this.impersonatorUserId;
|
107
|
+
}
|
108
|
+
static fromJSON(json) {
|
109
|
+
const obj = JSON.parse(json);
|
110
|
+
const orgIdToOrgMemberInfo = {};
|
111
|
+
for (const orgId in obj.orgIdToOrgMemberInfo) {
|
112
|
+
orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(
|
113
|
+
JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])
|
114
|
+
);
|
115
|
+
}
|
116
|
+
return new User(
|
117
|
+
obj.userId,
|
118
|
+
obj.email,
|
119
|
+
orgIdToOrgMemberInfo,
|
120
|
+
obj.firstName,
|
121
|
+
obj.lastName,
|
122
|
+
obj.username,
|
123
|
+
obj.legacyUserId,
|
124
|
+
obj.impersonatorUserId
|
125
|
+
);
|
126
|
+
}
|
127
|
+
};
|
128
|
+
var OrgMemberInfo = class {
|
129
|
+
constructor(orgId, orgName, orgMetadata, urlSafeOrgName, userAssignedRole, userInheritedRolesPlusCurrentRole, userPermissions) {
|
130
|
+
this.orgId = orgId;
|
131
|
+
this.orgName = orgName;
|
132
|
+
this.orgMetadata = orgMetadata;
|
133
|
+
this.urlSafeOrgName = urlSafeOrgName;
|
134
|
+
this.userAssignedRole = userAssignedRole;
|
135
|
+
this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole;
|
136
|
+
this.userPermissions = userPermissions;
|
137
|
+
}
|
138
|
+
// validation methods
|
139
|
+
isRole(role) {
|
140
|
+
return this.userAssignedRole === role;
|
141
|
+
}
|
142
|
+
isAtLeastRole(role) {
|
143
|
+
return this.userInheritedRolesPlusCurrentRole.includes(role);
|
144
|
+
}
|
145
|
+
hasPermission(permission) {
|
146
|
+
return this.userPermissions.includes(permission);
|
147
|
+
}
|
148
|
+
hasAllPermissions(permissions) {
|
149
|
+
return permissions.every((permission) => this.hasPermission(permission));
|
150
|
+
}
|
151
|
+
static fromJSON(json) {
|
152
|
+
const obj = JSON.parse(json);
|
153
|
+
return new OrgMemberInfo(
|
154
|
+
obj.orgId,
|
155
|
+
obj.orgName,
|
156
|
+
obj.orgMetadata,
|
157
|
+
obj.urlSafeOrgName,
|
158
|
+
obj.userAssignedRole,
|
159
|
+
obj.userInheritedRolesPlusCurrentRole,
|
160
|
+
obj.userPermissions
|
161
|
+
);
|
162
|
+
}
|
163
|
+
// getters for the private fields
|
164
|
+
get assignedRole() {
|
165
|
+
return this.userAssignedRole;
|
166
|
+
}
|
167
|
+
get inheritedRolesPlusCurrentRole() {
|
168
|
+
return this.userInheritedRolesPlusCurrentRole;
|
169
|
+
}
|
170
|
+
get permissions() {
|
171
|
+
return this.userPermissions;
|
172
|
+
}
|
173
|
+
};
|
174
|
+
|
175
|
+
// src/client/utils.ts
|
176
|
+
var USER_INFO_KEY = "__PROPEL_AUTH_USER_INFO";
|
177
|
+
function hasWindow() {
|
178
|
+
return typeof window !== "undefined";
|
179
|
+
}
|
180
|
+
function saveUserToLocalStorage(user) {
|
181
|
+
if (user) {
|
182
|
+
localStorage.setItem(USER_INFO_KEY, JSON.stringify(user));
|
183
|
+
} else {
|
184
|
+
localStorage.setItem(USER_INFO_KEY, "{}");
|
185
|
+
}
|
186
|
+
}
|
187
|
+
function doesLocalStorageMatch(newValue, user) {
|
188
|
+
if (!newValue) {
|
189
|
+
return false;
|
190
|
+
} else if (!user) {
|
191
|
+
return newValue === "{}";
|
192
|
+
}
|
193
|
+
const parsed = JSON.parse(newValue);
|
194
|
+
if (!parsed) {
|
195
|
+
return false;
|
196
|
+
}
|
197
|
+
return isEqual(parsed, user);
|
198
|
+
}
|
199
|
+
function isEqual(a, b) {
|
200
|
+
if (typeof a !== typeof b) {
|
201
|
+
return false;
|
202
|
+
}
|
203
|
+
if (Array.isArray(a) !== Array.isArray(b)) {
|
204
|
+
return false;
|
205
|
+
}
|
206
|
+
if (Array.isArray(a)) {
|
207
|
+
const aArray = a;
|
208
|
+
const bArray = b;
|
209
|
+
if (aArray.length !== bArray.length) {
|
210
|
+
return false;
|
211
|
+
}
|
212
|
+
for (let i = 0; i < aArray.length; i++) {
|
213
|
+
if (!isEqual(aArray[i], bArray[i])) {
|
214
|
+
return false;
|
215
|
+
}
|
216
|
+
}
|
217
|
+
return true;
|
218
|
+
}
|
219
|
+
if (typeof a === "object") {
|
220
|
+
const aKeys = Object.keys(a);
|
221
|
+
const bKeys = Object.keys(b);
|
222
|
+
if (aKeys.length !== bKeys.length) {
|
223
|
+
return false;
|
224
|
+
}
|
225
|
+
for (const key of aKeys) {
|
226
|
+
if (!isEqual(a[key], b[key])) {
|
227
|
+
return false;
|
228
|
+
}
|
229
|
+
}
|
230
|
+
return true;
|
231
|
+
} else {
|
232
|
+
return a === b;
|
233
|
+
}
|
234
|
+
}
|
235
|
+
|
236
|
+
// src/client/AuthProvider.tsx
|
237
|
+
var import_navigation = require("next/navigation");
|
238
|
+
var AuthContext = import_react.default.createContext(void 0);
|
239
|
+
var initialAuthState = {
|
240
|
+
loading: true,
|
241
|
+
user: void 0,
|
242
|
+
authChangeDetected: false
|
243
|
+
};
|
244
|
+
function authStateReducer(_state, action) {
|
245
|
+
const authChangeDetected = !_state.loading && !isEqual(action.user, _state.user);
|
246
|
+
if (!action.user) {
|
247
|
+
return {
|
248
|
+
loading: false,
|
249
|
+
user: void 0,
|
250
|
+
authChangeDetected
|
251
|
+
};
|
252
|
+
} else if (_state.loading) {
|
253
|
+
return {
|
254
|
+
loading: false,
|
255
|
+
user: action.user,
|
256
|
+
authChangeDetected
|
257
|
+
};
|
258
|
+
} else {
|
259
|
+
return {
|
260
|
+
loading: false,
|
261
|
+
user: action.user,
|
262
|
+
authChangeDetected
|
263
|
+
};
|
264
|
+
}
|
265
|
+
}
|
266
|
+
var AuthProvider = (props) => {
|
267
|
+
const [authState, dispatchInner] = (0, import_react.useReducer)(authStateReducer, initialAuthState);
|
268
|
+
const router = (0, import_navigation.useRouter)();
|
269
|
+
const dispatch = (0, import_react.useCallback)((action) => {
|
270
|
+
dispatchInner(action);
|
271
|
+
saveUserToLocalStorage(action.user);
|
272
|
+
}, [dispatchInner]);
|
273
|
+
(0, import_react.useEffect)(() => {
|
274
|
+
if (authState.authChangeDetected) {
|
275
|
+
router.refresh();
|
276
|
+
}
|
277
|
+
}, [authState.authChangeDetected, router]);
|
278
|
+
(0, import_react.useEffect)(() => {
|
279
|
+
let didCancel = false;
|
280
|
+
function refreshAuthInfo2() {
|
281
|
+
return __async(this, null, function* () {
|
282
|
+
const { user } = yield apiGetUserInfo();
|
283
|
+
if (!didCancel) {
|
284
|
+
dispatch({ user });
|
285
|
+
}
|
286
|
+
});
|
287
|
+
}
|
288
|
+
refreshAuthInfo2();
|
289
|
+
return () => {
|
290
|
+
didCancel = true;
|
291
|
+
};
|
292
|
+
}, []);
|
293
|
+
(0, import_react.useEffect)(() => {
|
294
|
+
let didCancel = false;
|
295
|
+
function refreshToken() {
|
296
|
+
return __async(this, null, function* () {
|
297
|
+
const { user } = yield apiGetUserInfo();
|
298
|
+
if (!didCancel) {
|
299
|
+
dispatch({ user });
|
300
|
+
}
|
301
|
+
});
|
302
|
+
}
|
303
|
+
function onStorageEvent(event) {
|
304
|
+
return __async(this, null, function* () {
|
305
|
+
if (event.key === USER_INFO_KEY && !doesLocalStorageMatch(event.newValue, authState.user)) {
|
306
|
+
yield refreshToken();
|
307
|
+
}
|
308
|
+
});
|
309
|
+
}
|
310
|
+
const interval = setInterval(refreshToken, 5 * 60 * 1e3);
|
311
|
+
if (hasWindow()) {
|
312
|
+
window.addEventListener("storage", onStorageEvent);
|
313
|
+
window.addEventListener("online", refreshToken);
|
314
|
+
window.addEventListener("focus", refreshToken);
|
315
|
+
}
|
316
|
+
return () => {
|
317
|
+
didCancel = true;
|
318
|
+
clearInterval(interval);
|
319
|
+
if (hasWindow()) {
|
320
|
+
window.removeEventListener("storage", onStorageEvent);
|
321
|
+
window.removeEventListener("online", refreshToken);
|
322
|
+
window.removeEventListener("focus", refreshToken);
|
323
|
+
}
|
324
|
+
};
|
325
|
+
}, [dispatch, authState.user]);
|
326
|
+
const logout = (0, import_react.useCallback)(() => __async(void 0, null, function* () {
|
327
|
+
yield fetch("/api/auth/logout", {
|
328
|
+
method: "POST",
|
329
|
+
headers: {
|
330
|
+
"Content-Type": "application/json"
|
331
|
+
},
|
332
|
+
credentials: "include"
|
333
|
+
});
|
334
|
+
dispatch({ user: void 0 });
|
335
|
+
}), [dispatch]);
|
336
|
+
const getLoginPageUrl = () => "/api/auth/login";
|
337
|
+
const getSignupPageUrl = () => "/api/auth/signup";
|
338
|
+
const getAccountPageUrl = (0, import_react.useCallback)(() => {
|
339
|
+
return `${props.authUrl}/account`;
|
340
|
+
}, [props.authUrl]);
|
341
|
+
const getOrgPageUrl = (0, import_react.useCallback)(
|
342
|
+
(orgId) => {
|
343
|
+
if (orgId) {
|
344
|
+
return `${props.authUrl}/org?id=${orgId}`;
|
345
|
+
} else {
|
346
|
+
return `${props.authUrl}/org`;
|
347
|
+
}
|
348
|
+
},
|
349
|
+
[props.authUrl]
|
350
|
+
);
|
351
|
+
const getCreateOrgPageUrl = (0, import_react.useCallback)(() => {
|
352
|
+
return `${props.authUrl}/create_org`;
|
353
|
+
}, [props.authUrl]);
|
354
|
+
const getSetupSAMLPageUrl = (0, import_react.useCallback)(
|
355
|
+
(orgId) => {
|
356
|
+
return `${props.authUrl}/saml?id=${orgId}`;
|
357
|
+
},
|
358
|
+
[props.authUrl]
|
359
|
+
);
|
360
|
+
const redirectTo = (url) => {
|
361
|
+
window.location.href = url;
|
362
|
+
};
|
363
|
+
const redirectToLoginPage = () => redirectTo(getLoginPageUrl());
|
364
|
+
const redirectToSignupPage = () => redirectTo(getSignupPageUrl());
|
365
|
+
const redirectToAccountPage = () => redirectTo(getAccountPageUrl());
|
366
|
+
const redirectToOrgPage = (orgId) => redirectTo(getOrgPageUrl(orgId));
|
367
|
+
const redirectToCreateOrgPage = () => redirectTo(getCreateOrgPageUrl());
|
368
|
+
const redirectToSetupSAMLPage = (orgId) => redirectTo(getSetupSAMLPageUrl(orgId));
|
369
|
+
const refreshAuthInfo = () => __async(void 0, null, function* () {
|
370
|
+
const { user } = yield apiGetUserInfo();
|
371
|
+
dispatch({ user });
|
372
|
+
return user;
|
373
|
+
});
|
374
|
+
const value = {
|
375
|
+
loading: authState.loading,
|
376
|
+
user: authState.user,
|
377
|
+
logout,
|
378
|
+
redirectToLoginPage,
|
379
|
+
redirectToSignupPage,
|
380
|
+
redirectToAccountPage,
|
381
|
+
redirectToOrgPage,
|
382
|
+
redirectToCreateOrgPage,
|
383
|
+
redirectToSetupSAMLPage,
|
384
|
+
getLoginPageUrl,
|
385
|
+
getSignupPageUrl,
|
386
|
+
getAccountPageUrl,
|
387
|
+
getOrgPageUrl,
|
388
|
+
getCreateOrgPageUrl,
|
389
|
+
getSetupSAMLPageUrl,
|
390
|
+
refreshAuthInfo
|
391
|
+
};
|
392
|
+
return /* @__PURE__ */ import_react.default.createElement(AuthContext.Provider, { value }, props.children);
|
393
|
+
};
|
394
|
+
function apiGetUserInfo() {
|
395
|
+
return __async(this, null, function* () {
|
396
|
+
try {
|
397
|
+
const userInfoResponse = yield fetch("/api/auth/userinfo", {
|
398
|
+
method: "GET",
|
399
|
+
headers: {
|
400
|
+
"Content-Type": "application/json"
|
401
|
+
},
|
402
|
+
credentials: "include"
|
403
|
+
});
|
404
|
+
if (userInfoResponse.ok) {
|
405
|
+
const userJson = yield userInfoResponse.text();
|
406
|
+
const user = User.fromJSON(userJson);
|
407
|
+
return { user };
|
408
|
+
} else if (userInfoResponse.status === 401) {
|
409
|
+
return { user: void 0 };
|
410
|
+
} else {
|
411
|
+
console.log("Failed to refresh token", userInfoResponse);
|
412
|
+
}
|
413
|
+
} catch (e) {
|
414
|
+
console.log("Failed to refresh token", e);
|
415
|
+
}
|
416
|
+
throw new Error("Failed to refresh token");
|
417
|
+
});
|
418
|
+
}
|
419
|
+
|
420
|
+
// src/client/useUser.tsx
|
421
|
+
var import_react2 = require("react");
|
422
|
+
function useUser() {
|
423
|
+
const context = (0, import_react2.useContext)(AuthContext);
|
424
|
+
if (context === void 0) {
|
425
|
+
throw new Error("useUser must be used within an AuthProvider");
|
426
|
+
}
|
427
|
+
const { loading, user } = context;
|
428
|
+
if (loading) {
|
429
|
+
return {
|
430
|
+
loading: true,
|
431
|
+
isLoggedIn: void 0,
|
432
|
+
user: void 0
|
433
|
+
};
|
434
|
+
} else if (user) {
|
435
|
+
return {
|
436
|
+
loading: false,
|
437
|
+
isLoggedIn: true,
|
438
|
+
user
|
439
|
+
};
|
440
|
+
} else {
|
441
|
+
return {
|
442
|
+
loading: false,
|
443
|
+
isLoggedIn: false,
|
444
|
+
user: void 0
|
445
|
+
};
|
446
|
+
}
|
447
|
+
}
|
448
|
+
|
449
|
+
// src/client/useHostedPageUrls.tsx
|
450
|
+
var import_react3 = require("react");
|
451
|
+
function useHostedPageUrls() {
|
452
|
+
const context = (0, import_react3.useContext)(AuthContext);
|
453
|
+
if (context === void 0) {
|
454
|
+
throw new Error("useHostedPageUrls must be used within an AuthProvider");
|
455
|
+
}
|
456
|
+
const {
|
457
|
+
getLoginPageUrl,
|
458
|
+
getSignupPageUrl,
|
459
|
+
getAccountPageUrl,
|
460
|
+
getOrgPageUrl,
|
461
|
+
getCreateOrgPageUrl,
|
462
|
+
getSetupSAMLPageUrl
|
463
|
+
} = context;
|
464
|
+
return {
|
465
|
+
getLoginPageUrl,
|
466
|
+
getSignupPageUrl,
|
467
|
+
getAccountPageUrl,
|
468
|
+
getOrgPageUrl,
|
469
|
+
getCreateOrgPageUrl,
|
470
|
+
getSetupSAMLPageUrl
|
471
|
+
};
|
472
|
+
}
|
473
|
+
|
474
|
+
// src/client/useLogoutFunction.ts
|
475
|
+
var import_react4 = require("react");
|
476
|
+
function useLogoutFunction() {
|
477
|
+
const context = (0, import_react4.useContext)(AuthContext);
|
478
|
+
if (context === void 0) {
|
479
|
+
throw new Error("useLogoutFunction must be used within an AuthProvider");
|
480
|
+
}
|
481
|
+
const { logout } = context;
|
482
|
+
return logout;
|
483
|
+
}
|
484
|
+
|
485
|
+
// src/client/useRedirectFunctions.tsx
|
486
|
+
var import_react5 = __toESM(require("react"));
|
487
|
+
function useRedirectFunctions() {
|
488
|
+
const context = (0, import_react5.useContext)(AuthContext);
|
489
|
+
if (context === void 0) {
|
490
|
+
throw new Error("useRedirectFunctions must be used within an AuthProvider");
|
491
|
+
}
|
492
|
+
const {
|
493
|
+
redirectToAccountPage,
|
494
|
+
redirectToSignupPage,
|
495
|
+
redirectToLoginPage,
|
496
|
+
redirectToOrgPage,
|
497
|
+
redirectToCreateOrgPage
|
498
|
+
} = context;
|
499
|
+
return {
|
500
|
+
redirectToSignupPage,
|
501
|
+
redirectToLoginPage,
|
502
|
+
redirectToAccountPage,
|
503
|
+
redirectToOrgPage,
|
504
|
+
redirectToCreateOrgPage
|
505
|
+
};
|
506
|
+
}
|
507
|
+
function RedirectToSignup({ children }) {
|
508
|
+
const { redirectToSignupPage } = useRedirectFunctions();
|
509
|
+
(0, import_react5.useEffect)(() => {
|
510
|
+
redirectToSignupPage();
|
511
|
+
}, []);
|
512
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, children);
|
513
|
+
}
|
514
|
+
function RedirectToLogin({ children }) {
|
515
|
+
const { redirectToLoginPage } = useRedirectFunctions();
|
516
|
+
(0, import_react5.useEffect)(() => {
|
517
|
+
redirectToLoginPage();
|
518
|
+
}, []);
|
519
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, children);
|
520
|
+
}
|
521
|
+
|
522
|
+
// src/client/useRefreshAuth.ts
|
523
|
+
var import_react6 = require("react");
|
524
|
+
function useRefreshAuth() {
|
525
|
+
const context = (0, import_react6.useContext)(AuthContext);
|
526
|
+
if (context === void 0) {
|
527
|
+
throw new Error("useRefreshAuth must be used within an AuthProvider");
|
528
|
+
}
|
529
|
+
const { refreshAuthInfo } = context;
|
530
|
+
return refreshAuthInfo;
|
531
|
+
}
|
532
|
+
// Annotate the CommonJS export names for ESM import in node:
|
533
|
+
0 && (module.exports = {
|
534
|
+
AuthProvider,
|
535
|
+
RedirectToLogin,
|
536
|
+
RedirectToSignup,
|
537
|
+
useHostedPageUrls,
|
538
|
+
useLogoutFunction,
|
539
|
+
useRedirectFunctions,
|
540
|
+
useRefreshAuth,
|
541
|
+
useUser
|
542
|
+
});
|
543
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/client/index.ts","../../src/client/AuthProvider.tsx","../../src/user.ts","../../src/client/utils.ts","../../src/client/useUser.tsx","../../src/client/useHostedPageUrls.tsx","../../src/client/useLogoutFunction.ts","../../src/client/useRedirectFunctions.tsx","../../src/client/useRefreshAuth.ts"],"sourcesContent":["export type {OrgIdToOrgMemberInfo, OrgMemberInfo, User} from \"../user\"\nexport {AuthProvider} from \"./AuthProvider\"\nexport type {AuthProviderProps} from \"./AuthProvider\"\nexport {useUser} from \"./useUser\"\nexport type {UseUser, UseUserLoading, UseUserLoggedIn, UseUserNotLoggedIn} from \"./useUser\"\nexport {useHostedPageUrls} from \"./useHostedPageUrls\"\nexport {useLogoutFunction} from \"./useLogoutFunction\"\nexport {useRedirectFunctions, RedirectToLogin, RedirectToSignup} from \"./useRedirectFunctions\"\nexport type {RedirectProps} from \"./useRedirectFunctions\"\nexport {useRefreshAuth} from \"./useRefreshAuth\"","'use client'\n\nimport React, {useCallback, useEffect, useReducer} from \"react\"\nimport {User} from \"../user\"\nimport {doesLocalStorageMatch, hasWindow, isEqual, saveUserToLocalStorage, USER_INFO_KEY} from \"./utils\";\nimport {useRouter} from \"next/navigation\";\n\ninterface InternalAuthState {\n loading: boolean\n user?: User\n\n logout: () => Promise<void>\n\n redirectToLoginPage: () => void\n redirectToSignupPage: () => void\n redirectToAccountPage: () => void\n redirectToOrgPage: (orgId?: string) => void\n redirectToCreateOrgPage: () => void\n redirectToSetupSAMLPage: (orgId: string) => void\n\n getSignupPageUrl(): string\n\n getLoginPageUrl(): string\n\n getAccountPageUrl(): string\n\n getOrgPageUrl(orgId?: string): string\n\n getCreateOrgPageUrl(): string\n\n getSetupSAMLPageUrl(orgId: string): string\n\n refreshAuthInfo: () => Promise<User | undefined>\n}\n\nexport type AuthProviderProps = {\n authUrl: string\n children?: React.ReactNode\n}\n\nexport const AuthContext = React.createContext<InternalAuthState | undefined>(undefined)\n\ntype AuthState = {\n loading: boolean\n user?: User\n\n // There's no good way to trigger server components to reload outside of router.refresh()\n // This is our workaround until the app router has something better\n authChangeDetected: boolean\n}\n\nconst initialAuthState = {\n loading: true,\n user: undefined,\n authChangeDetected: false,\n}\n\ntype AuthStateAction = {\n user?: User\n}\n\nfunction authStateReducer(_state: AuthState, action: AuthStateAction): AuthState {\n const authChangeDetected = !_state.loading && !isEqual(action.user, _state.user)\n\n if (!action.user) {\n return {\n loading: false,\n user: undefined,\n authChangeDetected,\n }\n } else if (_state.loading) {\n return {\n loading: false,\n user: action.user,\n authChangeDetected,\n }\n } else {\n return {\n loading: false,\n user: action.user,\n authChangeDetected\n }\n }\n}\n\nexport const AuthProvider = (props: AuthProviderProps) => {\n const [authState, dispatchInner] = useReducer(authStateReducer, initialAuthState)\n const router = useRouter()\n\n const dispatch = useCallback((action: AuthStateAction) => {\n dispatchInner(action)\n saveUserToLocalStorage(action.user)\n }, [dispatchInner])\n\n // This is because we don't have a good way to trigger server components to reload outside of router.refresh()\n // Once server actions isn't alpha, we can hopefully use that instead\n useEffect(() => {\n if (authState.authChangeDetected) {\n router.refresh()\n }\n }, [authState.authChangeDetected, router])\n\n // Trigger an initial refresh\n useEffect(() => {\n let didCancel = false\n\n async function refreshAuthInfo() {\n const {user} = await apiGetUserInfo()\n if (!didCancel) {\n dispatch({user})\n }\n }\n\n refreshAuthInfo()\n return () => {\n didCancel = true\n }\n }, [])\n\n\n // Periodically refresh the token\n useEffect(() => {\n let didCancel = false\n\n async function refreshToken() {\n const {user} = await apiGetUserInfo()\n if (!didCancel) {\n dispatch({user})\n }\n }\n\n async function onStorageEvent(event: StorageEvent) {\n if (event.key === USER_INFO_KEY && !doesLocalStorageMatch(event.newValue, authState.user)) {\n await refreshToken()\n }\n }\n\n // TODO: Retry logic if the request fails\n const interval = setInterval(refreshToken, 5 * 60 * 1000)\n\n if (hasWindow()) {\n window.addEventListener(\"storage\", onStorageEvent)\n window.addEventListener(\"online\", refreshToken)\n window.addEventListener(\"focus\", refreshToken)\n }\n\n return () => {\n didCancel = true\n clearInterval(interval)\n if (hasWindow()) {\n window.removeEventListener(\"storage\", onStorageEvent)\n window.removeEventListener(\"online\", refreshToken)\n window.removeEventListener(\"focus\", refreshToken)\n }\n }\n }, [dispatch, authState.user])\n\n\n const logout = useCallback(async () => {\n await fetch(\"/api/auth/logout\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n })\n dispatch({user: undefined})\n }, [dispatch])\n\n const getLoginPageUrl = () => \"/api/auth/login\"\n const getSignupPageUrl = () => \"/api/auth/signup\"\n const getAccountPageUrl = useCallback(() => {\n return `${props.authUrl}/account`\n }, [props.authUrl])\n const getOrgPageUrl = useCallback(\n (orgId?: string) => {\n if (orgId) {\n return `${props.authUrl}/org?id=${orgId}`\n } else {\n return `${props.authUrl}/org`\n }\n },\n [props.authUrl]\n )\n const getCreateOrgPageUrl = useCallback(() => {\n return `${props.authUrl}/create_org`\n }, [props.authUrl])\n\n const getSetupSAMLPageUrl = useCallback(\n (orgId: string) => {\n return `${props.authUrl}/saml?id=${orgId}`\n },\n [props.authUrl]\n )\n\n const redirectTo = (url: string) => {\n window.location.href = url\n }\n\n const redirectToLoginPage = () => redirectTo(getLoginPageUrl())\n const redirectToSignupPage = () => redirectTo(getSignupPageUrl())\n const redirectToAccountPage = () => redirectTo(getAccountPageUrl())\n const redirectToOrgPage = (orgId?: string) => redirectTo(getOrgPageUrl(orgId))\n const redirectToCreateOrgPage = () => redirectTo(getCreateOrgPageUrl())\n const redirectToSetupSAMLPage = (orgId: string) => redirectTo(getSetupSAMLPageUrl(orgId))\n\n const refreshAuthInfo = async () => {\n const {user} = await apiGetUserInfo()\n dispatch({user})\n return user\n }\n\n const value = {\n loading: authState.loading,\n user: authState.user,\n logout,\n redirectToLoginPage,\n redirectToSignupPage,\n redirectToAccountPage,\n redirectToOrgPage,\n redirectToCreateOrgPage,\n redirectToSetupSAMLPage,\n getLoginPageUrl,\n getSignupPageUrl,\n getAccountPageUrl,\n getOrgPageUrl,\n getCreateOrgPageUrl,\n getSetupSAMLPageUrl,\n refreshAuthInfo,\n }\n return <AuthContext.Provider value={value}>{props.children}</AuthContext.Provider>\n}\n\ntype UserInfoResponse = { user?: User }\n\nasync function apiGetUserInfo(): Promise<UserInfoResponse> {\n try {\n const userInfoResponse = await fetch(\"/api/auth/userinfo\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n })\n\n if (userInfoResponse.ok) {\n const userJson = await userInfoResponse.text()\n const user = User.fromJSON(userJson)\n return {user}\n } else if (userInfoResponse.status === 401) {\n return {user: undefined}\n } else {\n console.log(\"Failed to refresh token\", userInfoResponse)\n }\n } catch (e) {\n console.log(\"Failed to refresh token\", e)\n }\n throw new Error(\"Failed to refresh token\")\n}\n","export class User {\n public userId: string\n public orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo\n\n // Metadata about the user\n public email: string\n public firstName?: string\n public lastName?: string\n public username?: string\n\n // If you used our migration APIs to migrate this user from a different system,\n // this is their original ID from that system.\n public legacyUserId?: string\n public impersonatorUserId?: string\n\n constructor(\n userId: string,\n email: string,\n orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo,\n firstName?: string,\n lastName?: string,\n username?: string,\n legacyUserId?: string,\n impersonatorUserId?: string\n ) {\n this.userId = userId\n this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo\n\n this.email = email\n this.firstName = firstName\n this.lastName = lastName\n this.username = username\n\n this.legacyUserId = legacyUserId\n this.impersonatorUserId = impersonatorUserId\n }\n\n public getOrg(orgId: string): OrgMemberInfo | undefined {\n if (!this.orgIdToOrgMemberInfo) {\n return undefined\n }\n\n return this.orgIdToOrgMemberInfo[orgId]\n }\n\n public getOrgByName(orgName: string): OrgMemberInfo | undefined {\n if (!this.orgIdToOrgMemberInfo) {\n return undefined\n }\n\n const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, \"-\")\n for (const orgId in this.orgIdToOrgMemberInfo) {\n const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId]\n if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {\n return orgMemberInfo\n }\n }\n\n return undefined\n }\n\n public getOrgs(): OrgMemberInfo[] {\n if (!this.orgIdToOrgMemberInfo) {\n return []\n }\n\n return Object.values(this.orgIdToOrgMemberInfo)\n }\n\n public isImpersonating(): boolean {\n return !!this.impersonatorUserId\n }\n\n public static fromJSON(json: string): User {\n const obj = JSON.parse(json)\n const orgIdToOrgMemberInfo: OrgIdToOrgMemberInfo = {}\n for (const orgId in obj.orgIdToOrgMemberInfo) {\n orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(\n JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])\n )\n }\n return new User(\n obj.userId,\n obj.email,\n orgIdToOrgMemberInfo,\n obj.firstName,\n obj.lastName,\n obj.username,\n obj.legacyUserId,\n obj.impersonatorUserId\n )\n }\n}\n\nexport type OrgIdToOrgMemberInfo = {\n [orgId: string]: OrgMemberInfo\n}\n\nexport class OrgMemberInfo {\n public orgId: string\n public orgName: string\n public orgMetadata: { [key: string]: any }\n public urlSafeOrgName: string\n\n private userAssignedRole: string\n private userInheritedRolesPlusCurrentRole: string[]\n private userPermissions: string[]\n\n constructor(\n orgId: string,\n orgName: string,\n orgMetadata: { [key: string]: any },\n urlSafeOrgName: string,\n userAssignedRole: string,\n userInheritedRolesPlusCurrentRole: string[],\n userPermissions: string[]\n ) {\n this.orgId = orgId\n this.orgName = orgName\n this.orgMetadata = orgMetadata\n this.urlSafeOrgName = urlSafeOrgName\n\n this.userAssignedRole = userAssignedRole\n this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole\n this.userPermissions = userPermissions\n }\n\n // validation methods\n\n public isRole(role: string): boolean {\n return this.userAssignedRole === role\n }\n\n public isAtLeastRole(role: string): boolean {\n return this.userInheritedRolesPlusCurrentRole.includes(role)\n }\n\n public hasPermission(permission: string): boolean {\n return this.userPermissions.includes(permission)\n }\n\n public hasAllPermissions(permissions: string[]): boolean {\n return permissions.every((permission) => this.hasPermission(permission))\n }\n\n public static fromJSON(json: string): OrgMemberInfo {\n const obj = JSON.parse(json)\n return new OrgMemberInfo(\n obj.orgId,\n obj.orgName,\n obj.orgMetadata,\n obj.urlSafeOrgName,\n obj.userAssignedRole,\n obj.userInheritedRolesPlusCurrentRole,\n obj.userPermissions\n )\n }\n\n // getters for the private fields\n\n get assignedRole(): string {\n return this.userAssignedRole\n }\n\n get inheritedRolesPlusCurrentRole(): string[] {\n return this.userInheritedRolesPlusCurrentRole\n }\n\n get permissions(): string[] {\n return this.userPermissions\n }\n}\n\n// These Internal types exist since the server returns snake case, but typescript/javascript\n// convention is camelCase.\nexport type InternalOrgMemberInfo = {\n org_id: string\n org_name: string\n org_metadata: { [key: string]: any }\n url_safe_org_name: string\n user_role: string\n inherited_user_roles_plus_current_role: string[]\n user_permissions: string[]\n}\nexport type InternalUser = {\n user_id: string\n org_id_to_org_member_info?: { [org_id: string]: InternalOrgMemberInfo }\n\n email: string\n first_name?: string\n last_name?: string\n username?: string\n\n // If you used our migration APIs to migrate this user from a different system, this is their original ID from that system.\n legacy_user_id?: string\n impersonatorUserId?: string\n}\n\nexport function toUser(snake_case: InternalUser): User {\n return new User(\n snake_case.user_id,\n snake_case.email,\n toOrgIdToOrgMemberInfo(snake_case.org_id_to_org_member_info),\n snake_case.first_name,\n snake_case.last_name,\n snake_case.username,\n snake_case.legacy_user_id,\n snake_case.impersonatorUserId\n )\n}\n\nexport function toOrgIdToOrgMemberInfo(snake_case?: {\n [org_id: string]: InternalOrgMemberInfo\n}): OrgIdToOrgMemberInfo | undefined {\n if (snake_case === undefined) {\n return undefined\n }\n const camelCase: OrgIdToOrgMemberInfo = {}\n\n for (const key of Object.keys(snake_case)) {\n const snakeCaseValue = snake_case[key]\n if (snakeCaseValue) {\n camelCase[key] = new OrgMemberInfo(\n snakeCaseValue.org_id,\n snakeCaseValue.org_name,\n snakeCaseValue.org_metadata,\n snakeCaseValue.url_safe_org_name,\n snakeCaseValue.user_role,\n snakeCaseValue.inherited_user_roles_plus_current_role,\n snakeCaseValue.user_permissions\n )\n }\n }\n\n return camelCase\n}\n","import {User} from \"../user\";\n\nexport const USER_INFO_KEY = \"__PROPEL_AUTH_USER_INFO\"\n\nexport function hasWindow(): boolean {\n return typeof window !== \"undefined\"\n}\n\nexport function saveUserToLocalStorage(user: User | undefined) {\n if (user) {\n localStorage.setItem(USER_INFO_KEY, JSON.stringify(user))\n } else {\n localStorage.setItem(USER_INFO_KEY, \"{}\")\n }\n}\n\nexport function doesLocalStorageMatch(newValue: string | null, user: User | undefined): boolean {\n if (!newValue) {\n return false\n } else if (!user) {\n return newValue === \"{}\"\n }\n\n const parsed = JSON.parse(newValue)\n if (!parsed) {\n return false\n }\n\n return isEqual(parsed, user)\n}\n\n\nexport function isEqual(a: any, b: any): boolean {\n if (typeof a !== typeof b) {\n return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false\n }\n\n if (Array.isArray(a)) {\n const aArray = a as any[]\n const bArray = b as any[]\n if (aArray.length !== bArray.length) {\n return false\n }\n\n for (let i = 0; i < aArray.length; i++) {\n if (!isEqual(aArray[i], bArray[i])) {\n return false\n }\n }\n\n return true\n }\n\n if (typeof a === \"object\") {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) {\n return false\n }\n\n for (const key of aKeys) {\n if (!isEqual(a[key], b[key])) {\n return false\n }\n }\n\n return true\n } else {\n return a === b\n }\n}","'use client'\n\nimport {useContext} from \"react\"\nimport {User} from \"../user\"\nimport {AuthContext} from \"./AuthProvider\"\n\nexport type UseUserLoading = {\n loading: true\n isLoggedIn: never\n user: never\n}\n\nexport type UseUserLoggedIn = {\n loading: false\n isLoggedIn: true\n user: User\n}\n\nexport type UseUserNotLoggedIn = {\n loading: false\n isLoggedIn: false\n user: undefined\n}\n\nexport type UseUser = UseUserLoading | UseUserLoggedIn | UseUserNotLoggedIn\n\nexport function useUser(): UseUser {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useUser must be used within an AuthProvider\")\n }\n\n const {loading, user} = context\n if (loading) {\n return {\n loading: true,\n isLoggedIn: undefined as never,\n user: undefined as never,\n }\n } else if (user) {\n return {\n loading: false,\n isLoggedIn: true,\n user,\n }\n } else {\n return {\n loading: false,\n isLoggedIn: false,\n user: undefined,\n }\n }\n}","import { useContext } from \"react\"\nimport { AuthContext } from \"./AuthProvider\"\n\nexport function useHostedPageUrls() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useHostedPageUrls must be used within an AuthProvider\")\n }\n const {\n getLoginPageUrl,\n getSignupPageUrl,\n getAccountPageUrl,\n getOrgPageUrl,\n getCreateOrgPageUrl,\n getSetupSAMLPageUrl,\n } = context\n return {\n getLoginPageUrl,\n getSignupPageUrl,\n getAccountPageUrl,\n getOrgPageUrl,\n getCreateOrgPageUrl,\n getSetupSAMLPageUrl,\n }\n}\n","import { useContext } from \"react\"\nimport { AuthContext } from \"./AuthProvider\"\n\nexport function useLogoutFunction() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useLogoutFunction must be used within an AuthProvider\")\n }\n const { logout } = context\n return logout\n}\n","import React, { useContext, useEffect } from \"react\"\nimport { AuthContext } from \"./AuthProvider\"\n\nexport function useRedirectFunctions() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useRedirectFunctions must be used within an AuthProvider\")\n }\n const {\n redirectToAccountPage,\n redirectToSignupPage,\n redirectToLoginPage,\n redirectToOrgPage,\n redirectToCreateOrgPage,\n } = context\n return {\n redirectToSignupPage,\n redirectToLoginPage,\n redirectToAccountPage,\n redirectToOrgPage,\n redirectToCreateOrgPage,\n }\n}\n\nexport interface RedirectProps {\n children?: React.ReactNode\n}\n\nexport function RedirectToSignup({ children }: RedirectProps) {\n const { redirectToSignupPage } = useRedirectFunctions()\n\n useEffect(() => {\n redirectToSignupPage()\n }, [])\n\n return <>{children}</>\n}\n\nexport function RedirectToLogin({ children }: RedirectProps) {\n const { redirectToLoginPage } = useRedirectFunctions()\n useEffect(() => {\n redirectToLoginPage()\n }, [])\n return <>{children}</>\n}\n","import { useContext } from \"react\"\nimport { AuthContext } from \"./AuthProvider\"\n\nexport function useRefreshAuth() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useRefreshAuth must be used within an AuthProvider\")\n }\n const { refreshAuthInfo } = context\n return refreshAuthInfo\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,mBAAwD;;;ACFjD,IAAM,OAAN,MAAW;AAAA,EAed,YACI,QACA,OACA,sBACA,WACA,UACA,UACA,cACA,oBACF;AACE,SAAK,SAAS;AACd,SAAK,uBAAuB;AAE5B,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,WAAW;AAEhB,SAAK,eAAe;AACpB,SAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEO,OAAO,OAA0C;AACpD,QAAI,CAAC,KAAK,sBAAsB;AAC5B,aAAO;AAAA,IACX;AAEA,WAAO,KAAK,qBAAqB,KAAK;AAAA,EAC1C;AAAA,EAEO,aAAa,SAA4C;AAC5D,QAAI,CAAC,KAAK,sBAAsB;AAC5B,aAAO;AAAA,IACX;AAEA,UAAM,iBAAiB,QAAQ,YAAY,EAAE,QAAQ,MAAM,GAAG;AAC9D,eAAW,SAAS,KAAK,sBAAsB;AAC3C,YAAM,gBAAgB,KAAK,qBAAqB,KAAK;AACrD,UAAI,cAAc,mBAAmB,gBAAgB;AACjD,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEO,UAA2B;AAC9B,QAAI,CAAC,KAAK,sBAAsB;AAC5B,aAAO,CAAC;AAAA,IACZ;AAEA,WAAO,OAAO,OAAO,KAAK,oBAAoB;AAAA,EAClD;AAAA,EAEO,kBAA2B;AAC9B,WAAO,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA,EAEA,OAAc,SAAS,MAAoB;AACvC,UAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,UAAM,uBAA6C,CAAC;AACpD,eAAW,SAAS,IAAI,sBAAsB;AAC1C,2BAAqB,KAAK,IAAI,cAAc;AAAA,QACxC,KAAK,UAAU,IAAI,qBAAqB,KAAK,CAAC;AAAA,MAClD;AAAA,IACJ;AACA,WAAO,IAAI;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,MACA,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACR;AAAA,EACJ;AACJ;AAMO,IAAM,gBAAN,MAAoB;AAAA,EAUvB,YACI,OACA,SACA,aACA,gBACA,kBACA,mCACA,iBACF;AACE,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,iBAAiB;AAEtB,SAAK,mBAAmB;AACxB,SAAK,oCAAoC;AACzC,SAAK,kBAAkB;AAAA,EAC3B;AAAA;AAAA,EAIO,OAAO,MAAuB;AACjC,WAAO,KAAK,qBAAqB;AAAA,EACrC;AAAA,EAEO,cAAc,MAAuB;AACxC,WAAO,KAAK,kCAAkC,SAAS,IAAI;AAAA,EAC/D;AAAA,EAEO,cAAc,YAA6B;AAC9C,WAAO,KAAK,gBAAgB,SAAS,UAAU;AAAA,EACnD;AAAA,EAEO,kBAAkB,aAAgC;AACrD,WAAO,YAAY,MAAM,CAAC,eAAe,KAAK,cAAc,UAAU,CAAC;AAAA,EAC3E;AAAA,EAEA,OAAc,SAAS,MAA6B;AAChD,UAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,WAAO,IAAI;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACR;AAAA,EACJ;AAAA;AAAA,EAIA,IAAI,eAAuB;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,gCAA0C;AAC1C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,cAAwB;AACxB,WAAO,KAAK;AAAA,EAChB;AACJ;;;ACzKO,IAAM,gBAAgB;AAEtB,SAAS,YAAqB;AACjC,SAAO,OAAO,WAAW;AAC7B;AAEO,SAAS,uBAAuB,MAAwB;AAC3D,MAAI,MAAM;AACN,iBAAa,QAAQ,eAAe,KAAK,UAAU,IAAI,CAAC;AAAA,EAC5D,OAAO;AACH,iBAAa,QAAQ,eAAe,IAAI;AAAA,EAC5C;AACJ;AAEO,SAAS,sBAAsB,UAAyB,MAAiC;AAC5F,MAAI,CAAC,UAAU;AACX,WAAO;AAAA,EACX,WAAW,CAAC,MAAM;AACd,WAAO,aAAa;AAAA,EACxB;AAEA,QAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,MAAI,CAAC,QAAQ;AACT,WAAO;AAAA,EACX;AAEA,SAAO,QAAQ,QAAQ,IAAI;AAC/B;AAGO,SAAS,QAAQ,GAAQ,GAAiB;AAC7C,MAAI,OAAO,MAAM,OAAO,GAAG;AACvB,WAAO;AAAA,EACX;AAEA,MAAI,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,GAAG;AACvC,WAAO;AAAA,EACX;AAEA,MAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,UAAM,SAAS;AACf,UAAM,SAAS;AACf,QAAI,OAAO,WAAW,OAAO,QAAQ;AACjC,aAAO;AAAA,IACX;AAEA,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,UAAI,CAAC,QAAQ,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG;AAChC,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,MAAI,OAAO,MAAM,UAAU;AACvB,UAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,UAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,QAAI,MAAM,WAAW,MAAM,QAAQ;AAC/B,aAAO;AAAA,IACX;AAEA,eAAW,OAAO,OAAO;AACrB,UAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG;AAC1B,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,WAAO;AAAA,EACX,OAAO;AACH,WAAO,MAAM;AAAA,EACjB;AACJ;;;AFrEA,wBAAwB;AAmCjB,IAAM,cAAc,aAAAA,QAAM,cAA6C,MAAS;AAWvF,IAAM,mBAAmB;AAAA,EACrB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,oBAAoB;AACxB;AAMA,SAAS,iBAAiB,QAAmB,QAAoC;AAC7E,QAAM,qBAAqB,CAAC,OAAO,WAAW,CAAC,QAAQ,OAAO,MAAM,OAAO,IAAI;AAE/E,MAAI,CAAC,OAAO,MAAM;AACd,WAAO;AAAA,MACH,SAAS;AAAA,MACT,MAAM;AAAA,MACN;AAAA,IACJ;AAAA,EACJ,WAAW,OAAO,SAAS;AACvB,WAAO;AAAA,MACH,SAAS;AAAA,MACT,MAAM,OAAO;AAAA,MACb;AAAA,IACJ;AAAA,EACJ,OAAO;AACH,WAAO;AAAA,MACH,SAAS;AAAA,MACT,MAAM,OAAO;AAAA,MACb;AAAA,IACJ;AAAA,EACJ;AACJ;AAEO,IAAM,eAAe,CAAC,UAA6B;AACtD,QAAM,CAAC,WAAW,aAAa,QAAI,yBAAW,kBAAkB,gBAAgB;AAChF,QAAM,aAAS,6BAAU;AAEzB,QAAM,eAAW,0BAAY,CAAC,WAA4B;AACtD,kBAAc,MAAM;AACpB,2BAAuB,OAAO,IAAI;AAAA,EACtC,GAAG,CAAC,aAAa,CAAC;AAIlB,8BAAU,MAAM;AACZ,QAAI,UAAU,oBAAoB;AAC9B,aAAO,QAAQ;AAAA,IACnB;AAAA,EACJ,GAAG,CAAC,UAAU,oBAAoB,MAAM,CAAC;AAGzC,8BAAU,MAAM;AACZ,QAAI,YAAY;AAEhB,aAAeC,mBAAkB;AAAA;AAC7B,cAAM,EAAC,KAAI,IAAI,MAAM,eAAe;AACpC,YAAI,CAAC,WAAW;AACZ,mBAAS,EAAC,KAAI,CAAC;AAAA,QACnB;AAAA,MACJ;AAAA;AAEA,IAAAA,iBAAgB;AAChB,WAAO,MAAM;AACT,kBAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,CAAC;AAIL,8BAAU,MAAM;AACZ,QAAI,YAAY;AAEhB,aAAe,eAAe;AAAA;AAC1B,cAAM,EAAC,KAAI,IAAI,MAAM,eAAe;AACpC,YAAI,CAAC,WAAW;AACZ,mBAAS,EAAC,KAAI,CAAC;AAAA,QACnB;AAAA,MACJ;AAAA;AAEA,aAAe,eAAe,OAAqB;AAAA;AAC/C,YAAI,MAAM,QAAQ,iBAAiB,CAAC,sBAAsB,MAAM,UAAU,UAAU,IAAI,GAAG;AACvF,gBAAM,aAAa;AAAA,QACvB;AAAA,MACJ;AAAA;AAGA,UAAM,WAAW,YAAY,cAAc,IAAI,KAAK,GAAI;AAExD,QAAI,UAAU,GAAG;AACb,aAAO,iBAAiB,WAAW,cAAc;AACjD,aAAO,iBAAiB,UAAU,YAAY;AAC9C,aAAO,iBAAiB,SAAS,YAAY;AAAA,IACjD;AAEA,WAAO,MAAM;AACT,kBAAY;AACZ,oBAAc,QAAQ;AACtB,UAAI,UAAU,GAAG;AACb,eAAO,oBAAoB,WAAW,cAAc;AACpD,eAAO,oBAAoB,UAAU,YAAY;AACjD,eAAO,oBAAoB,SAAS,YAAY;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,UAAU,UAAU,IAAI,CAAC;AAG7B,QAAM,aAAS,0BAAY,MAAY;AACnC,UAAM,MAAM,oBAAoB;AAAA,MAC5B,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,aAAa;AAAA,IACjB,CAAC;AACD,aAAS,EAAC,MAAM,OAAS,CAAC;AAAA,EAC9B,IAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,kBAAkB,MAAM;AAC9B,QAAM,mBAAmB,MAAM;AAC/B,QAAM,wBAAoB,0BAAY,MAAM;AACxC,WAAO,GAAG,MAAM;AAAA,EACpB,GAAG,CAAC,MAAM,OAAO,CAAC;AAClB,QAAM,oBAAgB;AAAA,IAClB,CAAC,UAAmB;AAChB,UAAI,OAAO;AACP,eAAO,GAAG,MAAM,kBAAkB;AAAA,MACtC,OAAO;AACH,eAAO,GAAG,MAAM;AAAA,MACpB;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,OAAO;AAAA,EAClB;AACA,QAAM,0BAAsB,0BAAY,MAAM;AAC1C,WAAO,GAAG,MAAM;AAAA,EACpB,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,QAAM,0BAAsB;AAAA,IACxB,CAAC,UAAkB;AACf,aAAO,GAAG,MAAM,mBAAmB;AAAA,IACvC;AAAA,IACA,CAAC,MAAM,OAAO;AAAA,EAClB;AAEA,QAAM,aAAa,CAAC,QAAgB;AAChC,WAAO,SAAS,OAAO;AAAA,EAC3B;AAEA,QAAM,sBAAsB,MAAM,WAAW,gBAAgB,CAAC;AAC9D,QAAM,uBAAuB,MAAM,WAAW,iBAAiB,CAAC;AAChE,QAAM,wBAAwB,MAAM,WAAW,kBAAkB,CAAC;AAClE,QAAM,oBAAoB,CAAC,UAAmB,WAAW,cAAc,KAAK,CAAC;AAC7E,QAAM,0BAA0B,MAAM,WAAW,oBAAoB,CAAC;AACtE,QAAM,0BAA0B,CAAC,UAAkB,WAAW,oBAAoB,KAAK,CAAC;AAExF,QAAM,kBAAkB,MAAY;AAChC,UAAM,EAAC,KAAI,IAAI,MAAM,eAAe;AACpC,aAAS,EAAC,KAAI,CAAC;AACf,WAAO;AAAA,EACX;AAEA,QAAM,QAAQ;AAAA,IACV,SAAS,UAAU;AAAA,IACnB,MAAM,UAAU;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,SAAO,6BAAAD,QAAA,cAAC,YAAY,UAAZ,EAAqB,SAAe,MAAM,QAAS;AAC/D;AAIA,SAAe,iBAA4C;AAAA;AACvD,QAAI;AACA,YAAM,mBAAmB,MAAM,MAAM,sBAAsB;AAAA,QACvD,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,QACpB;AAAA,QACA,aAAa;AAAA,MACjB,CAAC;AAED,UAAI,iBAAiB,IAAI;AACrB,cAAM,WAAW,MAAM,iBAAiB,KAAK;AAC7C,cAAM,OAAO,KAAK,SAAS,QAAQ;AACnC,eAAO,EAAC,KAAI;AAAA,MAChB,WAAW,iBAAiB,WAAW,KAAK;AACxC,eAAO,EAAC,MAAM,OAAS;AAAA,MAC3B,OAAO;AACH,gBAAQ,IAAI,2BAA2B,gBAAgB;AAAA,MAC3D;AAAA,IACJ,SAAS,GAAP;AACE,cAAQ,IAAI,2BAA2B,CAAC;AAAA,IAC5C;AACA,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA;;;AGhQA,IAAAE,gBAAyB;AAwBlB,SAAS,UAAmB;AAC/B,QAAM,cAAU,0BAAW,WAAW;AACtC,MAAI,YAAY,QAAW;AACvB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AAEA,QAAM,EAAC,SAAS,KAAI,IAAI;AACxB,MAAI,SAAS;AACT,WAAO;AAAA,MACH,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,MAAM;AAAA,IACV;AAAA,EACJ,WAAW,MAAM;AACb,WAAO;AAAA,MACH,SAAS;AAAA,MACT,YAAY;AAAA,MACZ;AAAA,IACJ;AAAA,EACJ,OAAO;AACH,WAAO;AAAA,MACH,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,MAAM;AAAA,IACV;AAAA,EACJ;AACJ;;;ACpDA,IAAAC,gBAA2B;AAGpB,SAAS,oBAAoB;AAChC,QAAM,cAAU,0BAAW,WAAW;AACtC,MAAI,YAAY,QAAW;AACvB,UAAM,IAAI,MAAM,uDAAuD;AAAA,EAC3E;AACA,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AACJ,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;ACxBA,IAAAC,gBAA2B;AAGpB,SAAS,oBAAoB;AAChC,QAAM,cAAU,0BAAW,WAAW;AACtC,MAAI,YAAY,QAAW;AACvB,UAAM,IAAI,MAAM,uDAAuD;AAAA,EAC3E;AACA,QAAM,EAAE,OAAO,IAAI;AACnB,SAAO;AACX;;;ACVA,IAAAC,gBAA6C;AAGtC,SAAS,uBAAuB;AACnC,QAAM,cAAU,0BAAW,WAAW;AACtC,MAAI,YAAY,QAAW;AACvB,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC9E;AACA,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AACJ,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAMO,SAAS,iBAAiB,EAAE,SAAS,GAAkB;AAC1D,QAAM,EAAE,qBAAqB,IAAI,qBAAqB;AAEtD,+BAAU,MAAM;AACZ,yBAAqB;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,SAAO,8BAAAC,QAAA,4BAAAA,QAAA,gBAAG,QAAS;AACvB;AAEO,SAAS,gBAAgB,EAAE,SAAS,GAAkB;AACzD,QAAM,EAAE,oBAAoB,IAAI,qBAAqB;AACrD,+BAAU,MAAM;AACZ,wBAAoB;AAAA,EACxB,GAAG,CAAC,CAAC;AACL,SAAO,8BAAAA,QAAA,4BAAAA,QAAA,gBAAG,QAAS;AACvB;;;AC5CA,IAAAC,gBAA2B;AAGpB,SAAS,iBAAiB;AAC7B,QAAM,cAAU,0BAAW,WAAW;AACtC,MAAI,YAAY,QAAW;AACvB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACxE;AACA,QAAM,EAAE,gBAAgB,IAAI;AAC5B,SAAO;AACX;","names":["React","refreshAuthInfo","import_react","import_react","import_react","import_react","React","import_react"]}
|