Skip to content

Commit faf83ff

Browse files
committed
fix: defaultScriptOptions idleTimeout config
Fixes #535
1 parent da14392 commit faf83ff

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

src/module.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {
22
addBuildPlugin,
33
addComponentsDir,
44
addImports,
5-
addPluginTemplate, addTypeTemplate,
5+
addPluginTemplate, addTemplate, addTypeTemplate,
66
createResolver,
77
defineNuxtModule,
88
hasNuxtModule,
@@ -24,7 +24,7 @@ import type {
2424
RegistryScripts,
2525
} from './runtime/types'
2626
import { NuxtScriptsCheckScripts } from './plugins/check-scripts'
27-
import { templatePlugin } from './templates'
27+
import { templatePlugin, templateTriggerResolver } from './templates'
2828
import { relative, resolve } from 'pathe'
2929

3030
export interface ModuleOptions {
@@ -169,6 +169,13 @@ export default defineNuxtModule<ModuleOptions>({
169169
pathPrefix: false,
170170
})
171171

172+
addTemplate({
173+
filename: 'nuxt-scripts-trigger-resolver.mjs',
174+
getContents() {
175+
return templateTriggerResolver(config.defaultScriptOptions)
176+
},
177+
})
178+
172179
const scripts = await registry(resolvePath) as (RegistryScript & { _importRegistered?: boolean })[]
173180

174181
for (const script of scripts) {

src/runtime/composables/useScript.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { reactive } from 'vue'
55
import type { NuxtDevToolsScriptInstance, NuxtUseScriptOptions, UseFunctionType, UseScriptContext } from '../types'
66
import { onNuxtReady, useNuxtApp, useRuntimeConfig, injectHead } from 'nuxt/app'
77
import { logger } from '../logger'
8+
// @ts-expect-error virtual template
9+
import { resolveTrigger } from '#build/nuxt-scripts-trigger-resolver'
810

911
function useNuxtScriptRuntimeConfig() {
1012
return useRuntimeConfig().public['nuxt-scripts'] as {
@@ -27,6 +29,14 @@ export function useScript<T extends Record<symbol | string, any> = Record<symbol
2729
options.bundle = false
2830
}
2931

32+
// Handle trigger objects (idleTimeout, interaction)
33+
if (options.trigger && typeof options.trigger === 'object' && !('then' in options.trigger)) {
34+
const resolved = resolveTrigger(options.trigger)
35+
if (resolved) {
36+
options.trigger = resolved
37+
}
38+
}
39+
3040
// browser hint optimizations
3141
const id = String(resolveScriptKey(input) as keyof typeof nuxtApp._scripts)
3242
const nuxtApp = useNuxtApp()

src/templates.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,28 @@ import type { ModuleOptions } from './module'
33
import { logger } from './logger'
44
import type { RegistryScript } from '#nuxt-scripts/types'
55

6+
export function templateTriggerResolver(defaultScriptOptions?: ModuleOptions['defaultScriptOptions']) {
7+
const needsIdleTimeout = defaultScriptOptions?.trigger && typeof defaultScriptOptions.trigger === 'object' && 'idleTimeout' in defaultScriptOptions.trigger
8+
const needsInteraction = defaultScriptOptions?.trigger && typeof defaultScriptOptions.trigger === 'object' && 'interaction' in defaultScriptOptions.trigger
9+
10+
const imports = []
11+
if (needsIdleTimeout) {
12+
imports.push(`import { useScriptTriggerIdleTimeout } from '#nuxt-scripts/composables/useScriptTriggerIdleTimeout'`)
13+
}
14+
if (needsInteraction) {
15+
imports.push(`import { useScriptTriggerInteraction } from '#nuxt-scripts/composables/useScriptTriggerInteraction'`)
16+
}
17+
18+
return [
19+
...imports,
20+
`export function resolveTrigger(trigger) {`,
21+
needsIdleTimeout ? ` if ('idleTimeout' in trigger) return useScriptTriggerIdleTimeout({ timeout: trigger.idleTimeout })` : '',
22+
needsInteraction ? ` if ('interaction' in trigger) return useScriptTriggerInteraction({ events: trigger.interaction })` : '',
23+
` return null`,
24+
`}`,
25+
].filter(Boolean).join('\n')
26+
}
27+
628
export function resolveTriggerForTemplate(trigger: any): string | null {
729
if (trigger && typeof trigger === 'object') {
830
const keys = Object.keys(trigger)

0 commit comments

Comments
 (0)