@k3-universe/react-kit 0.0.29 → 0.0.30

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.
Files changed (152) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1013 -21
  4. package/dist/kit/builder/auth/components/Can.d.ts +13 -0
  5. package/dist/kit/builder/auth/components/Can.d.ts.map +1 -0
  6. package/dist/kit/builder/auth/components/RequireAuth.d.ts +45 -0
  7. package/dist/kit/builder/auth/components/RequireAuth.d.ts.map +1 -0
  8. package/dist/kit/builder/auth/components/ShowWhenAuthenticated.d.ts +8 -0
  9. package/dist/kit/builder/auth/components/ShowWhenAuthenticated.d.ts.map +1 -0
  10. package/dist/kit/builder/auth/components/ShowWhenError.d.ts +8 -0
  11. package/dist/kit/builder/auth/components/ShowWhenError.d.ts.map +1 -0
  12. package/dist/kit/builder/auth/components/ShowWhenLoading.d.ts +8 -0
  13. package/dist/kit/builder/auth/components/ShowWhenLoading.d.ts.map +1 -0
  14. package/dist/kit/builder/auth/components/ShowWhenUnauthenticated.d.ts +8 -0
  15. package/dist/kit/builder/auth/components/ShowWhenUnauthenticated.d.ts.map +1 -0
  16. package/dist/kit/builder/auth/components/withPermission.d.ts +7 -0
  17. package/dist/kit/builder/auth/components/withPermission.d.ts.map +1 -0
  18. package/dist/kit/builder/auth/hooks/action-hooks.d.ts +18 -0
  19. package/dist/kit/builder/auth/hooks/action-hooks.d.ts.map +1 -0
  20. package/dist/kit/builder/auth/hooks/core-hooks.d.ts +56 -0
  21. package/dist/kit/builder/auth/hooks/core-hooks.d.ts.map +1 -0
  22. package/dist/kit/builder/auth/hooks/index.d.ts +5 -0
  23. package/dist/kit/builder/auth/hooks/index.d.ts.map +1 -0
  24. package/dist/kit/builder/auth/hooks/permission-hooks.d.ts +18 -0
  25. package/dist/kit/builder/auth/hooks/permission-hooks.d.ts.map +1 -0
  26. package/dist/kit/builder/auth/hooks/token-hooks.d.ts +13 -0
  27. package/dist/kit/builder/auth/hooks/token-hooks.d.ts.map +1 -0
  28. package/dist/kit/builder/auth/index.d.ts +14 -8
  29. package/dist/kit/builder/auth/index.d.ts.map +1 -1
  30. package/dist/kit/builder/auth/{AuthProvider.d.ts → providers/AuthProvider.d.ts} +1 -1
  31. package/dist/kit/builder/auth/providers/AuthProvider.d.ts.map +1 -0
  32. package/dist/kit/builder/auth/types/adapter-config.d.ts +31 -0
  33. package/dist/kit/builder/auth/types/adapter-config.d.ts.map +1 -0
  34. package/dist/kit/builder/auth/types/adapter.d.ts +80 -0
  35. package/dist/kit/builder/auth/types/adapter.d.ts.map +1 -0
  36. package/dist/kit/builder/auth/types/core.d.ts +16 -0
  37. package/dist/kit/builder/auth/types/core.d.ts.map +1 -0
  38. package/dist/kit/builder/auth/types/index.d.ts +10 -0
  39. package/dist/kit/builder/auth/types/index.d.ts.map +1 -0
  40. package/dist/kit/builder/auth/types/middleware.d.ts +11 -0
  41. package/dist/kit/builder/auth/types/middleware.d.ts.map +1 -0
  42. package/dist/kit/builder/auth/types/permissions.d.ts +17 -0
  43. package/dist/kit/builder/auth/types/permissions.d.ts.map +1 -0
  44. package/dist/kit/builder/auth/types/state.d.ts +13 -0
  45. package/dist/kit/builder/auth/types/state.d.ts.map +1 -0
  46. package/dist/kit/builder/auth/types/storage.d.ts +20 -0
  47. package/dist/kit/builder/auth/types/storage.d.ts.map +1 -0
  48. package/dist/kit/builder/auth/types/token-manager.d.ts +7 -0
  49. package/dist/kit/builder/auth/types/token-manager.d.ts.map +1 -0
  50. package/dist/kit/builder/auth/types/utils.d.ts +7 -0
  51. package/dist/kit/builder/auth/types/utils.d.ts.map +1 -0
  52. package/dist/kit/builder/auth/{adapter.d.ts → utils/auth-adapter.d.ts} +2 -2
  53. package/dist/kit/builder/auth/utils/auth-adapter.d.ts.map +1 -0
  54. package/dist/kit/builder/auth/utils/client-adapters/apollo-link.d.ts +4 -0
  55. package/dist/kit/builder/auth/utils/client-adapters/apollo-link.d.ts.map +1 -0
  56. package/dist/kit/builder/auth/utils/client-adapters/axios.d.ts +6 -0
  57. package/dist/kit/builder/auth/utils/client-adapters/axios.d.ts.map +1 -0
  58. package/dist/kit/builder/auth/utils/client-adapters/fetch.d.ts +6 -0
  59. package/dist/kit/builder/auth/utils/client-adapters/fetch.d.ts.map +1 -0
  60. package/dist/kit/builder/auth/utils/client-adapters/graphql.d.ts +9 -0
  61. package/dist/kit/builder/auth/utils/client-adapters/graphql.d.ts.map +1 -0
  62. package/dist/kit/builder/auth/utils/client-adapters/index.d.ts +7 -0
  63. package/dist/kit/builder/auth/utils/client-adapters/index.d.ts.map +1 -0
  64. package/dist/kit/builder/auth/utils/client-adapters/rest.d.ts +9 -0
  65. package/dist/kit/builder/auth/utils/client-adapters/rest.d.ts.map +1 -0
  66. package/dist/kit/builder/auth/utils/client-adapters/urql-exchange.d.ts +14 -0
  67. package/dist/kit/builder/auth/utils/client-adapters/urql-exchange.d.ts.map +1 -0
  68. package/dist/kit/builder/auth/{permission-checker.d.ts → utils/permission-checker.d.ts} +1 -1
  69. package/dist/kit/builder/auth/utils/permission-checker.d.ts.map +1 -0
  70. package/dist/kit/builder/auth/utils/storage/browser.d.ts +11 -0
  71. package/dist/kit/builder/auth/utils/storage/browser.d.ts.map +1 -0
  72. package/dist/kit/builder/auth/utils/storage/cookie.d.ts +3 -0
  73. package/dist/kit/builder/auth/utils/storage/cookie.d.ts.map +1 -0
  74. package/dist/kit/builder/auth/utils/storage/encryption.d.ts +7 -0
  75. package/dist/kit/builder/auth/utils/storage/encryption.d.ts.map +1 -0
  76. package/dist/kit/builder/auth/utils/storage/env.d.ts +2 -0
  77. package/dist/kit/builder/auth/utils/storage/env.d.ts.map +1 -0
  78. package/dist/kit/builder/auth/utils/storage/factory.d.ts +6 -0
  79. package/dist/kit/builder/auth/utils/storage/factory.d.ts.map +1 -0
  80. package/dist/kit/builder/auth/utils/storage/index.d.ts +7 -0
  81. package/dist/kit/builder/auth/utils/storage/index.d.ts.map +1 -0
  82. package/dist/kit/builder/auth/utils/storage/memory.d.ts +3 -0
  83. package/dist/kit/builder/auth/utils/storage/memory.d.ts.map +1 -0
  84. package/dist/kit/builder/auth/{token-manager.d.ts → utils/token-manager.d.ts} +1 -1
  85. package/dist/kit/builder/auth/utils/token-manager.d.ts.map +1 -0
  86. package/dist/kit/components/login/Login.d.ts.map +1 -1
  87. package/dist/kit/layouts/admin/components/AdminLayout.d.ts +2 -1
  88. package/dist/kit/layouts/admin/components/AdminLayout.d.ts.map +1 -1
  89. package/package.json +1 -1
  90. package/src/index.ts +1 -0
  91. package/src/kit/builder/auth/components/Can.tsx +27 -0
  92. package/src/kit/builder/auth/components/RequireAuth.tsx +78 -0
  93. package/src/kit/builder/auth/components/ShowWhenAuthenticated.tsx +10 -0
  94. package/src/kit/builder/auth/components/ShowWhenError.tsx +10 -0
  95. package/src/kit/builder/auth/components/ShowWhenLoading.tsx +10 -0
  96. package/src/kit/builder/auth/components/ShowWhenUnauthenticated.tsx +10 -0
  97. package/src/kit/builder/auth/components/withPermission.tsx +23 -0
  98. package/src/kit/builder/auth/hooks/action-hooks.ts +34 -0
  99. package/src/kit/builder/auth/hooks/core-hooks.ts +65 -0
  100. package/src/kit/builder/auth/hooks/index.ts +4 -0
  101. package/src/kit/builder/auth/hooks/permission-hooks.ts +43 -0
  102. package/src/kit/builder/auth/hooks/token-hooks.ts +25 -0
  103. package/src/kit/builder/auth/index.ts +16 -18
  104. package/src/kit/builder/auth/{AuthProvider.tsx → providers/AuthProvider.tsx} +1 -1
  105. package/src/kit/builder/auth/types/adapter-config.ts +44 -0
  106. package/src/kit/builder/auth/types/adapter.ts +132 -0
  107. package/src/kit/builder/auth/types/core.ts +27 -0
  108. package/src/kit/builder/auth/types/index.ts +9 -0
  109. package/src/kit/builder/auth/types/middleware.ts +20 -0
  110. package/src/kit/builder/auth/types/permissions.ts +23 -0
  111. package/src/kit/builder/auth/types/state.ts +16 -0
  112. package/src/kit/builder/auth/types/storage.ts +21 -0
  113. package/src/kit/builder/auth/types/token-manager.ts +9 -0
  114. package/src/kit/builder/auth/types/utils.ts +55 -0
  115. package/src/kit/builder/auth/{adapter.ts → utils/auth-adapter.ts} +3 -2
  116. package/src/kit/builder/auth/utils/client-adapters/apollo-link.ts +30 -0
  117. package/src/kit/builder/auth/utils/client-adapters/axios.ts +61 -0
  118. package/src/kit/builder/auth/utils/client-adapters/fetch.ts +48 -0
  119. package/src/kit/builder/auth/utils/client-adapters/graphql.ts +60 -0
  120. package/src/kit/builder/auth/utils/client-adapters/index.ts +6 -0
  121. package/src/kit/builder/auth/utils/client-adapters/rest.ts +60 -0
  122. package/src/kit/builder/auth/utils/client-adapters/urql-exchange.ts +76 -0
  123. package/src/kit/builder/auth/{permission-checker.ts → utils/permission-checker.ts} +1 -1
  124. package/src/kit/builder/auth/utils/storage/browser.ts +99 -0
  125. package/src/kit/builder/auth/utils/storage/cookie.ts +116 -0
  126. package/src/kit/builder/auth/utils/storage/encryption.ts +80 -0
  127. package/src/kit/builder/auth/utils/storage/env.ts +2 -0
  128. package/src/kit/builder/auth/utils/storage/factory.ts +37 -0
  129. package/src/kit/builder/auth/utils/storage/index.ts +6 -0
  130. package/src/kit/builder/auth/utils/storage/memory.ts +15 -0
  131. package/src/kit/builder/auth/{token-manager.ts → utils/token-manager.ts} +1 -1
  132. package/src/kit/components/login/Login.tsx +9 -7
  133. package/src/kit/layouts/admin/components/AdminLayout.tsx +24 -17
  134. package/dist/kit/builder/auth/AuthProvider.d.ts.map +0 -1
  135. package/dist/kit/builder/auth/adapter.d.ts.map +0 -1
  136. package/dist/kit/builder/auth/client-adapters.d.ts +0 -149
  137. package/dist/kit/builder/auth/client-adapters.d.ts.map +0 -1
  138. package/dist/kit/builder/auth/components.d.ts +0 -119
  139. package/dist/kit/builder/auth/components.d.ts.map +0 -1
  140. package/dist/kit/builder/auth/hooks.d.ts +0 -158
  141. package/dist/kit/builder/auth/hooks.d.ts.map +0 -1
  142. package/dist/kit/builder/auth/permission-checker.d.ts.map +0 -1
  143. package/dist/kit/builder/auth/storage.d.ts +0 -17
  144. package/dist/kit/builder/auth/storage.d.ts.map +0 -1
  145. package/dist/kit/builder/auth/token-manager.d.ts.map +0 -1
  146. package/dist/kit/builder/auth/types.d.ts +0 -183
  147. package/dist/kit/builder/auth/types.d.ts.map +0 -1
  148. package/src/kit/builder/auth/client-adapters.ts +0 -398
  149. package/src/kit/builder/auth/components.tsx +0 -221
  150. package/src/kit/builder/auth/hooks.ts +0 -237
  151. package/src/kit/builder/auth/storage.ts +0 -366
  152. package/src/kit/builder/auth/types.ts +0 -393
package/dist/index.js CHANGED
@@ -1,9 +1,952 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1
4
  import { jsx, Fragment, jsxs } from "react/jsx-runtime";
2
5
  import * as React from "react";
3
- import React__default, { forwardRef, createElement, Fragment as Fragment$1, memo as memo$1, useRef, useCallback, useEffect, useMemo, useLayoutEffect, useReducer, cloneElement, Component, useState, createContext, useContext, useImperativeHandle, use, isValidElement, PureComponent } from "react";
6
+ import React__default, { createContext, useSyncExternalStore, useEffect, useMemo, useContext, forwardRef, createElement, Fragment as Fragment$1, memo as memo$1, useRef, useCallback, useLayoutEffect, useReducer, cloneElement, Component, useState, useImperativeHandle, use, isValidElement, PureComponent } from "react";
4
7
  import * as ReactDOM from "react-dom";
5
8
  import ReactDOM__default from "react-dom";
6
9
  import { useLocation, Link as Link$1 } from "@tanstack/react-router";
10
+ const isBrowser = typeof window !== "undefined" && typeof window.localStorage !== "undefined";
11
+ class SimpleEncryption {
12
+ constructor(key) {
13
+ __publicField(this, "key");
14
+ this.key = key;
15
+ }
16
+ async encrypt(text2) {
17
+ if (!(crypto == null ? void 0 : crypto.subtle)) {
18
+ console.warn("[auth2][storage] Crypto API not available, storing unencrypted");
19
+ return text2;
20
+ }
21
+ try {
22
+ const encoder = new TextEncoder();
23
+ const data = encoder.encode(text2);
24
+ const keyData = encoder.encode(this.key.padEnd(32, "0").slice(0, 32));
25
+ const cryptoKey = await crypto.subtle.importKey(
26
+ "raw",
27
+ keyData,
28
+ { name: "AES-GCM", length: 256 },
29
+ false,
30
+ ["encrypt"]
31
+ );
32
+ const iv = crypto.getRandomValues(new Uint8Array(12));
33
+ const encrypted = await crypto.subtle.encrypt(
34
+ { name: "AES-GCM", iv },
35
+ cryptoKey,
36
+ data
37
+ );
38
+ const result = new Uint8Array(iv.length + encrypted.byteLength);
39
+ result.set(iv, 0);
40
+ result.set(new Uint8Array(encrypted), iv.length);
41
+ return btoa(String.fromCharCode(...result));
42
+ } catch (error) {
43
+ console.error("[auth2][storage] Encryption failed:", error);
44
+ return text2;
45
+ }
46
+ }
47
+ async decrypt(encrypted) {
48
+ if (!(crypto == null ? void 0 : crypto.subtle)) {
49
+ console.warn("[auth2][storage] Crypto API not available, reading unencrypted");
50
+ return encrypted;
51
+ }
52
+ try {
53
+ const encoder = new TextEncoder();
54
+ const decoder = new TextDecoder();
55
+ const keyData = encoder.encode(this.key.padEnd(32, "0").slice(0, 32));
56
+ const cryptoKey = await crypto.subtle.importKey(
57
+ "raw",
58
+ keyData,
59
+ { name: "AES-GCM", length: 256 },
60
+ false,
61
+ ["decrypt"]
62
+ );
63
+ const data = Uint8Array.from(atob(encrypted), (c2) => c2.charCodeAt(0));
64
+ const iv = data.slice(0, 12);
65
+ const encryptedData = data.slice(12);
66
+ const decrypted = await crypto.subtle.decrypt(
67
+ { name: "AES-GCM", iv },
68
+ cryptoKey,
69
+ encryptedData
70
+ );
71
+ return decoder.decode(decrypted);
72
+ } catch (error) {
73
+ console.error("[auth2][storage] Decryption failed:", error);
74
+ return encrypted;
75
+ }
76
+ }
77
+ }
78
+ const createMemoryStorage = () => {
79
+ let value = null;
80
+ return {
81
+ get: () => value,
82
+ set: (next) => {
83
+ value = next;
84
+ },
85
+ clear: () => {
86
+ value = null;
87
+ }
88
+ };
89
+ };
90
+ const createCookieStorage = (options) => {
91
+ var _a;
92
+ const key = options.key ?? "auth2_session";
93
+ const cookieOpts = options.cookieOptions ?? {};
94
+ const fallback = createMemoryStorage();
95
+ const encryption = options.encrypt && options.encryptionKey ? new SimpleEncryption(options.encryptionKey) : null;
96
+ const cookieSetter = typeof Document !== "undefined" ? (_a = Object.getOwnPropertyDescriptor(Document.prototype, "cookie")) == null ? void 0 : _a.set : void 0;
97
+ const assignCookie = (value) => {
98
+ if (!isBrowser || typeof document === "undefined") return;
99
+ if (cookieSetter) {
100
+ cookieSetter.call(document, value);
101
+ return;
102
+ }
103
+ Reflect.set(document, "cookie", value);
104
+ };
105
+ const serialize = async (value) => {
106
+ if (value === null) return null;
107
+ const json = JSON.stringify(value);
108
+ return encryption ? await encryption.encrypt(json) : json;
109
+ };
110
+ const deserialize = async (value) => {
111
+ if (!value) return null;
112
+ try {
113
+ const decrypted = encryption ? await encryption.decrypt(value) : value;
114
+ return JSON.parse(decrypted);
115
+ } catch {
116
+ return null;
117
+ }
118
+ };
119
+ const getCookie = (name) => {
120
+ if (!isBrowser) return null;
121
+ const matches = document.cookie.match(
122
+ new RegExp(
123
+ `(?:^|; )${name.replace(/([.$?*|{}()\[\]\\/+^])/g, "\\$1")}=([^;]*)`
124
+ )
125
+ );
126
+ return matches ? decodeURIComponent(matches[1]) : null;
127
+ };
128
+ const setCookie = (name, value, opts = {}) => {
129
+ if (!isBrowser) return;
130
+ let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
131
+ if (opts.maxAge) cookie += `; max-age=${opts.maxAge}`;
132
+ if (opts.domain) cookie += `; domain=${opts.domain}`;
133
+ if (opts.path !== void 0) cookie += `; path=${opts.path}`;
134
+ else cookie += "; path=/";
135
+ if (opts.secure) cookie += "; secure";
136
+ if (opts.sameSite) cookie += `; samesite=${opts.sameSite}`;
137
+ assignCookie(cookie);
138
+ };
139
+ const deleteCookie = (name) => {
140
+ if (!isBrowser) return;
141
+ assignCookie(`${name}=; max-age=0; path=/`);
142
+ };
143
+ return {
144
+ get: async () => {
145
+ try {
146
+ const raw = getCookie(key);
147
+ const value = await deserialize(raw);
148
+ fallback.set(value);
149
+ return value;
150
+ } catch (error) {
151
+ console.warn("[auth2][storage] Failed to read from cookie", error);
152
+ return fallback.get();
153
+ }
154
+ },
155
+ set: async (value) => {
156
+ try {
157
+ const serialized = await serialize(value);
158
+ if (serialized === null) {
159
+ deleteCookie(key);
160
+ } else {
161
+ setCookie(key, serialized, cookieOpts);
162
+ }
163
+ fallback.set(value);
164
+ } catch (error) {
165
+ console.warn("[auth2][storage] Failed to write to cookie", error);
166
+ fallback.set(value);
167
+ }
168
+ },
169
+ clear: () => {
170
+ try {
171
+ deleteCookie(key);
172
+ } catch (error) {
173
+ console.warn("[auth2][storage] Failed to clear cookie", error);
174
+ } finally {
175
+ fallback.clear();
176
+ }
177
+ }
178
+ };
179
+ };
180
+ const createBrowserStorage = (options) => {
181
+ const fallback = createMemoryStorage();
182
+ const targetStorage = options.storage ?? (isBrowser ? window.localStorage : void 0);
183
+ const encryption = options.encrypt && options.encryptionKey ? new SimpleEncryption(options.encryptionKey) : null;
184
+ const defaultSerialize = async (value) => {
185
+ if (value === null) return null;
186
+ const json = JSON.stringify(value);
187
+ return encryption ? await encryption.encrypt(json) : json;
188
+ };
189
+ const defaultDeserialize = async (value) => {
190
+ if (!value) return null;
191
+ try {
192
+ const decrypted = encryption ? await encryption.decrypt(value) : value;
193
+ return JSON.parse(decrypted);
194
+ } catch {
195
+ return null;
196
+ }
197
+ };
198
+ const serialize = options.serialize ? async (value) => {
199
+ var _a;
200
+ const result = await ((_a = options.serialize) == null ? void 0 : _a.call(options, value));
201
+ return result ?? null;
202
+ } : defaultSerialize;
203
+ const deserialize = options.deserialize ? async (value) => {
204
+ var _a;
205
+ const result = await ((_a = options.deserialize) == null ? void 0 : _a.call(options, value));
206
+ return result ?? null;
207
+ } : defaultDeserialize;
208
+ if (!targetStorage) {
209
+ return fallback;
210
+ }
211
+ return {
212
+ get: async () => {
213
+ try {
214
+ const raw = targetStorage.getItem(options.key);
215
+ const value = await deserialize(raw);
216
+ fallback.set(value);
217
+ return value;
218
+ } catch (error) {
219
+ console.warn("[auth2][storage] Failed to read from storage", error);
220
+ return fallback.get();
221
+ }
222
+ },
223
+ set: async (value) => {
224
+ try {
225
+ const serialized = await serialize(value);
226
+ if (serialized === null) {
227
+ targetStorage.removeItem(options.key);
228
+ } else {
229
+ targetStorage.setItem(options.key, serialized);
230
+ }
231
+ fallback.set(value);
232
+ } catch (error) {
233
+ console.warn("[auth2][storage] Failed to write to storage", error);
234
+ fallback.set(value);
235
+ }
236
+ },
237
+ clear: () => {
238
+ try {
239
+ targetStorage.removeItem(options.key);
240
+ } catch (error) {
241
+ console.warn("[auth2][storage] Failed to clear storage", error);
242
+ } finally {
243
+ fallback.clear();
244
+ }
245
+ }
246
+ };
247
+ };
248
+ function createStorage(options = {}) {
249
+ const storageType = options.storage ?? "local";
250
+ const key = options.key ?? "auth2_session";
251
+ switch (storageType) {
252
+ case "cookie":
253
+ return createCookieStorage(options);
254
+ case "session":
255
+ return createBrowserStorage({
256
+ key,
257
+ storage: isBrowser ? window.sessionStorage : void 0,
258
+ encrypt: options.encrypt,
259
+ encryptionKey: options.encryptionKey
260
+ });
261
+ case "local":
262
+ return createBrowserStorage({
263
+ key,
264
+ storage: isBrowser ? window.localStorage : void 0,
265
+ encrypt: options.encrypt,
266
+ encryptionKey: options.encryptionKey
267
+ });
268
+ default:
269
+ return createMemoryStorage();
270
+ }
271
+ }
272
+ function createTokenManager(config2) {
273
+ const refreshThreshold = (config2 == null ? void 0 : config2.refreshThreshold) ?? 300;
274
+ const isExpired = (expiresAt) => {
275
+ if (!expiresAt) return false;
276
+ return Date.now() >= expiresAt;
277
+ };
278
+ const shouldRefresh = (expiresAt, threshold) => {
279
+ if (!expiresAt) return false;
280
+ const thresholdMs = (threshold ?? refreshThreshold) * 1e3;
281
+ return Date.now() >= expiresAt - thresholdMs;
282
+ };
283
+ const getTimeUntilExpiry = (expiresAt) => {
284
+ if (!expiresAt) return Infinity;
285
+ const timeLeft = expiresAt - Date.now();
286
+ return Math.max(0, timeLeft);
287
+ };
288
+ const scheduleRefresh = (callback, expiresAt) => {
289
+ if (!expiresAt) return () => {
290
+ };
291
+ const timeUntilRefresh = expiresAt - Date.now() - refreshThreshold * 1e3;
292
+ if (timeUntilRefresh <= 0) {
293
+ callback();
294
+ return () => {
295
+ };
296
+ }
297
+ const timeoutId = setTimeout(callback, timeUntilRefresh);
298
+ return () => clearTimeout(timeoutId);
299
+ };
300
+ return {
301
+ isExpired,
302
+ shouldRefresh,
303
+ getTimeUntilExpiry,
304
+ scheduleRefresh
305
+ };
306
+ }
307
+ function expandPermissions(permissions, hierarchy) {
308
+ if (!hierarchy) return permissions;
309
+ const expanded = new Set(permissions);
310
+ const queue = [...permissions];
311
+ while (queue.length > 0) {
312
+ const current = queue.shift();
313
+ if (!current) continue;
314
+ const children = hierarchy[current];
315
+ if (children) {
316
+ for (const child of children) {
317
+ if (!expanded.has(child)) {
318
+ expanded.add(child);
319
+ queue.push(child);
320
+ }
321
+ }
322
+ }
323
+ }
324
+ return Array.from(expanded);
325
+ }
326
+ function expandRoles(roles, hierarchy) {
327
+ if (!hierarchy) return roles;
328
+ const expanded = new Set(roles);
329
+ const queue = [...roles];
330
+ while (queue.length > 0) {
331
+ const current = queue.shift();
332
+ if (!current) continue;
333
+ const children = hierarchy[current];
334
+ if (children) {
335
+ for (const child of children) {
336
+ if (!expanded.has(child)) {
337
+ expanded.add(child);
338
+ queue.push(child);
339
+ }
340
+ }
341
+ }
342
+ }
343
+ return Array.from(expanded);
344
+ }
345
+ function checkPermissions(userPermissions, target, options) {
346
+ if (typeof target === "object" && "permissions" in target) {
347
+ const policy = target;
348
+ const operator = policy.operator ?? "AND";
349
+ if (operator === "AND") {
350
+ return policy.permissions.every((p2) => userPermissions.includes(p2));
351
+ } else {
352
+ return policy.permissions.some((p2) => userPermissions.includes(p2));
353
+ }
354
+ }
355
+ const targets = Array.isArray(target) ? target : [target];
356
+ const requireAll = (options == null ? void 0 : options.requireAll) ?? true;
357
+ if (targets.length === 0) return true;
358
+ return requireAll ? targets.every((p2) => userPermissions.includes(p2)) : targets.some((p2) => userPermissions.includes(p2));
359
+ }
360
+ function checkRoles(userRoles, target, options) {
361
+ const targets = Array.isArray(target) ? target : [target];
362
+ const requireAll = (options == null ? void 0 : options.requireAll) ?? true;
363
+ if (targets.length === 0) return true;
364
+ return requireAll ? targets.every((r2) => userRoles.includes(r2)) : targets.some((r2) => userRoles.includes(r2));
365
+ }
366
+ function evaluatePermissionRule(userRoles, userPermissions, rule) {
367
+ if (!rule.roles && !rule.permissions) {
368
+ return true;
369
+ }
370
+ const requireAll = rule.requireAll ?? true;
371
+ const roleAllowed = rule.roles ? checkRoles(userRoles, rule.roles, { requireAll }) : true;
372
+ const permissionAllowed = rule.permissions ? checkPermissions(userPermissions, rule.permissions, { requireAll }) : true;
373
+ return requireAll ? roleAllowed && permissionAllowed : roleAllowed || permissionAllowed;
374
+ }
375
+ const unique$1 = (values) => {
376
+ return Array.from(new Set(values));
377
+ };
378
+ function createAuthAdapter(config2) {
379
+ const storage = config2.storage ?? createMemoryStorage();
380
+ const tokenManager = config2.tokenManager ?? createTokenManager({
381
+ refreshThreshold: config2.refreshThreshold ?? 300
382
+ });
383
+ const subscribers = /* @__PURE__ */ new Set();
384
+ const resolveUser = config2.resolveUser ?? ((session) => (session == null ? void 0 : session.user) ?? null);
385
+ const resolveRoles = config2.resolveRoles ?? ((session) => {
386
+ var _a;
387
+ return ((_a = session == null ? void 0 : session.roles) == null ? void 0 : _a.filter((role) => role != null)) ?? [];
388
+ });
389
+ const resolvePermissions = config2.resolvePermissions ?? ((session) => {
390
+ var _a;
391
+ return ((_a = session == null ? void 0 : session.permissions) == null ? void 0 : _a.filter(
392
+ (permission) => permission != null
393
+ )) ?? [];
394
+ });
395
+ let state = {
396
+ status: "idle",
397
+ session: null,
398
+ user: null,
399
+ roles: [],
400
+ permissions: []
401
+ };
402
+ let autoRefreshCleanup = null;
403
+ const executeMiddleware = async (hook, ...args) => {
404
+ if (!config2.middleware) return;
405
+ for (const middleware of config2.middleware) {
406
+ const fn = middleware[hook];
407
+ if (fn) {
408
+ try {
409
+ await fn(...args);
410
+ } catch (error) {
411
+ console.error(`[auth2] Middleware error in ${String(hook)}:`, error);
412
+ if (middleware.onError) {
413
+ await middleware.onError(error);
414
+ }
415
+ }
416
+ }
417
+ }
418
+ };
419
+ const notify = () => {
420
+ var _a;
421
+ for (const listener of subscribers) listener(state);
422
+ (_a = config2.onStateChange) == null ? void 0 : _a.call(config2, state);
423
+ };
424
+ const setState = (next) => {
425
+ state = next;
426
+ notify();
427
+ };
428
+ const computeState = (session, status, error) => {
429
+ const user = resolveUser(session);
430
+ const baseRoles = resolveRoles(session);
431
+ const basePermissions = resolvePermissions(session);
432
+ const roles = unique$1(expandRoles(baseRoles, config2.roleHierarchy));
433
+ const permissions = unique$1(
434
+ expandPermissions(basePermissions, config2.permissionHierarchy)
435
+ );
436
+ const tokenExpiresIn = (session == null ? void 0 : session.expiresAt) ? tokenManager.getTimeUntilExpiry(session.expiresAt) : void 0;
437
+ return {
438
+ status,
439
+ session,
440
+ user,
441
+ roles,
442
+ permissions,
443
+ error,
444
+ lastRefresh: Date.now(),
445
+ tokenExpiresIn
446
+ };
447
+ };
448
+ const readStorage = async () => {
449
+ const stored = await Promise.resolve(storage.get());
450
+ return stored ?? null;
451
+ };
452
+ const writeStorage = async (next) => {
453
+ if (next === null) {
454
+ await Promise.resolve(storage.clear());
455
+ } else {
456
+ await Promise.resolve(storage.set(next));
457
+ }
458
+ };
459
+ const setupAutoRefresh = () => {
460
+ var _a;
461
+ if (autoRefreshCleanup) {
462
+ autoRefreshCleanup();
463
+ autoRefreshCleanup = null;
464
+ }
465
+ if (!config2.autoRefresh || !config2.refresh || !((_a = state.session) == null ? void 0 : _a.expiresAt)) {
466
+ return;
467
+ }
468
+ if (tokenManager.scheduleRefresh) {
469
+ autoRefreshCleanup = tokenManager.scheduleRefresh(() => {
470
+ refresh().catch((error) => {
471
+ console.error("[auth2] Auto-refresh failed:", error);
472
+ });
473
+ }, state.session.expiresAt);
474
+ }
475
+ };
476
+ const setSession = async (session, statusOverride, error) => {
477
+ await writeStorage(session);
478
+ const status = statusOverride ?? (session ? "authenticated" : "unauthenticated");
479
+ const nextState = computeState(session, status, error);
480
+ setState(nextState);
481
+ setupAutoRefresh();
482
+ return nextState;
483
+ };
484
+ const sync = async () => {
485
+ var _a;
486
+ setState({ ...state, status: "loading" });
487
+ try {
488
+ const session = await ((_a = config2.loadSession) == null ? void 0 : _a.call(config2)) ?? await readStorage() ?? null;
489
+ if ((session == null ? void 0 : session.expiresAt) && tokenManager.isExpired(session.expiresAt)) {
490
+ if (config2.refresh && session.refreshToken) {
491
+ try {
492
+ const refreshed = await config2.refresh(session);
493
+ return await setSession(refreshed, "authenticated");
494
+ } catch {
495
+ await executeMiddleware("onSessionExpired");
496
+ return await setSession(null, "unauthenticated");
497
+ }
498
+ }
499
+ await executeMiddleware("onSessionExpired");
500
+ return await setSession(null, "unauthenticated");
501
+ }
502
+ return await setSession(
503
+ session,
504
+ session ? "authenticated" : "unauthenticated"
505
+ );
506
+ } catch (error) {
507
+ await executeMiddleware("onError", error);
508
+ return await setSession(null, "error", error);
509
+ }
510
+ };
511
+ const withRetry = async (fn, context) => {
512
+ var _a, _b, _c;
513
+ const maxRetries = ((_a = config2.retryConfig) == null ? void 0 : _a.maxRetries) ?? 0;
514
+ const retryDelay = ((_b = config2.retryConfig) == null ? void 0 : _b.retryDelay) ?? 1e3;
515
+ const shouldRetry = (_c = config2.retryConfig) == null ? void 0 : _c.retryOn;
516
+ let lastError;
517
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
518
+ try {
519
+ return await fn();
520
+ } catch (error) {
521
+ lastError = error;
522
+ const isLastAttempt = attempt === maxRetries;
523
+ const shouldRetryError = shouldRetry ? shouldRetry(error) : false;
524
+ if (isLastAttempt || !shouldRetryError) {
525
+ throw error;
526
+ }
527
+ console.warn(
528
+ `[auth2] ${context} failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying...`
529
+ );
530
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
531
+ }
532
+ }
533
+ throw lastError;
534
+ };
535
+ const refresh = async () => {
536
+ const refreshFn = config2.refresh;
537
+ const currentSession = state.session;
538
+ if (!refreshFn) return state;
539
+ if (!currentSession) return state;
540
+ try {
541
+ const refreshed = await withRetry(
542
+ () => refreshFn(currentSession),
543
+ "refresh"
544
+ );
545
+ const nextState = await setSession(refreshed, "authenticated");
546
+ await executeMiddleware("onRefresh", nextState);
547
+ return nextState;
548
+ } catch (error) {
549
+ await executeMiddleware("onError", error);
550
+ return await setSession(state.session, "error", error);
551
+ }
552
+ };
553
+ const login = async (credentials) => {
554
+ const loginFn = config2.login;
555
+ if (!loginFn) throw new Error("Auth adapter login is not configured");
556
+ setState({ ...state, status: "loading" });
557
+ try {
558
+ await executeMiddleware("onBeforeLogin", credentials);
559
+ const session = await withRetry(() => loginFn(credentials), "login");
560
+ const nextState = await setSession(session, "authenticated");
561
+ await executeMiddleware("onAfterLogin", nextState);
562
+ return nextState;
563
+ } catch (error) {
564
+ await executeMiddleware("onError", error);
565
+ await setSession(null, "error", error);
566
+ throw error;
567
+ }
568
+ };
569
+ const logout = async () => {
570
+ var _a;
571
+ const current = state.session;
572
+ try {
573
+ await executeMiddleware("onBeforeLogout");
574
+ await ((_a = config2.logout) == null ? void 0 : _a.call(config2, current ?? null));
575
+ } finally {
576
+ if (autoRefreshCleanup) {
577
+ autoRefreshCleanup();
578
+ autoRefreshCleanup = null;
579
+ }
580
+ await setSession(null, "unauthenticated");
581
+ await executeMiddleware("onAfterLogout");
582
+ }
583
+ };
584
+ const hasRole = (target, options) => {
585
+ return checkRoles(state.roles, target, options);
586
+ };
587
+ const hasPermission = (target, options) => {
588
+ return checkPermissions(state.permissions, target, options);
589
+ };
590
+ const can = (rule) => {
591
+ return evaluatePermissionRule(state.roles, state.permissions, rule);
592
+ };
593
+ const getToken = () => {
594
+ var _a;
595
+ return ((_a = state.session) == null ? void 0 : _a.accessToken) ?? null;
596
+ };
597
+ const isTokenExpired = () => {
598
+ var _a;
599
+ return tokenManager.isExpired((_a = state.session) == null ? void 0 : _a.expiresAt);
600
+ };
601
+ const getTimeUntilExpiry = () => {
602
+ var _a;
603
+ return tokenManager.getTimeUntilExpiry((_a = state.session) == null ? void 0 : _a.expiresAt);
604
+ };
605
+ const scheduleAutoRefresh = () => {
606
+ setupAutoRefresh();
607
+ return () => {
608
+ if (autoRefreshCleanup) {
609
+ autoRefreshCleanup();
610
+ autoRefreshCleanup = null;
611
+ }
612
+ };
613
+ };
614
+ const api = {
615
+ getState: () => state,
616
+ subscribe: (listener) => {
617
+ subscribers.add(listener);
618
+ return () => {
619
+ subscribers.delete(listener);
620
+ };
621
+ },
622
+ sync,
623
+ login: config2.login ? login : void 0,
624
+ logout,
625
+ refresh: async () => {
626
+ return await refresh();
627
+ },
628
+ setSession: async (session) => {
629
+ return await setSession(session);
630
+ },
631
+ hasRole,
632
+ hasPermission,
633
+ can,
634
+ getToken,
635
+ isTokenExpired,
636
+ getTimeUntilExpiry,
637
+ scheduleAutoRefresh
638
+ };
639
+ return api;
640
+ }
641
+ const AuthContext = createContext(void 0);
642
+ function AuthProvider({
643
+ adapter,
644
+ children,
645
+ autoSync = true
646
+ }) {
647
+ const state = useSyncExternalStore(
648
+ adapter.subscribe,
649
+ adapter.getState,
650
+ adapter.getState
651
+ );
652
+ useEffect(() => {
653
+ if (!autoSync) return;
654
+ adapter.sync().catch(() => void 0);
655
+ }, [adapter, autoSync]);
656
+ const value = useMemo(() => {
657
+ const login = adapter.login ? async (credentials) => {
658
+ if (!adapter.login) {
659
+ throw new Error("Login is not configured");
660
+ }
661
+ return await adapter.login(credentials);
662
+ } : void 0;
663
+ return {
664
+ state,
665
+ status: state.status,
666
+ session: state.session,
667
+ user: state.user,
668
+ roles: state.roles,
669
+ permissions: state.permissions,
670
+ error: state.error,
671
+ login,
672
+ logout: adapter.logout,
673
+ refresh: adapter.refresh,
674
+ setSession: adapter.setSession,
675
+ hasRole: adapter.hasRole,
676
+ hasPermission: adapter.hasPermission,
677
+ can: adapter.can,
678
+ getToken: adapter.getToken,
679
+ isTokenExpired: adapter.isTokenExpired,
680
+ getTimeUntilExpiry: adapter.getTimeUntilExpiry
681
+ };
682
+ }, [adapter, state]);
683
+ const contextValue = value;
684
+ return /* @__PURE__ */ jsx(AuthContext.Provider, { value: contextValue, children });
685
+ }
686
+ function useAuthContext() {
687
+ const ctx = useContext(AuthContext);
688
+ if (!ctx) throw new Error("useAuthContext must be used within AuthProvider");
689
+ return ctx;
690
+ }
691
+ function createGraphQLAuthAdapter(options) {
692
+ return {
693
+ login: options.client.login,
694
+ logout: options.client.logout,
695
+ refresh: options.client.refresh ? async (session) => {
696
+ if (!session.refreshToken) {
697
+ throw new Error("No refresh token available");
698
+ }
699
+ if (!options.client.refresh) {
700
+ throw new Error("Refresh function not provided");
701
+ }
702
+ return await options.client.refresh(session.refreshToken);
703
+ } : void 0,
704
+ loadSession: options.client.getCurrentUser,
705
+ resolveUser: options.resolveUser,
706
+ resolveRoles: options.resolveRoles,
707
+ resolvePermissions: options.resolvePermissions
708
+ };
709
+ }
710
+ function createRESTAuthAdapter(options) {
711
+ return {
712
+ login: options.client.login,
713
+ logout: options.client.logout,
714
+ refresh: options.client.refresh ? async (session) => {
715
+ if (!session.refreshToken) {
716
+ throw new Error("No refresh token available");
717
+ }
718
+ if (!options.client.refresh) {
719
+ throw new Error("Refresh function not provided");
720
+ }
721
+ return await options.client.refresh(session.refreshToken);
722
+ } : void 0,
723
+ loadSession: options.client.getCurrentUser,
724
+ resolveUser: options.resolveUser,
725
+ resolveRoles: options.resolveRoles,
726
+ resolvePermissions: options.resolvePermissions
727
+ };
728
+ }
729
+ function createAxiosAuthInterceptor(axiosInstance, getToken, options) {
730
+ const tokenType = (options == null ? void 0 : options.tokenType) ?? "Bearer";
731
+ axiosInstance.interceptors.request.use(
732
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
733
+ async (config2) => {
734
+ const token = getToken();
735
+ if (token) {
736
+ config2.headers.Authorization = `${tokenType} ${token}`;
737
+ }
738
+ return config2;
739
+ },
740
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
741
+ (error) => Promise.reject(error)
742
+ );
743
+ if (options == null ? void 0 : options.refreshToken) {
744
+ axiosInstance.interceptors.response.use(
745
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
746
+ (response) => response,
747
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
748
+ async (error) => {
749
+ var _a, _b;
750
+ const originalRequest = error.config;
751
+ if (((_a = error.response) == null ? void 0 : _a.status) === 401 && !originalRequest._retry && options.refreshToken) {
752
+ originalRequest._retry = true;
753
+ try {
754
+ await options.refreshToken();
755
+ const token = getToken();
756
+ if (token) {
757
+ originalRequest.headers.Authorization = `${tokenType} ${token}`;
758
+ }
759
+ return axiosInstance(originalRequest);
760
+ } catch (refreshError) {
761
+ (_b = options.onTokenExpired) == null ? void 0 : _b.call(options);
762
+ return Promise.reject(refreshError);
763
+ }
764
+ }
765
+ return Promise.reject(error);
766
+ }
767
+ );
768
+ }
769
+ }
770
+ function createAuthFetch(getToken, options) {
771
+ const tokenType = (options == null ? void 0 : options.tokenType) ?? "Bearer";
772
+ return async (input, init) => {
773
+ var _a;
774
+ const token = getToken();
775
+ const headers = new Headers(init == null ? void 0 : init.headers);
776
+ if (token) {
777
+ headers.set("Authorization", `${tokenType} ${token}`);
778
+ }
779
+ const response = await fetch(input, {
780
+ ...init,
781
+ headers
782
+ });
783
+ if (response.status === 401 && (options == null ? void 0 : options.refreshToken)) {
784
+ try {
785
+ await options.refreshToken();
786
+ const newToken = getToken();
787
+ if (newToken) {
788
+ headers.set("Authorization", `${tokenType} ${newToken}`);
789
+ return await fetch(input, {
790
+ ...init,
791
+ headers
792
+ });
793
+ }
794
+ } catch (error) {
795
+ (_a = options.onTokenExpired) == null ? void 0 : _a.call(options);
796
+ throw error;
797
+ }
798
+ }
799
+ return response;
800
+ };
801
+ }
802
+ function createApolloAuthLink(getToken, options) {
803
+ const tokenType = (options == null ? void 0 : options.tokenType) ?? "Bearer";
804
+ return (ApolloLink) => {
805
+ return new ApolloLink((operation, forward) => {
806
+ const token = getToken();
807
+ if (token) {
808
+ operation.setContext(({ headers = {} }) => ({
809
+ headers: {
810
+ ...headers,
811
+ authorization: `${tokenType} ${token}`
812
+ }
813
+ }));
814
+ }
815
+ return forward(operation);
816
+ });
817
+ };
818
+ }
819
+ function useAuth() {
820
+ return useAuthContext();
821
+ }
822
+ function useAuthStatus() {
823
+ const { status } = useAuthContext();
824
+ return status;
825
+ }
826
+ function useIsAuthenticated() {
827
+ const { status } = useAuthContext();
828
+ return status === "authenticated";
829
+ }
830
+ function useAuthSession() {
831
+ const { session } = useAuthContext();
832
+ return session;
833
+ }
834
+ function useAuthUser() {
835
+ const { user } = useAuthContext();
836
+ return user;
837
+ }
838
+ function useAuthRoles() {
839
+ const { roles } = useAuthContext();
840
+ return roles;
841
+ }
842
+ function useAuthPermissions() {
843
+ const { permissions } = useAuthContext();
844
+ return permissions;
845
+ }
846
+ function useAuthError() {
847
+ const { error } = useAuthContext();
848
+ return error;
849
+ }
850
+ function usePermission(permission, options) {
851
+ const { hasPermission } = useAuthContext();
852
+ return hasPermission(permission, options);
853
+ }
854
+ function useRole(roles, options) {
855
+ const { hasRole } = useAuthContext();
856
+ return hasRole(roles, options);
857
+ }
858
+ function useCan(rule) {
859
+ const { can } = useAuthContext();
860
+ return can(rule);
861
+ }
862
+ function useAuthToken() {
863
+ const { getToken } = useAuthContext();
864
+ return getToken();
865
+ }
866
+ function useIsTokenExpired() {
867
+ const { isTokenExpired } = useAuthContext();
868
+ return isTokenExpired();
869
+ }
870
+ function useTimeUntilExpiry() {
871
+ const { getTimeUntilExpiry } = useAuthContext();
872
+ return getTimeUntilExpiry();
873
+ }
874
+ function useLogin() {
875
+ const { login } = useAuthContext();
876
+ return login;
877
+ }
878
+ function useLogout() {
879
+ const { logout } = useAuthContext();
880
+ return logout;
881
+ }
882
+ function useRefresh() {
883
+ const { refresh } = useAuthContext();
884
+ return refresh;
885
+ }
886
+ function useSetSession() {
887
+ const { setSession } = useAuthContext();
888
+ return setSession;
889
+ }
890
+ function RequireAuth({
891
+ children,
892
+ fallback = null,
893
+ loadingFallback = null,
894
+ roles,
895
+ permissions,
896
+ requireAll = true
897
+ }) {
898
+ const { status, can } = useAuthContext();
899
+ if (status === "loading" || status === "idle") {
900
+ return loadingFallback;
901
+ }
902
+ if (status !== "authenticated") {
903
+ return fallback;
904
+ }
905
+ if (!roles && !permissions) {
906
+ return children;
907
+ }
908
+ const allowed = can({ roles, permissions, requireAll });
909
+ if (!allowed) {
910
+ return fallback;
911
+ }
912
+ return children;
913
+ }
914
+ function Can({
915
+ children,
916
+ fallback = null,
917
+ roles,
918
+ permissions,
919
+ requireAll = true
920
+ }) {
921
+ const allowed = useCan({ roles, permissions, requireAll });
922
+ if (!allowed) return fallback;
923
+ return children;
924
+ }
925
+ function withPermission(Component2, options) {
926
+ const WithPermissionWrapper = (props2) => {
927
+ const allowed = useCan(options);
928
+ if (!allowed) return null;
929
+ return /* @__PURE__ */ jsx(Component2, { ...props2 });
930
+ };
931
+ WithPermissionWrapper.displayName = `WithPermission(${Component2.displayName ?? Component2.name ?? "Component"})`;
932
+ return WithPermissionWrapper;
933
+ }
934
+ function ShowWhenAuthenticated({ children }) {
935
+ const { status } = useAuthContext();
936
+ return status === "authenticated" ? children : null;
937
+ }
938
+ function ShowWhenUnauthenticated({ children }) {
939
+ const { status } = useAuthContext();
940
+ return status === "unauthenticated" ? children : null;
941
+ }
942
+ function ShowWhenLoading({ children }) {
943
+ const { status } = useAuthContext();
944
+ return status === "loading" ? children : null;
945
+ }
946
+ function ShowWhenError({ children }) {
947
+ const { status } = useAuthContext();
948
+ return status === "error" ? children : null;
949
+ }
7
950
  /**
8
951
  * table-core
9
952
  *
@@ -216,7 +1159,7 @@ function createHeader(table, column, options) {
216
1159
  });
217
1160
  return header;
218
1161
  }
219
- const Headers = {
1162
+ const Headers$1 = {
220
1163
  createTable: (table) => {
221
1164
  table.getHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {
222
1165
  var _left$map$filter, _right$map$filter;
@@ -2418,7 +3361,7 @@ const RowSorting = {
2418
3361
  }
2419
3362
  };
2420
3363
  const builtInFeatures = [
2421
- Headers,
3364
+ Headers$1,
2422
3365
  ColumnVisibility,
2423
3366
  ColumnOrdering,
2424
3367
  ColumnPinning,
@@ -38972,7 +39915,7 @@ function requireLodash() {
38972
39915
  var reIsNative = RegExp2(
38973
39916
  "^" + funcToString.call(hasOwnProperty).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
38974
39917
  );
38975
- var Buffer = moduleExports ? context.Buffer : undefined$1, Symbol2 = context.Symbol, Uint8Array = context.Uint8Array, allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined$1, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined$1, symIterator = Symbol2 ? Symbol2.iterator : undefined$1, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined$1;
39918
+ var Buffer2 = moduleExports ? context.Buffer : undefined$1, Symbol2 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined$1, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined$1, symIterator = Symbol2 ? Symbol2.iterator : undefined$1, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined$1;
38976
39919
  var defineProperty = (function() {
38977
39920
  try {
38978
39921
  var func = getNative(Object2, "defineProperty");
@@ -38982,7 +39925,7 @@ function requireLodash() {
38982
39925
  }
38983
39926
  })();
38984
39927
  var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
38985
- var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined$1, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse;
39928
+ var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined$1, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse;
38986
39929
  var DataView = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap2 = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create");
38987
39930
  var metaMap = WeakMap2 && new WeakMap2();
38988
39931
  var realNames = {};
@@ -40274,7 +41217,7 @@ function requireLodash() {
40274
41217
  }
40275
41218
  function cloneArrayBuffer(arrayBuffer) {
40276
41219
  var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength);
40277
- new Uint8Array(result2).set(new Uint8Array(arrayBuffer));
41220
+ new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer));
40278
41221
  return result2;
40279
41222
  }
40280
41223
  function cloneDataView(dataView, isDeep) {
@@ -40878,7 +41821,7 @@ function requireLodash() {
40878
41821
  object2 = object2.buffer;
40879
41822
  other = other.buffer;
40880
41823
  case arrayBufferTag:
40881
- if (object2.byteLength != other.byteLength || !equalFunc(new Uint8Array(object2), new Uint8Array(other))) {
41824
+ if (object2.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object2), new Uint8Array2(other))) {
40882
41825
  return false;
40883
41826
  }
40884
41827
  return true;
@@ -44760,7 +45703,7 @@ function Login({
44760
45703
  subtitle,
44761
45704
  signupLabel = "Don't have an account?",
44762
45705
  signupLinkLabel = "Sign up",
44763
- signupHref = "#",
45706
+ signupHref,
44764
45707
  forgotPasswordLabel = "Forgot your password?",
44765
45708
  forgotPasswordLinkLabel = "Reset Here",
44766
45709
  forgotPasswordHref,
@@ -44799,11 +45742,11 @@ function Login({
44799
45742
  /* @__PURE__ */ jsx("div", { className: "grid gap-3", children: continueWith })
44800
45743
  ] }) : null
44801
45744
  ] }),
44802
- /* @__PURE__ */ jsxs("div", { className: "mt-6 text-center text-sm", children: [
45745
+ signupHref ? /* @__PURE__ */ jsxs("div", { className: "mt-6 text-center text-sm", children: [
44803
45746
  signupLabel,
44804
45747
  " ",
44805
45748
  /* @__PURE__ */ jsx("a", { href: signupHref, className: "underline underline-offset-4", children: signupLinkLabel })
44806
- ] })
45749
+ ] }) : null
44807
45750
  ] }) }),
44808
45751
  /* @__PURE__ */ jsx("div", { className: "hidden md:block", children: rightImageSrc ? /* @__PURE__ */ jsx(
44809
45752
  "img",
@@ -45935,7 +46878,8 @@ function AdminLayoutContent({
45935
46878
  sidebarHeaderTitle,
45936
46879
  sidebarHeaderIcon,
45937
46880
  headerAfterTrigger,
45938
- headerAfterTheme
46881
+ headerAfterTheme,
46882
+ onLogout
45939
46883
  }) {
45940
46884
  const { groups: sidebarGroups } = useAdminSidebarMenu();
45941
46885
  const location = useLocation();
@@ -46034,11 +46978,14 @@ function AdminLayoutContent({
46034
46978
  }
46035
46979
  )
46036
46980
  ] }, group.id)) }),
46037
- /* @__PURE__ */ jsx(SidebarFooter, { className: "bg-sidebar border-t border-sidebar-border px-2 py-3", children: /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { className: "group-data-[collapsible=icon]:flex group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:justify-center", children: /* @__PURE__ */ jsx(
46981
+ onLogout && /* @__PURE__ */ jsx(SidebarFooter, { className: "bg-sidebar border-t border-sidebar-border px-2 py-3", children: /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { className: "group-data-[collapsible=icon]:flex group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:justify-center", children: /* @__PURE__ */ jsx(
46038
46982
  SidebarMenuButton,
46039
46983
  {
46040
46984
  tooltip: "Logout",
46041
- className: "group relative overflow-hidden rounded-lg mx-1 transition-all duration-200 hover:bg-sidebar-accent/70 hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:flex group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:!justify-center group-data-[collapsible=icon]:!px-0 group-data-[collapsible=icon]:!gap-0",
46985
+ className: "cursor-pointer group relative overflow-hidden rounded-lg mx-1 transition-all duration-200 hover:bg-sidebar-accent/70 hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:flex group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:!justify-center group-data-[collapsible=icon]:!px-0 group-data-[collapsible=icon]:!gap-0",
46986
+ onClick: () => {
46987
+ void onLogout();
46988
+ },
46042
46989
  children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-3 py-2.5 group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:!justify-center group-data-[collapsible=icon]:!gap-0 group-data-[collapsible=icon]:!px-0", children: [
46043
46990
  /* @__PURE__ */ jsx(LogOut, { className: "h-4 w-4 text-sidebar-foreground group-hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:mx-auto group-data-[collapsible=icon]:mr-0" }),
46044
46991
  /* @__PURE__ */ jsx("span", { className: "font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden", children: "Logout" })
@@ -46071,7 +47018,8 @@ function AdminLayout({
46071
47018
  sidebarHeaderTitle,
46072
47019
  sidebarHeaderIcon,
46073
47020
  headerAfterTrigger,
46074
- headerAfterTheme
47021
+ headerAfterTheme,
47022
+ onLogout
46075
47023
  }) {
46076
47024
  return /* @__PURE__ */ jsx(AdminMenuProvider, { children: /* @__PURE__ */ jsx(SidebarProvider, { children: /* @__PURE__ */ jsx(
46077
47025
  AdminLayoutContent,
@@ -46083,6 +47031,7 @@ function AdminLayout({
46083
47031
  sidebarHeaderIcon,
46084
47032
  headerAfterTrigger,
46085
47033
  headerAfterTheme,
47034
+ onLogout,
46086
47035
  children
46087
47036
  }
46088
47037
  ) }) });
@@ -52233,8 +53182,8 @@ function require_Uint8Array() {
52233
53182
  if (hasRequired_Uint8Array) return _Uint8Array;
52234
53183
  hasRequired_Uint8Array = 1;
52235
53184
  var root = require_root();
52236
- var Uint8Array = root.Uint8Array;
52237
- _Uint8Array = Uint8Array;
53185
+ var Uint8Array2 = root.Uint8Array;
53186
+ _Uint8Array = Uint8Array2;
52238
53187
  return _Uint8Array;
52239
53188
  }
52240
53189
  var _mapToArray;
@@ -52272,7 +53221,7 @@ var hasRequired_equalByTag;
52272
53221
  function require_equalByTag() {
52273
53222
  if (hasRequired_equalByTag) return _equalByTag;
52274
53223
  hasRequired_equalByTag = 1;
52275
- var Symbol2 = require_Symbol(), Uint8Array = require_Uint8Array(), eq = requireEq(), equalArrays = require_equalArrays(), mapToArray = require_mapToArray(), setToArray = require_setToArray();
53224
+ var Symbol2 = require_Symbol(), Uint8Array2 = require_Uint8Array(), eq = requireEq(), equalArrays = require_equalArrays(), mapToArray = require_mapToArray(), setToArray = require_setToArray();
52276
53225
  var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
52277
53226
  var boolTag = "[object Boolean]", dateTag = "[object Date]", errorTag = "[object Error]", mapTag = "[object Map]", numberTag = "[object Number]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]";
52278
53227
  var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]";
@@ -52286,7 +53235,7 @@ function require_equalByTag() {
52286
53235
  object2 = object2.buffer;
52287
53236
  other = other.buffer;
52288
53237
  case arrayBufferTag:
52289
- if (object2.byteLength != other.byteLength || !equalFunc(new Uint8Array(object2), new Uint8Array(other))) {
53238
+ if (object2.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object2), new Uint8Array2(other))) {
52290
53239
  return false;
52291
53240
  }
52292
53241
  return true;
@@ -52471,8 +53420,8 @@ function requireIsBuffer() {
52471
53420
  var freeExports = exports && !exports.nodeType && exports;
52472
53421
  var freeModule = freeExports && true && module && !module.nodeType && module;
52473
53422
  var moduleExports = freeModule && freeModule.exports === freeExports;
52474
- var Buffer = moduleExports ? root.Buffer : void 0;
52475
- var nativeIsBuffer = Buffer ? Buffer.isBuffer : void 0;
53423
+ var Buffer2 = moduleExports ? root.Buffer : void 0;
53424
+ var nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : void 0;
52476
53425
  var isBuffer2 = nativeIsBuffer || stubFalse;
52477
53426
  module.exports = isBuffer2;
52478
53427
  })(isBuffer, isBuffer.exports);
@@ -64062,6 +65011,7 @@ export {
64062
65011
  AlertDialogTrigger,
64063
65012
  AlertTitle,
64064
65013
  AspectRatio,
65014
+ AuthProvider,
64065
65015
  Autocomplete,
64066
65016
  Avatar,
64067
65017
  AvatarFallback,
@@ -64077,6 +65027,7 @@ export {
64077
65027
  Button$1 as Button,
64078
65028
  Calendar,
64079
65029
  CalendarDayButton,
65030
+ Can,
64080
65031
  Card,
64081
65032
  CardAction,
64082
65033
  CardContent,
@@ -64224,6 +65175,7 @@ export {
64224
65175
  Progress,
64225
65176
  RadioGroup$1 as RadioGroup,
64226
65177
  RadioGroupItem,
65178
+ RequireAuth,
64227
65179
  ResizableHandle,
64228
65180
  ResizablePanel,
64229
65181
  ResizablePanelGroup,
@@ -64249,6 +65201,10 @@ export {
64249
65201
  SheetHeader,
64250
65202
  SheetTitle,
64251
65203
  SheetTrigger,
65204
+ ShowWhenAuthenticated,
65205
+ ShowWhenError,
65206
+ ShowWhenLoading,
65207
+ ShowWhenUnauthenticated,
64252
65208
  Sidebar,
64253
65209
  SidebarContent,
64254
65210
  SidebarFooter,
@@ -64302,27 +65258,63 @@ export {
64302
65258
  TooltipTrigger,
64303
65259
  badgeVariants,
64304
65260
  buttonVariants,
65261
+ checkPermissions,
65262
+ checkRoles,
64305
65263
  cn$1 as cn,
64306
65264
  commonForms,
64307
65265
  commonValidations,
64308
65266
  conditions,
65267
+ createApolloAuthLink,
65268
+ createAuthAdapter,
65269
+ createAuthFetch,
65270
+ createAxiosAuthInterceptor,
65271
+ createBrowserStorage,
65272
+ createCookieStorage,
64309
65273
  createDependency,
64310
65274
  createField,
65275
+ createGraphQLAuthAdapter,
65276
+ createMemoryStorage,
65277
+ createRESTAuthAdapter,
64311
65278
  createSection,
65279
+ createStorage,
65280
+ createTokenManager,
64312
65281
  dotAccessor,
65282
+ evaluatePermissionRule,
65283
+ expandPermissions,
65284
+ expandRoles,
64313
65285
  navigationMenuTriggerStyle,
64314
65286
  toast,
64315
65287
  toggleVariants,
64316
65288
  transformers,
64317
65289
  useAdminSidebarMenu,
64318
65290
  useAdminSidebarMenuRegistration,
65291
+ useAuth,
65292
+ useAuthContext,
65293
+ useAuthError,
65294
+ useAuthPermissions,
65295
+ useAuthRoles,
65296
+ useAuthSession,
65297
+ useAuthStatus,
65298
+ useAuthToken,
65299
+ useAuthUser,
65300
+ useCan,
64319
65301
  useDialog,
64320
65302
  useDialogController,
64321
65303
  useFormBuilder,
64322
65304
  useFormField,
65305
+ useIsAuthenticated,
64323
65306
  useIsMobile,
65307
+ useIsTokenExpired,
65308
+ useLogin,
65309
+ useLogout,
65310
+ usePermission,
65311
+ useRefresh,
65312
+ useRole,
65313
+ useSetSession,
64324
65314
  useSidebar,
64325
65315
  useStackDialog,
64326
65316
  useTheme,
64327
- validators
65317
+ useTimeUntilExpiry,
65318
+ validators,
65319
+ withPermission
64328
65320
  };