@nuxt/scripts 1.0.0-rc.9 → 1.0.1

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 (106) hide show
  1. package/dist/devtools-client/200.html +1 -1
  2. package/dist/devtools-client/404.html +1 -1
  3. package/dist/devtools-client/_nuxt/{Cxq4HLPL.js → BjIIVRlr.js} +1 -1
  4. package/dist/devtools-client/_nuxt/{BBS9G2Kb.js → C3h_qg0j.js} +1 -1
  5. package/dist/devtools-client/_nuxt/{DCBsJT4N.js → CKrGhxlH.js} +1 -1
  6. package/dist/devtools-client/_nuxt/DD1eKorn.js +1 -0
  7. package/dist/devtools-client/_nuxt/{B4uHpJPz.js → DTVoxnk-.js} +1 -1
  8. package/dist/devtools-client/_nuxt/{DvZScWzI.js → TnW0ti1s.js} +1 -1
  9. package/dist/devtools-client/_nuxt/UTyLw2F_.js +188 -0
  10. package/dist/devtools-client/_nuxt/builds/latest.json +1 -1
  11. package/dist/devtools-client/_nuxt/builds/meta/8eda1fb3-23bc-456f-8373-7e503f9580ec.json +1 -0
  12. package/dist/devtools-client/_nuxt/{entry.BwpOBArY.css → entry.BKkVrcJj.css} +1 -1
  13. package/dist/devtools-client/_nuxt/error-404.Rdq9GpXu.css +1 -0
  14. package/dist/devtools-client/_nuxt/error-500.BPHNCR4E.css +1 -0
  15. package/dist/devtools-client/_nuxt/index.DZD1lwyI.css +1 -0
  16. package/dist/devtools-client/docs/index.html +1 -1
  17. package/dist/devtools-client/first-party/index.html +1 -1
  18. package/dist/devtools-client/index.html +1 -1
  19. package/dist/devtools-client/registry/index.html +1 -1
  20. package/dist/module.d.mts +18 -2
  21. package/dist/module.d.ts +18 -2
  22. package/dist/module.json +1 -1
  23. package/dist/module.mjs +81 -9
  24. package/dist/registry.mjs +10 -6
  25. package/dist/runtime/components/GoogleMaps/ScriptGoogleMaps.vue +1 -2
  26. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsMarker.vue +3 -0
  27. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsStaticMap.vue +6 -2
  28. package/dist/runtime/components/ScriptBlueskyEmbed.d.vue.ts +0 -1
  29. package/dist/runtime/components/ScriptBlueskyEmbed.vue +12 -10
  30. package/dist/runtime/components/ScriptBlueskyEmbed.vue.d.ts +0 -1
  31. package/dist/runtime/components/ScriptInstagramEmbed.vue +3 -1
  32. package/dist/runtime/components/ScriptXEmbed.d.vue.ts +0 -1
  33. package/dist/runtime/components/ScriptXEmbed.vue +11 -9
  34. package/dist/runtime/components/ScriptXEmbed.vue.d.ts +0 -1
  35. package/dist/runtime/composables/useScript.js +17 -6
  36. package/dist/runtime/composables/useScriptProxyToken.d.ts +12 -0
  37. package/dist/runtime/composables/useScriptProxyToken.js +4 -0
  38. package/dist/runtime/composables/useScriptProxyUrl.d.ts +12 -0
  39. package/dist/runtime/composables/useScriptProxyUrl.js +27 -0
  40. package/dist/runtime/plugins/proxy-token.server.d.ts +10 -0
  41. package/dist/runtime/plugins/proxy-token.server.js +17 -0
  42. package/dist/runtime/registry/bing-uet.d.ts +6 -2
  43. package/dist/runtime/registry/bing-uet.js +13 -1
  44. package/dist/runtime/registry/bluesky-embed.d.ts +0 -4
  45. package/dist/runtime/registry/bluesky-embed.js +0 -4
  46. package/dist/runtime/registry/clarity.d.ts +6 -2
  47. package/dist/runtime/registry/clarity.js +12 -1
  48. package/dist/runtime/registry/google-analytics.d.ts +6 -2
  49. package/dist/runtime/registry/google-analytics.js +12 -1
  50. package/dist/runtime/registry/google-tag-manager.d.ts +6 -2
  51. package/dist/runtime/registry/google-tag-manager.js +10 -1
  52. package/dist/runtime/registry/gravatar.js +10 -13
  53. package/dist/runtime/registry/matomo-analytics.d.ts +9 -3
  54. package/dist/runtime/registry/matomo-analytics.js +28 -1
  55. package/dist/runtime/registry/meta-pixel.d.ts +8 -2
  56. package/dist/runtime/registry/meta-pixel.js +10 -1
  57. package/dist/runtime/registry/mixpanel-analytics.d.ts +12 -2
  58. package/dist/runtime/registry/mixpanel-analytics.js +16 -4
  59. package/dist/runtime/registry/posthog.d.ts +8 -2
  60. package/dist/runtime/registry/posthog.js +15 -4
  61. package/dist/runtime/registry/schemas.d.ts +65 -0
  62. package/dist/runtime/registry/schemas.js +75 -8
  63. package/dist/runtime/registry/tiktok-pixel.d.ts +16 -2
  64. package/dist/runtime/registry/tiktok-pixel.js +22 -1
  65. package/dist/runtime/registry/x-embed.d.ts +0 -4
  66. package/dist/runtime/registry/x-embed.js +0 -4
  67. package/dist/runtime/server/bluesky-embed-image.d.ts +1 -1
  68. package/dist/runtime/server/bluesky-embed.d.ts +1 -15
  69. package/dist/runtime/server/bluesky-embed.js +22 -4
  70. package/dist/runtime/server/google-maps-geocode-proxy.js +8 -5
  71. package/dist/runtime/server/google-static-maps-proxy.d.ts +1 -1
  72. package/dist/runtime/server/google-static-maps-proxy.js +13 -8
  73. package/dist/runtime/server/gravatar-proxy.d.ts +1 -1
  74. package/dist/runtime/server/gravatar-proxy.js +6 -7
  75. package/dist/runtime/server/instagram-embed-asset.d.ts +1 -1
  76. package/dist/runtime/server/instagram-embed-image.d.ts +1 -1
  77. package/dist/runtime/server/instagram-embed.js +22 -10
  78. package/dist/runtime/server/utils/cached-upstream.d.ts +55 -0
  79. package/dist/runtime/server/utils/cached-upstream.js +65 -0
  80. package/dist/runtime/server/utils/embed-rewriters.d.ts +19 -0
  81. package/dist/runtime/server/utils/embed-rewriters.js +41 -0
  82. package/dist/runtime/server/utils/image-proxy.d.ts +3 -1
  83. package/dist/runtime/server/utils/image-proxy.js +8 -6
  84. package/dist/runtime/server/utils/instagram-embed.d.ts +4 -4
  85. package/dist/runtime/server/utils/instagram-embed.js +10 -9
  86. package/dist/runtime/server/utils/proxy-url.d.ts +9 -0
  87. package/dist/runtime/server/utils/proxy-url.js +21 -0
  88. package/dist/runtime/server/utils/sign-constants.d.ts +16 -0
  89. package/dist/runtime/server/utils/sign-constants.js +5 -0
  90. package/dist/runtime/server/utils/sign.d.ts +2 -10
  91. package/dist/runtime/server/utils/sign.js +8 -5
  92. package/dist/runtime/server/utils/withSigning.js +3 -2
  93. package/dist/runtime/server/vercel-insights-sink.d.ts +2 -0
  94. package/dist/runtime/server/vercel-insights-sink.js +5 -0
  95. package/dist/runtime/server/x-embed-image.d.ts +1 -1
  96. package/dist/runtime/server/x-embed.js +20 -2
  97. package/dist/runtime/types.d.ts +28 -1
  98. package/dist/types-source.mjs +104 -11
  99. package/dist/types.d.mts +1 -1
  100. package/package.json +3 -3
  101. package/dist/devtools-client/_nuxt/CQR4zIAm.js +0 -1
  102. package/dist/devtools-client/_nuxt/DTxy5P8N.js +0 -188
  103. package/dist/devtools-client/_nuxt/builds/meta/bd58b869-1eb5-4c50-871c-707f9b71e8f9.json +0 -1
  104. package/dist/devtools-client/_nuxt/error-404.d44aGwWI.css +0 -1
  105. package/dist/devtools-client/_nuxt/error-500.NthMfIEt.css +0 -1
  106. package/dist/devtools-client/_nuxt/index.CA-OpSj0.css +0 -1
@@ -44,12 +44,35 @@ import type { ProxyPrivacyInput } from './server/utils/privacy.js';
44
44
  export type { Cluster, ClusterStats, MarkerClustererContext, MarkerClustererInstance, MarkerClustererOptions } from './components/GoogleMaps/types.js';
45
45
  export { MARKER_CLUSTERER_INJECTION_KEY } from './components/GoogleMaps/types.js';
46
46
  export type WarmupStrategy = false | 'preload' | 'preconnect' | 'dns-prefetch';
47
- export type UseScriptContext<T extends Record<symbol | string, any>> = VueScriptInstance<T> & {
47
+ /**
48
+ * GCMv2 consent category value.
49
+ * @see https://developers.google.com/tag-platform/security/guides/consent
50
+ */
51
+ export type ConsentCategoryValue = 'granted' | 'denied';
52
+ /**
53
+ * Canonical GCMv2 consent state shape used by vendors that natively consume
54
+ * Consent Mode v2 (Google Analytics, Google Tag Manager, Bing UET).
55
+ */
56
+ export interface ConsentState {
57
+ ad_storage?: ConsentCategoryValue;
58
+ ad_user_data?: ConsentCategoryValue;
59
+ ad_personalization?: ConsentCategoryValue;
60
+ analytics_storage?: ConsentCategoryValue;
61
+ functionality_storage?: ConsentCategoryValue;
62
+ personalization_storage?: ConsentCategoryValue;
63
+ security_storage?: ConsentCategoryValue;
64
+ }
65
+ export type UseScriptContext<T extends Record<symbol | string, any>, C = unknown> = VueScriptInstance<T> & {
48
66
  /**
49
67
  * Remove and reload the script. Useful for scripts that need to re-execute
50
68
  * after SPA navigation (e.g., DOM-scanning scripts like iubenda).
51
69
  */
52
70
  reload: () => Promise<T>;
71
+ /**
72
+ * Vendor-native consent controls attached by registry scripts.
73
+ * Shape depends on the vendor (GCMv2 update, binary grant/revoke, three-state, etc.).
74
+ */
75
+ consent?: C;
53
76
  };
54
77
  export type NuxtUseScriptOptions<T extends Record<symbol | string, any> = {}> = Omit<UseScriptOptions<T>, 'trigger'> & {
55
78
  /**
@@ -328,6 +351,8 @@ export interface ProxyCapability {
328
351
  privacy: import('../runtime/server/utils/privacy').ProxyPrivacyInput;
329
352
  /** Auto-inject proxy endpoint into the script's SDK config. */
330
353
  autoInject?: ProxyAutoInject;
354
+ /** Config fields that may contain custom external hosts or endpoints. */
355
+ configDomainFields?: string[];
331
356
  /** AST-level SDK patches applied during URL rewriting. */
332
357
  sdkPatches?: SdkPatch[];
333
358
  }
@@ -463,6 +488,8 @@ export interface ProxyConfig {
463
488
  privacy: ProxyPrivacyInput;
464
489
  /** Auto-inject proxy endpoint config into the script's SDK options (resolved form) */
465
490
  autoInject?: ResolvedProxyAutoInject;
491
+ /** Config fields that may contain custom external hosts or endpoints. */
492
+ configDomainFields?: string[];
466
493
  /** AST-level SDK patches applied during URL rewriting. */
467
494
  sdkPatches?: SdkPatch[];
468
495
  }
@@ -3,7 +3,7 @@ const types = {
3
3
  {
4
4
  name: "BingUetOptions",
5
5
  kind: "const",
6
- code: "export const BingUetOptions = object({\n /**\n * Your Bing UET tag ID.\n * @see https://help.ads.microsoft.com/#apex/ads/en/56682/2-500\n */\n id: string(),\n /**\n * Enable automatic SPA page tracking.\n * @default true\n */\n enableAutoSpaTracking: optional(boolean()),\n})"
6
+ code: "export const BingUetOptions = object({\n /**\n * Your Bing UET tag ID.\n * @see https://help.ads.microsoft.com/#apex/ads/en/56682/2-500\n */\n id: string(),\n /**\n * Enable automatic SPA page tracking.\n * @default true\n */\n enableAutoSpaTracking: optional(boolean()),\n /**\n * Default consent state fired as `uetq.push('consent', 'default', ...)` before UET init.\n * @see https://help.ads.microsoft.com/#apex/ads/en/60119/1-500\n */\n defaultConsent: optional(object({\n ad_storage: optional(consentCategoryValue),\n })),\n})"
7
7
  },
8
8
  {
9
9
  name: "BingUetConsentStatus",
@@ -64,6 +64,11 @@ const types = {
64
64
  name: "BingUetApi",
65
65
  kind: "interface",
66
66
  code: "export interface BingUetApi {\n uetq: BingUetQueue\n}"
67
+ },
68
+ {
69
+ name: "BingUetConsent",
70
+ kind: "interface",
71
+ code: "export interface BingUetConsent {\n /** Push `['consent','update', state]` with the `ad_storage` signal. */\n update: (state: BingUetConsentOptions) => void\n}"
67
72
  }
68
73
  ],
69
74
  "bluesky-embed": [
@@ -92,7 +97,7 @@ const types = {
92
97
  {
93
98
  name: "ClarityOptions",
94
99
  kind: "const",
95
- code: "export const ClarityOptions = object({\n /**\n * The Clarity token.\n * @see https://learn.microsoft.com/en-us/clarity/setup-clarity\n */\n id: pipe(string(), minLength(10)),\n})"
100
+ code: "export const ClarityOptions = object({\n /**\n * The Clarity token.\n * @see https://learn.microsoft.com/en-us/clarity/setup-clarity\n */\n id: pipe(string(), minLength(10)),\n /**\n * Default consent state applied before Clarity starts.\n * - `boolean` - enable / disable cookies.\n * - `Record<string, string>` - advanced consent vector (see Clarity docs).\n * @see https://learn.microsoft.com/en-us/clarity/setup-and-installation/cookie-consent\n */\n defaultConsent: optional(union([boolean(), record(string(), string())])),\n})"
96
101
  },
97
102
  {
98
103
  name: "ClarityFunctions",
@@ -103,6 +108,11 @@ const types = {
103
108
  name: "ClarityApi",
104
109
  kind: "interface",
105
110
  code: "export interface ClarityApi {\n clarity: ClarityFunctions & {\n q: any[]\n v: string\n }\n}"
111
+ },
112
+ {
113
+ name: "ClarityConsent",
114
+ kind: "interface",
115
+ code: "export interface ClarityConsent {\n /** Call `clarity('consent', value)` with either a boolean (default) or Clarity's advanced vector. */\n set: (value: boolean | Record<string, string>) => void\n}"
106
116
  }
107
117
  ],
108
118
  "cloudflare-web-analytics": [
@@ -249,7 +259,12 @@ const types = {
249
259
  {
250
260
  name: "GoogleAnalyticsOptions",
251
261
  kind: "const",
252
- code: "export const GoogleAnalyticsOptions = object({\n /**\n * The GA4 measurement ID.\n * @example 'G-XXXXXXXX'\n * @see https://developers.google.com/analytics/devguides/collection/gtagjs\n */\n id: optional(string()),\n /**\n * Global name for the dataLayer variable.\n * @default 'dataLayer'\n * @see https://developers.google.com/analytics/devguides/collection/gtagjs/setting-up-gtag#rename_the_data_layer\n */\n l: optional(string()),\n})"
262
+ code: "export const GoogleAnalyticsOptions = object({\n /**\n * The GA4 measurement ID.\n * @example 'G-XXXXXXXX'\n * @see https://developers.google.com/analytics/devguides/collection/gtagjs\n */\n id: optional(string()),\n /**\n * Global name for the dataLayer variable.\n * @default 'dataLayer'\n * @see https://developers.google.com/analytics/devguides/collection/gtagjs/setting-up-gtag#rename_the_data_layer\n */\n l: optional(string()),\n /**\n * Default GCMv2 consent state fired as `gtag('consent', 'default', ...)` before `gtag('js', ...)`.\n * @see https://developers.google.com/tag-platform/security/guides/consent\n */\n defaultConsent: optional(gcmConsentState),\n})"
263
+ },
264
+ {
265
+ name: "GoogleAnalyticsConsent",
266
+ kind: "interface",
267
+ code: "export interface GoogleAnalyticsConsent {\n /** Send `gtag('consent','update', state)` with GCMv2 partial state. */\n update: (state: ConsentState) => void\n}"
253
268
  }
254
269
  ],
255
270
  "google-maps": [
@@ -483,6 +498,11 @@ const types = {
483
498
  name: "GoogleTagManagerOptions",
484
499
  kind: "const",
485
500
  code: "export const GoogleTagManagerOptions = object({\n /**\n * GTM container ID (format: GTM-XXXXXX)\n * @see https://developers.google.com/tag-platform/tag-manager/web#install-the-container\n */\n id: string(),\n\n /**\n * Optional dataLayer variable name\n * @default 'dataLayer'\n * @see https://developers.google.com/tag-platform/tag-manager/web/datalayer#rename_the_data_layer\n */\n l: optional(string()),\n\n /**\n * Authentication token for environment-specific container versions\n * @see https://support.google.com/tagmanager/answer/6328337\n */\n auth: optional(string()),\n\n /**\n * Preview environment name\n * @see https://support.google.com/tagmanager/answer/6328337\n */\n preview: optional(string()),\n\n /** Forces GTM cookies to take precedence when true */\n cookiesWin: optional(union([boolean(), literal('x')])),\n\n /**\n * Enables debug mode when true\n * @see https://support.google.com/tagmanager/answer/6107056\n */\n debug: optional(union([boolean(), literal('x')])),\n\n /**\n * No Personal Advertising - disables advertising features when true\n * @see https://developers.google.com/tag-platform/tag-manager/templates/consent-apis\n */\n npa: optional(union([boolean(), literal('1')])),\n\n /** Custom dataLayer name (alternative to \"l\" property) */\n dataLayer: optional(string()),\n\n /**\n * Environment name for environment-specific container\n * @see https://support.google.com/tagmanager/answer/6328337\n */\n envName: optional(string()),\n\n /** Referrer policy for analytics requests */\n authReferrerPolicy: optional(string()),\n\n /**\n * Default consent settings for GTM\n * @see https://developers.google.com/tag-platform/tag-manager/templates/consent-apis\n */\n defaultConsent: optional(record(string(), union([string(), number()]))),\n})"
501
+ },
502
+ {
503
+ name: "GoogleTagManagerConsent",
504
+ kind: "interface",
505
+ code: "export interface GoogleTagManagerConsent {\n /** Push `['consent','update', state]` onto dataLayer with GCMv2 partial state. */\n update: (state: ConsentState) => void\n}"
486
506
  }
487
507
  ],
488
508
  gravatar: [
@@ -584,12 +604,17 @@ const types = {
584
604
  {
585
605
  name: "MatomoAnalyticsOptions",
586
606
  kind: "const",
587
- code: "export const MatomoAnalyticsOptions = object({\n /**\n * The URL of your self-hosted Matomo instance.\n * Either `matomoUrl` or `cloudId` is required.\n * @example 'https://matomo.example.com'\n * @see https://developer.matomo.org/guides/tracking-javascript-guide\n */\n matomoUrl: optional(string()),\n /**\n * Your Matomo site ID.\n * @default '1'\n */\n siteId: optional(union([string(), number()])),\n /**\n * Your Matomo Cloud ID (the subdomain portion of your `*.matomo.cloud` URL).\n * Either `matomoUrl` or `cloudId` is required.\n * @example 'mysite.matomo.cloud'\n */\n cloudId: optional(string()),\n /**\n * A custom tracker URL. Overrides the default tracker endpoint derived from `matomoUrl` or `cloudId`.\n */\n trackerUrl: optional(string()),\n /**\n * Whether to track the initial page view on load.\n * @deprecated Use `watch: true` (default) for automatic page view tracking.\n */\n trackPageView: optional(boolean()),\n /**\n * Enable download and outlink tracking.\n */\n enableLinkTracking: optional(boolean()),\n /**\n * Disable all tracking cookies for cookieless analytics.\n */\n disableCookies: optional(boolean()),\n /**\n * Automatically track page views on route change.\n * @default true\n */\n watch: optional(boolean()),\n})"
607
+ code: "export const MatomoAnalyticsOptions = object({\n /**\n * The URL of your self-hosted Matomo instance.\n * Either `matomoUrl` or `cloudId` is required.\n * @example 'https://matomo.example.com'\n * @see https://developer.matomo.org/guides/tracking-javascript-guide\n */\n matomoUrl: optional(string()),\n /**\n * Your Matomo site ID.\n * @default '1'\n */\n siteId: optional(union([string(), number()])),\n /**\n * Your Matomo Cloud ID (the subdomain portion of your `*.matomo.cloud` URL).\n * Either `matomoUrl` or `cloudId` is required.\n * @example 'mysite.matomo.cloud'\n */\n cloudId: optional(string()),\n /**\n * A custom tracker URL. Overrides the default tracker endpoint derived from `matomoUrl` or `cloudId`.\n */\n trackerUrl: optional(string()),\n /**\n * Whether to track the initial page view on load.\n * @deprecated Use `watch: true` (default) for automatic page view tracking.\n */\n trackPageView: optional(boolean()),\n /**\n * Enable download and outlink tracking.\n */\n enableLinkTracking: optional(boolean()),\n /**\n * Disable all tracking cookies for cookieless analytics.\n */\n disableCookies: optional(boolean()),\n /**\n * Automatically track page views on route change.\n * @default true\n */\n watch: optional(boolean()),\n /**\n * Default tracking-consent state applied BEFORE the tracker is initialised.\n * - `'required'` — call `requireConsent` without granting (user must opt in later).\n * - `'given'` — call `requireConsent` then `setConsentGiven`.\n * - `'not-required'` — no consent gating (default Matomo behaviour).\n * @see https://developer.matomo.org/guides/tracking-consent\n */\n defaultConsent: optional(union([literal('required'), literal('given'), literal('not-required')])),\n})"
588
608
  },
589
609
  {
590
610
  name: "MatomoAnalyticsApi",
591
611
  kind: "interface",
592
- code: "interface MatomoAnalyticsApi {\n _paq: unknown[]\n}"
612
+ code: "export interface MatomoAnalyticsApi {\n _paq: unknown[]\n}"
613
+ },
614
+ {
615
+ name: "MatomoConsent",
616
+ kind: "interface",
617
+ code: "export interface MatomoConsent {\n /** Push `setConsentGiven`. Requires `defaultConsent: 'required' | 'given'` at registration to have an effect. */\n give: () => void\n /** Push `forgetConsentGiven`. Requires `defaultConsent: 'required' | 'given'` at registration to have an effect. */\n forget: () => void\n}"
593
618
  }
594
619
  ],
595
620
  "meta-pixel": [
@@ -626,19 +651,29 @@ const types = {
626
651
  {
627
652
  name: "MetaPixelOptions",
628
653
  kind: "const",
629
- code: "export const MetaPixelOptions = object({\n /**\n * Your Meta (Facebook) Pixel ID.\n * @see https://developers.facebook.com/docs/meta-pixel/get-started\n */\n id: union([string(), number()]),\n})"
654
+ code: "export const MetaPixelOptions = object({\n /**\n * Your Meta (Facebook) Pixel ID.\n * @see https://developers.facebook.com/docs/meta-pixel/get-started\n */\n id: union([string(), number()]),\n /**\n * Default consent state. `'granted'` fires `fbq('consent', 'grant')`,\n * `'denied'` fires `fbq('consent', 'revoke')`, both called before `fbq('init', id)`.\n * @see https://www.facebook.com/business/help/1151321516677370\n */\n defaultConsent: optional(union([literal('granted'), literal('denied')])),\n})"
655
+ },
656
+ {
657
+ name: "MetaPixelConsent",
658
+ kind: "interface",
659
+ code: "export interface MetaPixelConsent {\n /** Call `fbq('consent','grant')`. */\n grant: () => void\n /** Call `fbq('consent','revoke')`. */\n revoke: () => void\n}"
630
660
  }
631
661
  ],
632
662
  "mixpanel-analytics": [
633
663
  {
634
664
  name: "MixpanelAnalyticsOptions",
635
665
  kind: "const",
636
- code: "export const MixpanelAnalyticsOptions = object({\n /**\n * Your Mixpanel project token.\n * @see https://docs.mixpanel.com/docs/tracking-methods/sdks/javascript#1-initialize-the-library\n */\n token: string(),\n})"
666
+ code: "export const MixpanelAnalyticsOptions = object({\n /**\n * Your Mixpanel project token.\n * @see https://docs.mixpanel.com/docs/tracking-methods/sdks/javascript#1-initialize-the-library\n */\n token: string(),\n /**\n * Default tracking-consent state for Mixpanel.\n * - `'opt-out'`: passed as `opt_out_tracking_by_default: true` to `mixpanel.init`, so tracking is suppressed from the first call.\n * - `'opt-in'`: queued via `mixpanel.push(['opt_in_tracking'])` so the real SDK runs it immediately after load.\n * @see https://docs.mixpanel.com/docs/privacy/opt-out-of-tracking\n */\n defaultConsent: optional(union([literal('opt-in'), literal('opt-out')])),\n})"
637
667
  },
638
668
  {
639
669
  name: "MixpanelAnalyticsApi",
640
670
  kind: "interface",
641
- code: "export interface MixpanelAnalyticsApi {\n mixpanel: {\n track: (event: string, properties?: Record<string, any>) => void\n identify: (distinctId: string) => void\n reset: () => void\n people: {\n set: (properties: Record<string, any>) => void\n }\n register: (properties: Record<string, any>) => void\n init: (token: string, config?: Record<string, any>) => void\n }\n}"
671
+ code: "export interface MixpanelAnalyticsApi {\n mixpanel: {\n track: (event: string, properties?: Record<string, any>) => void\n identify: (distinctId: string) => void\n reset: () => void\n people: {\n set: (properties: Record<string, any>) => void\n }\n register: (properties: Record<string, any>) => void\n init: (token: string, config?: Record<string, any>) => void\n /** Opt the user in to tracking. Available after the real SDK loads. */\n opt_in_tracking?: () => void\n /** Opt the user out of tracking. Available after the real SDK loads. */\n opt_out_tracking?: () => void\n }\n}"
672
+ },
673
+ {
674
+ name: "MixpanelConsent",
675
+ kind: "interface",
676
+ code: "export interface MixpanelConsent {\n /** Call `mixpanel.opt_in_tracking()`. */\n optIn: () => void\n /** Call `mixpanel.opt_out_tracking()`. For boot-time opt-out, use `defaultConsent: 'opt-out'` instead. */\n optOut: () => void\n}"
642
677
  }
643
678
  ],
644
679
  npm: [
@@ -721,12 +756,17 @@ const types = {
721
756
  {
722
757
  name: "PostHogOptions",
723
758
  kind: "const",
724
- code: "export const PostHogOptions = object({\n /**\n * Your PostHog project API key.\n * @see https://posthog.com/docs/libraries/js#usage\n */\n apiKey: string(),\n /**\n * Your PostHog data region.\n * @default 'us'\n * @see https://posthog.com/docs/libraries/js#config\n */\n region: optional(union([literal('us'), literal('eu')])),\n /**\n * Custom API host URL. Overrides the default derived from `region`.\n * Useful for self-hosted instances or reverse proxies.\n */\n apiHost: optional(string()),\n /**\n * Enable autocapture of clicks, form submissions, and page views.\n * @default true\n */\n autocapture: optional(boolean()),\n /**\n * Capture page views automatically. Set to `'history_change'` to only capture on history changes.\n * @default true\n */\n capturePageview: optional(union([boolean(), literal('history_change')])),\n /**\n * Capture page leave events automatically.\n * @default true\n */\n capturePageleave: optional(boolean()),\n /**\n * Disable session recording.\n */\n disableSessionRecording: optional(boolean()),\n /**\n * Additional PostHog configuration options passed directly to `posthog.init()`.\n * @see https://posthog.com/docs/libraries/js#config\n */\n config: optional(record(string(), any())),\n})"
759
+ code: "export const PostHogOptions = object({\n /**\n * Your PostHog project API key.\n * @see https://posthog.com/docs/libraries/js#usage\n */\n apiKey: string(),\n /**\n * Your PostHog data region.\n * @default 'us'\n * @see https://posthog.com/docs/libraries/js#config\n */\n region: optional(union([literal('us'), literal('eu')])),\n /**\n * Custom API host URL. Overrides the default derived from `region`.\n * Useful for self-hosted instances or reverse proxies.\n */\n apiHost: optional(string()),\n /**\n * Enable autocapture of clicks, form submissions, and page views.\n * @default true\n */\n autocapture: optional(boolean()),\n /**\n * Capture page views automatically. Set to `'history_change'` to only capture on history changes.\n * @default true\n */\n capturePageview: optional(union([boolean(), literal('history_change')])),\n /**\n * Capture page leave events automatically.\n * @default true\n */\n capturePageleave: optional(boolean()),\n /**\n * Disable session recording.\n */\n disableSessionRecording: optional(boolean()),\n /**\n * Additional PostHog configuration options passed directly to `posthog.init()`.\n * @see https://posthog.com/docs/libraries/js#config\n */\n config: optional(record(string(), any())),\n /**\n * Default capture-consent state for PostHog.\n * - `'opt-out'`: passed as `opt_out_capturing_by_default: true` to `posthog.init`, so capturing is suppressed from the first event.\n * - `'opt-in'`: applied after `posthog.init` via `posthog.opt_in_capturing()` on the returned instance.\n * @see https://posthog.com/docs/privacy/opting-out\n */\n defaultConsent: optional(union([literal('opt-in'), literal('opt-out')])),\n})"
725
760
  },
726
761
  {
727
762
  name: "PostHogApi",
728
763
  kind: "interface",
729
764
  code: "export interface PostHogApi {\n posthog: PostHog\n}"
765
+ },
766
+ {
767
+ name: "PostHogConsent",
768
+ kind: "interface",
769
+ code: "export interface PostHogConsent {\n /** Call `posthog.opt_in_capturing()`. */\n optIn: () => void\n /** Call `posthog.opt_out_capturing()`. For boot-time opt-out, use `defaultConsent: 'opt-out'` instead. */\n optOut: () => void\n}"
730
770
  }
731
771
  ],
732
772
  "reddit-pixel": [
@@ -873,12 +913,17 @@ const types = {
873
913
  {
874
914
  name: "TikTokPixelApi",
875
915
  kind: "interface",
876
- code: "export interface TikTokPixelApi {\n ttq: TtqFns & {\n push: TtqFns\n loaded: boolean\n queue: any[]\n }\n}"
916
+ code: "export interface TikTokPixelApi {\n ttq: TtqFns & {\n push: TtqFns\n loaded: boolean\n queue: any[]\n /** Opt user in to tracking. Queued before the script loads; live once `events.js` binds. */\n grantConsent: () => void\n /** Opt user out of tracking. Queued before the script loads; live once `events.js` binds. */\n revokeConsent: () => void\n /** Defer consent until an explicit grant/revoke. Queued before the script loads; live once `events.js` binds. */\n holdConsent: () => void\n }\n}"
877
917
  },
878
918
  {
879
919
  name: "TikTokPixelOptions",
880
920
  kind: "const",
881
- code: "export const TikTokPixelOptions = object({\n /**\n * Your TikTok Pixel ID.\n * @see https://ads.tiktok.com/help/article/get-started-pixel\n */\n id: string(),\n /**\n * Whether to automatically track a page view on initialization.\n * @default true\n */\n trackPageView: optional(boolean()),\n})"
921
+ code: "export const TikTokPixelOptions = object({\n /**\n * Your TikTok Pixel ID.\n * @see https://ads.tiktok.com/help/article/get-started-pixel\n */\n id: string(),\n /**\n * Whether to automatically track a page view on initialization.\n * @default true\n */\n trackPageView: optional(boolean()),\n /**\n * Default consent state, applied before `ttq('init', id)`.\n * - `'granted'` fires `ttq.grantConsent()`\n * - `'denied'` fires `ttq.revokeConsent()`\n * - `'hold'` fires `ttq.holdConsent()` to defer until an explicit update\n * @see https://business-api.tiktok.com/portal/docs?id=1739585600931842\n */\n defaultConsent: optional(union([literal('granted'), literal('denied'), literal('hold')])),\n})"
922
+ },
923
+ {
924
+ name: "TikTokPixelConsent",
925
+ kind: "interface",
926
+ code: "export interface TikTokPixelConsent {\n /** Call `ttq.grantConsent()`. */\n grant: () => void\n /** Call `ttq.revokeConsent()`. */\n revoke: () => void\n /** Call `ttq.holdConsent()` to defer the decision. */\n hold: () => void\n}"
882
927
  }
883
928
  ],
884
929
  "umami-analytics": [
@@ -1065,6 +1110,12 @@ const schemaFields = {
1065
1110
  type: "string",
1066
1111
  required: true,
1067
1112
  description: "The Clarity token."
1113
+ },
1114
+ {
1115
+ name: "defaultConsent",
1116
+ type: "boolean | Record<string, string>",
1117
+ required: false,
1118
+ description: "Default consent state applied before Clarity starts. - `boolean` - enable / disable cookies. - `Record<string, string>` - advanced consent vector (see Clarity docs)."
1068
1119
  }
1069
1120
  ],
1070
1121
  CloudflareWebAnalyticsOptions: [
@@ -1383,6 +1434,12 @@ const schemaFields = {
1383
1434
  required: false,
1384
1435
  description: "Global name for the dataLayer variable.",
1385
1436
  defaultValue: "'dataLayer'"
1437
+ },
1438
+ {
1439
+ name: "defaultConsent",
1440
+ type: "unknown",
1441
+ required: false,
1442
+ description: "Default GCMv2 consent state fired as `gtag('consent', 'default', ...)` before `gtag('js', ...)`."
1386
1443
  }
1387
1444
  ],
1388
1445
  GoogleMapsOptions: [
@@ -1714,6 +1771,12 @@ const schemaFields = {
1714
1771
  required: false,
1715
1772
  description: "Automatically track page views on route change.",
1716
1773
  defaultValue: "true"
1774
+ },
1775
+ {
1776
+ name: "defaultConsent",
1777
+ type: "'required' | 'given' | 'not-required'",
1778
+ required: false,
1779
+ description: "Default tracking-consent state applied BEFORE the tracker is initialised. - `'required'` — call `requireConsent` without granting (user must opt in later). - `'given'` — call `requireConsent` then `setConsentGiven`. - `'not-required'` — no consent gating (default Matomo behaviour)."
1717
1780
  }
1718
1781
  ],
1719
1782
  MetaPixelOptions: [
@@ -1722,6 +1785,12 @@ const schemaFields = {
1722
1785
  type: "string | number",
1723
1786
  required: true,
1724
1787
  description: "Your Meta (Facebook) Pixel ID."
1788
+ },
1789
+ {
1790
+ name: "defaultConsent",
1791
+ type: "'granted' | 'denied'",
1792
+ required: false,
1793
+ description: "Default consent state. `'granted'` fires `fbq('consent', 'grant')`, `'denied'` fires `fbq('consent', 'revoke')`, both called before `fbq('init', id)`."
1725
1794
  }
1726
1795
  ],
1727
1796
  NpmOptions: [
@@ -1804,6 +1873,12 @@ const schemaFields = {
1804
1873
  type: "Record<string, any>",
1805
1874
  required: false,
1806
1875
  description: "Additional PostHog configuration options passed directly to `posthog.init()`."
1876
+ },
1877
+ {
1878
+ name: "defaultConsent",
1879
+ type: "'opt-in' | 'opt-out'",
1880
+ required: false,
1881
+ description: "Default capture-consent state for PostHog. - `'opt-out'`: passed as `opt_out_capturing_by_default: true` to `posthog.init`, so capturing is suppressed from the first event. - `'opt-in'`: applied after `posthog.init` via `posthog.opt_in_capturing()` on the returned instance."
1807
1882
  }
1808
1883
  ],
1809
1884
  RedditPixelOptions: [
@@ -1902,6 +1977,12 @@ const schemaFields = {
1902
1977
  type: "string",
1903
1978
  required: true,
1904
1979
  description: "Your Mixpanel project token."
1980
+ },
1981
+ {
1982
+ name: "defaultConsent",
1983
+ type: "'opt-in' | 'opt-out'",
1984
+ required: false,
1985
+ description: "Default tracking-consent state for Mixpanel. - `'opt-out'`: passed as `opt_out_tracking_by_default: true` to `mixpanel.init`, so tracking is suppressed from the first call. - `'opt-in'`: queued via `mixpanel.push(['opt_in_tracking'])` so the real SDK runs it immediately after load."
1905
1986
  }
1906
1987
  ],
1907
1988
  BingUetOptions: [
@@ -1917,6 +1998,12 @@ const schemaFields = {
1917
1998
  required: false,
1918
1999
  description: "Enable automatic SPA page tracking.",
1919
2000
  defaultValue: "true"
2001
+ },
2002
+ {
2003
+ name: "defaultConsent",
2004
+ type: "object",
2005
+ required: false,
2006
+ description: "Default consent state fired as `uetq.push('consent', 'default', ...)` before UET init."
1920
2007
  }
1921
2008
  ],
1922
2009
  SegmentOptions: [
@@ -2044,6 +2131,12 @@ const schemaFields = {
2044
2131
  required: false,
2045
2132
  description: "Whether to automatically track a page view on initialization.",
2046
2133
  defaultValue: "true"
2134
+ },
2135
+ {
2136
+ name: "defaultConsent",
2137
+ type: "'granted' | 'denied' | 'hold'",
2138
+ required: false,
2139
+ description: "Default consent state, applied before `ttq('init', id)`. - `'granted'` fires `ttq.grantConsent()` - `'denied'` fires `ttq.revokeConsent()` - `'hold'` fires `ttq.holdConsent()` to defer until an explicit update"
2047
2140
  }
2048
2141
  ],
2049
2142
  UmamiAnalyticsOptions: [
package/dist/types.d.mts CHANGED
@@ -6,6 +6,6 @@ declare module '@nuxt/schema' {
6
6
 
7
7
  export { type FirstPartyPrivacy } from '../dist/runtime/types.js'
8
8
 
9
- export { type applyAutoInject, default, type isProxyDisabled, type resolveProxySecret } from './module.mjs'
9
+ export { type applyAutoInject, default, type isProxyDisabled, type resolveConfiguredProxyDomains, type resolveProxySecret } from './module.mjs'
10
10
 
11
11
  export { type ModuleHooks, type ModuleOptions, type ResolvedProxySecret } from './module.mjs'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nuxt/scripts",
3
3
  "type": "module",
4
- "version": "1.0.0-rc.9",
4
+ "version": "1.0.1",
5
5
  "description": "Load third-party scripts with better performance, privacy and DX in Nuxt Apps.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -112,12 +112,12 @@
112
112
  "magic-string": "^0.30.21",
113
113
  "ofetch": "^1.5.1",
114
114
  "ohash": "^2.0.11",
115
- "oxc-parser": "^0.125.0",
115
+ "oxc-parser": "^0.126.0",
116
116
  "oxc-walker": "^0.7.0",
117
117
  "pathe": "^2.0.3",
118
118
  "pkg-types": "^2.3.0",
119
119
  "sirv": "^3.0.2",
120
- "std-env": "^4.0.0",
120
+ "std-env": "^4.1.0",
121
121
  "ufo": "^1.6.3",
122
122
  "ultrahtml": "^1.6.0",
123
123
  "unplugin": "^3.0.0",
@@ -1 +0,0 @@
1
- import{f as j,o as s,c as n,n as k,h as o,a as e,t as r,x as $,_ as F,b as y,j as D,d as v,m as x,y as A,z as K,F as _,l as G,w as C,r as S,g as z,A as M,B as Z,C as X,D as q,E as tt,G as W,H as P,I as et,J,K as R,L as st,M as Q,N as at,O as ot,P as I,Q as nt,i as lt,R as V,S as rt,T as it}from"./DTxy5P8N.js";const ct={class:"capitalize"},dt=j({__name:"ScriptStatus",props:{status:{},error:{}},setup(l){const p=$(()=>l.error?l.error==="TypeError: Failed to fetch"?"CORS Error":l.error:l.status||"unknown"),u=$(()=>{if(l.error||l.status==="error")return"status-error";switch(l.status){case"loaded":return"status-loaded";case"loading":return"status-loading";case"awaitingLoad":return"status-awaiting";case"validation-failed":return"status-validation";default:return"status-unknown"}});return(g,h)=>(s(),n("div",{class:k(["script-status",o(u)])},[h[0]||(h[0]=e("span",{class:"script-status-dot"},null,-1)),e("span",ct,r(o(p)),1)],2))}}),ut=Object.assign(F(dt,[["__scopeId","data-v-5cf865ba"]]),{__name:"ScriptStatus"}),mt={key:0,class:"script-metric"},pt=j({__name:"ScriptSize",props:{size:{}},setup(l){return(p,u)=>{const g=D;return l.size?(s(),n("span",mt,[y(g,{name:"i-carbon-meter",class:"text-[10px] opacity-50"}),v(" "+r(l.size),1)])):x("",!0)}}}),_t=Object.assign(F(pt,[["__scopeId","data-v-b147450b"]]),{__name:"ScriptSize"}),xt={key:0,class:"script-metric"},ft=j({__name:"ScriptLoadTime",props:{loadTime:{}},setup(l){return(p,u)=>{const g=D;return l.loadTime?(s(),n("span",xt,[y(g,{name:"i-carbon-timer",class:"text-[10px] opacity-50"}),v(" "+r(l.loadTime),1)])):x("",!0)}}}),yt=Object.assign(F(ft,[["__scopeId","data-v-c6837c50"]]),{__name:"ScriptLoadTime"}),vt={key:0,class:"panel-grids flex flex-col items-center justify-center py-8 gap-1.5 rounded-b-xl"},gt={key:1,class:"waterfall-container"},bt={class:"waterfall-stats"},ht={class:"waterfall-stat"},kt={class:"waterfall-stat-value"},wt={class:"waterfall-stat"},$t={class:"waterfall-stat-value"},St={class:"waterfall-stat"},Lt={class:"waterfall-stat-value"},Ct={class:"waterfall-proxied-badge"},Tt={class:"waterfall-stat-value"},jt={class:"text-xs space-y-1 max-w-60"},zt={class:"opacity-70"},Bt={class:"px-1 py-px rounded bg-white/10 text-[10px]"},Pt={key:0,class:"opacity-70"},Rt={class:"flex items-center gap-1"},Ft={class:"text-xs space-y-0.5"},Mt={class:"font-mono font-semibold"},It={class:"opacity-70"},Dt={key:0,class:"opacity-60"},Ot={key:1,class:"text-emerald-400"},Nt={class:"waterfall-table"},Ut={class:"waterfall-legend"},Ht={class:"waterfall-rows"},Et={class:"waterfall-url"},At={class:"waterfall-bar-track"},Kt={class:"waterfall-duration"},Wt={class:"text-xs space-y-1.5 max-w-80"},Vt={class:"font-mono text-[11px] break-all opacity-90"},Jt={class:"flex items-center gap-2 opacity-70"},Qt={class:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5"},Gt={class:"flex items-center gap-1 opacity-60"},Xt={class:"tabular-nums text-right"},Yt={key:0,class:"flex items-center gap-1 text-emerald-400"},Zt=j({__name:"NetworkWaterfall",props:{requests:{},domains:{default:()=>[]},proxyRoutes:{default:()=>[]},privacyLevel:{},proxyPrefix:{},isFirstParty:{type:Boolean,default:!1}},setup(l){const p=[{key:"dns",label:"DNS",color:"oklch(70% 0.15 165)"},{key:"connect",label:"Connect",color:"oklch(72% 0.14 75)"},{key:"ssl",label:"SSL",color:"oklch(65% 0.15 300)"},{key:"ttfb",label:"TTFB",color:"oklch(65% 0.13 250)"},{key:"download",label:"Download",color:"oklch(72% 0.12 200)"}],u=$(()=>[...l.requests].sort((i,t)=>i.startTime-t.startTime)),g=$(()=>{if(!u.value.length)return{min:0,max:1};const i=u.value[0].startTime,t=Math.max(...u.value.map(d=>d.startTime+d.duration));return{min:i,max:t||i+1}}),h=$(()=>l.requests.reduce((i,t)=>i+t.transferSize,0)),B=$(()=>g.value.max-g.value.min),b=$(()=>l.requests.filter(i=>i.isProxied).length),m=$(()=>{const i=new Map;for(const t of l.requests){const d=T(t.url),f=i.get(d)||{count:0,transfer:0,proxied:!1};f.count++,f.transfer+=t.transferSize,t.isProxied&&(f.proxied=!0),i.set(d,f)}return[...i.entries()].sort((t,d)=>d[1].transfer-t[1].transfer).map(([t,d])=>({domain:t,...d,isKnown:l.domains.includes(t),proxyRoute:l.proxyRoutes.find(f=>f.target.includes(t))}))}),w=/\/_scripts\/p\/([^/]+)/;function T(i){try{return new URL(i).hostname}catch{return i.match(w)?.[1]||"localhost"}}function O(i){const{min:t,max:d}=g.value,f=d-t;return{left:`${(i.startTime-t)/f*100}%`,width:`${Math.max(i.duration/f*100,.5)}%`}}function N(i,t){if(i.duration===0)return"0%";const d=i[t.key];return`${Math.max(d/i.duration*100,d>0?2:0)}%`}function U(i){try{const t=new URL(i),d=t.pathname+t.search;return d.length>50?`${d.slice(0,47)}...`:d}catch{return i.length>50?`${i.slice(0,47)}...`:i}}function H(i){return{script:"Script",xmlhttprequest:"XHR",fetch:"Fetch",img:"Image",css:"Stylesheet",beacon:"Beacon"}[i]||i}function E(i){return{script:"i-carbon-code",xmlhttprequest:"i-carbon-send-alt",fetch:"i-carbon-send-alt",img:"i-carbon-image",css:"i-carbon-paint-brush",beacon:"i-carbon-satellite-radar"}[i]||"i-carbon-document"}function a(i){return i.transferSize===0&&i.decodedBodySize>0?304:200}return(i,t)=>{const d=D,f=G;return l.requests.length?(s(),n("div",gt,[e("div",bt,[e("span",ht,[e("span",kt,r(l.requests.length),1),t[1]||(t[1]=e("span",{class:"waterfall-stat-label"},"req",-1))]),t[7]||(t[7]=e("span",{class:"waterfall-sep"},null,-1)),e("span",wt,[e("span",$t,r(o(A)(o(h))),1)]),t[8]||(t[8]=e("span",{class:"waterfall-sep"},null,-1)),e("span",St,[e("span",Lt,r(o(K)(Math.round(o(B)))),1)]),l.isFirstParty&&o(b)>0?(s(),n(_,{key:0},[t[5]||(t[5]=e("span",{class:"waterfall-sep"},null,-1)),y(f,null,{content:C(()=>[e("div",jt,[t[4]||(t[4]=e("div",{class:"font-semibold"}," First-Party Proxy ",-1)),e("div",zt,[v(r(o(b))+" request"+r(o(b)!==1?"s":"")+" routed through ",1),e("code",Bt,r(l.proxyPrefix||"/_scripts/p"),1)]),l.privacyLevel?(s(),n("div",Pt,[t[3]||(t[3]=v(" Privacy: ",-1)),e("span",{class:k(l.privacyLevel==="full"?"text-emerald-400":l.privacyLevel==="partial"?"text-amber-400":"")},r(l.privacyLevel),3)])):x("",!0)])]),default:C(()=>[e("span",Ct,[y(d,{name:"i-carbon-security",class:"text-[10px]"}),e("span",Tt,r(o(b))+"/"+r(l.requests.length),1),t[2]||(t[2]=v(" proxied ",-1))])]),_:1})],64)):x("",!0),o(m).length>1?(s(),n(_,{key:1},[t[6]||(t[6]=e("span",{class:"waterfall-sep"},null,-1)),e("div",Rt,[(s(!0),n(_,null,S(o(m),c=>(s(),z(f,{key:c.domain},{content:C(()=>[e("div",Ft,[e("div",Mt,r(c.domain),1),e("div",It,r(c.count)+" req · "+r(o(A)(c.transfer)),1),c.proxyRoute?(s(),n("div",Dt,r(c.proxyRoute.target)+" → "+r(c.proxyRoute.local),1)):x("",!0),c.proxied?(s(),n("div",Ot," Proxied through first-party ")):x("",!0)])]),default:C(()=>[e("span",{class:k(["domain-pill",c.proxied?"domain-pill-proxied":""])},[c.proxied?(s(),z(d,{key:0,name:"i-carbon-security",class:"text-[8px]"})):x("",!0),v(" "+r(c.domain),1)],2)]),_:2},1024))),128))])],64)):x("",!0)]),e("div",Nt,[e("div",Ut,[(s(),n(_,null,S(p,c=>e("div",{key:c.key,class:"waterfall-legend-item"},[e("span",{class:"waterfall-legend-dot",style:M({background:c.color})},null,4),v(" "+r(c.label),1)])),64))]),e("div",Ht,[(s(!0),n(_,null,S(o(u),(c,Y)=>(s(),z(f,{key:Y},{content:C(()=>[e("div",Wt,[e("div",Vt,r(c.url),1),e("div",Jt,[e("span",null,r(H(c.initiatorType)),1),t[10]||(t[10]=e("span",{class:"opacity-30"},"·",-1)),e("span",null,r(o(K)(Math.round(c.duration))),1),c.transferSize>0?(s(),n(_,{key:0},[t[9]||(t[9]=e("span",{class:"opacity-30"},"·",-1)),e("span",null,r(o(A)(c.transferSize)),1)],64)):x("",!0)]),e("div",Qt,[(s(),n(_,null,S(p,L=>(s(),n(_,{key:L.key},[c[L.key]>.1?(s(),n(_,{key:0},[e("div",Gt,[e("span",{class:"w-1.5 h-1.5 rounded-sm inline-block",style:M({background:L.color})},null,4),v(" "+r(L.label),1)]),e("div",Xt,r(c[L.key].toFixed(1))+"ms ",1)],64)):x("",!0)],64))),64))]),c.isProxied?(s(),n("div",Yt,[y(d,{name:"i-carbon-security",class:"text-[10px]"}),t[11]||(t[11]=v(" Proxied through first-party ",-1))])):x("",!0)])]),default:C(()=>[e("div",{class:k(["waterfall-row",c.isProxied?"waterfall-row-proxied":""])},[e("div",{class:k(["waterfall-status",a(c)===304?"waterfall-status-304":"waterfall-status-200"])},r(a(c)),3),y(d,{name:c.isProxied?"i-carbon-security":E(c.initiatorType),class:k(["waterfall-row-icon",c.isProxied?"waterfall-row-icon-proxied":""])},null,8,["name","class"]),e("div",Et,r(U(c.url)),1),e("div",At,[e("div",{class:"waterfall-bar",style:M(O(c))},[(s(),n(_,null,S(p,L=>e("div",{key:L.key,style:M({width:N(c,L),background:L.color}),class:"h-full"},null,4)),64))],4)]),e("div",Kt,r(o(K)(Math.round(c.duration))),1)],2)]),_:2},1024))),128))])])])):(s(),n("div",vt,[y(d,{name:"i-carbon-network-4",class:"text-xl text-(--color-text-subtle)"}),t[0]||(t[0]=e("p",{class:"text-xs text-(--color-text-subtle)"}," Requests appear as the script loads ",-1))]))}}}),qt=Object.assign(F(Zt,[["__scopeId","data-v-a64c8d9a"]]),{__name:"NetworkWaterfall"});function te(l=2e3){const{copy:p,copied:u}=Z({legacy:!0,copiedDuring:l});return{copy:p,copied:u}}const ee=j({__name:"DevtoolsCopyButton",props:{text:{}},setup(l){const{copy:p,copied:u}=te();return(g,h)=>{const B=X,b=G;return s(),z(b,{text:o(u)?"Copied!":"Copy"},{default:C(()=>[y(B,{icon:o(u)?"carbon:checkmark":"carbon:copy","aria-label":o(u)?"Copied":"Copy to clipboard",class:k(o(u)?"text-[var(--seo-green)]":""),onClick:h[0]||(h[0]=m=>o(p)(l.text))},null,8,["icon","aria-label","class"])]),_:1},8,["text"])}}}),se=Object.assign(ee,{__name:"DevtoolsCopyButton"}),ae=["innerHTML"],oe=j({__name:"OCodeBlock",props:{code:{},lang:{},lines:{type:Boolean,default:!1},transformRendered:{type:Function}},setup(l){const p=q(()=>l.code,l.lang),u=$(()=>l.transformRendered?l.transformRendered(p.value||""):p.value);return(g,h)=>(s(),n("pre",{class:k(["code-block p-5",l.lines?"code-block-lines":""]),innerHTML:o(u)},null,10,ae))}}),ne=Object.assign(oe,{__name:"OCodeBlock"}),le={class:"devtools-snippet"},re={key:0,class:"devtools-snippet-header"},ie={class:"devtools-snippet-label"},ce=j({__name:"DevtoolsSnippet",props:{label:{},code:{},lang:{default:"js"}},setup(l){return(p,u)=>{const g=se,h=ne;return s(),n("div",le,[l.label||p.$slots.header?(s(),n("div",re,[tt(p.$slots,"header",{},()=>[e("code",ie,r(l.label),1)],!0),y(g,{text:l.code},null,8,["text"])])):x("",!0),y(h,{code:l.code,lang:l.lang,class:"devtools-snippet-block"},null,8,["code","lang"])])}}}),de=Object.assign(F(ce,[["__scopeId","data-v-265ccc31"]]),{__name:"DevtoolsSnippet"}),ue={class:"py-1"},me={key:0,class:"panel-grids rounded-xl flex flex-col items-center justify-center py-16 gap-3"},pe={class:"w-12 h-12 rounded-xl bg-(--color-surface-elevated) border border-(--color-border) flex items-center justify-center"},_e={class:"filter-bar"},xe=["onClick"],fe={class:"filter-chip-count"},ye={class:"stagger-children space-y-3"},ve={class:"px-4 py-3 flex items-center justify-between gap-3"},ge={class:"flex items-center gap-2.5 min-w-0"},be={class:"w-7 h-7 rounded-lg bg-(--color-surface-sunken) border border-(--color-border-subtle) flex items-center justify-center flex-shrink-0 overflow-hidden"},he=["src"],ke=["innerHTML"],we=["src"],$e={class:"min-w-0"},Se={class:"flex items-center gap-2"},Le=["href","title"],Ce=["href"],Te={class:"px-4 pb-3 flex items-center gap-2 flex-wrap"},je={key:0,class:"status-enabled"},ze={key:1,class:"inline-flex items-center gap-1 text-[11px] text-(--color-text-subtle) font-mono"},Be={class:"border-t border-(--color-border-subtle)"},Pe={class:"flex items-center border-b border-(--color-border-subtle)"},Re=["onClick"],Fe={key:0,class:"text-[9px] px-1 py-px rounded-full bg-(--color-surface-sunken) tabular-nums font-mono"},Me={key:0,class:"p-3"},Ie={key:0,class:"text-xs text-(--color-text-subtle) py-2 text-center"},De={key:1,class:"event-timeline"},Oe={class:"event-time"},Ne={key:0,class:"flex items-center gap-2 min-w-0"},Ue={class:"text-[11px] text-(--color-text-subtle) truncate"},He={key:1,class:"event-fn"},Ee={key:1},Ae={key:2,class:"p-3"},Ke=j({__name:"index",setup(l){const p=[{label:"Events",value:"events",icon:"i-carbon-list"},{label:"Network",value:"network",icon:"i-carbon-network-4"},{label:"API",value:"api",icon:"i-carbon-code"}],u=it("all"),g=$(()=>{const b=Object.values(W.value||{}),m=b.filter(T=>R(T)!=="awaitingLoad").length,w=b.filter(T=>R(T)==="awaitingLoad").length;return{total:b.length,active:m,awaiting:w}}),h=$(()=>{const b=W.value||{};return u.value==="all"?b:Object.fromEntries(Object.entries(b).filter(([,m])=>{const w=R(m);return u.value==="active"?w!=="awaitingLoad":w==="awaitingLoad"}))});function B(b){switch(b){case"loaded":return"status-badge-loaded";case"loading":return"status-badge-loading";case"awaitingLoad":return"status-badge-awaiting";case"removed":case"error":return"status-badge-error";case"validation-failed":return"status-badge-validation";default:return"status-badge-default"}}return(b,m)=>{const w=D,T=X,O=ut,N=_t,U=yt,H=qt,E=de;return s(),n("div",ue,[Object.keys(o(W)||{}).length?(s(),n(_,{key:1},[e("div",_e,[(s(!0),n(_,null,S([{key:"all",label:"All",count:o(g).total},{key:"active",label:"Active",count:o(g).active},{key:"awaiting",label:"Awaiting",count:o(g).awaiting}],a=>(s(),n("button",{key:a.key,class:k(["filter-chip",o(u)===a.key?"filter-chip-active":""]),onClick:i=>u.value=a.key},[v(r(a.label)+" ",1),e("span",fe,r(a.count),1)],10,xe))),128))]),e("div",ye,[(s(!0),n(_,null,S(o(h),(a,i)=>(s(),n("div",{key:i,class:"card overflow-hidden"},[e("div",ve,[e("div",ge,[e("div",be,[o(P)(a)&&typeof o(P)(a)=="string"&&o(P)(a).startsWith("http")?(s(),n("img",{key:0,class:"w-5 h-5 object-contain",src:o(P)(a),alt:""},null,8,he)):o(P)(a)?(s(),n("div",{key:1,class:"w-5 h-5 flex items-center [&>svg]:max-w-5 [&>svg]:max-h-5",innerHTML:o(P)(a)},null,8,ke)):a.src&&!a.src.startsWith("/")?(s(),n("img",{key:2,src:`https://www.google.com/s2/favicons?domain=${o(et)(a.src)}`,class:"w-4 h-4 rounded-sm",alt:""},null,8,we)):(s(),z(w,{key:3,name:"i-carbon-script",class:"text-sm text-(--color-text-subtle)"}))]),e("div",$e,[e("div",Se,[e("a",{href:a.src,target:"_blank",class:"text-sm font-semibold tracking-tight truncate link-external",title:a.src},r(a.registry?.label||a.key||a.src),9,Le),a.docs?(s(),n("a",{key:0,href:a.docs,target:"_blank",class:"text-[10px] font-medium text-(--color-text-subtle) hover:text-(--color-text-muted) transition-colors"}," docs ",8,Ce)):x("",!0)])])]),o(J)(a)&&o(R)(a)==="awaitingLoad"?(s(),z(T,{key:0,size:"xs",color:"primary",variant:"soft",icon:"i-carbon-play-filled-alt",onClick:t=>a.$script.load()},{default:C(()=>[...m[2]||(m[2]=[v(" Load ",-1)])]),_:1},8,["onClick"])):o(J)(a)&&o(R)(a)==="loaded"?(s(),z(T,{key:1,size:"xs",color:"neutral",variant:"ghost",icon:"i-carbon-close",onClick:t=>a.$script.remove()},{default:C(()=>[...m[3]||(m[3]=[v(" Remove ",-1)])]),_:1},8,["onClick"])):x("",!0)]),e("div",Te,[y(O,{status:o(R)(a),error:o(st)[a.src]},null,8,["status","error"]),o(Q)(a.registryKey)?(s(),n("span",je,[y(w,{name:"i-carbon-security",class:"text-xs"}),m[4]||(m[4]=v(" First-Party ",-1))])):x("",!0),y(N,{size:o(at)[a.src]},null,8,["size"]),y(U,{"load-time":a.loadTime},null,8,["load-time"]),a.loadedFrom&&a.loadedFrom!=="unknown"?(s(),n("span",ze,[m[5]||(m[5]=e("svg",{xmlns:"http://www.w3.org/2000/svg",height:"10",viewBox:"0 0 256 221",class:"opacity-60"},[e("path",{fill:"#41B883",d:"M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0z"}),e("path",{fill:"#41B883",d:"m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0z"}),e("path",{fill:"#35495E",d:"M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0z"})],-1)),v(" "+r(a.loadedFrom),1)])):x("",!0),(s(!0),n(_,null,S(Object.keys(a.registryMeta||{}),t=>(s(),n("span",{key:t,class:"text-[11px] text-(--color-text-subtle) font-mono"},r(t)+": "+r(a.registryMeta[t]),1))),128))]),e("div",Be,[e("div",Pe,[(s(),n(_,null,S(p,t=>e("button",{key:t.value,class:k(["sub-tab",o(I)(a.src)===t.value?"sub-tab-active":""]),onClick:d=>o(ot)(a.src,t.value)},[y(w,{name:t.icon,class:"text-xs"},null,8,["name"]),v(" "+r(t.label)+" ",1),t.value==="network"&&a.networkRequests?.length?(s(),n("span",Fe,r(a.networkRequests.length),1)):x("",!0)],10,Re)),64))]),o(I)(a.src)==="events"?(s(),n("div",Me,[a.events?.length?(s(),n("div",De,[(s(!0),n(_,null,S(a.events,(t,d)=>(s(),n("div",{key:d,class:"event-row"},[e("div",Oe,r(o(nt)(t.at)),1),t.type==="status"?(s(),n(_,{key:0},[t.status==="validation-failed"?(s(),n("div",Ne,[e("span",{class:k(["event-badge",B(t.status)])},r(t.status),3),e("span",Ue,r(t.args.issues.map(f=>`${f.path?.map(c=>c.key).join(".")}: ${f.message}`).join(", ")),1)])):(s(),n("span",{key:1,class:k(["event-badge",B(t.status)])},r(t.status),3))],64)):t.type==="fn-call"?(s(),n("span",He,[t.args?(s(),n(_,{key:0},[v(r(`${t.fn}(${t.args?.map(f=>JSON.stringify(f,null,2)).join(", ")||""})`),1)],64)):(s(),n(_,{key:1},[m[6]||(m[6]=e("span",{class:"opacity-40"},"QUEUED",-1)),v(" "+r(t.fn),1)],64))])):x("",!0)]))),128))])):(s(),n("div",Ie," No events recorded "))])):o(I)(a.src)==="network"?(s(),n("div",Ee,[y(H,{requests:a.networkRequests||[],domains:o(V)(a.registryKey)?.domains,"proxy-routes":o(V)(a.registryKey)?.routes,"privacy-level":o(V)(a.registryKey)?.privacyLevel,"proxy-prefix":o(lt)?.proxyPrefix,"is-first-party":o(Q)(a.registryKey)},null,8,["requests","domains","proxy-routes","privacy-level","proxy-prefix","is-first-party"])])):o(I)(a.src)==="api"?(s(),n("div",Ae,[y(E,{code:o(rt)(a.$script?.instance),lang:"js"},null,8,["code"])])):x("",!0)])]))),128))])],64)):(s(),n("div",me,[e("div",pe,[y(w,{name:"i-carbon-script",class:"text-2xl text-(--color-text-subtle)"})]),m[0]||(m[0]=e("p",{class:"text-sm font-medium text-(--color-text-muted)"}," No scripts loaded ",-1)),m[1]||(m[1]=e("p",{class:"text-xs text-(--color-text-subtle)"}," Scripts will appear here as they are registered ",-1))]))])}}}),Ve=F(Ke,[["__scopeId","data-v-1d33b8c9"]]);export{Ve as default};