@tern-secure/auth 1.1.0-canary.v20251030165007 → 1.1.0-canary.v20251125170702

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 (276) hide show
  1. package/dist/492_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  2. package/dist/687_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  3. package/dist/68_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  4. package/dist/framework_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  5. package/dist/signin_ternsecure_f36de9_1.1.0-canary.v20251125170702.css +2 -0
  6. package/dist/signin_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  7. package/dist/signup_ternsecure_f36de9_1.1.0-canary.v20251125170702.css +2 -0
  8. package/dist/signup_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  9. package/dist/ternsecure.browser.js +30 -0
  10. package/dist/ternsecure.css +2 -0
  11. package/dist/ternsecure.js +17 -0
  12. package/dist/ternsecure.mjs +17 -0
  13. package/dist/types/auth/AuthCookieManager.d.ts +17 -6
  14. package/dist/types/auth/cookies/authTime_cookie.d.ts +6 -0
  15. package/dist/types/index.browser.d.ts +1 -0
  16. package/dist/types/index.d.ts +3 -10
  17. package/dist/types/instance/c_coreApiClient.d.ts +2 -2
  18. package/dist/types/instance/constants.d.ts +3 -0
  19. package/dist/types/instance/coreApiClient.d.ts +0 -1
  20. package/dist/types/instance/events.d.ts +0 -1
  21. package/dist/types/instance/{TernAuth.d.ts → ternsecure.d.ts} +31 -19
  22. package/dist/types/lib/utils.d.ts +2 -0
  23. package/dist/types/resources/Base.d.ts +16 -3
  24. package/dist/types/resources/Error.d.ts +0 -1
  25. package/dist/types/resources/Session.d.ts +2 -2
  26. package/dist/types/resources/SignIn.d.ts +27 -10
  27. package/dist/types/resources/SignUp.d.ts +12 -10
  28. package/dist/types/resources/internal.d.ts +1 -2
  29. package/dist/types/ui/Renderer.d.ts +26 -0
  30. package/dist/types/ui/common/ProviderInitialIcon.d.ts +6 -0
  31. package/dist/types/ui/common/VerificationCodeCard.d.ts +12 -0
  32. package/dist/types/ui/common/VerificationLinkCard.d.ts +7 -0
  33. package/dist/types/ui/common/constants.d.ts +8 -0
  34. package/dist/types/ui/common/index.d.ts +3 -0
  35. package/dist/types/ui/components/sign-in/ResetPassword.d.ts +1 -0
  36. package/dist/types/ui/components/sign-in/ResetPasswordSuccess.d.ts +1 -0
  37. package/dist/types/ui/components/sign-in/SignIn.d.ts +4 -0
  38. package/dist/types/ui/components/sign-in/SignInEmailLinkCard.d.ts +2 -0
  39. package/dist/types/ui/components/sign-in/SignInFactorOne.d.ts +1 -0
  40. package/dist/types/ui/components/sign-in/SignInFactorOneCodeForm.d.ts +7 -0
  41. package/dist/types/ui/components/sign-in/SignInFactorOnePasswordCard.d.ts +6 -0
  42. package/dist/types/ui/components/sign-in/SignInFactorOnePhoneCodeCard.d.ts +7 -0
  43. package/dist/types/ui/components/sign-in/SignInPassword.d.ts +8 -0
  44. package/dist/types/ui/components/sign-in/SignInSocialButtons.d.ts +1 -0
  45. package/dist/types/ui/components/sign-in/SignInStart.d.ts +7 -0
  46. package/dist/types/ui/components/sign-in/SignInVerifyEmail.d.ts +1 -0
  47. package/dist/types/ui/components/sign-in/index.d.ts +4 -0
  48. package/dist/types/ui/components/sign-up/SignUp.d.ts +8 -0
  49. package/dist/types/ui/components/sign-up/SignUpEmailLinkCard.d.ts +2 -0
  50. package/dist/types/ui/components/sign-up/SignUpSocialButtons.d.ts +1 -0
  51. package/dist/types/ui/components/sign-up/SignUpStart.d.ts +1 -0
  52. package/dist/types/ui/components/sign-up/SignUpVerifyEmail.d.ts +1 -0
  53. package/dist/types/ui/components/sign-up/index.d.ts +2 -0
  54. package/dist/types/ui/components/sign-up/util.d.ts +14 -0
  55. package/dist/types/ui/components/user-button/index.d.ts +1 -0
  56. package/dist/types/ui/components/user-button/userButton.d.ts +1 -0
  57. package/dist/types/ui/ctx/TernAuthContext.d.ts +4 -0
  58. package/dist/types/ui/ctx/TernAuthUIComponentCtx.d.ts +8 -0
  59. package/dist/types/ui/ctx/TernSecureContextWrapper.d.ts +8 -0
  60. package/dist/types/ui/ctx/TernSecureOptions.d.ts +10 -0
  61. package/dist/types/ui/ctx/components/SignIn.d.ts +21 -0
  62. package/dist/types/ui/ctx/components/SignUp.d.ts +14 -0
  63. package/dist/types/ui/ctx/components/UserButton.d.ts +10 -0
  64. package/dist/types/ui/ctx/components/index.d.ts +3 -0
  65. package/dist/types/ui/ctx/index.d.ts +4 -0
  66. package/dist/types/ui/ctx/utils.d.ts +3 -0
  67. package/dist/types/ui/customize/FieldControl.d.ts +15 -0
  68. package/dist/types/ui/customize/FieldLabelControl.d.ts +11 -0
  69. package/dist/types/ui/customize/Form.d.ts +36 -0
  70. package/dist/types/ui/elements/CodeControl.d.ts +47 -0
  71. package/dist/types/ui/elements/ErrorCard.d.ts +10 -0
  72. package/dist/types/ui/elements/LoadingCard.d.ts +1 -0
  73. package/dist/types/ui/elements/RouterLink.d.ts +42 -0
  74. package/dist/types/ui/elements/SocialButtons.d.ts +6 -0
  75. package/dist/types/ui/elements/TimerButton.d.ts +9 -0
  76. package/dist/types/ui/elements/alert.d.ts +8 -0
  77. package/dist/types/ui/elements/avatar.d.ts +6 -0
  78. package/dist/types/ui/elements/button.d.ts +10 -0
  79. package/dist/types/ui/elements/card.d.ts +9 -0
  80. package/dist/types/ui/elements/ctx/CardStateCtx.d.ts +26 -0
  81. package/dist/types/ui/elements/ctx/index.d.ts +1 -0
  82. package/dist/types/ui/elements/field.d.ts +24 -0
  83. package/dist/types/ui/elements/index.d.ts +16 -0
  84. package/dist/types/ui/elements/input.d.ts +3 -0
  85. package/dist/types/ui/elements/label.d.ts +4 -0
  86. package/dist/types/ui/elements/separator.d.ts +4 -0
  87. package/dist/types/ui/hooks/index.d.ts +6 -0
  88. package/dist/types/ui/hooks/useEmailLink.d.ts +11 -0
  89. package/dist/types/ui/hooks/useFetch.d.ts +44 -0
  90. package/dist/types/ui/hooks/useLoadingStatus.d.ts +14 -0
  91. package/dist/types/ui/hooks/useNavigateToFlowStart.d.ts +3 -0
  92. package/dist/types/ui/hooks/useSafeState.d.ts +9 -0
  93. package/dist/types/ui/hooks/useWindowEventListener.d.ts +3 -0
  94. package/dist/types/ui/icons/index.d.ts +13 -0
  95. package/dist/types/ui/lazyLoading/common.d.ts +2 -0
  96. package/dist/types/ui/lazyLoading/components.d.ts +11 -0
  97. package/dist/types/ui/lazyLoading/providersCtx.d.ts +26 -0
  98. package/dist/types/ui/portal/index.d.ts +12 -0
  99. package/dist/types/ui/router/BaseRouter.d.ts +21 -0
  100. package/dist/types/ui/router/HashRouter.d.ts +8 -0
  101. package/dist/types/ui/router/PathRouter.d.ts +8 -0
  102. package/dist/types/ui/router/Route.d.ts +19 -0
  103. package/dist/types/ui/router/RouterCtx.d.ts +32 -0
  104. package/dist/types/ui/router/Switch.d.ts +4 -0
  105. package/dist/types/ui/router/index.d.ts +7 -0
  106. package/dist/types/ui/router/newPaths.d.ts +1 -0
  107. package/dist/types/ui/router/pathToRegexp.d.ts +127 -0
  108. package/dist/types/ui/types.d.ts +18 -0
  109. package/dist/types/ui/utils/form.d.ts +19 -0
  110. package/dist/types/ui/utils/index.d.ts +1 -0
  111. package/dist/types/ui/utils/sleep.d.ts +1 -0
  112. package/dist/types/utils/construct.d.ts +3 -1
  113. package/dist/types/utils/index.d.ts +1 -1
  114. package/dist/types/utils/normalizeRoutingOptions.d.ts +6 -0
  115. package/dist/types/utils/path.d.ts +0 -1
  116. package/dist/types/utils/querystring.d.ts +0 -1
  117. package/dist/types/utils/redirectUrls.d.ts +4 -9
  118. package/dist/types/utils/windowNavigate.d.ts +0 -1
  119. package/dist/ui-common_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  120. package/dist/userbutton_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  121. package/dist/vendors_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  122. package/package.json +64 -25
  123. package/dist/cjs/auth/AuthCookieManager.js +0 -100
  124. package/dist/cjs/auth/AuthCookieManager.js.map +0 -1
  125. package/dist/cjs/auth/cookies/session.js +0 -83
  126. package/dist/cjs/auth/cookies/session.js.map +0 -1
  127. package/dist/cjs/auth/request.js +0 -159
  128. package/dist/cjs/auth/request.js.map +0 -1
  129. package/dist/cjs/global.d.js +0 -2
  130. package/dist/cjs/global.d.js.map +0 -1
  131. package/dist/cjs/index.js +0 -47
  132. package/dist/cjs/index.js.map +0 -1
  133. package/dist/cjs/instance/TernAuth.js +0 -562
  134. package/dist/cjs/instance/TernAuth.js.map +0 -1
  135. package/dist/cjs/instance/TernAuthServer.js +0 -95
  136. package/dist/cjs/instance/TernAuthServer.js.map +0 -1
  137. package/dist/cjs/instance/c_coreApiClient.js +0 -264
  138. package/dist/cjs/instance/c_coreApiClient.js.map +0 -1
  139. package/dist/cjs/instance/coreApiClient.js +0 -255
  140. package/dist/cjs/instance/coreApiClient.js.map +0 -1
  141. package/dist/cjs/instance/events.js +0 -39
  142. package/dist/cjs/instance/events.js.map +0 -1
  143. package/dist/cjs/instance/jwtClient.js +0 -72
  144. package/dist/cjs/instance/jwtClient.js.map +0 -1
  145. package/dist/cjs/resources/Base.js +0 -137
  146. package/dist/cjs/resources/Base.js.map +0 -1
  147. package/dist/cjs/resources/Error.js +0 -31
  148. package/dist/cjs/resources/Error.js.map +0 -1
  149. package/dist/cjs/resources/Session.js +0 -105
  150. package/dist/cjs/resources/Session.js.map +0 -1
  151. package/dist/cjs/resources/SignIn.js +0 -256
  152. package/dist/cjs/resources/SignIn.js.map +0 -1
  153. package/dist/cjs/resources/SignUp.js +0 -72
  154. package/dist/cjs/resources/SignUp.js.map +0 -1
  155. package/dist/cjs/resources/Token.js +0 -32
  156. package/dist/cjs/resources/Token.js.map +0 -1
  157. package/dist/cjs/resources/UserData.js +0 -43
  158. package/dist/cjs/resources/UserData.js.map +0 -1
  159. package/dist/cjs/resources/cookie.js +0 -154
  160. package/dist/cjs/resources/cookie.js.map +0 -1
  161. package/dist/cjs/resources/index.js +0 -23
  162. package/dist/cjs/resources/index.js.map +0 -1
  163. package/dist/cjs/resources/internal.js +0 -35
  164. package/dist/cjs/resources/internal.js.map +0 -1
  165. package/dist/cjs/utils/construct.js +0 -253
  166. package/dist/cjs/utils/construct.js.map +0 -1
  167. package/dist/cjs/utils/index.js +0 -29
  168. package/dist/cjs/utils/index.js.map +0 -1
  169. package/dist/cjs/utils/jwt.js +0 -46
  170. package/dist/cjs/utils/jwt.js.map +0 -1
  171. package/dist/cjs/utils/mapDecode.js +0 -33
  172. package/dist/cjs/utils/mapDecode.js.map +0 -1
  173. package/dist/cjs/utils/path.js +0 -33
  174. package/dist/cjs/utils/path.js.map +0 -1
  175. package/dist/cjs/utils/querystring.js +0 -70
  176. package/dist/cjs/utils/querystring.js.map +0 -1
  177. package/dist/cjs/utils/redirectUrls.js +0 -156
  178. package/dist/cjs/utils/redirectUrls.js.map +0 -1
  179. package/dist/cjs/utils/windowNavigate.js +0 -45
  180. package/dist/cjs/utils/windowNavigate.js.map +0 -1
  181. package/dist/esm/auth/AuthCookieManager.js +0 -76
  182. package/dist/esm/auth/AuthCookieManager.js.map +0 -1
  183. package/dist/esm/auth/cookies/session.js +0 -58
  184. package/dist/esm/auth/cookies/session.js.map +0 -1
  185. package/dist/esm/auth/request.js +0 -134
  186. package/dist/esm/auth/request.js.map +0 -1
  187. package/dist/esm/global.d.js +0 -1
  188. package/dist/esm/global.d.js.map +0 -1
  189. package/dist/esm/index.js +0 -16
  190. package/dist/esm/index.js.map +0 -1
  191. package/dist/esm/instance/TernAuth.js +0 -548
  192. package/dist/esm/instance/TernAuth.js.map +0 -1
  193. package/dist/esm/instance/TernAuthServer.js +0 -73
  194. package/dist/esm/instance/TernAuthServer.js.map +0 -1
  195. package/dist/esm/instance/c_coreApiClient.js +0 -236
  196. package/dist/esm/instance/c_coreApiClient.js.map +0 -1
  197. package/dist/esm/instance/coreApiClient.js +0 -226
  198. package/dist/esm/instance/coreApiClient.js.map +0 -1
  199. package/dist/esm/instance/events.js +0 -14
  200. package/dist/esm/instance/events.js.map +0 -1
  201. package/dist/esm/instance/jwtClient.js +0 -47
  202. package/dist/esm/instance/jwtClient.js.map +0 -1
  203. package/dist/esm/resources/Base.js +0 -113
  204. package/dist/esm/resources/Base.js.map +0 -1
  205. package/dist/esm/resources/Error.js +0 -9
  206. package/dist/esm/resources/Error.js.map +0 -1
  207. package/dist/esm/resources/Session.js +0 -81
  208. package/dist/esm/resources/Session.js.map +0 -1
  209. package/dist/esm/resources/SignIn.js +0 -240
  210. package/dist/esm/resources/SignIn.js.map +0 -1
  211. package/dist/esm/resources/SignUp.js +0 -48
  212. package/dist/esm/resources/SignUp.js.map +0 -1
  213. package/dist/esm/resources/Token.js +0 -8
  214. package/dist/esm/resources/Token.js.map +0 -1
  215. package/dist/esm/resources/UserData.js +0 -19
  216. package/dist/esm/resources/UserData.js.map +0 -1
  217. package/dist/esm/resources/cookie.js +0 -130
  218. package/dist/esm/resources/cookie.js.map +0 -1
  219. package/dist/esm/resources/index.js +0 -2
  220. package/dist/esm/resources/index.js.map +0 -1
  221. package/dist/esm/resources/internal.js +0 -8
  222. package/dist/esm/resources/internal.js.map +0 -1
  223. package/dist/esm/utils/construct.js +0 -215
  224. package/dist/esm/utils/construct.js.map +0 -1
  225. package/dist/esm/utils/index.js +0 -5
  226. package/dist/esm/utils/index.js.map +0 -1
  227. package/dist/esm/utils/jwt.js +0 -22
  228. package/dist/esm/utils/jwt.js.map +0 -1
  229. package/dist/esm/utils/mapDecode.js +0 -9
  230. package/dist/esm/utils/mapDecode.js.map +0 -1
  231. package/dist/esm/utils/path.js +0 -9
  232. package/dist/esm/utils/path.js.map +0 -1
  233. package/dist/esm/utils/querystring.js +0 -45
  234. package/dist/esm/utils/querystring.js.map +0 -1
  235. package/dist/esm/utils/redirectUrls.js +0 -132
  236. package/dist/esm/utils/redirectUrls.js.map +0 -1
  237. package/dist/esm/utils/windowNavigate.js +0 -19
  238. package/dist/esm/utils/windowNavigate.js.map +0 -1
  239. package/dist/types/auth/AuthCookieManager.d.ts.map +0 -1
  240. package/dist/types/auth/cookies/session.d.ts +0 -8
  241. package/dist/types/auth/cookies/session.d.ts.map +0 -1
  242. package/dist/types/auth/request.d.ts +0 -49
  243. package/dist/types/auth/request.d.ts.map +0 -1
  244. package/dist/types/index.d.ts.map +0 -1
  245. package/dist/types/instance/TernAuth.d.ts.map +0 -1
  246. package/dist/types/instance/TernAuthServer.d.ts +0 -32
  247. package/dist/types/instance/TernAuthServer.d.ts.map +0 -1
  248. package/dist/types/instance/c_coreApiClient.d.ts.map +0 -1
  249. package/dist/types/instance/coreApiClient.d.ts.map +0 -1
  250. package/dist/types/instance/events.d.ts.map +0 -1
  251. package/dist/types/instance/jwtClient.d.ts +0 -22
  252. package/dist/types/instance/jwtClient.d.ts.map +0 -1
  253. package/dist/types/resources/Base.d.ts.map +0 -1
  254. package/dist/types/resources/Error.d.ts.map +0 -1
  255. package/dist/types/resources/Session.d.ts.map +0 -1
  256. package/dist/types/resources/SignIn.d.ts.map +0 -1
  257. package/dist/types/resources/SignUp.d.ts.map +0 -1
  258. package/dist/types/resources/Token.d.ts +0 -5
  259. package/dist/types/resources/Token.d.ts.map +0 -1
  260. package/dist/types/resources/UserData.d.ts +0 -8
  261. package/dist/types/resources/UserData.d.ts.map +0 -1
  262. package/dist/types/resources/cookie.d.ts +0 -24
  263. package/dist/types/resources/cookie.d.ts.map +0 -1
  264. package/dist/types/resources/index.d.ts +0 -2
  265. package/dist/types/resources/index.d.ts.map +0 -1
  266. package/dist/types/resources/internal.d.ts.map +0 -1
  267. package/dist/types/utils/construct.d.ts.map +0 -1
  268. package/dist/types/utils/index.d.ts.map +0 -1
  269. package/dist/types/utils/jwt.d.ts +0 -12
  270. package/dist/types/utils/jwt.d.ts.map +0 -1
  271. package/dist/types/utils/mapDecode.d.ts +0 -4
  272. package/dist/types/utils/mapDecode.d.ts.map +0 -1
  273. package/dist/types/utils/path.d.ts.map +0 -1
  274. package/dist/types/utils/querystring.d.ts.map +0 -1
  275. package/dist/types/utils/redirectUrls.d.ts.map +0 -1
  276. package/dist/types/utils/windowNavigate.d.ts.map +0 -1
@@ -1,130 +0,0 @@
1
- import { TernSecureBase } from "./Base";
2
- class Cookie extends TernSecureBase {
3
- pathroot = "cookies";
4
- idToken;
5
- sessionToken;
6
- refreshToken;
7
- customToken;
8
- constructor() {
9
- super();
10
- }
11
- getTokenInCookie = (tokenName) => {
12
- return this.baseGet({
13
- path: `${this.pathroot}/get`,
14
- search: { tokenName }
15
- });
16
- };
17
- parseTokenResponse = (apiResponse, tokenType) => {
18
- if (!apiResponse) {
19
- return {
20
- success: false,
21
- error: `${tokenType} not found in httpOnly cookies`
22
- };
23
- }
24
- const { success, token, error } = apiResponse;
25
- return {
26
- success,
27
- token,
28
- error
29
- };
30
- };
31
- getIdToken = async () => {
32
- const res = await this.getTokenInCookie("idToken");
33
- return this.parseTokenResponse(res, "idToken");
34
- };
35
- getSessionToken = async () => {
36
- var _a;
37
- try {
38
- const response = await this.getTokenInCookie("sessionToken");
39
- if (!response || !((_a = response.response) == null ? void 0 : _a.token)) {
40
- return {
41
- success: false,
42
- error: "Session token not found in httpOnly cookies"
43
- };
44
- }
45
- return {
46
- success: true,
47
- token: response.response.token
48
- };
49
- } catch (error) {
50
- return {
51
- success: false,
52
- error: `Failed to retrieve session token: ${error instanceof Error ? error.message : String(error)}`
53
- };
54
- }
55
- };
56
- getRefreshToken = async () => {
57
- var _a;
58
- try {
59
- const response = await this.getTokenInCookie("refreshToken");
60
- if (!response || !((_a = response.response) == null ? void 0 : _a.token)) {
61
- return {
62
- success: false,
63
- error: "Refresh token not found in httpOnly cookies"
64
- };
65
- }
66
- return {
67
- success: true,
68
- token: response.response.token
69
- };
70
- } catch (error) {
71
- return {
72
- success: false,
73
- error: `Failed to retrieve refresh token: ${error instanceof Error ? error.message : String(error)}`
74
- };
75
- }
76
- };
77
- getCustomToken = async () => {
78
- var _a;
79
- try {
80
- const response = await this.getTokenInCookie("customToken");
81
- if (!response || !((_a = response.response) == null ? void 0 : _a.token)) {
82
- return {
83
- success: false,
84
- error: "Custom token not found in httpOnly cookies"
85
- };
86
- }
87
- return {
88
- success: true,
89
- token: response.response.token
90
- };
91
- } catch (error) {
92
- return {
93
- success: false,
94
- error: `Failed to retrieve custom token: ${error instanceof Error ? error.message : String(error)}`
95
- };
96
- }
97
- };
98
- getAllTokens = async () => {
99
- const [idToken, sessionToken, refreshToken, customToken] = await Promise.all([
100
- this.getIdToken(),
101
- this.getSessionToken(),
102
- this.getRefreshToken(),
103
- this.getCustomToken()
104
- ]);
105
- return {
106
- idToken,
107
- sessionToken,
108
- refreshToken,
109
- customToken
110
- };
111
- };
112
- hasToken = async (tokenType) => {
113
- switch (tokenType) {
114
- case "idToken":
115
- return (await this.getIdToken()).success;
116
- case "sessionToken":
117
- return (await this.getSessionToken()).success;
118
- case "refreshToken":
119
- return (await this.getRefreshToken()).success;
120
- case "customToken":
121
- return (await this.getCustomToken()).success;
122
- default:
123
- return false;
124
- }
125
- };
126
- }
127
- export {
128
- Cookie
129
- };
130
- //# sourceMappingURL=cookie.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/resources/cookie.ts"],"sourcesContent":["import type { CookieResource } from '@tern-secure/types';\n\n//import { eventBus, events } from '../instance/events';\nimport { TernSecureBase } from './Base';\n\nexport type TokenResult = {\n success: boolean;\n token?: string;\n error?: string;\n};\n\ntype CookieTokenResponse = {\n success: boolean;\n token?: string;\n error?: string;\n};\n\nexport class Cookie extends TernSecureBase implements CookieResource {\n pathroot = 'cookies';\n\n idToken?: string;\n sessionToken?: string;\n refreshToken?: string;\n customToken?: string;\n\n constructor() {\n super();\n }\n\n private getTokenInCookie = (tokenName: string) => {\n return this.baseGet({\n path: `${this.pathroot}/get`,\n search: { tokenName },\n });\n };\n\n\n private parseTokenResponse = (\n apiResponse: any,\n tokenType: string,\n ): TokenResult => {\n if (!apiResponse) {\n return {\n success: false,\n error: `${tokenType} not found in httpOnly cookies`,\n };\n }\n\n const { success, token, error } = apiResponse as CookieTokenResponse;\n\n return {\n success,\n token,\n error,\n };\n };\n\n getIdToken = async (): Promise<TokenResult> => {\n const res = await this.getTokenInCookie('idToken');\n //eventBus.emit(events.TokenJwt, { tokenType: 'idToken', response: res });\n return this.parseTokenResponse(res, 'idToken');\n };\n\n getSessionToken = async (): Promise<TokenResult> => {\n try {\n const response = await this.getTokenInCookie('sessionToken');\n\n if (!response || !response.response?.token) {\n return {\n success: false,\n error: 'Session token not found in httpOnly cookies',\n };\n }\n\n return {\n success: true,\n token: response.response.token,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve session token: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n };\n\n getRefreshToken = async (): Promise<TokenResult> => {\n try {\n const response = await this.getTokenInCookie('refreshToken');\n\n if (!response || !response.response?.token) {\n return {\n success: false,\n error: 'Refresh token not found in httpOnly cookies',\n };\n }\n\n return {\n success: true,\n token: response.response.token,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve refresh token: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n };\n\n getCustomToken = async (): Promise<TokenResult> => {\n try {\n const response = await this.getTokenInCookie('customToken');\n\n if (!response || !response.response?.token) {\n return {\n success: false,\n error: 'Custom token not found in httpOnly cookies',\n };\n }\n\n return {\n success: true,\n token: response.response.token,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve custom token: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n };\n\n getAllTokens = async (): Promise<Record<string, TokenResult>> => {\n const [idToken, sessionToken, refreshToken, customToken] = await Promise.all([\n this.getIdToken(),\n this.getSessionToken(),\n this.getRefreshToken(),\n this.getCustomToken(),\n ]);\n\n return {\n idToken,\n sessionToken,\n refreshToken,\n customToken,\n };\n };\n\n hasToken = async (tokenType: keyof CookieResource): Promise<boolean> => {\n switch (tokenType) {\n case 'idToken':\n return (await this.getIdToken()).success;\n case 'sessionToken':\n return (await this.getSessionToken()).success;\n case 'refreshToken':\n return (await this.getRefreshToken()).success;\n case 'customToken':\n return (await this.getCustomToken()).success;\n default:\n return false;\n }\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,2 +0,0 @@
1
- export * from "./SignIn";
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/resources/index.ts"],"sourcesContent":["export * from './SignIn';"],"mappings":"AAAA,cAAc;","names":[]}
@@ -1,8 +0,0 @@
1
- export * from "./Session";
2
- export * from "./SignUp";
3
- export * from "./SignIn";
4
- export * from "./Base";
5
- export * from "../auth/AuthCookieManager";
6
- export * from "../utils";
7
- export * from "./Error";
8
- //# sourceMappingURL=internal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/resources/internal.ts"],"sourcesContent":["export type { TernSecureAuth } from '../instance/TernAuth';\nexport * from './Session';\nexport * from './SignUp';\nexport * from './SignIn';\nexport * from './Base';\nexport * from '../auth/AuthCookieManager';\nexport * from '../utils';\nexport * from './Error';\n"],"mappings":"AACA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -1,215 +0,0 @@
1
- import { camelToSnake } from "@tern-secure/shared/caseUtils";
2
- import { globs } from "@tern-secure/shared/globs";
3
- import { logger } from "@tern-secure/shared/logger";
4
- import { joinPaths } from "./path";
5
- import { getQueryParams } from "./querystring";
6
- const DUMMY_URL_BASE = "http://ternsecure-dummy";
7
- const BANNED_URI_PROTOCOLS = ["javascript:"];
8
- function buildURL(params, options = {}) {
9
- const { base, hashPath, hashSearch, searchParams, hashSearchParams, ...rest } = params;
10
- let baseFallback = "";
11
- if (typeof window !== "undefined" && !!window.location) {
12
- baseFallback = window.location.href;
13
- } else {
14
- baseFallback = "http://react-native-fake-base-url";
15
- }
16
- const url = new URL(base || "", baseFallback);
17
- if (searchParams instanceof URLSearchParams) {
18
- searchParams.forEach((value, key) => {
19
- if (value !== null && value !== void 0) {
20
- url.searchParams.set(camelToSnake(key), value);
21
- }
22
- });
23
- }
24
- Object.assign(url, rest);
25
- if (hashPath || hashSearch || hashSearchParams) {
26
- const dummyUrlForHash = new URL(DUMMY_URL_BASE + url.hash.substring(1));
27
- dummyUrlForHash.pathname = joinPaths(dummyUrlForHash.pathname, hashPath || "");
28
- const searchParamsFromHashSearchString = getQueryParams(hashSearch || "");
29
- for (const [key, val] of Object.entries(searchParamsFromHashSearchString)) {
30
- dummyUrlForHash.searchParams.append(key, val);
31
- }
32
- if (hashSearchParams) {
33
- const paramsArr = Array.isArray(hashSearchParams) ? hashSearchParams : [hashSearchParams];
34
- for (const _params of paramsArr) {
35
- if (!(_params instanceof URLSearchParams) && typeof _params !== "object") {
36
- continue;
37
- }
38
- const params2 = new URLSearchParams(_params);
39
- params2.forEach((value, key) => {
40
- if (value !== null && value !== void 0) {
41
- dummyUrlForHash.searchParams.set(camelToSnake(key), value);
42
- }
43
- });
44
- }
45
- }
46
- const newHash = dummyUrlForHash.href.replace(DUMMY_URL_BASE, "");
47
- if (newHash !== "/") {
48
- url.hash = newHash;
49
- }
50
- }
51
- const { stringify, skipOrigin } = options;
52
- if (stringify) {
53
- return skipOrigin ? url.href.replace(url.origin, "") : url.href;
54
- }
55
- return url;
56
- }
57
- const constructFullUrl = (path) => {
58
- if (typeof window === "undefined") return path;
59
- const baseUrl = window.location.origin;
60
- if (path.startsWith("http")) {
61
- return path;
62
- }
63
- return `${baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
64
- };
65
- const hasRedirectLoop = (currentPath, redirectPath) => {
66
- if (!currentPath || !redirectPath) return false;
67
- const cleanCurrentPath = currentPath.split("?")[0];
68
- const cleanRedirectPath = redirectPath.split("?")[0];
69
- return cleanCurrentPath === cleanRedirectPath;
70
- };
71
- const urlWithRedirect = (options) => {
72
- const {
73
- signInUrl,
74
- signInPathParam = "/sign-in",
75
- currentPath,
76
- signUpUrl,
77
- signUpPathParam = "/sign-up"
78
- } = options;
79
- const baseUrl = window.location.origin;
80
- if (typeof window === "undefined") {
81
- return signInUrl;
82
- }
83
- const url = new URL(signInUrl, baseUrl);
84
- if (!currentPath.includes(signInPathParam) && !currentPath.includes(signUpPathParam)) {
85
- url.searchParams.set("redirect", currentPath);
86
- }
87
- return url.toString();
88
- };
89
- const storePreviousPath = (path) => {
90
- if (typeof window !== "undefined") {
91
- sessionStorage.setItem("previousPath", path);
92
- }
93
- };
94
- const getPreviousPath = () => {
95
- if (typeof window !== "undefined") {
96
- return sessionStorage.getItem("previousPath");
97
- }
98
- return null;
99
- };
100
- const getValidRedirectUrl = (searchParams, configuredRedirect) => {
101
- const urlRedirect = searchParams.get("redirect");
102
- if (urlRedirect) {
103
- return validateUrl(urlRedirect);
104
- }
105
- if (configuredRedirect) {
106
- return validateUrl(configuredRedirect);
107
- }
108
- return "/";
109
- };
110
- const validateUrl = (url) => {
111
- try {
112
- if (url.startsWith("http")) {
113
- const urlObj = new URL(url);
114
- if (typeof window !== "undefined" && urlObj.origin !== window.location.origin) {
115
- return "/";
116
- }
117
- }
118
- return "/";
119
- } catch {
120
- return "/";
121
- }
122
- };
123
- function toURL(url) {
124
- return new URL(url.toString(), window.location.origin);
125
- }
126
- function stripOrigin(url) {
127
- url = toURL(url);
128
- return url.href.replace(url.origin, "");
129
- }
130
- const trimTrailingSlash = (path) => {
131
- return (path || "").replace(/\/+$/, "");
132
- };
133
- function isValidUrl(val) {
134
- if (!val) {
135
- return false;
136
- }
137
- try {
138
- new URL(val);
139
- return true;
140
- } catch {
141
- return false;
142
- }
143
- }
144
- function relativeToAbsoluteUrl(url, origin) {
145
- try {
146
- return new URL(url);
147
- } catch {
148
- return new URL(url, origin);
149
- }
150
- }
151
- const disallowedPatterns = [
152
- /\0/,
153
- // Null bytes
154
- /^\/\//,
155
- // Protocol-relative
156
- // eslint-disable-next-line no-control-regex
157
- /[\x00-\x1F]/
158
- // Control characters
159
- ];
160
- function isProblematicUrl(url) {
161
- if (hasBannedProtocol(url)) {
162
- return true;
163
- }
164
- for (const pattern of disallowedPatterns) {
165
- if (pattern.test(url.pathname)) {
166
- return true;
167
- }
168
- }
169
- return false;
170
- }
171
- function hasBannedProtocol(val) {
172
- if (!isValidUrl(val)) {
173
- return false;
174
- }
175
- const protocol = new URL(val).protocol;
176
- return BANNED_URI_PROTOCOLS.some((bp) => bp === protocol);
177
- }
178
- const isAllowedRedirect = (allowedRedirectOrigins, currentOrigin) => (_url) => {
179
- if (!currentOrigin) return true;
180
- let url = _url;
181
- if (typeof url === "string") {
182
- url = relativeToAbsoluteUrl(url, currentOrigin);
183
- }
184
- if (!allowedRedirectOrigins) {
185
- return true;
186
- }
187
- const isSameOrigin = currentOrigin === url.origin;
188
- const isAllowed = !isProblematicUrl(url) && (isSameOrigin || allowedRedirectOrigins.map(
189
- (origin) => typeof origin === "string" ? globs.toRegexp(trimTrailingSlash(origin)) : origin
190
- ).some((origin) => origin.test(trimTrailingSlash(url.origin))));
191
- if (!isAllowed) {
192
- logger.warnOnce(
193
- `Clerk: Redirect URL ${url} is not on one of the allowedRedirectOrigins, falling back to the default redirect URL.`
194
- );
195
- }
196
- return isAllowed;
197
- };
198
- export {
199
- buildURL,
200
- constructFullUrl,
201
- getPreviousPath,
202
- getValidRedirectUrl,
203
- hasBannedProtocol,
204
- hasRedirectLoop,
205
- isAllowedRedirect,
206
- isProblematicUrl,
207
- isValidUrl,
208
- relativeToAbsoluteUrl,
209
- storePreviousPath,
210
- stripOrigin,
211
- toURL,
212
- trimTrailingSlash,
213
- urlWithRedirect
214
- };
215
- //# sourceMappingURL=construct.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/construct.ts"],"sourcesContent":["import { camelToSnake } from '@tern-secure/shared/caseUtils';\nimport { globs } from '@tern-secure/shared/globs';\nimport { logger } from '@tern-secure/shared/logger';\n\nimport { joinPaths } from './path';\nimport { getQueryParams } from './querystring';\n\nconst DUMMY_URL_BASE = 'http://ternsecure-dummy';\n\nconst BANNED_URI_PROTOCOLS = ['javascript:'] as const;\n\nexport type constructUrlWithRedirectProps = {\n signInUrl: string;\n signInPathParam?: string;\n currentPath: string;\n signUpUrl?: string;\n signUpPathParam?: string;\n};\n\ninterface BuildURLParams extends Partial<URL> {\n base?: string;\n hashPath?: string;\n hashSearch?: string;\n hashSearchParams?:\n | URLSearchParams\n | Record<string, string>\n | Array<URLSearchParams | Record<string, string>>;\n}\n\ninterface BuildURLOptions<T> {\n skipOrigin?: boolean;\n stringify?: T;\n}\n\n/**\n *\n * buildURL(params: URLParams, options: BuildURLOptions): string\n *\n * Builds a URL safely by using the native URL() constructor. It can\n * also build a secondary path and search URL that lives inside the hash\n * of the main URL. For example:\n *\n * https://foo.com/bar?qux=42#/hash-bar?hash-qux=42\n *\n * References:\n * https://developer.mozilla.org/en-US/docs/Web/API/URL\n *\n * @param {BuildURLParams} params\n * @param {BuildURLOptions} options\n * @returns {URL | string} Returns the URL href\n */\nexport function buildURL<B extends boolean>(\n params: BuildURLParams,\n options?: BuildURLOptions<B>,\n): B extends true ? string : URL;\n\nexport function buildURL(\n params: BuildURLParams,\n options: BuildURLOptions<boolean> = {},\n): URL | string {\n const { base, hashPath, hashSearch, searchParams, hashSearchParams, ...rest } = params;\n\n let baseFallback = '';\n if (typeof window !== 'undefined' && !!window.location) {\n baseFallback = window.location.href;\n } else {\n baseFallback = 'http://react-native-fake-base-url';\n }\n\n const url = new URL(base || '', baseFallback);\n\n // Handle search parameters\n // params.searchParams comes from Partial<URL>, so it's URLSearchParams | undefined\n if (searchParams instanceof URLSearchParams) {\n searchParams.forEach((value, key) => {\n if (value !== null && value !== undefined) {\n url.searchParams.set(camelToSnake(key), value);\n }\n });\n }\n\n Object.assign(url, rest);\n\n // Handle hash-related parameters\n if (hashPath || hashSearch || hashSearchParams) {\n const dummyUrlForHash = new URL(DUMMY_URL_BASE + url.hash.substring(1));\n\n dummyUrlForHash.pathname = joinPaths(dummyUrlForHash.pathname, hashPath || '');\n\n const searchParamsFromHashSearchString = getQueryParams(hashSearch || '');\n\n for (const [key, val] of Object.entries(searchParamsFromHashSearchString)) {\n dummyUrlForHash.searchParams.append(key, val);\n }\n\n if (hashSearchParams) {\n const paramsArr = Array.isArray(hashSearchParams) ? hashSearchParams : [hashSearchParams];\n for (const _params of paramsArr) {\n if (!(_params instanceof URLSearchParams) && typeof _params !== 'object') {\n continue;\n }\n const params = new URLSearchParams(_params);\n params.forEach((value, key) => {\n if (value !== null && value !== undefined) {\n dummyUrlForHash.searchParams.set(camelToSnake(key), value);\n }\n });\n }\n }\n\n const newHash = dummyUrlForHash.href.replace(DUMMY_URL_BASE, '');\n if (newHash !== '/') {\n // Assign them to the hash of the main url\n url.hash = newHash;\n }\n }\n\n const { stringify, skipOrigin } = options;\n if (stringify) {\n return skipOrigin ? url.href.replace(url.origin, '') : url.href;\n }\n return url;\n}\n\n/**\n * Constructs a full URL with the current origin\n * @param path - The path to construct the URL for\n * @returns The full URL with origin\n */\nexport const constructFullUrl = (path: string) => {\n if (typeof window === 'undefined') return path;\n const baseUrl = window.location.origin;\n if (path.startsWith('http')) {\n return path;\n }\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n};\n\n/**\n * Checks if the current URL has a redirect loop\n * @param currentPath - The current pathname\n * @param redirectPath - The path we're trying to redirect to\n * @returns boolean indicating if there's a redirect loop\n */\nexport const hasRedirectLoop = (currentPath: string, redirectPath: string): boolean => {\n if (!currentPath || !redirectPath) return false;\n\n // Remove any query parameters for comparison\n const cleanCurrentPath = currentPath.split('?')[0];\n const cleanRedirectPath = redirectPath.split('?')[0];\n\n return cleanCurrentPath === cleanRedirectPath;\n};\n\nexport const urlWithRedirect = (options: constructUrlWithRedirectProps): string => {\n const {\n signInUrl,\n signInPathParam = '/sign-in',\n currentPath,\n signUpUrl,\n signUpPathParam = '/sign-up',\n } = options;\n\n const baseUrl = window.location.origin;\n\n if (typeof window === 'undefined') {\n return signInUrl;\n }\n\n const url = new URL(signInUrl, baseUrl);\n\n if (!currentPath.includes(signInPathParam) && !currentPath.includes(signUpPathParam)) {\n url.searchParams.set('redirect', currentPath);\n }\n\n return url.toString();\n};\n\n/**\n * Stores the current path before signing out\n */\nexport const storePreviousPath = (path: string): void => {\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('previousPath', path);\n }\n};\n\n/**\n * Gets the stored previous path\n */\nexport const getPreviousPath = (): string | null => {\n if (typeof window !== 'undefined') {\n return sessionStorage.getItem('previousPath');\n }\n return null;\n};\n\n/**\n * Gets a validated redirect URL ensuring it's from the same origin\n * @param redirectUrl - The URL to validate\n * @param searchParams - The search parameters to check for redirect\n * @returns A validated redirect URL\n */\nexport const getValidRedirectUrl = (\n searchParams: URLSearchParams,\n configuredRedirect?: string,\n): string => {\n // Check URL search param first (highest priority)\n const urlRedirect = searchParams.get('redirect');\n if (urlRedirect) {\n return validateUrl(urlRedirect);\n }\n\n // Then check configured redirect (for first visits)\n if (configuredRedirect) {\n return validateUrl(configuredRedirect);\n }\n\n // Default fallback\n return '/';\n};\n\n/**\n * Validates and sanitizes URLs\n */\nconst validateUrl = (url: string): string => {\n try {\n // For absolute URLs\n if (url.startsWith('http')) {\n const urlObj = new URL(url);\n if (typeof window !== 'undefined' && urlObj.origin !== window.location.origin) {\n return '/';\n }\n }\n\n // For relative URLs\n return '/';\n } catch {\n return '/';\n }\n};\n\nexport function toURL(url: string | URL): URL {\n return new URL(url.toString(), window.location.origin);\n}\n\n/**\n *\n * stripOrigin(url: URL | string): string\n *\n * Strips the origin part of a URL and preserves path, search and hash is applicable\n *\n * References:\n * https://developer.mozilla.org/en-US/docs/Web/API/URL\n *\n * @param {URL | string} url\n * @returns {string} Returns the URL href without the origin\n */\nexport function stripOrigin(url: URL | string): string {\n url = toURL(url);\n return url.href.replace(url.origin, '');\n}\n\n/**\n * trimTrailingSlash(path: string): string\n *\n * Strips the trailing slashes from a string\n *\n * @returns {string} Returns the string without trailing slashes\n * @param path\n */\nexport const trimTrailingSlash = (path: string): string => {\n return (path || '').replace(/\\/+$/, '');\n};\n\nexport function isValidUrl(val: unknown): val is string {\n if (!val) {\n return false;\n }\n\n try {\n new URL(val as string);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function relativeToAbsoluteUrl(url: string, origin: string | URL): URL {\n try {\n return new URL(url);\n } catch {\n return new URL(url, origin);\n }\n}\n\n// Regular expression to detect disallowed patterns\nconst disallowedPatterns = [\n /\\0/, // Null bytes\n /^\\/\\//, // Protocol-relative\n // eslint-disable-next-line no-control-regex\n /[\\x00-\\x1F]/, // Control characters\n];\n\n/**\n * Check for potentially problematic URLs that could have been crafted to intentionally bypass the origin check. Note that the URLs passed to this\n * function are assumed to be from an \"allowed origin\", so we are not executing origin-specific checks here.\n */\nexport function isProblematicUrl(url: URL): boolean {\n if (hasBannedProtocol(url)) {\n return true;\n }\n // Check against disallowed patterns\n for (const pattern of disallowedPatterns) {\n if (pattern.test(url.pathname)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function hasBannedProtocol(val: string | URL) {\n if (!isValidUrl(val)) {\n return false;\n }\n const protocol = new URL(val).protocol;\n return BANNED_URI_PROTOCOLS.some(bp => bp === protocol);\n}\n\nexport const isAllowedRedirect =\n (allowedRedirectOrigins: Array<string | RegExp> | undefined, currentOrigin: string) =>\n (_url: URL | string) => {\n // On server-side (no origin), allow all redirects\n // They will be validated on client-side\n if (!currentOrigin) return true;\n\n let url = _url;\n if (typeof url === 'string') {\n url = relativeToAbsoluteUrl(url, currentOrigin);\n }\n\n if (!allowedRedirectOrigins) {\n return true;\n }\n\n const isSameOrigin = currentOrigin === url.origin;\n\n const isAllowed =\n !isProblematicUrl(url) &&\n (isSameOrigin ||\n allowedRedirectOrigins\n .map(origin =>\n typeof origin === 'string' ? globs.toRegexp(trimTrailingSlash(origin)) : origin,\n )\n .some(origin => origin.test(trimTrailingSlash(url.origin))));\n\n if (!isAllowed) {\n logger.warnOnce(\n `Clerk: Redirect URL ${url} is not on one of the allowedRedirectOrigins, falling back to the default redirect URL.`,\n );\n }\n return isAllowed;\n };\n"],"mappings":"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","names":["params"]}
@@ -1,5 +0,0 @@
1
- export * from "./construct";
2
- export * from "./querystring";
3
- export * from "./redirectUrls";
4
- export * from "./windowNavigate";
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './construct';\nexport * from './querystring';\nexport * from './redirectUrls';\nexport * from './windowNavigate';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -1,22 +0,0 @@
1
- import { decodeJwt, decodeProtectedHeader } from "jose";
2
- import { mapJwtPayloadToDecodedIdToken } from "./mapDecode";
3
- function decode(token) {
4
- const header = decodeProtectedHeader(token);
5
- const payload = decodeJwt(token);
6
- const parts = (token || "").split(".");
7
- const [signature] = parts;
8
- const data = {
9
- header,
10
- payload,
11
- signature
12
- };
13
- const decoded = mapJwtPayloadToDecodedIdToken(payload);
14
- return {
15
- encoded: data,
16
- decoded
17
- };
18
- }
19
- export {
20
- decode
21
- };
22
- //# sourceMappingURL=jwt.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/jwt.ts"],"sourcesContent":["import { decodeJwt, decodeProtectedHeader } from 'jose';\n\nimport type { DecodedIdToken, JWTPayload, JWTProtectedHeader } from './mapDecode';\nimport { mapJwtPayloadToDecodedIdToken } from './mapDecode';\n\ntype JWT = {\n encoded: { header: JWTProtectedHeader; payload: JWTPayload; signature: string };\n decoded: DecodedIdToken;\n};\n\nexport function decode(token: string): JWT {\n const header = decodeProtectedHeader(token);\n const payload = decodeJwt(token);\n\n const parts = (token || '').split('.');\n const [signature] = parts;\n\n const data = {\n header,\n payload,\n signature,\n };\n\n const decoded = mapJwtPayloadToDecodedIdToken(payload);\n\n return {\n encoded: data,\n decoded,\n };\n}\n"],"mappings":"AAAA,SAAS,WAAW,6BAA6B;AAGjD,SAAS,qCAAqC;AAOvC,SAAS,OAAO,OAAoB;AACzC,QAAM,SAAS,sBAAsB,KAAK;AAC1C,QAAM,UAAU,UAAU,KAAK;AAE/B,QAAM,SAAS,SAAS,IAAI,MAAM,GAAG;AACrC,QAAM,CAAC,SAAS,IAAI;AAEpB,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,8BAA8B,OAAO;AAErD,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -1,9 +0,0 @@
1
- function mapJwtPayloadToDecodedIdToken(payload) {
2
- const decodedIdToken = payload;
3
- decodedIdToken.uid = decodedIdToken.sub;
4
- return decodedIdToken;
5
- }
6
- export {
7
- mapJwtPayloadToDecodedIdToken
8
- };
9
- //# sourceMappingURL=mapDecode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/mapDecode.ts"],"sourcesContent":["import type { DecodedIdToken, JWTPayload, JWTProtectedHeader } from '@tern-secure/types';\n\nexport function mapJwtPayloadToDecodedIdToken(payload: JWTPayload) {\n const decodedIdToken = payload as DecodedIdToken;\n decodedIdToken.uid = decodedIdToken.sub;\n return decodedIdToken;\n}\n\nexport type { DecodedIdToken, JWTPayload, JWTProtectedHeader };\n"],"mappings":"AAEO,SAAS,8BAA8B,SAAqB;AACjE,QAAM,iBAAiB;AACvB,iBAAe,MAAM,eAAe;AACpC,SAAO;AACT;","names":[]}
@@ -1,9 +0,0 @@
1
- const SEPARATOR = "/";
2
- const MULTIPLE_SEPARATOR_REGEX = new RegExp(SEPARATOR + "{1,}", "g");
3
- function joinPaths(a, b) {
4
- return [a, b].filter((p) => p).join(SEPARATOR).replace(MULTIPLE_SEPARATOR_REGEX, SEPARATOR);
5
- }
6
- export {
7
- joinPaths
8
- };
9
- //# sourceMappingURL=path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/path.ts"],"sourcesContent":["const SEPARATOR = '/';\nconst MULTIPLE_SEPARATOR_REGEX = new RegExp(SEPARATOR + '{1,}', 'g');\n\ntype PathString = string | null | undefined;\n\nexport function joinPaths(a: PathString, b: PathString): string {\n return [a, b]\n .filter(p => p)\n .join(SEPARATOR)\n .replace(MULTIPLE_SEPARATOR_REGEX, SEPARATOR);\n}\n"],"mappings":"AAAA,MAAM,YAAY;AAClB,MAAM,2BAA2B,IAAI,OAAO,YAAY,QAAQ,GAAG;AAI5D,SAAS,UAAU,GAAe,GAAuB;AAC9D,SAAO,CAAC,GAAG,CAAC,EACT,OAAO,OAAK,CAAC,EACb,KAAK,SAAS,EACd,QAAQ,0BAA0B,SAAS;AAChD;","names":[]}
@@ -1,45 +0,0 @@
1
- const getQueryParams = (queryString) => {
2
- const queryParamsObject = {};
3
- const queryParams = new URLSearchParams(queryString);
4
- queryParams.forEach((value, key) => {
5
- if (key in queryParamsObject) {
6
- const existingValue = queryParamsObject[key];
7
- if (Array.isArray(existingValue)) {
8
- existingValue.push(value);
9
- } else {
10
- queryParamsObject[key] = [existingValue, value];
11
- }
12
- } else {
13
- queryParamsObject[key] = value;
14
- }
15
- });
16
- return queryParamsObject;
17
- };
18
- const stringifyQueryParams = (params, opts = {}) => {
19
- if (params === null || params === void 0) {
20
- return "";
21
- }
22
- if (!params || typeof params !== "object") {
23
- return "";
24
- }
25
- const queryParams = new URLSearchParams();
26
- Object.keys(params).forEach((key) => {
27
- const encodedKey = opts.keyEncoder ? opts.keyEncoder(key) : key;
28
- const value = params[key];
29
- if (Array.isArray(value)) {
30
- value.forEach((v) => v !== void 0 && queryParams.append(encodedKey, v || ""));
31
- } else if (value === void 0) {
32
- return;
33
- } else if (typeof value === "object" && value !== null) {
34
- queryParams.append(encodedKey, JSON.stringify(value));
35
- } else {
36
- queryParams.append(encodedKey, String(value ?? ""));
37
- }
38
- });
39
- return queryParams.toString();
40
- };
41
- export {
42
- getQueryParams,
43
- stringifyQueryParams
44
- };
45
- //# sourceMappingURL=querystring.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/querystring.ts"],"sourcesContent":["export const getQueryParams = (queryString: string) => {\n const queryParamsObject: { [key: string]: string | string[] } = {};\n const queryParams = new URLSearchParams(queryString);\n queryParams.forEach((value, key) => {\n if (key in queryParamsObject) {\n // If the key already exists, we need to handle it as an array\n const existingValue = queryParamsObject[key];\n if (Array.isArray(existingValue)) {\n existingValue.push(value);\n } else {\n queryParamsObject[key] = [existingValue, value];\n }\n } else {\n queryParamsObject[key] = value;\n }\n });\n return queryParamsObject as Record<string, string>;\n};\n\ntype StringifyQueryParamsOptions = {\n keyEncoder?: (key: string) => string;\n};\n\nexport const stringifyQueryParams = (\n params:\n | Record<string, string | undefined | null | object | boolean | Array<string | undefined | null>>\n | null\n | undefined\n | string,\n opts: StringifyQueryParamsOptions = {},\n) => {\n if (params === null || params === undefined) {\n return '';\n }\n if (!params || typeof params !== 'object') {\n return '';\n }\n\n const queryParams = new URLSearchParams();\n\n Object.keys(params).forEach(key => {\n const encodedKey = opts.keyEncoder ? opts.keyEncoder(key) : key;\n const value = params[key];\n if (Array.isArray(value)) {\n value.forEach(v => v !== undefined && queryParams.append(encodedKey, v || ''));\n } else if (value === undefined) {\n return;\n } else if (typeof value === 'object' && value !== null) {\n queryParams.append(encodedKey, JSON.stringify(value));\n } else {\n queryParams.append(encodedKey, String(value ?? ''));\n }\n });\n\n return queryParams.toString();\n};\n"],"mappings":"AAAO,MAAM,iBAAiB,CAAC,gBAAwB;AACrD,QAAM,oBAA0D,CAAC;AACjE,QAAM,cAAc,IAAI,gBAAgB,WAAW;AACnD,cAAY,QAAQ,CAAC,OAAO,QAAQ;AAClC,QAAI,OAAO,mBAAmB;AAE5B,YAAM,gBAAgB,kBAAkB,GAAG;AAC3C,UAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,sBAAc,KAAK,KAAK;AAAA,MAC1B,OAAO;AACL,0BAAkB,GAAG,IAAI,CAAC,eAAe,KAAK;AAAA,MAChD;AAAA,IACF,OAAO;AACL,wBAAkB,GAAG,IAAI;AAAA,IAC3B;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAMO,MAAM,uBAAuB,CAClC,QAKA,OAAoC,CAAC,MAClC;AACH,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,IAAI,gBAAgB;AAExC,SAAO,KAAK,MAAM,EAAE,QAAQ,SAAO;AACjC,UAAM,aAAa,KAAK,aAAa,KAAK,WAAW,GAAG,IAAI;AAC5D,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,OAAK,MAAM,UAAa,YAAY,OAAO,YAAY,KAAK,EAAE,CAAC;AAAA,IAC/E,WAAW,UAAU,QAAW;AAC9B;AAAA,IACF,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,kBAAY,OAAO,YAAY,KAAK,UAAU,KAAK,CAAC;AAAA,IACtD,OAAO;AACL,kBAAY,OAAO,YAAY,OAAO,SAAS,EAAE,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,SAAO,YAAY,SAAS;AAC9B;","names":[]}
@@ -1,132 +0,0 @@
1
- import { camelToSnake } from "@tern-secure/shared/caseUtils";
2
- import { applyFunctionToObj, filterProps, removeUndefined } from "@tern-secure/shared/object";
3
- import { isAllowedRedirect, relativeToAbsoluteUrl } from "./construct";
4
- class RedirectUrls {
5
- static keys = [
6
- "signInForceRedirectUrl",
7
- "signInFallbackRedirectUrl",
8
- "signUpForceRedirectUrl",
9
- "signUpFallbackRedirectUrl",
10
- "afterSignInUrl",
11
- "afterSignUpUrl",
12
- "redirectUrl"
13
- ];
14
- static preserved = ["redirectUrl"];
15
- options;
16
- fromOptions;
17
- fromProps;
18
- fromSearchParams;
19
- constructor(options, props = {}, searchParams = {}) {
20
- this.options = options;
21
- this.fromOptions = this.#parse(options || {});
22
- this.fromProps = this.#parse(props || {});
23
- this.fromSearchParams = this.#parseSearchParams(searchParams || {});
24
- }
25
- getAfterSignInUrl() {
26
- return this.#getRedirectUrl("signIn");
27
- }
28
- getAfterSignUpUrl() {
29
- return this.#getRedirectUrl("signUp");
30
- }
31
- getPreservedSearchParams() {
32
- return this.#toSearchParams(this.#flattenPreserved());
33
- }
34
- toSearchParams() {
35
- return this.#toSearchParams(this.#flattenAll());
36
- }
37
- #toSearchParams(obj) {
38
- const camelCased = Object.fromEntries(
39
- Object.entries(obj).map(([key, value]) => [camelToSnake(key), value])
40
- );
41
- return new URLSearchParams(removeUndefined(camelCased));
42
- }
43
- #flattenPreserved() {
44
- return Object.fromEntries(
45
- Object.entries({ ...this.fromSearchParams }).filter(
46
- ([key]) => RedirectUrls.preserved.includes(key)
47
- )
48
- );
49
- }
50
- #flattenAll() {
51
- const signUpForceRedirectUrl = this.fromSearchParams.signUpForceRedirectUrl || this.fromProps.signUpForceRedirectUrl || this.fromOptions.signUpForceRedirectUrl;
52
- const signUpFallbackRedirectUrl = this.fromSearchParams.signUpFallbackRedirectUrl || this.fromProps.signUpFallbackRedirectUrl || this.fromOptions.signUpFallbackRedirectUrl;
53
- const signInForceRedirectUrl = this.fromSearchParams.signInForceRedirectUrl || this.fromProps.signInForceRedirectUrl || this.fromOptions.signInForceRedirectUrl;
54
- const signInFallbackRedirectUrl = this.fromSearchParams.signInFallbackRedirectUrl || this.fromProps.signInFallbackRedirectUrl || this.fromOptions.signInFallbackRedirectUrl;
55
- const afterSignInUrl = this.fromSearchParams.afterSignInUrl || this.fromProps.afterSignInUrl || this.fromOptions.afterSignInUrl;
56
- const afterSignUpUrl = this.fromSearchParams.afterSignUpUrl || this.fromProps.afterSignUpUrl || this.fromOptions.afterSignUpUrl;
57
- const redirectUrl = this.fromSearchParams.redirectUrl || this.fromProps.redirectUrl || this.fromOptions.redirectUrl;
58
- const res = {
59
- signUpForceRedirectUrl,
60
- signUpFallbackRedirectUrl,
61
- signInForceRedirectUrl,
62
- signInFallbackRedirectUrl,
63
- afterSignInUrl,
64
- afterSignUpUrl,
65
- redirectUrl
66
- };
67
- return res;
68
- }
69
- #getRedirectUrl(prefix) {
70
- const forceKey = `${prefix}ForceRedirectUrl`;
71
- const fallbackKey = `${prefix}FallbackRedirectUrl`;
72
- let newKeyInUse;
73
- let result;
74
- result = this.fromSearchParams[forceKey] || this.fromProps[forceKey] || this.fromOptions[forceKey];
75
- if (result) {
76
- newKeyInUse = forceKey;
77
- }
78
- result ||= this.fromSearchParams.redirectUrl;
79
- if (result) {
80
- newKeyInUse = "redirectUrl";
81
- }
82
- result ||= this.fromSearchParams[fallbackKey] || this.fromProps[fallbackKey] || this.fromOptions[fallbackKey];
83
- if (result) {
84
- newKeyInUse = fallbackKey;
85
- }
86
- if (!result) {
87
- if (typeof window === "undefined") {
88
- return "/";
89
- }
90
- return window.location.href;
91
- }
92
- return result || "/";
93
- }
94
- #parse(obj) {
95
- const res = {};
96
- RedirectUrls.keys.forEach((key) => {
97
- res[key] = obj[key];
98
- });
99
- return applyFunctionToObj(
100
- this.#filterRedirects(this.#toAbsoluteUrls(filterProps(res, Boolean))),
101
- (val) => val.toString()
102
- );
103
- }
104
- #parseSearchParams(obj) {
105
- const res = {};
106
- RedirectUrls.keys.forEach((key) => {
107
- if (obj instanceof URLSearchParams) {
108
- res[key] = obj.get(camelToSnake(key));
109
- } else {
110
- res[key] = obj[camelToSnake(key)];
111
- }
112
- });
113
- return applyFunctionToObj(
114
- this.#filterRedirects(this.#toAbsoluteUrls(filterProps(res, Boolean))),
115
- (val) => val.toString()
116
- );
117
- }
118
- #toAbsoluteUrls(obj) {
119
- const origin = typeof window !== "undefined" ? window.location.origin : "";
120
- if (!origin) return obj;
121
- return applyFunctionToObj(obj, (url) => relativeToAbsoluteUrl(url, origin));
122
- }
123
- #filterRedirects = (obj) => {
124
- var _a;
125
- const origin = typeof window !== "undefined" ? window.location.origin : "";
126
- return filterProps(obj, isAllowedRedirect((_a = this.options) == null ? void 0 : _a.allowedRedirectOrigins, origin));
127
- };
128
- }
129
- export {
130
- RedirectUrls
131
- };
132
- //# sourceMappingURL=redirectUrls.js.map