@nuxt/scripts 1.0.0-beta.23 → 1.0.0-beta.24

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.
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-scripts/_nuxt/entry.CACgbLJl.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-scripts/_nuxt/BNNMZFwZ.js"><script type="module" src="/__nuxt-scripts/_nuxt/BNNMZFwZ.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{"nuxt-scripts":{version:"",defaultScriptOptions:{trigger:"onNuxtReady"},googleStaticMapsProxy:"",endpoints:{}}},app:{baseURL:"/__nuxt-scripts",buildId:"39ee5395-65bb-4a46-82e0-e68853f94418",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1773403965675,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-scripts/_nuxt/entry.CACgbLJl.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-scripts/_nuxt/BNNMZFwZ.js"><script type="module" src="/__nuxt-scripts/_nuxt/BNNMZFwZ.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{"nuxt-scripts":{version:"",defaultScriptOptions:{trigger:"onNuxtReady"},googleStaticMapsProxy:"",endpoints:{}}},app:{baseURL:"/__nuxt-scripts",buildId:"78647cef-f45a-4560-82b4-b9364815198a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1773461556086,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-scripts/_nuxt/entry.CACgbLJl.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-scripts/_nuxt/BNNMZFwZ.js"><script type="module" src="/__nuxt-scripts/_nuxt/BNNMZFwZ.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{"nuxt-scripts":{version:"",defaultScriptOptions:{trigger:"onNuxtReady"},googleStaticMapsProxy:"",endpoints:{}}},app:{baseURL:"/__nuxt-scripts",buildId:"39ee5395-65bb-4a46-82e0-e68853f94418",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1773403965676,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-scripts/_nuxt/entry.CACgbLJl.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-scripts/_nuxt/BNNMZFwZ.js"><script type="module" src="/__nuxt-scripts/_nuxt/BNNMZFwZ.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{"nuxt-scripts":{version:"",defaultScriptOptions:{trigger:"onNuxtReady"},googleStaticMapsProxy:"",endpoints:{}}},app:{baseURL:"/__nuxt-scripts",buildId:"78647cef-f45a-4560-82b4-b9364815198a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1773461556087,false]</script></body></html>
@@ -1 +1 @@
1
- {"id":"39ee5395-65bb-4a46-82e0-e68853f94418","timestamp":1773403960379}
1
+ {"id":"78647cef-f45a-4560-82b4-b9364815198a","timestamp":1773461550818}
@@ -0,0 +1 @@
1
+ {"id":"78647cef-f45a-4560-82b4-b9364815198a","timestamp":1773461550818,"prerendered":[]}
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-scripts/_nuxt/entry.CACgbLJl.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-scripts/_nuxt/BNNMZFwZ.js"><script type="module" src="/__nuxt-scripts/_nuxt/BNNMZFwZ.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{"nuxt-scripts":{version:"",defaultScriptOptions:{trigger:"onNuxtReady"},googleStaticMapsProxy:"",endpoints:{}}},app:{baseURL:"/__nuxt-scripts",buildId:"39ee5395-65bb-4a46-82e0-e68853f94418",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1773403965676,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/__nuxt-scripts/_nuxt/entry.CACgbLJl.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-scripts/_nuxt/BNNMZFwZ.js"><script type="module" src="/__nuxt-scripts/_nuxt/BNNMZFwZ.js" crossorigin></script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{"nuxt-scripts":{version:"",defaultScriptOptions:{trigger:"onNuxtReady"},googleStaticMapsProxy:"",endpoints:{}}},app:{baseURL:"/__nuxt-scripts",buildId:"78647cef-f45a-4560-82b4-b9364815198a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1773461556087,false]</script></body></html>
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.16"
6
6
  },
7
- "version": "1.0.0-beta.23",
7
+ "version": "1.0.0-beta.24",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
package/dist/module.mjs CHANGED
@@ -10,7 +10,7 @@ import { createStorage } from 'unstorage';
10
10
  import fsDriver from 'unstorage/drivers/fs-lite';
11
11
  import { addCustomTab } from '@nuxt/devtools-kit';
12
12
  import { isCI, provider } from 'std-env';
13
- import { parseAndWalk, ScopeTracker, walk, ScopeTrackerFunctionParam, ScopeTrackerVariable } from 'oxc-walker';
13
+ import { parseAndWalk, ScopeTracker, walk, ScopeTrackerFunction, ScopeTrackerIdentifier, ScopeTrackerFunctionParam, ScopeTrackerVariable } from 'oxc-walker';
14
14
  import { createUnplugin } from 'unplugin';
15
15
  import { pathToFileURL } from 'node:url';
16
16
  import { createHash } from 'node:crypto';
@@ -478,6 +478,7 @@ function NuxtScriptsCheckScripts() {
478
478
  }
479
479
 
480
480
  const WORD_OR_DOLLAR_RE = /[\w$]/;
481
+ const BLANK_CANVAS_DATA_URL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIHWNgAAIABQABNjN9GQAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAA0lEQVQI12NgYGBgAAAABQABXvMqOgAAAABJRU5ErkJggg==";
481
482
  const GA_COLLECT_RE = /([\w$])?"https:\/\/"\+\(.*?\)\+"\.google-analytics\.com\/g\/collect"/g;
482
483
  const GA_ANALYTICS_COLLECT_RE = /([\w$])?"https:\/\/"\+\(.*?\)\+"\.analytics\.google\.com\/g\/collect"/g;
483
484
  const FATHOM_SELF_HOSTED_RE = /\.src\.indexOf\("cdn\.usefathom\.com"\)\s*<\s*0/;
@@ -557,12 +558,15 @@ function resolveToGlobal(name, scopeTracker, depth = 0) {
557
558
  return null;
558
559
  if (init.type === "Identifier")
559
560
  return resolveToGlobal(init.name, scopeTracker, depth + 1);
560
- if (init.type === "MemberExpression" && !init.computed && init.object?.type === "Identifier" && init.property?.type === "Identifier") {
561
+ if (init.type === "MemberExpression" && init.object?.type === "Identifier") {
562
+ const memberProp = init.computed ? init.property?.type === "Literal" && typeof init.property.value === "string" ? init.property.value : null : init.property?.type === "Identifier" ? init.property.name : null;
563
+ if (!memberProp)
564
+ return null;
561
565
  const objGlobal = resolveToGlobal(init.object.name, scopeTracker, depth + 1);
562
566
  if (!objGlobal)
563
567
  return null;
564
568
  if (WINDOW_GLOBALS.has(objGlobal) || objGlobal === "document")
565
- return init.property.name;
569
+ return memberProp;
566
570
  return null;
567
571
  }
568
572
  return null;
@@ -636,6 +640,27 @@ function rewriteScriptUrlsAST(content, filename, rewrites) {
636
640
  }
637
641
  if (node.type === "CallExpression") {
638
642
  const callee = node.callee;
643
+ const canvasPropName = callee?.type === "MemberExpression" ? callee.computed ? callee.property?.type === "Literal" && typeof callee.property.value === "string" ? callee.property.value : null : callee.property?.name : null;
644
+ if (canvasPropName === "toDataURL" && callee.object) {
645
+ const blankCanvas = `"${BLANK_CANVAS_DATA_URL}"`;
646
+ if (callee.object.type === "Identifier") {
647
+ const decl = scopeTracker.getDeclaration(callee.object.name);
648
+ if (decl instanceof ScopeTrackerFunction || decl instanceof ScopeTrackerIdentifier) ; else {
649
+ s.overwrite(node.start, node.end, blankCanvas);
650
+ return;
651
+ }
652
+ } else {
653
+ s.overwrite(node.start, node.end, blankCanvas);
654
+ return;
655
+ }
656
+ }
657
+ if (canvasPropName === "getExtension") {
658
+ const args = node.arguments;
659
+ if (args?.length === 1 && args[0]?.type === "Literal" && args[0].value === "WEBGL_debug_renderer_info") {
660
+ s.overwrite(node.start, node.end, "null");
661
+ return;
662
+ }
663
+ }
639
664
  if (callee?.type === "Identifier" && callee.name === "fetch") {
640
665
  if (!scopeTracker.getDeclaration("fetch"))
641
666
  s.overwrite(callee.start, callee.end, "__nuxtScripts.fetch");
@@ -71,7 +71,6 @@ export declare const STRIP_PARAMS: {
71
71
  browserVersion: string[];
72
72
  browserData: string[];
73
73
  location: string[];
74
- canvas: string[];
75
74
  deviceInfo: string[];
76
75
  };
77
76
  /**
@@ -78,11 +78,13 @@ export const STRIP_PARAMS = {
78
78
  // Browser version lists — generalized to major versions (d_bvs = Snapchat, uafvl = GA Client Hints)
79
79
  browserVersion: ["d_bvs", "uafvl"],
80
80
  // Browser data lists — replaced with empty value
81
- browserData: ["plugins", "fonts"],
81
+ browserData: ["plugins", "fonts", "audiofingerprint"],
82
82
  // Location/Timezone — generalized
83
83
  location: ["tz", "timezone", "timezoneoffset"],
84
- // Canvas/WebGL/Audio fingerprints — replaced with empty value (pure fingerprints, no analytics value)
85
- canvas: ["canvas", "webgl", "audiofingerprint"],
84
+ // Canvas/WebGL fingerprints — neutralized at build time via AST rewriting (rewrite-ast.ts).
85
+ // These params are no longer stripped at runtime; the source APIs (toDataURL, WEBGL_debug_renderer_info)
86
+ // are neutralized before the script ever runs.
87
+ // canvas: ['canvas', 'webgl'],
86
88
  // Combined device fingerprinting (X/Twitter dv param contains: timezone, locale, vendor, platform, screen, etc.)
87
89
  deviceInfo: ["dv", "device_info", "deviceinfo"]
88
90
  };
@@ -302,11 +304,7 @@ export function stripPayloadFingerprinting(payload, privacy) {
302
304
  continue;
303
305
  }
304
306
  if (matchesParam(key, STRIP_PARAMS.browserData)) {
305
- result[key] = p.hardware ? Array.isArray(value) ? [] : "" : value;
306
- continue;
307
- }
308
- if (matchesParam(key, STRIP_PARAMS.canvas)) {
309
- result[key] = p.hardware ? typeof value === "number" ? 0 : typeof value === "object" ? {} : "" : value;
307
+ result[key] = p.hardware ? Array.isArray(value) ? [] : typeof value === "number" ? 0 : "" : value;
310
308
  continue;
311
309
  }
312
310
  if (matchesParam(key, STRIP_PARAMS.deviceInfo)) {
package/dist/stats.mjs CHANGED
@@ -37,7 +37,8 @@ const scriptMeta = {
37
37
  },
38
38
  googleAnalytics: {
39
39
  urls: ["https://www.googletagmanager.com/gtag/js?id=G-TR58L0EF8P"],
40
- trackedData: ["page-views", "events", "conversions", "user-identity", "audiences"]
40
+ trackedData: ["page-views", "events", "conversions", "user-identity", "audiences"],
41
+ canvasFingerprinting: true
41
42
  },
42
43
  umamiAnalytics: {
43
44
  urls: ["https://cloud.umami.is/script.js"],
@@ -46,23 +47,28 @@ const scriptMeta = {
46
47
  // Ads / Pixels
47
48
  metaPixel: {
48
49
  urls: ["https://connect.facebook.net/en_US/fbevents.js"],
49
- trackedData: ["page-views", "conversions", "retargeting", "audiences"]
50
+ trackedData: ["page-views", "conversions", "retargeting", "audiences"],
51
+ canvasFingerprinting: true
50
52
  },
51
53
  xPixel: {
52
54
  urls: ["https://static.ads-twitter.com/uwt.js"],
53
- trackedData: ["page-views", "conversions", "retargeting", "audiences"]
55
+ trackedData: ["page-views", "conversions", "retargeting", "audiences"],
56
+ canvasFingerprinting: true
54
57
  },
55
58
  tikTokPixel: {
56
59
  urls: ["https://analytics.tiktok.com/i18n/pixel/events.js"],
57
- trackedData: ["page-views", "conversions", "retargeting", "audiences"]
60
+ trackedData: ["page-views", "conversions", "retargeting", "audiences"],
61
+ canvasFingerprinting: true
58
62
  },
59
63
  snapchatPixel: {
60
64
  urls: ["https://sc-static.net/scevent.min.js"],
61
- trackedData: ["page-views", "conversions", "retargeting", "audiences"]
65
+ trackedData: ["page-views", "conversions", "retargeting", "audiences"],
66
+ canvasFingerprinting: true
62
67
  },
63
68
  redditPixel: {
64
69
  urls: ["https://www.redditstatic.com/ads/pixel.js"],
65
- trackedData: ["page-views", "conversions", "retargeting", "audiences"]
70
+ trackedData: ["page-views", "conversions", "retargeting", "audiences"],
71
+ canvasFingerprinting: true
66
72
  },
67
73
  googleAdsense: {
68
74
  urls: ["https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"],
@@ -75,11 +81,13 @@ const scriptMeta = {
75
81
  // Session replay / Heatmaps
76
82
  hotjar: {
77
83
  urls: ["https://static.hotjar.com/c/hotjar-3925006.js?sv=6"],
78
- trackedData: ["page-views", "session-replay", "heatmaps", "clicks", "scrolls", "form-submissions"]
84
+ trackedData: ["page-views", "session-replay", "heatmaps", "clicks", "scrolls", "form-submissions"],
85
+ canvasFingerprinting: true
79
86
  },
80
87
  clarity: {
81
88
  urls: ["https://www.clarity.ms/tag/mqk2m9dr2v"],
82
- trackedData: ["page-views", "session-replay", "heatmaps", "clicks", "scrolls"]
89
+ trackedData: ["page-views", "session-replay", "heatmaps", "clicks", "scrolls"],
90
+ canvasFingerprinting: true
83
91
  },
84
92
  // Tag Manager
85
93
  googleTagManager: {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nuxt/scripts",
3
3
  "type": "module",
4
- "version": "1.0.0-beta.23",
4
+ "version": "1.0.0-beta.24",
5
5
  "description": "Load third-party scripts with better performance, privacy and DX in Nuxt Apps.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -135,14 +135,14 @@
135
135
  "knitwork": "^1.3.0",
136
136
  "nuxt": "^4.4.2",
137
137
  "playwright-core": "^1.58.2",
138
- "posthog-js": "^1.360.1",
138
+ "posthog-js": "^1.360.2",
139
139
  "shiki": "^4.0.2",
140
140
  "typescript": "^5.9.3",
141
141
  "vitest": "^4.1.0",
142
142
  "vue": "^3.5.30",
143
143
  "vue-router": "^5.0.3",
144
144
  "vue-tsc": "^3.2.5",
145
- "@nuxt/scripts": "1.0.0-beta.23"
145
+ "@nuxt/scripts": "1.0.0-beta.24"
146
146
  },
147
147
  "resolutions": {
148
148
  "@nuxt/scripts": "workspace:*"
@@ -1 +0,0 @@
1
- {"id":"39ee5395-65bb-4a46-82e0-e68853f94418","timestamp":1773403960379,"prerendered":[]}