@djangocfg/api 2.1.581 → 2.1.583

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 (41) hide show
  1. package/README.md +18 -0
  2. package/dist/auth.cjs +272 -80
  3. package/dist/auth.cjs.map +1 -1
  4. package/dist/auth.mjs +272 -80
  5. package/dist/auth.mjs.map +1 -1
  6. package/dist/clients.cjs +243 -54
  7. package/dist/clients.cjs.map +1 -1
  8. package/dist/clients.mjs +243 -54
  9. package/dist/clients.mjs.map +1 -1
  10. package/dist/hooks.cjs +243 -54
  11. package/dist/hooks.cjs.map +1 -1
  12. package/dist/hooks.mjs +243 -54
  13. package/dist/hooks.mjs.map +1 -1
  14. package/dist/index.cjs +248 -54
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +85 -1
  17. package/dist/index.d.ts +85 -1
  18. package/dist/index.mjs +248 -54
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/storage.cjs +269 -0
  21. package/dist/storage.cjs.map +1 -0
  22. package/dist/storage.d.cts +85 -0
  23. package/dist/storage.d.ts +85 -0
  24. package/dist/storage.mjs +248 -0
  25. package/dist/storage.mjs.map +1 -0
  26. package/package.json +8 -2
  27. package/src/__tests__/noStorageLiterals.test.ts +27 -0
  28. package/src/__tests__/storage.test.ts +134 -0
  29. package/src/__tests__/storageSsr.test.ts +14 -0
  30. package/src/_api/generated/helpers/auth.ts +27 -64
  31. package/src/_api/generated/helpers/index.ts +12 -0
  32. package/src/_api/generated/helpers/keys.ts +328 -0
  33. package/src/auth/__tests__/authRedirect.test.ts +1 -1
  34. package/src/auth/__tests__/profileCache.test.ts +1 -1
  35. package/src/auth/context/AuthContext.tsx +2 -1
  36. package/src/auth/hooks/useAuthRedirect.ts +3 -2
  37. package/src/auth/hooks/useGithubAuth.ts +13 -8
  38. package/src/auth/hooks/useLocalStorage.ts +7 -7
  39. package/src/auth/hooks/useProfileCache.ts +2 -1
  40. package/src/auth/hooks/useSessionStorage.ts +7 -7
  41. package/src/storage.ts +21 -0
package/dist/auth.mjs CHANGED
@@ -92,77 +92,264 @@ var APIError = class extends Error {
92
92
  }
93
93
  };
94
94
 
95
- // src/_api/generated/helpers/auth.ts
96
- var ACCESS_KEY = "cfg.access_token";
97
- var REFRESH_KEY = "cfg.refresh_token";
98
- var API_KEY_KEY = "cfg.api_key";
99
- var isBrowser = typeof window !== "undefined";
100
- var localStorageBackend = {
101
- get(key) {
102
- if (!isBrowser) return null;
103
- try {
104
- return window.localStorage.getItem(key);
105
- } catch {
106
- return null;
95
+ // src/_api/generated/helpers/keys.ts
96
+ var k = /* @__PURE__ */ __name((key, store, personal) => ({ key, store, personal }), "k");
97
+ var f = /* @__PURE__ */ __name((prefix, store, personal) => ({ prefix, store, personal }), "f");
98
+ var CFG_KEYS = {
99
+ accessToken: k("cfg.auth.access_token", "local", true),
100
+ refreshToken: k("cfg.auth.refresh_token", "local", true),
101
+ apiKey: k("cfg.auth.api_key", "local", true),
102
+ email: k("cfg.auth.email", "local", false),
103
+ emailTs: k("cfg.auth.email_ts", "local", false),
104
+ redirectUrl: k("cfg.auth.redirect_url", "session", true),
105
+ redirectUrlTs: k("cfg.auth.redirect_url_ts", "session", true),
106
+ oauthState: k("cfg.auth.oauth_state", "session", true),
107
+ oauthProvider: k("cfg.auth.oauth_provider", "session", true),
108
+ oauthRememberMe: k("cfg.auth.oauth_remember_me", "session", true),
109
+ profileCache: k("cfg.profile.cache", "local", true),
110
+ monitorSessionId: k("cfg.monitor.session_id", "local", false),
111
+ monitorSessionCookie: k("cfg.monitor.session_id", "cookie", false),
112
+ monitorDebug: k("cfg.monitor.debug", "local", false),
113
+ uiTabId: k("cfg.ui.tab_id", "session", false),
114
+ uiRouterSerial: k("cfg.ui.router_serial", "session", false),
115
+ uiState: k("cfg.ui.state", "local", false),
116
+ chatSpeechLanguage: k("cfg.chat.speech_language", "local", false),
117
+ chatRecentTools: k("cfg.chat.recent_tools", "local", false),
118
+ formsSpeechDebug: k("cfg.forms.speech_debug", "local", false),
119
+ formsSpeechPrefs: k("cfg.forms.speech_prefs", "local", false),
120
+ agentPlaygroundApiKeyId: k("cfg.agent.playground_api_key_id", "session", true),
121
+ agentPlaygroundBearer: k("cfg.agent.playground_bearer", "session", true),
122
+ agentEndpointDoc: k("cfg.agent.endpoint_doc", "session", false)
123
+ };
124
+ var CFG_FAMILIES = {
125
+ chatDraft: f("cfg.chat.draft.", "session", true),
126
+ dataTree: f("cfg.data.tree.", "local", false),
127
+ agentEndpointDraft: f("cfg.agent.endpoint_draft.", "local", false)
128
+ };
129
+ var OWNER_RE = /^[a-z][a-z0-9_]*$/;
130
+ function normalizeSegment(raw) {
131
+ return raw.trim().toLowerCase().replace(/[^a-z0-9_]+/g, "_").replace(/^_+|_+$/g, "");
132
+ }
133
+ __name(normalizeSegment, "normalizeSegment");
134
+ var hasWindow = /* @__PURE__ */ __name(() => typeof window !== "undefined", "hasWindow");
135
+ function nativeStorage(store) {
136
+ if (!hasWindow()) return null;
137
+ try {
138
+ return store === "session" ? window.sessionStorage : window.localStorage;
139
+ } catch {
140
+ return null;
141
+ }
142
+ }
143
+ __name(nativeStorage, "nativeStorage");
144
+ function cookieNames() {
145
+ if (!hasWindow()) return [];
146
+ try {
147
+ return document.cookie.split("; ").map((part) => decodeURIComponent(part.split("=")[0] ?? "")).filter(Boolean);
148
+ } catch {
149
+ return [];
150
+ }
151
+ }
152
+ __name(cookieNames, "cookieNames");
153
+ function createStorage(owner, options = {}) {
154
+ if (!OWNER_RE.test(owner)) {
155
+ throw new TypeError(`createStorage: owner "${owner}" must match ${OWNER_RE}`);
156
+ }
157
+ const prefix = `${owner}.`;
158
+ const pattern = owner === "cfg" ? /^cfg(\.[a-z0-9_]+)+$/ : new RegExp(`^(cfg|${owner})(\\.[a-z0-9_]+)+$`);
159
+ const cookieMaxAge = options.cookieMaxAgeSeconds ?? 60 * 60 * 24 * 30;
160
+ const specs = Object.values(options.keys ?? {});
161
+ const families = Object.values(options.families ?? {});
162
+ const specByKey = /* @__PURE__ */ new Map();
163
+ for (const spec of specs) specByKey.set(spec.key, [...specByKey.get(spec.key) ?? [], spec]);
164
+ const memory = {
165
+ local: /* @__PURE__ */ new Map(),
166
+ session: /* @__PURE__ */ new Map(),
167
+ cookie: /* @__PURE__ */ new Map()
168
+ };
169
+ const isValid = /* @__PURE__ */ __name((key) => pattern.test(key), "isValid");
170
+ const assertValid = /* @__PURE__ */ __name((key) => {
171
+ if (!isValid(key)) throw new TypeError(`storage key "${key}" must match ${pattern}`);
172
+ }, "assertValid");
173
+ const assertOwned = /* @__PURE__ */ __name((key) => {
174
+ assertValid(key);
175
+ if (!key.startsWith(prefix)) throw new TypeError(`storage key "${key}" is not owned by "${owner}"`);
176
+ }, "assertOwned");
177
+ function rawGet(store, key) {
178
+ if (!hasWindow()) return null;
179
+ if (store === "cookie") {
180
+ try {
181
+ const escaped = encodeURIComponent(key).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
182
+ const match = document.cookie.match(new RegExp(`(?:^|;\\s*)${escaped}=([^;]*)`));
183
+ if (match?.[1] !== void 0) return decodeURIComponent(match[1]);
184
+ } catch {
185
+ }
186
+ return memory.cookie.get(key) ?? null;
107
187
  }
108
- },
109
- set(key, value) {
110
- if (!isBrowser) return;
111
188
  try {
112
- if (value === null) window.localStorage.removeItem(key);
113
- else window.localStorage.setItem(key, value);
189
+ const value = nativeStorage(store)?.getItem(key) ?? null;
190
+ if (value !== null) return value;
114
191
  } catch {
115
192
  }
193
+ return memory[store].get(key) ?? null;
116
194
  }
117
- };
118
- var sessionStorageBackend = {
119
- get(key) {
120
- if (!isBrowser) return null;
195
+ __name(rawGet, "rawGet");
196
+ function rawSet(store, key, value) {
197
+ if (!hasWindow()) return false;
121
198
  try {
122
- return window.sessionStorage.getItem(key);
199
+ if (store === "cookie") {
200
+ const secure = window.location.protocol === "https:" ? "; Secure" : "";
201
+ document.cookie = `${encodeURIComponent(key)}=${encodeURIComponent(value)}; Path=/; Max-Age=${cookieMaxAge}; SameSite=Lax${secure}`;
202
+ if (rawGet("cookie", key) === value && !memory.cookie.has(key)) return true;
203
+ memory.cookie.set(key, value);
204
+ return false;
205
+ }
206
+ const native = nativeStorage(store);
207
+ if (!native) throw new Error("storage unavailable");
208
+ native.setItem(key, value);
209
+ memory[store].delete(key);
210
+ return true;
123
211
  } catch {
124
- return null;
212
+ memory[store].set(key, value);
213
+ return false;
125
214
  }
126
- },
127
- set(key, value) {
128
- if (!isBrowser) return;
215
+ }
216
+ __name(rawSet, "rawSet");
217
+ function rawRemove(store, key) {
218
+ memory[store].delete(key);
219
+ if (!hasWindow()) return;
129
220
  try {
130
- if (value === null) window.sessionStorage.removeItem(key);
131
- else window.sessionStorage.setItem(key, value);
221
+ if (store === "cookie") {
222
+ const secure = window.location.protocol === "https:" ? "; Secure" : "";
223
+ document.cookie = `${encodeURIComponent(key)}=; Path=/; Max-Age=0; SameSite=Lax${secure}`;
224
+ } else {
225
+ nativeStorage(store)?.removeItem(key);
226
+ }
132
227
  } catch {
133
228
  }
134
229
  }
135
- };
136
- var COOKIE_MAX_AGE = 60 * 60 * 24 * 30;
137
- var cookieBackend = {
138
- get(key) {
139
- if (!isBrowser) return null;
230
+ __name(rawRemove, "rawRemove");
231
+ function resolveStore(key, store) {
232
+ return store ?? specByKey.get(key)?.[0]?.store ?? "local";
233
+ }
234
+ __name(resolveStore, "resolveStore");
235
+ function listKeys(store, startsWith) {
236
+ const out = [];
140
237
  try {
141
- const re = new RegExp(`(?:^|;\\s*)${encodeURIComponent(key)}=([^;]*)`);
142
- const m = document.cookie.match(re);
143
- const value = m?.[1];
144
- return value === void 0 ? null : decodeURIComponent(value);
238
+ const native = nativeStorage(store);
239
+ if (native) {
240
+ for (let i = 0; i < native.length; i += 1) {
241
+ const name = native.key(i);
242
+ if (name?.startsWith(startsWith)) out.push(name);
243
+ }
244
+ }
145
245
  } catch {
146
- return null;
147
246
  }
148
- },
149
- set(key, value) {
150
- if (!isBrowser) return;
151
- try {
152
- const k = encodeURIComponent(key);
153
- const secure = window.location.protocol === "https:" ? "; Secure" : "";
154
- if (value === null) {
155
- document.cookie = `${k}=; Path=/; Max-Age=0; SameSite=Lax${secure}`;
156
- } else {
157
- const v = encodeURIComponent(value);
158
- document.cookie = `${k}=${v}; Path=/; Max-Age=${COOKIE_MAX_AGE}; SameSite=Lax${secure}`;
247
+ for (const name of memory[store].keys()) if (name.startsWith(startsWith) && !out.includes(name)) out.push(name);
248
+ return out;
249
+ }
250
+ __name(listKeys, "listKeys");
251
+ const familyKey = /* @__PURE__ */ __name((family, id) => {
252
+ const part = normalizeSegment(id);
253
+ if (!part) throw new TypeError("storage family id is empty after normalisation");
254
+ return family.prefix + part;
255
+ }, "familyKey");
256
+ const api = {
257
+ owner,
258
+ key(...parts) {
259
+ const segments = parts.map(normalizeSegment);
260
+ if (segments.length === 0 || segments.some((segment) => !segment)) {
261
+ throw new TypeError(`storage key parts must be non-empty: ${JSON.stringify(parts)}`);
159
262
  }
160
- } catch {
263
+ return `${prefix}${segments.join(".")}`;
264
+ },
265
+ familyKey,
266
+ isValid,
267
+ read(key, store) {
268
+ assertValid(key);
269
+ const target = resolveStore(key, store);
270
+ return rawGet(target, key);
271
+ },
272
+ write(key, value, store) {
273
+ assertOwned(key);
274
+ const target = resolveStore(key, store);
275
+ return rawSet(target, key, value);
276
+ },
277
+ remove(key, store) {
278
+ assertOwned(key);
279
+ const target = resolveStore(key, store);
280
+ rawRemove(target, key);
281
+ },
282
+ readJSON(key, store) {
283
+ const raw = api.read(key, store);
284
+ if (raw === null) return null;
285
+ try {
286
+ return JSON.parse(raw);
287
+ } catch {
288
+ return null;
289
+ }
290
+ },
291
+ writeJSON(key, value, store) {
292
+ return api.write(key, JSON.stringify(value), store);
293
+ },
294
+ keys(store = "local") {
295
+ return listKeys(store, prefix);
296
+ },
297
+ clearAll({ all = false } = {}) {
298
+ for (const spec of specs) {
299
+ if (!all && !spec.personal) continue;
300
+ rawRemove(spec.store, spec.key);
301
+ }
302
+ for (const family of families) {
303
+ if (!all && !family.personal) continue;
304
+ for (const name of listKeys(family.store, family.prefix)) rawRemove(family.store, name);
305
+ }
306
+ if (all) {
307
+ for (const store of ["local", "session"]) {
308
+ for (const name of listKeys(store, prefix)) rawRemove(store, name);
309
+ }
310
+ for (const name of cookieNames()) if (name.startsWith(prefix)) rawRemove("cookie", name);
311
+ }
312
+ },
313
+ onChange(key, listener, store = "local") {
314
+ assertValid(key);
315
+ if (!hasWindow()) return () => {
316
+ };
317
+ const handler = /* @__PURE__ */ __name((event) => {
318
+ if (event.storageArea !== nativeStorage(store)) return;
319
+ if (event.key === null || event.key === key) listener(event.key === null ? null : event.newValue);
320
+ }, "handler");
321
+ window.addEventListener("storage", handler);
322
+ return () => window.removeEventListener("storage", handler);
161
323
  }
162
- }
324
+ };
325
+ return api;
326
+ }
327
+ __name(createStorage, "createStorage");
328
+ var cfgStorage = createStorage("cfg", {
329
+ keys: CFG_KEYS,
330
+ families: CFG_FAMILIES
331
+ });
332
+
333
+ // src/_api/generated/helpers/auth.ts
334
+ var ACCESS_KEY = "cfg.auth.access_token";
335
+ var REFRESH_KEY = "cfg.auth.refresh_token";
336
+ var API_KEY_KEY = "cfg.auth.api_key";
337
+ var storage = true ? cfgStorage : createStorage2("cfg");
338
+ var isBrowser = typeof window !== "undefined";
339
+ var STORE_OF = {
340
+ localStorage: "local",
341
+ sessionStorage: "session",
342
+ cookie: "cookie"
163
343
  };
164
344
  function backendFor(mode) {
165
- return mode === "cookie" ? cookieBackend : mode === "sessionStorage" ? sessionStorageBackend : localStorageBackend;
345
+ const store = STORE_OF[mode];
346
+ return {
347
+ get: /* @__PURE__ */ __name((key) => storage.read(key, store), "get"),
348
+ set(key, value) {
349
+ if (value === null) storage.remove(key, store);
350
+ else storage.write(key, value, store);
351
+ }
352
+ };
166
353
  }
167
354
  __name(backendFor, "backendFor");
168
355
  var _storageMode = "localStorage";
@@ -351,10 +538,12 @@ var auth = {
351
538
  notifySessionChanged();
352
539
  },
353
540
  clearTokens() {
354
- for (const backend of [localStorageBackend, sessionStorageBackend, cookieBackend]) {
541
+ for (const mode of ["localStorage", "sessionStorage", "cookie"]) {
542
+ const backend = backendFor(mode);
355
543
  backend.set(ACCESS_KEY, null);
356
544
  backend.set(REFRESH_KEY, null);
357
545
  }
546
+ storage.clearAll();
358
547
  notifySessionChanged();
359
548
  },
360
549
  /** Session-aware: token PRESENT and not past its `exp` (or a live refresh
@@ -546,7 +735,7 @@ function dpopEnabled() {
546
735
  }
547
736
  }
548
737
  __name(dpopEnabled, "dpopEnabled");
549
- var _DPOP_DB = "cfg-auth";
738
+ var _DPOP_DB = "cfg.auth.dpop";
550
739
  var _DPOP_STORE = "keys";
551
740
  var _DPOP_KEY_ID = "dpop-ec-p256";
552
741
  function _idbOpen() {
@@ -2881,6 +3070,9 @@ var logAuthFailure = /* @__PURE__ */ __name((log, message, error) => {
2881
3070
  }, "logAuthFailure");
2882
3071
 
2883
3072
  // src/auth/hooks/useGithubAuth.ts
3073
+ var OAUTH_STATE_KEY = CFG_KEYS.oauthState.key;
3074
+ var OAUTH_PROVIDER_KEY = CFG_KEYS.oauthProvider.key;
3075
+ var OAUTH_REMEMBER_KEY = CFG_KEYS.oauthRememberMe.key;
2884
3076
  var useGithubAuth = /* @__PURE__ */ __name((options = {}) => {
2885
3077
  const { sourceUrl, rememberMe = false, onSuccess, onError, onRequires2FA, redirectUrl, skipRedirect = false } = options;
2886
3078
  const router = useCfgRouter();
@@ -2908,9 +3100,9 @@ var useGithubAuth = /* @__PURE__ */ __name((options = {}) => {
2908
3100
  }
2909
3101
  authLogger.info("Redirecting to GitHub...", response.authorization_url);
2910
3102
  if (typeof window !== "undefined") {
2911
- sessionStorage.setItem("oauth_state", response.state);
2912
- sessionStorage.setItem("oauth_provider", "github");
2913
- sessionStorage.setItem("cfg.oauth.remember_me", String(rememberMe));
3103
+ sessionStorage.setItem(OAUTH_STATE_KEY, response.state);
3104
+ sessionStorage.setItem(OAUTH_PROVIDER_KEY, "github");
3105
+ sessionStorage.setItem(OAUTH_REMEMBER_KEY, String(rememberMe));
2914
3106
  }
2915
3107
  window.location.href = response.authorization_url;
2916
3108
  } catch (err) {
@@ -2933,14 +3125,14 @@ var useGithubAuth = /* @__PURE__ */ __name((options = {}) => {
2933
3125
  authLogger.info("Processing GitHub OAuth callback...");
2934
3126
  let rememberMeForSession = false;
2935
3127
  if (typeof window !== "undefined") {
2936
- const storedState = sessionStorage.getItem("oauth_state");
3128
+ const storedState = sessionStorage.getItem(OAUTH_STATE_KEY);
2937
3129
  if (storedState && storedState !== state) {
2938
3130
  throw new Error("Invalid OAuth state - possible CSRF attack");
2939
3131
  }
2940
- rememberMeForSession = sessionStorage.getItem("cfg.oauth.remember_me") === "true";
2941
- sessionStorage.removeItem("oauth_state");
2942
- sessionStorage.removeItem("oauth_provider");
2943
- sessionStorage.removeItem("cfg.oauth.remember_me");
3132
+ rememberMeForSession = sessionStorage.getItem(OAUTH_REMEMBER_KEY) === "true";
3133
+ sessionStorage.removeItem(OAUTH_STATE_KEY);
3134
+ sessionStorage.removeItem(OAUTH_PROVIDER_KEY);
3135
+ sessionStorage.removeItem(OAUTH_REMEMBER_KEY);
2944
3136
  }
2945
3137
  const result = await CfgAccountsOauth.cfgAccountsOauthGithubCallbackCreate({
2946
3138
  body: { code, state, remember_me: rememberMeForSession },
@@ -3052,7 +3244,7 @@ function useSessionStorage(key, initialValue) {
3052
3244
  const key2 = keys[i];
3053
3245
  if (key2) {
3054
3246
  sessionStorage.removeItem(key2);
3055
- sessionStorage.removeItem(`${key2}_timestamp`);
3247
+ sessionStorage.removeItem(`${key2}_ts`);
3056
3248
  }
3057
3249
  } catch {
3058
3250
  }
@@ -3082,7 +3274,7 @@ function useSessionStorage(key, initialValue) {
3082
3274
  authLogger.warn(`Data size too large for key "${key}", removing key`);
3083
3275
  try {
3084
3276
  window.sessionStorage.removeItem(key);
3085
- window.sessionStorage.removeItem(`${key}_timestamp`);
3277
+ window.sessionStorage.removeItem(`${key}_ts`);
3086
3278
  } catch {
3087
3279
  }
3088
3280
  setStoredValue(valueToStore);
@@ -3092,20 +3284,20 @@ function useSessionStorage(key, initialValue) {
3092
3284
  if (typeof window !== "undefined") {
3093
3285
  try {
3094
3286
  window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
3095
- window.sessionStorage.setItem(`${key}_timestamp`, Date.now().toString());
3287
+ window.sessionStorage.setItem(`${key}_ts`, Date.now().toString());
3096
3288
  } catch (storageError) {
3097
3289
  if (isQuotaExceededError(storageError)) {
3098
3290
  authLogger.warn("sessionStorage quota exceeded, clearing old data...");
3099
3291
  clearOldData();
3100
3292
  try {
3101
3293
  window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
3102
- window.sessionStorage.setItem(`${key}_timestamp`, Date.now().toString());
3294
+ window.sessionStorage.setItem(`${key}_ts`, Date.now().toString());
3103
3295
  } catch (retryError) {
3104
3296
  authLogger.error(`Failed to set sessionStorage key "${key}" after clearing old data:`, retryError);
3105
3297
  try {
3106
3298
  forceClearAll();
3107
3299
  window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
3108
- window.sessionStorage.setItem(`${key}_timestamp`, Date.now().toString());
3300
+ window.sessionStorage.setItem(`${key}_ts`, Date.now().toString());
3109
3301
  } catch (finalError) {
3110
3302
  authLogger.error(`Failed to set sessionStorage key "${key}" after force clearing:`, finalError);
3111
3303
  setStoredValue(valueToStore);
@@ -3128,14 +3320,14 @@ function useSessionStorage(key, initialValue) {
3128
3320
  if (typeof window !== "undefined") {
3129
3321
  try {
3130
3322
  window.sessionStorage.removeItem(key);
3131
- window.sessionStorage.removeItem(`${key}_timestamp`);
3323
+ window.sessionStorage.removeItem(`${key}_ts`);
3132
3324
  } catch (removeError) {
3133
3325
  if (isQuotaExceededError(removeError)) {
3134
3326
  authLogger.warn("sessionStorage quota exceeded during removal, clearing old data...");
3135
3327
  clearOldData();
3136
3328
  try {
3137
3329
  window.sessionStorage.removeItem(key);
3138
- window.sessionStorage.removeItem(`${key}_timestamp`);
3330
+ window.sessionStorage.removeItem(`${key}_ts`);
3139
3331
  } catch (retryError) {
3140
3332
  authLogger.error(`Failed to remove sessionStorage key "${key}" after clearing:`, retryError);
3141
3333
  forceClearAll();
@@ -3154,7 +3346,7 @@ function useSessionStorage(key, initialValue) {
3154
3346
  __name(useSessionStorage, "useSessionStorage");
3155
3347
 
3156
3348
  // src/auth/hooks/useAuthRedirect.ts
3157
- var AUTH_REDIRECT_KEY = "auth_redirect_url";
3349
+ var AUTH_REDIRECT_KEY = CFG_KEYS.redirectUrl.key;
3158
3350
  var getRedirectFromStorage = /* @__PURE__ */ __name(() => {
3159
3351
  if (typeof window === "undefined") return "";
3160
3352
  try {
@@ -3168,7 +3360,7 @@ var clearRedirectFromStorage = /* @__PURE__ */ __name(() => {
3168
3360
  if (typeof window === "undefined") return;
3169
3361
  try {
3170
3362
  window.sessionStorage.removeItem(AUTH_REDIRECT_KEY);
3171
- window.sessionStorage.removeItem(`${AUTH_REDIRECT_KEY}_timestamp`);
3363
+ window.sessionStorage.removeItem(`${AUTH_REDIRECT_KEY}_ts`);
3172
3364
  } catch {
3173
3365
  }
3174
3366
  }, "clearRedirectFromStorage");
@@ -3584,7 +3776,7 @@ function useLocalStorage(key, initialValue) {
3584
3776
  const key2 = keys[i];
3585
3777
  if (key2) {
3586
3778
  localStorage.removeItem(key2);
3587
- localStorage.removeItem(`${key2}_timestamp`);
3779
+ localStorage.removeItem(`${key2}_ts`);
3588
3780
  }
3589
3781
  } catch {
3590
3782
  }
@@ -3614,7 +3806,7 @@ function useLocalStorage(key, initialValue) {
3614
3806
  authLogger.warn(`Data size too large for key "${key}", removing key`);
3615
3807
  try {
3616
3808
  window.localStorage.removeItem(key);
3617
- window.localStorage.removeItem(`${key}_timestamp`);
3809
+ window.localStorage.removeItem(`${key}_ts`);
3618
3810
  } catch {
3619
3811
  }
3620
3812
  setStoredValue(valueToStore);
@@ -3628,7 +3820,7 @@ function useLocalStorage(key, initialValue) {
3628
3820
  } else {
3629
3821
  window.localStorage.setItem(key, JSON.stringify(valueToStore));
3630
3822
  }
3631
- window.localStorage.setItem(`${key}_timestamp`, Date.now().toString());
3823
+ window.localStorage.setItem(`${key}_ts`, Date.now().toString());
3632
3824
  } catch (storageError) {
3633
3825
  if (isQuotaExceededError(storageError)) {
3634
3826
  authLogger.warn("localStorage quota exceeded, clearing old data...");
@@ -3639,7 +3831,7 @@ function useLocalStorage(key, initialValue) {
3639
3831
  } else {
3640
3832
  window.localStorage.setItem(key, JSON.stringify(valueToStore));
3641
3833
  }
3642
- window.localStorage.setItem(`${key}_timestamp`, Date.now().toString());
3834
+ window.localStorage.setItem(`${key}_ts`, Date.now().toString());
3643
3835
  } catch (retryError) {
3644
3836
  authLogger.error(`Failed to set localStorage key "${key}" after clearing old data:`, retryError);
3645
3837
  try {
@@ -3649,7 +3841,7 @@ function useLocalStorage(key, initialValue) {
3649
3841
  } else {
3650
3842
  window.localStorage.setItem(key, JSON.stringify(valueToStore));
3651
3843
  }
3652
- window.localStorage.setItem(`${key}_timestamp`, Date.now().toString());
3844
+ window.localStorage.setItem(`${key}_ts`, Date.now().toString());
3653
3845
  } catch (finalError) {
3654
3846
  authLogger.error(`Failed to set localStorage key "${key}" after force clearing:`, finalError);
3655
3847
  setStoredValue(valueToStore);
@@ -3672,14 +3864,14 @@ function useLocalStorage(key, initialValue) {
3672
3864
  if (typeof window !== "undefined") {
3673
3865
  try {
3674
3866
  window.localStorage.removeItem(key);
3675
- window.localStorage.removeItem(`${key}_timestamp`);
3867
+ window.localStorage.removeItem(`${key}_ts`);
3676
3868
  } catch (removeError) {
3677
3869
  if (isQuotaExceededError(removeError)) {
3678
3870
  authLogger.warn("localStorage quota exceeded during removal, clearing old data...");
3679
3871
  clearOldData();
3680
3872
  try {
3681
3873
  window.localStorage.removeItem(key);
3682
- window.localStorage.removeItem(`${key}_timestamp`);
3874
+ window.localStorage.removeItem(`${key}_ts`);
3683
3875
  } catch (retryError) {
3684
3876
  authLogger.error(`Failed to remove localStorage key "${key}" after clearing:`, retryError);
3685
3877
  forceClearAll();
@@ -3747,7 +3939,7 @@ function useBase64() {
3747
3939
  __name(useBase64, "useBase64");
3748
3940
 
3749
3941
  // src/auth/hooks/useProfileCache.ts
3750
- var CACHE_KEY = "user_profile_cache";
3942
+ var CACHE_KEY = CFG_KEYS.profileCache.key;
3751
3943
  var CACHE_VERSION = 1;
3752
3944
  var DEFAULT_TTL = 144e5;
3753
3945
  function getCachedProfile() {
@@ -4400,7 +4592,7 @@ var resolveAuthRoutes = /* @__PURE__ */ __name((routes) => ({
4400
4592
  defaultCallback: routes?.defaultCallback || defaultRoutes.defaultCallback,
4401
4593
  defaultAuthCallback: routes?.defaultAuthCallback || routes?.auth || defaultRoutes.defaultAuthCallback
4402
4594
  }), "resolveAuthRoutes");
4403
- var EMAIL_STORAGE_KEY = "auth_email";
4595
+ var EMAIL_STORAGE_KEY = CFG_KEYS.email.key;
4404
4596
  var AuthContext = createContext2(void 0);
4405
4597
  var AuthProviderInternal = /* @__PURE__ */ __name(({ children, config }) => {
4406
4598
  const accounts = useAccountsContext();