consentlayer 0.0.0-stage → 1.0.0-rc.0

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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +88 -2
  3. package/dist/adapters/google-consent-mode.d.ts +20 -0
  4. package/dist/adapters/google-consent-mode.js +18 -0
  5. package/dist/adapters/google-consent-mode.js.map +1 -0
  6. package/dist/adapters/shopify.d.ts +49 -0
  7. package/dist/adapters/shopify.js +85 -0
  8. package/dist/adapters/shopify.js.map +1 -0
  9. package/dist/adapters/tcf.d.ts +20 -0
  10. package/dist/adapters/tcf.js +64 -0
  11. package/dist/adapters/tcf.js.map +1 -0
  12. package/dist/analytics-provider-07mxUgIK.d.ts +36 -0
  13. package/dist/angular.d.ts +56 -0
  14. package/dist/angular.js +120 -0
  15. package/dist/angular.js.map +1 -0
  16. package/dist/auto-tracking.d.ts +11 -0
  17. package/dist/auto-tracking.js +72 -0
  18. package/dist/auto-tracking.js.map +1 -0
  19. package/dist/chunk-7XLGT6U3.js +34 -0
  20. package/dist/chunk-7XLGT6U3.js.map +1 -0
  21. package/dist/chunk-BWPWDN4G.js +61 -0
  22. package/dist/chunk-BWPWDN4G.js.map +1 -0
  23. package/dist/chunk-DK45XPEY.js +77 -0
  24. package/dist/chunk-DK45XPEY.js.map +1 -0
  25. package/dist/chunk-ETU64ZV3.js +98 -0
  26. package/dist/chunk-ETU64ZV3.js.map +1 -0
  27. package/dist/chunk-FDJMIJFV.js +367 -0
  28. package/dist/chunk-FDJMIJFV.js.map +1 -0
  29. package/dist/chunk-HJGBVDPM.js +47 -0
  30. package/dist/chunk-HJGBVDPM.js.map +1 -0
  31. package/dist/chunk-J3KUPF4R.js +69 -0
  32. package/dist/chunk-J3KUPF4R.js.map +1 -0
  33. package/dist/chunk-LBEIEAJX.js +55 -0
  34. package/dist/chunk-LBEIEAJX.js.map +1 -0
  35. package/dist/chunk-LEAQJXJU.js +582 -0
  36. package/dist/chunk-LEAQJXJU.js.map +1 -0
  37. package/dist/chunk-R6I7OYQB.js +69 -0
  38. package/dist/chunk-R6I7OYQB.js.map +1 -0
  39. package/dist/chunk-RK2M57GW.js +54 -0
  40. package/dist/chunk-RK2M57GW.js.map +1 -0
  41. package/dist/chunk-RZ4TYRNY.js +128 -0
  42. package/dist/chunk-RZ4TYRNY.js.map +1 -0
  43. package/dist/chunk-TVSZJLRC.js +112 -0
  44. package/dist/chunk-TVSZJLRC.js.map +1 -0
  45. package/dist/chunk-TYOQYV45.js +79 -0
  46. package/dist/chunk-TYOQYV45.js.map +1 -0
  47. package/dist/chunk-UAIZU5WD.js +52 -0
  48. package/dist/chunk-UAIZU5WD.js.map +1 -0
  49. package/dist/chunk-VIIGBALD.js +14 -0
  50. package/dist/chunk-VIIGBALD.js.map +1 -0
  51. package/dist/consent-controller-DyHPNfyT.d.ts +47 -0
  52. package/dist/consentlayer-banner.global.js +20 -0
  53. package/dist/consentlayer.global.js +9 -0
  54. package/dist/create-analytics-Bzvm1UpE.d.ts +44 -0
  55. package/dist/ecommerce.d.ts +41 -0
  56. package/dist/ecommerce.js +43 -0
  57. package/dist/ecommerce.js.map +1 -0
  58. package/dist/index.d.ts +58 -0
  59. package/dist/index.js +42 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/next.d.ts +16 -0
  62. package/dist/next.js +27 -0
  63. package/dist/next.js.map +1 -0
  64. package/dist/nuxt/config.d.ts +7 -0
  65. package/dist/nuxt/config.js +6 -0
  66. package/dist/nuxt/config.js.map +1 -0
  67. package/dist/nuxt/index.d.ts +11 -0
  68. package/dist/nuxt/index.js +35 -0
  69. package/dist/nuxt/index.js.map +1 -0
  70. package/dist/nuxt/plugin.d.ts +5 -0
  71. package/dist/nuxt/plugin.js +24 -0
  72. package/dist/nuxt/plugin.js.map +1 -0
  73. package/dist/providers/contentsquare.d.ts +27 -0
  74. package/dist/providers/contentsquare.js +58 -0
  75. package/dist/providers/contentsquare.js.map +1 -0
  76. package/dist/providers/ga4.d.ts +46 -0
  77. package/dist/providers/ga4.js +3 -0
  78. package/dist/providers/ga4.js.map +1 -0
  79. package/dist/providers/gtm.d.ts +28 -0
  80. package/dist/providers/gtm.js +83 -0
  81. package/dist/providers/gtm.js.map +1 -0
  82. package/dist/providers/hotjar.d.ts +38 -0
  83. package/dist/providers/hotjar.js +68 -0
  84. package/dist/providers/hotjar.js.map +1 -0
  85. package/dist/providers/meta.d.ts +42 -0
  86. package/dist/providers/meta.js +65 -0
  87. package/dist/providers/meta.js.map +1 -0
  88. package/dist/providers/posthog.d.ts +42 -0
  89. package/dist/providers/posthog.js +91 -0
  90. package/dist/providers/posthog.js.map +1 -0
  91. package/dist/providers/sentry.d.ts +38 -0
  92. package/dist/providers/sentry.js +82 -0
  93. package/dist/providers/sentry.js.map +1 -0
  94. package/dist/providers/tiktok.d.ts +46 -0
  95. package/dist/providers/tiktok.js +72 -0
  96. package/dist/providers/tiktok.js.map +1 -0
  97. package/dist/providers/vercel.d.ts +14 -0
  98. package/dist/providers/vercel.js +17 -0
  99. package/dist/providers/vercel.js.map +1 -0
  100. package/dist/react/index.d.ts +78 -0
  101. package/dist/react/index.js +79 -0
  102. package/dist/react/index.js.map +1 -0
  103. package/dist/sentry/next.d.ts +1 -0
  104. package/dist/sentry/next.js +3 -0
  105. package/dist/sentry/next.js.map +1 -0
  106. package/dist/sentry/server.d.ts +24 -0
  107. package/dist/sentry/server.js +28 -0
  108. package/dist/sentry/server.js.map +1 -0
  109. package/dist/sentry-replay-HSFVEFCM.js +3 -0
  110. package/dist/sentry-replay-HSFVEFCM.js.map +1 -0
  111. package/dist/sentry-sdk-YQOGKGWD.js +3 -0
  112. package/dist/sentry-sdk-YQOGKGWD.js.map +1 -0
  113. package/dist/sentry-tracing-KWT7ITHF.js +3 -0
  114. package/dist/sentry-tracing-KWT7ITHF.js.map +1 -0
  115. package/dist/server/ga4.d.ts +15 -0
  116. package/dist/server/ga4.js +29 -0
  117. package/dist/server/ga4.js.map +1 -0
  118. package/dist/server/index.d.ts +116 -0
  119. package/dist/server/index.js +206 -0
  120. package/dist/server/index.js.map +1 -0
  121. package/dist/server/meta.d.ts +14 -0
  122. package/dist/server/meta.js +63 -0
  123. package/dist/server/meta.js.map +1 -0
  124. package/dist/server/sgtm.d.ts +18 -0
  125. package/dist/server/sgtm.js +34 -0
  126. package/dist/server/sgtm.js.map +1 -0
  127. package/dist/server/tiktok.d.ts +15 -0
  128. package/dist/server/tiktok.js +64 -0
  129. package/dist/server/tiktok.js.map +1 -0
  130. package/dist/solid.d.ts +59 -0
  131. package/dist/solid.js +3 -0
  132. package/dist/solid.js.map +1 -0
  133. package/dist/solidstart.d.ts +16 -0
  134. package/dist/solidstart.js +22 -0
  135. package/dist/solidstart.js.map +1 -0
  136. package/dist/svelte/GtmNoscript.svelte +18 -0
  137. package/dist/svelte/MetaPixelNoscript.svelte +18 -0
  138. package/dist/svelte.d.ts +55 -0
  139. package/dist/svelte.js +3 -0
  140. package/dist/svelte.js.map +1 -0
  141. package/dist/sveltekit.d.ts +18 -0
  142. package/dist/sveltekit.js +16 -0
  143. package/dist/sveltekit.js.map +1 -0
  144. package/dist/testing.d.ts +11 -0
  145. package/dist/testing.js +50 -0
  146. package/dist/testing.js.map +1 -0
  147. package/dist/types-BV_AFZKQ.d.ts +407 -0
  148. package/dist/vue.d.ts +92 -0
  149. package/dist/vue.js +97 -0
  150. package/dist/vue.js.map +1 -0
  151. package/package.json +281 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/meta.ts"],"names":[],"mappings":"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","file":"meta.js","sourcesContent":["import { metaUserData, toMetaEvent } from '../core/meta-events'\nimport { definePlugin, getFlag, loadScript, setFlag, skippedPlugin } from '../core/plugin'\nimport { expireCookies } from '../core/utils'\nimport { assertValidMetaPixelId } from '../core/validation'\n\nexport { metaUserData, toMetaEvent }\n\ndeclare global {\n interface Window {\n fbq?: (\n method: string,\n eventNameOrPixelId?: string,\n params?: Record<string, unknown>,\n options?: { eventID?: string },\n ) => void\n _fbq?: typeof window.fbq\n }\n}\n\n/** Options for `meta`. */\nexport type MetaOptions = {\n /** `undefined` or `''` turns the provider off. */\n pixelId: string | undefined\n locale?: string\n /**\n * `true`: the pixel script loads at boot and is told consent is revoked.\n * `false` (default): nothing loads until marketing consent is granted.\n */\n loadBeforeConsent?: boolean\n}\n\n/** Meta Pixel, after marketing consent. Pass `server` to `createAnalytics` to also send events to the Conversions API. */\nconst isOwnCookie = (name: string) => name === '_fbp' || name === '_fbc'\n\nexport function meta(options: MetaOptions) {\n if (!options.pixelId?.trim()) return skippedPlugin('meta', 'pixelId')\n const pixelId = assertValidMetaPixelId(options.pixelId.trim())\n const locale = options.locale ?? 'en_US'\n\n const isReady = () =>\n typeof window !== 'undefined' && typeof window.fbq === 'function' && getFlag('MetaPixelInitialized') === true\n\n // The pixel keeps init's email/phone, so after a withdrawal it stays off until reload.\n let matched = false\n let stale = false\n\n return definePlugin({\n id: 'meta',\n requiredConsent: 'marketing',\n loadBeforeConsent: options.loadBeforeConsent ?? false,\n load(loadContext) {\n if (typeof window === 'undefined' || getFlag('MetaPixelInitialized')) return\n\n const bootstrap = document.createElement('script')\n bootstrap.setAttribute('data-consentlayer', 'meta-pixel-bootstrap')\n bootstrap.text = `!function(f,b,e,v,n){if(f.fbq)return;n=f.fbq=function(){n.callMethod?\nn.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;\nn.push=n;n.loaded=!0;n.version='2.0';n.queue=[];}(window);\nfbq('consent', ${loadContext.consent?.marketing ? \"'grant'\" : \"'revoke'\"});\nfbq('init', ${JSON.stringify(pixelId)}, ${JSON.stringify(metaUserData(loadContext.identity)).replace(/</g, '\\\\u003c')});`\n document.head.appendChild(bootstrap)\n bootstrap.remove()\n matched = Boolean(loadContext.identity.email || loadContext.identity.phone)\n loadScript(`https://connect.facebook.net/${encodeURIComponent(locale)}/fbevents.js`).catch(() =>\n loadContext.emitError({\n scope: 'provider-script-load',\n message: 'Failed to load Meta Pixel (fbevents.js)',\n }),\n )\n\n setFlag('MetaPixelInitialized', true)\n },\n consent(context) {\n if (typeof window !== 'undefined' && context.consent && !context.consent.marketing) expireCookies(isOwnCookie)\n if (!isReady()) return\n if (matched && !context.consent?.marketing) stale = true\n window.fbq?.('consent', context.consent?.marketing && !stale ? 'grant' : 'revoke')\n },\n teardown(context) {\n if (typeof window === 'undefined' || context.consent?.marketing) return\n expireCookies(isOwnCookie)\n },\n page(page, context) {\n if (!isReady() || stale || !context.consent?.marketing) return\n window.fbq?.('track', 'PageView', {}, { eventID: page.id })\n },\n track(event, context) {\n if (!isReady() || stale || !context.consent?.marketing) return\n const { method, name, params } = toMetaEvent(event)\n window.fbq?.(method, name, params, { eventID: event.id })\n },\n })\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { L as LoadTiming, f as AnalyticsPlugin, P as PluginContext, g as PageEvent, h as AnalyticsEventPayload, U as UserIdentity, i as UserTraits, l as ErrorContext } from '../types-BV_AFZKQ.js';
2
+
3
+ /** Options for `posthog`. */
4
+ type PostHogOptions = {
5
+ /** `undefined` or `''` turns the provider off. */
6
+ apiKey: string | undefined;
7
+ /** Defaults to `https://us.i.posthog.com`. */
8
+ apiHost?: string;
9
+ /** PostHog's app URL, for toolbar links when `apiHost` is a reverse proxy, e.g. `https://us.posthog.com`. */
10
+ uiHost?: string;
11
+ /**
12
+ * Counts visitors without cookies or storage until analytics is granted, then
13
+ * switches to cookies. Needs cookieless mode on in the PostHog project settings.
14
+ * `false` loads PostHog only after analytics consent. Defaults to `true`.
15
+ */
16
+ cookieless?: boolean;
17
+ /** Defaults to `false`. */
18
+ autocapture?: boolean;
19
+ /** Session recording, after analytics consent. Defaults to `false`. */
20
+ recording?: boolean;
21
+ /** Sends `captureError` errors to PostHog error tracking. Defaults to `true`. */
22
+ errors?: boolean;
23
+ /** The group type `group()` uses. Defaults to `company`. */
24
+ groupType?: string;
25
+ defer?: LoadTiming;
26
+ };
27
+ /** PostHog product analytics, cookieless until analytics consent. */
28
+ declare function posthog(options: PostHogOptions): AnalyticsPlugin | {
29
+ id: string;
30
+ requiredConsent: "analytics" | "none";
31
+ defer: LoadTiming | undefined;
32
+ consent(ctx: PluginContext): Promise<void>;
33
+ load(ctx: PluginContext): Promise<void>;
34
+ page(page: PageEvent): Promise<void>;
35
+ track(event: AnalyticsEventPayload): Promise<void>;
36
+ identify(identity: UserIdentity, traits: UserTraits, ctx: PluginContext): Promise<void>;
37
+ group(groupId: string, traits: Record<string, unknown>): Promise<void>;
38
+ reset(ctx: PluginContext): Promise<void>;
39
+ error: ((error: unknown, context: ErrorContext) => Promise<void>) | undefined;
40
+ };
41
+
42
+ export { type PostHogOptions, posthog };
@@ -0,0 +1,91 @@
1
+ import { skippedPlugin, definePlugin } from '../chunk-7XLGT6U3.js';
2
+
3
+ // src/providers/posthog.ts
4
+ function posthog(options) {
5
+ const apiKey = options.apiKey?.trim();
6
+ if (!apiKey) return skippedPlugin("posthog", "apiKey");
7
+ const cookieless = options.cookieless ?? true;
8
+ let ready;
9
+ let latest;
10
+ const granted = () => Boolean(latest?.consent?.analytics);
11
+ const apply = async (client) => {
12
+ if (!granted()) {
13
+ if (!client.has_opted_out_capturing()) client.opt_out_capturing();
14
+ return;
15
+ }
16
+ if (!client.has_opted_in_capturing()) client.opt_in_capturing();
17
+ const userId = latest?.identity.userId;
18
+ if (userId) client.identify(userId);
19
+ if (options.recording) {
20
+ await import('posthog-js/dist/posthog-recorder');
21
+ client.startSessionRecording();
22
+ }
23
+ };
24
+ return definePlugin({
25
+ id: "posthog",
26
+ requiredConsent: cookieless ? "none" : "analytics",
27
+ defer: options.defer,
28
+ async consent(ctx) {
29
+ latest = ctx;
30
+ if (ready) await apply(await ready);
31
+ },
32
+ async load(ctx) {
33
+ latest ??= ctx;
34
+ ready = import('posthog-js').then(({ default: client }) => {
35
+ client.init(apiKey, {
36
+ api_host: options.apiHost ?? "https://us.i.posthog.com",
37
+ ui_host: options.uiHost,
38
+ cookieless_mode: cookieless ? "on_reject" : void 0,
39
+ opt_out_capturing_by_default: true,
40
+ opt_out_persistence_by_default: true,
41
+ autocapture: options.autocapture ?? false,
42
+ capture_pageview: false,
43
+ capture_pageleave: false,
44
+ capture_exceptions: false,
45
+ capture_heatmaps: false,
46
+ capture_dead_clicks: false,
47
+ disable_session_recording: true,
48
+ disable_surveys: true,
49
+ advanced_disable_flags: !options.recording,
50
+ advanced_disable_feature_flags: true,
51
+ disable_external_dependency_loading: true
52
+ });
53
+ return client;
54
+ });
55
+ await apply(await ready);
56
+ },
57
+ async page(page) {
58
+ const client = await ready;
59
+ client?.capture("$pageview", { $current_url: page.url, title: page.title });
60
+ },
61
+ async track(event) {
62
+ const client = await ready;
63
+ client?.capture(event.name, { ...event.params, ...event.options.providers?.posthog });
64
+ },
65
+ async identify(identity, traits, ctx) {
66
+ latest = ctx;
67
+ const client = await ready;
68
+ if (!client || !granted() || !identity.userId) return;
69
+ client.identify(identity.userId, identity.email ? { ...traits, email: identity.email } : traits);
70
+ },
71
+ async group(groupId, traits) {
72
+ const client = await ready;
73
+ if (client && granted()) client.group(options.groupType ?? "company", groupId, traits);
74
+ },
75
+ async reset(ctx) {
76
+ latest = ctx;
77
+ const client = await ready;
78
+ if (!client) return;
79
+ client.reset();
80
+ await apply(client);
81
+ },
82
+ error: options.errors === false ? void 0 : async (error, context) => {
83
+ const client = await ready;
84
+ client?.captureException(error, { level: context.level, ...context.tags, ...context.extra });
85
+ }
86
+ });
87
+ }
88
+
89
+ export { posthog };
90
+ //# sourceMappingURL=posthog.js.map
91
+ //# sourceMappingURL=posthog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/posthog.ts"],"names":[],"mappings":"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","file":"posthog.js","sourcesContent":["import type { PostHog } from 'posthog-js'\nimport { definePlugin, skippedPlugin } from '../core/plugin'\nimport type { LoadTiming, PluginContext } from '../core/types'\n\n/** Options for `posthog`. */\nexport type PostHogOptions = {\n /** `undefined` or `''` turns the provider off. */\n apiKey: string | undefined\n /** Defaults to `https://us.i.posthog.com`. */\n apiHost?: string\n /** PostHog's app URL, for toolbar links when `apiHost` is a reverse proxy, e.g. `https://us.posthog.com`. */\n uiHost?: string\n /**\n * Counts visitors without cookies or storage until analytics is granted, then\n * switches to cookies. Needs cookieless mode on in the PostHog project settings.\n * `false` loads PostHog only after analytics consent. Defaults to `true`.\n */\n cookieless?: boolean\n /** Defaults to `false`. */\n autocapture?: boolean\n /** Session recording, after analytics consent. Defaults to `false`. */\n recording?: boolean\n /** Sends `captureError` errors to PostHog error tracking. Defaults to `true`. */\n errors?: boolean\n /** The group type `group()` uses. Defaults to `company`. */\n groupType?: string\n defer?: LoadTiming\n}\n\n/** PostHog product analytics, cookieless until analytics consent. */\nexport function posthog(options: PostHogOptions) {\n const apiKey = options.apiKey?.trim()\n if (!apiKey) return skippedPlugin('posthog', 'apiKey')\n const cookieless = options.cookieless ?? true\n let ready: Promise<PostHog> | undefined\n let latest: PluginContext | undefined\n const granted = () => Boolean(latest?.consent?.analytics)\n\n const apply = async (client: PostHog) => {\n if (!granted()) {\n if (!client.has_opted_out_capturing()) client.opt_out_capturing()\n return\n }\n if (!client.has_opted_in_capturing()) client.opt_in_capturing()\n const userId = latest?.identity.userId\n if (userId) client.identify(userId)\n if (options.recording) {\n await import('posthog-js/dist/posthog-recorder')\n client.startSessionRecording()\n }\n }\n\n return definePlugin({\n id: 'posthog',\n requiredConsent: cookieless ? 'none' : 'analytics',\n defer: options.defer,\n async consent(ctx) {\n latest = ctx\n if (ready) await apply(await ready)\n },\n async load(ctx) {\n latest ??= ctx\n ready = import('posthog-js').then(({ default: client }) => {\n client.init(apiKey, {\n api_host: options.apiHost ?? 'https://us.i.posthog.com',\n ui_host: options.uiHost,\n cookieless_mode: cookieless ? 'on_reject' : undefined,\n opt_out_capturing_by_default: true,\n opt_out_persistence_by_default: true,\n autocapture: options.autocapture ?? false,\n capture_pageview: false,\n capture_pageleave: false,\n capture_exceptions: false,\n capture_heatmaps: false,\n capture_dead_clicks: false,\n disable_session_recording: true,\n disable_surveys: true,\n advanced_disable_flags: !options.recording,\n advanced_disable_feature_flags: true,\n disable_external_dependency_loading: true,\n })\n return client\n })\n await apply(await ready)\n },\n async page(page) {\n const client = await ready\n client?.capture('$pageview', { $current_url: page.url, title: page.title })\n },\n async track(event) {\n const client = await ready\n client?.capture(event.name, { ...event.params, ...event.options.providers?.posthog })\n },\n async identify(identity, traits, ctx) {\n latest = ctx\n const client = await ready\n if (!client || !granted() || !identity.userId) return\n client.identify(identity.userId, identity.email ? { ...traits, email: identity.email } : traits)\n },\n async group(groupId, traits) {\n const client = await ready\n if (client && granted()) client.group(options.groupType ?? 'company', groupId, traits)\n },\n async reset(ctx) {\n latest = ctx\n const client = await ready\n if (!client) return\n client.reset()\n await apply(client)\n },\n error:\n options.errors === false\n ? undefined\n : async (error, context) => {\n const client = await ready\n client?.captureException(error, { level: context.level, ...context.tags, ...context.extra })\n },\n })\n}\n"]}
@@ -0,0 +1,38 @@
1
+ import { L as LoadTiming, f as AnalyticsPlugin, P as PluginContext, U as UserIdentity, i as UserTraits, l as ErrorContext } from '../types-BV_AFZKQ.js';
2
+
3
+ /** Options for `sentry`. */
4
+ type SentryOptions = {
5
+ /** `undefined` or `''` turns the provider off. */
6
+ dsn: string | undefined;
7
+ environment?: string;
8
+ release?: string;
9
+ /** Session Replay, after analytics consent. Defaults to `false`. */
10
+ replay?: boolean | {
11
+ sessionSampleRate?: number;
12
+ onErrorSampleRate?: number;
13
+ };
14
+ /** Performance tracing, after analytics consent. Defaults to `false`. */
15
+ tracing?: boolean | {
16
+ sampleRate?: number;
17
+ };
18
+ /** Sends events to this URL instead of the DSN's host, so ad blockers don't drop them. */
19
+ tunnel?: string;
20
+ defer?: LoadTiming;
21
+ };
22
+ /**
23
+ * Errors are sent without consent and without personal data (no IP, cookies,
24
+ * headers, bodies or query strings). Analytics consent adds the user id (and
25
+ * email, with marketing), Replay and tracing.
26
+ */
27
+ declare function sentry(options: SentryOptions): AnalyticsPlugin | {
28
+ id: string;
29
+ requiredConsent: "none";
30
+ defer: LoadTiming | undefined;
31
+ consent(ctx: PluginContext): Promise<void>;
32
+ load(ctx: PluginContext): Promise<void>;
33
+ identify(_identity: UserIdentity, _traits: UserTraits, ctx: PluginContext): Promise<void>;
34
+ reset(ctx: PluginContext): Promise<void>;
35
+ error(error: unknown, context: ErrorContext): Promise<void>;
36
+ };
37
+
38
+ export { type SentryOptions, sentry };
@@ -0,0 +1,82 @@
1
+ import { skippedPlugin, definePlugin } from '../chunk-7XLGT6U3.js';
2
+
3
+ // src/providers/sentry.ts
4
+ function sentry(options) {
5
+ const dsn = options.dsn?.trim();
6
+ if (!dsn) return skippedPlugin("sentry", "dsn");
7
+ const replay = options.replay === true ? {} : options.replay;
8
+ const tracing = options.tracing === true ? {} : options.tracing;
9
+ let ready;
10
+ let latest;
11
+ let replayIntegration;
12
+ let tracingAdded = false;
13
+ const granted = () => Boolean(latest?.consent?.analytics);
14
+ const apply = async (sdk) => {
15
+ const userId = latest?.identity.userId;
16
+ sdk.setUser(granted() && userId ? { id: userId, email: latest?.identity.email } : null);
17
+ if (replay) {
18
+ if (!granted()) await replayIntegration?.stop();
19
+ else if (replayIntegration)
20
+ replayIntegration.startBuffering();
21
+ else sdk.addIntegration(replayIntegration = (await import('../sentry-replay-HSFVEFCM.js')).replayIntegration());
22
+ }
23
+ if (tracing && granted() && !tracingAdded) {
24
+ tracingAdded = true;
25
+ sdk.addIntegration((await import('../sentry-tracing-KWT7ITHF.js')).browserTracingIntegration());
26
+ }
27
+ };
28
+ return definePlugin({
29
+ id: "sentry",
30
+ requiredConsent: "none",
31
+ defer: options.defer,
32
+ async consent(ctx) {
33
+ latest = ctx;
34
+ if (ready) await apply(await ready);
35
+ },
36
+ async load(ctx) {
37
+ latest ??= ctx;
38
+ ready = import('../sentry-sdk-YQOGKGWD.js').then((sdk) => {
39
+ sdk.init({
40
+ dsn,
41
+ environment: options.environment,
42
+ release: options.release,
43
+ tunnel: options.tunnel,
44
+ dataCollection: {
45
+ userInfo: false,
46
+ cookies: false,
47
+ httpHeaders: false,
48
+ httpBodies: [],
49
+ urlQueryParams: false
50
+ },
51
+ integrations: (defaults) => defaults.filter((integration) => integration.name !== "GlobalHandlers"),
52
+ tracesSampleRate: tracing ? tracing.sampleRate ?? 1 : void 0,
53
+ replaysSessionSampleRate: replay ? replay.sessionSampleRate ?? 0.1 : void 0,
54
+ replaysOnErrorSampleRate: replay ? replay.onErrorSampleRate ?? 1 : void 0,
55
+ beforeSendTransaction: (event) => granted() ? event : null
56
+ });
57
+ return sdk;
58
+ });
59
+ await apply(await ready);
60
+ },
61
+ async identify(_identity, _traits, ctx) {
62
+ latest = ctx;
63
+ const sdk = await ready;
64
+ if (sdk) await apply(sdk);
65
+ },
66
+ async reset(ctx) {
67
+ latest = ctx;
68
+ (await ready)?.setUser(null);
69
+ },
70
+ async error(error, context) {
71
+ (await ready)?.captureException(error, {
72
+ level: context.level,
73
+ tags: { ...context.tags, source: context.source },
74
+ extra: context.extra
75
+ });
76
+ }
77
+ });
78
+ }
79
+
80
+ export { sentry };
81
+ //# sourceMappingURL=sentry.js.map
82
+ //# sourceMappingURL=sentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/sentry.ts"],"names":[],"mappings":"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","file":"sentry.js","sourcesContent":["import type { replayIntegration } from '@sentry/browser'\nimport { definePlugin, skippedPlugin } from '../core/plugin'\nimport type { LoadTiming, PluginContext } from '../core/types'\n\ntype Replay = ReturnType<typeof replayIntegration>\n\n/** Options for `sentry`. */\nexport type SentryOptions = {\n /** `undefined` or `''` turns the provider off. */\n dsn: string | undefined\n environment?: string\n release?: string\n /** Session Replay, after analytics consent. Defaults to `false`. */\n replay?: boolean | { sessionSampleRate?: number; onErrorSampleRate?: number }\n /** Performance tracing, after analytics consent. Defaults to `false`. */\n tracing?: boolean | { sampleRate?: number }\n /** Sends events to this URL instead of the DSN's host, so ad blockers don't drop them. */\n tunnel?: string\n defer?: LoadTiming\n}\n\n/**\n * Errors are sent without consent and without personal data (no IP, cookies,\n * headers, bodies or query strings). Analytics consent adds the user id (and\n * email, with marketing), Replay and tracing.\n */\nexport function sentry(options: SentryOptions) {\n const dsn = options.dsn?.trim()\n if (!dsn) return skippedPlugin('sentry', 'dsn')\n const replay = options.replay === true ? {} : options.replay\n const tracing = options.tracing === true ? {} : options.tracing\n let ready: Promise<typeof import('./sentry-sdk')> | undefined\n let latest: PluginContext | undefined\n let replayIntegration: Replay | undefined\n let tracingAdded = false\n const granted = () => Boolean(latest?.consent?.analytics)\n\n const apply = async (sdk: typeof import('./sentry-sdk')) => {\n const userId = latest?.identity.userId\n sdk.setUser(granted() && userId ? { id: userId, email: latest?.identity.email } : null)\n if (replay) {\n if (!granted()) await replayIntegration?.stop()\n else if (replayIntegration)\n replayIntegration.startBuffering() // ponytail: a regrant buffers for errors only; sessions resume next page load\n else sdk.addIntegration((replayIntegration = (await import('./sentry-replay')).replayIntegration()))\n }\n if (tracing && granted() && !tracingAdded) {\n tracingAdded = true\n sdk.addIntegration((await import('./sentry-tracing')).browserTracingIntegration())\n }\n }\n\n return definePlugin({\n id: 'sentry',\n requiredConsent: 'none',\n defer: options.defer,\n async consent(ctx) {\n latest = ctx\n if (ready) await apply(await ready)\n },\n async load(ctx) {\n latest ??= ctx\n ready = import('./sentry-sdk').then((sdk) => {\n sdk.init({\n dsn,\n environment: options.environment,\n release: options.release,\n tunnel: options.tunnel,\n dataCollection: {\n userInfo: false,\n cookies: false,\n httpHeaders: false,\n httpBodies: [],\n urlQueryParams: false,\n },\n integrations: (defaults) => defaults.filter((integration) => integration.name !== 'GlobalHandlers'),\n tracesSampleRate: tracing ? (tracing.sampleRate ?? 1) : undefined,\n replaysSessionSampleRate: replay ? (replay.sessionSampleRate ?? 0.1) : undefined,\n replaysOnErrorSampleRate: replay ? (replay.onErrorSampleRate ?? 1) : undefined,\n beforeSendTransaction: (event) => (granted() ? event : null),\n })\n return sdk\n })\n await apply(await ready)\n },\n async identify(_identity, _traits, ctx) {\n latest = ctx\n const sdk = await ready\n if (sdk) await apply(sdk)\n },\n async reset(ctx) {\n latest = ctx\n ;(await ready)?.setUser(null)\n },\n async error(error, context) {\n ;(await ready)?.captureException(error, {\n level: context.level,\n tags: { ...context.tags, source: context.source },\n extra: context.extra,\n })\n },\n })\n}\n"]}
@@ -0,0 +1,46 @@
1
+ import { U as UserIdentity, h as AnalyticsEventPayload, f as AnalyticsPlugin, P as PluginContext, i as UserTraits, g as PageEvent } from '../types-BV_AFZKQ.js';
2
+
3
+ /** Translates a standard event into a TikTok standard event, or a custom one under its own name. */
4
+ declare function toTikTokEvent(event: AnalyticsEventPayload): {
5
+ name: string;
6
+ params: Record<string, unknown>;
7
+ };
8
+ /** Advanced matching for `ttq.identify`; the pixel hashes the values itself. */
9
+ declare function tiktokUserData(identity: UserIdentity): Record<string, string>;
10
+
11
+ declare global {
12
+ interface Window {
13
+ ttq?: {
14
+ page: () => void;
15
+ track: (event: string, params?: Record<string, unknown>, options?: {
16
+ event_id?: string;
17
+ }) => void;
18
+ identify: (data: Record<string, string>) => void;
19
+ grantConsent: () => void;
20
+ revokeConsent: () => void;
21
+ };
22
+ }
23
+ }
24
+ /** Options for `tiktok`. */
25
+ type TikTokOptions = {
26
+ /** `undefined` or `''` turns the provider off. */
27
+ pixelId: string | undefined;
28
+ /**
29
+ * `true`: the pixel script loads at boot and holds events until consent is granted.
30
+ * `false` (default): nothing loads until marketing consent is granted.
31
+ */
32
+ loadBeforeConsent?: boolean;
33
+ };
34
+ declare function tiktok(options: TikTokOptions): AnalyticsPlugin | {
35
+ id: string;
36
+ requiredConsent: "marketing";
37
+ loadBeforeConsent: boolean;
38
+ load(loadContext: PluginContext): void;
39
+ consent(context: PluginContext): void;
40
+ teardown(context: PluginContext): void;
41
+ identify(identity: UserIdentity, _traits: UserTraits, context: PluginContext): void;
42
+ page(_page: PageEvent, context: PluginContext): void;
43
+ track(event: AnalyticsEventPayload, context: PluginContext): void;
44
+ };
45
+
46
+ export { type TikTokOptions, tiktok, tiktokUserData, toTikTokEvent };
@@ -0,0 +1,72 @@
1
+ import { toTikTokEvent, tiktokUserData } from '../chunk-RK2M57GW.js';
2
+ export { tiktokUserData, toTikTokEvent } from '../chunk-RK2M57GW.js';
3
+ import { expireCookies } from '../chunk-TVSZJLRC.js';
4
+ import { skippedPlugin, definePlugin, loadScript } from '../chunk-7XLGT6U3.js';
5
+ import { getFlag, setFlag } from '../chunk-R6I7OYQB.js';
6
+
7
+ // src/providers/tiktok.ts
8
+ var isOwnCookie = (name) => name === "_ttp" || name === "ttclid" || name.startsWith("ttcsid");
9
+ function tiktok(options) {
10
+ const pixelId = options.pixelId?.trim();
11
+ if (!pixelId) return skippedPlugin("tiktok", "pixelId");
12
+ const isReady = () => typeof window !== "undefined" && window.ttq !== void 0 && getFlag("TikTokPixelInitialized") === true;
13
+ let matched = false;
14
+ let stale = false;
15
+ return definePlugin({
16
+ id: "tiktok",
17
+ requiredConsent: "marketing",
18
+ loadBeforeConsent: options.loadBeforeConsent ?? false,
19
+ load(loadContext) {
20
+ if (typeof window === "undefined" || getFlag("TikTokPixelInitialized")) return;
21
+ const bootstrap = document.createElement("script");
22
+ bootstrap.setAttribute("data-consentlayer", "tiktok-pixel-bootstrap");
23
+ bootstrap.text = `!function (w, d, t) {
24
+ w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie","holdConsent","revokeConsent","grantConsent"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{}};
25
+ ttq.${loadContext.consent?.marketing ? "grantConsent" : "holdConsent"}();
26
+ ttq.load(${JSON.stringify(pixelId).replace(/</g, "\\u003c")});
27
+ }(window, document, 'ttq');`;
28
+ document.head.appendChild(bootstrap);
29
+ bootstrap.remove();
30
+ loadScript(
31
+ `https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=${encodeURIComponent(pixelId)}&lib=ttq`
32
+ ).catch(
33
+ () => loadContext.emitError({
34
+ scope: "provider-script-load",
35
+ message: "Failed to load TikTok Pixel (events.js)"
36
+ })
37
+ );
38
+ setFlag("TikTokPixelInitialized", true);
39
+ },
40
+ consent(context) {
41
+ if (typeof window !== "undefined" && context.consent && !context.consent.marketing) expireCookies(isOwnCookie);
42
+ if (!isReady()) return;
43
+ if (matched && !context.consent?.marketing) stale = true;
44
+ if (context.consent?.marketing && !stale) window.ttq?.grantConsent();
45
+ else window.ttq?.revokeConsent();
46
+ },
47
+ teardown(context) {
48
+ if (typeof window === "undefined" || context.consent?.marketing) return;
49
+ expireCookies(isOwnCookie);
50
+ },
51
+ identify(identity, _traits, context) {
52
+ if (!isReady() || stale || !context.consent?.marketing) return;
53
+ const data = tiktokUserData(identity);
54
+ if (!Object.keys(data).length) return;
55
+ window.ttq?.identify(data);
56
+ matched ||= Boolean(data.email || data.phone_number);
57
+ },
58
+ page(_page, context) {
59
+ if (!isReady() || stale || !context.consent?.marketing) return;
60
+ window.ttq?.page();
61
+ },
62
+ track(event, context) {
63
+ if (!isReady() || stale || !context.consent?.marketing) return;
64
+ const { name, params } = toTikTokEvent(event);
65
+ window.ttq?.track(name, params, { event_id: event.id });
66
+ }
67
+ });
68
+ }
69
+
70
+ export { tiktok };
71
+ //# sourceMappingURL=tiktok.js.map
72
+ //# sourceMappingURL=tiktok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/tiktok.ts"],"names":[],"mappings":"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","file":"tiktok.js","sourcesContent":["import { definePlugin, getFlag, loadScript, setFlag, skippedPlugin } from '../core/plugin'\nimport { tiktokUserData, toTikTokEvent } from '../core/tiktok-events'\nimport { expireCookies } from '../core/utils'\n\nexport { tiktokUserData, toTikTokEvent }\n\ndeclare global {\n interface Window {\n ttq?: {\n page: () => void\n track: (event: string, params?: Record<string, unknown>, options?: { event_id?: string }) => void\n identify: (data: Record<string, string>) => void\n grantConsent: () => void\n revokeConsent: () => void\n }\n }\n}\n\n/** Options for `tiktok`. */\nexport type TikTokOptions = {\n /** `undefined` or `''` turns the provider off. */\n pixelId: string | undefined\n /**\n * `true`: the pixel script loads at boot and holds events until consent is granted.\n * `false` (default): nothing loads until marketing consent is granted.\n */\n loadBeforeConsent?: boolean\n}\n\n/** TikTok Pixel, after marketing consent. Pass `server` to `createAnalytics` to also send events to the Events API. */\nconst isOwnCookie = (name: string) => name === '_ttp' || name === 'ttclid' || name.startsWith('ttcsid')\n\nexport function tiktok(options: TikTokOptions) {\n const pixelId = options.pixelId?.trim()\n if (!pixelId) return skippedPlugin('tiktok', 'pixelId')\n\n const isReady = () =>\n typeof window !== 'undefined' && window.ttq !== undefined && getFlag('TikTokPixelInitialized') === true\n\n // The pixel keeps identify's email/phone, so after a withdrawal it stays off until reload.\n let matched = false\n let stale = false\n\n return definePlugin({\n id: 'tiktok',\n requiredConsent: 'marketing',\n loadBeforeConsent: options.loadBeforeConsent ?? false,\n load(loadContext) {\n if (typeof window === 'undefined' || getFlag('TikTokPixelInitialized')) return\n\n const bootstrap = document.createElement('script')\n bootstrap.setAttribute('data-consentlayer', 'tiktok-pixel-bootstrap')\n // TikTok's base code with its consent mode methods; loadScript below injects events.js instead of ttq.load.\n bootstrap.text = `!function (w, d, t) {\nw.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=[\"page\",\"track\",\"identify\",\"instances\",\"debug\",\"on\",\"off\",\"once\",\"ready\",\"alias\",\"group\",\"enableCookie\",\"disableCookie\",\"holdConsent\",\"revokeConsent\",\"grantConsent\"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i=\"https://analytics.tiktok.com/i18n/pixel/events.js\";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{}};\nttq.${loadContext.consent?.marketing ? 'grantConsent' : 'holdConsent'}();\nttq.load(${JSON.stringify(pixelId).replace(/</g, '\\\\u003c')});\n}(window, document, 'ttq');`\n document.head.appendChild(bootstrap)\n bootstrap.remove()\n loadScript(\n `https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=${encodeURIComponent(pixelId)}&lib=ttq`,\n ).catch(() =>\n loadContext.emitError({\n scope: 'provider-script-load',\n message: 'Failed to load TikTok Pixel (events.js)',\n }),\n )\n\n setFlag('TikTokPixelInitialized', true)\n },\n consent(context) {\n if (typeof window !== 'undefined' && context.consent && !context.consent.marketing) expireCookies(isOwnCookie)\n if (!isReady()) return\n if (matched && !context.consent?.marketing) stale = true\n if (context.consent?.marketing && !stale) window.ttq?.grantConsent()\n else window.ttq?.revokeConsent()\n },\n teardown(context) {\n if (typeof window === 'undefined' || context.consent?.marketing) return\n expireCookies(isOwnCookie)\n },\n identify(identity, _traits, context) {\n if (!isReady() || stale || !context.consent?.marketing) return\n const data = tiktokUserData(identity)\n if (!Object.keys(data).length) return\n window.ttq?.identify(data)\n matched ||= Boolean(data.email || data.phone_number)\n },\n page(_page, context) {\n if (!isReady() || stale || !context.consent?.marketing) return\n window.ttq?.page()\n },\n track(event, context) {\n if (!isReady() || stale || !context.consent?.marketing) return\n const { name, params } = toTikTokEvent(event)\n window.ttq?.track(name, params, { event_id: event.id })\n },\n })\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { h as AnalyticsEventPayload } from '../types-BV_AFZKQ.js';
2
+
3
+ /** Options for `vercel`: pass `track` from `@vercel/analytics` as `trackEvent`. */
4
+ type VercelOptions = {
5
+ trackEvent: (name: string, payload: Record<string, string | number | boolean | null>) => void;
6
+ };
7
+ /** Vercel Analytics is cookieless, so it runs without consent. */
8
+ declare function vercel(options: VercelOptions): {
9
+ id: string;
10
+ requiredConsent: "none";
11
+ track(event: AnalyticsEventPayload): void;
12
+ };
13
+
14
+ export { type VercelOptions, vercel };
@@ -0,0 +1,17 @@
1
+ import { sanitizeVercelPayload } from '../chunk-TVSZJLRC.js';
2
+ import { definePlugin } from '../chunk-7XLGT6U3.js';
3
+
4
+ // src/providers/vercel.ts
5
+ function vercel(options) {
6
+ return definePlugin({
7
+ id: "vercel",
8
+ requiredConsent: "none",
9
+ track(event) {
10
+ options.trackEvent(event.name, sanitizeVercelPayload(event.params));
11
+ }
12
+ });
13
+ }
14
+
15
+ export { vercel };
16
+ //# sourceMappingURL=vercel.js.map
17
+ //# sourceMappingURL=vercel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/vercel.ts"],"names":[],"mappings":";;;;AASO,SAAS,OAAO,OAAA,EAAwB;AAC7C,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,EAAA,EAAI,QAAA;AAAA,IACJ,eAAA,EAAiB,MAAA;AAAA,IACjB,MAAM,KAAA,EAAO;AACX,MAAA,OAAA,CAAQ,WAAW,KAAA,CAAM,IAAA,EAAM,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IACpE;AAAA,GACD,CAAA;AACH","file":"vercel.js","sourcesContent":["import { definePlugin } from '../core/plugin'\nimport { sanitizeVercelPayload } from '../core/utils'\n\n/** Options for `vercel`: pass `track` from `@vercel/analytics` as `trackEvent`. */\nexport type VercelOptions = {\n trackEvent: (name: string, payload: Record<string, string | number | boolean | null>) => void\n}\n\n/** Vercel Analytics is cookieless, so it runs without consent. */\nexport function vercel(options: VercelOptions) {\n return definePlugin({\n id: 'vercel',\n requiredConsent: 'none',\n track(event) {\n options.trackEvent(event.name, sanitizeVercelPayload(event.params))\n },\n })\n}\n"]}
@@ -0,0 +1,78 @@
1
+ import { a as AnalyticsContext } from '../analytics-provider-07mxUgIK.js';
2
+ export { b as AnalyticsProvider, A as AnalyticsProviderProps, u as useAnalytics, c as useConsent, d as useConsentController } from '../analytics-provider-07mxUgIK.js';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import * as react from 'react';
5
+ import { Component, ReactNode, ContextType, ComponentPropsWithoutRef } from 'react';
6
+ import { m as Analytics, l as ErrorContext } from '../types-BV_AFZKQ.js';
7
+ import '../consent-controller-DyHPNfyT.js';
8
+
9
+ type FallbackProps = {
10
+ error: unknown;
11
+ reset: () => void;
12
+ };
13
+ /** Props for `<ErrorBoundary>`. */
14
+ type ErrorBoundaryProps = {
15
+ children: ReactNode;
16
+ fallback: ReactNode | ((props: FallbackProps) => ReactNode);
17
+ /** Defaults to the instance from `<AnalyticsProvider>`, else the one `createAnalytics()` made. */
18
+ analytics?: Analytics;
19
+ tags?: ErrorContext['tags'];
20
+ };
21
+ /** Renders `fallback` when a child throws, and sends the error through `captureError`. */
22
+ declare class ErrorBoundary extends Component<ErrorBoundaryProps, {
23
+ error: unknown;
24
+ failed: boolean;
25
+ }> {
26
+ static contextType: react.Context<Analytics | undefined>;
27
+ context: ContextType<typeof AnalyticsContext>;
28
+ state: {
29
+ error: unknown;
30
+ failed: boolean;
31
+ };
32
+ static getDerivedStateFromError(error: unknown): {
33
+ error: unknown;
34
+ failed: boolean;
35
+ };
36
+ componentDidCatch(error: unknown): void;
37
+ reset: () => void;
38
+ render(): ReactNode;
39
+ }
40
+ /**
41
+ * The component for Next.js `app/global-error.tsx`, which replaces the root
42
+ * layout, so `<AnalyticsProvider>` isn't there: pass the instance.
43
+ *
44
+ * ```tsx
45
+ * 'use client'
46
+ * export default createGlobalError(analytics)
47
+ * ```
48
+ */
49
+ declare function createGlobalError(analytics: Analytics, render?: (props: FallbackProps) => ReactNode): ({ error, reset }: {
50
+ error: Error & {
51
+ digest?: string;
52
+ };
53
+ reset: () => void;
54
+ }) => react_jsx_runtime.JSX.Element;
55
+
56
+ /**
57
+ * Google Tag Manager's `<noscript>` iframe. It loads the container only for
58
+ * visitors without JavaScript, who never see the consent banner, so its tags
59
+ * run without consent. Render it only where that is lawful for you. Renders
60
+ * nothing without `enabled` or while `containerId` is unset.
61
+ */
62
+ declare function GtmNoscript(props: {
63
+ containerId: string | undefined;
64
+ enabled?: boolean;
65
+ } & ComponentPropsWithoutRef<'iframe'>): react.DetailedReactHTMLElement<react.HTMLAttributes<HTMLElement>, HTMLElement> | null;
66
+
67
+ /**
68
+ * Meta's `<noscript>` PageView pixel. It fires only for visitors without
69
+ * JavaScript, who never see the consent banner, so it tracks them without
70
+ * consent. Render it only where that is lawful for you. Renders nothing without
71
+ * `enabled` or while `pixelId` is unset.
72
+ */
73
+ declare function MetaPixelNoscript(props: {
74
+ pixelId: string | undefined;
75
+ enabled?: boolean;
76
+ } & ComponentPropsWithoutRef<'img'>): react.DetailedReactHTMLElement<react.HTMLAttributes<HTMLElement>, HTMLElement> | null;
77
+
78
+ export { ErrorBoundary, type ErrorBoundaryProps, GtmNoscript, MetaPixelNoscript, createGlobalError };
@@ -0,0 +1,79 @@
1
+ 'use client';import { AnalyticsContext } from '../chunk-UAIZU5WD.js';
2
+ export { AnalyticsProvider, useAnalytics, useConsent, useConsentController } from '../chunk-UAIZU5WD.js';
3
+ import { gtmNoscriptSrc, metaNoscriptSrc } from '../chunk-VIIGBALD.js';
4
+ import { latestAnalytics } from '../chunk-FDJMIJFV.js';
5
+ import { Component, useEffect, createElement } from 'react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ var ErrorBoundary = class extends Component {
9
+ static contextType = AnalyticsContext;
10
+ state = { error: void 0, failed: false };
11
+ static getDerivedStateFromError(error) {
12
+ return { error, failed: true };
13
+ }
14
+ componentDidCatch(error) {
15
+ const analytics = this.props.analytics ?? this.context ?? latestAnalytics();
16
+ void analytics?.captureError(error, { source: "boundary", tags: this.props.tags });
17
+ }
18
+ reset = () => this.setState({ error: void 0, failed: false });
19
+ render() {
20
+ if (!this.state.failed) return this.props.children;
21
+ const { fallback } = this.props;
22
+ return typeof fallback === "function" ? fallback({ error: this.state.error, reset: this.reset }) : fallback;
23
+ }
24
+ };
25
+ function createGlobalError(analytics, render = ({ reset }) => /* @__PURE__ */ jsxs("main", { style: { fontFamily: "system-ui", padding: "2rem" }, children: [
26
+ /* @__PURE__ */ jsx("h1", { children: "Something went wrong." }),
27
+ /* @__PURE__ */ jsx("button", { type: "button", onClick: reset, children: "Try again" })
28
+ ] })) {
29
+ return function GlobalError({ error, reset }) {
30
+ useEffect(() => {
31
+ void (async () => {
32
+ await analytics.consent.bootstrap();
33
+ await analytics.boot();
34
+ await analytics.captureError(error, {
35
+ source: "boundary",
36
+ level: "fatal",
37
+ tags: error.digest ? { digest: error.digest } : void 0
38
+ });
39
+ })();
40
+ }, [error]);
41
+ return /* @__PURE__ */ jsx("html", { lang: "en", children: /* @__PURE__ */ jsx("body", { children: render({ error, reset }) }) });
42
+ };
43
+ }
44
+ function GtmNoscript(props) {
45
+ const { containerId, enabled, ...iframeProps } = props;
46
+ if (!enabled || !containerId) return null;
47
+ return createElement(
48
+ "noscript",
49
+ void 0,
50
+ createElement("iframe", {
51
+ title: "Google Tag Manager",
52
+ ...iframeProps,
53
+ height: iframeProps.height ?? 0,
54
+ width: iframeProps.width ?? 0,
55
+ style: { display: "none", visibility: "hidden", ...iframeProps.style },
56
+ src: gtmNoscriptSrc(containerId)
57
+ })
58
+ );
59
+ }
60
+ function MetaPixelNoscript(props) {
61
+ const { pixelId, enabled, ...imageProps } = props;
62
+ if (!enabled || !pixelId) return null;
63
+ return createElement(
64
+ "noscript",
65
+ void 0,
66
+ createElement("img", {
67
+ ...imageProps,
68
+ alt: "",
69
+ height: imageProps.height ?? 1,
70
+ width: imageProps.width ?? 1,
71
+ style: { display: "none", ...imageProps.style },
72
+ src: metaNoscriptSrc(pixelId)
73
+ })
74
+ );
75
+ }
76
+
77
+ export { ErrorBoundary, GtmNoscript, MetaPixelNoscript, createGlobalError };
78
+ //# sourceMappingURL=index.js.map
79
+ //# sourceMappingURL=index.js.map