Skip to content

Commit a53ab33

Browse files
committed
fix: gracefully handle production only scripts
Fixes #479
1 parent 712a869 commit a53ab33

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

src/runtime/composables/useScript.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useScript as _useScript } from '@unhead/vue/scripts'
44
import { reactive } from 'vue'
55
import type { NuxtDevToolsScriptInstance, NuxtUseScriptOptions, UseFunctionType, UseScriptContext } from '../types'
66
import { onNuxtReady, useNuxtApp, useRuntimeConfig, injectHead } from '#imports'
7+
import { logger } from '../logger'
78

89
function useNuxtScriptRuntimeConfig() {
910
return useRuntimeConfig().public['nuxt-scripts'] as {
@@ -36,7 +37,19 @@ export function useScript<T extends Record<symbol | string, any> = Record<symbol
3637
nuxtApp.$scripts = nuxtApp.$scripts! || reactive({})
3738
const exists = !!(nuxtApp.$scripts as Record<string, any>)?.[id]
3839

39-
if (options.trigger === 'onNuxtReady' || options.trigger === 'client') {
40+
const err = options._validate?.()
41+
if (import.meta.dev && import.meta.client && err) {
42+
// never resolves
43+
options.trigger = new Promise(() => {})
44+
if (!exists) {
45+
let out = `Skipping script \`${id}\` due to invalid options:\n`
46+
for (const e of err.issues) {
47+
out += (` ${e.message}\n`)
48+
}
49+
logger.info(out)
50+
}
51+
}
52+
else if (options.trigger === 'onNuxtReady' || options.trigger === 'client') {
4053
if (!options.warmupStrategy) {
4154
options.warmupStrategy = 'preload'
4255
}
@@ -51,6 +64,12 @@ export function useScript<T extends Record<symbol | string, any> = Record<symbol
5164
nuxtApp.$scripts[id] = undefined
5265
return _remove()
5366
}
67+
instance.load = async () => {
68+
if (err) {
69+
return Promise.reject(err)
70+
}
71+
return instance.load()
72+
}
5473
nuxtApp.$scripts[id] = instance
5574
// used for devtools integration
5675
if (import.meta.dev && import.meta.client) {
@@ -97,7 +116,6 @@ export function useScript<T extends Record<symbol | string, any> = Record<symbol
97116
syncScripts()
98117
})
99118
payload.$script = instance
100-
const err = options._validate?.()
101119
if (err) {
102120
payload.events.push({
103121
type: 'status',

src/runtime/logger.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { createConsola } from 'consola'
2+
3+
export const logger = createConsola({
4+
defaults: {
5+
tag: 'nuxt-scripts',
6+
},
7+
})

src/runtime/utils.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ function validateScriptInputSchema<T extends GenericSchema>(key: string, schema:
2222
parse(schema, options)
2323
}
2424
catch (_e) {
25-
const e = _e as ValiError<any>
26-
console.error(e.issues.map((i: any) => `${key}.${i.path?.map((i: any) => i.key).join(',')}: ${i.message}`).join('\n'))
27-
return e
25+
return _e as ValiError<any>
2826
}
2927
}
3028
return null

0 commit comments

Comments
 (0)