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+
exportfunctionfindMissingRequiredFields(
289+
requiredFields: string[],
290+
rawInput: Record<string,any>|undefined,
291+
mergedPublicScript: Record<string,any>|undefined,
292+
): string[]{
293+
const{scriptOptions: _, ...effectiveInput}=mergedPublicScript??rawInput??{}
294+
returnrequiredFields.filter(f=>!effectiveInput[f])
295+
}
296+
283297
exportinterfaceModuleOptions{
284298
/**
285299
* Base path prefix for all script endpoints (proxy and bundled assets).
@@ -673,7 +687,10 @@ export default defineNuxtModule<ModuleOptions>({
673687
constwillAutoLoad=scriptOptions&&'trigger'inscriptOptions&&scriptOptions.trigger!==false
674688
if(willAutoLoad){
675689
constrequiredFields=extractRequiredFields(script.schema)
676-
constmissing=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+
constpublicScripts=(nuxt.options.runtimeConfig.public?.scripts??{})asRecord<string,Record<string,any>>
693+
constmissing=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
importtype{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
constposthogAutoInject={
@@ -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)