@tern-secure/react 1.2.0-canary.v20251108045933 → 1.2.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 (90) hide show
  1. package/dist/components/TernSecureHostRenderer.d.mts +24 -0
  2. package/dist/components/TernSecureHostRenderer.d.ts +24 -0
  3. package/dist/components/TernSecureHostRenderer.js +2 -0
  4. package/dist/components/TernSecureHostRenderer.js.map +1 -0
  5. package/dist/components/TernSecureHostRenderer.mjs +2 -0
  6. package/dist/components/TernSecureHostRenderer.mjs.map +1 -0
  7. package/dist/components/uiComponent.d.mts +30 -0
  8. package/dist/components/uiComponent.d.ts +30 -0
  9. package/dist/components/uiComponent.js +2 -0
  10. package/dist/components/uiComponent.js.map +1 -0
  11. package/dist/components/uiComponent.mjs +2 -0
  12. package/dist/components/uiComponent.mjs.map +1 -0
  13. package/dist/components/withTernSecure.d.mts +16 -0
  14. package/dist/components/withTernSecure.d.ts +16 -0
  15. package/dist/components/withTernSecure.js +2 -0
  16. package/dist/components/withTernSecure.js.map +1 -0
  17. package/dist/components/withTernSecure.mjs +2 -0
  18. package/dist/components/withTernSecure.mjs.map +1 -0
  19. package/dist/ctx/AuthProvider.d.mts +2 -2
  20. package/dist/ctx/AuthProvider.d.ts +2 -2
  21. package/dist/ctx/IsomorphicTernSecureCtx.d.mts +2 -2
  22. package/dist/ctx/IsomorphicTernSecureCtx.d.ts +2 -2
  23. package/dist/ctx/TernSecureCtxProvider.d.mts +2 -2
  24. package/dist/ctx/TernSecureCtxProvider.d.ts +2 -2
  25. package/dist/ctx/TernSecureCtxProvider.js +1 -1
  26. package/dist/ctx/TernSecureCtxProvider.js.map +1 -1
  27. package/dist/ctx/TernSecureCtxProvider.mjs +1 -1
  28. package/dist/ctx/TernSecureCtxProvider.mjs.map +1 -1
  29. package/dist/ctx/TernSecureProvider.d.mts +2 -2
  30. package/dist/ctx/TernSecureProvider.d.ts +2 -2
  31. package/dist/hooks/useMaxAllowedInstances.d.mts +6 -0
  32. package/dist/hooks/useMaxAllowedInstances.d.ts +6 -0
  33. package/dist/hooks/useMaxAllowedInstances.js +2 -0
  34. package/dist/hooks/useMaxAllowedInstances.js.map +1 -0
  35. package/dist/hooks/useMaxAllowedInstances.mjs +2 -0
  36. package/dist/hooks/useMaxAllowedInstances.mjs.map +1 -0
  37. package/dist/hooks/useSignIn.d.mts +4 -4
  38. package/dist/hooks/useSignIn.d.ts +4 -4
  39. package/dist/hooks/useSignIn.js +1 -1
  40. package/dist/hooks/useSignIn.js.map +1 -1
  41. package/dist/hooks/useSignIn.mjs +1 -1
  42. package/dist/hooks/useSignIn.mjs.map +1 -1
  43. package/dist/hooks/useWaitForComponentMount.d.mts +8 -0
  44. package/dist/hooks/useWaitForComponentMount.d.ts +8 -0
  45. package/dist/hooks/useWaitForComponentMount.js +2 -0
  46. package/dist/hooks/useWaitForComponentMount.js.map +1 -0
  47. package/dist/hooks/useWaitForComponentMount.mjs +2 -0
  48. package/dist/hooks/useWaitForComponentMount.mjs.map +1 -0
  49. package/dist/index.d.mts +3 -5
  50. package/dist/index.d.ts +3 -5
  51. package/dist/index.js +1 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/index.mjs +1 -1
  54. package/dist/index.mjs.map +1 -1
  55. package/dist/lib/isoTernSecureAuth.d.mts +29 -5
  56. package/dist/lib/isoTernSecureAuth.d.ts +29 -5
  57. package/dist/lib/isoTernSecureAuth.js +1 -1
  58. package/dist/lib/isoTernSecureAuth.js.map +1 -1
  59. package/dist/lib/isoTernSecureAuth.mjs +1 -1
  60. package/dist/lib/isoTernSecureAuth.mjs.map +1 -1
  61. package/dist/types.d.mts +43 -28
  62. package/dist/types.d.ts +43 -28
  63. package/dist/types.js +1 -1
  64. package/dist/types.js.map +1 -1
  65. package/dist/types.mjs.map +1 -1
  66. package/dist/utils/debug.d.mts +2 -1
  67. package/dist/utils/debug.d.ts +2 -1
  68. package/dist/utils/debug.js +1 -1
  69. package/dist/utils/debug.js.map +1 -1
  70. package/dist/utils/debug.mjs +1 -1
  71. package/dist/utils/debug.mjs.map +1 -1
  72. package/dist/utils/isConstructor.d.mts +3 -0
  73. package/dist/utils/isConstructor.d.ts +3 -0
  74. package/dist/utils/isConstructor.js +2 -0
  75. package/dist/utils/isConstructor.js.map +1 -0
  76. package/dist/utils/isConstructor.mjs +2 -0
  77. package/dist/utils/isConstructor.mjs.map +1 -0
  78. package/package.json +3 -4
  79. package/dist/ctx/SignInCtx.d.mts +0 -27
  80. package/dist/ctx/SignInCtx.d.ts +0 -27
  81. package/dist/ctx/SignInCtx.js +0 -2
  82. package/dist/ctx/SignInCtx.js.map +0 -1
  83. package/dist/ctx/SignInCtx.mjs +0 -2
  84. package/dist/ctx/SignInCtx.mjs.map +0 -1
  85. package/dist/ctx/SignUpCtx.d.mts +0 -22
  86. package/dist/ctx/SignUpCtx.d.ts +0 -22
  87. package/dist/ctx/SignUpCtx.js +0 -2
  88. package/dist/ctx/SignUpCtx.js.map +0 -1
  89. package/dist/ctx/SignUpCtx.mjs +0 -2
  90. package/dist/ctx/SignUpCtx.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useSignIn.tsx"],"sourcesContent":["'use client';\n\nimport type {\n ResendEmailVerification,\n SignInFormValues,\n SignInResponse,\n SocialProviderOptions,\n UseSignInReturn,\n} from '@tern-secure/types';\n\nimport { useAuthSignInCtx } from '../ctx/TernSecureAuthResourcesCtx';\nimport { useAssertWrappedByTernSecureAuthProvider } from './useAssertWrappedTernSecureProvider';\n\n/**\n * Hook to access the SignInResource methods from TernSecureAuth\n * Provides type-safe access to all sign-in related functionality\n */\nexport const useSignIn = (): UseSignInReturn => {\n useAssertWrappedByTernSecureAuthProvider('useSignIn');\n const auth = useAuthSignInCtx();\n\n if (!auth) {\n return {\n isLoaded: false,\n signIn: undefined,\n };\n }\n\n return {\n isLoaded: true,\n signIn: auth,\n };\n};\n\nexport const signIn = {\n withEmailAndPassword: async (params: SignInFormValues): Promise<SignInResponse> => {\n const auth = useAuthSignInCtx();\n if (!auth) {\n throw new Error('SignIn methods not available - auth not initialized');\n }\n return auth.withEmailAndPassword(params);\n },\n\n withSocialProvider: async (\n provider: string,\n customOptions: SocialProviderOptions,\n ): Promise<SignInResponse | void> => {\n const auth = useAuthSignInCtx();\n if (!auth) {\n throw new Error('SignIn methods not available - auth not initialized');\n }\n return auth.withSocialProvider(provider, customOptions);\n },\n\n resendEmailVerification: async (): Promise<ResendEmailVerification> => {\n const auth = useAuthSignInCtx();\n if (!auth) {\n throw new Error('SignIn methods not available - auth not initialized');\n }\n return auth.resendEmailVerification();\n },\n\n checkRedirectResult: async (): Promise<SignInResponse | null> => {\n const auth = useAuthSignInCtx();\n if (!auth) {\n throw new Error('SignIn methods not available - auth not initialized');\n }\n return auth.checkRedirectResult();\n },\n};\n"],"mappings":"aAUA,OAAS,oBAAAA,MAAwB,oCACjC,OAAS,4CAAAC,MAAgD,uCAMlD,MAAMC,EAAY,IAAuB,CAC9CD,EAAyC,WAAW,EACpD,MAAME,EAAOH,EAAiB,EAE9B,OAAKG,EAOE,CACL,SAAU,GACV,OAAQA,CACV,EATS,CACL,SAAU,GACV,OAAQ,MACV,CAOJ,EAEaC,EAAS,CACpB,qBAAsB,MAAOC,GAAsD,CACjF,MAAMF,EAAOH,EAAiB,EAC9B,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,EAAK,qBAAqBE,CAAM,CACzC,EAEA,mBAAoB,MAClBC,EACAC,IACmC,CACnC,MAAMJ,EAAOH,EAAiB,EAC9B,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,EAAK,mBAAmBG,EAAUC,CAAa,CACxD,EAEA,wBAAyB,SAA8C,CACrE,MAAMJ,EAAOH,EAAiB,EAC9B,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,EAAK,wBAAwB,CACtC,EAEA,oBAAqB,SAA4C,CAC/D,MAAMA,EAAOH,EAAiB,EAC9B,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,EAAK,oBAAoB,CAClC,CACF","names":["useAuthSignInCtx","useAssertWrappedByTernSecureAuthProvider","useSignIn","auth","signIn","params","provider","customOptions"]}
1
+ {"version":3,"sources":["../../src/hooks/useSignIn.tsx"],"sourcesContent":["'use client';\n\nimport type {\n SignInPasswordParams,\n SignInResponse,\n SignInVerificationResponse,\n SocialProviderOptions,\n UseSignInReturn,\n} from '@tern-secure/types';\n\nimport { useAuthSignInCtx } from '../ctx/TernSecureAuthResourcesCtx';\nimport { useAssertWrappedByTernSecureAuthProvider } from './useAssertWrappedTernSecureProvider';\n\n/**\n * Hook to access the SignInResource methods from TernSecureAuth\n * Provides type-safe access to all sign-in related functionality\n */\nexport const useSignIn = (): UseSignInReturn => {\n useAssertWrappedByTernSecureAuthProvider('useSignIn');\n const auth = useAuthSignInCtx();\n\n if (!auth) {\n return {\n isLoaded: false,\n signIn: undefined,\n };\n }\n\n return {\n isLoaded: true,\n signIn: auth,\n };\n};\n\nexport const signIn = {\n authenticateWithPasswordd: async (params: SignInPasswordParams): Promise<SignInResponse> => {\n const auth = useAuthSignInCtx();\n if (!auth) {\n throw new Error('SignIn methods not available - auth not initialized');\n }\n return auth.authenticateWithPassword(params);\n },\n\n authenticateWithSocialProvider: async (\n provider: string,\n customOptions: SocialProviderOptions,\n ): Promise<SignInResponse | void> => {\n const auth = useAuthSignInCtx();\n if (!auth) {\n throw new Error('SignIn methods not available - auth not initialized');\n }\n return auth.authenticateWithSocialProvider(provider, customOptions);\n },\n\n attemptEmailVerification: async (): Promise<SignInVerificationResponse> => {\n const auth = useAuthSignInCtx();\n if (!auth) {\n throw new Error('SignIn methods not available - auth not initialized');\n }\n return auth.attemptEmailVerification();\n },\n\n checkRedirectResult: async (): Promise<SignInResponse | null> => {\n const auth = useAuthSignInCtx();\n if (!auth) {\n throw new Error('SignIn methods not available - auth not initialized');\n }\n return auth.checkRedirectResult();\n },\n};\n"],"mappings":"aAUA,OAAS,oBAAAA,MAAwB,oCACjC,OAAS,4CAAAC,MAAgD,uCAMlD,MAAMC,EAAY,IAAuB,CAC9CD,EAAyC,WAAW,EACpD,MAAME,EAAOH,EAAiB,EAE9B,OAAKG,EAOE,CACL,SAAU,GACV,OAAQA,CACV,EATS,CACL,SAAU,GACV,OAAQ,MACV,CAOJ,EAEaC,EAAS,CACpB,0BAA2B,MAAOC,GAA0D,CAC1F,MAAMF,EAAOH,EAAiB,EAC9B,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,EAAK,yBAAyBE,CAAM,CAC7C,EAEA,+BAAgC,MAC9BC,EACAC,IACmC,CACnC,MAAMJ,EAAOH,EAAiB,EAC9B,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,EAAK,+BAA+BG,EAAUC,CAAa,CACpE,EAEA,yBAA0B,SAAiD,CACzE,MAAMJ,EAAOH,EAAiB,EAC9B,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,EAAK,yBAAyB,CACvC,EAEA,oBAAqB,SAA4C,CAC/D,MAAMA,EAAOH,EAAiB,EAC9B,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,EAAK,oBAAoB,CAClC,CACF","names":["useAuthSignInCtx","useAssertWrappedByTernSecureAuthProvider","useSignIn","auth","signIn","params","provider","customOptions"]}
@@ -0,0 +1,8 @@
1
+ type MountingStatus = 'rendering' | 'rendered' | 'error';
2
+ /**
3
+ * Detect when a TernSecure component has mounted by watching DOM updates
4
+ * to an element with a `data-ternsecure-component="${component}"` property.
5
+ */
6
+ declare const useWaitForComponentMount: (component?: string) => MountingStatus;
7
+
8
+ export { useWaitForComponentMount };
@@ -0,0 +1,8 @@
1
+ type MountingStatus = 'rendering' | 'rendered' | 'error';
2
+ /**
3
+ * Detect when a TernSecure component has mounted by watching DOM updates
4
+ * to an element with a `data-ternsecure-component="${component}"` property.
5
+ */
6
+ declare const useWaitForComponentMount: (component?: string) => MountingStatus;
7
+
8
+ export { useWaitForComponentMount };
@@ -0,0 +1,2 @@
1
+ "use strict";var d=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var h=(t,e)=>{for(var n in e)d(t,n,{get:e[n],enumerable:!0})},w=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of f(e))!E.call(t,o)&&o!==n&&d(t,o,{get:()=>e[o],enumerable:!(r=a(e,o))||r.enumerable});return t};var p=t=>w(d({},"__esModule",{value:!0}),t);var S={};h(S,{useWaitForComponentMount:()=>y});module.exports=p(S);var u=require("react");function g(t){const{root:e=document?.body,selector:n,timeout:r=0}=t;return new Promise((o,c)=>{if(!e){c(new Error("No root element provided"));return}let i=e;if(n&&(i=e?.querySelector(n)),i?.childElementCount&&i.childElementCount>0){o();return}const s=new MutationObserver(l=>{for(const m of l)if(m.type==="childList"&&(!i&&n&&(i=e?.querySelector(n)),i?.childElementCount&&i.childElementCount>0)){s.disconnect(),o();return}});s.observe(e,{childList:!0,subtree:!0}),r>0&&setTimeout(()=>{s.disconnect(),c(new Error(`Timeout waiting for element children after ${r}ms`))},r)})}const y=t=>{const e=(0,u.useRef)(void 0),[n,r]=(0,u.useState)("rendering");return(0,u.useEffect)(()=>{if(!t)throw new Error("TernSecure: no component name provided, unable to detect mount.");typeof window<"u"&&!e.current&&(e.current=g({selector:`[data-ternsecure-component="${t}"]`}).then(()=>{r("rendered")}).catch(()=>{r("error")}))},[t]),n};0&&(module.exports={useWaitForComponentMount});
2
+ //# sourceMappingURL=useWaitForComponentMount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useWaitForComponentMount.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\ninterface WaitForElementOptions {\n selector?: string;\n root?: HTMLElement | null;\n timeout?: number;\n}\n\n/**\n * Waits for an element to have children in the DOM.\n * Used to detect when a TernSecure component has been fully mounted.\n */\nfunction waitForElementChildren(options: WaitForElementOptions): Promise<void> {\n const { root = document?.body, selector, timeout = 0 } = options;\n\n return new Promise<void>((resolve, reject) => {\n if (!root) {\n reject(new Error('No root element provided'));\n return;\n }\n\n let elementToWatch: HTMLElement | null = root;\n if (selector) {\n elementToWatch = root?.querySelector(selector);\n }\n\n // Check if element already has children\n const isElementAlreadyPresent = elementToWatch?.childElementCount && elementToWatch.childElementCount > 0;\n if (isElementAlreadyPresent) {\n resolve();\n return;\n }\n\n // Set up MutationObserver to watch for children\n const observer = new MutationObserver(mutationsList => {\n for (const mutation of mutationsList) {\n if (mutation.type === 'childList') {\n if (!elementToWatch && selector) {\n elementToWatch = root?.querySelector(selector);\n }\n\n if (elementToWatch?.childElementCount && elementToWatch.childElementCount > 0) {\n observer.disconnect();\n resolve();\n return;\n }\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n\n // Optional timeout\n if (timeout > 0) {\n setTimeout(() => {\n observer.disconnect();\n reject(new Error(`Timeout waiting for element children after ${timeout}ms`));\n }, timeout);\n }\n });\n}\n\ntype MountingStatus = 'rendering' | 'rendered' | 'error';\n\n/**\n * Detect when a TernSecure component has mounted by watching DOM updates\n * to an element with a `data-ternsecure-component=\"${component}\"` property.\n */\nexport const useWaitForComponentMount = (component?: string): MountingStatus => {\n const watcherRef = useRef<Promise<void> | undefined>(undefined);\n const [status, setStatus] = useState<MountingStatus>('rendering');\n\n useEffect(() => {\n if (!component) {\n throw new Error('TernSecure: no component name provided, unable to detect mount.');\n }\n\n if (typeof window !== 'undefined' && !watcherRef.current) {\n watcherRef.current = waitForElementChildren({\n selector: `[data-ternsecure-component=\"${component}\"]`\n })\n .then(() => {\n setStatus('rendered');\n })\n .catch(() => {\n setStatus('error');\n });\n }\n }, [component]);\n\n return status;\n};\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA4C,iBAY5C,SAASC,EAAuBC,EAA+C,CAC7E,KAAM,CAAE,KAAAC,EAAO,UAAU,KAAM,SAAAC,EAAU,QAAAC,EAAU,CAAE,EAAIH,EAEzD,OAAO,IAAI,QAAc,CAACI,EAASC,IAAW,CAC5C,GAAI,CAACJ,EAAM,CACTI,EAAO,IAAI,MAAM,0BAA0B,CAAC,EAC5C,MACF,CAEA,IAAIC,EAAqCL,EAOzC,GANIC,IACFI,EAAiBL,GAAM,cAAcC,CAAQ,GAIfI,GAAgB,mBAAqBA,EAAe,kBAAoB,EAC3E,CAC3BF,EAAQ,EACR,MACF,CAGA,MAAMG,EAAW,IAAI,iBAAiBC,GAAiB,CACrD,UAAWC,KAAYD,EACrB,GAAIC,EAAS,OAAS,cAChB,CAACH,GAAkBJ,IACrBI,EAAiBL,GAAM,cAAcC,CAAQ,GAG3CI,GAAgB,mBAAqBA,EAAe,kBAAoB,GAAG,CAC7EC,EAAS,WAAW,EACpBH,EAAQ,EACR,MACF,CAGN,CAAC,EAEDG,EAAS,QAAQN,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAGrDE,EAAU,GACZ,WAAW,IAAM,CACfI,EAAS,WAAW,EACpBF,EAAO,IAAI,MAAM,8CAA8CF,CAAO,IAAI,CAAC,CAC7E,EAAGA,CAAO,CAEd,CAAC,CACH,CAQO,MAAMP,EAA4Bc,GAAuC,CAC9E,MAAMC,KAAa,UAAkC,MAAS,EACxD,CAACC,EAAQC,CAAS,KAAI,YAAyB,WAAW,EAEhE,sBAAU,IAAM,CACd,GAAI,CAACH,EACH,MAAM,IAAI,MAAM,iEAAiE,EAG/E,OAAO,OAAW,KAAe,CAACC,EAAW,UAC/CA,EAAW,QAAUZ,EAAuB,CAC1C,SAAU,+BAA+BW,CAAS,IACpD,CAAC,EACE,KAAK,IAAM,CACVG,EAAU,UAAU,CACtB,CAAC,EACA,MAAM,IAAM,CACXA,EAAU,OAAO,CACnB,CAAC,EAEP,EAAG,CAACH,CAAS,CAAC,EAEPE,CACT","names":["useWaitForComponentMount_exports","__export","useWaitForComponentMount","__toCommonJS","import_react","waitForElementChildren","options","root","selector","timeout","resolve","reject","elementToWatch","observer","mutationsList","mutation","component","watcherRef","status","setStatus"]}
@@ -0,0 +1,2 @@
1
+ import{useEffect as l,useRef as m,useState as a}from"react";function f(o){const{root:e=document?.body,selector:n,timeout:r=0}=o;return new Promise((u,s)=>{if(!e){s(new Error("No root element provided"));return}let t=e;if(n&&(t=e?.querySelector(n)),t?.childElementCount&&t.childElementCount>0){u();return}const i=new MutationObserver(d=>{for(const c of d)if(c.type==="childList"&&(!t&&n&&(t=e?.querySelector(n)),t?.childElementCount&&t.childElementCount>0)){i.disconnect(),u();return}});i.observe(e,{childList:!0,subtree:!0}),r>0&&setTimeout(()=>{i.disconnect(),s(new Error(`Timeout waiting for element children after ${r}ms`))},r)})}const w=o=>{const e=m(void 0),[n,r]=a("rendering");return l(()=>{if(!o)throw new Error("TernSecure: no component name provided, unable to detect mount.");typeof window<"u"&&!e.current&&(e.current=f({selector:`[data-ternsecure-component="${o}"]`}).then(()=>{r("rendered")}).catch(()=>{r("error")}))},[o]),n};export{w as useWaitForComponentMount};
2
+ //# sourceMappingURL=useWaitForComponentMount.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useWaitForComponentMount.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\ninterface WaitForElementOptions {\n selector?: string;\n root?: HTMLElement | null;\n timeout?: number;\n}\n\n/**\n * Waits for an element to have children in the DOM.\n * Used to detect when a TernSecure component has been fully mounted.\n */\nfunction waitForElementChildren(options: WaitForElementOptions): Promise<void> {\n const { root = document?.body, selector, timeout = 0 } = options;\n\n return new Promise<void>((resolve, reject) => {\n if (!root) {\n reject(new Error('No root element provided'));\n return;\n }\n\n let elementToWatch: HTMLElement | null = root;\n if (selector) {\n elementToWatch = root?.querySelector(selector);\n }\n\n // Check if element already has children\n const isElementAlreadyPresent = elementToWatch?.childElementCount && elementToWatch.childElementCount > 0;\n if (isElementAlreadyPresent) {\n resolve();\n return;\n }\n\n // Set up MutationObserver to watch for children\n const observer = new MutationObserver(mutationsList => {\n for (const mutation of mutationsList) {\n if (mutation.type === 'childList') {\n if (!elementToWatch && selector) {\n elementToWatch = root?.querySelector(selector);\n }\n\n if (elementToWatch?.childElementCount && elementToWatch.childElementCount > 0) {\n observer.disconnect();\n resolve();\n return;\n }\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n\n // Optional timeout\n if (timeout > 0) {\n setTimeout(() => {\n observer.disconnect();\n reject(new Error(`Timeout waiting for element children after ${timeout}ms`));\n }, timeout);\n }\n });\n}\n\ntype MountingStatus = 'rendering' | 'rendered' | 'error';\n\n/**\n * Detect when a TernSecure component has mounted by watching DOM updates\n * to an element with a `data-ternsecure-component=\"${component}\"` property.\n */\nexport const useWaitForComponentMount = (component?: string): MountingStatus => {\n const watcherRef = useRef<Promise<void> | undefined>(undefined);\n const [status, setStatus] = useState<MountingStatus>('rendering');\n\n useEffect(() => {\n if (!component) {\n throw new Error('TernSecure: no component name provided, unable to detect mount.');\n }\n\n if (typeof window !== 'undefined' && !watcherRef.current) {\n watcherRef.current = waitForElementChildren({\n selector: `[data-ternsecure-component=\"${component}\"]`\n })\n .then(() => {\n setStatus('rendered');\n })\n .catch(() => {\n setStatus('error');\n });\n }\n }, [component]);\n\n return status;\n};\n"],"mappings":"AAAA,OAAS,aAAAA,EAAW,UAAAC,EAAQ,YAAAC,MAAgB,QAY5C,SAASC,EAAuBC,EAA+C,CAC7E,KAAM,CAAE,KAAAC,EAAO,UAAU,KAAM,SAAAC,EAAU,QAAAC,EAAU,CAAE,EAAIH,EAEzD,OAAO,IAAI,QAAc,CAACI,EAASC,IAAW,CAC5C,GAAI,CAACJ,EAAM,CACTI,EAAO,IAAI,MAAM,0BAA0B,CAAC,EAC5C,MACF,CAEA,IAAIC,EAAqCL,EAOzC,GANIC,IACFI,EAAiBL,GAAM,cAAcC,CAAQ,GAIfI,GAAgB,mBAAqBA,EAAe,kBAAoB,EAC3E,CAC3BF,EAAQ,EACR,MACF,CAGA,MAAMG,EAAW,IAAI,iBAAiBC,GAAiB,CACrD,UAAWC,KAAYD,EACrB,GAAIC,EAAS,OAAS,cAChB,CAACH,GAAkBJ,IACrBI,EAAiBL,GAAM,cAAcC,CAAQ,GAG3CI,GAAgB,mBAAqBA,EAAe,kBAAoB,GAAG,CAC7EC,EAAS,WAAW,EACpBH,EAAQ,EACR,MACF,CAGN,CAAC,EAEDG,EAAS,QAAQN,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAGrDE,EAAU,GACZ,WAAW,IAAM,CACfI,EAAS,WAAW,EACpBF,EAAO,IAAI,MAAM,8CAA8CF,CAAO,IAAI,CAAC,CAC7E,EAAGA,CAAO,CAEd,CAAC,CACH,CAQO,MAAMO,EAA4BC,GAAuC,CAC9E,MAAMC,EAAaf,EAAkC,MAAS,EACxD,CAACgB,EAAQC,CAAS,EAAIhB,EAAyB,WAAW,EAEhE,OAAAF,EAAU,IAAM,CACd,GAAI,CAACe,EACH,MAAM,IAAI,MAAM,iEAAiE,EAG/E,OAAO,OAAW,KAAe,CAACC,EAAW,UAC/CA,EAAW,QAAUb,EAAuB,CAC1C,SAAU,+BAA+BY,CAAS,IACpD,CAAC,EACE,KAAK,IAAM,CACVG,EAAU,UAAU,CACtB,CAAC,EACA,MAAM,IAAM,CACXA,EAAU,OAAO,CACnB,CAAC,EAEP,EAAG,CAACH,CAAS,CAAC,EAEPE,CACT","names":["useEffect","useRef","useState","waitForElementChildren","options","root","selector","timeout","resolve","reject","elementToWatch","observer","mutationsList","mutation","useWaitForComponentMount","component","watcherRef","status","setStatus"]}
package/dist/index.d.mts CHANGED
@@ -5,14 +5,12 @@ export { signIn, useSignIn } from './hooks/useSignIn.mjs';
5
5
  export { useSignUp } from './hooks/useSignUp.mjs';
6
6
  export { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider.mjs';
7
7
  export { TernSecureProvider } from './ctx/TernSecureProvider.mjs';
8
- export { SignInProvider, useSignInContext } from './ctx/SignInCtx.mjs';
9
- export { SignUpProvider, useSignUpContext } from './ctx/SignUpCtx.mjs';
10
8
  export { handleInternalRoute, isAuthRoute, isBaseAuthRoute, isInternalRoute } from './route-handler/internal-route.mjs';
11
9
  export { cn } from './lib/utils.mjs';
12
- export { Browser, IsoTernSecureAuthOptions, IsomorphicTernSecureOptions, TernSecureProviderProps } from './types.mjs';
13
- export { useTernSecure } from '@tern-secure/shared/react';
10
+ export { Browser, IsoTernSecureAuthOptions, TernSecureProviderProps } from './types.mjs';
11
+ export { SignIn, SignUp, UserButton } from './components/uiComponent.mjs';
12
+ export { constructScriptAttributes, constructTernUIScriptAttributes, loadTernUIScript, ternUIgetScriptUrl } from '@tern-secure/shared/loadTernUIScript';
14
13
  import '@tern-secure/types';
15
14
  import 'react/jsx-runtime';
16
15
  import 'react';
17
- import '@tern-secure/auth';
18
16
  import 'clsx';
package/dist/index.d.ts CHANGED
@@ -5,14 +5,12 @@ export { signIn, useSignIn } from './hooks/useSignIn.js';
5
5
  export { useSignUp } from './hooks/useSignUp.js';
6
6
  export { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider.js';
7
7
  export { TernSecureProvider } from './ctx/TernSecureProvider.js';
8
- export { SignInProvider, useSignInContext } from './ctx/SignInCtx.js';
9
- export { SignUpProvider, useSignUpContext } from './ctx/SignUpCtx.js';
10
8
  export { handleInternalRoute, isAuthRoute, isBaseAuthRoute, isInternalRoute } from './route-handler/internal-route.js';
11
9
  export { cn } from './lib/utils.js';
12
- export { Browser, IsoTernSecureAuthOptions, IsomorphicTernSecureOptions, TernSecureProviderProps } from './types.js';
13
- export { useTernSecure } from '@tern-secure/shared/react';
10
+ export { Browser, IsoTernSecureAuthOptions, TernSecureProviderProps } from './types.js';
11
+ export { SignIn, SignUp, UserButton } from './components/uiComponent.js';
12
+ export { constructScriptAttributes, constructTernUIScriptAttributes, loadTernUIScript, ternUIgetScriptUrl } from '@tern-secure/shared/loadTernUIScript';
14
13
  import '@tern-secure/types';
15
14
  import 'react/jsx-runtime';
16
15
  import 'react';
17
- import '@tern-secure/auth';
18
16
  import 'clsx';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var x=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var P=(o,e)=>{for(var u in e)x(o,u,{get:e[u],enumerable:!0})},A=(o,e,u,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of T(e))!v.call(o,n)&&n!==u&&x(o,n,{get:()=>e[n],enumerable:!(m=h(e,n))||m.enumerable});return o};var a=o=>A(x({},"__esModule",{value:!0}),o);var R={};P(R,{SignInProvider:()=>t.SignInProvider,SignUpProvider:()=>i.SignUpProvider,TernSecureCtxProvider:()=>c.TernSecureCtxProvider,TernSecureProvider:()=>d.TernSecureProvider,cn:()=>g.cn,handleInternalRoute:()=>r.handleInternalRoute,isAuthRoute:()=>r.isAuthRoute,isBaseAuthRoute:()=>r.isBaseAuthRoute,isInternalRoute:()=>r.isInternalRoute,signIn:()=>p.signIn,useAuth:()=>s.useAuth,useDeriveAuth:()=>s.useDeriveAuth,useIdToken:()=>S.useIdToken,useSession:()=>f.useSession,useSignIn:()=>p.useSignIn,useSignInContext:()=>t.useSignInContext,useSignUp:()=>I.useSignUp,useSignUpContext:()=>i.useSignUpContext,useTernSecure:()=>t.useTernSecure});module.exports=a(R);var s=require("./hooks/useAuth"),S=require("./hooks/useIdToken"),f=require("./hooks/useSession"),p=require("./hooks/useSignIn"),I=require("./hooks/useSignUp"),c=require("./ctx/TernSecureCtxProvider"),d=require("./ctx/TernSecureProvider"),t=require("./ctx/SignInCtx"),i=require("./ctx/SignUpCtx"),r=require("./route-handler/internal-route"),g=require("./lib/utils");0&&(module.exports={SignInProvider,SignUpProvider,TernSecureCtxProvider,TernSecureProvider,cn,handleInternalRoute,isAuthRoute,isBaseAuthRoute,isInternalRoute,signIn,useAuth,useDeriveAuth,useIdToken,useSession,useSignIn,useSignInContext,useSignUp,useSignUpContext,useTernSecure});
1
+ "use strict";var c=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var h=(o,r)=>{for(var s in r)c(o,s,{get:r[s],enumerable:!0})},a=(o,r,s,x)=>{if(r&&typeof r=="object"||typeof r=="function")for(let u of d(r))!g.call(o,u)&&u!==s&&c(o,u,{get:()=>r[u],enumerable:!(x=U(r,u))||x.enumerable});return o};var l=o=>a(c({},"__esModule",{value:!0}),o);var v={};h(v,{SignIn:()=>n.SignIn,SignUp:()=>n.SignUp,TernSecureCtxProvider:()=>I.TernSecureCtxProvider,TernSecureProvider:()=>A.TernSecureProvider,UserButton:()=>n.UserButton,cn:()=>T.cn,constructScriptAttributes:()=>t.constructScriptAttributes,constructTernUIScriptAttributes:()=>t.constructTernUIScriptAttributes,handleInternalRoute:()=>e.handleInternalRoute,isAuthRoute:()=>e.isAuthRoute,isBaseAuthRoute:()=>e.isBaseAuthRoute,isInternalRoute:()=>e.isInternalRoute,loadTernUIScript:()=>t.loadTernUIScript,signIn:()=>i.signIn,ternUIgetScriptUrl:()=>t.ternUIgetScriptUrl,useAuth:()=>p.useAuth,useDeriveAuth:()=>p.useDeriveAuth,useIdToken:()=>S.useIdToken,useSession:()=>f.useSession,useSignIn:()=>i.useSignIn,useSignUp:()=>m.useSignUp});module.exports=l(v);var p=require("./hooks/useAuth"),S=require("./hooks/useIdToken"),f=require("./hooks/useSession"),i=require("./hooks/useSignIn"),m=require("./hooks/useSignUp"),I=require("./ctx/TernSecureCtxProvider"),A=require("./ctx/TernSecureProvider"),e=require("./route-handler/internal-route"),T=require("./lib/utils"),n=require("./components/uiComponent"),t=require("@tern-secure/shared/loadTernUIScript");0&&(module.exports={SignIn,SignUp,TernSecureCtxProvider,TernSecureProvider,UserButton,cn,constructScriptAttributes,constructTernUIScriptAttributes,handleInternalRoute,isAuthRoute,isBaseAuthRoute,isInternalRoute,loadTernUIScript,signIn,ternUIgetScriptUrl,useAuth,useDeriveAuth,useIdToken,useSession,useSignIn,useSignUp});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAuth, useDeriveAuth} from './hooks/useAuth';\nexport { useIdToken } from './hooks/useIdToken';\nexport { useSession } from './hooks/useSession';\nexport { useSignIn, signIn } from './hooks/useSignIn';\nexport { useSignUp } from './hooks/useSignUp';\nexport { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider';\nexport { TernSecureProvider } from './ctx/TernSecureProvider';\nexport { useSignInContext, SignInProvider, useTernSecure } from './ctx/SignInCtx';\nexport { useSignUpContext, SignUpProvider } from './ctx/SignUpCtx';\n\nexport {\n isAuthRoute,\n isBaseAuthRoute,\n isInternalRoute,\n handleInternalRoute,\n} from './route-handler/internal-route';\n\nexport { cn } from './lib/utils';\n\nexport type {\n IsomorphicTernSecureOptions,\n IsoTernSecureAuthOptions,\n Browser,\n TernSecureProviderProps,\n} from './types';\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,soBAAAE,EAAAF,GAAA,IAAAG,EAAsC,2BACtCC,EAA2B,8BAC3BC,EAA2B,8BAC3BC,EAAkC,6BAClCC,EAA0B,6BAC1BC,EAAsC,uCACtCC,EAAmC,oCACnCC,EAAgE,2BAChEC,EAAiD,2BAEjDC,EAKO,0CAEPC,EAAmB","names":["index_exports","__export","__toCommonJS","import_useAuth","import_useIdToken","import_useSession","import_useSignIn","import_useSignUp","import_TernSecureCtxProvider","import_TernSecureProvider","import_SignInCtx","import_SignUpCtx","import_internal_route","import_utils"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAuth, useDeriveAuth} from './hooks/useAuth';\nexport { useIdToken } from './hooks/useIdToken';\nexport { useSession } from './hooks/useSession';\nexport { useSignIn, signIn } from './hooks/useSignIn';\nexport { useSignUp } from './hooks/useSignUp';\nexport { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider';\nexport { TernSecureProvider } from './ctx/TernSecureProvider';\n\nexport {\n isAuthRoute,\n isBaseAuthRoute,\n isInternalRoute,\n handleInternalRoute,\n} from './route-handler/internal-route';\n\nexport { cn } from './lib/utils';\n\nexport type {\n IsoTernSecureAuthOptions,\n Browser,\n TernSecureProviderProps,\n} from './types';\n\nexport {\n SignIn,\n SignUp,\n UserButton\n} from './components/uiComponent'\n\nexport {\n loadTernUIScript,\n ternUIgetScriptUrl,\n constructScriptAttributes,\n constructTernUIScriptAttributes\n} from '@tern-secure/shared/loadTernUIScript'\n\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,ouBAAAE,EAAAF,GAAA,IAAAG,EAAsC,2BACtCC,EAA2B,8BAC3BC,EAA2B,8BAC3BC,EAAkC,6BAClCC,EAA0B,6BAC1BC,EAAsC,uCACtCC,EAAmC,oCAEnCC,EAKO,0CAEPC,EAAmB,uBAQnBC,EAIO,oCAEPC,EAKO","names":["index_exports","__export","__toCommonJS","import_useAuth","import_useIdToken","import_useSession","import_useSignIn","import_useSignUp","import_TernSecureCtxProvider","import_TernSecureProvider","import_internal_route","import_utils","import_uiComponent","import_loadTernUIScript"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{useAuth as o,useDeriveAuth as t}from"./hooks/useAuth";import{useIdToken as u}from"./hooks/useIdToken";import{useSession as p}from"./hooks/useSession";import{useSignIn as x,signIn as m}from"./hooks/useSignIn";import{useSignUp as f}from"./hooks/useSignUp";import{TernSecureCtxProvider as c}from"./ctx/TernSecureCtxProvider";import{TernSecureProvider as g}from"./ctx/TernSecureProvider";import{useSignInContext as T,SignInProvider as v,useTernSecure as P}from"./ctx/SignInCtx";import{useSignUpContext as a,SignUpProvider as R}from"./ctx/SignUpCtx";import{isAuthRoute as C,isBaseAuthRoute as U,isInternalRoute as y,handleInternalRoute as B}from"./route-handler/internal-route";import{cn as k}from"./lib/utils";export{v as SignInProvider,R as SignUpProvider,c as TernSecureCtxProvider,g as TernSecureProvider,k as cn,B as handleInternalRoute,C as isAuthRoute,U as isBaseAuthRoute,y as isInternalRoute,m as signIn,o as useAuth,t as useDeriveAuth,u as useIdToken,p as useSession,x as useSignIn,T as useSignInContext,f as useSignUp,a as useSignUpContext,P as useTernSecure};
1
+ import{useAuth as t,useDeriveAuth as o}from"./hooks/useAuth";import{useIdToken as u}from"./hooks/useIdToken";import{useSession as p}from"./hooks/useSession";import{useSignIn as c,signIn as x}from"./hooks/useSignIn";import{useSignUp as f}from"./hooks/useSignUp";import{TernSecureCtxProvider as I}from"./ctx/TernSecureCtxProvider";import{TernSecureProvider as T}from"./ctx/TernSecureProvider";import{isAuthRoute as d,isBaseAuthRoute as g,isInternalRoute as h,handleInternalRoute as a}from"./route-handler/internal-route";import{cn as v}from"./lib/utils";import{SignIn as R,SignUp as B,UserButton as b}from"./components/uiComponent";import{loadTernUIScript as k,ternUIgetScriptUrl as w,constructScriptAttributes as C,constructTernUIScriptAttributes as D}from"@tern-secure/shared/loadTernUIScript";export{R as SignIn,B as SignUp,I as TernSecureCtxProvider,T as TernSecureProvider,b as UserButton,v as cn,C as constructScriptAttributes,D as constructTernUIScriptAttributes,a as handleInternalRoute,d as isAuthRoute,g as isBaseAuthRoute,h as isInternalRoute,k as loadTernUIScript,x as signIn,w as ternUIgetScriptUrl,t as useAuth,o as useDeriveAuth,u as useIdToken,p as useSession,c as useSignIn,f as useSignUp};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAuth, useDeriveAuth} from './hooks/useAuth';\nexport { useIdToken } from './hooks/useIdToken';\nexport { useSession } from './hooks/useSession';\nexport { useSignIn, signIn } from './hooks/useSignIn';\nexport { useSignUp } from './hooks/useSignUp';\nexport { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider';\nexport { TernSecureProvider } from './ctx/TernSecureProvider';\nexport { useSignInContext, SignInProvider, useTernSecure } from './ctx/SignInCtx';\nexport { useSignUpContext, SignUpProvider } from './ctx/SignUpCtx';\n\nexport {\n isAuthRoute,\n isBaseAuthRoute,\n isInternalRoute,\n handleInternalRoute,\n} from './route-handler/internal-route';\n\nexport { cn } from './lib/utils';\n\nexport type {\n IsomorphicTernSecureOptions,\n IsoTernSecureAuthOptions,\n Browser,\n TernSecureProviderProps,\n} from './types';\n"],"mappings":"AAAA,OAAS,WAAAA,EAAS,iBAAAC,MAAoB,kBACtC,OAAS,cAAAC,MAAkB,qBAC3B,OAAS,cAAAC,MAAkB,qBAC3B,OAAS,aAAAC,EAAW,UAAAC,MAAc,oBAClC,OAAS,aAAAC,MAAiB,oBAC1B,OAAS,yBAAAC,MAA6B,8BACtC,OAAS,sBAAAC,MAA0B,2BACnC,OAAS,oBAAAC,EAAkB,kBAAAC,EAAgB,iBAAAC,MAAqB,kBAChE,OAAS,oBAAAC,EAAkB,kBAAAC,MAAsB,kBAEjD,OACE,eAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,uBAAAC,MACK,iCAEP,OAAS,MAAAC,MAAU","names":["useAuth","useDeriveAuth","useIdToken","useSession","useSignIn","signIn","useSignUp","TernSecureCtxProvider","TernSecureProvider","useSignInContext","SignInProvider","useTernSecure","useSignUpContext","SignUpProvider","isAuthRoute","isBaseAuthRoute","isInternalRoute","handleInternalRoute","cn"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAuth, useDeriveAuth} from './hooks/useAuth';\nexport { useIdToken } from './hooks/useIdToken';\nexport { useSession } from './hooks/useSession';\nexport { useSignIn, signIn } from './hooks/useSignIn';\nexport { useSignUp } from './hooks/useSignUp';\nexport { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider';\nexport { TernSecureProvider } from './ctx/TernSecureProvider';\n\nexport {\n isAuthRoute,\n isBaseAuthRoute,\n isInternalRoute,\n handleInternalRoute,\n} from './route-handler/internal-route';\n\nexport { cn } from './lib/utils';\n\nexport type {\n IsoTernSecureAuthOptions,\n Browser,\n TernSecureProviderProps,\n} from './types';\n\nexport {\n SignIn,\n SignUp,\n UserButton\n} from './components/uiComponent'\n\nexport {\n loadTernUIScript,\n ternUIgetScriptUrl,\n constructScriptAttributes,\n constructTernUIScriptAttributes\n} from '@tern-secure/shared/loadTernUIScript'\n\n"],"mappings":"AAAA,OAAS,WAAAA,EAAS,iBAAAC,MAAoB,kBACtC,OAAS,cAAAC,MAAkB,qBAC3B,OAAS,cAAAC,MAAkB,qBAC3B,OAAS,aAAAC,EAAW,UAAAC,MAAc,oBAClC,OAAS,aAAAC,MAAiB,oBAC1B,OAAS,yBAAAC,MAA6B,8BACtC,OAAS,sBAAAC,MAA0B,2BAEnC,OACE,eAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,uBAAAC,MACK,iCAEP,OAAS,MAAAC,MAAU,cAQnB,OACI,UAAAC,EACA,UAAAC,EACA,cAAAC,MACG,2BAEP,OACI,oBAAAC,EACA,sBAAAC,EACA,6BAAAC,EACA,mCAAAC,MACG","names":["useAuth","useDeriveAuth","useIdToken","useSession","useSignIn","signIn","useSignUp","TernSecureCtxProvider","TernSecureProvider","isAuthRoute","isBaseAuthRoute","isInternalRoute","handleInternalRoute","cn","SignIn","SignUp","UserButton","loadTernUIScript","ternUIgetScriptUrl","constructScriptAttributes","constructTernUIScriptAttributes"]}
@@ -1,7 +1,10 @@
1
1
  import * as _tern_secure_types from '@tern-secure/types';
2
- import { TernSecureAuth, TernSecureAuthStatus, SignInResource, SignUpResource, TernSecureAuthOptions, ListenerCallback, UnsubscribeCallback, CreateActiveSessionParams, SignOutOptions, SignedInSession, SignInRedirectOptions, SignUpRedirectOptions } from '@tern-secure/types';
3
- import { IsoTernSecureAuthOptions } from '../types.mjs';
2
+ import { TernSecureAuth, TernSecureAuthStatus, SignInResource, SignUpResource, TernSecureAuthOptions, ListenerCallback, UnsubscribeCallback, CreateActiveSessionParams, SignOutOptions, SignedInSession, SignInProps, SignUpProps, SignInRedirectOptions, SignUpRedirectOptions } from '@tern-secure/types';
3
+ import { IsoTernSecureAuthOptions, HeadlessUIBrowser, Browser } from '../types.mjs';
4
4
 
5
+ interface Global {
6
+ TernSecure?: HeadlessUIBrowser | Browser;
7
+ }
5
8
  declare function inBrowser(): boolean;
6
9
  /**
7
10
  * IsomorphicTernSecure class manages the auth state and UI rendering
@@ -12,8 +15,11 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
12
15
  private readonly _mode;
13
16
  private readonly options;
14
17
  private readonly TernSecureAuth;
18
+ private readonly TernSecure;
15
19
  private ternauth;
20
+ private ternui;
16
21
  private preAddListener;
22
+ private premountState;
17
23
  get status(): TernSecureAuthStatus;
18
24
  get isReady(): boolean;
19
25
  get isLoading(): boolean;
@@ -24,7 +30,7 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
24
30
  static getOrCreateInstance(options: IsoTernSecureAuthOptions): IsoTernSecureAuth;
25
31
  static clearInstances(): void;
26
32
  static clearInstance(): void;
27
- get domain(): string;
33
+ get authDomain(): string;
28
34
  get proxyUrl(): string;
29
35
  get mode(): 'browser' | 'server';
30
36
  /**
@@ -40,6 +46,13 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
40
46
  get version(): string | undefined;
41
47
  get instanceType(): _tern_secure_types.InstanceType | undefined;
42
48
  get apiUrl(): string;
49
+ loadTernUI(): Promise<HeadlessUIBrowser | Browser | undefined>;
50
+ private beforeLoad;
51
+ private injectTernUI;
52
+ /**
53
+ *
54
+ * @deprecated will be moved to import package
55
+ */
43
56
  initTernSecureAuth(): void;
44
57
  private loadTernSecureAuth;
45
58
  on: TernSecureAuth['on'];
@@ -51,12 +64,23 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
51
64
  onAuthStateChanged(callback: (user: any) => void): () => void;
52
65
  getRedirectResult: () => Promise<any>;
53
66
  constructUrlWithAuthRedirect: (to: string) => string;
67
+ constructAfterSignOutUrl: () => string;
54
68
  navigate: (to: string) => void;
69
+ initialize: () => Promise<void>;
70
+ showSignIn: (node: HTMLDivElement, config?: SignInProps) => void;
71
+ hideSignIn: (node: HTMLDivElement) => void;
72
+ showSignUp: (node: HTMLDivElement, config?: SignUpProps) => void;
73
+ hideSignUp: (node: HTMLDivElement) => void;
74
+ showUserButton: (node: HTMLDivElement) => void;
75
+ hideUserButton: (node: HTMLDivElement) => void;
55
76
  redirectToSignIn: (options?: SignInRedirectOptions) => Promise<void>;
56
77
  redirectToSignUp: (options?: SignUpRedirectOptions) => Promise<void>;
57
78
  redirectAfterSignIn: (redirectUrl?: string) => void;
58
79
  redirectAfterSignUp: (redirectUrl?: string) => void;
59
- initialize: () => Promise<void>;
80
+ /**
81
+ * @deprecated will be moved to import package
82
+ */
83
+ initializeAuth: () => Promise<void>;
60
84
  }
61
85
 
62
- export { IsoTernSecureAuth, inBrowser };
86
+ export { type Global, IsoTernSecureAuth, inBrowser };
@@ -1,7 +1,10 @@
1
1
  import * as _tern_secure_types from '@tern-secure/types';
2
- import { TernSecureAuth, TernSecureAuthStatus, SignInResource, SignUpResource, TernSecureAuthOptions, ListenerCallback, UnsubscribeCallback, CreateActiveSessionParams, SignOutOptions, SignedInSession, SignInRedirectOptions, SignUpRedirectOptions } from '@tern-secure/types';
3
- import { IsoTernSecureAuthOptions } from '../types.js';
2
+ import { TernSecureAuth, TernSecureAuthStatus, SignInResource, SignUpResource, TernSecureAuthOptions, ListenerCallback, UnsubscribeCallback, CreateActiveSessionParams, SignOutOptions, SignedInSession, SignInProps, SignUpProps, SignInRedirectOptions, SignUpRedirectOptions } from '@tern-secure/types';
3
+ import { IsoTernSecureAuthOptions, HeadlessUIBrowser, Browser } from '../types.js';
4
4
 
5
+ interface Global {
6
+ TernSecure?: HeadlessUIBrowser | Browser;
7
+ }
5
8
  declare function inBrowser(): boolean;
6
9
  /**
7
10
  * IsomorphicTernSecure class manages the auth state and UI rendering
@@ -12,8 +15,11 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
12
15
  private readonly _mode;
13
16
  private readonly options;
14
17
  private readonly TernSecureAuth;
18
+ private readonly TernSecure;
15
19
  private ternauth;
20
+ private ternui;
16
21
  private preAddListener;
22
+ private premountState;
17
23
  get status(): TernSecureAuthStatus;
18
24
  get isReady(): boolean;
19
25
  get isLoading(): boolean;
@@ -24,7 +30,7 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
24
30
  static getOrCreateInstance(options: IsoTernSecureAuthOptions): IsoTernSecureAuth;
25
31
  static clearInstances(): void;
26
32
  static clearInstance(): void;
27
- get domain(): string;
33
+ get authDomain(): string;
28
34
  get proxyUrl(): string;
29
35
  get mode(): 'browser' | 'server';
30
36
  /**
@@ -40,6 +46,13 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
40
46
  get version(): string | undefined;
41
47
  get instanceType(): _tern_secure_types.InstanceType | undefined;
42
48
  get apiUrl(): string;
49
+ loadTernUI(): Promise<HeadlessUIBrowser | Browser | undefined>;
50
+ private beforeLoad;
51
+ private injectTernUI;
52
+ /**
53
+ *
54
+ * @deprecated will be moved to import package
55
+ */
43
56
  initTernSecureAuth(): void;
44
57
  private loadTernSecureAuth;
45
58
  on: TernSecureAuth['on'];
@@ -51,12 +64,23 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
51
64
  onAuthStateChanged(callback: (user: any) => void): () => void;
52
65
  getRedirectResult: () => Promise<any>;
53
66
  constructUrlWithAuthRedirect: (to: string) => string;
67
+ constructAfterSignOutUrl: () => string;
54
68
  navigate: (to: string) => void;
69
+ initialize: () => Promise<void>;
70
+ showSignIn: (node: HTMLDivElement, config?: SignInProps) => void;
71
+ hideSignIn: (node: HTMLDivElement) => void;
72
+ showSignUp: (node: HTMLDivElement, config?: SignUpProps) => void;
73
+ hideSignUp: (node: HTMLDivElement) => void;
74
+ showUserButton: (node: HTMLDivElement) => void;
75
+ hideUserButton: (node: HTMLDivElement) => void;
55
76
  redirectToSignIn: (options?: SignInRedirectOptions) => Promise<void>;
56
77
  redirectToSignUp: (options?: SignUpRedirectOptions) => Promise<void>;
57
78
  redirectAfterSignIn: (redirectUrl?: string) => void;
58
79
  redirectAfterSignUp: (redirectUrl?: string) => void;
59
- initialize: () => Promise<void>;
80
+ /**
81
+ * @deprecated will be moved to import package
82
+ */
83
+ initializeAuth: () => Promise<void>;
60
84
  }
61
85
 
62
- export { IsoTernSecureAuth, inBrowser };
86
+ export { type Global, IsoTernSecureAuth, inBrowser };
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var f=(r,e)=>{for(var t in e)u(r,t,{get:e[t],enumerable:!0})},S=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of l(e))!p.call(r,i)&&i!==t&&u(r,i,{get:()=>e[i],enumerable:!(n=d(e,i))||n.enumerable});return r};var g=r=>S(u({},"__esModule",{value:!0}),r);var T={};f(T,{IsoTernSecureAuth:()=>h,inBrowser:()=>a});module.exports=g(T);var c=require("@tern-secure/auth"),s=require("@tern-secure/shared/ternStatusEvent"),o=require("@tern-secure/shared/utils");const A={name:"@tern-secure/react",version:"1.2.0-canary.v20251108045933",environment:process.env.NODE_ENV};function a(){return typeof window<"u"}class h{_mode;options;TernSecureAuth;ternauth=null;preAddListener=new Map;#i="loading";#s;#t;#n;#r=(0,s.createTernAuthEventBus)();static#e;get status(){return this.ternauth?this.ternauth.status||(this.ternauth.isReady?"ready":"loading"):this.#i}get isReady(){return this.ternauth?.isReady||!1}get isLoading(){return this.ternauth?.isLoading||!1}get requiresVerification(){return this.options.requiresVerification??!0}get signIn(){if(this.ternauth)return this.ternauth.signIn||void 0}get signUp(){if(this.ternauth)return this.ternauth.signUp||void 0}get user(){return this.ternauth?this.ternauth.user:null}static getOrCreateInstance(e){return(!a()||!this.#e||e.TernSecureAuth&&this.#e.TernSecureAuth!==e.TernSecureAuth)&&(this.#e=new h(e)),this.#e}static clearInstances(){this.#e&&(this.#e.ternauth=null,this.#e=null)}static clearInstance(){this.#e=null}get domain(){if(typeof window<"u"&&window.location)return(0,o.handleValueOrFn)(this.#t,new URL(window.location.href),"");if(typeof this.#t=="function")throw new Error("Unsupported customDomain type: function");return this.#t||""}get proxyUrl(){if(typeof window<"u"&&window.location)return(0,o.handleValueOrFn)(this.#n,new URL(window.location.href),"");if(typeof this.#n=="function")throw new Error("Unsupported customProxyUrl type: function");return this.#n||""}get mode(){return this._mode}_internal_getOption(e){return this.ternauth?._internal_getOption?this.ternauth?._internal_getOption(e):this.options[e]}_internal_getAllOptions(){return Object.freeze({...this.options})}constructor(e){const{TernSecureAuth:t=null}=e||{};this.#t=e.ternSecureConfig?.authDomain,this.options={...e},this._mode=a()?"browser":"server",this.#s=this.options.apiUrl,this.TernSecureAuth=t,this.options.sdkMetadata||(this.options.sdkMetadata=A)}get sdkMetadata(){return this.ternauth?.sdkMetadata||this.options.sdkMetadata}get version(){return this.ternauth?.version}get instanceType(){return this.ternauth?.instanceType}get apiUrl(){return this.#s||""}initTernSecureAuth(){if(this._mode!=="browser"||this.isReady)return;const e=c.TernSecureAuth.initialize(this.options);this.loadTernSecureAuth(e)}loadTernSecureAuth=e=>{if(!e)throw new Error("TernAuth instance is not initialized");return this.ternauth=e,this.preAddListener.forEach((t,n)=>{t.unsubscribe=e.addListener(n)}),this.#r.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),typeof this.ternauth.status>"u"&&(console.log("[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready"),this.#i="ready",this.#r.emit(s.ternEvents.Status,"ready")),this.ternauth};on=(...e)=>this.ternauth?.on?this.ternauth.on(...e):this.#r.on(...e);off=(...e)=>this.ternauth?.off?this.ternauth.off(...e):this.#r.off(...e);addListener=e=>{if(this.ternauth)return this.ternauth.addListener(e);{const t=()=>{const n=this.preAddListener.get(e);n&&(n.unsubscribe(),this.preAddListener.delete(e))};return this.preAddListener.set(e,{unsubscribe:t}),t}};createActiveSession=e=>this.ternauth?this.ternauth.createActiveSession(e):Promise.reject(new Error("TernSecureAuth not initialized"));signOut=async e=>{if(!this.ternauth)throw new Error("TernSecureAuth not initialized");await this.ternauth.signOut()};get currentSession(){return this.ternauth?this.ternauth.currentSession:null}onAuthStateChanged(e){return this.ternauth?this.ternauth.onAuthStateChanged(e):(console.warn("[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener"),()=>{})}getRedirectResult=async()=>{if(!this.ternauth?.getRedirectResult)throw new Error("TernSecure instance not initialized");return this.ternauth.getRedirectResult()};constructUrlWithAuthRedirect=e=>this.ternauth&&this.isReady?this.ternauth.constructUrlWithAuthRedirect(e):"";navigate=e=>{this.ternauth&&this.isReady&&this.ternauth.navigate(e)};redirectToSignIn=async e=>{this.ternauth?.redirectToSignIn&&this.ternauth.redirectToSignIn(e)};redirectToSignUp=async e=>{this.ternauth?.redirectToSignUp&&this.ternauth.redirectToSignUp()};redirectAfterSignIn=e=>{this.ternauth?.redirectAfterSignIn&&this.ternauth.redirectAfterSignIn()};redirectAfterSignUp=e=>{this.ternauth?.redirectAfterSignUp&&this.ternauth.redirectAfterSignUp()};#u(){return new Promise(e=>{e(this.ternauth)})}initialize=async()=>{this.initTernSecureAuth();try{await this.#u()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernSecureAuth:",e),e}}}0&&(module.exports={IsoTernSecureAuth,inBrowser});
1
+ "use strict";var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var f=(i,e)=>{for(var t in e)o(i,t,{get:e[t],enumerable:!0})},g=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of p(e))!S.call(i,n)&&n!==t&&o(i,n,{get:()=>e[n],enumerable:!(r=l(e,n))||r.enumerable});return i};var T=i=>g(o({},"__esModule",{value:!0}),i);var m={};f(m,{IsoTernSecureAuth:()=>h,inBrowser:()=>a});module.exports=T(m);var d=require("@tern-secure/shared/loadTernUIScript"),s=require("@tern-secure/shared/ternStatusEvent"),u=require("@tern-secure/shared/utils"),c=require("../utils/isConstructor");const w={name:"@tern-secure/react",version:"1.2.0-canary.v20251125170702",environment:process.env.NODE_ENV};function a(){return typeof window<"u"}class h{_mode;options;TernSecureAuth;TernSecure;ternauth=null;ternui=null;preAddListener=new Map;premountState={signInNodes:new Map,signUpNodes:new Map,userButttonNodes:new Map,verifyNodes:new Set,methodCalls:new Map,errorListeners:new Set};#s="loading";#r;#i;#n;#t=(0,s.createTernAuthEventBus)();static#e;get status(){return this.ternui?this.ternui.status||(this.ternui.isReady?"ready":"loading"):this.#s}get isReady(){return this.ternui?.isReady||!1}get isLoading(){return this.ternui?.isLoading||!1}get requiresVerification(){return this.options.requiresVerification??!0}get signIn(){if(this.ternui)return this.ternui.signIn||void 0}get signUp(){if(this.ternui)return this.ternui.signUp||void 0}get user(){return this.ternui?this.ternui.user:null}static getOrCreateInstance(e){return(!a()||!this.#e||e.TernSecureAuth&&this.#e.TernSecureAuth!==e.TernSecureAuth)&&(this.#e=new h(e)),this.#e}static clearInstances(){this.#e&&(this.#e.ternui=null,this.#e=null)}static clearInstance(){this.#e=null}get authDomain(){if(typeof window<"u"&&window.location)return(0,u.handleValueOrFn)(this.#i,new URL(window.location.href),"");if(typeof this.#i=="function")throw new Error("Unsupported customDomain type: function");return this.#i||""}get proxyUrl(){if(typeof window<"u"&&window.location)return(0,u.handleValueOrFn)(this.#n,new URL(window.location.href),"");if(typeof this.#n=="function")throw new Error("Unsupported customProxyUrl type: function");return this.#n||""}get mode(){return this._mode}_internal_getOption(e){return this.ternui?._internal_getOption?this.ternui?._internal_getOption(e):this.options[e]}_internal_getAllOptions(){return Object.freeze({...this.options})}constructor(e){const{TernSecureAuth:t=null,TernSecure:r=null}=e||{};this.#i=e.ternSecureConfig?.authDomain,this.options={...e},this._mode=a()?"browser":"server",this.#r=this.options.apiUrl,this.#n=this.options.proxyUrl,this.TernSecureAuth=t,this.TernSecure=r,this.options.sdkMetadata||(this.options.sdkMetadata=w),this.#r&&this.loadTernUI()}get sdkMetadata(){return this.ternui?.sdkMetadata||this.options.sdkMetadata}get version(){return this.ternui?.version}get instanceType(){return this.ternui?.instanceType}get apiUrl(){return this.#r||""}#o(){return new Promise(e=>{e(this.ternui)})}async loadTernUI(){if(!(this._mode!=="browser"||this.isReady)){typeof window<"u"&&(window._TernSecure_authDomain=this.authDomain,window._TernSecure_proxyUrl=this.proxyUrl,window._TernSecure_apiUrl=this.apiUrl);try{if(this.TernSecure){let e;(0,c.isConstructor)(this.TernSecure)?(e=new this.TernSecure(this.#r,{proxyUrl:this.proxyUrl,authDomain:this.authDomain}),this.beforeLoad(e),await e.load(this.options)):(e=this.TernSecure,e.isReady||(this.beforeLoad(e),await e.load(this.options))),global.TernSecure=e}else{if(global.TernSecure||await(0,d.loadTernUIScript)({...this.options,authDomain:this.authDomain,nonce:this.options.nonce}),!global.TernSecure)throw new Error("TernSecure instance is not available globally");this.beforeLoad(global.TernSecure),await global.TernSecure.load(this.options)}return global.TernSecure?.isReady?this.injectTernUI(global.TernSecure):void 0}catch(e){const t=e;console.error(t.stack||t.message||t);return}}}beforeLoad=e=>{if(!e)throw new Error("Failed to inject TernUI")};injectTernUI=e=>{if(!e)throw new Error("TernUI instance is not initialized");return this.ternui=e,this.premountState.methodCalls.forEach(t=>t()),this.preAddListener.forEach((t,r)=>{t.unsubscribe=e.addListener(r)}),this.#t.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),this.premountState.signInNodes.forEach((t,r)=>{e.showSignIn(r,t)}),this.premountState.signUpNodes.forEach((t,r)=>{e.showSignUp(r,t)}),typeof this.ternui.status>"u"&&(console.log("[IsomorphicTernSecure] TernUI has no status, setting internal status to ready"),this.#s="ready",this.#t.emit("status","ready"),console.log("[IsomorphicTernSecure] Set internal status to ready (ternui has no status)")),this.ternui};initTernSecureAuth(){if(this._mode!=="browser"||this.isReady)return;const e=TernSecureAuthImpl.initialize(this.options);this.loadTernSecureAuth(e)}loadTernSecureAuth=e=>{if(!e)throw new Error("TernAuth instance is not initialized");return this.ternauth=e,this.preAddListener.forEach((t,r)=>{t.unsubscribe=e.addListener(r)}),this.#t.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),typeof this.ternauth.status>"u"&&(console.log("[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready"),this.#s="ready",this.#t.emit(s.ternEvents.Status,"ready")),this.ternauth};on=(...e)=>this.ternui?.on?this.ternui.on(...e):this.#t.on(...e);off=(...e)=>this.ternui?.off?this.ternui.off(...e):this.#t.off(...e);addListener=e=>{if(this.ternui)return this.ternui.addListener(e);{const t=()=>{const r=this.preAddListener.get(e);r&&(r.unsubscribe(),this.preAddListener.delete(e))};return this.preAddListener.set(e,{unsubscribe:t}),t}};createActiveSession=e=>this.ternui?this.ternui.createActiveSession(e):Promise.reject(new Error("TernSecureAuth not initialized"));signOut=async e=>{if(!this.ternui)throw new Error("TernSecureAuth not initialized");await this.ternui.signOut()};get currentSession(){return this.ternui?this.ternui.currentSession:null}onAuthStateChanged(e){return this.ternui?this.ternui.onAuthStateChanged(e):(console.warn("[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener"),()=>{})}getRedirectResult=async()=>{if(!this.ternui?.getRedirectResult)throw new Error("TernSecure instance not initialized");return this.ternui.getRedirectResult()};constructUrlWithAuthRedirect=e=>this.ternui&&this.isReady?this.ternui.constructUrlWithAuthRedirect(e):"";constructAfterSignOutUrl=()=>{if(this.ternui&&this.isReady)return this.ternui.constructAfterSignOutUrl()||"";{const e=()=>this.ternui?.constructAfterSignOutUrl()||"";return this.premountState.methodCalls.set("constructAfterSignOutUrl",e),""}};navigate=e=>{this.ternui&&this.isReady&&this.ternui.navigate(e)};initialize=async()=>{try{await this.#o()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernUI:",e),e}};showSignIn=(e,t)=>{this.ternui&&this.isReady?this.ternui.showSignIn(e,t):this.premountState.signInNodes.set(e,t)};hideSignIn=e=>{this.ternui&&this.isReady?this.ternui.hideSignIn(e):this.premountState.signInNodes.delete(e)};showSignUp=(e,t)=>{this.ternui&&this.isReady?this.ternui.showSignUp(e,t):this.premountState.signUpNodes.set(e,t)};hideSignUp=e=>{this.ternui&&this.isReady?this.ternui.hideSignUp(e):this.premountState.signUpNodes.delete(e)};showUserButton=e=>{this.ternui&&this.isReady?this.ternui.showUserButton(e):this.premountState.userButttonNodes.set(e,void 0)};hideUserButton=e=>{this.ternui&&this.isReady?this.ternui.hideUserButton(e):this.premountState.userButttonNodes.delete(e)};redirectToSignIn=async e=>{this.ternui?.redirectToSignIn&&this.ternui.redirectToSignIn(e)};redirectToSignUp=async e=>{this.ternui?.redirectToSignUp&&this.ternui.redirectToSignUp()};redirectAfterSignIn=e=>{this.ternui?.redirectAfterSignIn&&this.ternui.redirectAfterSignIn()};redirectAfterSignUp=e=>{this.ternui?.redirectAfterSignUp&&this.ternui.redirectAfterSignUp()};#u(){return new Promise(e=>{e(this.ternauth)})}initializeAuth=async()=>{this.initTernSecureAuth();try{await this.#u()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernSecureAuth:",e),e}}}0&&(module.exports={IsoTernSecureAuth,inBrowser});
2
2
  //# sourceMappingURL=isoTernSecureAuth.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/isoTernSecureAuth.ts"],"sourcesContent":["import { TernSecureAuth as TernSecureAuthImpl } from '@tern-secure/auth';\nimport { createTernAuthEventBus, ternEvents } from '@tern-secure/shared/ternStatusEvent';\nimport { handleValueOrFn } from '@tern-secure/shared/utils';\nimport type {\n CreateActiveSessionParams,\n DomainOrProxyUrl,\n ListenerCallback,\n SignedInSession,\n SignInRedirectOptions,\n SignInResource,\n SignOutOptions,\n SignUpRedirectOptions,\n SignUpResource,\n TernSecureAuth,\n TernSecureAuthOptions,\n TernSecureAuthStatus,\n UnsubscribeCallback,\n} from '@tern-secure/types';\n\nimport type { IsoTernSecureAuthOptions, TernSecureAuthProps } from '../types';\n\nconst SDK_METADATA = {\n name: __PACKAGE_NAME__,\n version: __PACKAGE_VERSION__,\n environment: process.env.NODE_ENV,\n};\n\nexport function inBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * IsomorphicTernSecure class manages the auth state and UI rendering\n * in both browser and server environments, acting as a proxy for TernSecureAuth\n */\nexport class IsoTernSecureAuth implements TernSecureAuth {\n private readonly _mode: 'browser' | 'server';\n private readonly options: IsoTernSecureAuthOptions;\n private readonly TernSecureAuth: TernSecureAuthProps;\n private ternauth: TernSecureAuthProps | null = null;\n private preAddListener = new Map<ListenerCallback, { unsubscribe: UnsubscribeCallback }>();\n\n #status: TernSecureAuthStatus = 'loading';\n #apiUrl: string | undefined;\n #domain: DomainOrProxyUrl['domain'];\n #proxyUrl: DomainOrProxyUrl['proxyUrl'];\n #eventBus = createTernAuthEventBus();\n\n static #instance: IsoTernSecureAuth | null | undefined;\n\n get status(): TernSecureAuthStatus {\n if (!this.ternauth) {\n return this.#status;\n }\n return this.ternauth.status || (this.ternauth.isReady ? 'ready' : 'loading');\n }\n\n get isReady(): boolean {\n return this.ternauth?.isReady || false;\n }\n\n get isLoading(): boolean {\n return this.ternauth?.isLoading || false;\n }\n\n get requiresVerification(): boolean {\n return this.options.requiresVerification ?? true;\n }\n\n get signIn(): SignInResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signIn || undefined;\n }\n return undefined;\n }\n\n get signUp(): SignUpResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signUp || undefined;\n }\n return undefined;\n }\n\n get user() {\n if (this.ternauth) {\n return this.ternauth.user;\n }\n return null;\n }\n\n static getOrCreateInstance(options: IsoTernSecureAuthOptions) {\n if (\n !inBrowser() ||\n !this.#instance ||\n (options.TernSecureAuth && this.#instance.TernSecureAuth !== options.TernSecureAuth)\n ) {\n this.#instance = new IsoTernSecureAuth(options);\n }\n return this.#instance;\n }\n\n static clearInstances() {\n if (this.#instance) {\n this.#instance.ternauth = null;\n this.#instance = null;\n }\n }\n\n static clearInstance() {\n this.#instance = null;\n }\n\n get domain(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#domain, new URL(window.location.href), '');\n }\n if (typeof this.#domain === 'function') {\n throw new Error('Unsupported customDomain type: function');\n }\n return this.#domain || '';\n }\n\n get proxyUrl(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#proxyUrl, new URL(window.location.href), '');\n }\n if (typeof this.#proxyUrl === 'function') {\n throw new Error('Unsupported customProxyUrl type: function');\n }\n return this.#proxyUrl || '';\n }\n\n get mode(): 'browser' | 'server' {\n return this._mode;\n }\n\n /**\n * @internal\n */\n public _internal_getOption<K extends keyof TernSecureAuthOptions>(\n key: K,\n ): TernSecureAuthOptions[K] | undefined {\n return this.ternauth?._internal_getOption\n ? this.ternauth?._internal_getOption(key)\n : this.options[key];\n }\n\n /**\n * @internal\n */\n public _internal_getAllOptions(): Readonly<TernSecureAuthOptions> {\n return Object.freeze({ ...this.options });\n }\n\n constructor(options: IsoTernSecureAuthOptions) {\n const { TernSecureAuth = null } = options || {};\n this.#domain = options.ternSecureConfig?.authDomain;\n this.options = { ...options };\n this._mode = inBrowser() ? 'browser' : 'server';\n this.#apiUrl = this.options.apiUrl;\n this.TernSecureAuth = TernSecureAuth;\n\n if (!this.options.sdkMetadata) {\n this.options.sdkMetadata = SDK_METADATA;\n }\n }\n\n get sdkMetadata() {\n return this.ternauth?.sdkMetadata || this.options.sdkMetadata;\n }\n\n get version() {\n return this.ternauth?.version;\n }\n\n get instanceType() {\n return this.ternauth?.instanceType;\n }\n\n get apiUrl() {\n return this.#apiUrl || '';\n }\n\n initTernSecureAuth() {\n if (this._mode !== 'browser' || this.isReady) {\n return;\n }\n\n const tern = TernSecureAuthImpl.initialize(this.options);\n this.loadTernSecureAuth(tern);\n }\n\n private loadTernSecureAuth = (ternauth: TernSecureAuthProps | undefined) => {\n if (!ternauth) {\n throw new Error('TernAuth instance is not initialized');\n }\n\n this.ternauth = ternauth;\n this.preAddListener.forEach((listenerHandlers, listener) => {\n listenerHandlers.unsubscribe = ternauth.addListener(listener);\n });\n\n this.#eventBus.getListeners('status').forEach(listener => {\n this.on('status', listener, { notify: true });\n });\n\n if (typeof this.ternauth.status === 'undefined') {\n console.log(\n '[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready',\n );\n this.#status = 'ready';\n this.#eventBus.emit(ternEvents.Status, 'ready');\n }\n\n return this.ternauth;\n };\n\n public on: TernSecureAuth['on'] = (...args) => {\n if (this.ternauth?.on) {\n return this.ternauth.on(...args);\n } else {\n return this.#eventBus.on(...args);\n }\n };\n\n public off: TernSecureAuth['off'] = (...args) => {\n if (this.ternauth?.off) {\n return this.ternauth.off(...args);\n } else {\n return this.#eventBus.off(...args);\n }\n };\n\n addListener = (listener: ListenerCallback): UnsubscribeCallback => {\n if (this.ternauth) {\n return this.ternauth.addListener(listener);\n } else {\n const unsubscribe = () => {\n const listenerHandlers = this.preAddListener.get(listener);\n if (listenerHandlers) {\n listenerHandlers.unsubscribe();\n this.preAddListener.delete(listener);\n }\n };\n this.preAddListener.set(listener, { unsubscribe });\n return unsubscribe;\n }\n };\n\n createActiveSession = (params: CreateActiveSessionParams): Promise<void> => {\n if (this.ternauth) {\n return this.ternauth.createActiveSession(params);\n } else {\n return Promise.reject(new Error('TernSecureAuth not initialized'));\n }\n };\n\n signOut = async (options?: SignOutOptions): Promise<void> => {\n if (!this.ternauth) {\n throw new Error('TernSecureAuth not initialized');\n }\n await this.ternauth.signOut();\n };\n\n get currentSession(): SignedInSession | null {\n if (!this.ternauth) {\n return null;\n }\n return this.ternauth.currentSession;\n }\n\n onAuthStateChanged(callback: (user: any) => void): () => void {\n if (!this.ternauth) {\n console.warn(\n '[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener',\n );\n return () => {};\n }\n return this.ternauth.onAuthStateChanged(callback);\n }\n\n getRedirectResult = async (): Promise<any> => {\n if (!this.ternauth?.getRedirectResult) {\n throw new Error('TernSecure instance not initialized');\n }\n return this.ternauth.getRedirectResult();\n };\n\n constructUrlWithAuthRedirect = (to: string): string => {\n if (this.ternauth && this.isReady) {\n return this.ternauth.constructUrlWithAuthRedirect(to);\n }\n return '';\n };\n\n navigate = (to: string) => {\n if (this.ternauth && this.isReady) {\n this.ternauth.navigate(to);\n }\n };\n\n redirectToSignIn = async (options?: SignInRedirectOptions) => {\n if (this.ternauth?.redirectToSignIn) {\n this.ternauth.redirectToSignIn(options);\n }\n };\n\n redirectToSignUp = async (options?: SignUpRedirectOptions) => {\n if (this.ternauth?.redirectToSignUp) {\n this.ternauth.redirectToSignUp();\n }\n };\n\n redirectAfterSignIn = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignIn) {\n this.ternauth.redirectAfterSignIn();\n }\n };\n\n redirectAfterSignUp = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignUp) {\n this.ternauth.redirectAfterSignUp();\n }\n };\n\n #awaitForTernSecureAuth(): Promise<TernSecureAuthProps> {\n return new Promise<TernSecureAuthProps>(resolve => {\n resolve(this.ternauth);\n });\n }\n\n initialize = async (): Promise<void> => {\n this.initTernSecureAuth();\n try {\n await this.#awaitForTernSecureAuth();\n } catch (error) {\n console.error('[IsomorphicTernSecure] Failed to initialize TernSecureAuth:', error);\n throw error;\n }\n };\n}\n"],"mappings":"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","names":["isoTernSecureAuth_exports","__export","IsoTernSecureAuth","inBrowser","__toCommonJS","import_auth","import_ternStatusEvent","import_utils","SDK_METADATA","#status","#apiUrl","#domain","#proxyUrl","#eventBus","#instance","options","key","TernSecureAuth","tern","TernSecureAuthImpl","ternauth","listenerHandlers","listener","args","unsubscribe","params","callback","to","redirectUrl","#awaitForTernSecureAuth","resolve","error"]}
1
+ {"version":3,"sources":["../../src/lib/isoTernSecureAuth.ts"],"sourcesContent":["import { loadTernUIScript } from '@tern-secure/shared/loadTernUIScript';\nimport { createTernAuthEventBus, ternEvents } from '@tern-secure/shared/ternStatusEvent';\nimport { handleValueOrFn } from '@tern-secure/shared/utils';\nimport type {\n AuthErrorTree,\n CreateActiveSessionParams,\n DomainOrProxyUrl,\n ListenerCallback,\n SignedInSession,\n SignInProps,\n SignInRedirectOptions,\n SignInResource,\n SignOutOptions,\n SignUpProps,\n SignUpRedirectOptions,\n SignUpResource,\n TernSecureAuth,\n TernSecureAuthOptions,\n TernSecureAuthStatus,\n UnsubscribeCallback,\n} from '@tern-secure/types';\n\nimport type {\n Browser,\n BrowserConstructor,\n HeadlessUIBrowser,\n HeadlessUIBrowserConstructor,\n IsoTernSecureAuthOptions,\n TernSecureAuthProps,\n TernSecureProps\n} from '../types';\nimport { isConstructor } from '../utils/isConstructor';\n\nconst SDK_METADATA = {\n name: __PACKAGE_NAME__,\n version: __PACKAGE_VERSION__,\n environment: process.env.NODE_ENV,\n};\n\nexport interface Global {\n TernSecure?: HeadlessUIBrowser | Browser;\n}\n\ndeclare const global: Global;\n\ntype GenericFunction<TArgs = never> = (...args: TArgs[]) => unknown;\n\ntype MethodName<T> = {\n [P in keyof T]: T[P] extends GenericFunction ? P : never;\n}[keyof T];\n\ntype MethodCallback = () => Promise<unknown> | unknown;\n\ntype WithVoidReturn<F extends (...args: any) => any> = (\n ...args: Parameters<F>\n) => ReturnType<F> extends Promise<infer T> ? Promise<T | void> : ReturnType<F> | void;\ntype WithVoidReturnFunctions<T> = {\n [K in keyof T]: K extends 'constructAfterSignOutUrl' \n ? T[K] \n : T[K] extends (...args: any) => any \n ? WithVoidReturn<T[K]> \n : T[K];\n};\n\ntype IsoTernAuth = WithVoidReturnFunctions<TernSecureAuth>;\n\nexport function inBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\ninterface PreMountState {\n signInNodes: Map<HTMLDivElement, SignInProps | undefined>;\n signUpNodes: Map<HTMLDivElement, SignUpProps | undefined>;\n userButttonNodes: Map<HTMLDivElement, SignInProps | undefined>;\n verifyNodes: Set<HTMLDivElement>;\n methodCalls: Map<MethodName<Browser>, MethodCallback>;\n errorListeners: Set<(error: AuthErrorTree) => void>;\n}\n\n/**\n * IsomorphicTernSecure class manages the auth state and UI rendering\n * in both browser and server environments, acting as a proxy for TernSecureAuth\n */\nexport class IsoTernSecureAuth implements TernSecureAuth {\n private readonly _mode: 'browser' | 'server';\n private readonly options: IsoTernSecureAuthOptions;\n private readonly TernSecureAuth: TernSecureAuthProps;\n private readonly TernSecure: TernSecureProps;\n private ternauth: TernSecureAuthProps | null = null;\n private ternui: Browser | HeadlessUIBrowser | null = null;\n private preAddListener = new Map<ListenerCallback, { unsubscribe: UnsubscribeCallback }>();\n private premountState: PreMountState = {\n signInNodes: new Map(),\n signUpNodes: new Map(),\n userButttonNodes: new Map(),\n verifyNodes: new Set(),\n methodCalls: new Map(),\n errorListeners: new Set(),\n };\n\n #status: TernSecureAuthStatus = 'loading';\n #apiUrl: string | undefined;\n #authDomain: DomainOrProxyUrl['domain'];\n #proxyUrl: DomainOrProxyUrl['proxyUrl'];\n #eventBus = createTernAuthEventBus();\n\n static #instance: IsoTernSecureAuth | null | undefined;\n\n get status(): TernSecureAuthStatus {\n if (!this.ternui) {\n return this.#status;\n }\n return this.ternui.status || (this.ternui.isReady ? 'ready' : 'loading');\n }\n\n get isReady(): boolean {\n return this.ternui?.isReady || false;\n }\n\n get isLoading(): boolean {\n return this.ternui?.isLoading || false;\n }\n\n get requiresVerification(): boolean {\n return this.options.requiresVerification ?? true;\n }\n\n get signIn(): SignInResource | undefined {\n if (this.ternui) {\n return this.ternui.signIn || undefined;\n }\n return undefined;\n }\n\n get signUp(): SignUpResource | undefined {\n if (this.ternui) {\n return this.ternui.signUp || undefined;\n }\n return undefined;\n }\n\n get user() {\n if (this.ternui) {\n return this.ternui.user;\n }\n return null;\n }\n\n static getOrCreateInstance(options: IsoTernSecureAuthOptions) {\n if (\n !inBrowser() ||\n !this.#instance ||\n (options.TernSecureAuth && this.#instance.TernSecureAuth !== options.TernSecureAuth)\n ) {\n this.#instance = new IsoTernSecureAuth(options);\n }\n return this.#instance;\n }\n\n static clearInstances() {\n if (this.#instance) {\n this.#instance.ternui = null;\n this.#instance = null;\n }\n }\n\n static clearInstance() {\n this.#instance = null;\n }\n\n get authDomain(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#authDomain, new URL(window.location.href), '');\n }\n if (typeof this.#authDomain === 'function') {\n throw new Error('Unsupported customDomain type: function');\n }\n return this.#authDomain || '';\n }\n\n get proxyUrl(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#proxyUrl, new URL(window.location.href), '');\n }\n if (typeof this.#proxyUrl === 'function') {\n throw new Error('Unsupported customProxyUrl type: function');\n }\n return this.#proxyUrl || '';\n }\n\n get mode(): 'browser' | 'server' {\n return this._mode;\n }\n\n /**\n * @internal\n */\n public _internal_getOption<K extends keyof TernSecureAuthOptions>(\n key: K,\n ): TernSecureAuthOptions[K] | undefined {\n return this.ternui?._internal_getOption\n ? this.ternui?._internal_getOption(key)\n : this.options[key];\n }\n\n /**\n * @internal\n */\n public _internal_getAllOptions(): Readonly<TernSecureAuthOptions> {\n return Object.freeze({ ...this.options });\n }\n\n constructor(options: IsoTernSecureAuthOptions) {\n const { TernSecureAuth = null, TernSecure = null } = options || {};\n this.#authDomain = options.ternSecureConfig?.authDomain;\n this.options = { ...options };\n this._mode = inBrowser() ? 'browser' : 'server';\n this.#apiUrl = this.options.apiUrl;\n this.#proxyUrl = this.options.proxyUrl;\n this.TernSecureAuth = TernSecureAuth;\n this.TernSecure = TernSecure;\n\n if (!this.options.sdkMetadata) {\n this.options.sdkMetadata = SDK_METADATA;\n }\n\n if (this.#apiUrl) {\n void this.loadTernUI();\n }\n }\n\n get sdkMetadata() {\n return this.ternui?.sdkMetadata || this.options.sdkMetadata;\n }\n\n get version() {\n return this.ternui?.version;\n }\n\n get instanceType() {\n return this.ternui?.instanceType;\n }\n\n get apiUrl() {\n return this.#apiUrl || '';\n }\n\n #awaitForTernUI(): Promise<HeadlessUIBrowser | Browser> {\n return new Promise<HeadlessUIBrowser | Browser>(resolve => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n resolve(this.ternui!);\n });\n }\n\n async loadTernUI(): Promise<HeadlessUIBrowser | Browser | undefined> {\n if (this._mode !== 'browser' || this.isReady) {\n return;\n }\n\n if (typeof window !== 'undefined') {\n window._TernSecure_authDomain = this.authDomain;\n window._TernSecure_proxyUrl = this.proxyUrl;\n window._TernSecure_apiUrl = this.apiUrl;\n }\n\n try {\n if (this.TernSecure) {\n let coreInstance: TernSecureProps;\n //console.log('[IsomorphicTernSecure] this.TernSecure: defined, checking readiness...');\n //const TernSecureHasLoadMethod = typeof this.TernSecure.load === 'function';\n if (isConstructor<BrowserConstructor | HeadlessUIBrowserConstructor>(this.TernSecure)) {\n coreInstance = new this.TernSecure(this.#apiUrl, {\n proxyUrl: this.proxyUrl,\n authDomain: this.authDomain,\n } as any);\n this.beforeLoad(coreInstance);\n await coreInstance.load(this.options);\n } else {\n //console.log('[IsomorphicTernSecure] this.TernSecure: does not have load method.');\n coreInstance = this.TernSecure;\n if (!coreInstance.isReady) {\n this.beforeLoad(coreInstance);\n await coreInstance.load(this.options);\n }\n }\n global.TernSecure = coreInstance;\n } else {\n //console.log('[IsomorphicTernSecure] Loading TernSecure from script is called...');\n if (!global.TernSecure) {\n //console.log('[IsomorphicTernSecure] Loading TernSecure from script...');\n await loadTernUIScript({\n ...this.options,\n authDomain: this.authDomain,\n nonce: this.options.nonce,\n\n })\n }\n\n if (!global.TernSecure) {\n throw new Error('TernSecure instance is not available globally');\n }\n\n this.beforeLoad(global.TernSecure);\n await global.TernSecure.load(this.options);\n }\n\n if (global.TernSecure?.isReady) {\n return this.injectTernUI(global.TernSecure);\n }\n return;\n } catch (err) {\n const error = err as Error;\n //this.#eventBus.emit(TernSecureEvents.Error, error);\n console.error(error.stack || error.message || error);\n return;\n }\n }\n\n private beforeLoad = (ternui: Browser | HeadlessUIBrowser | undefined) => {\n if (!ternui) {\n throw new Error('Failed to inject TernUI');\n }\n };\n\n\n private injectTernUI = (ternui: Browser | HeadlessUIBrowser | undefined) => {\n if (!ternui) {\n throw new Error('TernUI instance is not initialized');\n }\n\n this.ternui = ternui;\n\n this.premountState.methodCalls.forEach(cb => cb());\n\n this.preAddListener.forEach((listenerHandlers, listener) => {\n listenerHandlers.unsubscribe = ternui.addListener(listener);\n });\n\n\n this.#eventBus.getListeners('status').forEach(listener => {\n this.on('status', listener, { notify: true });\n });\n\n this.premountState.signInNodes.forEach((props, node) => {\n ternui.showSignIn(node, props);\n });\n\n this.premountState.signUpNodes.forEach((props, node) => {\n ternui.showSignUp(node, props);\n });\n\n if (typeof this.ternui.status === 'undefined') {\n console.log('[IsomorphicTernSecure] TernUI has no status, setting internal status to ready');\n this.#status = 'ready';\n this.#eventBus.emit('status', 'ready');\n console.log('[IsomorphicTernSecure] Set internal status to ready (ternui has no status)');\n }\n\n return this.ternui;\n\n };\n\n /**\n * \n * @deprecated will be moved to import package\n */\n initTernSecureAuth() {\n if (this._mode !== 'browser' || this.isReady) {\n return;\n }\n\n // @ts-ignore - Deprecated method, TernSecureAuthImpl will be moved to import package\n const tern = TernSecureAuthImpl.initialize(this.options);\n this.loadTernSecureAuth(tern);\n }\n\n private loadTernSecureAuth = (ternauth: TernSecureAuthProps | undefined) => {\n if (!ternauth) {\n throw new Error('TernAuth instance is not initialized');\n }\n\n this.ternauth = ternauth;\n this.preAddListener.forEach((listenerHandlers, listener) => {\n listenerHandlers.unsubscribe = ternauth.addListener(listener);\n });\n\n this.#eventBus.getListeners('status').forEach(listener => {\n this.on('status', listener, { notify: true });\n });\n\n if (typeof this.ternauth.status === 'undefined') {\n console.log(\n '[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready',\n );\n this.#status = 'ready';\n this.#eventBus.emit(ternEvents.Status, 'ready');\n }\n\n return this.ternauth;\n };\n\n public on: TernSecureAuth['on'] = (...args) => {\n if (this.ternui?.on) {\n return this.ternui.on(...args);\n } else {\n return this.#eventBus.on(...args);\n }\n };\n\n public off: TernSecureAuth['off'] = (...args) => {\n if (this.ternui?.off) {\n return this.ternui.off(...args);\n } else {\n return this.#eventBus.off(...args);\n }\n };\n\n addListener = (listener: ListenerCallback): UnsubscribeCallback => {\n if (this.ternui) {\n return this.ternui.addListener(listener);\n } else {\n const unsubscribe = () => {\n const listenerHandlers = this.preAddListener.get(listener);\n if (listenerHandlers) {\n listenerHandlers.unsubscribe();\n this.preAddListener.delete(listener);\n }\n };\n this.preAddListener.set(listener, { unsubscribe });\n return unsubscribe;\n }\n };\n\n createActiveSession = (params: CreateActiveSessionParams): Promise<void> => {\n if (this.ternui) {\n return this.ternui.createActiveSession(params);\n } else {\n return Promise.reject(new Error('TernSecureAuth not initialized'));\n }\n };\n\n signOut = async (options?: SignOutOptions): Promise<void> => {\n if (!this.ternui) {\n throw new Error('TernSecureAuth not initialized');\n }\n await this.ternui.signOut();\n };\n\n get currentSession(): SignedInSession | null {\n if (!this.ternui) {\n return null;\n }\n return this.ternui.currentSession;\n }\n\n onAuthStateChanged(callback: (user: any) => void): () => void {\n if (!this.ternui) {\n console.warn(\n '[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener',\n );\n return () => { };\n }\n return this.ternui.onAuthStateChanged(callback);\n }\n\n getRedirectResult = async (): Promise<any> => {\n if (!this.ternui?.getRedirectResult) {\n throw new Error('TernSecure instance not initialized');\n }\n return this.ternui.getRedirectResult();\n };\n\n constructUrlWithAuthRedirect = (to: string): string => {\n if (this.ternui && this.isReady) {\n return this.ternui.constructUrlWithAuthRedirect(to);\n }\n return '';\n };\n\n constructAfterSignOutUrl = (): string => {\n if (this.ternui && this.isReady) {\n return this.ternui.constructAfterSignOutUrl() || '';\n } else {\n const callback = () => this.ternui?.constructAfterSignOutUrl() || '';\n this.premountState.methodCalls.set('constructAfterSignOutUrl', callback);\n return '';\n }\n }\n\n navigate = (to: string) => {\n if (this.ternui && this.isReady) {\n this.ternui.navigate(to);\n }\n };\n\n\n initialize = async (): Promise<void> => {\n try {\n await this.#awaitForTernUI();\n } catch (error) {\n console.error('[IsomorphicTernSecure] Failed to initialize TernUI:', error);\n throw error;\n }\n }\n\n\n showSignIn = (node: HTMLDivElement, config?: SignInProps): void => {\n if (this.ternui && this.isReady) {\n this.ternui.showSignIn(node, config);\n } else {\n this.premountState.signInNodes.set(node, config);\n }\n };\n\n hideSignIn = (node: HTMLDivElement): void => {\n if (this.ternui && this.isReady) {\n this.ternui.hideSignIn(node);\n } else {\n this.premountState.signInNodes.delete(node);\n }\n };\n\n showSignUp = (node: HTMLDivElement, config?: SignUpProps): void => {\n if (this.ternui && this.isReady) {\n this.ternui.showSignUp(node, config);\n } else {\n this.premountState.signUpNodes.set(node, config);\n }\n };\n\n hideSignUp = (node: HTMLDivElement): void => {\n if (this.ternui && this.isReady) {\n this.ternui.hideSignUp(node);\n } else {\n this.premountState.signUpNodes.delete(node);\n }\n };\n\n showUserButton = (node: HTMLDivElement): void => {\n if (this.ternui && this.isReady) {\n this.ternui.showUserButton(node);\n } else {\n this.premountState.userButttonNodes.set(node, undefined);\n }\n }\n\n hideUserButton = (node: HTMLDivElement): void => {\n if (this.ternui && this.isReady) {\n this.ternui.hideUserButton(node);\n } else {\n this.premountState.userButttonNodes.delete(node);\n }\n };\n\n redirectToSignIn = async (options?: SignInRedirectOptions) => {\n if (this.ternui?.redirectToSignIn) {\n this.ternui.redirectToSignIn(options);\n }\n };\n\n redirectToSignUp = async (options?: SignUpRedirectOptions) => {\n if (this.ternui?.redirectToSignUp) {\n this.ternui.redirectToSignUp();\n }\n };\n\n redirectAfterSignIn = (redirectUrl?: string): void => {\n if (this.ternui?.redirectAfterSignIn) {\n this.ternui.redirectAfterSignIn();\n }\n };\n\n redirectAfterSignUp = (redirectUrl?: string): void => {\n if (this.ternui?.redirectAfterSignUp) {\n this.ternui.redirectAfterSignUp();\n }\n };\n\n /**\n * \n * @deprecated will be moved to import package\n */\n #awaitForTernSecureAuth(): Promise<TernSecureAuthProps> {\n return new Promise<TernSecureAuthProps>(resolve => {\n resolve(this.ternauth);\n });\n }\n\n /**\n * @deprecated will be moved to import package\n */\n initializeAuth = async (): Promise<void> => {\n this.initTernSecureAuth();\n try {\n await this.#awaitForTernSecureAuth();\n } catch (error) {\n console.error('[IsomorphicTernSecure] Failed to initialize TernSecureAuth:', error);\n throw error;\n }\n };\n}\n"],"mappings":"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","names":["isoTernSecureAuth_exports","__export","IsoTernSecureAuth","inBrowser","__toCommonJS","import_loadTernUIScript","import_ternStatusEvent","import_utils","import_isConstructor","SDK_METADATA","#status","#apiUrl","#authDomain","#proxyUrl","#eventBus","#instance","options","key","TernSecureAuth","TernSecure","#awaitForTernUI","resolve","coreInstance","err","error","ternui","cb","listenerHandlers","listener","props","node","tern","ternauth","args","unsubscribe","params","callback","to","config","redirectUrl","#awaitForTernSecureAuth"]}
@@ -1,2 +1,2 @@
1
- import{TernSecureAuth as u}from"@tern-secure/auth";import{createTernAuthEventBus as o,ternEvents as a}from"@tern-secure/shared/ternStatusEvent";import{handleValueOrFn as n}from"@tern-secure/shared/utils";const h={name:"@tern-secure/react",version:"1.2.0-canary.v20251108045933",environment:process.env.NODE_ENV};function i(){return typeof window<"u"}class s{_mode;options;TernSecureAuth;ternauth=null;preAddListener=new Map;#i="loading";#s;#t;#n;#r=o();static#e;get status(){return this.ternauth?this.ternauth.status||(this.ternauth.isReady?"ready":"loading"):this.#i}get isReady(){return this.ternauth?.isReady||!1}get isLoading(){return this.ternauth?.isLoading||!1}get requiresVerification(){return this.options.requiresVerification??!0}get signIn(){if(this.ternauth)return this.ternauth.signIn||void 0}get signUp(){if(this.ternauth)return this.ternauth.signUp||void 0}get user(){return this.ternauth?this.ternauth.user:null}static getOrCreateInstance(e){return(!i()||!this.#e||e.TernSecureAuth&&this.#e.TernSecureAuth!==e.TernSecureAuth)&&(this.#e=new s(e)),this.#e}static clearInstances(){this.#e&&(this.#e.ternauth=null,this.#e=null)}static clearInstance(){this.#e=null}get domain(){if(typeof window<"u"&&window.location)return n(this.#t,new URL(window.location.href),"");if(typeof this.#t=="function")throw new Error("Unsupported customDomain type: function");return this.#t||""}get proxyUrl(){if(typeof window<"u"&&window.location)return n(this.#n,new URL(window.location.href),"");if(typeof this.#n=="function")throw new Error("Unsupported customProxyUrl type: function");return this.#n||""}get mode(){return this._mode}_internal_getOption(e){return this.ternauth?._internal_getOption?this.ternauth?._internal_getOption(e):this.options[e]}_internal_getAllOptions(){return Object.freeze({...this.options})}constructor(e){const{TernSecureAuth:t=null}=e||{};this.#t=e.ternSecureConfig?.authDomain,this.options={...e},this._mode=i()?"browser":"server",this.#s=this.options.apiUrl,this.TernSecureAuth=t,this.options.sdkMetadata||(this.options.sdkMetadata=h)}get sdkMetadata(){return this.ternauth?.sdkMetadata||this.options.sdkMetadata}get version(){return this.ternauth?.version}get instanceType(){return this.ternauth?.instanceType}get apiUrl(){return this.#s||""}initTernSecureAuth(){if(this._mode!=="browser"||this.isReady)return;const e=u.initialize(this.options);this.loadTernSecureAuth(e)}loadTernSecureAuth=e=>{if(!e)throw new Error("TernAuth instance is not initialized");return this.ternauth=e,this.preAddListener.forEach((t,r)=>{t.unsubscribe=e.addListener(r)}),this.#r.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),typeof this.ternauth.status>"u"&&(console.log("[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready"),this.#i="ready",this.#r.emit(a.Status,"ready")),this.ternauth};on=(...e)=>this.ternauth?.on?this.ternauth.on(...e):this.#r.on(...e);off=(...e)=>this.ternauth?.off?this.ternauth.off(...e):this.#r.off(...e);addListener=e=>{if(this.ternauth)return this.ternauth.addListener(e);{const t=()=>{const r=this.preAddListener.get(e);r&&(r.unsubscribe(),this.preAddListener.delete(e))};return this.preAddListener.set(e,{unsubscribe:t}),t}};createActiveSession=e=>this.ternauth?this.ternauth.createActiveSession(e):Promise.reject(new Error("TernSecureAuth not initialized"));signOut=async e=>{if(!this.ternauth)throw new Error("TernSecureAuth not initialized");await this.ternauth.signOut()};get currentSession(){return this.ternauth?this.ternauth.currentSession:null}onAuthStateChanged(e){return this.ternauth?this.ternauth.onAuthStateChanged(e):(console.warn("[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener"),()=>{})}getRedirectResult=async()=>{if(!this.ternauth?.getRedirectResult)throw new Error("TernSecure instance not initialized");return this.ternauth.getRedirectResult()};constructUrlWithAuthRedirect=e=>this.ternauth&&this.isReady?this.ternauth.constructUrlWithAuthRedirect(e):"";navigate=e=>{this.ternauth&&this.isReady&&this.ternauth.navigate(e)};redirectToSignIn=async e=>{this.ternauth?.redirectToSignIn&&this.ternauth.redirectToSignIn(e)};redirectToSignUp=async e=>{this.ternauth?.redirectToSignUp&&this.ternauth.redirectToSignUp()};redirectAfterSignIn=e=>{this.ternauth?.redirectAfterSignIn&&this.ternauth.redirectAfterSignIn()};redirectAfterSignUp=e=>{this.ternauth?.redirectAfterSignUp&&this.ternauth.redirectAfterSignUp()};#u(){return new Promise(e=>{e(this.ternauth)})}initialize=async()=>{this.initTernSecureAuth();try{await this.#u()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernSecureAuth:",e),e}}}export{s as IsoTernSecureAuth,i as inBrowser};
1
+ import{loadTernUIScript as o}from"@tern-secure/shared/loadTernUIScript";import{createTernAuthEventBus as u,ternEvents as a}from"@tern-secure/shared/ternStatusEvent";import{handleValueOrFn as i}from"@tern-secure/shared/utils";import{isConstructor as h}from"../utils/isConstructor";const d={name:"@tern-secure/react",version:"1.2.0-canary.v20251125170702",environment:process.env.NODE_ENV};function n(){return typeof window<"u"}class s{_mode;options;TernSecureAuth;TernSecure;ternauth=null;ternui=null;preAddListener=new Map;premountState={signInNodes:new Map,signUpNodes:new Map,userButttonNodes:new Map,verifyNodes:new Set,methodCalls:new Map,errorListeners:new Set};#s="loading";#r;#i;#n;#t=u();static#e;get status(){return this.ternui?this.ternui.status||(this.ternui.isReady?"ready":"loading"):this.#s}get isReady(){return this.ternui?.isReady||!1}get isLoading(){return this.ternui?.isLoading||!1}get requiresVerification(){return this.options.requiresVerification??!0}get signIn(){if(this.ternui)return this.ternui.signIn||void 0}get signUp(){if(this.ternui)return this.ternui.signUp||void 0}get user(){return this.ternui?this.ternui.user:null}static getOrCreateInstance(e){return(!n()||!this.#e||e.TernSecureAuth&&this.#e.TernSecureAuth!==e.TernSecureAuth)&&(this.#e=new s(e)),this.#e}static clearInstances(){this.#e&&(this.#e.ternui=null,this.#e=null)}static clearInstance(){this.#e=null}get authDomain(){if(typeof window<"u"&&window.location)return i(this.#i,new URL(window.location.href),"");if(typeof this.#i=="function")throw new Error("Unsupported customDomain type: function");return this.#i||""}get proxyUrl(){if(typeof window<"u"&&window.location)return i(this.#n,new URL(window.location.href),"");if(typeof this.#n=="function")throw new Error("Unsupported customProxyUrl type: function");return this.#n||""}get mode(){return this._mode}_internal_getOption(e){return this.ternui?._internal_getOption?this.ternui?._internal_getOption(e):this.options[e]}_internal_getAllOptions(){return Object.freeze({...this.options})}constructor(e){const{TernSecureAuth:t=null,TernSecure:r=null}=e||{};this.#i=e.ternSecureConfig?.authDomain,this.options={...e},this._mode=n()?"browser":"server",this.#r=this.options.apiUrl,this.#n=this.options.proxyUrl,this.TernSecureAuth=t,this.TernSecure=r,this.options.sdkMetadata||(this.options.sdkMetadata=d),this.#r&&this.loadTernUI()}get sdkMetadata(){return this.ternui?.sdkMetadata||this.options.sdkMetadata}get version(){return this.ternui?.version}get instanceType(){return this.ternui?.instanceType}get apiUrl(){return this.#r||""}#o(){return new Promise(e=>{e(this.ternui)})}async loadTernUI(){if(!(this._mode!=="browser"||this.isReady)){typeof window<"u"&&(window._TernSecure_authDomain=this.authDomain,window._TernSecure_proxyUrl=this.proxyUrl,window._TernSecure_apiUrl=this.apiUrl);try{if(this.TernSecure){let e;h(this.TernSecure)?(e=new this.TernSecure(this.#r,{proxyUrl:this.proxyUrl,authDomain:this.authDomain}),this.beforeLoad(e),await e.load(this.options)):(e=this.TernSecure,e.isReady||(this.beforeLoad(e),await e.load(this.options))),global.TernSecure=e}else{if(global.TernSecure||await o({...this.options,authDomain:this.authDomain,nonce:this.options.nonce}),!global.TernSecure)throw new Error("TernSecure instance is not available globally");this.beforeLoad(global.TernSecure),await global.TernSecure.load(this.options)}return global.TernSecure?.isReady?this.injectTernUI(global.TernSecure):void 0}catch(e){const t=e;console.error(t.stack||t.message||t);return}}}beforeLoad=e=>{if(!e)throw new Error("Failed to inject TernUI")};injectTernUI=e=>{if(!e)throw new Error("TernUI instance is not initialized");return this.ternui=e,this.premountState.methodCalls.forEach(t=>t()),this.preAddListener.forEach((t,r)=>{t.unsubscribe=e.addListener(r)}),this.#t.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),this.premountState.signInNodes.forEach((t,r)=>{e.showSignIn(r,t)}),this.premountState.signUpNodes.forEach((t,r)=>{e.showSignUp(r,t)}),typeof this.ternui.status>"u"&&(console.log("[IsomorphicTernSecure] TernUI has no status, setting internal status to ready"),this.#s="ready",this.#t.emit("status","ready"),console.log("[IsomorphicTernSecure] Set internal status to ready (ternui has no status)")),this.ternui};initTernSecureAuth(){if(this._mode!=="browser"||this.isReady)return;const e=TernSecureAuthImpl.initialize(this.options);this.loadTernSecureAuth(e)}loadTernSecureAuth=e=>{if(!e)throw new Error("TernAuth instance is not initialized");return this.ternauth=e,this.preAddListener.forEach((t,r)=>{t.unsubscribe=e.addListener(r)}),this.#t.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),typeof this.ternauth.status>"u"&&(console.log("[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready"),this.#s="ready",this.#t.emit(a.Status,"ready")),this.ternauth};on=(...e)=>this.ternui?.on?this.ternui.on(...e):this.#t.on(...e);off=(...e)=>this.ternui?.off?this.ternui.off(...e):this.#t.off(...e);addListener=e=>{if(this.ternui)return this.ternui.addListener(e);{const t=()=>{const r=this.preAddListener.get(e);r&&(r.unsubscribe(),this.preAddListener.delete(e))};return this.preAddListener.set(e,{unsubscribe:t}),t}};createActiveSession=e=>this.ternui?this.ternui.createActiveSession(e):Promise.reject(new Error("TernSecureAuth not initialized"));signOut=async e=>{if(!this.ternui)throw new Error("TernSecureAuth not initialized");await this.ternui.signOut()};get currentSession(){return this.ternui?this.ternui.currentSession:null}onAuthStateChanged(e){return this.ternui?this.ternui.onAuthStateChanged(e):(console.warn("[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener"),()=>{})}getRedirectResult=async()=>{if(!this.ternui?.getRedirectResult)throw new Error("TernSecure instance not initialized");return this.ternui.getRedirectResult()};constructUrlWithAuthRedirect=e=>this.ternui&&this.isReady?this.ternui.constructUrlWithAuthRedirect(e):"";constructAfterSignOutUrl=()=>{if(this.ternui&&this.isReady)return this.ternui.constructAfterSignOutUrl()||"";{const e=()=>this.ternui?.constructAfterSignOutUrl()||"";return this.premountState.methodCalls.set("constructAfterSignOutUrl",e),""}};navigate=e=>{this.ternui&&this.isReady&&this.ternui.navigate(e)};initialize=async()=>{try{await this.#o()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernUI:",e),e}};showSignIn=(e,t)=>{this.ternui&&this.isReady?this.ternui.showSignIn(e,t):this.premountState.signInNodes.set(e,t)};hideSignIn=e=>{this.ternui&&this.isReady?this.ternui.hideSignIn(e):this.premountState.signInNodes.delete(e)};showSignUp=(e,t)=>{this.ternui&&this.isReady?this.ternui.showSignUp(e,t):this.premountState.signUpNodes.set(e,t)};hideSignUp=e=>{this.ternui&&this.isReady?this.ternui.hideSignUp(e):this.premountState.signUpNodes.delete(e)};showUserButton=e=>{this.ternui&&this.isReady?this.ternui.showUserButton(e):this.premountState.userButttonNodes.set(e,void 0)};hideUserButton=e=>{this.ternui&&this.isReady?this.ternui.hideUserButton(e):this.premountState.userButttonNodes.delete(e)};redirectToSignIn=async e=>{this.ternui?.redirectToSignIn&&this.ternui.redirectToSignIn(e)};redirectToSignUp=async e=>{this.ternui?.redirectToSignUp&&this.ternui.redirectToSignUp()};redirectAfterSignIn=e=>{this.ternui?.redirectAfterSignIn&&this.ternui.redirectAfterSignIn()};redirectAfterSignUp=e=>{this.ternui?.redirectAfterSignUp&&this.ternui.redirectAfterSignUp()};#u(){return new Promise(e=>{e(this.ternauth)})}initializeAuth=async()=>{this.initTernSecureAuth();try{await this.#u()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernSecureAuth:",e),e}}}export{s as IsoTernSecureAuth,n as inBrowser};
2
2
  //# sourceMappingURL=isoTernSecureAuth.mjs.map