Skip to content

Commit 6129314

Browse files
fix: validate required registry fields after runtime merge (#762)
Co-authored-by: Harlan Wilton <harlan@harlanzw.com>
1 parent f6c25a5 commit 6129314

2 files changed

Lines changed: 43 additions & 2 deletions

File tree

packages/script/src/module.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,20 @@ export function resolveConfiguredProxyDomains(
280280
return [...domains].sort()
281281
}
282282

283+
/**
284+
* Compute missing required fields for a registry entry, using the merged
285+
* runtimeConfig as source of truth so that env vars and runtimeConfig.public.scripts
286+
* count toward satisfying the schema.
287+
*/
288+
export function findMissingRequiredFields(
289+
requiredFields: string[],
290+
rawInput: Record<string, any> | undefined,
291+
mergedPublicScript: Record<string, any> | undefined,
292+
): string[] {
293+
const { scriptOptions: _, ...effectiveInput } = mergedPublicScript ?? rawInput ?? {}
294+
return requiredFields.filter(f => !effectiveInput[f])
295+
}
296+
283297
export interface ModuleOptions {
284298
/**
285299
* Base path prefix for all script endpoints (proxy and bundled assets).
@@ -673,7 +687,10 @@ export default defineNuxtModule<ModuleOptions>({
673687
const willAutoLoad = scriptOptions && 'trigger' in scriptOptions && scriptOptions.trigger !== false
674688
if (willAutoLoad) {
675689
const requiredFields = extractRequiredFields(script.schema)
676-
const missing = requiredFields.filter(f => !input[f])
690+
// Check the merged runtimeConfig (input + env defaults + NUXT_PUBLIC_SCRIPTS_*),
691+
// not just the raw registry input — required fields may be supplied via env.
692+
const publicScripts = (nuxt.options.runtimeConfig.public?.scripts ?? {}) as Record<string, Record<string, any>>
693+
const missing = findMissingRequiredFields(requiredFields, input, publicScripts[key])
677694
if (missing.length) {
678695
logger.warn(`[nuxt-scripts] registry.${key}: missing required field${missing.length > 1 ? 's' : ''} ${missing.map(f => `'${f}'`).join(', ')}. The script infrastructure is registered but will not function without ${missing.length > 1 ? 'them' : 'it'}.`)
679696
}

test/unit/setup.test.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { NuxtConfigScriptRegistry } from '../../packages/script/src/runtime/types'
22
import { describe, expect, it } from 'vitest'
3-
import { applyAutoInject, resolveConfiguredProxyDomains } from '../../packages/script/src/module'
3+
import { applyAutoInject, findMissingRequiredFields, resolveConfiguredProxyDomains } from '../../packages/script/src/module'
44

55
describe('applyAutoInject', () => {
66
const posthogAutoInject = {
@@ -149,3 +149,27 @@ describe('resolveConfiguredProxyDomains', () => {
149149
})).toEqual(['cdn.analytics.example.com', 'events.analytics.example.com'])
150150
})
151151
})
152+
153+
describe('findMissingRequiredFields', () => {
154+
it('flags fields missing from both raw input and merged runtimeConfig', () => {
155+
expect(findMissingRequiredFields(['id'], {}, undefined)).toEqual(['id'])
156+
})
157+
158+
it('treats fields satisfied via raw input as present', () => {
159+
expect(findMissingRequiredFields(['id'], { id: 'G-123' }, undefined)).toEqual([])
160+
})
161+
162+
it('treats fields supplied only via merged runtimeConfig.public.scripts as present', () => {
163+
// Reproduces #761: id arrives via NUXT_PUBLIC_SCRIPTS_* / runtimeConfig and is
164+
// merged into runtimeConfig.public.scripts before validation runs.
165+
expect(findMissingRequiredFields(['id'], {}, { id: 'G-123' })).toEqual([])
166+
})
167+
168+
it('ignores `scriptOptions` carried on the merged entry', () => {
169+
expect(findMissingRequiredFields(['id'], {}, { scriptOptions: { bundle: true } })).toEqual(['id'])
170+
})
171+
172+
it('returns only the still-missing subset', () => {
173+
expect(findMissingRequiredFields(['id', 'apiKey'], {}, { id: 'G-123' })).toEqual(['apiKey'])
174+
})
175+
})

0 commit comments

Comments
 (0)