@nuxt/scripts 1.0.0-beta.7 → 1.0.0-rc.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.
- package/dist/devtools-client/200.html +1 -0
- package/dist/devtools-client/404.html +1 -0
- package/dist/devtools-client/_fonts/4ppnHhMi-pBsWSPo7mY0avYxlDoAg1N3PTzCwXLZ5rA-d9oibkGnTd1JL3tc_xnaVgBLYmOB8kjrK2cvZaqwj9s.woff2 +0 -0
- package/dist/devtools-client/_fonts/4qBuU9MRVUlPZNPSF7Xom_sK8RBEnfYu-9VXFrdq8A8-8TDwLE1HAj1sQn7XxVWtM_7sIaPM-DTdO3Pf8U2DF1U.woff2 +0 -0
- package/dist/devtools-client/_fonts/6dYsbWUd_BpKJ7mdDihgOcya1gHXLpJBuMYXux3WMjE-q3fYNS8YbW5n7ZeXI2vSNgkRWW5VDPKAl51SNTjG2qk.woff2 +0 -0
- package/dist/devtools-client/_fonts/Lr-hqqZZsYmCt0ITUlr1CUrWim9fsKvoDFZliMxgNHY-iTa_Yt_PzhOY9TX7ZXdSlEPim6iRt92xhECwaxWxd5w.woff2 +0 -0
- package/dist/devtools-client/_fonts/OknHvWI6KtYn1JQBzX7eSpNDBQ8520F9TvSUJYkVf6A-xeZn9253svK_8Q2LD0XEruY_MnEsuCRO5LenPoggC0Y.woff2 +0 -0
- package/dist/devtools-client/_fonts/PV2hrQG6wq5BlIPDjdL1IcOflycaghyt5MHzlBqZtlo-lb_WexLz3VZqfTN0oi554iBH5tT2j2UFEV-XErCAS3E.woff2 +0 -0
- package/dist/devtools-client/_fonts/UA7OtwYHwGN_HjcVGTdmiQxUit7FlqkCwxVUWSeXVnQ-B4OXCFOL_tWrYODpQTc07aMaj0c2cewTOmBRWR9tD-A.woff2 +0 -0
- package/dist/devtools-client/_fonts/VE4cDVCv5MxbFM7ZLoLCGbIpNd71zhp7MDI9lmN5Y7I-xZyDYCUVrd6LV8eVGF3Um3UZjBFuUtDGtvdyTBBRYBo.woff2 +0 -0
- package/dist/devtools-client/_fonts/fVoGbnMbBFd5L9BBp9fUPavUSkZ_EmsQNSyadkT-108-U4T0khaeLQSIhtt9eVvaCEKJjtWJ4ioRJOf8hvqkWY0.woff2 +0 -0
- package/dist/devtools-client/_fonts/lQAxeCEs1R0Lw-H9XRU1RlOARQN8J6npRsPjyEDMe5s-_DUSLEkO3tKTuun_gSnDLoQPVEnpOnyqZMOw0ByZ6PA.woff2 +0 -0
- package/dist/devtools-client/_fonts/lntlqNHKLV2n82yTwMde70QqOjcfLE2XJ5oKZ3vRPWc-z6TxpIZQdWXztWLr9_OFWqt_WJJoeGtuK_-XQMZGQwE.woff2 +0 -0
- package/dist/devtools-client/_fonts/qxAYvKsXWeYv731eb-h5TRurcdIP_W44mpNdX-HABAk-zUDeMEFlNtNbrwvT9JxLEBg0TphGy70O6RfIoIX_ZwU.woff2 +0 -0
- package/dist/devtools-client/_nuxt/B3kN3DAy.js +1 -0
- package/dist/devtools-client/_nuxt/B8PEiB0p.js +1 -0
- package/dist/devtools-client/_nuxt/C8jhSQ8l.js +1 -0
- package/dist/devtools-client/_nuxt/CJD6wrkT.js +188 -0
- package/dist/devtools-client/_nuxt/CfOsp0mU.js +1 -0
- package/dist/devtools-client/_nuxt/DKL6PHO3.js +1 -0
- package/dist/devtools-client/_nuxt/ajngqPCs.js +1 -0
- package/dist/devtools-client/_nuxt/builds/latest.json +1 -0
- package/dist/devtools-client/_nuxt/builds/meta/b800a0be-5cab-4ea6-89e3-dd3a85690a73.json +1 -0
- package/dist/devtools-client/_nuxt/dlaR8P-P.js +1 -0
- package/dist/devtools-client/_nuxt/entry.BwpOBArY.css +1 -0
- package/dist/devtools-client/_nuxt/error-404.CvOVjXeC.css +1 -0
- package/dist/devtools-client/_nuxt/error-500.BIm53nmx.css +1 -0
- package/dist/devtools-client/_nuxt/first-party.C8Ha4JLM.css +1 -0
- package/dist/devtools-client/_nuxt/index.CA-OpSj0.css +1 -0
- package/dist/devtools-client/_nuxt/registry.B9lnjF_b.css +1 -0
- package/dist/devtools-client/_nuxt/wDzz0qaB.js +1 -0
- package/dist/devtools-client/docs/index.html +1 -0
- package/dist/devtools-client/first-party/index.html +1 -0
- package/dist/devtools-client/index.html +1 -0
- package/dist/devtools-client/registry/index.html +1 -0
- package/dist/module.d.mts +29 -84
- package/dist/module.d.ts +121 -0
- package/dist/module.json +1 -1
- package/dist/module.mjs +939 -755
- package/dist/registry.d.mts +91 -4
- package/dist/registry.d.ts +93 -0
- package/dist/registry.mjs +668 -326
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMaps.d.vue.ts +15 -79
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMaps.vue +78 -180
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMaps.vue.d.ts +15 -79
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsAdvancedMarkerElement.d.vue.ts +6 -55
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsAdvancedMarkerElement.vue +12 -83
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsAdvancedMarkerElement.vue.d.ts +6 -55
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsCircle.d.vue.ts +5 -1
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsCircle.vue +24 -38
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsCircle.vue.d.ts +5 -1
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsGeoJson.d.vue.ts +43 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsGeoJson.vue +60 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsGeoJson.vue.d.ts +43 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsHeatmapLayer.d.vue.ts +4 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsHeatmapLayer.vue +22 -26
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsHeatmapLayer.vue.d.ts +4 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsInfoWindow.d.vue.ts +9 -5
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsInfoWindow.vue +56 -57
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsInfoWindow.vue.d.ts +9 -5
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsMarker.d.vue.ts +24 -41
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsMarker.vue +69 -73
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsMarker.vue.d.ts +24 -41
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsMarkerClusterer.d.vue.ts +36 -4
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsMarkerClusterer.vue +82 -37
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsMarkerClusterer.vue.d.ts +36 -4
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsOverlayView.d.vue.ts +78 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsOverlayView.vue +222 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsOverlayView.vue.d.ts +78 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPinElement.d.vue.ts +10 -3
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPinElement.vue +9 -41
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPinElement.vue.d.ts +10 -3
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolygon.d.vue.ts +7 -3
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolygon.vue +23 -38
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolygon.vue.d.ts +7 -3
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolyline.d.vue.ts +7 -3
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolyline.vue +23 -38
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsPolyline.vue.d.ts +7 -3
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsRectangle.d.vue.ts +7 -3
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsRectangle.vue +24 -38
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsRectangle.vue.d.ts +7 -3
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsStaticMap.d.vue.ts +200 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsStaticMap.vue +165 -0
- package/dist/runtime/components/GoogleMaps/ScriptGoogleMapsStaticMap.vue.d.ts +200 -0
- package/dist/runtime/components/GoogleMaps/bindGoogleMapsEvents.d.ts +13 -0
- package/dist/runtime/components/GoogleMaps/bindGoogleMapsEvents.js +8 -0
- package/dist/runtime/components/GoogleMaps/injectionKeys.d.ts +10 -0
- package/dist/runtime/components/GoogleMaps/injectionKeys.js +2 -0
- package/dist/runtime/components/GoogleMaps/useGoogleMapsResource.d.ts +48 -0
- package/dist/runtime/components/GoogleMaps/useGoogleMapsResource.js +51 -0
- package/dist/runtime/components/ScriptBlueskyEmbed.d.vue.ts +85 -0
- package/dist/runtime/components/ScriptBlueskyEmbed.vue +88 -0
- package/dist/runtime/components/ScriptBlueskyEmbed.vue.d.ts +85 -0
- package/dist/runtime/components/ScriptCrisp.vue +1 -1
- package/dist/runtime/components/ScriptGoogleAdsense.vue +1 -1
- package/dist/runtime/components/ScriptGravatar.d.vue.ts +22 -0
- package/dist/runtime/components/ScriptGravatar.vue +46 -0
- package/dist/runtime/components/ScriptGravatar.vue.d.ts +22 -0
- package/dist/runtime/components/ScriptInstagramEmbed.d.vue.ts +1 -2
- package/dist/runtime/components/ScriptInstagramEmbed.vue +8 -3
- package/dist/runtime/components/ScriptInstagramEmbed.vue.d.ts +1 -2
- package/dist/runtime/components/ScriptIntercom.vue +4 -3
- package/dist/runtime/components/ScriptPayPalButtons.d.vue.ts +43 -32
- package/dist/runtime/components/ScriptPayPalButtons.vue +48 -79
- package/dist/runtime/components/ScriptPayPalButtons.vue.d.ts +43 -32
- package/dist/runtime/components/ScriptPayPalMessages.d.vue.ts +37 -23
- package/dist/runtime/components/ScriptPayPalMessages.vue +46 -50
- package/dist/runtime/components/ScriptPayPalMessages.vue.d.ts +37 -23
- package/dist/runtime/components/ScriptStripePricingTable.vue +2 -2
- package/dist/runtime/components/ScriptVimeoPlayer.d.vue.ts +9 -0
- package/dist/runtime/components/ScriptVimeoPlayer.vue +13 -10
- package/dist/runtime/components/ScriptVimeoPlayer.vue.d.ts +9 -0
- package/dist/runtime/components/ScriptXEmbed.d.vue.ts +0 -2
- package/dist/runtime/components/ScriptXEmbed.vue +14 -8
- package/dist/runtime/components/ScriptXEmbed.vue.d.ts +0 -2
- package/dist/runtime/components/ScriptYouTubePlayer.d.vue.ts +2 -2
- package/dist/runtime/components/ScriptYouTubePlayer.vue +11 -5
- package/dist/runtime/components/ScriptYouTubePlayer.vue.d.ts +2 -2
- package/dist/runtime/composables/useScript.js +148 -8
- package/dist/runtime/composables/useScriptEventPage.js +2 -2
- package/dist/runtime/composables/useScriptTriggerConsent.d.ts +10 -0
- package/dist/runtime/composables/useScriptTriggerConsent.js +33 -20
- package/dist/runtime/composables/useScriptTriggerElement.js +1 -1
- package/dist/runtime/composables/useScriptTriggerIdleTimeout.js +1 -1
- package/dist/runtime/devtools-standalone-bridge.client.d.ts +8 -0
- package/dist/runtime/devtools-standalone-bridge.client.js +50 -0
- package/dist/runtime/registry/bing-uet.d.ts +20 -0
- package/dist/runtime/registry/bing-uet.js +29 -0
- package/dist/runtime/registry/bluesky-embed.d.ts +116 -0
- package/dist/runtime/registry/bluesky-embed.js +72 -0
- package/dist/runtime/registry/clarity.d.ts +10 -15
- package/dist/runtime/registry/clarity.js +22 -31
- package/dist/runtime/registry/cloudflare-web-analytics.d.ts +2 -13
- package/dist/runtime/registry/cloudflare-web-analytics.js +2 -14
- package/dist/runtime/registry/crisp.d.ts +10 -40
- package/dist/runtime/registry/crisp.js +2 -33
- package/dist/runtime/registry/databuddy-analytics.d.ts +2 -35
- package/dist/runtime/registry/databuddy-analytics.js +20 -45
- package/dist/runtime/registry/fathom-analytics.d.ts +7 -26
- package/dist/runtime/registry/fathom-analytics.js +3 -25
- package/dist/runtime/registry/google-adsense.d.ts +3 -11
- package/dist/runtime/registry/google-adsense.js +2 -11
- package/dist/runtime/registry/google-analytics.d.ts +3 -5
- package/dist/runtime/registry/google-analytics.js +3 -8
- package/dist/runtime/registry/google-maps.d.ts +3 -9
- package/dist/runtime/registry/google-maps.js +2 -8
- package/dist/runtime/registry/google-recaptcha.d.ts +2 -6
- package/dist/runtime/registry/google-recaptcha.js +4 -12
- package/dist/runtime/registry/google-sign-in.d.ts +2 -13
- package/dist/runtime/registry/google-sign-in.js +2 -22
- package/dist/runtime/registry/google-tag-manager.d.ts +3 -28
- package/dist/runtime/registry/google-tag-manager.js +4 -27
- package/dist/runtime/registry/gravatar.d.ts +26 -0
- package/dist/runtime/registry/gravatar.js +36 -0
- package/dist/runtime/registry/hotjar.d.ts +4 -6
- package/dist/runtime/registry/hotjar.js +2 -5
- package/dist/runtime/registry/instagram-embed.d.ts +3 -18
- package/dist/runtime/registry/instagram-embed.js +4 -19
- package/dist/runtime/registry/intercom.d.ts +5 -13
- package/dist/runtime/registry/intercom.js +2 -12
- package/dist/runtime/registry/matomo-analytics.d.ts +3 -12
- package/dist/runtime/registry/matomo-analytics.js +3 -12
- package/dist/runtime/registry/meta-pixel.d.ts +4 -6
- package/dist/runtime/registry/meta-pixel.js +2 -4
- package/dist/runtime/registry/mixpanel-analytics.d.ts +22 -0
- package/dist/runtime/registry/mixpanel-analytics.js +46 -0
- package/dist/runtime/registry/npm.d.ts +3 -7
- package/dist/runtime/registry/npm.js +2 -9
- package/dist/runtime/registry/paypal.d.ts +4 -25
- package/dist/runtime/registry/paypal.js +3 -66
- package/dist/runtime/registry/plausible-analytics.js +19 -14
- package/dist/runtime/registry/posthog.d.ts +10 -12
- package/dist/runtime/registry/posthog.js +3 -12
- package/dist/runtime/registry/reddit-pixel.d.ts +5 -6
- package/dist/runtime/registry/reddit-pixel.js +2 -4
- package/dist/runtime/registry/rybbit-analytics.d.ts +2 -14
- package/dist/runtime/registry/rybbit-analytics.js +10 -20
- package/dist/runtime/registry/schemas.d.ts +982 -0
- package/dist/runtime/registry/schemas.js +937 -0
- package/dist/runtime/registry/segment.d.ts +2 -5
- package/dist/runtime/registry/segment.js +2 -5
- package/dist/runtime/registry/snapchat-pixel.d.ts +5 -34
- package/dist/runtime/registry/snapchat-pixel.js +2 -20
- package/dist/runtime/registry/stripe.d.ts +3 -4
- package/dist/runtime/registry/stripe.js +2 -4
- package/dist/runtime/registry/tiktok-pixel.d.ts +4 -7
- package/dist/runtime/registry/tiktok-pixel.js +2 -6
- package/dist/runtime/registry/umami-analytics.d.ts +2 -31
- package/dist/runtime/registry/umami-analytics.js +2 -36
- package/dist/runtime/registry/vercel-analytics.d.ts +29 -0
- package/dist/runtime/registry/vercel-analytics.js +84 -0
- package/dist/runtime/registry/vimeo-player.d.ts +2 -2
- package/dist/runtime/registry/vimeo-player.js +1 -1
- package/dist/runtime/registry/x-embed.d.ts +3 -17
- package/dist/runtime/registry/x-embed.js +3 -18
- package/dist/runtime/registry/x-pixel.d.ts +4 -7
- package/dist/runtime/registry/x-pixel.js +2 -5
- package/dist/runtime/registry/youtube-player.d.ts +7 -7
- package/dist/runtime/registry/youtube-player.js +1 -1
- package/dist/runtime/server/bluesky-embed-image.d.ts +2 -0
- package/dist/runtime/server/bluesky-embed-image.js +7 -0
- package/dist/runtime/server/bluesky-embed.d.ts +16 -0
- package/dist/runtime/server/bluesky-embed.js +59 -0
- package/dist/runtime/server/google-maps-geocode-proxy.d.ts +2 -0
- package/dist/runtime/server/google-maps-geocode-proxy.js +34 -0
- package/dist/runtime/server/google-static-maps-proxy.js +2 -13
- package/dist/runtime/server/gravatar-proxy.d.ts +2 -0
- package/dist/runtime/server/gravatar-proxy.js +46 -0
- package/dist/runtime/server/instagram-embed-asset.js +8 -41
- package/dist/runtime/server/instagram-embed-image.js +6 -53
- package/dist/runtime/server/instagram-embed.d.ts +16 -0
- package/dist/runtime/server/instagram-embed.js +176 -35
- package/dist/runtime/server/proxy-handler.js +101 -83
- package/dist/runtime/server/utils/image-proxy.d.ts +12 -0
- package/dist/runtime/server/utils/image-proxy.js +70 -0
- package/dist/runtime/server/utils/privacy.d.ts +1 -10
- package/dist/runtime/server/utils/privacy.js +60 -40
- package/dist/runtime/server/x-embed-image.js +5 -49
- package/dist/runtime/server/x-embed.js +3 -2
- package/dist/runtime/types.d.ts +272 -51
- package/dist/runtime/types.js +0 -2
- package/dist/runtime/utils/pure.d.ts +1 -1
- package/dist/runtime/utils.d.ts +6 -4
- package/dist/runtime/utils.js +31 -14
- package/dist/stats.d.mts +202 -0
- package/dist/stats.d.ts +202 -0
- package/dist/stats.mjs +3875 -0
- package/dist/types-source.d.mts +17 -0
- package/dist/types-source.d.ts +17 -0
- package/dist/types-source.mjs +3414 -0
- package/dist/types.d.mts +4 -2
- package/package.json +35 -61
- package/README.md +0 -86
- package/dist/client/200.html +0 -1
- package/dist/client/404.html +0 -1
- package/dist/client/_nuxt/BJa0m50V.js +0 -1
- package/dist/client/_nuxt/BPQ3VLAy.js +0 -1
- package/dist/client/_nuxt/Ci5iXYuB.js +0 -1
- package/dist/client/_nuxt/DaI2y8Uz.js +0 -162
- package/dist/client/_nuxt/builds/latest.json +0 -1
- package/dist/client/_nuxt/builds/meta/9b4fb16a-3c62-48b0-8295-126cb077b5d3.json +0 -1
- package/dist/client/_nuxt/entry.D45OuV0w.css +0 -1
- package/dist/client/_nuxt/error-404.B57D-jUQ.css +0 -1
- package/dist/client/_nuxt/error-500.DTHUW7BI.css +0 -1
- package/dist/client/_nuxt/vPLZfVXe.js +0 -1
- package/dist/client/index.html +0 -1
- package/dist/runtime/components/ScriptPayPalMarks.d.vue.ts +0 -52
- package/dist/runtime/components/ScriptPayPalMarks.vue +0 -69
- package/dist/runtime/components/ScriptPayPalMarks.vue.d.ts +0 -52
- package/dist/runtime/validation/mock.d.ts +0 -42
- package/dist/runtime/validation/mock.js +0 -21
- package/dist/runtime/validation/valibot.d.ts +0 -1
- package/dist/runtime/validation/valibot.js +0 -1
- /package/dist/{client → devtools-client}/_nuxt/CVO1_9PV.js +0 -0
- /package/dist/{client → devtools-client}/_nuxt/Cp-IABpG.js +0 -0
- /package/dist/{client → devtools-client}/_nuxt/D0r3Knsf.js +0 -0
|
@@ -1,53 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const query = getQuery(event);
|
|
5
|
-
const url = query.url;
|
|
6
|
-
if (!url) {
|
|
7
|
-
throw createError({
|
|
8
|
-
statusCode: 400,
|
|
9
|
-
statusMessage: "Image URL is required"
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
let parsedUrl;
|
|
13
|
-
try {
|
|
14
|
-
parsedUrl = new URL(url);
|
|
15
|
-
} catch {
|
|
16
|
-
throw createError({
|
|
17
|
-
statusCode: 400,
|
|
18
|
-
statusMessage: "Invalid image URL"
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
22
|
-
throw createError({
|
|
23
|
-
statusCode: 400,
|
|
24
|
-
statusMessage: "Invalid URL scheme"
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
const allowedDomains = [
|
|
1
|
+
import { createImageProxyHandler } from "./utils/image-proxy.js";
|
|
2
|
+
export default createImageProxyHandler({
|
|
3
|
+
allowedDomains: [
|
|
28
4
|
"pbs.twimg.com",
|
|
29
5
|
"abs.twimg.com",
|
|
30
6
|
"video.twimg.com"
|
|
31
|
-
]
|
|
32
|
-
|
|
33
|
-
throw createError({
|
|
34
|
-
statusCode: 403,
|
|
35
|
-
statusMessage: "Domain not allowed"
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
const response = await $fetch.raw(url, {
|
|
39
|
-
timeout: 5e3,
|
|
40
|
-
headers: {
|
|
41
|
-
"Accept": "image/webp,image/jpeg,image/png,image/*,*/*;q=0.8",
|
|
42
|
-
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
|
|
43
|
-
}
|
|
44
|
-
}).catch((error) => {
|
|
45
|
-
throw createError({
|
|
46
|
-
statusCode: error.statusCode || 500,
|
|
47
|
-
statusMessage: error.statusMessage || "Failed to fetch image"
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
setHeader(event, "Content-Type", response.headers.get("content-type") || "image/jpeg");
|
|
51
|
-
setHeader(event, "Cache-Control", "public, max-age=3600, s-maxage=3600");
|
|
52
|
-
return response._data;
|
|
7
|
+
],
|
|
8
|
+
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
|
|
53
9
|
});
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { createError, defineEventHandler, getQuery, setHeader } from "h3";
|
|
2
2
|
import { $fetch } from "ofetch";
|
|
3
|
+
const TWEET_ID_RE = /^\d+$/;
|
|
3
4
|
export default defineEventHandler(async (event) => {
|
|
4
5
|
const query = getQuery(event);
|
|
5
6
|
const tweetId = query.id;
|
|
6
|
-
if (!tweetId ||
|
|
7
|
+
if (!tweetId || !TWEET_ID_RE.test(tweetId)) {
|
|
7
8
|
throw createError({
|
|
8
9
|
statusCode: 400,
|
|
9
10
|
statusMessage: "Valid Tweet ID is required"
|
|
10
11
|
});
|
|
11
12
|
}
|
|
12
|
-
const randomToken =
|
|
13
|
+
const randomToken = Array.from(Array.from({ length: 11 }), () => (Math.random() * 36).toString(36)[2]).join("");
|
|
13
14
|
const params = new URLSearchParams({ id: tweetId, token: randomToken });
|
|
14
15
|
const tweetData = await $fetch(
|
|
15
16
|
`https://cdn.syndication.twimg.com/tweet-result?${params.toString()}`,
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -1,37 +1,46 @@
|
|
|
1
|
+
import type { UseScriptInput, UseScriptOptions, VueScriptInstance } from '@unhead/vue';
|
|
1
2
|
import type { Script } from '@unhead/vue/types';
|
|
2
|
-
import type { UseScriptInput, VueScriptInstance, UseScriptOptions } from '@unhead/vue';
|
|
3
|
-
import type { ComputedRef, Ref } from 'vue';
|
|
4
|
-
import type { InferInput, ObjectSchema, ValiError } from 'valibot';
|
|
5
3
|
import type { Import } from 'unimport';
|
|
6
|
-
import type {
|
|
4
|
+
import type { InferInput, ObjectEntries, ObjectSchema, UnionSchema, ValiError } from 'valibot';
|
|
5
|
+
import type { ComputedRef, Ref } from 'vue';
|
|
6
|
+
import type { BingUetInput } from './registry/bing-uet.js';
|
|
7
|
+
import type { BlueskyEmbedInput } from './registry/bluesky-embed.js';
|
|
8
|
+
import type { ClarityInput } from './registry/clarity.js';
|
|
7
9
|
import type { CloudflareWebAnalyticsInput } from './registry/cloudflare-web-analytics.js';
|
|
10
|
+
import type { CrispInput } from './registry/crisp.js';
|
|
8
11
|
import type { DatabuddyAnalyticsInput } from './registry/databuddy-analytics.js';
|
|
9
|
-
import type { MetaPixelInput } from './registry/meta-pixel.js';
|
|
10
12
|
import type { FathomAnalyticsInput } from './registry/fathom-analytics.js';
|
|
13
|
+
import type { GoogleAdsenseInput } from './registry/google-adsense.js';
|
|
14
|
+
import type { GoogleAnalyticsInput } from './registry/google-analytics.js';
|
|
15
|
+
import type { GoogleMapsInput } from './registry/google-maps.js';
|
|
16
|
+
import type { GoogleRecaptchaInput } from './registry/google-recaptcha.js';
|
|
17
|
+
import type { GoogleSignInInput } from './registry/google-sign-in.js';
|
|
18
|
+
import type { GoogleTagManagerInput } from './registry/google-tag-manager.js';
|
|
19
|
+
import type { GravatarInput } from './registry/gravatar.js';
|
|
11
20
|
import type { HotjarInput } from './registry/hotjar.js';
|
|
21
|
+
import type { InstagramEmbedInput } from './registry/instagram-embed.js';
|
|
12
22
|
import type { IntercomInput } from './registry/intercom.js';
|
|
13
|
-
import type {
|
|
23
|
+
import type { LemonSqueezyInput } from './registry/lemon-squeezy.js';
|
|
14
24
|
import type { MatomoAnalyticsInput } from './registry/matomo-analytics.js';
|
|
15
|
-
import type {
|
|
16
|
-
import type {
|
|
17
|
-
import type { XPixelInput } from './registry/x-pixel.js';
|
|
18
|
-
import type { SnapTrPixelInput } from './registry/snapchat-pixel.js';
|
|
19
|
-
import type { YouTubePlayerInput } from './registry/youtube-player.js';
|
|
20
|
-
import type { PlausibleAnalyticsInput } from './registry/plausible-analytics.js';
|
|
25
|
+
import type { MetaPixelInput } from './registry/meta-pixel.js';
|
|
26
|
+
import type { MixpanelAnalyticsInput } from './registry/mixpanel-analytics.js';
|
|
21
27
|
import type { NpmInput } from './registry/npm.js';
|
|
22
|
-
import type { LemonSqueezyInput } from './registry/lemon-squeezy.js';
|
|
23
|
-
import type { GoogleAdsenseInput } from './registry/google-adsense.js';
|
|
24
|
-
import type { ClarityInput } from './registry/clarity.js';
|
|
25
|
-
import type { CrispInput } from './registry/crisp.js';
|
|
26
|
-
import type { GoogleAnalyticsInput } from './registry/google-analytics.js';
|
|
27
|
-
import type { GoogleTagManagerInput } from './registry/google-tag-manager.js';
|
|
28
|
-
import type { UmamiAnalyticsInput } from './registry/umami-analytics.js';
|
|
29
|
-
import type { RybbitAnalyticsInput } from './registry/rybbit-analytics.js';
|
|
30
|
-
import type { RedditPixelInput } from './registry/reddit-pixel.js';
|
|
31
28
|
import type { PayPalInput } from './registry/paypal.js';
|
|
29
|
+
import type { PlausibleAnalyticsInput } from './registry/plausible-analytics.js';
|
|
32
30
|
import type { PostHogInput } from './registry/posthog.js';
|
|
33
|
-
import type {
|
|
31
|
+
import type { RedditPixelInput } from './registry/reddit-pixel.js';
|
|
32
|
+
import type { RybbitAnalyticsInput } from './registry/rybbit-analytics.js';
|
|
33
|
+
import type { SegmentInput } from './registry/segment.js';
|
|
34
|
+
import type { SnapTrPixelInput } from './registry/snapchat-pixel.js';
|
|
35
|
+
import type { StripeInput } from './registry/stripe.js';
|
|
34
36
|
import type { TikTokPixelInput } from './registry/tiktok-pixel.js';
|
|
37
|
+
import type { UmamiAnalyticsInput } from './registry/umami-analytics.js';
|
|
38
|
+
import type { VercelAnalyticsInput } from './registry/vercel-analytics.js';
|
|
39
|
+
import type { VimeoPlayerInput } from './registry/vimeo-player.js';
|
|
40
|
+
import type { XEmbedInput } from './registry/x-embed.js';
|
|
41
|
+
import type { XPixelInput } from './registry/x-pixel.js';
|
|
42
|
+
import type { YouTubePlayerInput } from './registry/youtube-player.js';
|
|
43
|
+
import type { ProxyPrivacyInput } from './server/utils/privacy.js';
|
|
35
44
|
export type WarmupStrategy = false | 'preload' | 'preconnect' | 'dns-prefetch';
|
|
36
45
|
export type UseScriptContext<T extends Record<symbol | string, any>> = VueScriptInstance<T> & {
|
|
37
46
|
/**
|
|
@@ -58,16 +67,16 @@ export type NuxtUseScriptOptions<T extends Record<symbol | string, any> = {}> =
|
|
|
58
67
|
*
|
|
59
68
|
* Note: Using 'force' may significantly increase build time as scripts will be re-downloaded on every build.
|
|
60
69
|
*
|
|
61
|
-
* @deprecated
|
|
70
|
+
* @deprecated Bundling is now auto-enabled per-script via capabilities. Set `bundle: false` per-script to disable.
|
|
62
71
|
*/
|
|
63
72
|
bundle?: boolean | 'force';
|
|
64
73
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
74
|
+
* Control proxying for this script.
|
|
75
|
+
* When `false`, collection requests go directly to the third-party server.
|
|
76
|
+
* When `true`, collection requests are proxied through `/_scripts/p/`.
|
|
77
|
+
* Defaults based on whether the script has a `proxy` capability in the registry.
|
|
69
78
|
*/
|
|
70
|
-
|
|
79
|
+
proxy?: boolean;
|
|
71
80
|
/**
|
|
72
81
|
* Load the script in a web worker using Partytown.
|
|
73
82
|
* When enabled, adds `type="text/partytown"` to the script tag.
|
|
@@ -104,6 +113,11 @@ export type NuxtUseScriptOptions<T extends Record<symbol | string, any> = {}> =
|
|
|
104
113
|
* @internal
|
|
105
114
|
*/
|
|
106
115
|
registryMeta?: Record<string, string>;
|
|
116
|
+
/**
|
|
117
|
+
* Known third-party domains this script communicates with.
|
|
118
|
+
* @internal
|
|
119
|
+
*/
|
|
120
|
+
domains?: string[];
|
|
107
121
|
};
|
|
108
122
|
/**
|
|
109
123
|
* @internal
|
|
@@ -137,10 +151,26 @@ export interface ConsentScriptTriggerOptions {
|
|
|
137
151
|
*/
|
|
138
152
|
postConsentTrigger?: ExcludePromises<NuxtUseScriptOptions['trigger']> | (() => Promise<any>);
|
|
139
153
|
}
|
|
154
|
+
export interface NuxtDevToolsNetworkRequest {
|
|
155
|
+
url: string;
|
|
156
|
+
startTime: number;
|
|
157
|
+
duration: number;
|
|
158
|
+
transferSize: number;
|
|
159
|
+
encodedBodySize: number;
|
|
160
|
+
decodedBodySize: number;
|
|
161
|
+
initiatorType: string;
|
|
162
|
+
dns: number;
|
|
163
|
+
connect: number;
|
|
164
|
+
ssl: number;
|
|
165
|
+
ttfb: number;
|
|
166
|
+
download: number;
|
|
167
|
+
isProxied: boolean;
|
|
168
|
+
}
|
|
140
169
|
export interface NuxtDevToolsScriptInstance {
|
|
141
170
|
registryKey?: string;
|
|
142
171
|
registryMeta?: Record<string, string>;
|
|
143
172
|
src: string;
|
|
173
|
+
domains?: string[];
|
|
144
174
|
$script: VueScriptInstance<any>;
|
|
145
175
|
events: {
|
|
146
176
|
type: string;
|
|
@@ -150,19 +180,25 @@ export interface NuxtDevToolsScriptInstance {
|
|
|
150
180
|
trigger?: NuxtUseScriptOptions['trigger'];
|
|
151
181
|
at: number;
|
|
152
182
|
}[];
|
|
183
|
+
networkRequests: NuxtDevToolsNetworkRequest[];
|
|
153
184
|
}
|
|
154
185
|
export interface ScriptRegistry {
|
|
186
|
+
bingUet?: BingUetInput;
|
|
187
|
+
blueskyEmbed?: BlueskyEmbedInput;
|
|
188
|
+
carbonAds?: true;
|
|
155
189
|
crisp?: CrispInput;
|
|
156
190
|
clarity?: ClarityInput;
|
|
157
191
|
cloudflareWebAnalytics?: CloudflareWebAnalyticsInput;
|
|
158
192
|
databuddyAnalytics?: DatabuddyAnalyticsInput;
|
|
159
193
|
metaPixel?: MetaPixelInput;
|
|
160
194
|
fathomAnalytics?: FathomAnalyticsInput;
|
|
195
|
+
instagramEmbed?: InstagramEmbedInput;
|
|
161
196
|
plausibleAnalytics?: PlausibleAnalyticsInput;
|
|
162
197
|
googleAdsense?: GoogleAdsenseInput;
|
|
163
198
|
googleAnalytics?: GoogleAnalyticsInput;
|
|
164
199
|
googleMaps?: GoogleMapsInput;
|
|
165
200
|
googleRecaptcha?: GoogleRecaptchaInput;
|
|
201
|
+
googleSignIn?: GoogleSignInInput;
|
|
166
202
|
lemonSqueezy?: LemonSqueezyInput;
|
|
167
203
|
googleTagManager?: GoogleTagManagerInput;
|
|
168
204
|
hotjar?: HotjarInput;
|
|
@@ -170,58 +206,152 @@ export interface ScriptRegistry {
|
|
|
170
206
|
paypal?: PayPalInput;
|
|
171
207
|
posthog?: PostHogInput;
|
|
172
208
|
matomoAnalytics?: MatomoAnalyticsInput;
|
|
209
|
+
mixpanelAnalytics?: MixpanelAnalyticsInput;
|
|
173
210
|
rybbitAnalytics?: RybbitAnalyticsInput;
|
|
174
211
|
redditPixel?: RedditPixelInput;
|
|
175
212
|
segment?: SegmentInput;
|
|
176
213
|
stripe?: StripeInput;
|
|
177
214
|
tiktokPixel?: TikTokPixelInput;
|
|
215
|
+
xEmbed?: XEmbedInput;
|
|
178
216
|
xPixel?: XPixelInput;
|
|
179
217
|
snapchatPixel?: SnapTrPixelInput;
|
|
180
218
|
youtubePlayer?: YouTubePlayerInput;
|
|
219
|
+
vercelAnalytics?: VercelAnalyticsInput;
|
|
181
220
|
vimeoPlayer?: VimeoPlayerInput;
|
|
182
221
|
umamiAnalytics?: UmamiAnalyticsInput;
|
|
222
|
+
gravatar?: GravatarInput;
|
|
223
|
+
npm?: NpmInput;
|
|
183
224
|
[key: `${string}-npm`]: NpmInput;
|
|
184
225
|
}
|
|
185
|
-
|
|
226
|
+
/**
|
|
227
|
+
* Built-in registry script keys — not affected by module augmentation.
|
|
228
|
+
* Use this to type-check records that must enumerate all built-in scripts (logos, meta, etc.).
|
|
229
|
+
*/
|
|
230
|
+
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';
|
|
231
|
+
/**
|
|
232
|
+
* Union of all explicit registry script keys (excludes npm pattern).
|
|
233
|
+
* Includes both built-in and augmented keys.
|
|
234
|
+
*/
|
|
235
|
+
export type RegistryScriptKey = Exclude<keyof ScriptRegistry, `${string}-npm`>;
|
|
236
|
+
type RegistryConfigInput<T> = [T] extends [true] ? Record<string, never> : T;
|
|
237
|
+
export type NuxtConfigScriptRegistryEntry<T> = true | false | 'mock' | (RegistryConfigInput<T> & {
|
|
238
|
+
trigger?: NuxtUseScriptOptionsSerializable['trigger'] | false;
|
|
239
|
+
proxy?: boolean;
|
|
240
|
+
bundle?: boolean;
|
|
241
|
+
partytown?: boolean;
|
|
242
|
+
privacy?: ProxyPrivacyInput;
|
|
243
|
+
});
|
|
186
244
|
export type NuxtConfigScriptRegistry<T extends keyof ScriptRegistry = keyof ScriptRegistry> = Partial<{
|
|
187
245
|
[key in T]: NuxtConfigScriptRegistryEntry<ScriptRegistry[key]>;
|
|
188
|
-
}
|
|
246
|
+
}> & Record<string & {}, NuxtConfigScriptRegistryEntry<any>>;
|
|
189
247
|
export type UseFunctionType<T, U> = T extends {
|
|
190
248
|
use: infer V;
|
|
191
249
|
} ? V extends (...args: any) => any ? ReturnType<V> : U : U;
|
|
192
|
-
|
|
193
|
-
export type EmptyOptionsSchema = typeof _emptyOptions;
|
|
250
|
+
export type EmptyOptionsSchema = ObjectSchema<ObjectEntries, undefined>;
|
|
194
251
|
type ScriptInput = Script;
|
|
195
|
-
export type InferIfSchema<T> = T extends ObjectSchema<any, any> ? InferInput<T> : T;
|
|
196
|
-
export
|
|
252
|
+
export type InferIfSchema<T> = T extends ObjectSchema<any, any> | UnionSchema<any, any> ? InferInput<T> : T;
|
|
253
|
+
export interface RegistryScriptInputExtras<Bundelable extends boolean = true, Usable extends boolean = false> {
|
|
197
254
|
/**
|
|
198
255
|
* A unique key to use for the script, this can be used to load multiple of the same script with different options.
|
|
199
256
|
*/
|
|
200
257
|
key?: string;
|
|
201
258
|
scriptInput?: ScriptInput;
|
|
202
259
|
scriptOptions?: Omit<NuxtUseScriptOptions, Bundelable extends true ? '' : 'bundle' | Usable extends true ? '' : 'use'>;
|
|
203
|
-
}
|
|
260
|
+
}
|
|
261
|
+
export type RegistryScriptInput<T = EmptyOptionsSchema, Bundelable extends boolean = true, Usable extends boolean = false> = Partial<InferIfSchema<T>> & RegistryScriptInputExtras<Bundelable, Usable>;
|
|
262
|
+
export interface RegistryScriptServerHandler {
|
|
263
|
+
route: string;
|
|
264
|
+
handler: string;
|
|
265
|
+
middleware?: boolean;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Declares what optimization modes a script supports and what's active by default.
|
|
269
|
+
* Each flag is an independent capability that must be explicitly opted into.
|
|
270
|
+
*/
|
|
271
|
+
export interface ScriptCapabilities {
|
|
272
|
+
/** Script can be downloaded at build time and served from `/_scripts/assets/`. */
|
|
273
|
+
bundle?: boolean;
|
|
204
274
|
/**
|
|
205
|
-
*
|
|
275
|
+
* Collection requests can be proxied through `/_scripts/p/`.
|
|
276
|
+
* When combined with `bundle`: AST URL rewriting + runtime intercept.
|
|
277
|
+
* Without `bundle` (npm mode): autoInject sets SDK endpoint to proxy URL.
|
|
206
278
|
*/
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
279
|
+
proxy?: boolean;
|
|
280
|
+
/** Script can run in a web worker via Partytown. */
|
|
281
|
+
partytown?: boolean;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* A third-party domain the script communicates with.
|
|
285
|
+
* Used for proxy routing, AST rewriting, and connection warming (dns-prefetch/preconnect).
|
|
286
|
+
*/
|
|
287
|
+
export interface ScriptDomain {
|
|
288
|
+
/** The domain hostname (e.g., 'www.google-analytics.com') */
|
|
289
|
+
domain: string;
|
|
290
|
+
/**
|
|
291
|
+
* Whether this domain is used lazily (e.g., only after user interaction or SDK initialization).
|
|
292
|
+
* When `true`, connection warming uses `dns-prefetch` instead of `preconnect`.
|
|
293
|
+
* @default false
|
|
294
|
+
*/
|
|
295
|
+
lazy?: boolean;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Bundle capability config. When present, the script can be downloaded at
|
|
299
|
+
* build time and served from `/_scripts/assets/`.
|
|
300
|
+
*/
|
|
301
|
+
export interface BundleCapability {
|
|
302
|
+
/** Custom URL resolution. If omitted, the script's `src` is used. */
|
|
303
|
+
resolve?: (options?: any) => string | false;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Proxy capability config. When present, collection requests can be
|
|
307
|
+
* proxied through `/_scripts/p/`.
|
|
308
|
+
* When combined with bundle: AST URL rewriting + runtime intercept.
|
|
309
|
+
* Without bundle (npm/config mode): autoInject sets SDK endpoint to proxy URL.
|
|
310
|
+
*/
|
|
311
|
+
export interface ProxyCapability {
|
|
312
|
+
/** Third-party domains this script communicates with. */
|
|
313
|
+
domains: (string | ScriptDomain)[];
|
|
314
|
+
/** Privacy controls for proxied requests. */
|
|
315
|
+
privacy: import('../runtime/server/utils/privacy').ProxyPrivacyInput;
|
|
316
|
+
/** Auto-inject proxy endpoint into the script's SDK config. */
|
|
317
|
+
autoInject?: ProxyAutoInject;
|
|
318
|
+
/** AST-level SDK patches applied during URL rewriting. */
|
|
319
|
+
sdkPatches?: SdkPatch[];
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Declarative SDK patch applied during AST rewriting.
|
|
323
|
+
* Replaces fragile regex-based postProcess with targeted AST visitors.
|
|
324
|
+
*/
|
|
325
|
+
export type SdkPatch = {
|
|
326
|
+
type: 'neutralize-domain-check';
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Replace `<expr>.split("<separator>")[0]` patterns used by SDKs that derive
|
|
330
|
+
* their API host from `document.currentScript.src`. When bundled, the script src
|
|
331
|
+
* changes, breaking this derivation. This patch replaces the expression with
|
|
332
|
+
* the correct proxy path.
|
|
333
|
+
*/
|
|
334
|
+
| {
|
|
335
|
+
type: 'replace-src-split';
|
|
336
|
+
separator: string;
|
|
337
|
+
fromDomain: string;
|
|
338
|
+
appendPath?: string;
|
|
339
|
+
};
|
|
340
|
+
/**
|
|
341
|
+
* Partytown capability config. When present, the script can run in a
|
|
342
|
+
* web worker via Partytown.
|
|
343
|
+
*/
|
|
344
|
+
export interface PartytownCapability {
|
|
345
|
+
/** Global API forward declarations for Partytown. */
|
|
346
|
+
forwards: string[];
|
|
347
|
+
}
|
|
211
348
|
export interface RegistryScript {
|
|
212
|
-
import?: Import;
|
|
213
|
-
scriptBundling?: false | ((options?: any) => string | false);
|
|
214
349
|
/**
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
* - `false` - Explicitly disable first-party routing for this script
|
|
218
|
-
* - `undefined` - Use the default key derived from the function name
|
|
219
|
-
*
|
|
220
|
-
* When set to a string, the script's URLs will be rewritten and collection
|
|
221
|
-
* endpoints will be routed through your server when `scripts.firstParty` is enabled.
|
|
222
|
-
* @internal
|
|
350
|
+
* The config key used in `scripts.registry` in nuxt.config (e.g., 'googleAnalytics', 'plausibleAnalytics').
|
|
351
|
+
* Used for direct lookup from config to script.
|
|
223
352
|
*/
|
|
224
|
-
|
|
353
|
+
registryKey?: RegistryScriptKey;
|
|
354
|
+
import?: Import;
|
|
225
355
|
label?: string;
|
|
226
356
|
src?: string | false;
|
|
227
357
|
category?: string;
|
|
@@ -229,7 +359,98 @@ export interface RegistryScript {
|
|
|
229
359
|
light: string;
|
|
230
360
|
dark: string;
|
|
231
361
|
};
|
|
362
|
+
/** Server handlers (routes/middleware) to register when this script is enabled. */
|
|
363
|
+
serverHandlers?: RegistryScriptServerHandler[];
|
|
364
|
+
/** Valibot schema for the script's input options. */
|
|
365
|
+
schema?: ObjectSchema<ObjectEntries, any>;
|
|
366
|
+
/** Default env var field names and values for NUXT_PUBLIC_SCRIPTS_<SCRIPT>_<KEY> resolution. */
|
|
367
|
+
envDefaults?: Record<string, string>;
|
|
368
|
+
/**
|
|
369
|
+
* Bundle capability. Script can be downloaded at build time and served locally.
|
|
370
|
+
* - `true`: bundleable using the script's `src` URL
|
|
371
|
+
* - `{ resolve }`: bundleable with a custom URL resolution function
|
|
372
|
+
* - absent: not bundleable
|
|
373
|
+
*/
|
|
374
|
+
bundle?: BundleCapability | true;
|
|
375
|
+
/**
|
|
376
|
+
* Proxy capability. Collection requests are proxied through `/_scripts/p/`.
|
|
377
|
+
* - `ProxyCapability`: proxy-capable with inline config (domains, privacy, etc.)
|
|
378
|
+
* - `RegistryScriptKey` string: alias, inherits proxy config from the referenced script
|
|
379
|
+
* - absent: not proxy-capable
|
|
380
|
+
*/
|
|
381
|
+
proxy?: ProxyCapability | RegistryScriptKey;
|
|
382
|
+
/**
|
|
383
|
+
* Partytown capability. Script can run in a web worker via Partytown.
|
|
384
|
+
* - `PartytownCapability`: partytown-capable with forward declarations
|
|
385
|
+
* - absent: not partytown-capable
|
|
386
|
+
*/
|
|
387
|
+
partytown?: PartytownCapability;
|
|
232
388
|
}
|
|
233
389
|
export type ElementScriptTrigger = 'immediate' | 'visible' | string | string[] | false;
|
|
234
390
|
export type RegistryScripts = RegistryScript[];
|
|
391
|
+
export interface ProxyRewrite {
|
|
392
|
+
/** Domain and path to match (e.g., 'www.google-analytics.com/g/collect') */
|
|
393
|
+
from: string;
|
|
394
|
+
/** Local path to rewrite to (e.g., '/_scripts/p/ga/g/collect') */
|
|
395
|
+
to: string;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Global privacy override for all proxied requests.
|
|
399
|
+
*
|
|
400
|
+
* By default (`undefined`), each script uses its own privacy controls declared in the registry.
|
|
401
|
+
* Setting this overrides all per-script defaults:
|
|
402
|
+
*
|
|
403
|
+
* - `true`: full anonymization (IP, UA, language, screen, timezone, hardware)
|
|
404
|
+
* - `false`: passthrough (still strips sensitive auth headers)
|
|
405
|
+
* - `{ ip: false }`: selective override per flag
|
|
406
|
+
*/
|
|
407
|
+
export type FirstPartyPrivacy = ProxyPrivacyInput;
|
|
408
|
+
/**
|
|
409
|
+
* Auto-inject proxy endpoint into the script's SDK config.
|
|
410
|
+
* Used by scripts that let you configure the collection endpoint (PostHog, Plausible, etc.).
|
|
411
|
+
*
|
|
412
|
+
* Simple form: `{ field, target }` where target is appended to proxyPrefix.
|
|
413
|
+
* Complex form: `{ field, resolve }` for dynamic endpoint computation.
|
|
414
|
+
*/
|
|
415
|
+
export interface ProxyAutoInject {
|
|
416
|
+
/** The config field name to set (e.g., 'apiHost', 'endpoint') */
|
|
417
|
+
field: string;
|
|
418
|
+
/** Domain and path appended to proxyPrefix. Sugar for `resolve: (p) => p + '/' + target`. */
|
|
419
|
+
target?: string;
|
|
420
|
+
/** Compute the proxy endpoint value from the proxyPrefix and script config. Use for dynamic logic (e.g., region-based endpoints). */
|
|
421
|
+
resolve?: (proxyPrefix: string, config: Record<string, any>) => string;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Resolved auto-inject config with a guaranteed computeValue function.
|
|
425
|
+
* Used in ProxyConfig output after normalization.
|
|
426
|
+
*/
|
|
427
|
+
export interface ResolvedProxyAutoInject {
|
|
428
|
+
configField: string;
|
|
429
|
+
computeValue: (proxyPrefix: string, config: Record<string, any>) => string;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Proxy configuration for third-party scripts.
|
|
433
|
+
* Each supported script declares its domains, privacy controls, and optional SDK-specific hooks.
|
|
434
|
+
*
|
|
435
|
+
* The AST rewriter derives rewrite rules automatically from domains:
|
|
436
|
+
* { from: domain, to: proxyPrefix + '/' + domain }
|
|
437
|
+
*
|
|
438
|
+
* The runtime intercept plugin catches any remaining dynamic URLs at the
|
|
439
|
+
* fetch/sendBeacon/XHR/Image call site.
|
|
440
|
+
*/
|
|
441
|
+
export interface ProxyConfig {
|
|
442
|
+
/** Third-party domains to proxy. AST rewrites are derived automatically. */
|
|
443
|
+
domains: string[];
|
|
444
|
+
/**
|
|
445
|
+
* Per-script privacy controls. Each script declares what it needs.
|
|
446
|
+
* - `true` (default) = full anonymize: IP, UA, language, screen, timezone, hardware fingerprints
|
|
447
|
+
* - `false` = passthrough (still strips sensitive auth headers)
|
|
448
|
+
* - `{ ip: false }` = selective (unset flags default to `false`)
|
|
449
|
+
*/
|
|
450
|
+
privacy: ProxyPrivacyInput;
|
|
451
|
+
/** Auto-inject proxy endpoint config into the script's SDK options (resolved form) */
|
|
452
|
+
autoInject?: ResolvedProxyAutoInject;
|
|
453
|
+
/** AST-level SDK patches applied during URL rewriting. */
|
|
454
|
+
sdkPatches?: SdkPatch[];
|
|
455
|
+
}
|
|
235
456
|
export {};
|
package/dist/runtime/types.js
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
export interface ProxyRewrite {
|
|
5
5
|
/** Domain and path to match (e.g., 'www.google-analytics.com/g/collect') */
|
|
6
6
|
from: string;
|
|
7
|
-
/** Local path to rewrite to (e.g., '/_scripts/
|
|
7
|
+
/** Local path to rewrite to (e.g., '/_scripts/p/ga/g/collect') */
|
|
8
8
|
to: string;
|
|
9
9
|
}
|
package/dist/runtime/utils.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { EmptyOptionsSchema, InferIfSchema, NuxtUseScriptOptions, RegistryScriptInput, ScriptRegistry, UseFunctionType, UseScriptContext } from '#nuxt-scripts/types';
|
|
2
2
|
import type { UseScriptInput } from '@unhead/vue';
|
|
3
|
-
import type {
|
|
3
|
+
import type { ObjectSchema, UnionSchema } from 'valibot';
|
|
4
4
|
export type MaybePromise<T> = Promise<T> | T;
|
|
5
5
|
type OptionsFn<O> = (options: InferIfSchema<O>, ctx: {
|
|
6
6
|
scriptInput?: UseScriptInput & {
|
|
@@ -9,10 +9,12 @@ type OptionsFn<O> = (options: InferIfSchema<O>, ctx: {
|
|
|
9
9
|
}) => ({
|
|
10
10
|
scriptInput?: UseScriptInput;
|
|
11
11
|
scriptOptions?: NuxtUseScriptOptions;
|
|
12
|
-
schema?: O extends ObjectSchema<any, any> ? O : undefined;
|
|
12
|
+
schema?: O extends ObjectSchema<any, any> | UnionSchema<any, any> ? O : undefined;
|
|
13
13
|
clientInit?: () => void | Promise<any>;
|
|
14
14
|
scriptMode?: 'external' | 'npm';
|
|
15
15
|
});
|
|
16
16
|
export declare function scriptRuntimeConfig<T extends keyof ScriptRegistry>(key: T): ScriptRegistry[T];
|
|
17
|
+
export declare function scriptsPrefix(): string;
|
|
18
|
+
export declare function requireRegistryEndpoint(componentName: string, registryKey: string): void;
|
|
17
19
|
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>>;
|
|
18
|
-
export
|
|
20
|
+
export {};
|
package/dist/runtime/utils.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { defu } from "defu";
|
|
2
|
-
import { useRuntimeConfig } from "nuxt/app";
|
|
3
|
-
import { parseURL, withQuery
|
|
2
|
+
import { createError, useRuntimeConfig } from "nuxt/app";
|
|
3
|
+
import { parseQuery, parseURL, withQuery } from "ufo";
|
|
4
|
+
import { parse } from "valibot";
|
|
4
5
|
import { useScript } from "./composables/useScript.js";
|
|
5
6
|
import { createNpmScriptStub } from "./npm-script-stub.js";
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
const URL_MATCH_RE = /https?:\/\/[^/]+\/_nuxt\/(.+\.vue)(?:\?[^)]*)?:(\d+):(\d+)/;
|
|
8
|
+
const URL_PAREN_MATCH_RE = /\(https?:\/\/[^/]+\/_nuxt\/(.+\.vue)(?:\?[^)]*)?:(\d+):(\d+)\)/;
|
|
9
|
+
const VUE_MATCH_RE = /([^/\s]+\.vue):(\d+):(\d+)/;
|
|
10
|
+
const CLEAN_CALLER_RE = /^\s*at\s+/;
|
|
11
|
+
function validateScriptInputSchema(schema, options) {
|
|
8
12
|
if (import.meta.dev) {
|
|
9
13
|
try {
|
|
10
14
|
parse(schema, options);
|
|
@@ -17,9 +21,21 @@ function validateScriptInputSchema(key, schema, options) {
|
|
|
17
21
|
export function scriptRuntimeConfig(key) {
|
|
18
22
|
return (useRuntimeConfig().public.scripts || {})[key];
|
|
19
23
|
}
|
|
24
|
+
export function scriptsPrefix() {
|
|
25
|
+
return useRuntimeConfig().public["nuxt-scripts"]?.prefix || "/_scripts";
|
|
26
|
+
}
|
|
27
|
+
export function requireRegistryEndpoint(componentName, registryKey) {
|
|
28
|
+
const endpoints = useRuntimeConfig().public["nuxt-scripts"]?.endpoints;
|
|
29
|
+
if (!endpoints?.[registryKey]) {
|
|
30
|
+
throw createError({
|
|
31
|
+
message: `${componentName} requires \`scripts.registry.${registryKey}\` to be enabled in nuxt.config`,
|
|
32
|
+
fatal: import.meta.dev
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
20
36
|
export function useRegistryScript(registryKey, optionsFn, _userOptions) {
|
|
21
37
|
const scriptConfig = scriptRuntimeConfig(registryKey);
|
|
22
|
-
const userOptions =
|
|
38
|
+
const userOptions = defu(_userOptions || {}, typeof scriptConfig === "object" ? scriptConfig : {});
|
|
23
39
|
const options = optionsFn(userOptions, { scriptInput: userOptions.scriptInput });
|
|
24
40
|
if (options.scriptMode === "npm") {
|
|
25
41
|
return createNpmScriptStub({
|
|
@@ -45,7 +61,7 @@ export function useRegistryScript(registryKey, optionsFn, _userOptions) {
|
|
|
45
61
|
};
|
|
46
62
|
}
|
|
47
63
|
const scriptInput = defu(finalScriptInput, userOptions.scriptInput, { key: registryKey });
|
|
48
|
-
const scriptOptions =
|
|
64
|
+
const scriptOptions = { ...userOptions?.scriptOptions, ...options.scriptOptions };
|
|
49
65
|
if (import.meta.dev) {
|
|
50
66
|
const error = new Error("Stack trace for component location");
|
|
51
67
|
const stack = error.stack?.split("\n");
|
|
@@ -54,25 +70,27 @@ export function useRegistryScript(registryKey, optionsFn, _userOptions) {
|
|
|
54
70
|
);
|
|
55
71
|
let loadedFrom = "unknown";
|
|
56
72
|
if (callerLine) {
|
|
57
|
-
const urlMatch = callerLine.match(
|
|
73
|
+
const urlMatch = callerLine.match(URL_MATCH_RE) || callerLine.match(URL_PAREN_MATCH_RE);
|
|
58
74
|
if (urlMatch) {
|
|
59
75
|
const [, filePath, line, column] = urlMatch;
|
|
60
76
|
loadedFrom = `./${filePath}:${line}:${column}`;
|
|
61
77
|
} else {
|
|
62
|
-
const vueMatch = callerLine.match(
|
|
78
|
+
const vueMatch = callerLine.match(VUE_MATCH_RE);
|
|
63
79
|
if (vueMatch) {
|
|
64
80
|
const [, fileName, line, column] = vueMatch;
|
|
65
81
|
loadedFrom = `./${fileName}:${line}:${column}`;
|
|
66
82
|
} else {
|
|
67
|
-
loadedFrom = callerLine.trim().replace(
|
|
83
|
+
loadedFrom = callerLine.trim().replace(CLEAN_CALLER_RE, "");
|
|
68
84
|
}
|
|
69
85
|
}
|
|
70
86
|
}
|
|
71
|
-
|
|
72
|
-
|
|
87
|
+
const devtoolsConfig = useRuntimeConfig().public["nuxt-scripts-devtools"];
|
|
88
|
+
const registryDomains = devtoolsConfig?.scripts?.find((s) => s.registryKey === registryKey)?.domains;
|
|
89
|
+
scriptOptions.devtools = defu(scriptOptions.devtools, { registryKey, loadedFrom, domains: registryDomains });
|
|
90
|
+
if (options.schema && "entries" in options.schema) {
|
|
73
91
|
const registryMeta = {};
|
|
74
92
|
for (const k in options.schema.entries) {
|
|
75
|
-
if (options.schema.entries[k]
|
|
93
|
+
if (options.schema.entries[k]?.type !== "optional") {
|
|
76
94
|
registryMeta[k] = String(userOptions[k]);
|
|
77
95
|
}
|
|
78
96
|
}
|
|
@@ -83,7 +101,7 @@ export function useRegistryScript(registryKey, optionsFn, _userOptions) {
|
|
|
83
101
|
if (import.meta.dev) {
|
|
84
102
|
scriptOptions._validate = () => {
|
|
85
103
|
if (!userOptions.scriptInput?.src && !scriptOptions.skipValidation && options.schema) {
|
|
86
|
-
return validateScriptInputSchema(
|
|
104
|
+
return validateScriptInputSchema(options.schema, userOptions);
|
|
87
105
|
}
|
|
88
106
|
};
|
|
89
107
|
}
|
|
@@ -95,4 +113,3 @@ export function useRegistryScript(registryKey, optionsFn, _userOptions) {
|
|
|
95
113
|
};
|
|
96
114
|
return useScript(scriptInput, scriptOptions);
|
|
97
115
|
}
|
|
98
|
-
export * from "./utils/pure.js";
|