@civic/auth 0.6.0 → 0.6.1-beta.2

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 (127) hide show
  1. package/dist/nextjs/config.d.ts.map +1 -1
  2. package/dist/nextjs/config.js +3 -1
  3. package/dist/nextjs/config.js.map +1 -1
  4. package/dist/nextjs/hooks/useUserCookie.d.ts.map +1 -1
  5. package/dist/nextjs/hooks/useUserCookie.js.map +1 -1
  6. package/dist/nextjs/providers/NextAuthProvider.d.ts.map +1 -1
  7. package/dist/nextjs/providers/NextAuthProvider.js +1 -0
  8. package/dist/nextjs/providers/NextAuthProvider.js.map +1 -1
  9. package/dist/shared/components/CivicAuthIframeContainer.js +1 -1
  10. package/dist/shared/components/CivicAuthIframeContainer.js.map +1 -1
  11. package/dist/shared/hooks/useSignIn.d.ts +9 -4
  12. package/dist/shared/hooks/useSignIn.d.ts.map +1 -1
  13. package/dist/shared/hooks/useSignIn.js +75 -42
  14. package/dist/shared/hooks/useSignIn.js.map +1 -1
  15. package/dist/shared/lib/BrowserAuthenticationRefresher.d.ts +7 -1
  16. package/dist/shared/lib/BrowserAuthenticationRefresher.d.ts.map +1 -1
  17. package/dist/shared/lib/BrowserAuthenticationRefresher.js +15 -2
  18. package/dist/shared/lib/BrowserAuthenticationRefresher.js.map +1 -1
  19. package/dist/shared/lib/util.d.ts +1 -1
  20. package/dist/shared/lib/util.d.ts.map +1 -1
  21. package/dist/shared/lib/util.js +6 -1
  22. package/dist/shared/lib/util.js.map +1 -1
  23. package/dist/shared/providers/AuthContext.d.ts +7 -2
  24. package/dist/shared/providers/AuthContext.d.ts.map +1 -1
  25. package/dist/shared/providers/AuthContext.js.map +1 -1
  26. package/dist/shared/providers/UserProvider.d.ts +5 -1
  27. package/dist/shared/providers/UserProvider.d.ts.map +1 -1
  28. package/dist/shared/providers/UserProvider.js.map +1 -1
  29. package/dist/shared/version.d.ts +1 -1
  30. package/dist/shared/version.d.ts.map +1 -1
  31. package/dist/shared/version.js +1 -1
  32. package/dist/shared/version.js.map +1 -1
  33. package/dist/vanillajs/auth/AuthenticationEvents.d.ts.map +1 -1
  34. package/dist/vanillajs/auth/AuthenticationEvents.js +2 -2
  35. package/dist/vanillajs/auth/AuthenticationEvents.js.map +1 -1
  36. package/dist/vanillajs/auth/CivicAuth.d.ts +111 -92
  37. package/dist/vanillajs/auth/CivicAuth.d.ts.map +1 -1
  38. package/dist/vanillajs/auth/CivicAuth.js +474 -321
  39. package/dist/vanillajs/auth/CivicAuth.js.map +1 -1
  40. package/dist/vanillajs/auth/SessionManager.d.ts +40 -9
  41. package/dist/vanillajs/auth/SessionManager.d.ts.map +1 -1
  42. package/dist/vanillajs/auth/SessionManager.js +96 -61
  43. package/dist/vanillajs/auth/SessionManager.js.map +1 -1
  44. package/dist/vanillajs/auth/TokenRefresher.d.ts +54 -0
  45. package/dist/vanillajs/auth/TokenRefresher.d.ts.map +1 -0
  46. package/dist/vanillajs/auth/TokenRefresher.js +166 -0
  47. package/dist/vanillajs/auth/TokenRefresher.js.map +1 -0
  48. package/dist/vanillajs/auth/config/ConfigProcessor.d.ts +6 -0
  49. package/dist/vanillajs/auth/config/ConfigProcessor.d.ts.map +1 -0
  50. package/dist/vanillajs/auth/config/ConfigProcessor.js +59 -0
  51. package/dist/vanillajs/auth/config/ConfigProcessor.js.map +1 -0
  52. package/dist/vanillajs/auth/handlers/IframeAuthHandler.d.ts +40 -0
  53. package/dist/vanillajs/auth/handlers/IframeAuthHandler.d.ts.map +1 -0
  54. package/dist/vanillajs/auth/handlers/IframeAuthHandler.js +388 -0
  55. package/dist/vanillajs/auth/handlers/IframeAuthHandler.js.map +1 -0
  56. package/dist/vanillajs/auth/handlers/MessageHandler.d.ts +170 -0
  57. package/dist/vanillajs/auth/handlers/MessageHandler.d.ts.map +1 -0
  58. package/dist/vanillajs/auth/handlers/MessageHandler.js +367 -0
  59. package/dist/vanillajs/auth/handlers/MessageHandler.js.map +1 -0
  60. package/dist/vanillajs/auth/handlers/OAuthCallbackHandler.d.ts +90 -0
  61. package/dist/vanillajs/auth/handlers/OAuthCallbackHandler.d.ts.map +1 -0
  62. package/dist/vanillajs/auth/handlers/OAuthCallbackHandler.js +301 -0
  63. package/dist/vanillajs/auth/handlers/OAuthCallbackHandler.js.map +1 -0
  64. package/dist/vanillajs/auth/handlers/PopupHandler.d.ts +108 -0
  65. package/dist/vanillajs/auth/handlers/PopupHandler.d.ts.map +1 -0
  66. package/dist/vanillajs/auth/handlers/PopupHandler.js +333 -0
  67. package/dist/vanillajs/auth/handlers/PopupHandler.js.map +1 -0
  68. package/dist/vanillajs/auth/types/AuthTypes.d.ts +128 -0
  69. package/dist/vanillajs/auth/types/AuthTypes.d.ts.map +1 -0
  70. package/dist/vanillajs/auth/types/AuthTypes.js +40 -0
  71. package/dist/vanillajs/auth/types/AuthTypes.js.map +1 -0
  72. package/dist/vanillajs/iframe/IframeManager.d.ts +115 -0
  73. package/dist/vanillajs/iframe/IframeManager.d.ts.map +1 -0
  74. package/dist/vanillajs/iframe/IframeManager.js +614 -0
  75. package/dist/vanillajs/iframe/IframeManager.js.map +1 -0
  76. package/dist/vanillajs/iframe/IframeResizer.d.ts +15 -0
  77. package/dist/vanillajs/iframe/IframeResizer.d.ts.map +1 -0
  78. package/dist/vanillajs/iframe/IframeResizer.js +127 -0
  79. package/dist/vanillajs/iframe/IframeResizer.js.map +1 -0
  80. package/dist/vanillajs/index.d.ts +8 -7
  81. package/dist/vanillajs/index.d.ts.map +1 -1
  82. package/dist/vanillajs/index.js +10 -7
  83. package/dist/vanillajs/index.js.map +1 -1
  84. package/dist/vanillajs/services/ApiService.d.ts.map +1 -1
  85. package/dist/vanillajs/services/ApiService.js +2 -2
  86. package/dist/vanillajs/services/ApiService.js.map +1 -1
  87. package/dist/vanillajs/types/index.d.ts +17 -12
  88. package/dist/vanillajs/types/index.d.ts.map +1 -1
  89. package/dist/vanillajs/types/index.js +15 -10
  90. package/dist/vanillajs/types/index.js.map +1 -1
  91. package/dist/vanillajs/ui/LoadingComponents.d.ts +51 -0
  92. package/dist/vanillajs/ui/LoadingComponents.d.ts.map +1 -0
  93. package/dist/vanillajs/ui/LoadingComponents.js +363 -0
  94. package/dist/vanillajs/ui/LoadingComponents.js.map +1 -0
  95. package/dist/vanillajs/utils/auth-utils.d.ts +2 -1
  96. package/dist/vanillajs/utils/auth-utils.d.ts.map +1 -1
  97. package/dist/vanillajs/utils/auth-utils.js +6 -3
  98. package/dist/vanillajs/utils/auth-utils.js.map +1 -1
  99. package/dist/vanillajs/utils/logger.d.ts +16 -15
  100. package/dist/vanillajs/utils/logger.d.ts.map +1 -1
  101. package/dist/vanillajs/utils/logger.js +35 -19
  102. package/dist/vanillajs/utils/logger.js.map +1 -1
  103. package/package.json +1 -1
  104. package/dist/vanillajs/iframe/domUtils.d.ts +0 -4
  105. package/dist/vanillajs/iframe/domUtils.d.ts.map +0 -1
  106. package/dist/vanillajs/iframe/domUtils.js +0 -25
  107. package/dist/vanillajs/iframe/domUtils.js.map +0 -1
  108. package/dist/vanillajs/storage/BrowserCookieStorageAdapter.d.ts +0 -19
  109. package/dist/vanillajs/storage/BrowserCookieStorageAdapter.d.ts.map +0 -1
  110. package/dist/vanillajs/storage/BrowserCookieStorageAdapter.js +0 -101
  111. package/dist/vanillajs/storage/BrowserCookieStorageAdapter.js.map +0 -1
  112. package/dist/vanillajs/storage/BrowserLocalStorageAdapter.d.ts +0 -9
  113. package/dist/vanillajs/storage/BrowserLocalStorageAdapter.d.ts.map +0 -1
  114. package/dist/vanillajs/storage/BrowserLocalStorageAdapter.js +0 -36
  115. package/dist/vanillajs/storage/BrowserLocalStorageAdapter.js.map +0 -1
  116. package/dist/vanillajs/storage/InMemoryStorageAdapter.d.ts +0 -9
  117. package/dist/vanillajs/storage/InMemoryStorageAdapter.d.ts.map +0 -1
  118. package/dist/vanillajs/storage/InMemoryStorageAdapter.js +0 -16
  119. package/dist/vanillajs/storage/InMemoryStorageAdapter.js.map +0 -1
  120. package/dist/vanillajs/storage/StorageAdapter.d.ts +0 -15
  121. package/dist/vanillajs/storage/StorageAdapter.d.ts.map +0 -1
  122. package/dist/vanillajs/storage/StorageAdapter.js +0 -16
  123. package/dist/vanillajs/storage/StorageAdapter.js.map +0 -1
  124. package/dist/vanillajs/utils/page-handlers.d.ts +0 -29
  125. package/dist/vanillajs/utils/page-handlers.d.ts.map +0 -1
  126. package/dist/vanillajs/utils/page-handlers.js +0 -165
  127. package/dist/vanillajs/utils/page-handlers.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"domUtils.d.ts","sourceRoot":"","sources":["../../../src/vanillajs/iframe/domUtils.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,WAAW,EACtB,EAAE,CAAC,EAAE,MAAM,GACV,iBAAiB,CAWnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAQrE;AAKD,OAAO,EAAE,CAAC"}
@@ -1,25 +0,0 @@
1
- // Placeholder for DOM Utilities (Task C)
2
- // This file will contain helper functions for DOM manipulation related to the iframe.
3
- export function createIframe(url, container, id) {
4
- const iframe = document.createElement("iframe");
5
- iframe.id = id || "civic-auth-iframe";
6
- iframe.src = url;
7
- // Basic styling, can be expanded
8
- iframe.style.border = "none";
9
- iframe.style.width = "100%";
10
- iframe.style.height = "100%";
11
- container.appendChild(iframe);
12
- return iframe;
13
- }
14
- export function removeIframe(iframe) {
15
- const element = typeof iframe === "string"
16
- ? document.getElementById(iframe)
17
- : iframe;
18
- if (element && element.parentNode) {
19
- element.parentNode.removeChild(element);
20
- }
21
- }
22
- // ... other DOM utility functions ...
23
- // Placeholder for domUtils.ts
24
- export {};
25
- //# sourceMappingURL=domUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"domUtils.js","sourceRoot":"","sources":["../../../src/vanillajs/iframe/domUtils.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,sFAAsF;AAEtF,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,SAAsB,EACtB,EAAW;IAEX,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,mBAAmB,CAAC;IACtC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,iCAAiC;IACjC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAE7B,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAkC;IAC7D,MAAM,OAAO,GACX,OAAO,MAAM,KAAK,QAAQ;QACxB,CAAC,CAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAuB;QACxD,CAAC,CAAC,MAAM,CAAC;IACb,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,sCAAsC;AAEtC,8BAA8B;AAC9B,OAAO,EAAE,CAAC","sourcesContent":["// Placeholder for DOM Utilities (Task C)\n// This file will contain helper functions for DOM manipulation related to the iframe.\n\nexport function createIframe(\n url: string,\n container: HTMLElement,\n id?: string,\n): HTMLIFrameElement {\n const iframe = document.createElement(\"iframe\");\n iframe.id = id || \"civic-auth-iframe\";\n iframe.src = url;\n // Basic styling, can be expanded\n iframe.style.border = \"none\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n\n container.appendChild(iframe);\n return iframe;\n}\n\nexport function removeIframe(iframe: HTMLIFrameElement | string): void {\n const element =\n typeof iframe === \"string\"\n ? (document.getElementById(iframe) as HTMLIFrameElement)\n : iframe;\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n}\n\n// ... other DOM utility functions ...\n\n// Placeholder for domUtils.ts\nexport {};\n"]}
@@ -1,19 +0,0 @@
1
- import type { StorageAdapter } from "./StorageAdapter.js";
2
- interface CookieOptions {
3
- days?: number;
4
- maxAge?: number;
5
- path?: string;
6
- secure?: boolean;
7
- httpOnly?: boolean;
8
- sameSite?: "Lax" | "Strict" | "None";
9
- }
10
- export declare class BrowserCookieStorageAdapter implements StorageAdapter {
11
- private defaultCookieOptions;
12
- private logger;
13
- constructor(defaultOptions?: CookieOptions);
14
- getItem(key: string): Promise<string | null>;
15
- setItem(key: string, value: string, itemOptions?: CookieOptions): Promise<void>;
16
- removeItem(key: string, itemOptions?: Pick<CookieOptions, "path">): Promise<void>;
17
- }
18
- export {};
19
- //# sourceMappingURL=BrowserCookieStorageAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserCookieStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/vanillajs/storage/BrowserCookieStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AA0DD,qBAAa,2BAA4B,YAAW,cAAc;IAChE,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,MAAM,CAAsB;gBAExB,cAAc,GAAE,aAAkB;IAQxC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAU5C,OAAO,CACX,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,aAAa,GAC1B,OAAO,CAAC,IAAI,CAAC;IAqBV,UAAU,CACd,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC;CAUjB"}
@@ -1,101 +0,0 @@
1
- import { getCurrentLogger } from "../utils/logger.js";
2
- // Updated setCookie to handle more options
3
- function setCookie(name, value, options = {}) {
4
- if (typeof document === "undefined")
5
- return;
6
- let cookieString = name + "=" + (value || "");
7
- if (options.maxAge !== undefined) {
8
- cookieString += "; Max-Age=" + options.maxAge;
9
- }
10
- else if (options.days !== undefined) {
11
- const date = new Date();
12
- date.setTime(date.getTime() + options.days * 24 * 60 * 60 * 1000);
13
- cookieString += "; expires=" + date.toUTCString();
14
- }
15
- cookieString += "; path=" + (options.path || "/");
16
- if (options.secure) {
17
- cookieString += "; Secure";
18
- }
19
- // HttpOnly cannot be set from client-side JavaScript.
20
- // if (options.httpOnly) {
21
- // cookieString += '; HttpOnly';
22
- // }
23
- if (options.sameSite) {
24
- cookieString += "; SameSite=" + options.sameSite;
25
- }
26
- else {
27
- cookieString += "; SameSite=Lax"; // Default SameSite
28
- }
29
- document.cookie = cookieString;
30
- }
31
- function getCookie(name) {
32
- if (typeof document === "undefined")
33
- return null;
34
- const nameEQ = name + "=";
35
- const ca = document.cookie.split(";");
36
- for (let i = 0; i < ca.length; i++) {
37
- let c = ca[i];
38
- if (c) {
39
- while (c.charAt(0) === " ")
40
- c = c.substring(1, c.length);
41
- if (c.indexOf(nameEQ) === 0)
42
- return c.substring(nameEQ.length, c.length);
43
- }
44
- }
45
- return null;
46
- }
47
- function eraseCookie(name, path = "/") {
48
- if (typeof document === "undefined")
49
- return;
50
- // Set expiry to the past and include path and SameSite for robust deletion
51
- document.cookie =
52
- name +
53
- "=; Path=" +
54
- path +
55
- "; Expires=Thu, 01 Jan 1970 00:00:01 GMT; SameSite=Lax";
56
- }
57
- export class BrowserCookieStorageAdapter {
58
- defaultCookieOptions;
59
- logger = getCurrentLogger();
60
- constructor(defaultOptions = {}) {
61
- this.defaultCookieOptions = {
62
- path: "/",
63
- sameSite: "Lax",
64
- ...defaultOptions,
65
- };
66
- }
67
- async getItem(key) {
68
- if (typeof document !== "undefined") {
69
- return getCookie(key);
70
- }
71
- this.logger.warn("CivicAuth: Cookies not available (document is undefined). Cannot get item.");
72
- return null;
73
- }
74
- async setItem(key, value, itemOptions) {
75
- if (typeof document !== "undefined") {
76
- const optionsToUse = { ...this.defaultCookieOptions, ...itemOptions };
77
- // HttpOnly cookies cannot be effectively managed (set/read/deleted reliably) from client-side JS if they are truly HttpOnly.
78
- // The browser will prevent JS from accessing them. If set server-side, JS can't touch them.
79
- // If we try to set HttpOnly here, it might be ignored by the browser or not behave as expected for a client-side adapter.
80
- // We should primarily focus on attributes settable from client-side JS.
81
- // If httpOnly is true in options, we might log a warning or ignore it.
82
- if (optionsToUse.httpOnly) {
83
- this.logger.warn(`CivicAuth: Attempting to set HttpOnly cookie '${key}' from client-side. This attribute is typically managed server-side and may not be effective here.`);
84
- }
85
- setCookie(key, value, optionsToUse);
86
- }
87
- else {
88
- this.logger.warn("CivicAuth: Cookies not available (document is undefined). Item not set.");
89
- }
90
- }
91
- async removeItem(key, itemOptions) {
92
- if (typeof document !== "undefined") {
93
- const path = itemOptions?.path || this.defaultCookieOptions.path || "/";
94
- eraseCookie(key, path);
95
- }
96
- else {
97
- this.logger.warn("CivicAuth: Cookies not available (document is undefined). Item not removed.");
98
- }
99
- }
100
- }
101
- //# sourceMappingURL=BrowserCookieStorageAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserCookieStorageAdapter.js","sourceRoot":"","sources":["../../../src/vanillajs/storage/BrowserCookieStorageAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StorageAdapter } from \"./StorageAdapter.js\";\nimport { getCurrentLogger } from \"../utils/logger.js\";\n\ninterface CookieOptions {\n days?: number;\n maxAge?: number; // seconds\n path?: string;\n secure?: boolean;\n httpOnly?: boolean; // Note: httpOnly cookies cannot be set or read by client-side JS after being set.\n sameSite?: \"Lax\" | \"Strict\" | \"None\";\n}\n\n// Updated setCookie to handle more options\nfunction setCookie(name: string, value: string, options: CookieOptions = {}) {\n if (typeof document === \"undefined\") return;\n\n let cookieString = name + \"=\" + (value || \"\");\n\n if (options.maxAge !== undefined) {\n cookieString += \"; Max-Age=\" + options.maxAge;\n } else if (options.days !== undefined) {\n const date = new Date();\n date.setTime(date.getTime() + options.days * 24 * 60 * 60 * 1000);\n cookieString += \"; expires=\" + date.toUTCString();\n }\n\n cookieString += \"; path=\" + (options.path || \"/\");\n\n if (options.secure) {\n cookieString += \"; Secure\";\n }\n // HttpOnly cannot be set from client-side JavaScript.\n // if (options.httpOnly) {\n // cookieString += '; HttpOnly';\n // }\n if (options.sameSite) {\n cookieString += \"; SameSite=\" + options.sameSite;\n } else {\n cookieString += \"; SameSite=Lax\"; // Default SameSite\n }\n\n document.cookie = cookieString;\n}\n\nfunction getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n if (c) {\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n }\n return null;\n}\n\nfunction eraseCookie(name: string, path: string = \"/\") {\n if (typeof document === \"undefined\") return;\n // Set expiry to the past and include path and SameSite for robust deletion\n document.cookie =\n name +\n \"=; Path=\" +\n path +\n \"; Expires=Thu, 01 Jan 1970 00:00:01 GMT; SameSite=Lax\";\n}\n\nexport class BrowserCookieStorageAdapter implements StorageAdapter {\n private defaultCookieOptions: CookieOptions;\n private logger = getCurrentLogger();\n\n constructor(defaultOptions: CookieOptions = {}) {\n this.defaultCookieOptions = {\n path: \"/\",\n sameSite: \"Lax\",\n ...defaultOptions,\n };\n }\n\n async getItem(key: string): Promise<string | null> {\n if (typeof document !== \"undefined\") {\n return getCookie(key);\n }\n this.logger.warn(\n \"CivicAuth: Cookies not available (document is undefined). Cannot get item.\",\n );\n return null;\n }\n\n async setItem(\n key: string,\n value: string,\n itemOptions?: CookieOptions,\n ): Promise<void> {\n if (typeof document !== \"undefined\") {\n const optionsToUse = { ...this.defaultCookieOptions, ...itemOptions };\n // HttpOnly cookies cannot be effectively managed (set/read/deleted reliably) from client-side JS if they are truly HttpOnly.\n // The browser will prevent JS from accessing them. If set server-side, JS can't touch them.\n // If we try to set HttpOnly here, it might be ignored by the browser or not behave as expected for a client-side adapter.\n // We should primarily focus on attributes settable from client-side JS.\n // If httpOnly is true in options, we might log a warning or ignore it.\n if (optionsToUse.httpOnly) {\n this.logger.warn(\n `CivicAuth: Attempting to set HttpOnly cookie '${key}' from client-side. This attribute is typically managed server-side and may not be effective here.`,\n );\n }\n setCookie(key, value, optionsToUse);\n } else {\n this.logger.warn(\n \"CivicAuth: Cookies not available (document is undefined). Item not set.\",\n );\n }\n }\n\n async removeItem(\n key: string,\n itemOptions?: Pick<CookieOptions, \"path\">,\n ): Promise<void> {\n if (typeof document !== \"undefined\") {\n const path = itemOptions?.path || this.defaultCookieOptions.path || \"/\";\n eraseCookie(key, path);\n } else {\n this.logger.warn(\n \"CivicAuth: Cookies not available (document is undefined). Item not removed.\",\n );\n }\n }\n}\n"]}
@@ -1,9 +0,0 @@
1
- import type { StorageAdapter } from "./StorageAdapter.js";
2
- export declare class BrowserLocalStorageAdapter implements StorageAdapter {
3
- private logger;
4
- getItem(key: string): Promise<string | null>;
5
- setItem(key: string, value: string): Promise<void>;
6
- removeItem(key: string): Promise<void>;
7
- clear(): Promise<void>;
8
- }
9
- //# sourceMappingURL=BrowserLocalStorageAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserLocalStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/vanillajs/storage/BrowserLocalStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,qBAAa,0BAA2B,YAAW,cAAc;IAC/D,OAAO,CAAC,MAAM,CAAsB;IAE9B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
@@ -1,36 +0,0 @@
1
- import { getCurrentLogger } from "../utils/logger.js";
2
- export class BrowserLocalStorageAdapter {
3
- logger = getCurrentLogger();
4
- async getItem(key) {
5
- if (typeof window !== "undefined" && window.localStorage) {
6
- return window.localStorage.getItem(key);
7
- }
8
- this.logger.warn("LocalStorage is not available. Returning null.");
9
- return null;
10
- }
11
- async setItem(key, value) {
12
- if (typeof window !== "undefined" && window.localStorage) {
13
- window.localStorage.setItem(key, value);
14
- }
15
- else {
16
- this.logger.warn("LocalStorage is not available. Item not set.");
17
- }
18
- }
19
- async removeItem(key) {
20
- if (typeof window !== "undefined" && window.localStorage) {
21
- window.localStorage.removeItem(key);
22
- }
23
- else {
24
- this.logger.warn("LocalStorage is not available. Item not removed.");
25
- }
26
- }
27
- async clear() {
28
- if (typeof window !== "undefined" && window.localStorage) {
29
- window.localStorage.clear();
30
- }
31
- else {
32
- this.logger.warn("LocalStorage is not available. Storage not cleared.");
33
- }
34
- }
35
- }
36
- //# sourceMappingURL=BrowserLocalStorageAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserLocalStorageAdapter.js","sourceRoot":"","sources":["../../../src/vanillajs/storage/BrowserLocalStorageAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,OAAO,0BAA0B;IAC7B,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAEpC,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACzD,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa;QACtC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACzD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACzD,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACzD,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;CACF","sourcesContent":["import type { StorageAdapter } from \"./StorageAdapter.js\";\nimport { getCurrentLogger } from \"../utils/logger.js\";\n\nexport class BrowserLocalStorageAdapter implements StorageAdapter {\n private logger = getCurrentLogger();\n\n async getItem(key: string): Promise<string | null> {\n if (typeof window !== \"undefined\" && window.localStorage) {\n return window.localStorage.getItem(key);\n }\n this.logger.warn(\"LocalStorage is not available. Returning null.\");\n return null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (typeof window !== \"undefined\" && window.localStorage) {\n window.localStorage.setItem(key, value);\n } else {\n this.logger.warn(\"LocalStorage is not available. Item not set.\");\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (typeof window !== \"undefined\" && window.localStorage) {\n window.localStorage.removeItem(key);\n } else {\n this.logger.warn(\"LocalStorage is not available. Item not removed.\");\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window !== \"undefined\" && window.localStorage) {\n window.localStorage.clear();\n } else {\n this.logger.warn(\"LocalStorage is not available. Storage not cleared.\");\n }\n }\n}\n"]}
@@ -1,9 +0,0 @@
1
- import type { StorageAdapter } from "./StorageAdapter.js";
2
- export declare class InMemoryStorageAdapter implements StorageAdapter {
3
- private store;
4
- getItem(key: string): Promise<string | null>;
5
- setItem(key: string, value: string): Promise<void>;
6
- removeItem(key: string): Promise<void>;
7
- clear(): Promise<void>;
8
- }
9
- //# sourceMappingURL=InMemoryStorageAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InMemoryStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/vanillajs/storage/InMemoryStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,KAAK,CAAkC;IAEzC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,16 +0,0 @@
1
- export class InMemoryStorageAdapter {
2
- store = new Map();
3
- async getItem(key) {
4
- return this.store.get(key) || null;
5
- }
6
- async setItem(key, value) {
7
- this.store.set(key, value);
8
- }
9
- async removeItem(key) {
10
- this.store.delete(key);
11
- }
12
- async clear() {
13
- this.store.clear();
14
- }
15
- }
16
- //# sourceMappingURL=InMemoryStorageAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InMemoryStorageAdapter.js","sourceRoot":"","sources":["../../../src/vanillajs/storage/InMemoryStorageAdapter.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,sBAAsB;IACzB,KAAK,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF","sourcesContent":["import type { StorageAdapter } from \"./StorageAdapter.js\";\n\nexport class InMemoryStorageAdapter implements StorageAdapter {\n private store: Map<string, string> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n return this.store.get(key) || null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.store.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.store.delete(key);\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n}\n"]}
@@ -1,15 +0,0 @@
1
- export interface StorageAdapter {
2
- getItem(key: string): Promise<string | null>;
3
- setItem(key: string, value: string): Promise<void>;
4
- removeItem(key: string): Promise<void>;
5
- clear?: () => Promise<void>;
6
- }
7
- import type { AuthStorage } from "../../types.js";
8
- export declare class StorageAdapterToAuthStorage implements AuthStorage {
9
- private adapter;
10
- constructor(adapter: StorageAdapter);
11
- get(key: string): Promise<string | null>;
12
- set(key: string, value: string): Promise<void>;
13
- delete(key: string): Promise<void>;
14
- }
15
- //# sourceMappingURL=StorageAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/vanillajs/storage/StorageAdapter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,qBAAa,2BAA4B,YAAW,WAAW;IACjD,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAErC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzC"}
@@ -1,16 +0,0 @@
1
- export class StorageAdapterToAuthStorage {
2
- adapter;
3
- constructor(adapter) {
4
- this.adapter = adapter;
5
- }
6
- async get(key) {
7
- return this.adapter.getItem(key);
8
- }
9
- async set(key, value) {
10
- await this.adapter.setItem(key, value);
11
- }
12
- async delete(key) {
13
- await this.adapter.removeItem(key);
14
- }
15
- }
16
- //# sourceMappingURL=StorageAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StorageAdapter.js","sourceRoot":"","sources":["../../../src/vanillajs/storage/StorageAdapter.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,2BAA2B;IAClB;IAApB,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACF","sourcesContent":["export interface StorageAdapter {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n clear?: () => Promise<void>; // Optional: some storage might not support a full clear easily\n}\n\nimport type { AuthStorage } from \"../../types.js\";\n\nexport class StorageAdapterToAuthStorage implements AuthStorage {\n constructor(private adapter: StorageAdapter) {}\n\n async get(key: string): Promise<string | null> {\n return this.adapter.getItem(key);\n }\n\n async set(key: string, value: string): Promise<void> {\n await this.adapter.setItem(key, value);\n }\n\n async delete(key: string): Promise<void> {\n await this.adapter.removeItem(key);\n }\n}\n"]}
@@ -1,29 +0,0 @@
1
- import { BrowserCookieStorageAdapter } from "../storage/BrowserCookieStorageAdapter.js";
2
- import { getCurrentLogger } from "./logger.js";
3
- interface ExchangeTokenResponse {
4
- id_token: string;
5
- access_token?: string;
6
- refresh_token?: string;
7
- expires_in?: number;
8
- }
9
- export declare function storeTokens(tokens: ExchangeTokenResponse, storageAdapter: BrowserCookieStorageAdapter, customCookieConfig?: any, loggerInstance?: {
10
- debug: (message: string, ...args: unknown[]) => void;
11
- info: (message: string, ...args: unknown[]) => void;
12
- warn: (message: string, ...args: unknown[]) => void;
13
- error: (message: string, ...args: unknown[]) => void;
14
- }): Promise<object | null>;
15
- export interface HandleOAuthRedirectConfig {
16
- clientId: string;
17
- redirectUrl: string;
18
- oauthServer: string;
19
- textSignals: {
20
- success: string;
21
- error: string;
22
- };
23
- storageAdapter?: BrowserCookieStorageAdapter;
24
- cookieOptions?: any;
25
- logger?: ReturnType<typeof getCurrentLogger>;
26
- }
27
- export declare function handleOAuthRedirectPage(config: HandleOAuthRedirectConfig): Promise<boolean>;
28
- export {};
29
- //# sourceMappingURL=page-handlers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-handlers.d.ts","sourceRoot":"","sources":["../../../src/vanillajs/utils/page-handlers.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAK/C,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8BD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,qBAAqB,EAC7B,cAAc,EAAE,2BAA2B,EAE3C,kBAAkB,CAAC,EAAE,GAAG,EACxB,cAAc;;;;;CAAqB,GAClC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2FxB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,cAAc,CAAC,EAAE,2BAA2B,CAAC;IAE7C,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;CAC9C;AAqBD,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,OAAO,CAAC,CAkElB"}
@@ -1,165 +0,0 @@
1
- import { exchangeTokens, buildOauth2Client, getEndpointsWithOverrides, getCookiesMaxAge, } from "../../shared/lib/util.js";
2
- import { OAuthTokenTypes, CodeVerifier } from "../../shared/lib/types.js";
3
- import { BrowserCookieStorageAdapter } from "../storage/BrowserCookieStorageAdapter.js";
4
- import { getCurrentLogger } from "./logger.js";
5
- import { GenericPublicClientPKCEProducer } from "../../services/PKCE.js";
6
- // Default cookie configuration
7
- const defaultCookiesMaxAge = 60 * 60; // 1 hour
8
- const defaultCookieOptions = {
9
- secure: true,
10
- httpOnly: false,
11
- sameSite: "lax", // Added type for sameSite
12
- path: "/",
13
- maxAge: defaultCookiesMaxAge,
14
- };
15
- const cookieConfig = {
16
- tokens: {
17
- [OAuthTokenTypes.ID_TOKEN]: { ...defaultCookieOptions },
18
- [OAuthTokenTypes.ACCESS_TOKEN]: { ...defaultCookieOptions },
19
- [OAuthTokenTypes.REFRESH_TOKEN]: { ...defaultCookieOptions },
20
- [OAuthTokenTypes.ACCESS_TOKEN_EXPIRES_AT]: {
21
- ...defaultCookieOptions,
22
- httpOnly: false,
23
- },
24
- [CodeVerifier.COOKIE_NAME]: { ...defaultCookieOptions, httpOnly: true },
25
- [CodeVerifier.APP_URL]: { ...defaultCookieOptions, httpOnly: true },
26
- },
27
- user: {
28
- ...defaultCookieOptions,
29
- httpOnly: false,
30
- },
31
- };
32
- export async function storeTokens(tokens, storageAdapter,
33
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
- customCookieConfig, loggerInstance = getCurrentLogger()) {
35
- const { accessTokenMaxAge, refreshTokenMaxAge } = getCookiesMaxAge(tokens);
36
- let userInfoForReturn = null; // To store userInfo for returning
37
- const idTokenCookieOpts = customCookieConfig?.tokens?.[OAuthTokenTypes.ID_TOKEN] ??
38
- cookieConfig.tokens[OAuthTokenTypes.ID_TOKEN];
39
- await storageAdapter.setItem(OAuthTokenTypes.ID_TOKEN, tokens.id_token, {
40
- ...idTokenCookieOpts,
41
- maxAge: accessTokenMaxAge,
42
- });
43
- const accessTokenValue = tokens.access_token || "";
44
- const accessTokenCookieOpts = customCookieConfig?.tokens?.[OAuthTokenTypes.ACCESS_TOKEN] ??
45
- cookieConfig.tokens[OAuthTokenTypes.ACCESS_TOKEN];
46
- await storageAdapter.setItem(OAuthTokenTypes.ACCESS_TOKEN, accessTokenValue, {
47
- ...accessTokenCookieOpts,
48
- maxAge: accessTokenMaxAge,
49
- });
50
- if (tokens.refresh_token) {
51
- const refreshTokenCookieOpts = customCookieConfig?.tokens?.[OAuthTokenTypes.REFRESH_TOKEN] ??
52
- cookieConfig.tokens[OAuthTokenTypes.REFRESH_TOKEN];
53
- await storageAdapter.setItem(OAuthTokenTypes.REFRESH_TOKEN, tokens.refresh_token, {
54
- ...refreshTokenCookieOpts,
55
- maxAge: refreshTokenMaxAge,
56
- });
57
- }
58
- if (tokens.expires_in) {
59
- const expiresAt = Math.floor(Date.now() / 1000) + tokens.expires_in;
60
- const expiresAtCookieOpts = customCookieConfig?.tokens?.[OAuthTokenTypes.ACCESS_TOKEN_EXPIRES_AT] ??
61
- cookieConfig.tokens[OAuthTokenTypes.ACCESS_TOKEN_EXPIRES_AT];
62
- await storageAdapter.setItem(OAuthTokenTypes.ACCESS_TOKEN_EXPIRES_AT, String(expiresAt), {
63
- ...expiresAtCookieOpts,
64
- maxAge: accessTokenMaxAge,
65
- });
66
- }
67
- try {
68
- if (typeof tokens.id_token === "string") {
69
- const parts = tokens.id_token.split(".");
70
- if (parts.length === 3) {
71
- const idTokenPayload = JSON.parse(atob(parts[1]));
72
- const userInfo = {
73
- name: idTokenPayload.name,
74
- picture: idTokenPayload.picture,
75
- email: idTokenPayload.email,
76
- id: idTokenPayload.sub,
77
- };
78
- userInfoForReturn = userInfo; // Assign for returning
79
- const encodedUserInfo = encodeURIComponent(JSON.stringify(userInfo));
80
- const userCookieOpts = customCookieConfig?.user ?? cookieConfig.user;
81
- await storageAdapter.setItem("user", encodedUserInfo, {
82
- ...userCookieOpts,
83
- maxAge: accessTokenMaxAge,
84
- });
85
- loggerInstance.info("CivicAuth: User info stored successfully from id_token.");
86
- }
87
- else {
88
- loggerInstance.warn("CivicAuth: Error storing user info - id_token does not have the expected JWT structure (header.payload.signature).");
89
- userInfoForReturn = null;
90
- }
91
- }
92
- else {
93
- loggerInstance.warn("CivicAuth: Error storing user info - id_token is missing or not a string.");
94
- userInfoForReturn = null;
95
- }
96
- }
97
- catch (error) {
98
- loggerInstance.error("CivicAuth: Error processing or storing user info from id_token:", error);
99
- userInfoForReturn = null;
100
- }
101
- return userInfoForReturn; // Return the user info object or null
102
- }
103
- /**
104
- * Adapter to convert BrowserCookieStorageAdapter to AuthStorage interface
105
- */
106
- class CookieStorageToAuthStorage {
107
- storage;
108
- constructor(storage) {
109
- this.storage = storage;
110
- }
111
- async get(key) {
112
- return this.storage.getItem(key);
113
- }
114
- async set(key, value) {
115
- await this.storage.setItem(key, value);
116
- }
117
- async delete(key) {
118
- await this.storage.removeItem(key);
119
- }
120
- }
121
- export async function handleOAuthRedirectPage(config) {
122
- const loggerInstance = config.logger || getCurrentLogger();
123
- const urlParams = new URLSearchParams(window.location.search);
124
- const code = urlParams.get("code");
125
- const state = urlParams.get("state");
126
- if (code && state) {
127
- loggerInstance.info("CivicAuth: OAuth callback detected with code:", code);
128
- const storage = config.storageAdapter || new BrowserCookieStorageAdapter();
129
- const authStorage = new CookieStorageToAuthStorage(storage);
130
- const pkceProducer = new GenericPublicClientPKCEProducer(authStorage);
131
- try {
132
- const endpoints = await getEndpointsWithOverrides(config.oauthServer);
133
- const oauth2Client = buildOauth2Client(config.clientId, config.redirectUrl, endpoints);
134
- const tokenResponse = await exchangeTokens(code, state, pkceProducer, oauth2Client, config.oauthServer, endpoints);
135
- // Get userInfo from storeTokens
136
- const userInfo = await storeTokens(tokenResponse, storage, config.cookieOptions, loggerInstance);
137
- loggerInstance.info("CivicAuth: Tokens stored successfully.");
138
- const signalElement = document.createElement("div");
139
- signalElement.id = "civic-auth-success-signal";
140
- signalElement.textContent = config.textSignals.success;
141
- if (userInfo) {
142
- // Embed userInfo if available
143
- signalElement.setAttribute("data-user-info", JSON.stringify(userInfo));
144
- }
145
- signalElement.style.display = "none";
146
- document.body.appendChild(signalElement);
147
- loggerInstance.info("CivicAuth: Appended success signal to body.");
148
- // Clean up the code verifier
149
- await authStorage.delete(CodeVerifier.COOKIE_NAME);
150
- }
151
- catch (error) {
152
- loggerInstance.error("CivicAuth: Token exchange error:", error);
153
- const errorSignalElement = document.createElement("div");
154
- errorSignalElement.id = "civic-auth-error-signal";
155
- const errorMessage = error instanceof Error ? error.message : "Unknown error";
156
- errorSignalElement.textContent = `${config.textSignals.error} (Error: ${errorMessage})`;
157
- errorSignalElement.style.display = "none";
158
- document.body.appendChild(errorSignalElement);
159
- return true;
160
- }
161
- return true;
162
- }
163
- return false;
164
- }
165
- //# sourceMappingURL=page-handlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-handlers.js","sourceRoot":"","sources":["../../../src/vanillajs/utils/page-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n exchangeTokens,\n buildOauth2Client,\n getEndpointsWithOverrides,\n getCookiesMaxAge,\n} from \"../../shared/lib/util.js\";\nimport { OAuthTokenTypes, CodeVerifier } from \"../../shared/lib/types.js\";\nimport { BrowserCookieStorageAdapter } from \"../storage/BrowserCookieStorageAdapter.js\";\nimport { getCurrentLogger } from \"./logger.js\";\nimport { GenericPublicClientPKCEProducer } from \"../../services/PKCE.js\";\nimport type { AuthStorage } from \"../../types.js\";\n\n// Types\ninterface ExchangeTokenResponse {\n id_token: string; // Required readonly string\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n}\n\n// Default cookie configuration\nconst defaultCookiesMaxAge = 60 * 60; // 1 hour\nconst defaultCookieOptions = {\n secure: true,\n httpOnly: false,\n sameSite: \"lax\" as \"lax\" | \"strict\" | \"none\", // Added type for sameSite\n path: \"/\",\n maxAge: defaultCookiesMaxAge,\n};\n\nconst cookieConfig = {\n tokens: {\n [OAuthTokenTypes.ID_TOKEN]: { ...defaultCookieOptions },\n [OAuthTokenTypes.ACCESS_TOKEN]: { ...defaultCookieOptions },\n [OAuthTokenTypes.REFRESH_TOKEN]: { ...defaultCookieOptions },\n [OAuthTokenTypes.ACCESS_TOKEN_EXPIRES_AT]: {\n ...defaultCookieOptions,\n httpOnly: false,\n },\n [CodeVerifier.COOKIE_NAME]: { ...defaultCookieOptions, httpOnly: true },\n [CodeVerifier.APP_URL]: { ...defaultCookieOptions, httpOnly: true },\n },\n user: {\n ...defaultCookieOptions,\n httpOnly: false,\n },\n};\n\nexport async function storeTokens(\n tokens: ExchangeTokenResponse,\n storageAdapter: BrowserCookieStorageAdapter,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n customCookieConfig?: any,\n loggerInstance = getCurrentLogger(),\n): Promise<object | null> {\n const { accessTokenMaxAge, refreshTokenMaxAge } = getCookiesMaxAge(tokens);\n let userInfoForReturn: object | null = null; // To store userInfo for returning\n\n const idTokenCookieOpts =\n customCookieConfig?.tokens?.[OAuthTokenTypes.ID_TOKEN] ??\n cookieConfig.tokens[OAuthTokenTypes.ID_TOKEN];\n await storageAdapter.setItem(OAuthTokenTypes.ID_TOKEN, tokens.id_token, {\n ...idTokenCookieOpts,\n maxAge: accessTokenMaxAge,\n });\n\n const accessTokenValue = tokens.access_token || \"\";\n const accessTokenCookieOpts =\n customCookieConfig?.tokens?.[OAuthTokenTypes.ACCESS_TOKEN] ??\n cookieConfig.tokens[OAuthTokenTypes.ACCESS_TOKEN];\n await storageAdapter.setItem(OAuthTokenTypes.ACCESS_TOKEN, accessTokenValue, {\n ...accessTokenCookieOpts,\n maxAge: accessTokenMaxAge,\n });\n\n if (tokens.refresh_token) {\n const refreshTokenCookieOpts =\n customCookieConfig?.tokens?.[OAuthTokenTypes.REFRESH_TOKEN] ??\n cookieConfig.tokens[OAuthTokenTypes.REFRESH_TOKEN];\n await storageAdapter.setItem(\n OAuthTokenTypes.REFRESH_TOKEN,\n tokens.refresh_token,\n {\n ...refreshTokenCookieOpts,\n maxAge: refreshTokenMaxAge,\n },\n );\n }\n\n if (tokens.expires_in) {\n const expiresAt = Math.floor(Date.now() / 1000) + tokens.expires_in;\n const expiresAtCookieOpts =\n customCookieConfig?.tokens?.[OAuthTokenTypes.ACCESS_TOKEN_EXPIRES_AT] ??\n cookieConfig.tokens[OAuthTokenTypes.ACCESS_TOKEN_EXPIRES_AT];\n await storageAdapter.setItem(\n OAuthTokenTypes.ACCESS_TOKEN_EXPIRES_AT,\n String(expiresAt),\n {\n ...expiresAtCookieOpts,\n maxAge: accessTokenMaxAge,\n },\n );\n }\n\n try {\n if (typeof tokens.id_token === \"string\") {\n const parts = tokens.id_token.split(\".\");\n if (parts.length === 3) {\n const idTokenPayload = JSON.parse(atob(parts[1]!));\n const userInfo = {\n name: idTokenPayload.name,\n picture: idTokenPayload.picture,\n email: idTokenPayload.email,\n id: idTokenPayload.sub,\n };\n userInfoForReturn = userInfo; // Assign for returning\n const encodedUserInfo = encodeURIComponent(JSON.stringify(userInfo));\n const userCookieOpts = customCookieConfig?.user ?? cookieConfig.user;\n await storageAdapter.setItem(\"user\", encodedUserInfo, {\n ...userCookieOpts,\n maxAge: accessTokenMaxAge,\n });\n loggerInstance.info(\n \"CivicAuth: User info stored successfully from id_token.\",\n );\n } else {\n loggerInstance.warn(\n \"CivicAuth: Error storing user info - id_token does not have the expected JWT structure (header.payload.signature).\",\n );\n userInfoForReturn = null;\n }\n } else {\n loggerInstance.warn(\n \"CivicAuth: Error storing user info - id_token is missing or not a string.\",\n );\n userInfoForReturn = null;\n }\n } catch (error) {\n loggerInstance.error(\n \"CivicAuth: Error processing or storing user info from id_token:\",\n error,\n );\n userInfoForReturn = null;\n }\n return userInfoForReturn; // Return the user info object or null\n}\n\nexport interface HandleOAuthRedirectConfig {\n clientId: string;\n redirectUrl: string;\n oauthServer: string;\n textSignals: {\n success: string;\n error: string;\n };\n storageAdapter?: BrowserCookieStorageAdapter;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cookieOptions?: any; // To pass custom cookie configurations if needed\n logger?: ReturnType<typeof getCurrentLogger>;\n}\n\n/**\n * Adapter to convert BrowserCookieStorageAdapter to AuthStorage interface\n */\nclass CookieStorageToAuthStorage implements AuthStorage {\n constructor(private storage: BrowserCookieStorageAdapter) {}\n\n async get(key: string): Promise<string | null> {\n return this.storage.getItem(key);\n }\n\n async set(key: string, value: string): Promise<void> {\n await this.storage.setItem(key, value);\n }\n\n async delete(key: string): Promise<void> {\n await this.storage.removeItem(key);\n }\n}\n\nexport async function handleOAuthRedirectPage(\n config: HandleOAuthRedirectConfig,\n): Promise<boolean> {\n const loggerInstance = config.logger || getCurrentLogger();\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get(\"code\");\n const state = urlParams.get(\"state\");\n\n if (code && state) {\n loggerInstance.info(\"CivicAuth: OAuth callback detected with code:\", code);\n\n const storage = config.storageAdapter || new BrowserCookieStorageAdapter();\n const authStorage = new CookieStorageToAuthStorage(storage);\n const pkceProducer = new GenericPublicClientPKCEProducer(authStorage);\n\n try {\n const endpoints = await getEndpointsWithOverrides(config.oauthServer);\n const oauth2Client = buildOauth2Client(\n config.clientId,\n config.redirectUrl,\n endpoints,\n );\n\n const tokenResponse = await exchangeTokens(\n code,\n state,\n pkceProducer,\n oauth2Client,\n config.oauthServer,\n endpoints,\n );\n\n // Get userInfo from storeTokens\n const userInfo = await storeTokens(\n tokenResponse,\n storage,\n config.cookieOptions,\n loggerInstance,\n );\n loggerInstance.info(\"CivicAuth: Tokens stored successfully.\");\n\n const signalElement = document.createElement(\"div\");\n signalElement.id = \"civic-auth-success-signal\";\n signalElement.textContent = config.textSignals.success;\n if (userInfo) {\n // Embed userInfo if available\n signalElement.setAttribute(\"data-user-info\", JSON.stringify(userInfo));\n }\n signalElement.style.display = \"none\";\n document.body.appendChild(signalElement);\n loggerInstance.info(\"CivicAuth: Appended success signal to body.\");\n\n // Clean up the code verifier\n await authStorage.delete(CodeVerifier.COOKIE_NAME);\n } catch (error) {\n loggerInstance.error(\"CivicAuth: Token exchange error:\", error);\n const errorSignalElement = document.createElement(\"div\");\n errorSignalElement.id = \"civic-auth-error-signal\";\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n errorSignalElement.textContent = `${config.textSignals.error} (Error: ${errorMessage})`;\n errorSignalElement.style.display = \"none\";\n document.body.appendChild(errorSignalElement);\n return true;\n }\n return true;\n }\n return false;\n}\n"]}