Skip to content

Commit b4aed99

Browse files
committed
chore: safer import registrations
1 parent dc3be92 commit b4aed99

File tree

6 files changed

+54
-40
lines changed

6 files changed

+54
-40
lines changed

client/app.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { registry } from '../src/registry'
44
import { devtools, getScriptSize, humanFriendlyTimestamp, reactive, ref, urlToOrigin } from '#imports'
55
import { msToHumanReadable } from '~/utils/formatting'
66
7-
const scriptRegistry = registry(s => s)
7+
const scriptRegistry = await registry()
88
99
const scripts = ref({})
1010
const scriptSizes = reactive<Record<string, string>>({})

docs/app/pages/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import { breakpointsTailwind, useBreakpoints } from '@vueuse/core'
33
import { useScriptsRegistry } from '~/composables/useScriptsRegistry'
44
5-
const registry = useScriptsRegistry()
65
const breakpoints = useBreakpoints(breakpointsTailwind)
76
87
useSeoMeta({
@@ -62,6 +61,7 @@ declare global {
6261
}
6362
}
6463
}
64+
const registry = await useScriptsRegistry()
6565
6666
const confettiEl = ref()
6767
const { onLoaded } = useScript({

docs/app/pages/scripts/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ useSeoMeta({
4444
})
4545
4646
// group by category
47-
const scriptsCategories = useScriptsRegistry().reduce((acc, script) => {
47+
const scriptsCategories = (await useScriptsRegistry()).reduce((acc, script) => {
4848
if (!acc[script.category])
4949
acc[script.category] = []
5050
acc[script.category].push({

src/devtools.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { useNuxt } from '@nuxt/kit'
55
import type { ModuleOptions } from './module'
66
import { DEVTOOLS_UI_LOCAL_PORT, DEVTOOLS_UI_ROUTE } from './constants'
77

8-
export function setupDevToolsUI(options: ModuleOptions, resolve: Resolver['resolve'], nuxt: Nuxt = useNuxt()) {
9-
const clientPath = resolve('./client')
8+
export async function setupDevToolsUI(options: ModuleOptions, resolve: Resolver['resolvePath'], nuxt: Nuxt = useNuxt()) {
9+
const clientPath = await resolve('./client')
1010
const isProductionBuild = existsSync(clientPath)
1111

1212
// Serve production-built client (used when package is published)

src/module.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ export default defineNuxtModule<ModuleOptions>({
105105
debug: false,
106106
},
107107
async setup(config, nuxt) {
108-
const { resolve } = createResolver(import.meta.url)
109-
const { version, name } = await readPackageJSON(resolve('../package.json'))
110-
nuxt.options.alias['#nuxt-scripts-validator'] = resolve(`./runtime/validation/${(nuxt.options.dev || nuxt.options._prepare) ? 'valibot' : 'mock'}`)
111-
nuxt.options.alias['#nuxt-scripts'] = resolve('./runtime')
108+
const { resolvePath } = createResolver(import.meta.url)
109+
const { version, name } = await readPackageJSON(await resolvePath('../package.json'))
110+
nuxt.options.alias['#nuxt-scripts-validator'] = await resolvePath(`./runtime/validation/${(nuxt.options.dev || nuxt.options._prepare) ? 'valibot' : 'mock'}`)
111+
nuxt.options.alias['#nuxt-scripts'] = await resolvePath('./runtime')
112112
logger.level = (config.debug || nuxt.options.debug) ? 4 : 3
113113
if (!config.enabled) {
114114
// TODO fallback to useHead?
@@ -129,23 +129,36 @@ export default defineNuxtModule<ModuleOptions>({
129129
defaultScriptOptions: config.defaultScriptOptions,
130130
}
131131
addImportsDir([
132-
resolve('./runtime/composables'),
132+
await resolvePath('./runtime/composables'),
133133
])
134134

135135
addComponentsDir({
136-
path: resolve('./runtime/components'),
136+
path: await resolvePath('./runtime/components'),
137137
})
138138

139-
const scripts = registry(resolve)
139+
const scripts = await registry(resolvePath) as (RegistryScript & { _importRegistered?: boolean })[]
140+
141+
for (const script of scripts) {
142+
if (script.import?.name) {
143+
addImports({ priority: 2, ...script.import })
144+
script._importRegistered = true
145+
}
146+
}
147+
140148
nuxt.hooks.hook('modules:done', async () => {
141149
const registryScripts = [...scripts]
142150

143151
// @ts-expect-error nuxi prepare is broken to generate these types, possibly because of the runtime path
144152
await nuxt.hooks.callHook('scripts:registry', registryScripts)
145-
const registryScriptsWithImport = registryScripts.filter(i => !!i.import?.name) as Required<RegistryScript>[]
146-
addImports(registryScriptsWithImport.map(i => i.import))
153+
154+
for (const script of registryScripts) {
155+
if (script.import?.name && !script._importRegistered) {
156+
addImports({ priority: 3, ...script.import })
157+
}
158+
}
147159

148160
// compare the registryScripts to the original registry to find new scripts
161+
const registryScriptsWithImport = registryScripts.filter(i => !!i.import?.name) as Required<RegistryScript>[]
149162
const newScripts = registryScriptsWithImport.filter(i => !scripts.some(r => r.import?.name === i.import.name))
150163

151164
// augment types to support the integrations registry
@@ -215,6 +228,6 @@ ${newScripts.map((i) => {
215228
})
216229

217230
if (nuxt.options.dev)
218-
setupDevToolsUI(config, resolve)
231+
setupDevToolsUI(config, resolvePath)
219232
},
220233
})

src/registry.ts

Lines changed: 26 additions & 25 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)