@clerk/shared 4.0.0-snapshot.v20251203203405 → 4.0.0-snapshot.v20251204175016

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 (160) hide show
  1. package/dist/runtime/alternativePhoneCode.d.mts +1 -1
  2. package/dist/runtime/alternativePhoneCode.d.ts +1 -1
  3. package/dist/runtime/apiUrlFromPublishableKey.d.mts +1 -1
  4. package/dist/runtime/apiUrlFromPublishableKey.d.ts +1 -1
  5. package/dist/runtime/authorization-errors.d.mts +1 -1
  6. package/dist/runtime/authorization-errors.d.ts +1 -1
  7. package/dist/runtime/authorization.d.mts +1 -1
  8. package/dist/runtime/authorization.d.ts +1 -1
  9. package/dist/runtime/clerkEventBus.d.mts +1 -1
  10. package/dist/runtime/clerkEventBus.d.ts +1 -1
  11. package/dist/runtime/color.d.mts +1 -1
  12. package/dist/runtime/color.d.ts +1 -1
  13. package/dist/runtime/color.d.ts.map +1 -1
  14. package/dist/runtime/{constants-DsfrXdQ8.js → constants-9KypHZxJ.js} +2 -1
  15. package/dist/runtime/constants-9KypHZxJ.js.map +1 -0
  16. package/dist/runtime/{constants-BundqeOh.mjs → constants-CZ3sPBBs.mjs} +2 -1
  17. package/dist/runtime/constants-CZ3sPBBs.mjs.map +1 -0
  18. package/dist/runtime/deriveState.d.mts +1 -1
  19. package/dist/runtime/deriveState.d.ts +1 -1
  20. package/dist/runtime/{error-BYTci2WS.js → error-C4TyorFL.js} +15 -1
  21. package/dist/runtime/{error-BYTci2WS.js.map → error-C4TyorFL.js.map} +1 -1
  22. package/dist/runtime/{error-BRvlv2fP.d.ts → error-CwbYlf2s.d.ts} +9 -3
  23. package/dist/runtime/{error-BRvlv2fP.d.ts.map → error-CwbYlf2s.d.ts.map} +1 -1
  24. package/dist/runtime/{error-t9UrtAmk.mjs → error-D6MGXq-n.mjs} +10 -2
  25. package/dist/runtime/{error-t9UrtAmk.mjs.map → error-D6MGXq-n.mjs.map} +1 -1
  26. package/dist/runtime/{error-BYHbh-4N.d.mts → error-KRW-ECGa.d.mts} +9 -3
  27. package/dist/runtime/{error-BYHbh-4N.d.mts.map → error-KRW-ECGa.d.mts.map} +1 -1
  28. package/dist/runtime/error.d.mts +3 -3
  29. package/dist/runtime/error.d.ts +3 -3
  30. package/dist/runtime/error.js +2 -1
  31. package/dist/runtime/error.mjs +2 -2
  32. package/dist/runtime/globs.d.mts.map +1 -1
  33. package/dist/runtime/{index-D-EHOtTU.d.ts → index-046BvqQ_.d.ts} +16 -5
  34. package/dist/runtime/index-046BvqQ_.d.ts.map +1 -0
  35. package/dist/runtime/{index-CpTf_wzr.d.mts → index-ChHWjn_I.d.mts} +16 -5
  36. package/dist/runtime/index-ChHWjn_I.d.mts.map +1 -0
  37. package/dist/runtime/internal/clerk-js/completeSignUpFlow.d.mts +1 -1
  38. package/dist/runtime/internal/clerk-js/completeSignUpFlow.d.ts +1 -1
  39. package/dist/runtime/internal/clerk-js/completeSignUpFlow.js +2 -2
  40. package/dist/runtime/internal/clerk-js/completeSignUpFlow.mjs +2 -2
  41. package/dist/runtime/internal/clerk-js/componentGuards.d.mts +1 -1
  42. package/dist/runtime/internal/clerk-js/componentGuards.d.ts +1 -1
  43. package/dist/runtime/internal/clerk-js/constants.d.mts +1 -0
  44. package/dist/runtime/internal/clerk-js/constants.d.mts.map +1 -1
  45. package/dist/runtime/internal/clerk-js/constants.d.ts +1 -0
  46. package/dist/runtime/internal/clerk-js/constants.d.ts.map +1 -1
  47. package/dist/runtime/internal/clerk-js/constants.js +1 -1
  48. package/dist/runtime/internal/clerk-js/constants.mjs +1 -1
  49. package/dist/runtime/internal/clerk-js/injectedWeb3Providers.d.mts +1 -1
  50. package/dist/runtime/internal/clerk-js/injectedWeb3Providers.d.ts +1 -1
  51. package/dist/runtime/internal/clerk-js/passkeys.d.mts +2 -2
  52. package/dist/runtime/internal/clerk-js/passkeys.d.ts +2 -2
  53. package/dist/runtime/internal/clerk-js/passkeys.js +1 -1
  54. package/dist/runtime/internal/clerk-js/passkeys.mjs +1 -1
  55. package/dist/runtime/internal/clerk-js/passwords/complexity.d.mts +1 -1
  56. package/dist/runtime/internal/clerk-js/passwords/complexity.d.ts +1 -1
  57. package/dist/runtime/internal/clerk-js/passwords/loadZxcvbn.d.mts +1 -1
  58. package/dist/runtime/internal/clerk-js/passwords/loadZxcvbn.d.ts +1 -1
  59. package/dist/runtime/internal/clerk-js/passwords/password.d.mts +1 -1
  60. package/dist/runtime/internal/clerk-js/passwords/password.d.ts +1 -1
  61. package/dist/runtime/internal/clerk-js/passwords/strength.d.mts +1 -1
  62. package/dist/runtime/internal/clerk-js/passwords/strength.d.ts +1 -1
  63. package/dist/runtime/internal/clerk-js/queryParams.d.mts +2 -2
  64. package/dist/runtime/internal/clerk-js/queryParams.d.ts +2 -2
  65. package/dist/runtime/internal/clerk-js/queryParams.js +2 -2
  66. package/dist/runtime/internal/clerk-js/queryParams.mjs +2 -2
  67. package/dist/runtime/internal/clerk-js/queryStateParams.js +2 -2
  68. package/dist/runtime/internal/clerk-js/queryStateParams.mjs +2 -2
  69. package/dist/runtime/internal/clerk-js/redirectUrls.d.mts +1 -1
  70. package/dist/runtime/internal/clerk-js/redirectUrls.d.ts +1 -1
  71. package/dist/runtime/internal/clerk-js/sessionTasks.d.mts +2 -2
  72. package/dist/runtime/internal/clerk-js/sessionTasks.d.ts +2 -2
  73. package/dist/runtime/internal/clerk-js/sessionTasks.js +2 -2
  74. package/dist/runtime/internal/clerk-js/sessionTasks.mjs +2 -2
  75. package/dist/runtime/internal/clerk-js/url.d.mts +2 -2
  76. package/dist/runtime/internal/clerk-js/url.d.ts +2 -2
  77. package/dist/runtime/internal/clerk-js/user.d.mts +1 -1
  78. package/dist/runtime/internal/clerk-js/user.d.ts +1 -1
  79. package/dist/runtime/internal/clerk-js/web3.d.mts +1 -1
  80. package/dist/runtime/internal/clerk-js/web3.d.ts +1 -1
  81. package/dist/runtime/internal/clerk-js/web3.js +1 -1
  82. package/dist/runtime/internal/clerk-js/web3.js.map +1 -1
  83. package/dist/runtime/internal/clerk-js/web3.mjs +1 -1
  84. package/dist/runtime/internal/clerk-js/web3.mjs.map +1 -1
  85. package/dist/runtime/jwtPayloadParser.d.mts +1 -1
  86. package/dist/runtime/jwtPayloadParser.d.ts +1 -1
  87. package/dist/runtime/keys.d.mts +1 -1
  88. package/dist/runtime/keys.d.ts +1 -1
  89. package/dist/runtime/loadClerkJsScript.d.mts +1 -1
  90. package/dist/runtime/loadClerkJsScript.d.ts +1 -1
  91. package/dist/runtime/loadClerkJsScript.js +3 -3
  92. package/dist/runtime/loadClerkJsScript.js.map +1 -1
  93. package/dist/runtime/loadClerkJsScript.mjs +3 -3
  94. package/dist/runtime/loadClerkJsScript.mjs.map +1 -1
  95. package/dist/runtime/oauth.d.mts +1 -1
  96. package/dist/runtime/oauth.d.mts.map +1 -1
  97. package/dist/runtime/oauth.d.ts +1 -1
  98. package/dist/runtime/oauth.d.ts.map +1 -1
  99. package/dist/runtime/oauth.js +6 -0
  100. package/dist/runtime/oauth.js.map +1 -1
  101. package/dist/runtime/oauth.mjs +6 -0
  102. package/dist/runtime/oauth.mjs.map +1 -1
  103. package/dist/runtime/organization.d.mts +1 -1
  104. package/dist/runtime/organization.d.ts +1 -1
  105. package/dist/runtime/pathMatcher.d.mts +1 -1
  106. package/dist/runtime/pathMatcher.d.ts +1 -1
  107. package/dist/runtime/poller.d.ts.map +1 -1
  108. package/dist/runtime/{queryParams-Dj-sxi00.mjs → queryParams-Bp8tBQWv.mjs} +2 -2
  109. package/dist/runtime/{queryParams-Dj-sxi00.mjs.map → queryParams-Bp8tBQWv.mjs.map} +1 -1
  110. package/dist/runtime/{queryParams-CslzMgQf.js → queryParams-Ch4kHyox.js} +2 -2
  111. package/dist/runtime/{queryParams-CslzMgQf.js.map → queryParams-Ch4kHyox.js.map} +1 -1
  112. package/dist/runtime/react/index.d.mts +23 -13
  113. package/dist/runtime/react/index.d.mts.map +1 -1
  114. package/dist/runtime/react/index.d.ts +23 -13
  115. package/dist/runtime/react/index.d.ts.map +1 -1
  116. package/dist/runtime/react/index.js +9 -6
  117. package/dist/runtime/react/index.js.map +1 -1
  118. package/dist/runtime/react/index.mjs +9 -7
  119. package/dist/runtime/react/index.mjs.map +1 -1
  120. package/dist/runtime/router.d.mts +1 -1
  121. package/dist/runtime/router.d.ts +1 -1
  122. package/dist/runtime/router.d.ts.map +1 -1
  123. package/dist/runtime/saml.d.mts +1 -1
  124. package/dist/runtime/saml.d.ts +1 -1
  125. package/dist/runtime/{telemetry-B26lGQUL.js → telemetry-CXXDXYfo.js} +3 -3
  126. package/dist/runtime/{telemetry-B26lGQUL.js.map → telemetry-CXXDXYfo.js.map} +1 -1
  127. package/dist/runtime/{telemetry-B4xKE_qs.mjs → telemetry-DnVD78JJ.mjs} +3 -3
  128. package/dist/runtime/{telemetry-B4xKE_qs.mjs.map → telemetry-DnVD78JJ.mjs.map} +1 -1
  129. package/dist/runtime/telemetry.d.mts +2 -2
  130. package/dist/runtime/telemetry.d.mts.map +1 -1
  131. package/dist/runtime/telemetry.d.ts +2 -2
  132. package/dist/runtime/telemetry.d.ts.map +1 -1
  133. package/dist/runtime/telemetry.js +1 -1
  134. package/dist/runtime/telemetry.mjs +1 -1
  135. package/dist/runtime/types/index.d.mts +2 -2
  136. package/dist/runtime/types/index.d.ts +2 -2
  137. package/dist/runtime/ui/index.d.mts +1 -1
  138. package/dist/runtime/ui/index.d.ts +1 -1
  139. package/dist/runtime/{url-DU3lPwMJ.d.ts → url-2Vs8oqh-.d.ts} +2 -2
  140. package/dist/runtime/{url-DU3lPwMJ.d.ts.map → url-2Vs8oqh-.d.ts.map} +1 -1
  141. package/dist/runtime/{url-BJuCuFH8.d.mts → url-Btmcqq0T.d.mts} +2 -2
  142. package/dist/runtime/{url-BJuCuFH8.d.mts.map → url-Btmcqq0T.d.mts.map} +1 -1
  143. package/dist/runtime/{versionSelector-yQqWqz9J.mjs → versionSelector-C99RARtR.mjs} +3 -3
  144. package/dist/runtime/{versionSelector-yQqWqz9J.mjs.map → versionSelector-C99RARtR.mjs.map} +1 -1
  145. package/dist/runtime/{versionSelector-B9gKzL3V.js → versionSelector-CgdnX7F8.js} +3 -3
  146. package/dist/runtime/{versionSelector-B9gKzL3V.js.map → versionSelector-CgdnX7F8.js.map} +1 -1
  147. package/dist/runtime/versionSelector.js +1 -1
  148. package/dist/runtime/versionSelector.mjs +1 -1
  149. package/dist/runtime/web3.d.mts +1 -1
  150. package/dist/runtime/web3.d.ts +1 -1
  151. package/dist/types/index.d.mts +15 -4
  152. package/dist/types/index.d.mts.map +1 -1
  153. package/dist/types/index.d.ts +15 -4
  154. package/dist/types/index.d.ts.map +1 -1
  155. package/package.json +3 -2
  156. package/scripts/postinstall.mjs +77 -0
  157. package/dist/runtime/constants-BundqeOh.mjs.map +0 -1
  158. package/dist/runtime/constants-DsfrXdQ8.js.map +0 -1
  159. package/dist/runtime/index-CpTf_wzr.d.mts.map +0 -1
  160. package/dist/runtime/index-D-EHOtTU.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { d as RoutingMode, u as ClerkHostRouter } from "./index-CpTf_wzr.mjs";
1
+ import { d as RoutingMode, u as ClerkHostRouter } from "./index-ChHWjn_I.mjs";
2
2
  import "./moduleManager-pxNnXwxv.mjs";
3
3
  import React from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- import { d as RoutingMode, u as ClerkHostRouter } from "./index-D-EHOtTU.js";
1
+ import { d as RoutingMode, u as ClerkHostRouter } from "./index-046BvqQ_.js";
2
2
  import "./moduleManager-WB15hU3T.js";
3
3
  import React from "react";
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","names":[],"sources":["../../src/router/router.ts","../../src/router/react.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AAQY,KAAA,WAAA,GAAW;EASa,8CAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA;EASnB;;;EAkBF,QAAA,EAAA,MAAA;EAIH;;;EAqBI,KAAA,EAAA,CAAA,aAAiB,EAAA,MAAA,EAAA,GApDG,WAoDM;;;;EC7D7B,KAAA,EAAA,CAAA,IAAA,CAAA,EAAA,MAAA,EAAA,KAAsB,CAA8C,EAAA,OAA9C,EAAA,GAAA,OAAA;EACtB;AAKb;AAeA;EAagB,SAAM,IAAA,EDhBL,WCgBK;EACpB;;;EAIU,SAAM,IAAA,EAAA,MAAA;EAEP;;;EAQN,IAAA,EDrBG,eCqBO,CAAA,MAAA,CAAA;EAKC;;;EAAwB,OAAA,EDtB7B,eCsB6B,CAAA,SAAA,CAAA;EAAS;;;EAA0C,WAAA,EDlB5E,eCkB4E,CAAA,aAAA,CAAA;;;;YDd/E;;;;gBAII;;;;;;;;;iBAiBA,iBAAA,SAA0B,qCAA0C;;;AA7DxE,cCAC,sBDAU,ECAY,KAAA,CAAA,ODAZ,CCAY,eDAZ,GAAA,IAAA,CAAA;AASa,cCRvB,kBDQuB,ECRL,KAAA,CAAA,ODQK,CCRL,WDQK,GAAA,IAAA,CAAA;;;;AA2BrB,iBC9BC,kBAAA,CAAA,CD8BD,EC9BmB,eD8BnB;;;;AAyBC,iBCxCA,cAAA,CAAA,CDwC0B,ECxCZ,WDwCY;;;;AC7D7B,iBAkCG,MAAA,CAlCiE;EAAA,QAAA;EAA9C,QAAA;EAAA;AAkCnC,CAlCmC,EAAA;EACtB,QAAA,EAsCD,KAAA,CAAM,SAtCuD;EAKzD,QAAA,CAAA,EAAA,MAAA;EAeA,MAAA,CAAA,EAoBL,eApBmB;AAa9B,CAAA,CAAA,EAQC,KAAA,CAAA,GAAA,CAAA,OARqB;KAejB,UAAA,GAdH;EACA,IAAA,CAAA,EAAA,MAAA;EACA,KAAA,CAAA,EAAA,OAAA;CAEU;;;;AAUP,iBAKW,KAAA,CALD;EAAA,IAAA;EAAA,QAAA;EAAA;CAAA,EAKkC,UALlC,GAAA;EAKC,QAAK,EAAqD,KAAA,CAAM,SAA3D;CAAG,CAAA,EAAmE,KAAA,CAAA,SAAnE"}
1
+ {"version":3,"file":"router.d.ts","names":[],"sources":["../../src/router/router.ts","../../src/router/react.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AAQY,KAAA,WAAA,GAAW;EASa,8CAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA;EASnB;;;EAkBF,QAAA,EAAA,MAAA;EAIH;;;EAqBI,KAAA,EAAA,CAAA,aAAiB,EAAA,MAAA,EAAA,GApDG,WAoDM;;;;EC7D7B,KAAA,EAAA,CAAA,IAAA,CAAA,EAAA,MAAA,EAAA,KAAoE,CAAA,EAAA,OAAA,EAA9C,GAAA,OAAA;EACtB;AAKb;AAeA;EAagB,SAAM,IAAA,EDhBL,WCgBK;EACpB;;;EAIU,SAAM,IAAA,EAAA,MAAA;EAEP;;;EAQN,IAAA,EDrBG,eCqBO,CAAA,MAAA,CAAA;EAKC;;;EAAwB,OAAA,EDtB7B,eCsB6B,CAAA,SAAA,CAAA;EAAS;;;EAA0C,WAAA,EDlB5E,eCkB4E,CAAA,aAAA,CAAA;;;;YDd/E;;;;gBAII;;;;;;;;;iBAiBA,iBAAA,SAA0B,qCAA0C;;;AA7DxE,cCAC,sBDAU,ECAY,KAAA,CAAA,ODAZ,CCAY,eDAZ,GAAA,IAAA,CAAA;AASa,cCRvB,kBDQuB,ECRL,KAAA,CAAA,ODQK,CCRL,WDQK,GAAA,IAAA,CAAA;;;;AA2BrB,iBC9BC,kBAAA,CAAA,CD8BD,EC9BmB,eD8BnB;;;;AAyBC,iBCxCA,cAAA,CAAA,CDwC0B,ECxCZ,WDwCY;;;;AC7D7B,iBAkCG,MAAA,CAlCiE;EAAA,QAAA;EAA9C,QAAA;EAAA;AAkCnC,CAlCmC,EAAA;EACtB,QAAA,EAsCD,KAAA,CAAM,SAtCuD;EAKzD,QAAA,CAAA,EAAA,MAAA;EAeA,MAAA,CAAA,EAoBL,eApBmB;AAa9B,CAAA,CAAA,EAQC,KAAA,CAAA,GAAA,CAAA,OARqB;KAejB,UAAA,GAdH;EACA,IAAA,CAAA,EAAA,MAAA;EACA,KAAA,CAAA,EAAA,OAAA;CAEU;;;;AAUP,iBAKW,KAAA,CALD;EAAA,IAAA;EAAA,QAAA;EAAA;CAAA,EAKkC,UALlC,GAAA;EAKC,QAAK,EAAqD,KAAA,CAAM,SAA3D;CAAG,CAAA,EAAmE,KAAA,CAAA,SAAnE"}
@@ -1,4 +1,4 @@
1
- import { Ho as SamlIdpMap } from "./index-CpTf_wzr.mjs";
1
+ import { Ho as SamlIdpMap } from "./index-ChHWjn_I.mjs";
2
2
  import "./moduleManager-pxNnXwxv.mjs";
3
3
 
4
4
  //#region src/saml.d.ts
@@ -1,4 +1,4 @@
1
- import { Ho as SamlIdpMap } from "./index-D-EHOtTU.js";
1
+ import { Ho as SamlIdpMap } from "./index-046BvqQ_.js";
2
2
  import "./moduleManager-WB15hU3T.js";
3
3
 
4
4
  //#region src/saml.d.ts
@@ -379,7 +379,7 @@ function createPrebuiltComponentEvent(event) {
379
379
  payload: {
380
380
  component,
381
381
  appearanceProp: Boolean(props?.appearance),
382
- baseTheme: Boolean(props?.appearance?.baseTheme),
382
+ theme: Boolean(props?.appearance?.theme),
383
383
  elements: Boolean(props?.appearance?.elements),
384
384
  variables: Boolean(props?.appearance?.variables),
385
385
  ...additionalPayload
@@ -490,7 +490,7 @@ function eventThemeUsage(appearance) {
490
490
  */
491
491
  function analyzeThemeUsage(appearance) {
492
492
  if (!appearance || typeof appearance !== "object") return {};
493
- const themeProperty = appearance.theme || appearance.baseTheme;
493
+ const themeProperty = appearance.theme;
494
494
  if (!themeProperty) return {};
495
495
  let themeName;
496
496
  if (Array.isArray(themeProperty)) for (const theme of themeProperty) {
@@ -570,4 +570,4 @@ Object.defineProperty(exports, 'eventThemeUsage', {
570
570
  return eventThemeUsage;
571
571
  }
572
572
  });
573
- //# sourceMappingURL=telemetry-B26lGQUL.js.map
573
+ //# sourceMappingURL=telemetry-CXXDXYfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-B26lGQUL.js","names":["#cache","#generateKey","#cacheTtl","sanitizedEvent: Omit<TelemetryEvent, 'sk' | 'pk' | 'payload'> & TelemetryEvent['payload']","#getCache","#storageKey","err: unknown","#maxSize","DEFAULT_CONFIG: Partial<TelemetryCollectorConfig>","#config","#metadata","parsePublishableKey","#eventThrottler","isTruthy","#preparePayload","#logEvent","#shouldRecord","#buffer","#scheduleFlush","#shouldRecordLog","normalizedTimestamp: Date | null","timestampInput: unknown","#getSDKMetadata","logData: TelemetryLogData","#sanitizeContext","#shouldBeSampled","#flush","#pendingFlush","EVENT_SAMPLING_RATE","EVENT_SAMPLING_RATE","EVENT_SAMPLING_RATE","themeName: string | undefined"],"sources":["../../src/telemetry/throttler.ts","../../src/telemetry/collector.ts","../../src/telemetry/events/component-mounted.ts","../../src/telemetry/events/method-called.ts","../../src/telemetry/events/framework-metadata.ts","../../src/telemetry/events/theme-usage.ts"],"sourcesContent":["import type { TelemetryEvent } from '../types';\n\ntype TtlInMilliseconds = number;\n\nconst DEFAULT_CACHE_TTL_MS = 86400000; // 24 hours\n\n/**\n * Interface for cache storage used by the telemetry throttler.\n * Implementations can use localStorage, in-memory storage, or any other storage mechanism.\n */\nexport interface ThrottlerCache {\n getItem(key: string): TtlInMilliseconds | undefined;\n setItem(key: string, value: TtlInMilliseconds): void;\n removeItem(key: string): void;\n}\n\n/**\n * Manages throttling for telemetry events using a configurable cache implementation\n * to mitigate event flooding in frequently executed code paths.\n */\nexport class TelemetryEventThrottler {\n #cache: ThrottlerCache;\n #cacheTtl = DEFAULT_CACHE_TTL_MS;\n\n constructor(cache: ThrottlerCache) {\n this.#cache = cache;\n }\n\n isEventThrottled(payload: TelemetryEvent): boolean {\n const now = Date.now();\n const key = this.#generateKey(payload);\n const entry = this.#cache.getItem(key);\n\n if (!entry) {\n this.#cache.setItem(key, now);\n return false;\n }\n\n const shouldInvalidate = now - entry > this.#cacheTtl;\n if (shouldInvalidate) {\n this.#cache.setItem(key, now);\n return false;\n }\n\n return true;\n }\n\n /**\n * Generates a consistent unique key for telemetry events by sorting payload properties.\n * This ensures that payloads with identical content in different orders produce the same key.\n */\n #generateKey(event: TelemetryEvent): string {\n const { sk: _sk, pk: _pk, payload, ...rest } = event;\n\n const sanitizedEvent: Omit<TelemetryEvent, 'sk' | 'pk' | 'payload'> & TelemetryEvent['payload'] = {\n ...payload,\n ...rest,\n };\n\n return JSON.stringify(\n Object.keys({\n ...payload,\n ...rest,\n })\n .sort()\n .map(key => sanitizedEvent[key]),\n );\n }\n}\n\n/**\n * LocalStorage-based cache implementation for browser environments.\n */\nexport class LocalStorageThrottlerCache implements ThrottlerCache {\n #storageKey = 'clerk_telemetry_throttler';\n\n getItem(key: string): TtlInMilliseconds | undefined {\n return this.#getCache()[key];\n }\n\n setItem(key: string, value: TtlInMilliseconds): void {\n try {\n const cache = this.#getCache();\n cache[key] = value;\n localStorage.setItem(this.#storageKey, JSON.stringify(cache));\n } catch (err: unknown) {\n const isQuotaExceededError =\n err instanceof DOMException &&\n // Check error names for different browsers\n (err.name === 'QuotaExceededError' || err.name === 'NS_ERROR_DOM_QUOTA_REACHED');\n\n if (isQuotaExceededError && localStorage.length > 0) {\n // Clear our cache if quota exceeded\n localStorage.removeItem(this.#storageKey);\n }\n }\n }\n\n removeItem(key: string): void {\n try {\n const cache = this.#getCache();\n delete cache[key];\n localStorage.setItem(this.#storageKey, JSON.stringify(cache));\n } catch {\n // Silently fail if we can't remove\n }\n }\n\n #getCache(): Record<string, TtlInMilliseconds> {\n try {\n const cacheString = localStorage.getItem(this.#storageKey);\n if (!cacheString) {\n return {};\n }\n return JSON.parse(cacheString);\n } catch {\n return {};\n }\n }\n\n static isSupported(): boolean {\n return typeof window !== 'undefined' && !!window.localStorage;\n }\n}\n\n/**\n * In-memory cache implementation for non-browser environments (e.g., React Native).\n */\nexport class InMemoryThrottlerCache implements ThrottlerCache {\n #cache: Map<string, TtlInMilliseconds> = new Map();\n #maxSize = 10000; // Defensive limit to prevent memory issues\n\n getItem(key: string): TtlInMilliseconds | undefined {\n // Defensive: clear cache if it gets too large\n if (this.#cache.size > this.#maxSize) {\n this.#cache.clear();\n return undefined;\n }\n\n return this.#cache.get(key);\n }\n\n setItem(key: string, value: TtlInMilliseconds): void {\n this.#cache.set(key, value);\n }\n\n removeItem(key: string): void {\n this.#cache.delete(key);\n }\n}\n","/**\n * The `TelemetryCollector` class handles collection of telemetry events from Clerk SDKs. Telemetry is opt-out and can be disabled by setting a CLERK_TELEMETRY_DISABLED environment variable.\n * The `ClerkProvider` also accepts a `telemetry` prop that will be passed to the collector during initialization:.\n *\n * ```jsx\n * <ClerkProvider telemetry={false}>\n * ...\n * </ClerkProvider>\n * ```\n *\n * For more information, please see the telemetry documentation page: https://clerk.com/docs/telemetry.\n */\nimport { parsePublishableKey } from '../keys';\nimport type {\n InstanceType,\n SDKMetadata,\n TelemetryCollector as TelemetryCollectorInterface,\n TelemetryEvent,\n TelemetryEventRaw,\n TelemetryLogEntry,\n} from '../types';\nimport { isTruthy } from '../underscore';\nimport { InMemoryThrottlerCache, LocalStorageThrottlerCache, TelemetryEventThrottler } from './throttler';\nimport type { TelemetryCollectorOptions } from './types';\n\n/**\n * Local interface for window.Clerk to avoid global type pollution.\n * This is only used within this module and doesn't affect other packages.\n */\ninterface WindowWithClerk extends Window {\n Clerk?: {\n constructor?: {\n sdkMetadata?: SDKMetadata;\n };\n };\n}\n\n/**\n * Type guard to check if window.Clerk exists and has the expected structure.\n */\nfunction isWindowClerkWithMetadata(clerk: unknown): clerk is { constructor: { sdkMetadata?: SDKMetadata } } {\n return (\n typeof clerk === 'object' && clerk !== null && 'constructor' in clerk && typeof clerk.constructor === 'function'\n );\n}\n\ntype TelemetryCollectorConfig = Pick<\n TelemetryCollectorOptions,\n 'samplingRate' | 'disabled' | 'debug' | 'maxBufferSize' | 'perEventSampling'\n> & {\n endpoint: string;\n};\n\ntype TelemetryMetadata = Required<\n Pick<TelemetryCollectorOptions, 'clerkVersion' | 'sdk' | 'sdkVersion' | 'publishableKey' | 'secretKey'>\n> & {\n /**\n * The instance type, derived from the provided publishableKey.\n */\n instanceType: InstanceType;\n};\n\n/**\n * Structure of log data sent to the telemetry endpoint.\n */\ntype TelemetryLogData = {\n /** Service that generated the log. */\n sdk: string;\n /** The version of the SDK where the event originated from. */\n sdkv: string;\n /** The version of Clerk where the event originated from. */\n cv: string;\n /** Log level (info, warn, error, debug, etc.). */\n lvl: TelemetryLogEntry['level'];\n /** Log message. */\n msg: string;\n /** Instance ID - optional. */\n iid?: string;\n /** Timestamp when log was generated. */\n ts: string;\n /** Primary key. */\n pk: string | null;\n /** Additional payload for the log. */\n payload: Record<string, unknown> | null;\n};\n\ntype TelemetryBufferItem = { kind: 'event'; value: TelemetryEvent } | { kind: 'log'; value: TelemetryLogData };\n\n// Accepted log levels for runtime validation\nconst VALID_LOG_LEVELS = new Set<string>(['error', 'warn', 'info', 'debug', 'trace']);\n\nconst DEFAULT_CONFIG: Partial<TelemetryCollectorConfig> = {\n samplingRate: 1,\n maxBufferSize: 5,\n // Production endpoint: https://clerk-telemetry.com\n // Staging endpoint: https://staging.clerk-telemetry.com\n // Local: http://localhost:8787\n endpoint: 'https://clerk-telemetry.com',\n};\n\nexport class TelemetryCollector implements TelemetryCollectorInterface {\n #config: Required<TelemetryCollectorConfig>;\n #eventThrottler: TelemetryEventThrottler;\n #metadata: TelemetryMetadata = {} as TelemetryMetadata;\n #buffer: TelemetryBufferItem[] = [];\n #pendingFlush: number | ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: TelemetryCollectorOptions) {\n this.#config = {\n maxBufferSize: options.maxBufferSize ?? DEFAULT_CONFIG.maxBufferSize,\n samplingRate: options.samplingRate ?? DEFAULT_CONFIG.samplingRate,\n perEventSampling: options.perEventSampling ?? true,\n disabled: options.disabled ?? false,\n debug: options.debug ?? false,\n endpoint: DEFAULT_CONFIG.endpoint,\n } as Required<TelemetryCollectorConfig>;\n\n if (!options.clerkVersion && typeof window === 'undefined') {\n // N/A in a server environment\n this.#metadata.clerkVersion = '';\n } else {\n this.#metadata.clerkVersion = options.clerkVersion ?? '';\n }\n\n // We will try to grab the SDK data lazily when an event is triggered, so it should always be defined once the event is sent.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#metadata.sdk = options.sdk!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#metadata.sdkVersion = options.sdkVersion!;\n\n this.#metadata.publishableKey = options.publishableKey ?? '';\n\n const parsedKey = parsePublishableKey(options.publishableKey);\n if (parsedKey) {\n this.#metadata.instanceType = parsedKey.instanceType;\n }\n\n if (options.secretKey) {\n // Only send the first 16 characters of the secret key to to avoid sending the full key. We can still query against the partial key.\n this.#metadata.secretKey = options.secretKey.substring(0, 16);\n }\n\n // Use LocalStorage cache in browsers where it's supported, otherwise fall back to in-memory cache\n const cache = LocalStorageThrottlerCache.isSupported()\n ? new LocalStorageThrottlerCache()\n : new InMemoryThrottlerCache();\n this.#eventThrottler = new TelemetryEventThrottler(cache);\n }\n\n get isEnabled(): boolean {\n if (this.#metadata.instanceType !== 'development') {\n return false;\n }\n\n // In browser or client environments, we most likely pass the disabled option to the collector, but in environments\n // where environment variables are available we also check for `CLERK_TELEMETRY_DISABLED`.\n if (\n this.#config.disabled ||\n (typeof process !== 'undefined' && process.env && isTruthy(process.env.CLERK_TELEMETRY_DISABLED))\n ) {\n return false;\n }\n\n // navigator.webdriver is a property generally set by headless browsers that are running in an automated testing environment.\n // Data from these environments is not meaningful for us and has the potential to produce a large volume of events, so we disable\n // collection in this case. (ref: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/webdriver)\n if (typeof window !== 'undefined' && !!window?.navigator?.webdriver) {\n return false;\n }\n\n return true;\n }\n\n get isDebug(): boolean {\n return (\n this.#config.debug ||\n (typeof process !== 'undefined' && process.env && isTruthy(process.env.CLERK_TELEMETRY_DEBUG))\n );\n }\n\n record(event: TelemetryEventRaw): void {\n try {\n const preparedPayload = this.#preparePayload(event.event, event.payload);\n\n this.#logEvent(preparedPayload.event, preparedPayload);\n\n if (!this.#shouldRecord(preparedPayload, event.eventSamplingRate)) {\n return;\n }\n\n this.#buffer.push({ kind: 'event', value: preparedPayload });\n\n this.#scheduleFlush();\n } catch (error) {\n console.error('[clerk/telemetry] Error recording telemetry event', error);\n }\n }\n\n /**\n * Records a telemetry log entry if logging is enabled and not in debug mode.\n *\n * @param entry - The telemetry log entry to record.\n */\n recordLog(entry: TelemetryLogEntry): void {\n try {\n if (!this.#shouldRecordLog(entry)) {\n return;\n }\n\n const levelIsValid = typeof entry?.level === 'string' && VALID_LOG_LEVELS.has(entry.level);\n const messageIsValid = typeof entry?.message === 'string' && entry.message.trim().length > 0;\n\n let normalizedTimestamp: Date | null = null;\n const timestampInput: unknown = (entry as unknown as { timestamp?: unknown })?.timestamp;\n if (typeof timestampInput === 'number' || typeof timestampInput === 'string') {\n const candidate = new Date(timestampInput);\n if (!Number.isNaN(candidate.getTime())) {\n normalizedTimestamp = candidate;\n }\n }\n\n if (!levelIsValid || !messageIsValid || normalizedTimestamp === null) {\n if (this.isDebug && typeof console !== 'undefined') {\n console.warn('[clerk/telemetry] Dropping invalid telemetry log entry', {\n levelIsValid,\n messageIsValid,\n timestampIsValid: normalizedTimestamp !== null,\n });\n }\n return;\n }\n\n const sdkMetadata = this.#getSDKMetadata();\n\n const logData: TelemetryLogData = {\n sdk: sdkMetadata.name,\n sdkv: sdkMetadata.version,\n cv: this.#metadata.clerkVersion ?? '',\n lvl: entry.level,\n msg: entry.message,\n ts: normalizedTimestamp.toISOString(),\n pk: this.#metadata.publishableKey || null,\n payload: this.#sanitizeContext(entry.context),\n };\n\n this.#buffer.push({ kind: 'log', value: logData });\n\n this.#scheduleFlush();\n } catch (error) {\n console.error('[clerk/telemetry] Error recording telemetry log entry', error);\n }\n }\n\n #shouldRecord(preparedPayload: TelemetryEvent, eventSamplingRate?: number) {\n return this.isEnabled && !this.isDebug && this.#shouldBeSampled(preparedPayload, eventSamplingRate);\n }\n\n #shouldRecordLog(_entry: TelemetryLogEntry): boolean {\n // Always allow logs from debug logger to be sent. Debug logger itself is already gated elsewhere.\n return true;\n }\n\n #shouldBeSampled(preparedPayload: TelemetryEvent, eventSamplingRate?: number) {\n const randomSeed = Math.random();\n\n const toBeSampled =\n randomSeed <= this.#config.samplingRate &&\n (this.#config.perEventSampling === false ||\n typeof eventSamplingRate === 'undefined' ||\n randomSeed <= eventSamplingRate);\n\n if (!toBeSampled) {\n return false;\n }\n\n return !this.#eventThrottler.isEventThrottled(preparedPayload);\n }\n\n #scheduleFlush(): void {\n // On the server, we want to flush immediately as we have less guarantees about the lifecycle of the process\n if (typeof window === 'undefined') {\n this.#flush();\n return;\n }\n const isBufferFull = this.#buffer.length >= this.#config.maxBufferSize;\n if (isBufferFull) {\n // If the buffer is full, flush immediately to make sure we minimize the chance of event loss.\n // Cancel any pending flushes as we're going to flush immediately\n if (this.#pendingFlush) {\n if (typeof cancelIdleCallback !== 'undefined') {\n cancelIdleCallback(Number(this.#pendingFlush));\n } else {\n clearTimeout(Number(this.#pendingFlush));\n }\n }\n this.#flush();\n return;\n }\n\n // If we have a pending flush, do nothing\n if (this.#pendingFlush) {\n return;\n }\n\n if ('requestIdleCallback' in window) {\n this.#pendingFlush = requestIdleCallback(() => {\n this.#flush();\n this.#pendingFlush = null;\n });\n } else {\n // This is not an ideal solution, but it at least waits until the next tick\n this.#pendingFlush = setTimeout(() => {\n this.#flush();\n this.#pendingFlush = null;\n }, 0);\n }\n }\n\n #flush(): void {\n // Capture the current buffer and clear it immediately to avoid closure references\n const itemsToSend = [...this.#buffer];\n this.#buffer = [];\n\n this.#pendingFlush = null;\n\n if (itemsToSend.length === 0) {\n return;\n }\n\n const eventsToSend = itemsToSend\n .filter(item => item.kind === 'event')\n .map(item => (item as { kind: 'event'; value: TelemetryEvent }).value);\n\n const logsToSend = itemsToSend\n .filter(item => item.kind === 'log')\n .map(item => (item as { kind: 'log'; value: TelemetryLogData }).value);\n\n if (eventsToSend.length > 0) {\n const eventsUrl = new URL('/v1/event', this.#config.endpoint);\n fetch(eventsUrl, {\n headers: {\n 'Content-Type': 'application/json',\n },\n keepalive: true,\n method: 'POST',\n // TODO: We send an array here with that idea that we can eventually send multiple events.\n body: JSON.stringify({ events: eventsToSend }),\n }).catch(() => void 0);\n }\n\n if (logsToSend.length > 0) {\n const logsUrl = new URL('/v1/logs', this.#config.endpoint);\n fetch(logsUrl, {\n headers: {\n 'Content-Type': 'application/json',\n },\n keepalive: true,\n method: 'POST',\n body: JSON.stringify({ logs: logsToSend }),\n }).catch(() => void 0);\n }\n }\n\n /**\n * If running in debug mode, log the event and its payload to the console.\n */\n #logEvent(event: TelemetryEvent['event'], payload: Record<string, any>) {\n if (!this.isDebug) {\n return;\n }\n\n if (typeof console.groupCollapsed !== 'undefined') {\n console.groupCollapsed('[clerk/telemetry]', event);\n console.log(payload);\n console.groupEnd();\n } else {\n console.log('[clerk/telemetry]', event, payload);\n }\n }\n\n /**\n * If in browser, attempt to lazily grab the SDK metadata from the Clerk singleton, otherwise fallback to the initially passed in values.\n *\n * This is necessary because the sdkMetadata can be set by the host SDK after the TelemetryCollector is instantiated.\n */\n #getSDKMetadata() {\n const sdkMetadata = {\n name: this.#metadata.sdk,\n version: this.#metadata.sdkVersion,\n };\n\n if (typeof window !== 'undefined') {\n const windowWithClerk = window as WindowWithClerk;\n\n if (windowWithClerk.Clerk) {\n const windowClerk = windowWithClerk.Clerk;\n\n if (isWindowClerkWithMetadata(windowClerk) && windowClerk.constructor.sdkMetadata) {\n const { name, version } = windowClerk.constructor.sdkMetadata;\n\n if (name !== undefined) {\n sdkMetadata.name = name;\n }\n if (version !== undefined) {\n sdkMetadata.version = version;\n }\n }\n }\n }\n\n return sdkMetadata;\n }\n\n /**\n * Append relevant metadata from the Clerk singleton to the event payload.\n */\n #preparePayload(event: TelemetryEvent['event'], payload: TelemetryEvent['payload']): TelemetryEvent {\n const sdkMetadata = this.#getSDKMetadata();\n\n return {\n event,\n cv: this.#metadata.clerkVersion ?? '',\n it: this.#metadata.instanceType ?? '',\n sdk: sdkMetadata.name,\n sdkv: sdkMetadata.version,\n ...(this.#metadata.publishableKey ? { pk: this.#metadata.publishableKey } : {}),\n ...(this.#metadata.secretKey ? { sk: this.#metadata.secretKey } : {}),\n payload,\n };\n }\n\n /**\n * Best-effort sanitization of the context payload. Returns a plain object with JSON-serializable\n * values or null when the input is missing or not serializable. Arrays are not accepted.\n */\n #sanitizeContext(context: unknown): Record<string, unknown> | null {\n if (context === null || typeof context === 'undefined') {\n return null;\n }\n if (typeof context !== 'object') {\n return null;\n }\n try {\n const cleaned = JSON.parse(JSON.stringify(context));\n if (cleaned && typeof cleaned === 'object' && !Array.isArray(cleaned)) {\n return cleaned as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_COMPONENT_MOUNTED = 'COMPONENT_MOUNTED';\nconst EVENT_COMPONENT_OPENED = 'COMPONENT_OPENED';\nconst EVENT_SAMPLING_RATE = 0.1;\n\n/** Increase sampling for high-signal auth components on mount. */\nconst AUTH_COMPONENTS = new Set<string>(['SignIn', 'SignUp']);\n\n/**\n * Returns the per-event sampling rate for component-mounted telemetry events.\n * Uses a higher rate for SignIn/SignUp to improve signal quality.\n *\n * @internal\n */\nfunction getComponentMountedSamplingRate(component: string): number {\n return AUTH_COMPONENTS.has(component) ? 1 : EVENT_SAMPLING_RATE;\n}\n\ntype ComponentMountedBase = {\n component: string;\n};\n\ntype EventPrebuiltComponent = ComponentMountedBase & {\n appearanceProp: boolean;\n elements: boolean;\n variables: boolean;\n baseTheme: boolean;\n};\n\ntype EventComponentMounted = ComponentMountedBase & TelemetryEventRaw['payload'];\n\n/**\n * Factory for prebuilt component telemetry events.\n *\n * @internal\n */\nfunction createPrebuiltComponentEvent(event: typeof EVENT_COMPONENT_MOUNTED | typeof EVENT_COMPONENT_OPENED) {\n return function (\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n ): TelemetryEventRaw<EventPrebuiltComponent> {\n return {\n event,\n eventSamplingRate:\n event === EVENT_COMPONENT_MOUNTED ? getComponentMountedSamplingRate(component) : EVENT_SAMPLING_RATE,\n payload: {\n component,\n appearanceProp: Boolean(props?.appearance),\n baseTheme: Boolean(props?.appearance?.baseTheme),\n elements: Boolean(props?.appearance?.elements),\n variables: Boolean(props?.appearance?.variables),\n ...additionalPayload,\n },\n };\n };\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a prebuilt (AIO) component is mounted.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Will be filtered to a known list of props.\n * @param additionalPayload - Additional data to send with the event.\n * @example\n * telemetry.record(eventPrebuiltComponentMounted('SignUp', props));\n */\nexport function eventPrebuiltComponentMounted(\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n): TelemetryEventRaw<EventPrebuiltComponent> {\n return createPrebuiltComponentEvent(EVENT_COMPONENT_MOUNTED)(component, props, additionalPayload);\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a prebuilt (AIO) component is opened as a modal.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Will be filtered to a known list of props.\n * @param additionalPayload - Additional data to send with the event.\n * @example\n * telemetry.record(eventPrebuiltComponentOpened('GoogleOneTap', props));\n */\nexport function eventPrebuiltComponentOpened(\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n): TelemetryEventRaw<EventPrebuiltComponent> {\n return createPrebuiltComponentEvent(EVENT_COMPONENT_OPENED)(component, props, additionalPayload);\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a component is mounted. Use `eventPrebuiltComponentMounted` for prebuilt components.\n *\n * **Caution:** Filter the `props` you pass to this function to avoid sending too much data.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Ideally you only pass a handful of props here.\n * @example\n * telemetry.record(eventComponentMounted('SignUp', props));\n */\nexport function eventComponentMounted(\n component: string,\n props: TelemetryEventRaw['payload'] = {},\n): TelemetryEventRaw<EventComponentMounted> {\n return {\n event: EVENT_COMPONENT_MOUNTED,\n eventSamplingRate: getComponentMountedSamplingRate(component),\n payload: {\n component,\n ...props,\n },\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_METHOD_CALLED = 'METHOD_CALLED';\nconst EVENT_SAMPLING_RATE = 0.1;\n\ntype EventMethodCalled = {\n method: string;\n} & Record<string, string | number | boolean>;\n\n/**\n * Fired when a helper method is called from a Clerk SDK.\n */\nexport function eventMethodCalled(\n method: string,\n payload?: Record<string, unknown>,\n): TelemetryEventRaw<EventMethodCalled> {\n return {\n event: EVENT_METHOD_CALLED,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload: {\n method,\n ...payload,\n },\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_FRAMEWORK_METADATA = 'FRAMEWORK_METADATA';\nconst EVENT_SAMPLING_RATE = 0.1;\n\ntype EventFrameworkMetadata = Record<string, string | number | boolean>;\n\n/**\n * Fired when a helper method is called from a Clerk SDK.\n */\nexport function eventFrameworkMetadata(payload: EventFrameworkMetadata): TelemetryEventRaw<EventFrameworkMetadata> {\n return {\n event: EVENT_FRAMEWORK_METADATA,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload,\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nexport const EVENT_THEME_USAGE = 'THEME_USAGE';\nexport const EVENT_SAMPLING_RATE = 1;\n\ntype EventThemeUsage = {\n /**\n * The name of the theme being used (e.g., \"shadcn\", \"neobrutalism\", etc.).\n */\n themeName?: string;\n};\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for tracking theme usage in ClerkProvider.\n *\n * @param appearance - The appearance prop from ClerkProvider.\n * @example\n * telemetry.record(eventThemeUsage(appearance));\n */\nexport function eventThemeUsage(appearance?: any): TelemetryEventRaw<EventThemeUsage> {\n const payload = analyzeThemeUsage(appearance);\n\n return {\n event: EVENT_THEME_USAGE,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload,\n };\n}\n\n/**\n * Analyzes the appearance prop to extract theme usage information for telemetry.\n *\n * @internal\n */\nfunction analyzeThemeUsage(appearance?: any): EventThemeUsage {\n if (!appearance || typeof appearance !== 'object') {\n return {};\n }\n\n // Prioritize the new theme property over deprecated baseTheme\n const themeProperty = appearance.theme || appearance.baseTheme;\n\n if (!themeProperty) {\n return {};\n }\n\n let themeName: string | undefined;\n\n if (Array.isArray(themeProperty)) {\n // Look for the first identifiable theme name in the array\n for (const theme of themeProperty) {\n const name = extractThemeName(theme);\n if (name) {\n themeName = name;\n break;\n }\n }\n } else {\n themeName = extractThemeName(themeProperty);\n }\n\n return { themeName };\n}\n\n/**\n * Extracts the theme name from a theme object.\n *\n * @internal\n */\nfunction extractThemeName(theme: any): string | undefined {\n if (typeof theme === 'string') {\n return theme;\n }\n\n if (typeof theme === 'object' && theme !== null) {\n // Check for explicit theme name\n if ('name' in theme && typeof theme.name === 'string') {\n return theme.name;\n }\n }\n\n return undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"telemetry-CXXDXYfo.js","names":["#cache","#generateKey","#cacheTtl","sanitizedEvent: Omit<TelemetryEvent, 'sk' | 'pk' | 'payload'> & TelemetryEvent['payload']","#getCache","#storageKey","err: unknown","#maxSize","DEFAULT_CONFIG: Partial<TelemetryCollectorConfig>","#config","#metadata","parsePublishableKey","#eventThrottler","isTruthy","#preparePayload","#logEvent","#shouldRecord","#buffer","#scheduleFlush","#shouldRecordLog","normalizedTimestamp: Date | null","timestampInput: unknown","#getSDKMetadata","logData: TelemetryLogData","#sanitizeContext","#shouldBeSampled","#flush","#pendingFlush","EVENT_SAMPLING_RATE","EVENT_SAMPLING_RATE","EVENT_SAMPLING_RATE","themeName: string | undefined"],"sources":["../../src/telemetry/throttler.ts","../../src/telemetry/collector.ts","../../src/telemetry/events/component-mounted.ts","../../src/telemetry/events/method-called.ts","../../src/telemetry/events/framework-metadata.ts","../../src/telemetry/events/theme-usage.ts"],"sourcesContent":["import type { TelemetryEvent } from '../types';\n\ntype TtlInMilliseconds = number;\n\nconst DEFAULT_CACHE_TTL_MS = 86400000; // 24 hours\n\n/**\n * Interface for cache storage used by the telemetry throttler.\n * Implementations can use localStorage, in-memory storage, or any other storage mechanism.\n */\nexport interface ThrottlerCache {\n getItem(key: string): TtlInMilliseconds | undefined;\n setItem(key: string, value: TtlInMilliseconds): void;\n removeItem(key: string): void;\n}\n\n/**\n * Manages throttling for telemetry events using a configurable cache implementation\n * to mitigate event flooding in frequently executed code paths.\n */\nexport class TelemetryEventThrottler {\n #cache: ThrottlerCache;\n #cacheTtl = DEFAULT_CACHE_TTL_MS;\n\n constructor(cache: ThrottlerCache) {\n this.#cache = cache;\n }\n\n isEventThrottled(payload: TelemetryEvent): boolean {\n const now = Date.now();\n const key = this.#generateKey(payload);\n const entry = this.#cache.getItem(key);\n\n if (!entry) {\n this.#cache.setItem(key, now);\n return false;\n }\n\n const shouldInvalidate = now - entry > this.#cacheTtl;\n if (shouldInvalidate) {\n this.#cache.setItem(key, now);\n return false;\n }\n\n return true;\n }\n\n /**\n * Generates a consistent unique key for telemetry events by sorting payload properties.\n * This ensures that payloads with identical content in different orders produce the same key.\n */\n #generateKey(event: TelemetryEvent): string {\n const { sk: _sk, pk: _pk, payload, ...rest } = event;\n\n const sanitizedEvent: Omit<TelemetryEvent, 'sk' | 'pk' | 'payload'> & TelemetryEvent['payload'] = {\n ...payload,\n ...rest,\n };\n\n return JSON.stringify(\n Object.keys({\n ...payload,\n ...rest,\n })\n .sort()\n .map(key => sanitizedEvent[key]),\n );\n }\n}\n\n/**\n * LocalStorage-based cache implementation for browser environments.\n */\nexport class LocalStorageThrottlerCache implements ThrottlerCache {\n #storageKey = 'clerk_telemetry_throttler';\n\n getItem(key: string): TtlInMilliseconds | undefined {\n return this.#getCache()[key];\n }\n\n setItem(key: string, value: TtlInMilliseconds): void {\n try {\n const cache = this.#getCache();\n cache[key] = value;\n localStorage.setItem(this.#storageKey, JSON.stringify(cache));\n } catch (err: unknown) {\n const isQuotaExceededError =\n err instanceof DOMException &&\n // Check error names for different browsers\n (err.name === 'QuotaExceededError' || err.name === 'NS_ERROR_DOM_QUOTA_REACHED');\n\n if (isQuotaExceededError && localStorage.length > 0) {\n // Clear our cache if quota exceeded\n localStorage.removeItem(this.#storageKey);\n }\n }\n }\n\n removeItem(key: string): void {\n try {\n const cache = this.#getCache();\n delete cache[key];\n localStorage.setItem(this.#storageKey, JSON.stringify(cache));\n } catch {\n // Silently fail if we can't remove\n }\n }\n\n #getCache(): Record<string, TtlInMilliseconds> {\n try {\n const cacheString = localStorage.getItem(this.#storageKey);\n if (!cacheString) {\n return {};\n }\n return JSON.parse(cacheString);\n } catch {\n return {};\n }\n }\n\n static isSupported(): boolean {\n return typeof window !== 'undefined' && !!window.localStorage;\n }\n}\n\n/**\n * In-memory cache implementation for non-browser environments (e.g., React Native).\n */\nexport class InMemoryThrottlerCache implements ThrottlerCache {\n #cache: Map<string, TtlInMilliseconds> = new Map();\n #maxSize = 10000; // Defensive limit to prevent memory issues\n\n getItem(key: string): TtlInMilliseconds | undefined {\n // Defensive: clear cache if it gets too large\n if (this.#cache.size > this.#maxSize) {\n this.#cache.clear();\n return undefined;\n }\n\n return this.#cache.get(key);\n }\n\n setItem(key: string, value: TtlInMilliseconds): void {\n this.#cache.set(key, value);\n }\n\n removeItem(key: string): void {\n this.#cache.delete(key);\n }\n}\n","/**\n * The `TelemetryCollector` class handles collection of telemetry events from Clerk SDKs. Telemetry is opt-out and can be disabled by setting a CLERK_TELEMETRY_DISABLED environment variable.\n * The `ClerkProvider` also accepts a `telemetry` prop that will be passed to the collector during initialization:.\n *\n * ```jsx\n * <ClerkProvider telemetry={false}>\n * ...\n * </ClerkProvider>\n * ```\n *\n * For more information, please see the telemetry documentation page: https://clerk.com/docs/telemetry.\n */\nimport { parsePublishableKey } from '../keys';\nimport type {\n InstanceType,\n SDKMetadata,\n TelemetryCollector as TelemetryCollectorInterface,\n TelemetryEvent,\n TelemetryEventRaw,\n TelemetryLogEntry,\n} from '../types';\nimport { isTruthy } from '../underscore';\nimport { InMemoryThrottlerCache, LocalStorageThrottlerCache, TelemetryEventThrottler } from './throttler';\nimport type { TelemetryCollectorOptions } from './types';\n\n/**\n * Local interface for window.Clerk to avoid global type pollution.\n * This is only used within this module and doesn't affect other packages.\n */\ninterface WindowWithClerk extends Window {\n Clerk?: {\n constructor?: {\n sdkMetadata?: SDKMetadata;\n };\n };\n}\n\n/**\n * Type guard to check if window.Clerk exists and has the expected structure.\n */\nfunction isWindowClerkWithMetadata(clerk: unknown): clerk is { constructor: { sdkMetadata?: SDKMetadata } } {\n return (\n typeof clerk === 'object' && clerk !== null && 'constructor' in clerk && typeof clerk.constructor === 'function'\n );\n}\n\ntype TelemetryCollectorConfig = Pick<\n TelemetryCollectorOptions,\n 'samplingRate' | 'disabled' | 'debug' | 'maxBufferSize' | 'perEventSampling'\n> & {\n endpoint: string;\n};\n\ntype TelemetryMetadata = Required<\n Pick<TelemetryCollectorOptions, 'clerkVersion' | 'sdk' | 'sdkVersion' | 'publishableKey' | 'secretKey'>\n> & {\n /**\n * The instance type, derived from the provided publishableKey.\n */\n instanceType: InstanceType;\n};\n\n/**\n * Structure of log data sent to the telemetry endpoint.\n */\ntype TelemetryLogData = {\n /** Service that generated the log. */\n sdk: string;\n /** The version of the SDK where the event originated from. */\n sdkv: string;\n /** The version of Clerk where the event originated from. */\n cv: string;\n /** Log level (info, warn, error, debug, etc.). */\n lvl: TelemetryLogEntry['level'];\n /** Log message. */\n msg: string;\n /** Instance ID - optional. */\n iid?: string;\n /** Timestamp when log was generated. */\n ts: string;\n /** Primary key. */\n pk: string | null;\n /** Additional payload for the log. */\n payload: Record<string, unknown> | null;\n};\n\ntype TelemetryBufferItem = { kind: 'event'; value: TelemetryEvent } | { kind: 'log'; value: TelemetryLogData };\n\n// Accepted log levels for runtime validation\nconst VALID_LOG_LEVELS = new Set<string>(['error', 'warn', 'info', 'debug', 'trace']);\n\nconst DEFAULT_CONFIG: Partial<TelemetryCollectorConfig> = {\n samplingRate: 1,\n maxBufferSize: 5,\n // Production endpoint: https://clerk-telemetry.com\n // Staging endpoint: https://staging.clerk-telemetry.com\n // Local: http://localhost:8787\n endpoint: 'https://clerk-telemetry.com',\n};\n\nexport class TelemetryCollector implements TelemetryCollectorInterface {\n #config: Required<TelemetryCollectorConfig>;\n #eventThrottler: TelemetryEventThrottler;\n #metadata: TelemetryMetadata = {} as TelemetryMetadata;\n #buffer: TelemetryBufferItem[] = [];\n #pendingFlush: number | ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: TelemetryCollectorOptions) {\n this.#config = {\n maxBufferSize: options.maxBufferSize ?? DEFAULT_CONFIG.maxBufferSize,\n samplingRate: options.samplingRate ?? DEFAULT_CONFIG.samplingRate,\n perEventSampling: options.perEventSampling ?? true,\n disabled: options.disabled ?? false,\n debug: options.debug ?? false,\n endpoint: DEFAULT_CONFIG.endpoint,\n } as Required<TelemetryCollectorConfig>;\n\n if (!options.clerkVersion && typeof window === 'undefined') {\n // N/A in a server environment\n this.#metadata.clerkVersion = '';\n } else {\n this.#metadata.clerkVersion = options.clerkVersion ?? '';\n }\n\n // We will try to grab the SDK data lazily when an event is triggered, so it should always be defined once the event is sent.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#metadata.sdk = options.sdk!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#metadata.sdkVersion = options.sdkVersion!;\n\n this.#metadata.publishableKey = options.publishableKey ?? '';\n\n const parsedKey = parsePublishableKey(options.publishableKey);\n if (parsedKey) {\n this.#metadata.instanceType = parsedKey.instanceType;\n }\n\n if (options.secretKey) {\n // Only send the first 16 characters of the secret key to to avoid sending the full key. We can still query against the partial key.\n this.#metadata.secretKey = options.secretKey.substring(0, 16);\n }\n\n // Use LocalStorage cache in browsers where it's supported, otherwise fall back to in-memory cache\n const cache = LocalStorageThrottlerCache.isSupported()\n ? new LocalStorageThrottlerCache()\n : new InMemoryThrottlerCache();\n this.#eventThrottler = new TelemetryEventThrottler(cache);\n }\n\n get isEnabled(): boolean {\n if (this.#metadata.instanceType !== 'development') {\n return false;\n }\n\n // In browser or client environments, we most likely pass the disabled option to the collector, but in environments\n // where environment variables are available we also check for `CLERK_TELEMETRY_DISABLED`.\n if (\n this.#config.disabled ||\n (typeof process !== 'undefined' && process.env && isTruthy(process.env.CLERK_TELEMETRY_DISABLED))\n ) {\n return false;\n }\n\n // navigator.webdriver is a property generally set by headless browsers that are running in an automated testing environment.\n // Data from these environments is not meaningful for us and has the potential to produce a large volume of events, so we disable\n // collection in this case. (ref: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/webdriver)\n if (typeof window !== 'undefined' && !!window?.navigator?.webdriver) {\n return false;\n }\n\n return true;\n }\n\n get isDebug(): boolean {\n return (\n this.#config.debug ||\n (typeof process !== 'undefined' && process.env && isTruthy(process.env.CLERK_TELEMETRY_DEBUG))\n );\n }\n\n record(event: TelemetryEventRaw): void {\n try {\n const preparedPayload = this.#preparePayload(event.event, event.payload);\n\n this.#logEvent(preparedPayload.event, preparedPayload);\n\n if (!this.#shouldRecord(preparedPayload, event.eventSamplingRate)) {\n return;\n }\n\n this.#buffer.push({ kind: 'event', value: preparedPayload });\n\n this.#scheduleFlush();\n } catch (error) {\n console.error('[clerk/telemetry] Error recording telemetry event', error);\n }\n }\n\n /**\n * Records a telemetry log entry if logging is enabled and not in debug mode.\n *\n * @param entry - The telemetry log entry to record.\n */\n recordLog(entry: TelemetryLogEntry): void {\n try {\n if (!this.#shouldRecordLog(entry)) {\n return;\n }\n\n const levelIsValid = typeof entry?.level === 'string' && VALID_LOG_LEVELS.has(entry.level);\n const messageIsValid = typeof entry?.message === 'string' && entry.message.trim().length > 0;\n\n let normalizedTimestamp: Date | null = null;\n const timestampInput: unknown = (entry as unknown as { timestamp?: unknown })?.timestamp;\n if (typeof timestampInput === 'number' || typeof timestampInput === 'string') {\n const candidate = new Date(timestampInput);\n if (!Number.isNaN(candidate.getTime())) {\n normalizedTimestamp = candidate;\n }\n }\n\n if (!levelIsValid || !messageIsValid || normalizedTimestamp === null) {\n if (this.isDebug && typeof console !== 'undefined') {\n console.warn('[clerk/telemetry] Dropping invalid telemetry log entry', {\n levelIsValid,\n messageIsValid,\n timestampIsValid: normalizedTimestamp !== null,\n });\n }\n return;\n }\n\n const sdkMetadata = this.#getSDKMetadata();\n\n const logData: TelemetryLogData = {\n sdk: sdkMetadata.name,\n sdkv: sdkMetadata.version,\n cv: this.#metadata.clerkVersion ?? '',\n lvl: entry.level,\n msg: entry.message,\n ts: normalizedTimestamp.toISOString(),\n pk: this.#metadata.publishableKey || null,\n payload: this.#sanitizeContext(entry.context),\n };\n\n this.#buffer.push({ kind: 'log', value: logData });\n\n this.#scheduleFlush();\n } catch (error) {\n console.error('[clerk/telemetry] Error recording telemetry log entry', error);\n }\n }\n\n #shouldRecord(preparedPayload: TelemetryEvent, eventSamplingRate?: number) {\n return this.isEnabled && !this.isDebug && this.#shouldBeSampled(preparedPayload, eventSamplingRate);\n }\n\n #shouldRecordLog(_entry: TelemetryLogEntry): boolean {\n // Always allow logs from debug logger to be sent. Debug logger itself is already gated elsewhere.\n return true;\n }\n\n #shouldBeSampled(preparedPayload: TelemetryEvent, eventSamplingRate?: number) {\n const randomSeed = Math.random();\n\n const toBeSampled =\n randomSeed <= this.#config.samplingRate &&\n (this.#config.perEventSampling === false ||\n typeof eventSamplingRate === 'undefined' ||\n randomSeed <= eventSamplingRate);\n\n if (!toBeSampled) {\n return false;\n }\n\n return !this.#eventThrottler.isEventThrottled(preparedPayload);\n }\n\n #scheduleFlush(): void {\n // On the server, we want to flush immediately as we have less guarantees about the lifecycle of the process\n if (typeof window === 'undefined') {\n this.#flush();\n return;\n }\n const isBufferFull = this.#buffer.length >= this.#config.maxBufferSize;\n if (isBufferFull) {\n // If the buffer is full, flush immediately to make sure we minimize the chance of event loss.\n // Cancel any pending flushes as we're going to flush immediately\n if (this.#pendingFlush) {\n if (typeof cancelIdleCallback !== 'undefined') {\n cancelIdleCallback(Number(this.#pendingFlush));\n } else {\n clearTimeout(Number(this.#pendingFlush));\n }\n }\n this.#flush();\n return;\n }\n\n // If we have a pending flush, do nothing\n if (this.#pendingFlush) {\n return;\n }\n\n if ('requestIdleCallback' in window) {\n this.#pendingFlush = requestIdleCallback(() => {\n this.#flush();\n this.#pendingFlush = null;\n });\n } else {\n // This is not an ideal solution, but it at least waits until the next tick\n this.#pendingFlush = setTimeout(() => {\n this.#flush();\n this.#pendingFlush = null;\n }, 0);\n }\n }\n\n #flush(): void {\n // Capture the current buffer and clear it immediately to avoid closure references\n const itemsToSend = [...this.#buffer];\n this.#buffer = [];\n\n this.#pendingFlush = null;\n\n if (itemsToSend.length === 0) {\n return;\n }\n\n const eventsToSend = itemsToSend\n .filter(item => item.kind === 'event')\n .map(item => (item as { kind: 'event'; value: TelemetryEvent }).value);\n\n const logsToSend = itemsToSend\n .filter(item => item.kind === 'log')\n .map(item => (item as { kind: 'log'; value: TelemetryLogData }).value);\n\n if (eventsToSend.length > 0) {\n const eventsUrl = new URL('/v1/event', this.#config.endpoint);\n fetch(eventsUrl, {\n headers: {\n 'Content-Type': 'application/json',\n },\n keepalive: true,\n method: 'POST',\n // TODO: We send an array here with that idea that we can eventually send multiple events.\n body: JSON.stringify({ events: eventsToSend }),\n }).catch(() => void 0);\n }\n\n if (logsToSend.length > 0) {\n const logsUrl = new URL('/v1/logs', this.#config.endpoint);\n fetch(logsUrl, {\n headers: {\n 'Content-Type': 'application/json',\n },\n keepalive: true,\n method: 'POST',\n body: JSON.stringify({ logs: logsToSend }),\n }).catch(() => void 0);\n }\n }\n\n /**\n * If running in debug mode, log the event and its payload to the console.\n */\n #logEvent(event: TelemetryEvent['event'], payload: Record<string, any>) {\n if (!this.isDebug) {\n return;\n }\n\n if (typeof console.groupCollapsed !== 'undefined') {\n console.groupCollapsed('[clerk/telemetry]', event);\n console.log(payload);\n console.groupEnd();\n } else {\n console.log('[clerk/telemetry]', event, payload);\n }\n }\n\n /**\n * If in browser, attempt to lazily grab the SDK metadata from the Clerk singleton, otherwise fallback to the initially passed in values.\n *\n * This is necessary because the sdkMetadata can be set by the host SDK after the TelemetryCollector is instantiated.\n */\n #getSDKMetadata() {\n const sdkMetadata = {\n name: this.#metadata.sdk,\n version: this.#metadata.sdkVersion,\n };\n\n if (typeof window !== 'undefined') {\n const windowWithClerk = window as WindowWithClerk;\n\n if (windowWithClerk.Clerk) {\n const windowClerk = windowWithClerk.Clerk;\n\n if (isWindowClerkWithMetadata(windowClerk) && windowClerk.constructor.sdkMetadata) {\n const { name, version } = windowClerk.constructor.sdkMetadata;\n\n if (name !== undefined) {\n sdkMetadata.name = name;\n }\n if (version !== undefined) {\n sdkMetadata.version = version;\n }\n }\n }\n }\n\n return sdkMetadata;\n }\n\n /**\n * Append relevant metadata from the Clerk singleton to the event payload.\n */\n #preparePayload(event: TelemetryEvent['event'], payload: TelemetryEvent['payload']): TelemetryEvent {\n const sdkMetadata = this.#getSDKMetadata();\n\n return {\n event,\n cv: this.#metadata.clerkVersion ?? '',\n it: this.#metadata.instanceType ?? '',\n sdk: sdkMetadata.name,\n sdkv: sdkMetadata.version,\n ...(this.#metadata.publishableKey ? { pk: this.#metadata.publishableKey } : {}),\n ...(this.#metadata.secretKey ? { sk: this.#metadata.secretKey } : {}),\n payload,\n };\n }\n\n /**\n * Best-effort sanitization of the context payload. Returns a plain object with JSON-serializable\n * values or null when the input is missing or not serializable. Arrays are not accepted.\n */\n #sanitizeContext(context: unknown): Record<string, unknown> | null {\n if (context === null || typeof context === 'undefined') {\n return null;\n }\n if (typeof context !== 'object') {\n return null;\n }\n try {\n const cleaned = JSON.parse(JSON.stringify(context));\n if (cleaned && typeof cleaned === 'object' && !Array.isArray(cleaned)) {\n return cleaned as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_COMPONENT_MOUNTED = 'COMPONENT_MOUNTED';\nconst EVENT_COMPONENT_OPENED = 'COMPONENT_OPENED';\nconst EVENT_SAMPLING_RATE = 0.1;\n\n/** Increase sampling for high-signal auth components on mount. */\nconst AUTH_COMPONENTS = new Set<string>(['SignIn', 'SignUp']);\n\n/**\n * Returns the per-event sampling rate for component-mounted telemetry events.\n * Uses a higher rate for SignIn/SignUp to improve signal quality.\n *\n * @internal\n */\nfunction getComponentMountedSamplingRate(component: string): number {\n return AUTH_COMPONENTS.has(component) ? 1 : EVENT_SAMPLING_RATE;\n}\n\ntype ComponentMountedBase = {\n component: string;\n};\n\ntype EventPrebuiltComponent = ComponentMountedBase & {\n appearanceProp: boolean;\n elements: boolean;\n variables: boolean;\n theme: boolean;\n};\n\ntype EventComponentMounted = ComponentMountedBase & TelemetryEventRaw['payload'];\n\n/**\n * Factory for prebuilt component telemetry events.\n *\n * @internal\n */\nfunction createPrebuiltComponentEvent(event: typeof EVENT_COMPONENT_MOUNTED | typeof EVENT_COMPONENT_OPENED) {\n return function (\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n ): TelemetryEventRaw<EventPrebuiltComponent> {\n return {\n event,\n eventSamplingRate:\n event === EVENT_COMPONENT_MOUNTED ? getComponentMountedSamplingRate(component) : EVENT_SAMPLING_RATE,\n payload: {\n component,\n appearanceProp: Boolean(props?.appearance),\n theme: Boolean(props?.appearance?.theme),\n elements: Boolean(props?.appearance?.elements),\n variables: Boolean(props?.appearance?.variables),\n ...additionalPayload,\n },\n };\n };\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a prebuilt (AIO) component is mounted.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Will be filtered to a known list of props.\n * @param additionalPayload - Additional data to send with the event.\n * @example\n * telemetry.record(eventPrebuiltComponentMounted('SignUp', props));\n */\nexport function eventPrebuiltComponentMounted(\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n): TelemetryEventRaw<EventPrebuiltComponent> {\n return createPrebuiltComponentEvent(EVENT_COMPONENT_MOUNTED)(component, props, additionalPayload);\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a prebuilt (AIO) component is opened as a modal.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Will be filtered to a known list of props.\n * @param additionalPayload - Additional data to send with the event.\n * @example\n * telemetry.record(eventPrebuiltComponentOpened('GoogleOneTap', props));\n */\nexport function eventPrebuiltComponentOpened(\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n): TelemetryEventRaw<EventPrebuiltComponent> {\n return createPrebuiltComponentEvent(EVENT_COMPONENT_OPENED)(component, props, additionalPayload);\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a component is mounted. Use `eventPrebuiltComponentMounted` for prebuilt components.\n *\n * **Caution:** Filter the `props` you pass to this function to avoid sending too much data.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Ideally you only pass a handful of props here.\n * @example\n * telemetry.record(eventComponentMounted('SignUp', props));\n */\nexport function eventComponentMounted(\n component: string,\n props: TelemetryEventRaw['payload'] = {},\n): TelemetryEventRaw<EventComponentMounted> {\n return {\n event: EVENT_COMPONENT_MOUNTED,\n eventSamplingRate: getComponentMountedSamplingRate(component),\n payload: {\n component,\n ...props,\n },\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_METHOD_CALLED = 'METHOD_CALLED';\nconst EVENT_SAMPLING_RATE = 0.1;\n\ntype EventMethodCalled = {\n method: string;\n} & Record<string, string | number | boolean>;\n\n/**\n * Fired when a helper method is called from a Clerk SDK.\n */\nexport function eventMethodCalled(\n method: string,\n payload?: Record<string, unknown>,\n): TelemetryEventRaw<EventMethodCalled> {\n return {\n event: EVENT_METHOD_CALLED,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload: {\n method,\n ...payload,\n },\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_FRAMEWORK_METADATA = 'FRAMEWORK_METADATA';\nconst EVENT_SAMPLING_RATE = 0.1;\n\ntype EventFrameworkMetadata = Record<string, string | number | boolean>;\n\n/**\n * Fired when a helper method is called from a Clerk SDK.\n */\nexport function eventFrameworkMetadata(payload: EventFrameworkMetadata): TelemetryEventRaw<EventFrameworkMetadata> {\n return {\n event: EVENT_FRAMEWORK_METADATA,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload,\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nexport const EVENT_THEME_USAGE = 'THEME_USAGE';\nexport const EVENT_SAMPLING_RATE = 1;\n\ntype EventThemeUsage = {\n /**\n * The name of the theme being used (e.g., \"shadcn\", \"neobrutalism\", etc.).\n */\n themeName?: string;\n};\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for tracking theme usage in ClerkProvider.\n *\n * @param appearance - The appearance prop from ClerkProvider.\n * @example\n * telemetry.record(eventThemeUsage(appearance));\n */\nexport function eventThemeUsage(appearance?: any): TelemetryEventRaw<EventThemeUsage> {\n const payload = analyzeThemeUsage(appearance);\n\n return {\n event: EVENT_THEME_USAGE,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload,\n };\n}\n\n/**\n * Analyzes the appearance prop to extract theme usage information for telemetry.\n *\n * @internal\n */\nfunction analyzeThemeUsage(appearance?: any): EventThemeUsage {\n if (!appearance || typeof appearance !== 'object') {\n return {};\n }\n\n const themeProperty = appearance.theme;\n\n if (!themeProperty) {\n return {};\n }\n\n let themeName: string | undefined;\n\n if (Array.isArray(themeProperty)) {\n // Look for the first identifiable theme name in the array\n for (const theme of themeProperty) {\n const name = extractThemeName(theme);\n if (name) {\n themeName = name;\n break;\n }\n }\n } else {\n themeName = extractThemeName(themeProperty);\n }\n\n return { themeName };\n}\n\n/**\n * Extracts the theme name from a theme object.\n *\n * @internal\n */\nfunction extractThemeName(theme: any): string | undefined {\n if (typeof theme === 'string') {\n return theme;\n }\n\n if (typeof theme === 'object' && theme !== null) {\n // Check for explicit theme name\n if ('name' in theme && typeof theme.name === 'string') {\n return theme.name;\n }\n }\n\n return undefined;\n}\n"],"mappings":"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"}
@@ -379,7 +379,7 @@ function createPrebuiltComponentEvent(event) {
379
379
  payload: {
380
380
  component,
381
381
  appearanceProp: Boolean(props?.appearance),
382
- baseTheme: Boolean(props?.appearance?.baseTheme),
382
+ theme: Boolean(props?.appearance?.theme),
383
383
  elements: Boolean(props?.appearance?.elements),
384
384
  variables: Boolean(props?.appearance?.variables),
385
385
  ...additionalPayload
@@ -490,7 +490,7 @@ function eventThemeUsage(appearance) {
490
490
  */
491
491
  function analyzeThemeUsage(appearance) {
492
492
  if (!appearance || typeof appearance !== "object") return {};
493
- const themeProperty = appearance.theme || appearance.baseTheme;
493
+ const themeProperty = appearance.theme;
494
494
  if (!themeProperty) return {};
495
495
  let themeName;
496
496
  if (Array.isArray(themeProperty)) for (const theme of themeProperty) {
@@ -517,4 +517,4 @@ function extractThemeName(theme) {
517
517
 
518
518
  //#endregion
519
519
  export { eventMethodCalled as a, eventPrebuiltComponentOpened as c, eventFrameworkMetadata as i, TelemetryCollector as l, EVENT_THEME_USAGE as n, eventComponentMounted as o, eventThemeUsage as r, eventPrebuiltComponentMounted as s, EVENT_SAMPLING_RATE as t };
520
- //# sourceMappingURL=telemetry-B4xKE_qs.mjs.map
520
+ //# sourceMappingURL=telemetry-DnVD78JJ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-B4xKE_qs.mjs","names":["#cache","#generateKey","#cacheTtl","sanitizedEvent: Omit<TelemetryEvent, 'sk' | 'pk' | 'payload'> & TelemetryEvent['payload']","#getCache","#storageKey","err: unknown","#maxSize","DEFAULT_CONFIG: Partial<TelemetryCollectorConfig>","#config","#metadata","#eventThrottler","#preparePayload","#logEvent","#shouldRecord","#buffer","#scheduleFlush","#shouldRecordLog","normalizedTimestamp: Date | null","timestampInput: unknown","#getSDKMetadata","logData: TelemetryLogData","#sanitizeContext","#shouldBeSampled","#flush","#pendingFlush","EVENT_SAMPLING_RATE","EVENT_SAMPLING_RATE","EVENT_SAMPLING_RATE","themeName: string | undefined"],"sources":["../../src/telemetry/throttler.ts","../../src/telemetry/collector.ts","../../src/telemetry/events/component-mounted.ts","../../src/telemetry/events/method-called.ts","../../src/telemetry/events/framework-metadata.ts","../../src/telemetry/events/theme-usage.ts"],"sourcesContent":["import type { TelemetryEvent } from '../types';\n\ntype TtlInMilliseconds = number;\n\nconst DEFAULT_CACHE_TTL_MS = 86400000; // 24 hours\n\n/**\n * Interface for cache storage used by the telemetry throttler.\n * Implementations can use localStorage, in-memory storage, or any other storage mechanism.\n */\nexport interface ThrottlerCache {\n getItem(key: string): TtlInMilliseconds | undefined;\n setItem(key: string, value: TtlInMilliseconds): void;\n removeItem(key: string): void;\n}\n\n/**\n * Manages throttling for telemetry events using a configurable cache implementation\n * to mitigate event flooding in frequently executed code paths.\n */\nexport class TelemetryEventThrottler {\n #cache: ThrottlerCache;\n #cacheTtl = DEFAULT_CACHE_TTL_MS;\n\n constructor(cache: ThrottlerCache) {\n this.#cache = cache;\n }\n\n isEventThrottled(payload: TelemetryEvent): boolean {\n const now = Date.now();\n const key = this.#generateKey(payload);\n const entry = this.#cache.getItem(key);\n\n if (!entry) {\n this.#cache.setItem(key, now);\n return false;\n }\n\n const shouldInvalidate = now - entry > this.#cacheTtl;\n if (shouldInvalidate) {\n this.#cache.setItem(key, now);\n return false;\n }\n\n return true;\n }\n\n /**\n * Generates a consistent unique key for telemetry events by sorting payload properties.\n * This ensures that payloads with identical content in different orders produce the same key.\n */\n #generateKey(event: TelemetryEvent): string {\n const { sk: _sk, pk: _pk, payload, ...rest } = event;\n\n const sanitizedEvent: Omit<TelemetryEvent, 'sk' | 'pk' | 'payload'> & TelemetryEvent['payload'] = {\n ...payload,\n ...rest,\n };\n\n return JSON.stringify(\n Object.keys({\n ...payload,\n ...rest,\n })\n .sort()\n .map(key => sanitizedEvent[key]),\n );\n }\n}\n\n/**\n * LocalStorage-based cache implementation for browser environments.\n */\nexport class LocalStorageThrottlerCache implements ThrottlerCache {\n #storageKey = 'clerk_telemetry_throttler';\n\n getItem(key: string): TtlInMilliseconds | undefined {\n return this.#getCache()[key];\n }\n\n setItem(key: string, value: TtlInMilliseconds): void {\n try {\n const cache = this.#getCache();\n cache[key] = value;\n localStorage.setItem(this.#storageKey, JSON.stringify(cache));\n } catch (err: unknown) {\n const isQuotaExceededError =\n err instanceof DOMException &&\n // Check error names for different browsers\n (err.name === 'QuotaExceededError' || err.name === 'NS_ERROR_DOM_QUOTA_REACHED');\n\n if (isQuotaExceededError && localStorage.length > 0) {\n // Clear our cache if quota exceeded\n localStorage.removeItem(this.#storageKey);\n }\n }\n }\n\n removeItem(key: string): void {\n try {\n const cache = this.#getCache();\n delete cache[key];\n localStorage.setItem(this.#storageKey, JSON.stringify(cache));\n } catch {\n // Silently fail if we can't remove\n }\n }\n\n #getCache(): Record<string, TtlInMilliseconds> {\n try {\n const cacheString = localStorage.getItem(this.#storageKey);\n if (!cacheString) {\n return {};\n }\n return JSON.parse(cacheString);\n } catch {\n return {};\n }\n }\n\n static isSupported(): boolean {\n return typeof window !== 'undefined' && !!window.localStorage;\n }\n}\n\n/**\n * In-memory cache implementation for non-browser environments (e.g., React Native).\n */\nexport class InMemoryThrottlerCache implements ThrottlerCache {\n #cache: Map<string, TtlInMilliseconds> = new Map();\n #maxSize = 10000; // Defensive limit to prevent memory issues\n\n getItem(key: string): TtlInMilliseconds | undefined {\n // Defensive: clear cache if it gets too large\n if (this.#cache.size > this.#maxSize) {\n this.#cache.clear();\n return undefined;\n }\n\n return this.#cache.get(key);\n }\n\n setItem(key: string, value: TtlInMilliseconds): void {\n this.#cache.set(key, value);\n }\n\n removeItem(key: string): void {\n this.#cache.delete(key);\n }\n}\n","/**\n * The `TelemetryCollector` class handles collection of telemetry events from Clerk SDKs. Telemetry is opt-out and can be disabled by setting a CLERK_TELEMETRY_DISABLED environment variable.\n * The `ClerkProvider` also accepts a `telemetry` prop that will be passed to the collector during initialization:.\n *\n * ```jsx\n * <ClerkProvider telemetry={false}>\n * ...\n * </ClerkProvider>\n * ```\n *\n * For more information, please see the telemetry documentation page: https://clerk.com/docs/telemetry.\n */\nimport { parsePublishableKey } from '../keys';\nimport type {\n InstanceType,\n SDKMetadata,\n TelemetryCollector as TelemetryCollectorInterface,\n TelemetryEvent,\n TelemetryEventRaw,\n TelemetryLogEntry,\n} from '../types';\nimport { isTruthy } from '../underscore';\nimport { InMemoryThrottlerCache, LocalStorageThrottlerCache, TelemetryEventThrottler } from './throttler';\nimport type { TelemetryCollectorOptions } from './types';\n\n/**\n * Local interface for window.Clerk to avoid global type pollution.\n * This is only used within this module and doesn't affect other packages.\n */\ninterface WindowWithClerk extends Window {\n Clerk?: {\n constructor?: {\n sdkMetadata?: SDKMetadata;\n };\n };\n}\n\n/**\n * Type guard to check if window.Clerk exists and has the expected structure.\n */\nfunction isWindowClerkWithMetadata(clerk: unknown): clerk is { constructor: { sdkMetadata?: SDKMetadata } } {\n return (\n typeof clerk === 'object' && clerk !== null && 'constructor' in clerk && typeof clerk.constructor === 'function'\n );\n}\n\ntype TelemetryCollectorConfig = Pick<\n TelemetryCollectorOptions,\n 'samplingRate' | 'disabled' | 'debug' | 'maxBufferSize' | 'perEventSampling'\n> & {\n endpoint: string;\n};\n\ntype TelemetryMetadata = Required<\n Pick<TelemetryCollectorOptions, 'clerkVersion' | 'sdk' | 'sdkVersion' | 'publishableKey' | 'secretKey'>\n> & {\n /**\n * The instance type, derived from the provided publishableKey.\n */\n instanceType: InstanceType;\n};\n\n/**\n * Structure of log data sent to the telemetry endpoint.\n */\ntype TelemetryLogData = {\n /** Service that generated the log. */\n sdk: string;\n /** The version of the SDK where the event originated from. */\n sdkv: string;\n /** The version of Clerk where the event originated from. */\n cv: string;\n /** Log level (info, warn, error, debug, etc.). */\n lvl: TelemetryLogEntry['level'];\n /** Log message. */\n msg: string;\n /** Instance ID - optional. */\n iid?: string;\n /** Timestamp when log was generated. */\n ts: string;\n /** Primary key. */\n pk: string | null;\n /** Additional payload for the log. */\n payload: Record<string, unknown> | null;\n};\n\ntype TelemetryBufferItem = { kind: 'event'; value: TelemetryEvent } | { kind: 'log'; value: TelemetryLogData };\n\n// Accepted log levels for runtime validation\nconst VALID_LOG_LEVELS = new Set<string>(['error', 'warn', 'info', 'debug', 'trace']);\n\nconst DEFAULT_CONFIG: Partial<TelemetryCollectorConfig> = {\n samplingRate: 1,\n maxBufferSize: 5,\n // Production endpoint: https://clerk-telemetry.com\n // Staging endpoint: https://staging.clerk-telemetry.com\n // Local: http://localhost:8787\n endpoint: 'https://clerk-telemetry.com',\n};\n\nexport class TelemetryCollector implements TelemetryCollectorInterface {\n #config: Required<TelemetryCollectorConfig>;\n #eventThrottler: TelemetryEventThrottler;\n #metadata: TelemetryMetadata = {} as TelemetryMetadata;\n #buffer: TelemetryBufferItem[] = [];\n #pendingFlush: number | ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: TelemetryCollectorOptions) {\n this.#config = {\n maxBufferSize: options.maxBufferSize ?? DEFAULT_CONFIG.maxBufferSize,\n samplingRate: options.samplingRate ?? DEFAULT_CONFIG.samplingRate,\n perEventSampling: options.perEventSampling ?? true,\n disabled: options.disabled ?? false,\n debug: options.debug ?? false,\n endpoint: DEFAULT_CONFIG.endpoint,\n } as Required<TelemetryCollectorConfig>;\n\n if (!options.clerkVersion && typeof window === 'undefined') {\n // N/A in a server environment\n this.#metadata.clerkVersion = '';\n } else {\n this.#metadata.clerkVersion = options.clerkVersion ?? '';\n }\n\n // We will try to grab the SDK data lazily when an event is triggered, so it should always be defined once the event is sent.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#metadata.sdk = options.sdk!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#metadata.sdkVersion = options.sdkVersion!;\n\n this.#metadata.publishableKey = options.publishableKey ?? '';\n\n const parsedKey = parsePublishableKey(options.publishableKey);\n if (parsedKey) {\n this.#metadata.instanceType = parsedKey.instanceType;\n }\n\n if (options.secretKey) {\n // Only send the first 16 characters of the secret key to to avoid sending the full key. We can still query against the partial key.\n this.#metadata.secretKey = options.secretKey.substring(0, 16);\n }\n\n // Use LocalStorage cache in browsers where it's supported, otherwise fall back to in-memory cache\n const cache = LocalStorageThrottlerCache.isSupported()\n ? new LocalStorageThrottlerCache()\n : new InMemoryThrottlerCache();\n this.#eventThrottler = new TelemetryEventThrottler(cache);\n }\n\n get isEnabled(): boolean {\n if (this.#metadata.instanceType !== 'development') {\n return false;\n }\n\n // In browser or client environments, we most likely pass the disabled option to the collector, but in environments\n // where environment variables are available we also check for `CLERK_TELEMETRY_DISABLED`.\n if (\n this.#config.disabled ||\n (typeof process !== 'undefined' && process.env && isTruthy(process.env.CLERK_TELEMETRY_DISABLED))\n ) {\n return false;\n }\n\n // navigator.webdriver is a property generally set by headless browsers that are running in an automated testing environment.\n // Data from these environments is not meaningful for us and has the potential to produce a large volume of events, so we disable\n // collection in this case. (ref: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/webdriver)\n if (typeof window !== 'undefined' && !!window?.navigator?.webdriver) {\n return false;\n }\n\n return true;\n }\n\n get isDebug(): boolean {\n return (\n this.#config.debug ||\n (typeof process !== 'undefined' && process.env && isTruthy(process.env.CLERK_TELEMETRY_DEBUG))\n );\n }\n\n record(event: TelemetryEventRaw): void {\n try {\n const preparedPayload = this.#preparePayload(event.event, event.payload);\n\n this.#logEvent(preparedPayload.event, preparedPayload);\n\n if (!this.#shouldRecord(preparedPayload, event.eventSamplingRate)) {\n return;\n }\n\n this.#buffer.push({ kind: 'event', value: preparedPayload });\n\n this.#scheduleFlush();\n } catch (error) {\n console.error('[clerk/telemetry] Error recording telemetry event', error);\n }\n }\n\n /**\n * Records a telemetry log entry if logging is enabled and not in debug mode.\n *\n * @param entry - The telemetry log entry to record.\n */\n recordLog(entry: TelemetryLogEntry): void {\n try {\n if (!this.#shouldRecordLog(entry)) {\n return;\n }\n\n const levelIsValid = typeof entry?.level === 'string' && VALID_LOG_LEVELS.has(entry.level);\n const messageIsValid = typeof entry?.message === 'string' && entry.message.trim().length > 0;\n\n let normalizedTimestamp: Date | null = null;\n const timestampInput: unknown = (entry as unknown as { timestamp?: unknown })?.timestamp;\n if (typeof timestampInput === 'number' || typeof timestampInput === 'string') {\n const candidate = new Date(timestampInput);\n if (!Number.isNaN(candidate.getTime())) {\n normalizedTimestamp = candidate;\n }\n }\n\n if (!levelIsValid || !messageIsValid || normalizedTimestamp === null) {\n if (this.isDebug && typeof console !== 'undefined') {\n console.warn('[clerk/telemetry] Dropping invalid telemetry log entry', {\n levelIsValid,\n messageIsValid,\n timestampIsValid: normalizedTimestamp !== null,\n });\n }\n return;\n }\n\n const sdkMetadata = this.#getSDKMetadata();\n\n const logData: TelemetryLogData = {\n sdk: sdkMetadata.name,\n sdkv: sdkMetadata.version,\n cv: this.#metadata.clerkVersion ?? '',\n lvl: entry.level,\n msg: entry.message,\n ts: normalizedTimestamp.toISOString(),\n pk: this.#metadata.publishableKey || null,\n payload: this.#sanitizeContext(entry.context),\n };\n\n this.#buffer.push({ kind: 'log', value: logData });\n\n this.#scheduleFlush();\n } catch (error) {\n console.error('[clerk/telemetry] Error recording telemetry log entry', error);\n }\n }\n\n #shouldRecord(preparedPayload: TelemetryEvent, eventSamplingRate?: number) {\n return this.isEnabled && !this.isDebug && this.#shouldBeSampled(preparedPayload, eventSamplingRate);\n }\n\n #shouldRecordLog(_entry: TelemetryLogEntry): boolean {\n // Always allow logs from debug logger to be sent. Debug logger itself is already gated elsewhere.\n return true;\n }\n\n #shouldBeSampled(preparedPayload: TelemetryEvent, eventSamplingRate?: number) {\n const randomSeed = Math.random();\n\n const toBeSampled =\n randomSeed <= this.#config.samplingRate &&\n (this.#config.perEventSampling === false ||\n typeof eventSamplingRate === 'undefined' ||\n randomSeed <= eventSamplingRate);\n\n if (!toBeSampled) {\n return false;\n }\n\n return !this.#eventThrottler.isEventThrottled(preparedPayload);\n }\n\n #scheduleFlush(): void {\n // On the server, we want to flush immediately as we have less guarantees about the lifecycle of the process\n if (typeof window === 'undefined') {\n this.#flush();\n return;\n }\n const isBufferFull = this.#buffer.length >= this.#config.maxBufferSize;\n if (isBufferFull) {\n // If the buffer is full, flush immediately to make sure we minimize the chance of event loss.\n // Cancel any pending flushes as we're going to flush immediately\n if (this.#pendingFlush) {\n if (typeof cancelIdleCallback !== 'undefined') {\n cancelIdleCallback(Number(this.#pendingFlush));\n } else {\n clearTimeout(Number(this.#pendingFlush));\n }\n }\n this.#flush();\n return;\n }\n\n // If we have a pending flush, do nothing\n if (this.#pendingFlush) {\n return;\n }\n\n if ('requestIdleCallback' in window) {\n this.#pendingFlush = requestIdleCallback(() => {\n this.#flush();\n this.#pendingFlush = null;\n });\n } else {\n // This is not an ideal solution, but it at least waits until the next tick\n this.#pendingFlush = setTimeout(() => {\n this.#flush();\n this.#pendingFlush = null;\n }, 0);\n }\n }\n\n #flush(): void {\n // Capture the current buffer and clear it immediately to avoid closure references\n const itemsToSend = [...this.#buffer];\n this.#buffer = [];\n\n this.#pendingFlush = null;\n\n if (itemsToSend.length === 0) {\n return;\n }\n\n const eventsToSend = itemsToSend\n .filter(item => item.kind === 'event')\n .map(item => (item as { kind: 'event'; value: TelemetryEvent }).value);\n\n const logsToSend = itemsToSend\n .filter(item => item.kind === 'log')\n .map(item => (item as { kind: 'log'; value: TelemetryLogData }).value);\n\n if (eventsToSend.length > 0) {\n const eventsUrl = new URL('/v1/event', this.#config.endpoint);\n fetch(eventsUrl, {\n headers: {\n 'Content-Type': 'application/json',\n },\n keepalive: true,\n method: 'POST',\n // TODO: We send an array here with that idea that we can eventually send multiple events.\n body: JSON.stringify({ events: eventsToSend }),\n }).catch(() => void 0);\n }\n\n if (logsToSend.length > 0) {\n const logsUrl = new URL('/v1/logs', this.#config.endpoint);\n fetch(logsUrl, {\n headers: {\n 'Content-Type': 'application/json',\n },\n keepalive: true,\n method: 'POST',\n body: JSON.stringify({ logs: logsToSend }),\n }).catch(() => void 0);\n }\n }\n\n /**\n * If running in debug mode, log the event and its payload to the console.\n */\n #logEvent(event: TelemetryEvent['event'], payload: Record<string, any>) {\n if (!this.isDebug) {\n return;\n }\n\n if (typeof console.groupCollapsed !== 'undefined') {\n console.groupCollapsed('[clerk/telemetry]', event);\n console.log(payload);\n console.groupEnd();\n } else {\n console.log('[clerk/telemetry]', event, payload);\n }\n }\n\n /**\n * If in browser, attempt to lazily grab the SDK metadata from the Clerk singleton, otherwise fallback to the initially passed in values.\n *\n * This is necessary because the sdkMetadata can be set by the host SDK after the TelemetryCollector is instantiated.\n */\n #getSDKMetadata() {\n const sdkMetadata = {\n name: this.#metadata.sdk,\n version: this.#metadata.sdkVersion,\n };\n\n if (typeof window !== 'undefined') {\n const windowWithClerk = window as WindowWithClerk;\n\n if (windowWithClerk.Clerk) {\n const windowClerk = windowWithClerk.Clerk;\n\n if (isWindowClerkWithMetadata(windowClerk) && windowClerk.constructor.sdkMetadata) {\n const { name, version } = windowClerk.constructor.sdkMetadata;\n\n if (name !== undefined) {\n sdkMetadata.name = name;\n }\n if (version !== undefined) {\n sdkMetadata.version = version;\n }\n }\n }\n }\n\n return sdkMetadata;\n }\n\n /**\n * Append relevant metadata from the Clerk singleton to the event payload.\n */\n #preparePayload(event: TelemetryEvent['event'], payload: TelemetryEvent['payload']): TelemetryEvent {\n const sdkMetadata = this.#getSDKMetadata();\n\n return {\n event,\n cv: this.#metadata.clerkVersion ?? '',\n it: this.#metadata.instanceType ?? '',\n sdk: sdkMetadata.name,\n sdkv: sdkMetadata.version,\n ...(this.#metadata.publishableKey ? { pk: this.#metadata.publishableKey } : {}),\n ...(this.#metadata.secretKey ? { sk: this.#metadata.secretKey } : {}),\n payload,\n };\n }\n\n /**\n * Best-effort sanitization of the context payload. Returns a plain object with JSON-serializable\n * values or null when the input is missing or not serializable. Arrays are not accepted.\n */\n #sanitizeContext(context: unknown): Record<string, unknown> | null {\n if (context === null || typeof context === 'undefined') {\n return null;\n }\n if (typeof context !== 'object') {\n return null;\n }\n try {\n const cleaned = JSON.parse(JSON.stringify(context));\n if (cleaned && typeof cleaned === 'object' && !Array.isArray(cleaned)) {\n return cleaned as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_COMPONENT_MOUNTED = 'COMPONENT_MOUNTED';\nconst EVENT_COMPONENT_OPENED = 'COMPONENT_OPENED';\nconst EVENT_SAMPLING_RATE = 0.1;\n\n/** Increase sampling for high-signal auth components on mount. */\nconst AUTH_COMPONENTS = new Set<string>(['SignIn', 'SignUp']);\n\n/**\n * Returns the per-event sampling rate for component-mounted telemetry events.\n * Uses a higher rate for SignIn/SignUp to improve signal quality.\n *\n * @internal\n */\nfunction getComponentMountedSamplingRate(component: string): number {\n return AUTH_COMPONENTS.has(component) ? 1 : EVENT_SAMPLING_RATE;\n}\n\ntype ComponentMountedBase = {\n component: string;\n};\n\ntype EventPrebuiltComponent = ComponentMountedBase & {\n appearanceProp: boolean;\n elements: boolean;\n variables: boolean;\n baseTheme: boolean;\n};\n\ntype EventComponentMounted = ComponentMountedBase & TelemetryEventRaw['payload'];\n\n/**\n * Factory for prebuilt component telemetry events.\n *\n * @internal\n */\nfunction createPrebuiltComponentEvent(event: typeof EVENT_COMPONENT_MOUNTED | typeof EVENT_COMPONENT_OPENED) {\n return function (\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n ): TelemetryEventRaw<EventPrebuiltComponent> {\n return {\n event,\n eventSamplingRate:\n event === EVENT_COMPONENT_MOUNTED ? getComponentMountedSamplingRate(component) : EVENT_SAMPLING_RATE,\n payload: {\n component,\n appearanceProp: Boolean(props?.appearance),\n baseTheme: Boolean(props?.appearance?.baseTheme),\n elements: Boolean(props?.appearance?.elements),\n variables: Boolean(props?.appearance?.variables),\n ...additionalPayload,\n },\n };\n };\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a prebuilt (AIO) component is mounted.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Will be filtered to a known list of props.\n * @param additionalPayload - Additional data to send with the event.\n * @example\n * telemetry.record(eventPrebuiltComponentMounted('SignUp', props));\n */\nexport function eventPrebuiltComponentMounted(\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n): TelemetryEventRaw<EventPrebuiltComponent> {\n return createPrebuiltComponentEvent(EVENT_COMPONENT_MOUNTED)(component, props, additionalPayload);\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a prebuilt (AIO) component is opened as a modal.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Will be filtered to a known list of props.\n * @param additionalPayload - Additional data to send with the event.\n * @example\n * telemetry.record(eventPrebuiltComponentOpened('GoogleOneTap', props));\n */\nexport function eventPrebuiltComponentOpened(\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n): TelemetryEventRaw<EventPrebuiltComponent> {\n return createPrebuiltComponentEvent(EVENT_COMPONENT_OPENED)(component, props, additionalPayload);\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a component is mounted. Use `eventPrebuiltComponentMounted` for prebuilt components.\n *\n * **Caution:** Filter the `props` you pass to this function to avoid sending too much data.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Ideally you only pass a handful of props here.\n * @example\n * telemetry.record(eventComponentMounted('SignUp', props));\n */\nexport function eventComponentMounted(\n component: string,\n props: TelemetryEventRaw['payload'] = {},\n): TelemetryEventRaw<EventComponentMounted> {\n return {\n event: EVENT_COMPONENT_MOUNTED,\n eventSamplingRate: getComponentMountedSamplingRate(component),\n payload: {\n component,\n ...props,\n },\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_METHOD_CALLED = 'METHOD_CALLED';\nconst EVENT_SAMPLING_RATE = 0.1;\n\ntype EventMethodCalled = {\n method: string;\n} & Record<string, string | number | boolean>;\n\n/**\n * Fired when a helper method is called from a Clerk SDK.\n */\nexport function eventMethodCalled(\n method: string,\n payload?: Record<string, unknown>,\n): TelemetryEventRaw<EventMethodCalled> {\n return {\n event: EVENT_METHOD_CALLED,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload: {\n method,\n ...payload,\n },\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_FRAMEWORK_METADATA = 'FRAMEWORK_METADATA';\nconst EVENT_SAMPLING_RATE = 0.1;\n\ntype EventFrameworkMetadata = Record<string, string | number | boolean>;\n\n/**\n * Fired when a helper method is called from a Clerk SDK.\n */\nexport function eventFrameworkMetadata(payload: EventFrameworkMetadata): TelemetryEventRaw<EventFrameworkMetadata> {\n return {\n event: EVENT_FRAMEWORK_METADATA,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload,\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nexport const EVENT_THEME_USAGE = 'THEME_USAGE';\nexport const EVENT_SAMPLING_RATE = 1;\n\ntype EventThemeUsage = {\n /**\n * The name of the theme being used (e.g., \"shadcn\", \"neobrutalism\", etc.).\n */\n themeName?: string;\n};\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for tracking theme usage in ClerkProvider.\n *\n * @param appearance - The appearance prop from ClerkProvider.\n * @example\n * telemetry.record(eventThemeUsage(appearance));\n */\nexport function eventThemeUsage(appearance?: any): TelemetryEventRaw<EventThemeUsage> {\n const payload = analyzeThemeUsage(appearance);\n\n return {\n event: EVENT_THEME_USAGE,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload,\n };\n}\n\n/**\n * Analyzes the appearance prop to extract theme usage information for telemetry.\n *\n * @internal\n */\nfunction analyzeThemeUsage(appearance?: any): EventThemeUsage {\n if (!appearance || typeof appearance !== 'object') {\n return {};\n }\n\n // Prioritize the new theme property over deprecated baseTheme\n const themeProperty = appearance.theme || appearance.baseTheme;\n\n if (!themeProperty) {\n return {};\n }\n\n let themeName: string | undefined;\n\n if (Array.isArray(themeProperty)) {\n // Look for the first identifiable theme name in the array\n for (const theme of themeProperty) {\n const name = extractThemeName(theme);\n if (name) {\n themeName = name;\n break;\n }\n }\n } else {\n themeName = extractThemeName(themeProperty);\n }\n\n return { themeName };\n}\n\n/**\n * Extracts the theme name from a theme object.\n *\n * @internal\n */\nfunction extractThemeName(theme: any): string | undefined {\n if (typeof theme === 'string') {\n return theme;\n }\n\n if (typeof theme === 'object' && theme !== null) {\n // Check for explicit theme name\n if ('name' in theme && typeof theme.name === 'string') {\n return theme.name;\n }\n }\n\n return undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"telemetry-DnVD78JJ.mjs","names":["#cache","#generateKey","#cacheTtl","sanitizedEvent: Omit<TelemetryEvent, 'sk' | 'pk' | 'payload'> & TelemetryEvent['payload']","#getCache","#storageKey","err: unknown","#maxSize","DEFAULT_CONFIG: Partial<TelemetryCollectorConfig>","#config","#metadata","#eventThrottler","#preparePayload","#logEvent","#shouldRecord","#buffer","#scheduleFlush","#shouldRecordLog","normalizedTimestamp: Date | null","timestampInput: unknown","#getSDKMetadata","logData: TelemetryLogData","#sanitizeContext","#shouldBeSampled","#flush","#pendingFlush","EVENT_SAMPLING_RATE","EVENT_SAMPLING_RATE","EVENT_SAMPLING_RATE","themeName: string | undefined"],"sources":["../../src/telemetry/throttler.ts","../../src/telemetry/collector.ts","../../src/telemetry/events/component-mounted.ts","../../src/telemetry/events/method-called.ts","../../src/telemetry/events/framework-metadata.ts","../../src/telemetry/events/theme-usage.ts"],"sourcesContent":["import type { TelemetryEvent } from '../types';\n\ntype TtlInMilliseconds = number;\n\nconst DEFAULT_CACHE_TTL_MS = 86400000; // 24 hours\n\n/**\n * Interface for cache storage used by the telemetry throttler.\n * Implementations can use localStorage, in-memory storage, or any other storage mechanism.\n */\nexport interface ThrottlerCache {\n getItem(key: string): TtlInMilliseconds | undefined;\n setItem(key: string, value: TtlInMilliseconds): void;\n removeItem(key: string): void;\n}\n\n/**\n * Manages throttling for telemetry events using a configurable cache implementation\n * to mitigate event flooding in frequently executed code paths.\n */\nexport class TelemetryEventThrottler {\n #cache: ThrottlerCache;\n #cacheTtl = DEFAULT_CACHE_TTL_MS;\n\n constructor(cache: ThrottlerCache) {\n this.#cache = cache;\n }\n\n isEventThrottled(payload: TelemetryEvent): boolean {\n const now = Date.now();\n const key = this.#generateKey(payload);\n const entry = this.#cache.getItem(key);\n\n if (!entry) {\n this.#cache.setItem(key, now);\n return false;\n }\n\n const shouldInvalidate = now - entry > this.#cacheTtl;\n if (shouldInvalidate) {\n this.#cache.setItem(key, now);\n return false;\n }\n\n return true;\n }\n\n /**\n * Generates a consistent unique key for telemetry events by sorting payload properties.\n * This ensures that payloads with identical content in different orders produce the same key.\n */\n #generateKey(event: TelemetryEvent): string {\n const { sk: _sk, pk: _pk, payload, ...rest } = event;\n\n const sanitizedEvent: Omit<TelemetryEvent, 'sk' | 'pk' | 'payload'> & TelemetryEvent['payload'] = {\n ...payload,\n ...rest,\n };\n\n return JSON.stringify(\n Object.keys({\n ...payload,\n ...rest,\n })\n .sort()\n .map(key => sanitizedEvent[key]),\n );\n }\n}\n\n/**\n * LocalStorage-based cache implementation for browser environments.\n */\nexport class LocalStorageThrottlerCache implements ThrottlerCache {\n #storageKey = 'clerk_telemetry_throttler';\n\n getItem(key: string): TtlInMilliseconds | undefined {\n return this.#getCache()[key];\n }\n\n setItem(key: string, value: TtlInMilliseconds): void {\n try {\n const cache = this.#getCache();\n cache[key] = value;\n localStorage.setItem(this.#storageKey, JSON.stringify(cache));\n } catch (err: unknown) {\n const isQuotaExceededError =\n err instanceof DOMException &&\n // Check error names for different browsers\n (err.name === 'QuotaExceededError' || err.name === 'NS_ERROR_DOM_QUOTA_REACHED');\n\n if (isQuotaExceededError && localStorage.length > 0) {\n // Clear our cache if quota exceeded\n localStorage.removeItem(this.#storageKey);\n }\n }\n }\n\n removeItem(key: string): void {\n try {\n const cache = this.#getCache();\n delete cache[key];\n localStorage.setItem(this.#storageKey, JSON.stringify(cache));\n } catch {\n // Silently fail if we can't remove\n }\n }\n\n #getCache(): Record<string, TtlInMilliseconds> {\n try {\n const cacheString = localStorage.getItem(this.#storageKey);\n if (!cacheString) {\n return {};\n }\n return JSON.parse(cacheString);\n } catch {\n return {};\n }\n }\n\n static isSupported(): boolean {\n return typeof window !== 'undefined' && !!window.localStorage;\n }\n}\n\n/**\n * In-memory cache implementation for non-browser environments (e.g., React Native).\n */\nexport class InMemoryThrottlerCache implements ThrottlerCache {\n #cache: Map<string, TtlInMilliseconds> = new Map();\n #maxSize = 10000; // Defensive limit to prevent memory issues\n\n getItem(key: string): TtlInMilliseconds | undefined {\n // Defensive: clear cache if it gets too large\n if (this.#cache.size > this.#maxSize) {\n this.#cache.clear();\n return undefined;\n }\n\n return this.#cache.get(key);\n }\n\n setItem(key: string, value: TtlInMilliseconds): void {\n this.#cache.set(key, value);\n }\n\n removeItem(key: string): void {\n this.#cache.delete(key);\n }\n}\n","/**\n * The `TelemetryCollector` class handles collection of telemetry events from Clerk SDKs. Telemetry is opt-out and can be disabled by setting a CLERK_TELEMETRY_DISABLED environment variable.\n * The `ClerkProvider` also accepts a `telemetry` prop that will be passed to the collector during initialization:.\n *\n * ```jsx\n * <ClerkProvider telemetry={false}>\n * ...\n * </ClerkProvider>\n * ```\n *\n * For more information, please see the telemetry documentation page: https://clerk.com/docs/telemetry.\n */\nimport { parsePublishableKey } from '../keys';\nimport type {\n InstanceType,\n SDKMetadata,\n TelemetryCollector as TelemetryCollectorInterface,\n TelemetryEvent,\n TelemetryEventRaw,\n TelemetryLogEntry,\n} from '../types';\nimport { isTruthy } from '../underscore';\nimport { InMemoryThrottlerCache, LocalStorageThrottlerCache, TelemetryEventThrottler } from './throttler';\nimport type { TelemetryCollectorOptions } from './types';\n\n/**\n * Local interface for window.Clerk to avoid global type pollution.\n * This is only used within this module and doesn't affect other packages.\n */\ninterface WindowWithClerk extends Window {\n Clerk?: {\n constructor?: {\n sdkMetadata?: SDKMetadata;\n };\n };\n}\n\n/**\n * Type guard to check if window.Clerk exists and has the expected structure.\n */\nfunction isWindowClerkWithMetadata(clerk: unknown): clerk is { constructor: { sdkMetadata?: SDKMetadata } } {\n return (\n typeof clerk === 'object' && clerk !== null && 'constructor' in clerk && typeof clerk.constructor === 'function'\n );\n}\n\ntype TelemetryCollectorConfig = Pick<\n TelemetryCollectorOptions,\n 'samplingRate' | 'disabled' | 'debug' | 'maxBufferSize' | 'perEventSampling'\n> & {\n endpoint: string;\n};\n\ntype TelemetryMetadata = Required<\n Pick<TelemetryCollectorOptions, 'clerkVersion' | 'sdk' | 'sdkVersion' | 'publishableKey' | 'secretKey'>\n> & {\n /**\n * The instance type, derived from the provided publishableKey.\n */\n instanceType: InstanceType;\n};\n\n/**\n * Structure of log data sent to the telemetry endpoint.\n */\ntype TelemetryLogData = {\n /** Service that generated the log. */\n sdk: string;\n /** The version of the SDK where the event originated from. */\n sdkv: string;\n /** The version of Clerk where the event originated from. */\n cv: string;\n /** Log level (info, warn, error, debug, etc.). */\n lvl: TelemetryLogEntry['level'];\n /** Log message. */\n msg: string;\n /** Instance ID - optional. */\n iid?: string;\n /** Timestamp when log was generated. */\n ts: string;\n /** Primary key. */\n pk: string | null;\n /** Additional payload for the log. */\n payload: Record<string, unknown> | null;\n};\n\ntype TelemetryBufferItem = { kind: 'event'; value: TelemetryEvent } | { kind: 'log'; value: TelemetryLogData };\n\n// Accepted log levels for runtime validation\nconst VALID_LOG_LEVELS = new Set<string>(['error', 'warn', 'info', 'debug', 'trace']);\n\nconst DEFAULT_CONFIG: Partial<TelemetryCollectorConfig> = {\n samplingRate: 1,\n maxBufferSize: 5,\n // Production endpoint: https://clerk-telemetry.com\n // Staging endpoint: https://staging.clerk-telemetry.com\n // Local: http://localhost:8787\n endpoint: 'https://clerk-telemetry.com',\n};\n\nexport class TelemetryCollector implements TelemetryCollectorInterface {\n #config: Required<TelemetryCollectorConfig>;\n #eventThrottler: TelemetryEventThrottler;\n #metadata: TelemetryMetadata = {} as TelemetryMetadata;\n #buffer: TelemetryBufferItem[] = [];\n #pendingFlush: number | ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: TelemetryCollectorOptions) {\n this.#config = {\n maxBufferSize: options.maxBufferSize ?? DEFAULT_CONFIG.maxBufferSize,\n samplingRate: options.samplingRate ?? DEFAULT_CONFIG.samplingRate,\n perEventSampling: options.perEventSampling ?? true,\n disabled: options.disabled ?? false,\n debug: options.debug ?? false,\n endpoint: DEFAULT_CONFIG.endpoint,\n } as Required<TelemetryCollectorConfig>;\n\n if (!options.clerkVersion && typeof window === 'undefined') {\n // N/A in a server environment\n this.#metadata.clerkVersion = '';\n } else {\n this.#metadata.clerkVersion = options.clerkVersion ?? '';\n }\n\n // We will try to grab the SDK data lazily when an event is triggered, so it should always be defined once the event is sent.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#metadata.sdk = options.sdk!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#metadata.sdkVersion = options.sdkVersion!;\n\n this.#metadata.publishableKey = options.publishableKey ?? '';\n\n const parsedKey = parsePublishableKey(options.publishableKey);\n if (parsedKey) {\n this.#metadata.instanceType = parsedKey.instanceType;\n }\n\n if (options.secretKey) {\n // Only send the first 16 characters of the secret key to to avoid sending the full key. We can still query against the partial key.\n this.#metadata.secretKey = options.secretKey.substring(0, 16);\n }\n\n // Use LocalStorage cache in browsers where it's supported, otherwise fall back to in-memory cache\n const cache = LocalStorageThrottlerCache.isSupported()\n ? new LocalStorageThrottlerCache()\n : new InMemoryThrottlerCache();\n this.#eventThrottler = new TelemetryEventThrottler(cache);\n }\n\n get isEnabled(): boolean {\n if (this.#metadata.instanceType !== 'development') {\n return false;\n }\n\n // In browser or client environments, we most likely pass the disabled option to the collector, but in environments\n // where environment variables are available we also check for `CLERK_TELEMETRY_DISABLED`.\n if (\n this.#config.disabled ||\n (typeof process !== 'undefined' && process.env && isTruthy(process.env.CLERK_TELEMETRY_DISABLED))\n ) {\n return false;\n }\n\n // navigator.webdriver is a property generally set by headless browsers that are running in an automated testing environment.\n // Data from these environments is not meaningful for us and has the potential to produce a large volume of events, so we disable\n // collection in this case. (ref: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/webdriver)\n if (typeof window !== 'undefined' && !!window?.navigator?.webdriver) {\n return false;\n }\n\n return true;\n }\n\n get isDebug(): boolean {\n return (\n this.#config.debug ||\n (typeof process !== 'undefined' && process.env && isTruthy(process.env.CLERK_TELEMETRY_DEBUG))\n );\n }\n\n record(event: TelemetryEventRaw): void {\n try {\n const preparedPayload = this.#preparePayload(event.event, event.payload);\n\n this.#logEvent(preparedPayload.event, preparedPayload);\n\n if (!this.#shouldRecord(preparedPayload, event.eventSamplingRate)) {\n return;\n }\n\n this.#buffer.push({ kind: 'event', value: preparedPayload });\n\n this.#scheduleFlush();\n } catch (error) {\n console.error('[clerk/telemetry] Error recording telemetry event', error);\n }\n }\n\n /**\n * Records a telemetry log entry if logging is enabled and not in debug mode.\n *\n * @param entry - The telemetry log entry to record.\n */\n recordLog(entry: TelemetryLogEntry): void {\n try {\n if (!this.#shouldRecordLog(entry)) {\n return;\n }\n\n const levelIsValid = typeof entry?.level === 'string' && VALID_LOG_LEVELS.has(entry.level);\n const messageIsValid = typeof entry?.message === 'string' && entry.message.trim().length > 0;\n\n let normalizedTimestamp: Date | null = null;\n const timestampInput: unknown = (entry as unknown as { timestamp?: unknown })?.timestamp;\n if (typeof timestampInput === 'number' || typeof timestampInput === 'string') {\n const candidate = new Date(timestampInput);\n if (!Number.isNaN(candidate.getTime())) {\n normalizedTimestamp = candidate;\n }\n }\n\n if (!levelIsValid || !messageIsValid || normalizedTimestamp === null) {\n if (this.isDebug && typeof console !== 'undefined') {\n console.warn('[clerk/telemetry] Dropping invalid telemetry log entry', {\n levelIsValid,\n messageIsValid,\n timestampIsValid: normalizedTimestamp !== null,\n });\n }\n return;\n }\n\n const sdkMetadata = this.#getSDKMetadata();\n\n const logData: TelemetryLogData = {\n sdk: sdkMetadata.name,\n sdkv: sdkMetadata.version,\n cv: this.#metadata.clerkVersion ?? '',\n lvl: entry.level,\n msg: entry.message,\n ts: normalizedTimestamp.toISOString(),\n pk: this.#metadata.publishableKey || null,\n payload: this.#sanitizeContext(entry.context),\n };\n\n this.#buffer.push({ kind: 'log', value: logData });\n\n this.#scheduleFlush();\n } catch (error) {\n console.error('[clerk/telemetry] Error recording telemetry log entry', error);\n }\n }\n\n #shouldRecord(preparedPayload: TelemetryEvent, eventSamplingRate?: number) {\n return this.isEnabled && !this.isDebug && this.#shouldBeSampled(preparedPayload, eventSamplingRate);\n }\n\n #shouldRecordLog(_entry: TelemetryLogEntry): boolean {\n // Always allow logs from debug logger to be sent. Debug logger itself is already gated elsewhere.\n return true;\n }\n\n #shouldBeSampled(preparedPayload: TelemetryEvent, eventSamplingRate?: number) {\n const randomSeed = Math.random();\n\n const toBeSampled =\n randomSeed <= this.#config.samplingRate &&\n (this.#config.perEventSampling === false ||\n typeof eventSamplingRate === 'undefined' ||\n randomSeed <= eventSamplingRate);\n\n if (!toBeSampled) {\n return false;\n }\n\n return !this.#eventThrottler.isEventThrottled(preparedPayload);\n }\n\n #scheduleFlush(): void {\n // On the server, we want to flush immediately as we have less guarantees about the lifecycle of the process\n if (typeof window === 'undefined') {\n this.#flush();\n return;\n }\n const isBufferFull = this.#buffer.length >= this.#config.maxBufferSize;\n if (isBufferFull) {\n // If the buffer is full, flush immediately to make sure we minimize the chance of event loss.\n // Cancel any pending flushes as we're going to flush immediately\n if (this.#pendingFlush) {\n if (typeof cancelIdleCallback !== 'undefined') {\n cancelIdleCallback(Number(this.#pendingFlush));\n } else {\n clearTimeout(Number(this.#pendingFlush));\n }\n }\n this.#flush();\n return;\n }\n\n // If we have a pending flush, do nothing\n if (this.#pendingFlush) {\n return;\n }\n\n if ('requestIdleCallback' in window) {\n this.#pendingFlush = requestIdleCallback(() => {\n this.#flush();\n this.#pendingFlush = null;\n });\n } else {\n // This is not an ideal solution, but it at least waits until the next tick\n this.#pendingFlush = setTimeout(() => {\n this.#flush();\n this.#pendingFlush = null;\n }, 0);\n }\n }\n\n #flush(): void {\n // Capture the current buffer and clear it immediately to avoid closure references\n const itemsToSend = [...this.#buffer];\n this.#buffer = [];\n\n this.#pendingFlush = null;\n\n if (itemsToSend.length === 0) {\n return;\n }\n\n const eventsToSend = itemsToSend\n .filter(item => item.kind === 'event')\n .map(item => (item as { kind: 'event'; value: TelemetryEvent }).value);\n\n const logsToSend = itemsToSend\n .filter(item => item.kind === 'log')\n .map(item => (item as { kind: 'log'; value: TelemetryLogData }).value);\n\n if (eventsToSend.length > 0) {\n const eventsUrl = new URL('/v1/event', this.#config.endpoint);\n fetch(eventsUrl, {\n headers: {\n 'Content-Type': 'application/json',\n },\n keepalive: true,\n method: 'POST',\n // TODO: We send an array here with that idea that we can eventually send multiple events.\n body: JSON.stringify({ events: eventsToSend }),\n }).catch(() => void 0);\n }\n\n if (logsToSend.length > 0) {\n const logsUrl = new URL('/v1/logs', this.#config.endpoint);\n fetch(logsUrl, {\n headers: {\n 'Content-Type': 'application/json',\n },\n keepalive: true,\n method: 'POST',\n body: JSON.stringify({ logs: logsToSend }),\n }).catch(() => void 0);\n }\n }\n\n /**\n * If running in debug mode, log the event and its payload to the console.\n */\n #logEvent(event: TelemetryEvent['event'], payload: Record<string, any>) {\n if (!this.isDebug) {\n return;\n }\n\n if (typeof console.groupCollapsed !== 'undefined') {\n console.groupCollapsed('[clerk/telemetry]', event);\n console.log(payload);\n console.groupEnd();\n } else {\n console.log('[clerk/telemetry]', event, payload);\n }\n }\n\n /**\n * If in browser, attempt to lazily grab the SDK metadata from the Clerk singleton, otherwise fallback to the initially passed in values.\n *\n * This is necessary because the sdkMetadata can be set by the host SDK after the TelemetryCollector is instantiated.\n */\n #getSDKMetadata() {\n const sdkMetadata = {\n name: this.#metadata.sdk,\n version: this.#metadata.sdkVersion,\n };\n\n if (typeof window !== 'undefined') {\n const windowWithClerk = window as WindowWithClerk;\n\n if (windowWithClerk.Clerk) {\n const windowClerk = windowWithClerk.Clerk;\n\n if (isWindowClerkWithMetadata(windowClerk) && windowClerk.constructor.sdkMetadata) {\n const { name, version } = windowClerk.constructor.sdkMetadata;\n\n if (name !== undefined) {\n sdkMetadata.name = name;\n }\n if (version !== undefined) {\n sdkMetadata.version = version;\n }\n }\n }\n }\n\n return sdkMetadata;\n }\n\n /**\n * Append relevant metadata from the Clerk singleton to the event payload.\n */\n #preparePayload(event: TelemetryEvent['event'], payload: TelemetryEvent['payload']): TelemetryEvent {\n const sdkMetadata = this.#getSDKMetadata();\n\n return {\n event,\n cv: this.#metadata.clerkVersion ?? '',\n it: this.#metadata.instanceType ?? '',\n sdk: sdkMetadata.name,\n sdkv: sdkMetadata.version,\n ...(this.#metadata.publishableKey ? { pk: this.#metadata.publishableKey } : {}),\n ...(this.#metadata.secretKey ? { sk: this.#metadata.secretKey } : {}),\n payload,\n };\n }\n\n /**\n * Best-effort sanitization of the context payload. Returns a plain object with JSON-serializable\n * values or null when the input is missing or not serializable. Arrays are not accepted.\n */\n #sanitizeContext(context: unknown): Record<string, unknown> | null {\n if (context === null || typeof context === 'undefined') {\n return null;\n }\n if (typeof context !== 'object') {\n return null;\n }\n try {\n const cleaned = JSON.parse(JSON.stringify(context));\n if (cleaned && typeof cleaned === 'object' && !Array.isArray(cleaned)) {\n return cleaned as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_COMPONENT_MOUNTED = 'COMPONENT_MOUNTED';\nconst EVENT_COMPONENT_OPENED = 'COMPONENT_OPENED';\nconst EVENT_SAMPLING_RATE = 0.1;\n\n/** Increase sampling for high-signal auth components on mount. */\nconst AUTH_COMPONENTS = new Set<string>(['SignIn', 'SignUp']);\n\n/**\n * Returns the per-event sampling rate for component-mounted telemetry events.\n * Uses a higher rate for SignIn/SignUp to improve signal quality.\n *\n * @internal\n */\nfunction getComponentMountedSamplingRate(component: string): number {\n return AUTH_COMPONENTS.has(component) ? 1 : EVENT_SAMPLING_RATE;\n}\n\ntype ComponentMountedBase = {\n component: string;\n};\n\ntype EventPrebuiltComponent = ComponentMountedBase & {\n appearanceProp: boolean;\n elements: boolean;\n variables: boolean;\n theme: boolean;\n};\n\ntype EventComponentMounted = ComponentMountedBase & TelemetryEventRaw['payload'];\n\n/**\n * Factory for prebuilt component telemetry events.\n *\n * @internal\n */\nfunction createPrebuiltComponentEvent(event: typeof EVENT_COMPONENT_MOUNTED | typeof EVENT_COMPONENT_OPENED) {\n return function (\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n ): TelemetryEventRaw<EventPrebuiltComponent> {\n return {\n event,\n eventSamplingRate:\n event === EVENT_COMPONENT_MOUNTED ? getComponentMountedSamplingRate(component) : EVENT_SAMPLING_RATE,\n payload: {\n component,\n appearanceProp: Boolean(props?.appearance),\n theme: Boolean(props?.appearance?.theme),\n elements: Boolean(props?.appearance?.elements),\n variables: Boolean(props?.appearance?.variables),\n ...additionalPayload,\n },\n };\n };\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a prebuilt (AIO) component is mounted.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Will be filtered to a known list of props.\n * @param additionalPayload - Additional data to send with the event.\n * @example\n * telemetry.record(eventPrebuiltComponentMounted('SignUp', props));\n */\nexport function eventPrebuiltComponentMounted(\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n): TelemetryEventRaw<EventPrebuiltComponent> {\n return createPrebuiltComponentEvent(EVENT_COMPONENT_MOUNTED)(component, props, additionalPayload);\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a prebuilt (AIO) component is opened as a modal.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Will be filtered to a known list of props.\n * @param additionalPayload - Additional data to send with the event.\n * @example\n * telemetry.record(eventPrebuiltComponentOpened('GoogleOneTap', props));\n */\nexport function eventPrebuiltComponentOpened(\n component: string,\n props?: Record<string, any>,\n additionalPayload?: TelemetryEventRaw['payload'],\n): TelemetryEventRaw<EventPrebuiltComponent> {\n return createPrebuiltComponentEvent(EVENT_COMPONENT_OPENED)(component, props, additionalPayload);\n}\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for when a component is mounted. Use `eventPrebuiltComponentMounted` for prebuilt components.\n *\n * **Caution:** Filter the `props` you pass to this function to avoid sending too much data.\n *\n * @param component - The name of the component.\n * @param props - The props passed to the component. Ideally you only pass a handful of props here.\n * @example\n * telemetry.record(eventComponentMounted('SignUp', props));\n */\nexport function eventComponentMounted(\n component: string,\n props: TelemetryEventRaw['payload'] = {},\n): TelemetryEventRaw<EventComponentMounted> {\n return {\n event: EVENT_COMPONENT_MOUNTED,\n eventSamplingRate: getComponentMountedSamplingRate(component),\n payload: {\n component,\n ...props,\n },\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_METHOD_CALLED = 'METHOD_CALLED';\nconst EVENT_SAMPLING_RATE = 0.1;\n\ntype EventMethodCalled = {\n method: string;\n} & Record<string, string | number | boolean>;\n\n/**\n * Fired when a helper method is called from a Clerk SDK.\n */\nexport function eventMethodCalled(\n method: string,\n payload?: Record<string, unknown>,\n): TelemetryEventRaw<EventMethodCalled> {\n return {\n event: EVENT_METHOD_CALLED,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload: {\n method,\n ...payload,\n },\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nconst EVENT_FRAMEWORK_METADATA = 'FRAMEWORK_METADATA';\nconst EVENT_SAMPLING_RATE = 0.1;\n\ntype EventFrameworkMetadata = Record<string, string | number | boolean>;\n\n/**\n * Fired when a helper method is called from a Clerk SDK.\n */\nexport function eventFrameworkMetadata(payload: EventFrameworkMetadata): TelemetryEventRaw<EventFrameworkMetadata> {\n return {\n event: EVENT_FRAMEWORK_METADATA,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload,\n };\n}\n","import type { TelemetryEventRaw } from '../../types';\n\nexport const EVENT_THEME_USAGE = 'THEME_USAGE';\nexport const EVENT_SAMPLING_RATE = 1;\n\ntype EventThemeUsage = {\n /**\n * The name of the theme being used (e.g., \"shadcn\", \"neobrutalism\", etc.).\n */\n themeName?: string;\n};\n\n/**\n * Helper function for `telemetry.record()`. Create a consistent event object for tracking theme usage in ClerkProvider.\n *\n * @param appearance - The appearance prop from ClerkProvider.\n * @example\n * telemetry.record(eventThemeUsage(appearance));\n */\nexport function eventThemeUsage(appearance?: any): TelemetryEventRaw<EventThemeUsage> {\n const payload = analyzeThemeUsage(appearance);\n\n return {\n event: EVENT_THEME_USAGE,\n eventSamplingRate: EVENT_SAMPLING_RATE,\n payload,\n };\n}\n\n/**\n * Analyzes the appearance prop to extract theme usage information for telemetry.\n *\n * @internal\n */\nfunction analyzeThemeUsage(appearance?: any): EventThemeUsage {\n if (!appearance || typeof appearance !== 'object') {\n return {};\n }\n\n const themeProperty = appearance.theme;\n\n if (!themeProperty) {\n return {};\n }\n\n let themeName: string | undefined;\n\n if (Array.isArray(themeProperty)) {\n // Look for the first identifiable theme name in the array\n for (const theme of themeProperty) {\n const name = extractThemeName(theme);\n if (name) {\n themeName = name;\n break;\n }\n }\n } else {\n themeName = extractThemeName(themeProperty);\n }\n\n return { themeName };\n}\n\n/**\n * Extracts the theme name from a theme object.\n *\n * @internal\n */\nfunction extractThemeName(theme: any): string | undefined {\n if (typeof theme === 'string') {\n return theme;\n }\n\n if (typeof theme === 'object' && theme !== null) {\n // Check for explicit theme name\n if ('name' in theme && typeof theme.name === 'string') {\n return theme.name;\n }\n }\n\n return undefined;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { fn as TelemetryEventRaw, pn as TelemetryLogEntry, un as TelemetryCollector$1 } from "./index-CpTf_wzr.mjs";
1
+ import { fn as TelemetryEventRaw, pn as TelemetryLogEntry, un as TelemetryCollector$1 } from "./index-ChHWjn_I.mjs";
2
2
  import "./moduleManager-pxNnXwxv.mjs";
3
3
 
4
4
  //#region src/telemetry/types.d.ts
@@ -70,7 +70,7 @@ type EventPrebuiltComponent = ComponentMountedBase & {
70
70
  appearanceProp: boolean;
71
71
  elements: boolean;
72
72
  variables: boolean;
73
- baseTheme: boolean;
73
+ theme: boolean;
74
74
  };
75
75
  type EventComponentMounted = ComponentMountedBase & TelemetryEventRaw['payload'];
76
76
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.mts","names":[],"sources":["../../src/telemetry/types.ts","../../src/telemetry/collector.ts","../../src/telemetry/events/component-mounted.ts","../../src/telemetry/events/method-called.ts","../../src/telemetry/events/framework-metadata.ts","../../src/telemetry/events/theme-usage.ts"],"sourcesContent":[],"mappings":";;;;KAAY,yBAAA;;;;EAAA,QAAA,CAAA,EAAA,OAAA;;;;ECoGC,KAAA,CAAA,EAAA,OAAA;EAOU;;;EAPoB,YAAA,CAAA,EAAA,MAAA;EAA2B;;;;ACpGjB;EAuBhD,gBAAA,CAAA,EAAA,OAAsB;EAOtB;AAsCL;;EAGsB,aAAA,CAAA,EAAA,MAAA;EACD;;;EAaL,cAAA,CAAA,EAAA,MAAA;EAEN;;;EAEP,SAAA,CAAA,EAAA,MAAA;EAAiB;AAcpB;;EAGqB,YAAA,CAAA,EAAA,MAAA;EAAlB;;;;;AC1GkD;AAYrD;EAEY,UAAA,CAAA,EAAA,MAAA;CACS;;;cFqFR,kBAAA,YAA8B;;EDpG/B,WAAA,CAAA,OAAA,EC2GW,yBD3Gc;;;gBCoLrB;EAhFH;;;;;EAAyD,SAAA,CAAA,KAAA,EAuGnD,iBAvGmD,CAAA,EAAA,IAAA;;;;KCjFjE,oBAAA;;;AFnBL,KEuBK,sBAAA,GAAyB,oBFvBO,GAAA;;;;ECoGxB,SAAA,EAAA,OAAA;CAOU;KC7ElB,qBAAA,GAAwB,oBDsJb,GCtJoC,iBDsJpC,CAAA,SAAA,CAAA;;;;;;;ACpLqC;AAmB5B;AAIyB;AA6ClC,iBAAA,6BAAA,CAA6B,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAEnC,MAFmC,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,iBAAA,CAAA,EAGvB,iBAHuB,CAAA,SAAA,CAAA,CAAA,EAI1C,iBAJ0C,CAIxB,sBAJwB,CAAA;;;;;;AAiB7C;;;;AAIG,iBAJa,4BAAA,CAIb,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAFO,MAEP,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,iBAAA,CAAA,EADmB,iBACnB,CAAA,SAAA,CAAA,CAAA,EAAA,iBAAA,CAAkB,sBAAlB,CAAA;;AAcH;;;;;;;;ACvGqD;AAYrC,iBD2FA,qBAAA,CC3FiB,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,ED6FxB,iBC7FwB,CAAA,SAAA,CAAA,CAAA,ED8F9B,iBC9F8B,CD8FZ,qBC9FY,CAAA;;;KAP5B,iBAAA;;IAED;AHPJ;;;iBGYgB,iBAAA,2BAEJ,0BACT,kBAAkB;;;KCVhB,sBAAA,GAAyB;;;AJL9B;iBIUgB,sBAAA,UAAgC,yBAAyB,kBAAkB;;;cCR9E,iBAAA;cACA,mBAAA;KAER,eAAA;ELLO;;;;ACoGZ,CAAA;;;;;;;;iBIjFgB,eAAA,oBAAmC,kBAAkB"}
1
+ {"version":3,"file":"telemetry.d.mts","names":[],"sources":["../../src/telemetry/types.ts","../../src/telemetry/collector.ts","../../src/telemetry/events/component-mounted.ts","../../src/telemetry/events/method-called.ts","../../src/telemetry/events/framework-metadata.ts","../../src/telemetry/events/theme-usage.ts"],"sourcesContent":[],"mappings":";;;;KAAY,yBAAA;;;;EAAA,QAAA,CAAA,EAAA,OAAA;;;;ECoGC,KAAA,CAAA,EAAA,OAAA;EAOU;;;EAPoB,YAAA,CAAA,EAAA,MAAA;EAA2B;;;;ACpGjB;EAuBhD,gBAAA,CAAA,EAAA,OAAsB;EAOtB;AAsCL;;EAGsB,aAAA,CAAA,EAAA,MAAA;EACD;;;EAaL,cAAA,CAAA,EAAA,MAAA;EAEN;;;EAEP,SAAA,CAAA,EAAA,MAAA;EAAiB;AAcpB;;EAGqB,YAAA,CAAA,EAAA,MAAA;EAAlB;;;;;AC1GkD;AAYrD;EAEY,UAAA,CAAA,EAAA,MAAA;CACS;;;cFqFR,kBAAA,YAA8B;;EDpG/B,WAAA,CAAA,OAAA,EC2GW,yBD3Gc;;;gBCoLrB;EAhFH;;;;;EAAyD,SAAA,CAAA,KAAA,EAuGnD,iBAvGmD,CAAA,EAAA,IAAA;;;;KCjFjE,oBAAA;;;AFnBL,KEuBK,sBAAA,GAAyB,oBFvBO,GAAA;;;;ECoGxB,KAAA,EAAA,OAAA;CAOU;KC7ElB,qBAAA,GAAwB,oBDsJb,GCtJoC,iBDsJpC,CAAA,SAAA,CAAA;;;;;;;ACpLqC;AAmB5B;AAIyB;AA6ClC,iBAAA,6BAAA,CAA6B,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAEnC,MAFmC,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,iBAAA,CAAA,EAGvB,iBAHuB,CAAA,SAAA,CAAA,CAAA,EAI1C,iBAJ0C,CAIxB,sBAJwB,CAAA;;;;;;AAiB7C;;;;AAIG,iBAJa,4BAAA,CAIb,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAFO,MAEP,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,iBAAA,CAAA,EADmB,iBACnB,CAAA,SAAA,CAAA,CAAA,EAAA,iBAAA,CAAkB,sBAAlB,CAAA;;AAcH;;;;;;;;ACvGqD;AAYrC,iBD2FA,qBAAA,CC3FiB,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,ED6FxB,iBC7FwB,CAAA,SAAA,CAAA,CAAA,ED8F9B,iBC9F8B,CD8FZ,qBC9FY,CAAA;;;KAP5B,iBAAA;;IAED;AHPJ;;;iBGYgB,iBAAA,2BAEJ,0BACT,kBAAkB;;;KCVhB,sBAAA,GAAyB;;;AJL9B;iBIUgB,sBAAA,UAAgC,yBAAyB,kBAAkB;;;cCR9E,iBAAA;cACA,mBAAA;KAER,eAAA;ELLO;;;;ACoGZ,CAAA;;;;;;;;iBIjFgB,eAAA,oBAAmC,kBAAkB"}
@@ -1,4 +1,4 @@
1
- import { fn as TelemetryEventRaw, pn as TelemetryLogEntry, un as TelemetryCollector$1 } from "./index-D-EHOtTU.js";
1
+ import { fn as TelemetryEventRaw, pn as TelemetryLogEntry, un as TelemetryCollector$1 } from "./index-046BvqQ_.js";
2
2
  import "./moduleManager-WB15hU3T.js";
3
3
 
4
4
  //#region src/telemetry/types.d.ts
@@ -70,7 +70,7 @@ type EventPrebuiltComponent = ComponentMountedBase & {
70
70
  appearanceProp: boolean;
71
71
  elements: boolean;
72
72
  variables: boolean;
73
- baseTheme: boolean;
73
+ theme: boolean;
74
74
  };
75
75
  type EventComponentMounted = ComponentMountedBase & TelemetryEventRaw['payload'];
76
76
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","names":[],"sources":["../../src/telemetry/types.ts","../../src/telemetry/collector.ts","../../src/telemetry/events/component-mounted.ts","../../src/telemetry/events/method-called.ts","../../src/telemetry/events/framework-metadata.ts","../../src/telemetry/events/theme-usage.ts"],"sourcesContent":[],"mappings":";;;;KAAY,yBAAA;;;;EAAA,QAAA,CAAA,EAAA,OAAA;;;;ECoGC,KAAA,CAAA,EAAA,OAAA;EAOU;;;EAPoB,YAAA,CAAA,EAAA,MAAA;EAA2B;;;;ACpGjB;EAuBhD,gBAAA,CAAA,EAAA,OAAsB;EAOtB;AAsCL;;EAGsB,aAAA,CAAA,EAAA,MAAA;EACD;;;EAaL,cAAA,CAAA,EAAA,MAAA;EAEN;;;EAEP,SAAA,CAAA,EAAA,MAAA;EAAiB;AAcpB;;EAGqB,YAAA,CAAA,EAAA,MAAA;EAAlB;;;;;AC1GkD;AAYrD;EAEY,UAAA,CAAA,EAAA,MAAA;CACS;;;cFqFR,kBAAA,YAA8B;;EDpG/B,WAAA,CAAA,OAAA,EC2GW,yBD3Gc;;;gBCoLrB;EAhFH;;;;;EAAyD,SAAA,CAAA,KAAA,EAuGnD,iBAvGmD,CAAA,EAAA,IAAA;;;;KCjFjE,oBAAA;;;AFnBL,KEuBK,sBAAA,GAAyB,oBFvBO,GAAA;;;;ECoGxB,SAAA,EAAA,OAAA;CAOU;KC7ElB,qBAAA,GAAwB,oBDsJb,GCtJoC,iBDsJpC,CAAA,SAAA,CAAA;;;;;;;ACpLqC;AAmB5B;AAIyB;AA6ClC,iBAAA,6BAAA,CAA6B,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAEnC,MAFmC,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,iBAAA,CAAA,EAGvB,iBAHuB,CAAA,SAAA,CAAA,CAAA,EAI1C,iBAJ0C,CAIxB,sBAJwB,CAAA;;;;;;AAiB7C;;;;AAIG,iBAJa,4BAAA,CAIb,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAFO,MAEP,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,iBAAA,CAAA,EADmB,iBACnB,CAAA,SAAA,CAAA,CAAA,EAAA,iBAAA,CAAkB,sBAAlB,CAAA;;AAcH;;;;;;;;ACvGqD;AAYrC,iBD2FA,qBAAA,CC3FiB,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,ED6FxB,iBC7FwB,CAAA,SAAA,CAAA,CAAA,ED8F9B,iBC9F8B,CD8FZ,qBC9FY,CAAA;;;KAP5B,iBAAA;;IAED;AHPJ;;;iBGYgB,iBAAA,2BAEJ,0BACT,kBAAkB;;;KCVhB,sBAAA,GAAyB;;;AJL9B;iBIUgB,sBAAA,UAAgC,yBAAyB,kBAAkB;;;cCR9E,iBAAA;cACA,mBAAA;KAER,eAAA;ELLO;;;;ACoGZ,CAAA;;;;;;;;iBIjFgB,eAAA,oBAAmC,kBAAkB"}
1
+ {"version":3,"file":"telemetry.d.ts","names":[],"sources":["../../src/telemetry/types.ts","../../src/telemetry/collector.ts","../../src/telemetry/events/component-mounted.ts","../../src/telemetry/events/method-called.ts","../../src/telemetry/events/framework-metadata.ts","../../src/telemetry/events/theme-usage.ts"],"sourcesContent":[],"mappings":";;;;KAAY,yBAAA;;;;EAAA,QAAA,CAAA,EAAA,OAAA;;;;ECoGC,KAAA,CAAA,EAAA,OAAA;EAOU;;;EAPoB,YAAA,CAAA,EAAA,MAAA;EAA2B;;;;ACpGjB;EAuBhD,gBAAA,CAAA,EAAA,OAAsB;EAOtB;AAsCL;;EAGsB,aAAA,CAAA,EAAA,MAAA;EACD;;;EAaL,cAAA,CAAA,EAAA,MAAA;EAEN;;;EAEP,SAAA,CAAA,EAAA,MAAA;EAAiB;AAcpB;;EAGqB,YAAA,CAAA,EAAA,MAAA;EAAlB;;;;;AC1GkD;AAYrD;EAEY,UAAA,CAAA,EAAA,MAAA;CACS;;;cFqFR,kBAAA,YAA8B;;EDpG/B,WAAA,CAAA,OAAA,EC2GW,yBD3Gc;;;gBCoLrB;EAhFH;;;;;EAAyD,SAAA,CAAA,KAAA,EAuGnD,iBAvGmD,CAAA,EAAA,IAAA;;;;KCjFjE,oBAAA;;;AFnBL,KEuBK,sBAAA,GAAyB,oBFvBO,GAAA;;;;ECoGxB,KAAA,EAAA,OAAA;CAOU;KC7ElB,qBAAA,GAAwB,oBDsJb,GCtJoC,iBDsJpC,CAAA,SAAA,CAAA;;;;;;;ACpLqC;AAmB5B;AAIyB;AA6ClC,iBAAA,6BAAA,CAA6B,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAEnC,MAFmC,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,iBAAA,CAAA,EAGvB,iBAHuB,CAAA,SAAA,CAAA,CAAA,EAI1C,iBAJ0C,CAIxB,sBAJwB,CAAA;;;;;;AAiB7C;;;;AAIG,iBAJa,4BAAA,CAIb,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAFO,MAEP,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,iBAAA,CAAA,EADmB,iBACnB,CAAA,SAAA,CAAA,CAAA,EAAA,iBAAA,CAAkB,sBAAlB,CAAA;;AAcH;;;;;;;;ACvGqD;AAYrC,iBD2FA,qBAAA,CC3FiB,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,ED6FxB,iBC7FwB,CAAA,SAAA,CAAA,CAAA,ED8F9B,iBC9F8B,CD8FZ,qBC9FY,CAAA;;;KAP5B,iBAAA;;IAED;AHPJ;;;iBGYgB,iBAAA,2BAEJ,0BACT,kBAAkB;;;KCVhB,sBAAA,GAAyB;;;AJL9B;iBIUgB,sBAAA,UAAgC,yBAAyB,kBAAkB;;;cCR9E,iBAAA;cACA,mBAAA;KAER,eAAA;ELLO;;;;ACoGZ,CAAA;;;;;;;;iBIjFgB,eAAA,oBAAmC,kBAAkB"}
@@ -3,7 +3,7 @@ require('./isomorphicAtob-Chnw1Md3.js');
3
3
  require('./isomorphicBtoa-oWNvIgSP.js');
4
4
  require('./keys-wr08qE7Y.js');
5
5
  require('./underscore-moIbQc1H.js');
6
- const require_telemetry = require('./telemetry-B26lGQUL.js');
6
+ const require_telemetry = require('./telemetry-CXXDXYfo.js');
7
7
 
8
8
  exports.EVENT_SAMPLING_RATE = require_telemetry.EVENT_SAMPLING_RATE;
9
9
  exports.EVENT_THEME_USAGE = require_telemetry.EVENT_THEME_USAGE;
@@ -3,6 +3,6 @@ import "./isomorphicAtob-CYR5fxvZ.mjs";
3
3
  import "./isomorphicBtoa-Db71q4D6.mjs";
4
4
  import "./keys-BGyzAyGu.mjs";
5
5
  import "./underscore-Cv_9NQ-X.mjs";
6
- import { a as eventMethodCalled, c as eventPrebuiltComponentOpened, i as eventFrameworkMetadata, l as TelemetryCollector, n as EVENT_THEME_USAGE, o as eventComponentMounted, r as eventThemeUsage, s as eventPrebuiltComponentMounted, t as EVENT_SAMPLING_RATE } from "./telemetry-B4xKE_qs.mjs";
6
+ import { a as eventMethodCalled, c as eventPrebuiltComponentOpened, i as eventFrameworkMetadata, l as TelemetryCollector, n as EVENT_THEME_USAGE, o as eventComponentMounted, r as eventThemeUsage, s as eventPrebuiltComponentMounted, t as EVENT_SAMPLING_RATE } from "./telemetry-DnVD78JJ.mjs";
7
7
 
8
8
  export { EVENT_SAMPLING_RATE, EVENT_THEME_USAGE, TelemetryCollector, eventComponentMounted, eventFrameworkMetadata, eventMethodCalled, eventPrebuiltComponentMounted, eventPrebuiltComponentOpened, eventThemeUsage };