@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
@@ -0,0 +1,166 @@
1
+ import { AuthEvent } from "../types/index.js";
2
+ import { BrowserAuthenticationRefresher, } from "../../shared/lib/BrowserAuthenticationRefresher.js";
3
+ import { createLogger } from "../utils/logger.js";
4
+ import { retrieveAccessTokenExpiresAt } from "../../shared/lib/util.js";
5
+ /**
6
+ * TokenRefresher handles automatic token refresh for vanilla.js implementation
7
+ * Inspired by the React useRefresh hook and BrowserAuthenticationRefresher
8
+ */
9
+ export class TokenRefresher {
10
+ refresher;
11
+ storage;
12
+ events;
13
+ authConfig;
14
+ isAuthenticated = false;
15
+ isDestroyed = false;
16
+ logger = createLogger("token-refresh");
17
+ constructor(storage, events, authConfig) {
18
+ this.storage = storage;
19
+ this.events = events;
20
+ this.authConfig = authConfig;
21
+ this.logger.info("TokenRefresher initialized");
22
+ }
23
+ /**
24
+ * Initialize the token refresher with auth configuration
25
+ */
26
+ async initialize(authConfig) {
27
+ if (this.isDestroyed)
28
+ return;
29
+ this.authConfig = authConfig;
30
+ try {
31
+ // Clear any existing refresher
32
+ await this.cleanup();
33
+ const onError = async (error) => {
34
+ this.logger.error("Token refresh error:", error);
35
+ this.events.emit(AuthEvent.TOKEN_REFRESH_ERROR, error);
36
+ // Clear auto-refresh on error
37
+ this.refresher?.clearAutorefresh();
38
+ // Optionally sign out the user on refresh token errors
39
+ // This mirrors the React implementation behavior
40
+ this.events.emit(AuthEvent.SIGN_OUT_STARTED, null);
41
+ };
42
+ // Create callbacks for refresh events
43
+ const refreshEventCallbacks = {
44
+ onRefreshStarted: () => {
45
+ this.logger.info("Auto token refresh started");
46
+ this.events.emit(AuthEvent.TOKEN_REFRESH_STARTED, null);
47
+ },
48
+ onRefreshComplete: () => {
49
+ this.logger.info("Auto token refresh completed");
50
+ this.events.emit(AuthEvent.TOKEN_REFRESH_COMPLETE, null);
51
+ },
52
+ onRefreshError: (error) => {
53
+ this.logger.error("Auto token refresh failed:", error);
54
+ this.events.emit(AuthEvent.TOKEN_REFRESH_ERROR, error);
55
+ },
56
+ };
57
+ this.refresher = await BrowserAuthenticationRefresher.build(authConfig, this.storage, onError, undefined, // endpointOverrides
58
+ refreshEventCallbacks);
59
+ this.logger.info("TokenRefresher initialized");
60
+ }
61
+ catch (error) {
62
+ this.logger.error("Failed to initialize TokenRefresher:", error);
63
+ this.events.emit(AuthEvent.TOKEN_REFRESH_ERROR, error);
64
+ }
65
+ }
66
+ /**
67
+ * Set authentication state and manage auto-refresh accordingly
68
+ */
69
+ setAuthenticationState(isAuthenticated) {
70
+ if (this.isDestroyed)
71
+ return;
72
+ this.isAuthenticated = isAuthenticated;
73
+ if (isAuthenticated && this.refresher) {
74
+ // Fire and forget the async call - we don't want to make setAuthenticationState async
75
+ // as it would break the interface
76
+ this.startAutoRefresh().catch((error) => {
77
+ this.logger.error("Error starting auto refresh:", error);
78
+ });
79
+ }
80
+ else {
81
+ this.stopAutoRefresh();
82
+ }
83
+ }
84
+ /**
85
+ * Manually refresh tokens
86
+ */
87
+ async refreshTokens() {
88
+ if (this.isDestroyed || !this.refresher) {
89
+ const errorMsg = `TokenRefresher not initialized or destroyed. isDestroyed: ${this.isDestroyed}, hasRefresher: ${!!this.refresher}`;
90
+ this.logger.error(errorMsg);
91
+ throw new Error(errorMsg);
92
+ }
93
+ try {
94
+ this.events.emit(AuthEvent.TOKEN_REFRESH_STARTED, null);
95
+ this.logger.info("Starting manual token refresh");
96
+ await this.refresher.refreshTokens();
97
+ this.events.emit(AuthEvent.TOKEN_REFRESH_COMPLETE, null);
98
+ this.logger.info("Manual token refresh completed");
99
+ }
100
+ catch (error) {
101
+ this.logger.error("Manual token refresh failed:", error);
102
+ this.events.emit(AuthEvent.TOKEN_REFRESH_ERROR, error);
103
+ throw error;
104
+ }
105
+ }
106
+ /**
107
+ * Start automatic token refresh
108
+ */
109
+ async startAutoRefresh() {
110
+ if (this.refresher && this.isAuthenticated) {
111
+ this.logger.info("Starting automatic token refresh");
112
+ try {
113
+ // Calculate when the next refresh will happen (same logic as BrowserAuthenticationRefresher)
114
+ const now = Math.floor(Date.now() / 1000);
115
+ const expiresAt = (await retrieveAccessTokenExpiresAt(this.storage)) || now + 60;
116
+ const bufferTime = 30; // 30 seconds buffer
117
+ const refreshTime = Math.max(0, expiresAt - bufferTime - now);
118
+ const nextRefreshDate = new Date((now + refreshTime) * 1000);
119
+ this.logger.info(`Next token refresh scheduled for: ${nextRefreshDate.toISOString()} (in ${refreshTime} seconds)`);
120
+ }
121
+ catch (error) {
122
+ this.logger.warn("Could not calculate next refresh time:", error);
123
+ }
124
+ this.refresher.setupAutorefresh();
125
+ }
126
+ }
127
+ /**
128
+ * Stop automatic token refresh
129
+ */
130
+ stopAutoRefresh() {
131
+ if (this.refresher) {
132
+ this.logger.info("Stopping automatic token refresh");
133
+ this.refresher.clearAutorefresh();
134
+ }
135
+ }
136
+ /**
137
+ * Clean up resources
138
+ */
139
+ async cleanup() {
140
+ this.logger.info("Cleaning up TokenRefresher");
141
+ if (this.refresher) {
142
+ this.refresher.clearAutorefresh();
143
+ this.refresher = undefined;
144
+ }
145
+ this.isAuthenticated = false;
146
+ }
147
+ /**
148
+ * Destroy the token refresher permanently
149
+ */
150
+ async destroy() {
151
+ this.isDestroyed = true;
152
+ await this.cleanup();
153
+ this.logger.info("TokenRefresher destroyed");
154
+ }
155
+ /**
156
+ * Get current refresh state
157
+ */
158
+ getState() {
159
+ return {
160
+ isInitialized: !!this.refresher,
161
+ isAuthenticated: this.isAuthenticated,
162
+ isAutoRefreshActive: this.isAuthenticated && !!this.refresher,
163
+ };
164
+ }
165
+ }
166
+ //# sourceMappingURL=TokenRefresher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenRefresher.js","sourceRoot":"","sources":["../../../src/vanillajs/auth/TokenRefresher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AuthStorage } from \"../../types.js\";\nimport type { AuthenticationEvents } from \"./AuthenticationEvents.js\";\nimport { AuthEvent } from \"../types/index.js\";\nimport {\n BrowserAuthenticationRefresher,\n type RefreshEventCallbacks,\n} from \"../../shared/lib/BrowserAuthenticationRefresher.js\";\nimport type { AuthConfig } from \"../../server/config.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { retrieveAccessTokenExpiresAt } from \"../../shared/lib/util.js\";\n\n/**\n * TokenRefresher handles automatic token refresh for vanilla.js implementation\n * Inspired by the React useRefresh hook and BrowserAuthenticationRefresher\n */\nexport class TokenRefresher {\n private refresher?: BrowserAuthenticationRefresher;\n private storage: AuthStorage;\n private events: AuthenticationEvents;\n private authConfig?: AuthConfig;\n private isAuthenticated: boolean = false;\n private isDestroyed: boolean = false;\n private logger = createLogger(\"token-refresh\");\n\n constructor(\n storage: AuthStorage,\n events: AuthenticationEvents,\n authConfig?: AuthConfig,\n ) {\n this.storage = storage;\n this.events = events;\n this.authConfig = authConfig;\n\n this.logger.info(\"TokenRefresher initialized\");\n }\n\n /**\n * Initialize the token refresher with auth configuration\n */\n async initialize(authConfig: AuthConfig): Promise<void> {\n if (this.isDestroyed) return;\n\n this.authConfig = authConfig;\n\n try {\n // Clear any existing refresher\n await this.cleanup();\n\n const onError = async (error: Error) => {\n this.logger.error(\"Token refresh error:\", error);\n this.events.emit(AuthEvent.TOKEN_REFRESH_ERROR, error);\n\n // Clear auto-refresh on error\n this.refresher?.clearAutorefresh();\n\n // Optionally sign out the user on refresh token errors\n // This mirrors the React implementation behavior\n this.events.emit(AuthEvent.SIGN_OUT_STARTED, null);\n };\n\n // Create callbacks for refresh events\n const refreshEventCallbacks: RefreshEventCallbacks = {\n onRefreshStarted: () => {\n this.logger.info(\"Auto token refresh started\");\n this.events.emit(AuthEvent.TOKEN_REFRESH_STARTED, null);\n },\n onRefreshComplete: () => {\n this.logger.info(\"Auto token refresh completed\");\n this.events.emit(AuthEvent.TOKEN_REFRESH_COMPLETE, null);\n },\n onRefreshError: (error: Error) => {\n this.logger.error(\"Auto token refresh failed:\", error);\n this.events.emit(AuthEvent.TOKEN_REFRESH_ERROR, error);\n },\n };\n\n this.refresher = await BrowserAuthenticationRefresher.build(\n authConfig,\n this.storage,\n onError,\n undefined, // endpointOverrides\n refreshEventCallbacks,\n );\n\n this.logger.info(\"TokenRefresher initialized\");\n } catch (error) {\n this.logger.error(\"Failed to initialize TokenRefresher:\", error);\n this.events.emit(AuthEvent.TOKEN_REFRESH_ERROR, error);\n }\n }\n\n /**\n * Set authentication state and manage auto-refresh accordingly\n */\n setAuthenticationState(isAuthenticated: boolean): void {\n if (this.isDestroyed) return;\n\n this.isAuthenticated = isAuthenticated;\n\n if (isAuthenticated && this.refresher) {\n // Fire and forget the async call - we don't want to make setAuthenticationState async\n // as it would break the interface\n this.startAutoRefresh().catch((error) => {\n this.logger.error(\"Error starting auto refresh:\", error);\n });\n } else {\n this.stopAutoRefresh();\n }\n }\n\n /**\n * Manually refresh tokens\n */\n async refreshTokens(): Promise<void> {\n if (this.isDestroyed || !this.refresher) {\n const errorMsg = `TokenRefresher not initialized or destroyed. isDestroyed: ${this.isDestroyed}, hasRefresher: ${!!this.refresher}`;\n this.logger.error(errorMsg);\n throw new Error(errorMsg);\n }\n\n try {\n this.events.emit(AuthEvent.TOKEN_REFRESH_STARTED, null);\n\n this.logger.info(\"Starting manual token refresh\");\n\n await this.refresher.refreshTokens();\n\n this.events.emit(AuthEvent.TOKEN_REFRESH_COMPLETE, null);\n this.logger.info(\"Manual token refresh completed\");\n } catch (error) {\n this.logger.error(\"Manual token refresh failed:\", error);\n this.events.emit(AuthEvent.TOKEN_REFRESH_ERROR, error);\n throw error;\n }\n }\n\n /**\n * Start automatic token refresh\n */\n private async startAutoRefresh(): Promise<void> {\n if (this.refresher && this.isAuthenticated) {\n this.logger.info(\"Starting automatic token refresh\");\n\n try {\n // Calculate when the next refresh will happen (same logic as BrowserAuthenticationRefresher)\n const now = Math.floor(Date.now() / 1000);\n const expiresAt =\n (await retrieveAccessTokenExpiresAt(this.storage)) || now + 60;\n const bufferTime = 30; // 30 seconds buffer\n const refreshTime = Math.max(0, expiresAt - bufferTime - now);\n\n const nextRefreshDate = new Date((now + refreshTime) * 1000);\n this.logger.info(\n `Next token refresh scheduled for: ${nextRefreshDate.toISOString()} (in ${refreshTime} seconds)`,\n );\n } catch (error) {\n this.logger.warn(\"Could not calculate next refresh time:\", error);\n }\n\n this.refresher.setupAutorefresh();\n }\n }\n\n /**\n * Stop automatic token refresh\n */\n private stopAutoRefresh(): void {\n if (this.refresher) {\n this.logger.info(\"Stopping automatic token refresh\");\n this.refresher.clearAutorefresh();\n }\n }\n\n /**\n * Clean up resources\n */\n async cleanup(): Promise<void> {\n this.logger.info(\"Cleaning up TokenRefresher\");\n\n if (this.refresher) {\n this.refresher.clearAutorefresh();\n this.refresher = undefined;\n }\n\n this.isAuthenticated = false;\n }\n\n /**\n * Destroy the token refresher permanently\n */\n async destroy(): Promise<void> {\n this.isDestroyed = true;\n await this.cleanup();\n this.logger.info(\"TokenRefresher destroyed\");\n }\n\n /**\n * Get current refresh state\n */\n getState(): {\n isInitialized: boolean;\n isAuthenticated: boolean;\n isAutoRefreshActive: boolean;\n } {\n return {\n isInitialized: !!this.refresher,\n isAuthenticated: this.isAuthenticated,\n isAutoRefreshActive: this.isAuthenticated && !!this.refresher,\n };\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { CivicAuthClientConfig, ProcessedCivicAuthConfig } from "../types/AuthTypes.js";
2
+ /**
3
+ * Process the configuration with defaults and validation
4
+ */
5
+ export declare function processConfigWithDefaults(config: CivicAuthClientConfig): ProcessedCivicAuthConfig;
6
+ //# sourceMappingURL=ConfigProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigProcessor.d.ts","sourceRoot":"","sources":["../../../../src/vanillajs/auth/config/ConfigProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EAEzB,MAAM,uBAAuB,CAAC;AAO/B;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,qBAAqB,GAC5B,wBAAwB,CAgC1B"}
@@ -0,0 +1,59 @@
1
+ import { LocalStorageAdapter } from "../../../browser/storage.js";
2
+ import { DEFAULT_SCOPES } from "../../../constants.js";
3
+ import { CivicAuthError, CivicAuthErrorCode, CIVIC_AUTH_CONSTANTS, } from "../types/AuthTypes.js";
4
+ /**
5
+ * Process the configuration with defaults and validation
6
+ */
7
+ export function processConfigWithDefaults(config) {
8
+ // Validate required configuration
9
+ validateRequiredConfig(config);
10
+ const loggingConfig = {
11
+ enabled: true,
12
+ namespace: "*",
13
+ level: "debug",
14
+ ...config.logging,
15
+ };
16
+ return {
17
+ ...config,
18
+ redirectUrl: config.redirectUrl ||
19
+ `${window.location.origin}${window.location.pathname}`,
20
+ oauthServerBaseUrl: config.oauthServerBaseUrl || "https://auth.civic.com/oauth/",
21
+ scopes: config.scopes || DEFAULT_SCOPES,
22
+ textSignals: config.textSignals || {
23
+ success: "Authentication successful!",
24
+ error: "Authentication failed. Please try again.",
25
+ },
26
+ displayMode: config.displayMode || "iframe",
27
+ authProcessTimeout: config.authProcessTimeout ||
28
+ CIVIC_AUTH_CONSTANTS.DEFAULT_AUTH_PROCESS_TIMEOUT,
29
+ iframeId: config.iframeId || CIVIC_AUTH_CONSTANTS.DEFAULT_IFRAME_ID,
30
+ prompt: "consent",
31
+ logging: loggingConfig,
32
+ storageAdapter: config.storageAdapter || new LocalStorageAdapter(),
33
+ };
34
+ }
35
+ /**
36
+ * Validates required configuration properties
37
+ */
38
+ function validateRequiredConfig(config) {
39
+ // Always required configurations
40
+ const requiredConfigs = [{ key: "clientId", value: config.clientId }];
41
+ // Validate always-required fields
42
+ for (const { key, value } of requiredConfigs) {
43
+ if (!value) {
44
+ throw new CivicAuthError(`CivicAuth: ${key} is required.`, CivicAuthErrorCode.CONFIG_REQUIRED);
45
+ }
46
+ }
47
+ // Conditional validation for targetContainerElement
48
+ // Only required for embedded iframe mode
49
+ const displayMode = config.displayMode || "iframe";
50
+ const iframeDisplayMode = config.iframeDisplayMode;
51
+ // Check if we need a container element
52
+ const needsContainer = displayMode === "iframe" && iframeDisplayMode === "embedded";
53
+ if (needsContainer && !config.targetContainerElement) {
54
+ throw new CivicAuthError("CivicAuth: targetContainerElement is required for embedded iframe mode. " +
55
+ "For modal iframe mode, set iframeDisplayMode to 'modal'. " +
56
+ "For non-iframe modes, use displayMode 'redirect' or 'new_tab'.", CivicAuthErrorCode.CONFIG_REQUIRED);
57
+ }
58
+ }
59
+ //# sourceMappingURL=ConfigProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigProcessor.js","sourceRoot":"","sources":["../../../../src/vanillajs/auth/config/ConfigProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAMvD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA6B;IAE7B,kCAAkC;IAClC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,aAAa,GAAkB;QACnC,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,GAAG;QACd,KAAK,EAAE,OAAgB;QACvB,GAAG,MAAM,CAAC,OAAO;KAClB,CAAC;IAEF,OAAO;QACL,GAAG,MAAM;QACT,WAAW,EACT,MAAM,CAAC,WAAW;YAClB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxD,kBAAkB,EAChB,MAAM,CAAC,kBAAkB,IAAI,+BAA+B;QAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,cAAc;QACvC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI;YACjC,OAAO,EAAE,4BAA4B;YACrC,KAAK,EAAE,0CAA0C;SAClD;QACD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,QAAQ;QAC3C,kBAAkB,EAChB,MAAM,CAAC,kBAAkB;YACzB,oBAAoB,CAAC,4BAA4B;QACnD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,oBAAoB,CAAC,iBAAiB;QACnE,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,aAAa;QACtB,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI,mBAAmB,EAAE;KACnE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,MAA6B;IAC3D,iCAAiC;IACjC,MAAM,eAAe,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEtE,kCAAkC;IAClC,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,cAAc,CACtB,cAAc,GAAG,eAAe,EAChC,kBAAkB,CAAC,eAAe,CACnC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,yCAAyC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IACnD,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAEnD,uCAAuC;IACvC,MAAM,cAAc,GAClB,WAAW,KAAK,QAAQ,IAAI,iBAAiB,KAAK,UAAU,CAAC;IAE/D,IAAI,cAAc,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;QACrD,MAAM,IAAI,cAAc,CACtB,0EAA0E;YACxE,2DAA2D;YAC3D,gEAAgE,EAClE,kBAAkB,CAAC,eAAe,CACnC,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { LocalStorageAdapter } from \"../../../browser/storage.js\";\nimport { DEFAULT_SCOPES } from \"../../../constants.js\";\nimport type {\n CivicAuthClientConfig,\n ProcessedCivicAuthConfig,\n LoggingConfig,\n} from \"../types/AuthTypes.js\";\nimport {\n CivicAuthError,\n CivicAuthErrorCode,\n CIVIC_AUTH_CONSTANTS,\n} from \"../types/AuthTypes.js\";\n\n/**\n * Process the configuration with defaults and validation\n */\nexport function processConfigWithDefaults(\n config: CivicAuthClientConfig,\n): ProcessedCivicAuthConfig {\n // Validate required configuration\n validateRequiredConfig(config);\n\n const loggingConfig: LoggingConfig = {\n enabled: true,\n namespace: \"*\",\n level: \"debug\" as const,\n ...config.logging,\n };\n\n return {\n ...config,\n redirectUrl:\n config.redirectUrl ||\n `${window.location.origin}${window.location.pathname}`,\n oauthServerBaseUrl:\n config.oauthServerBaseUrl || \"https://auth.civic.com/oauth/\",\n scopes: config.scopes || DEFAULT_SCOPES,\n textSignals: config.textSignals || {\n success: \"Authentication successful!\",\n error: \"Authentication failed. Please try again.\",\n },\n displayMode: config.displayMode || \"iframe\",\n authProcessTimeout:\n config.authProcessTimeout ||\n CIVIC_AUTH_CONSTANTS.DEFAULT_AUTH_PROCESS_TIMEOUT,\n iframeId: config.iframeId || CIVIC_AUTH_CONSTANTS.DEFAULT_IFRAME_ID,\n prompt: \"consent\",\n logging: loggingConfig,\n storageAdapter: config.storageAdapter || new LocalStorageAdapter(),\n };\n}\n\n/**\n * Validates required configuration properties\n */\nfunction validateRequiredConfig(config: CivicAuthClientConfig): void {\n // Always required configurations\n const requiredConfigs = [{ key: \"clientId\", value: config.clientId }];\n\n // Validate always-required fields\n for (const { key, value } of requiredConfigs) {\n if (!value) {\n throw new CivicAuthError(\n `CivicAuth: ${key} is required.`,\n CivicAuthErrorCode.CONFIG_REQUIRED,\n );\n }\n }\n\n // Conditional validation for targetContainerElement\n // Only required for embedded iframe mode\n const displayMode = config.displayMode || \"iframe\";\n const iframeDisplayMode = config.iframeDisplayMode;\n\n // Check if we need a container element\n const needsContainer =\n displayMode === \"iframe\" && iframeDisplayMode === \"embedded\";\n\n if (needsContainer && !config.targetContainerElement) {\n throw new CivicAuthError(\n \"CivicAuth: targetContainerElement is required for embedded iframe mode. \" +\n \"For modal iframe mode, set iframeDisplayMode to 'modal'. \" +\n \"For non-iframe modes, use displayMode 'redirect' or 'new_tab'.\",\n CivicAuthErrorCode.CONFIG_REQUIRED,\n );\n }\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import type { AuthResult } from "../../types/index.js";
2
+ import type { ProcessedCivicAuthConfig } from "../types/AuthTypes.js";
3
+ import { IframeManager } from "../../iframe/IframeManager.js";
4
+ import type { createLogger } from "../../utils/logger.js";
5
+ export interface IframeAuthHandlerConfig {
6
+ config: ProcessedCivicAuthConfig;
7
+ logger: ReturnType<typeof createLogger>;
8
+ onAuthSuccess: (result: AuthResult) => void;
9
+ onAuthError: (error: Error) => void;
10
+ cleanup: () => void;
11
+ messageHandler: (event: MessageEvent) => void;
12
+ }
13
+ export declare class IframeAuthHandler {
14
+ private config;
15
+ private logger;
16
+ private onAuthSuccess;
17
+ private onAuthError;
18
+ private cleanup;
19
+ private messageHandler;
20
+ private iframeManager?;
21
+ private iframeElement?;
22
+ private signalObserver?;
23
+ constructor(handlerConfig: IframeAuthHandlerConfig);
24
+ handleIframeAuth(fullAuthUrl: string): Promise<HTMLIFrameElement>;
25
+ getIframeManager(): IframeManager | undefined;
26
+ getIframeElement(): HTMLIFrameElement | undefined;
27
+ cleanupIframe(): void;
28
+ private cleanupDynamicModalContainer;
29
+ private createModalContainer;
30
+ private getContainerElement;
31
+ private determineIframeDisplayMode;
32
+ private setupIframeEventHandlers;
33
+ private checkAndHideNonLoginContent;
34
+ private checkIframeRedirect;
35
+ private setupSignalObserver;
36
+ private setupIframeNavigationMonitoring;
37
+ private processCallbackUrl;
38
+ navigateIframe(url: string): void;
39
+ }
40
+ //# sourceMappingURL=IframeAuthHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IframeAuthHandler.d.ts","sourceRoot":"","sources":["../../../../src/vanillajs/auth/handlers/IframeAuthHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGtE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,wBAAwB,CAAC;IACjC,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACxC,aAAa,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5C,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CAC/C;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,aAAa,CAAC,CAAoB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,aAAa,EAAE,uBAAuB;IAQrC,gBAAgB,CAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,CAAC;IA2EtB,gBAAgB,IAAI,aAAa,GAAG,SAAS;IAI7C,gBAAgB,IAAI,iBAAiB,GAAG,SAAS;IAIjD,aAAa,IAAI,IAAI;IAe5B,OAAO,CAAC,4BAA4B;IAgBpC,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,0BAA0B;IA4BlC,OAAO,CAAC,wBAAwB;IAyDhC,OAAO,CAAC,2BAA2B;IA6DnC,OAAO,CAAC,mBAAmB;IAsD3B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,+BAA+B;IA2EvC,OAAO,CAAC,kBAAkB;IAgCnB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CA8BzC"}