@nuxt/scripts 1.0.6 → 1.1.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 (73) 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/{YlRaZkPa.js → 1wb58MKb.js} +1 -1
  4. package/dist/devtools-client/_nuxt/{CZp-OuKP.js → BbLmrp_o.js} +1 -1
  5. package/dist/devtools-client/_nuxt/{DyyF3uw_.js → Cx46cS8a.js} +1 -1
  6. package/dist/devtools-client/_nuxt/{Djr8-0jV.js → D-M51CV3.js} +1 -1
  7. package/dist/devtools-client/_nuxt/D4HTNcLU.js +188 -0
  8. package/dist/devtools-client/_nuxt/{W-xcwSaJ.js → DU3BlAm5.js} +1 -1
  9. package/dist/devtools-client/_nuxt/{GzJXdFDa.js → DiaY4J4_.js} +1 -1
  10. package/dist/devtools-client/_nuxt/builds/latest.json +1 -1
  11. package/dist/devtools-client/_nuxt/builds/meta/0b4ab733-07a6-40b2-b25e-aca95fa55188.json +1 -0
  12. package/dist/devtools-client/_nuxt/error-404.D2T48gBS.css +1 -0
  13. package/dist/devtools-client/_nuxt/error-500.sMTZJbsP.css +1 -0
  14. package/dist/devtools-client/docs/index.html +1 -1
  15. package/dist/devtools-client/first-party/index.html +1 -1
  16. package/dist/devtools-client/index.html +1 -1
  17. package/dist/devtools-client/registry/index.html +1 -1
  18. package/dist/module.d.mts +7 -1
  19. package/dist/module.d.ts +7 -1
  20. package/dist/module.json +1 -1
  21. package/dist/module.mjs +266 -34
  22. package/dist/registry.mjs +76 -5
  23. package/dist/runtime/components/GoogleMaps/ScriptGoogleMaps.vue +36 -5
  24. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsGeoJson.d.vue.ts +2 -2
  25. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsGeoJson.vue.d.ts +2 -2
  26. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolygon.d.vue.ts +2 -2
  27. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolygon.vue.d.ts +2 -2
  28. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolyline.d.vue.ts +2 -2
  29. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolyline.vue.d.ts +2 -2
  30. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsRectangle.d.vue.ts +2 -2
  31. package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsRectangle.vue.d.ts +2 -2
  32. package/dist/runtime/components/ScriptCalendlyInlineWidget.d.vue.ts +59 -0
  33. package/dist/runtime/components/ScriptCalendlyInlineWidget.vue +79 -0
  34. package/dist/runtime/components/ScriptCalendlyInlineWidget.vue.d.ts +59 -0
  35. package/dist/runtime/components/ScriptPayPalButtons.d.vue.ts +1 -1
  36. package/dist/runtime/components/ScriptPayPalButtons.vue.d.ts +1 -1
  37. package/dist/runtime/components/ScriptPayPalMessages.d.vue.ts +1 -1
  38. package/dist/runtime/components/ScriptPayPalMessages.vue.d.ts +1 -1
  39. package/dist/runtime/composables/useScript.js +48 -0
  40. package/dist/runtime/debug.d.ts +1 -0
  41. package/dist/runtime/debug.js +1 -0
  42. package/dist/runtime/devtools-standalone-bridge.client.js +3 -1
  43. package/dist/runtime/logger.js +4 -0
  44. package/dist/runtime/registry/_gcm-consent.d.ts +14 -0
  45. package/dist/runtime/registry/_gcm-consent.js +24 -0
  46. package/dist/runtime/registry/ahrefs-analytics.d.ts +39 -0
  47. package/dist/runtime/registry/ahrefs-analytics.js +18 -0
  48. package/dist/runtime/registry/calendly.d.ts +76 -0
  49. package/dist/runtime/registry/calendly.js +63 -0
  50. package/dist/runtime/registry/google-analytics.d.ts +5 -6
  51. package/dist/runtime/registry/google-analytics.js +4 -10
  52. package/dist/runtime/registry/google-tag-manager.d.ts +5 -6
  53. package/dist/runtime/registry/google-tag-manager.js +13 -18
  54. package/dist/runtime/registry/linkedin-insight.d.ts +35 -0
  55. package/dist/runtime/registry/linkedin-insight.js +49 -0
  56. package/dist/runtime/registry/schemas.d.ts +124 -0
  57. package/dist/runtime/registry/schemas.js +115 -2
  58. package/dist/runtime/registry/tiktok-pixel.d.ts +28 -2
  59. package/dist/runtime/registry/tiktok-pixel.js +18 -1
  60. package/dist/runtime/registry/usercentrics.d.ts +85 -0
  61. package/dist/runtime/registry/usercentrics.js +54 -0
  62. package/dist/runtime/server/proxy-handler.js +13 -4
  63. package/dist/runtime/types.d.ts +36 -1
  64. package/dist/runtime/utils.d.ts +8 -2
  65. package/dist/runtime/utils.js +5 -1
  66. package/dist/stats.mjs +19 -0
  67. package/dist/types-source.mjs +274 -9
  68. package/dist/types.d.mts +1 -1
  69. package/package.json +9 -6
  70. package/dist/devtools-client/_nuxt/DtB6K90V.js +0 -188
  71. package/dist/devtools-client/_nuxt/builds/meta/57f43375-6c5e-40af-a5bc-9479e5286aac.json +0 -1
  72. package/dist/devtools-client/_nuxt/error-404.DsZYSkA7.css +0 -1
  73. package/dist/devtools-client/_nuxt/error-500.Cqipl6_j.css +0 -1
@@ -3,8 +3,10 @@ import type { Script } from '@unhead/vue/types';
3
3
  import type { Import } from 'unimport';
4
4
  import type { InferInput, ObjectEntries, ObjectSchema, UnionSchema, ValiError } from 'valibot';
5
5
  import type { ComputedRef, Ref } from 'vue';
6
+ import type { AhrefsAnalyticsInput } from './registry/ahrefs-analytics.js';
6
7
  import type { BingUetInput } from './registry/bing-uet.js';
7
8
  import type { BlueskyEmbedInput } from './registry/bluesky-embed.js';
9
+ import type { CalendlyInput } from './registry/calendly.js';
8
10
  import type { ClarityInput } from './registry/clarity.js';
9
11
  import type { CloudflareWebAnalyticsInput } from './registry/cloudflare-web-analytics.js';
10
12
  import type { CrispInput } from './registry/crisp.js';
@@ -21,6 +23,7 @@ import type { HotjarInput } from './registry/hotjar.js';
21
23
  import type { InstagramEmbedInput } from './registry/instagram-embed.js';
22
24
  import type { IntercomInput } from './registry/intercom.js';
23
25
  import type { LemonSqueezyInput } from './registry/lemon-squeezy.js';
26
+ import type { LinkedInInsightInput } from './registry/linkedin-insight.js';
24
27
  import type { MatomoAnalyticsInput } from './registry/matomo-analytics.js';
25
28
  import type { MetaPixelInput } from './registry/meta-pixel.js';
26
29
  import type { MixpanelAnalyticsInput } from './registry/mixpanel-analytics.js';
@@ -35,6 +38,7 @@ import type { SnapTrPixelInput } from './registry/snapchat-pixel.js';
35
38
  import type { StripeInput } from './registry/stripe.js';
36
39
  import type { TikTokPixelInput } from './registry/tiktok-pixel.js';
37
40
  import type { UmamiAnalyticsInput } from './registry/umami-analytics.js';
41
+ import type { UsercentricsInput } from './registry/usercentrics.js';
38
42
  import type { VercelAnalyticsInput } from './registry/vercel-analytics.js';
39
43
  import type { VimeoPlayerInput } from './registry/vimeo-player.js';
40
44
  import type { XEmbedInput } from './registry/x-embed.js';
@@ -66,6 +70,16 @@ export interface ConsentState {
66
70
  /** Milliseconds to wait for `consent.update()` before firing queued tags. */
67
71
  wait_for_update?: number;
68
72
  }
73
+ /**
74
+ * Auto-attached `consent` API on scripts that adhere to the GCMv2 Consent Mode
75
+ * contract (Google Analytics, Google Tag Manager, …).
76
+ */
77
+ export interface GcmConsentApi {
78
+ /** Push `['consent','default', state]` (or equivalent gtag call) with GCMv2 partial state. */
79
+ default: (state: ConsentState) => void;
80
+ /** Push `['consent','update', state]` (or equivalent gtag call) with GCMv2 partial state. */
81
+ update: (state: ConsentState) => void;
82
+ }
69
83
  export type UseScriptContext<T extends Record<symbol | string, any>, C = unknown> = VueScriptInstance<T> & {
70
84
  /**
71
85
  * Remove and reload the script. Useful for scripts that need to re-execute
@@ -142,6 +156,13 @@ export type NuxtUseScriptOptions<T extends Record<symbol | string, any> = {}> =
142
156
  * @internal
143
157
  */
144
158
  registryMeta?: Record<string, string>;
159
+ /**
160
+ * Source location (file:line:col) the script was registered from, captured
161
+ * via dev-only stack-trace parsing in `useRegistryScript`. Surfaced in
162
+ * debug logs and Nuxt DevTools.
163
+ * @internal
164
+ */
165
+ loadedFrom?: string;
145
166
  /**
146
167
  * Known third-party domains this script communicates with.
147
168
  * @internal
@@ -212,9 +233,11 @@ export interface NuxtDevToolsScriptInstance {
212
233
  networkRequests: NuxtDevToolsNetworkRequest[];
213
234
  }
214
235
  export interface ScriptRegistry {
236
+ ahrefsAnalytics?: AhrefsAnalyticsInput;
215
237
  bingUet?: BingUetInput;
216
238
  blueskyEmbed?: BlueskyEmbedInput;
217
239
  carbonAds?: true;
240
+ calendly?: CalendlyInput;
218
241
  crisp?: CrispInput;
219
242
  clarity?: ClarityInput;
220
243
  cloudflareWebAnalytics?: CloudflareWebAnalyticsInput;
@@ -232,6 +255,7 @@ export interface ScriptRegistry {
232
255
  googleTagManager?: GoogleTagManagerInput;
233
256
  hotjar?: HotjarInput;
234
257
  intercom?: IntercomInput;
258
+ linkedinInsight?: LinkedInInsightInput;
235
259
  paypal?: PayPalInput;
236
260
  posthog?: PostHogInput;
237
261
  matomoAnalytics?: MatomoAnalyticsInput;
@@ -248,6 +272,7 @@ export interface ScriptRegistry {
248
272
  vercelAnalytics?: VercelAnalyticsInput;
249
273
  vimeoPlayer?: VimeoPlayerInput;
250
274
  umamiAnalytics?: UmamiAnalyticsInput;
275
+ usercentrics?: UsercentricsInput;
251
276
  gravatar?: GravatarInput;
252
277
  npm?: NpmInput;
253
278
  [key: `${string}-npm`]: NpmInput;
@@ -256,7 +281,7 @@ export interface ScriptRegistry {
256
281
  * Built-in registry script keys — not affected by module augmentation.
257
282
  * Use this to type-check records that must enumerate all built-in scripts (logos, meta, etc.).
258
283
  */
259
- export type BuiltInRegistryScriptKey = 'bingUet' | 'blueskyEmbed' | 'carbonAds' | 'crisp' | 'clarity' | 'cloudflareWebAnalytics' | 'databuddyAnalytics' | 'metaPixel' | 'fathomAnalytics' | 'instagramEmbed' | 'plausibleAnalytics' | 'googleAdsense' | 'googleAnalytics' | 'googleMaps' | 'googleRecaptcha' | 'googleSignIn' | 'lemonSqueezy' | 'googleTagManager' | 'hotjar' | 'intercom' | 'paypal' | 'posthog' | 'matomoAnalytics' | 'mixpanelAnalytics' | 'rybbitAnalytics' | 'redditPixel' | 'segment' | 'stripe' | 'tiktokPixel' | 'xEmbed' | 'xPixel' | 'snapchatPixel' | 'youtubePlayer' | 'vercelAnalytics' | 'vimeoPlayer' | 'umamiAnalytics' | 'gravatar' | 'npm';
284
+ export type BuiltInRegistryScriptKey = 'ahrefsAnalytics' | 'bingUet' | 'blueskyEmbed' | 'calendly' | 'carbonAds' | 'crisp' | 'clarity' | 'cloudflareWebAnalytics' | 'databuddyAnalytics' | 'metaPixel' | 'fathomAnalytics' | 'instagramEmbed' | 'plausibleAnalytics' | 'googleAdsense' | 'googleAnalytics' | 'googleMaps' | 'googleRecaptcha' | 'googleSignIn' | 'lemonSqueezy' | 'googleTagManager' | 'hotjar' | 'intercom' | 'linkedinInsight' | 'paypal' | 'posthog' | 'matomoAnalytics' | 'mixpanelAnalytics' | 'rybbitAnalytics' | 'redditPixel' | 'segment' | 'stripe' | 'tiktokPixel' | 'xEmbed' | 'xPixel' | 'snapchatPixel' | 'youtubePlayer' | 'vercelAnalytics' | 'vimeoPlayer' | 'umamiAnalytics' | 'usercentrics' | 'gravatar' | 'npm';
260
285
  /**
261
286
  * Union of all explicit registry script keys (excludes npm pattern).
262
287
  * Includes both built-in and augmented keys.
@@ -386,6 +411,16 @@ export type SdkPatch = {
386
411
  separator: string;
387
412
  fromDomain: string;
388
413
  appendPath?: string;
414
+ }
415
+ /**
416
+ * Replace `new URL(<expr>).origin` with `self.location.origin + "<proxyPath>"`.
417
+ * Used by SDKs that derive their API host as `new URL(currentScript.src).origin + "/api/..."`.
418
+ * When bundled, the script src origin is the Nuxt origin, so the derived endpoint
419
+ * lands on a 404 instead of the proxy. This patch redirects it through the proxy.
420
+ */
421
+ | {
422
+ type: 'replace-new-url-origin';
423
+ fromDomain: string;
389
424
  };
390
425
  /**
391
426
  * Partytown capability config. When present, the script can run in a
@@ -1,6 +1,7 @@
1
1
  import type { UseScriptInput } from '@unhead/vue';
2
2
  import type { ObjectSchema, UnionSchema } from 'valibot';
3
- import type { EmptyOptionsSchema, InferIfSchema, NuxtUseScriptOptions, RegistryScriptInput, ScriptRegistry, UseFunctionType, UseScriptContext } from '#nuxt-scripts/types';
3
+ import type { EmptyOptionsSchema, InferIfSchema, NuxtUseScriptOptions, RegistryScriptInput, RegistryScriptKey, ScriptRegistry, UseFunctionType, UseScriptContext } from '#nuxt-scripts/types';
4
+ import type { GcmConsentContract } from './registry/_gcm-consent.js';
4
5
  export type MaybePromise<T> = Promise<T> | T;
5
6
  type OptionsFn<O> = (options: InferIfSchema<O>, ctx: {
6
7
  scriptInput?: UseScriptInput & {
@@ -12,8 +13,13 @@ type OptionsFn<O> = (options: InferIfSchema<O>, ctx: {
12
13
  schema?: O extends ObjectSchema<any, any> | UnionSchema<any, any> ? O : undefined;
13
14
  clientInit?: () => void | Promise<any>;
14
15
  scriptMode?: 'external' | 'npm';
16
+ /**
17
+ * Opt-in: this script consumes GCMv2 Consent Mode. `useRegistryScript` auto-attaches
18
+ * a `consent: { default, update }` API + dev validation against the canonical schema.
19
+ */
20
+ gcmConsent?: GcmConsentContract;
15
21
  });
16
- export declare function scriptRuntimeConfig<T extends keyof ScriptRegistry>(key: T): ScriptRegistry[T];
22
+ export declare function scriptRuntimeConfig<T extends RegistryScriptKey>(key: T): ScriptRegistry[T];
17
23
  export declare function scriptsPrefix(): string;
18
24
  export declare function requireRegistryEndpoint(componentName: string, registryKey: string): void;
19
25
  export declare function useRegistryScript<T extends Record<string | symbol, any>, O = EmptyOptionsSchema>(registryKey: keyof ScriptRegistry | string, optionsFn: OptionsFn<O>, _userOptions?: RegistryScriptInput<O>): UseScriptContext<UseFunctionType<NuxtUseScriptOptions<T>, T>>;
@@ -4,6 +4,7 @@ import { parseQuery, parseURL, withQuery } from "ufo";
4
4
  import { parse } from "valibot";
5
5
  import { useScript } from "./composables/useScript.js";
6
6
  import { createNpmScriptStub } from "./npm-script-stub.js";
7
+ import { attachGcmConsent } from "./registry/_gcm-consent.js";
7
8
  const URL_MATCH_RE = /https?:\/\/[^/]+\/_nuxt\/(.+\.vue)(?:\?[^)]*)?:(\d+):(\d+)/;
8
9
  const URL_PAREN_MATCH_RE = /\(https?:\/\/[^/]+\/_nuxt\/(.+\.vue)(?:\?[^)]*)?:(\d+):(\d+)\)/;
9
10
  const VUE_MATCH_RE = /([^/\s]+\.vue):(\d+):(\d+)/;
@@ -111,5 +112,8 @@ export function useRegistryScript(registryKey, optionsFn, _userOptions) {
111
112
  options.clientInit?.();
112
113
  }
113
114
  };
114
- return useScript(scriptInput, scriptOptions);
115
+ const instance = useScript(scriptInput, scriptOptions);
116
+ if (import.meta.client && options.gcmConsent)
117
+ attachGcmConsent(instance, options.gcmConsent, String(registryKey));
118
+ return instance;
115
119
  }
package/dist/stats.mjs CHANGED
@@ -4,6 +4,11 @@ import '../dist/runtime/registry/schemas.js';
4
4
 
5
5
  const scriptMeta = {
6
6
  // Analytics
7
+ ahrefsAnalytics: {
8
+ urls: ["https://analytics.ahrefs.com/analytics.js"],
9
+ trackedData: ["page-views", "events"],
10
+ testId: "test-ahrefs-key"
11
+ },
7
12
  plausibleAnalytics: {
8
13
  urls: ["https://plausible.io/js/script.js"],
9
14
  trackedData: ["page-views", "events", "conversions"]
@@ -84,6 +89,11 @@ const scriptMeta = {
84
89
  trackedData: ["page-views", "conversions", "retargeting", "audiences"],
85
90
  testId: "a2_ilz4u0kbdr3v"
86
91
  },
92
+ linkedinInsight: {
93
+ urls: ["https://snap.licdn.com/li.lms-analytics/insight.min.js"],
94
+ trackedData: ["page-views", "conversions", "retargeting", "audiences"],
95
+ testId: "111143"
96
+ },
87
97
  googleAdsense: {
88
98
  urls: ["https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"],
89
99
  trackedData: ["page-views", "retargeting", "audiences"]
@@ -154,6 +164,10 @@ const scriptMeta = {
154
164
  trackedData: []
155
165
  },
156
166
  // Utility
167
+ calendly: {
168
+ urls: ["https://assets.calendly.com/assets/external/widget.js"],
169
+ trackedData: []
170
+ },
157
171
  googleRecaptcha: {
158
172
  urls: ["https://www.google.com/recaptcha/api.js"],
159
173
  trackedData: []
@@ -175,6 +189,11 @@ const scriptMeta = {
175
189
  urls: ["https://platform.twitter.com/widgets.js"],
176
190
  trackedData: []
177
191
  },
192
+ // CMP / Consent
193
+ usercentrics: {
194
+ urls: ["https://web.cmp.usercentrics.eu/ui/loader.js", "https://web.cmp.usercentrics.eu/modules/autoblocker.js"],
195
+ trackedData: []
196
+ },
178
197
  // Identity
179
198
  gravatar: {
180
199
  urls: ["https://secure.gravatar.com/js/gprofiles.js"],
@@ -1,4 +1,33 @@
1
1
  const types = {
2
+ "_gcm-consent": [
3
+ {
4
+ name: "GcmConsentContract",
5
+ kind: "interface",
6
+ code: "export interface GcmConsentContract {\n /** Forward a `consent`,`<action>`, `<state>` call to the script's transport (dataLayer or gtag). */\n push: (proxy: any, action: 'default' | 'update', state: ConsentState) => void\n}"
7
+ }
8
+ ],
9
+ "ahrefs-analytics": [
10
+ {
11
+ name: "AhrefsAnalyticsOptions",
12
+ kind: "const",
13
+ code: "export const AhrefsAnalyticsOptions = object({\n /**\n * Your Ahrefs Web Analytics project key. Set as the `data-key` attribute\n * on the loaded `analytics.js` script tag.\n * @see https://ahrefs.com/web-analytics\n */\n key: pipe(string(), minLength(1)),\n})"
14
+ },
15
+ {
16
+ name: "AhrefsAnalyticsSendEventOptions",
17
+ kind: "interface",
18
+ code: "export interface AhrefsAnalyticsSendEventOptions {\n /** Custom dimensions sent under `props`. */\n props?: Record<string, string>\n /** Arbitrary metadata sent under `meta`. */\n meta?: Record<string, unknown>\n /** Optional callback invoked once the beacon request completes. */\n callback?: (result?: { status?: number }) => void\n}"
19
+ },
20
+ {
21
+ name: "AhrefsAnalyticsInstance",
22
+ kind: "interface",
23
+ code: "export interface AhrefsAnalyticsInstance {\n /**\n * Manually send an event to Ahrefs Analytics. The script auto-fires\n * page-view events on initial load and on `history.pushState`/`popstate`,\n * so SPA navigations are tracked without calling this.\n */\n sendEvent: (name: string, options?: AhrefsAnalyticsSendEventOptions) => void\n}"
24
+ },
25
+ {
26
+ name: "AhrefsAnalyticsApi",
27
+ kind: "interface",
28
+ code: "export interface AhrefsAnalyticsApi {\n AhrefsAnalytics: AhrefsAnalyticsInstance\n}"
29
+ }
30
+ ],
2
31
  "bing-uet": [
3
32
  {
4
33
  name: "BingUetOptions",
@@ -93,6 +122,48 @@ const types = {
93
122
  code: "interface ScriptBlueskyEmbedSlots {\n default?: (props: object) => any\n loading?: () => any\n error?: (props: object) => any\n}"
94
123
  }
95
124
  ],
125
+ calendly: [
126
+ {
127
+ name: "CalendlyOptions",
128
+ kind: "const",
129
+ code: "export const CalendlyOptions = object({\n /**\n * The Calendly event URL to embed.\n * Required for inline, popup, and badge widgets when called via the composable.\n * @example 'https://calendly.com/your-name/30min'\n * @see https://help.calendly.com/hc/en-us/articles/223147027\n */\n url: optional(string()),\n /**\n * Pre-fill invitee fields on the booking form.\n * @see https://help.calendly.com/hc/en-us/articles/360020052833\n */\n prefill: optional(object({\n name: optional(string()),\n email: optional(string()),\n firstName: optional(string()),\n lastName: optional(string()),\n /** Custom answers keyed by `a1`, `a2`, ... matching custom question order. */\n customAnswers: optional(record(string(), string())),\n })),\n /**\n * UTM parameters appended to the booking URL for marketing attribution.\n * @see https://help.calendly.com/hc/en-us/articles/360020052833\n */\n utm: optional(object({\n utmCampaign: optional(string()),\n utmSource: optional(string()),\n utmMedium: optional(string()),\n utmContent: optional(string()),\n utmTerm: optional(string()),\n })),\n /**\n * Theme and layout overrides applied to the booking page.\n * @see https://help.calendly.com/hc/en-us/articles/360020052833\n */\n pageSettings: optional(object({\n backgroundColor: optional(string()),\n hideEventTypeDetails: optional(boolean()),\n hideLandingPageDetails: optional(boolean()),\n primaryColor: optional(string()),\n textColor: optional(string()),\n })),\n /**\n * CSS selector for the element that hosts the inline widget.\n * Required when the widget is initialised inline; the element should have a\n * minimum height of around 700px so the booking iframe is fully visible.\n */\n parentElement: optional(string()),\n})"
130
+ },
131
+ {
132
+ name: "CalendlyPrefill",
133
+ kind: "interface",
134
+ code: "interface CalendlyPrefill {\n name?: string\n email?: string\n firstName?: string\n lastName?: string\n customAnswers?: Record<string, string>\n}"
135
+ },
136
+ {
137
+ name: "CalendlyUtm",
138
+ kind: "interface",
139
+ code: "interface CalendlyUtm {\n utmCampaign?: string\n utmSource?: string\n utmMedium?: string\n utmContent?: string\n utmTerm?: string\n}"
140
+ },
141
+ {
142
+ name: "CalendlyPageSettings",
143
+ kind: "interface",
144
+ code: "interface CalendlyPageSettings {\n backgroundColor?: string\n hideEventTypeDetails?: boolean\n hideLandingPageDetails?: boolean\n hideGdprBanner?: boolean\n primaryColor?: string\n textColor?: string\n}"
145
+ },
146
+ {
147
+ name: "CalendlyInlineWidgetOptions",
148
+ kind: "interface",
149
+ code: "export interface CalendlyInlineWidgetOptions {\n url: string\n parentElement: HTMLElement\n prefill?: CalendlyPrefill\n utm?: CalendlyUtm\n pageSettings?: CalendlyPageSettings\n}"
150
+ },
151
+ {
152
+ name: "CalendlyPopupWidgetOptions",
153
+ kind: "interface",
154
+ code: "export interface CalendlyPopupWidgetOptions {\n url: string\n rootElement?: HTMLElement\n text?: string\n color?: string\n textColor?: string\n branding?: boolean\n prefill?: CalendlyPrefill\n utm?: CalendlyUtm\n pageSettings?: CalendlyPageSettings\n}"
155
+ },
156
+ {
157
+ name: "CalendlyBadgeWidgetOptions",
158
+ kind: "interface",
159
+ code: "export interface CalendlyBadgeWidgetOptions {\n url: string\n text?: string\n color?: string\n textColor?: string\n branding?: boolean\n prefill?: CalendlyPrefill\n utm?: CalendlyUtm\n pageSettings?: CalendlyPageSettings\n}"
160
+ },
161
+ {
162
+ name: "CalendlyApi",
163
+ kind: "interface",
164
+ code: "export interface CalendlyApi {\n Calendly: {\n initInlineWidget: (options: CalendlyInlineWidgetOptions) => void\n initPopupWidget: (options: CalendlyPopupWidgetOptions) => void\n initBadgeWidget: (options: CalendlyBadgeWidgetOptions) => void\n showPopupWidget: (url: string) => void\n closePopupWidget: () => void\n initPopupWidgetWithText: (options: CalendlyPopupWidgetOptions) => void\n q?: unknown[]\n }\n}"
165
+ }
166
+ ],
96
167
  clarity: [
97
168
  {
98
169
  name: "ClarityOptions",
@@ -263,8 +334,8 @@ const types = {
263
334
  },
264
335
  {
265
336
  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}"
337
+ kind: "type",
338
+ code: "export type GoogleAnalyticsConsent = GcmConsentApi"
268
339
  }
269
340
  ],
270
341
  "google-maps": [
@@ -506,8 +577,8 @@ const types = {
506
577
  },
507
578
  {
508
579
  name: "GoogleTagManagerConsent",
509
- kind: "interface",
510
- code: "export interface GoogleTagManagerConsent {\n /** Push `['consent','update', state]` onto dataLayer with GCMv2 partial state. */\n update: (state: ConsentState) => void\n}"
580
+ kind: "type",
581
+ code: "export type GoogleTagManagerConsent = GcmConsentApi"
511
582
  }
512
583
  ],
513
584
  gravatar: [
@@ -605,6 +676,33 @@ const types = {
605
676
  code: "interface ScriptLemonSqueezySlots {\n default?: () => any\n}"
606
677
  }
607
678
  ],
679
+ "linkedin-insight": [
680
+ {
681
+ name: "LinkedInInsightOptions",
682
+ kind: "const",
683
+ code: "export const LinkedInInsightOptions = object({\n /**\n * Your LinkedIn Insight Tag Partner ID, or an array of Partner IDs to push\n * onto window._linkedin_data_partner_ids. The first ID is used as the\n * primary _linkedin_partner_id global.\n * @example '111143'\n * @example ['111143', '111154']\n * @see https://www.linkedin.com/help/lms/answer/a417869/access-your-linkedin-partner-id\n */\n id: union([pipe(string(), minLength(1)), pipe(array(pipe(string(), minLength(1))), minLength(1))]),\n /**\n * Optional page-load event ID for Conversions API deduplication. Assigned\n * to window._linkedin_event_id BEFORE the Insight Tag base code runs. Must\n * match the eventId sent with the corresponding server-side Conversions\n * API event.\n *\n * Per-event conversion deduplication uses the per-call event_id passed to\n * lintrk('track', { conversion_id, event_id }) instead.\n * @see https://learn.microsoft.com/en-us/linkedin/marketing/conversions/deduplication\n */\n eventId: optional(string()),\n /**\n * Auto-fire lintrk('track') on Vue Router route changes (SPA virtual page\n * views). When true, suppresses the script's built-in auto-page-view via\n * window._wait_for_lintrk and tracks every navigation including the\n * initial page through Nuxt's page:finish hook. When false, the script\n * fires its own page-view exactly once on load and SPA navigations are\n * not tracked unless lintrk('track') is called manually.\n * @default false\n */\n enableAutoSpaTracking: optional(boolean()),\n})"
684
+ },
685
+ {
686
+ name: "LintrkTrackParams",
687
+ kind: "interface",
688
+ code: "interface LintrkTrackParams {\n conversion_id?: number\n event_id?: string\n commandCallback?: () => void\n [key: string]: any\n}"
689
+ },
690
+ {
691
+ name: "LintrkUserData",
692
+ kind: "interface",
693
+ code: "interface LintrkUserData {\n /** Plain email; the script SHA-256 hashes it before sending. */\n email: string\n}"
694
+ },
695
+ {
696
+ name: "LintrkFns",
697
+ kind: "type",
698
+ code: "type LintrkFns\n = & ((cmd: 'track', params?: LintrkTrackParams) => void)\n & ((cmd: 'setUserData', data: LintrkUserData) => void)\n & ((cmd: (string & {}), ...args: any[]) => void)"
699
+ },
700
+ {
701
+ name: "LinkedInInsightApi",
702
+ kind: "interface",
703
+ code: "export interface LinkedInInsightApi {\n lintrk: LintrkFns & { q?: unknown[] }\n}"
704
+ }
705
+ ],
608
706
  "matomo-analytics": [
609
707
  {
610
708
  name: "MatomoAnalyticsOptions",
@@ -898,22 +996,27 @@ const types = {
898
996
  {
899
997
  name: "StandardEvents",
900
998
  kind: "type",
901
- code: "type StandardEvents\n = 'ViewContent'\n | 'ClickButton'\n | 'Search'\n | 'AddToWishlist'\n | 'AddToCart'\n | 'InitiateCheckout'\n | 'AddPaymentInfo'\n | 'CompletePayment'\n | 'PlaceAnOrder'\n | 'Contact'\n | 'Download'\n | 'SubmitForm'\n | 'CompleteRegistration'\n | 'Subscribe'"
999
+ code: "type StandardEvents\n = 'ViewContent'\n | 'ClickButton'\n | 'Search'\n | 'AddToWishlist'\n | 'AddToCart'\n | 'InitiateCheckout'\n | 'AddPaymentInfo'\n | 'CompletePayment'\n | 'PlaceAnOrder'\n | 'Purchase'\n | 'Contact'\n | 'Download'\n | 'SubmitForm'\n | 'CompleteRegistration'\n | 'Subscribe'\n | 'StartTrial'\n | 'ApplicationApproval'\n | 'CustomizeProduct'\n | 'FindLocation'\n | 'Schedule'\n | 'SubmitApplication'"
902
1000
  },
903
1001
  {
904
1002
  name: "EventProperties",
905
1003
  kind: "interface",
906
- code: "interface EventProperties {\n content_id?: string\n content_type?: string\n content_name?: string\n contents?: Array<{ content_id: string, content_type?: string, content_name?: string, price?: number, quantity?: number }>\n currency?: string\n value?: number\n description?: string\n query?: string\n [key: string]: any\n}"
1004
+ code: "interface EventProperties {\n content_id?: string\n content_type?: string\n content_name?: string\n contents?: Array<{ content_id: string, content_type?: string, content_name?: string, price?: number, quantity?: number }>\n currency?: string\n value?: number\n description?: string\n query?: string\n /** Order/transaction identifier; complements `event_id` for transaction-level dedup. */\n order_id?: string\n [key: string]: any\n}"
907
1005
  },
908
1006
  {
909
1007
  name: "IdentifyProperties",
910
1008
  kind: "interface",
911
- code: "interface IdentifyProperties {\n email?: string\n phone_number?: string\n external_id?: string\n}"
1009
+ code: "interface IdentifyProperties {\n email?: string\n phone_number?: string\n external_id?: string\n first_name?: string\n last_name?: string\n city?: string\n state?: string\n country?: string\n zip_code?: string\n}"
1010
+ },
1011
+ {
1012
+ name: "TrackOptions",
1013
+ kind: "interface",
1014
+ code: "interface TrackOptions {\n /** Used to deduplicate events sent from both the browser Pixel and the server-side Events API. */\n event_id?: string\n /**\n * Sandbox test-event identifier. When set, events route to TikTok's Test Events panel\n * without affecting production reporting.\n */\n test_event_code?: string\n [key: string]: any\n}"
912
1015
  },
913
1016
  {
914
1017
  name: "TtqFns",
915
1018
  kind: "type",
916
- code: "type TtqFns\n = ((cmd: 'track', event: StandardEvents | (string & {}), properties?: EventProperties) => void)\n & ((cmd: 'page') => void)\n & ((cmd: 'identify', properties: IdentifyProperties) => void)\n & ((cmd: (string & {}), ...args: any[]) => void)"
1019
+ code: "type TtqFns\n = ((cmd: 'track', event: StandardEvents | (string & {}), properties?: EventProperties, options?: TrackOptions) => void)\n & ((cmd: 'page') => void)\n & ((cmd: 'identify', properties: IdentifyProperties) => void)\n & ((cmd: (string & {}), ...args: any[]) => void)"
917
1020
  },
918
1021
  {
919
1022
  name: "TikTokPixelApi",
@@ -923,7 +1026,7 @@ const types = {
923
1026
  {
924
1027
  name: "TikTokPixelOptions",
925
1028
  kind: "const",
926
- 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})"
1029
+ 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 /**\n * Data residency region for the Pixel SDK.\n * - `'global'` (default) -> `analytics.tiktok.com`\n * - `'us'` -> `analytics.us.tiktok.com` (US enterprise data residency)\n */\n region: optional(union([literal('global'), literal('us')])),\n})"
927
1030
  },
928
1031
  {
929
1032
  name: "TikTokPixelConsent",
@@ -943,6 +1046,33 @@ const types = {
943
1046
  code: "export interface UmamiAnalyticsApi {\n track: ((payload?: Record<string, any>) => void) & ((event_name: string, event_data: Record<string, any>) => void)\n identify: (session_data?: Record<string, any> | string) => void\n}"
944
1047
  }
945
1048
  ],
1049
+ usercentrics: [
1050
+ {
1051
+ name: "UsercentricsOptions",
1052
+ kind: "const",
1053
+ code: "export const UsercentricsOptions = object({\n /**\n * Your Usercentrics CMP v3 ruleset ID. Find it in the admin under\n * Implementation; the snippet's `data-ruleset-id` value.\n */\n rulesetId: pipe(string(), minLength(1)),\n /**\n * Inject the Usercentrics autoblocker (`autoblocker.js`) ahead of the loader.\n * Enable when your ruleset relies on Auto Blocking (vs. Manual Blocking) to\n * gate third-party scripts before consent is granted.\n * @default false\n */\n autoblocker: optional(boolean()),\n /**\n * Override the language displayed by the CMP UI (BCP-47 code, e.g. `'en'`, `'de'`).\n */\n language: optional(string()),\n})"
1054
+ },
1055
+ {
1056
+ name: "UsercentricsCmpEventDetail",
1057
+ kind: "interface",
1058
+ code: "export interface UsercentricsCmpEventDetail {\n type: string\n source?: string\n [key: string]: any\n}"
1059
+ },
1060
+ {
1061
+ name: "UsercentricsCmp",
1062
+ kind: "interface",
1063
+ code: "export interface UsercentricsCmp {\n isInitialized: () => Promise<boolean>\n isConsentRequired: () => Promise<boolean>\n showFirstLayer: () => Promise<void>\n showSecondLayer: () => Promise<void>\n showServiceDetails: (id: string) => Promise<void>\n showAutoblockerMoreInfoView: () => Promise<void>\n closeCmp: () => Promise<void>\n acceptAllConsents: () => Promise<void>\n denyAllConsents: () => Promise<void>\n saveConsents: () => Promise<void>\n updateCategoriesConsents: (consents: Array<{ categorySlug: string, consent: boolean }>) => Promise<void>\n updateServicesConsents: (consents: Array<{ templateId: string, consent: boolean }>) => Promise<void>\n updateTcfConsents: (...args: unknown[]) => Promise<void>\n refreshScripts: () => Promise<void>\n clearUserSession: () => Promise<void>\n getConsentDetails: () => Promise<Record<string, any>>\n getCmpConfig: () => Promise<Record<string, any>>\n getActiveLanguage: () => Promise<string>\n getControllerId: () => Promise<string>\n changeLanguage: (lang: string) => Promise<void>\n [key: string]: any\n}"
1064
+ },
1065
+ {
1066
+ name: "UsercentricsApi",
1067
+ kind: "interface",
1068
+ code: "export interface UsercentricsApi {\n ucCmp: UsercentricsCmp\n}"
1069
+ },
1070
+ {
1071
+ name: "UsercentricsConsent",
1072
+ kind: "interface",
1073
+ code: "export interface UsercentricsConsent {\n /**\n * Resolves once the CMP API is ready (`UC_CMP_API_READY`) or immediately if\n * it already is. Resolves with `window.__ucCmp` so callers can query\n * consent state without polling.\n */\n whenReady: () => Promise<UsercentricsCmp>\n /**\n * Subscribe to `UC_UI_CMP_EVENT` browser events (the v3 consent change\n * event). Returns a teardown function. The callback receives the event\n * detail, e.g. `{ type: 'ACCEPT_ALL' | 'DENY_ALL' | 'SAVE', ... }`.\n */\n onConsentChange: (cb: (detail: UsercentricsCmpEventDetail, event: Event) => void) => () => void\n /** Open the privacy settings (first layer banner). */\n showFirstLayer: () => Promise<void> | void\n /** Open the detailed settings (second layer modal). */\n showSecondLayer: () => Promise<void> | void\n /** Accept all consents. */\n acceptAll: () => Promise<void> | void\n /** Reject all consents. */\n denyAll: () => Promise<void> | void\n}"
1074
+ }
1075
+ ],
946
1076
  "vercel-analytics": [
947
1077
  {
948
1078
  name: "VercelAnalyticsOptions",
@@ -1087,6 +1217,61 @@ const types = {
1087
1217
  ]
1088
1218
  };
1089
1219
  const schemaFields = {
1220
+ gcmConsentState: [
1221
+ {
1222
+ name: "ad_storage",
1223
+ type: "unknown",
1224
+ required: false
1225
+ },
1226
+ {
1227
+ name: "ad_user_data",
1228
+ type: "unknown",
1229
+ required: false
1230
+ },
1231
+ {
1232
+ name: "ad_personalization",
1233
+ type: "unknown",
1234
+ required: false
1235
+ },
1236
+ {
1237
+ name: "analytics_storage",
1238
+ type: "unknown",
1239
+ required: false
1240
+ },
1241
+ {
1242
+ name: "functionality_storage",
1243
+ type: "unknown",
1244
+ required: false
1245
+ },
1246
+ {
1247
+ name: "personalization_storage",
1248
+ type: "unknown",
1249
+ required: false
1250
+ },
1251
+ {
1252
+ name: "security_storage",
1253
+ type: "unknown",
1254
+ required: false
1255
+ },
1256
+ {
1257
+ name: "wait_for_update",
1258
+ type: "number",
1259
+ required: false
1260
+ },
1261
+ {
1262
+ name: "region",
1263
+ type: "string[]",
1264
+ required: false
1265
+ }
1266
+ ],
1267
+ AhrefsAnalyticsOptions: [
1268
+ {
1269
+ name: "key",
1270
+ type: "string",
1271
+ required: true,
1272
+ description: "Your Ahrefs Web Analytics project key. Set as the `data-key` attribute on the loaded `analytics.js` script tag."
1273
+ }
1274
+ ],
1090
1275
  BlueskyEmbedOptions: [
1091
1276
  {
1092
1277
  name: "postUrl",
@@ -2011,6 +2196,80 @@ const schemaFields = {
2011
2196
  description: "Default consent state fired as `uetq.push('consent', 'default', ...)` before UET init."
2012
2197
  }
2013
2198
  ],
2199
+ LinkedInInsightOptions: [
2200
+ {
2201
+ name: "id",
2202
+ type: "string | string[]",
2203
+ required: true,
2204
+ description: "Your LinkedIn Insight Tag Partner ID, or an array of Partner IDs to push onto window._linkedin_data_partner_ids. The first ID is used as the primary _linkedin_partner_id global."
2205
+ },
2206
+ {
2207
+ name: "eventId",
2208
+ type: "string",
2209
+ required: false,
2210
+ description: "Optional page-load event ID for Conversions API deduplication. Assigned to window._linkedin_event_id BEFORE the Insight Tag base code runs. Must match the eventId sent with the corresponding server-side Conversions API event. Per-event conversion deduplication uses the per-call event_id passed to lintrk('track', { conversion_id, event_id }) instead."
2211
+ },
2212
+ {
2213
+ name: "enableAutoSpaTracking",
2214
+ type: "boolean",
2215
+ required: false,
2216
+ description: "Auto-fire lintrk('track') on Vue Router route changes (SPA virtual page views). When true, suppresses the script's built-in auto-page-view via window._wait_for_lintrk and tracks every navigation including the initial page through Nuxt's page:finish hook. When false, the script fires its own page-view exactly once on load and SPA navigations are not tracked unless lintrk('track') is called manually.",
2217
+ defaultValue: "false"
2218
+ }
2219
+ ],
2220
+ UsercentricsOptions: [
2221
+ {
2222
+ name: "rulesetId",
2223
+ type: "string",
2224
+ required: true,
2225
+ description: "Your Usercentrics CMP v3 ruleset ID. Find it in the admin under Implementation; the snippet's `data-ruleset-id` value."
2226
+ },
2227
+ {
2228
+ name: "autoblocker",
2229
+ type: "boolean",
2230
+ required: false,
2231
+ description: "Inject the Usercentrics autoblocker (`autoblocker.js`) ahead of the loader. Enable when your ruleset relies on Auto Blocking (vs. Manual Blocking) to gate third-party scripts before consent is granted.",
2232
+ defaultValue: "false"
2233
+ },
2234
+ {
2235
+ name: "language",
2236
+ type: "string",
2237
+ required: false,
2238
+ description: "Override the language displayed by the CMP UI (BCP-47 code, e.g. `'en'`, `'de'`)."
2239
+ }
2240
+ ],
2241
+ CalendlyOptions: [
2242
+ {
2243
+ name: "url",
2244
+ type: "string",
2245
+ required: false,
2246
+ description: "The Calendly event URL to embed. Required for inline, popup, and badge widgets when called via the composable."
2247
+ },
2248
+ {
2249
+ name: "prefill",
2250
+ type: "object",
2251
+ required: false,
2252
+ description: "Pre-fill invitee fields on the booking form."
2253
+ },
2254
+ {
2255
+ name: "utm",
2256
+ type: "object",
2257
+ required: false,
2258
+ description: "UTM parameters appended to the booking URL for marketing attribution."
2259
+ },
2260
+ {
2261
+ name: "pageSettings",
2262
+ type: "object",
2263
+ required: false,
2264
+ description: "Theme and layout overrides applied to the booking page."
2265
+ },
2266
+ {
2267
+ name: "parentElement",
2268
+ type: "string",
2269
+ required: false,
2270
+ description: "CSS selector for the element that hosts the inline widget. Required when the widget is initialised inline; the element should have a minimum height of around 700px so the booking iframe is fully visible."
2271
+ }
2272
+ ],
2014
2273
  SegmentOptions: [
2015
2274
  {
2016
2275
  name: "writeKey",
@@ -2142,6 +2401,12 @@ const schemaFields = {
2142
2401
  type: "'granted' | 'denied' | 'hold'",
2143
2402
  required: false,
2144
2403
  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"
2404
+ },
2405
+ {
2406
+ name: "region",
2407
+ type: "'global' | 'us'",
2408
+ required: false,
2409
+ description: "Data residency region for the Pixel SDK. - `'global'` (default) -> `analytics.tiktok.com` - `'us'` -> `analytics.us.tiktok.com` (US enterprise data residency)"
2145
2410
  }
2146
2411
  ],
2147
2412
  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 resolveConfiguredProxyDomains, type resolveProxySecret } from './module.mjs'
9
+ export { type applyAutoInject, default, type findMissingRequiredFields, 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.6",
4
+ "version": "1.1.0",
5
5
  "description": "Load third-party scripts with better performance, privacy and DX in Nuxt Apps.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -103,7 +103,6 @@
103
103
  },
104
104
  "dependencies": {
105
105
  "@nuxt/devtools-kit": "^3.2.4",
106
- "@nuxt/kit": "^4.4.4",
107
106
  "@vueuse/core": "^14.3.0",
108
107
  "@vueuse/shared": "^14.3.0",
109
108
  "consola": "^3.4.2",
@@ -112,8 +111,8 @@
112
111
  "magic-string": "^0.30.21",
113
112
  "ofetch": "^1.5.1",
114
113
  "ohash": "^2.0.11",
115
- "oxc-parser": "^0.128.0",
116
- "oxc-walker": "^0.7.0",
114
+ "oxc-parser": "^0.130.0",
115
+ "oxc-walker": "^1.0.0",
117
116
  "pathe": "^2.0.3",
118
117
  "pkg-types": "^2.3.1",
119
118
  "sirv": "^3.0.2",
@@ -122,10 +121,14 @@
122
121
  "ultrahtml": "^1.6.0",
123
122
  "unplugin": "^3.0.0",
124
123
  "unstorage": "^1.17.5",
125
- "valibot": "^1.3.1"
124
+ "valibot": "^1.4.0"
126
125
  },
127
126
  "devDependencies": {
128
- "@nuxt/module-builder": "^1.0.2"
127
+ "@nuxt/kit": "^4.4.5",
128
+ "@nuxt/module-builder": "^1.0.2",
129
+ "rollup": "^4.60.3",
130
+ "unbuild": "^3.6.1",
131
+ "unimport": "^6.2.0"
129
132
  },
130
133
  "scripts": {
131
134
  "build": "nuxt-module-build build",