diff --git a/packages/utils/src/GamedataLoader.ts b/packages/utils/src/GamedataLoader.ts index cf2d794..80df1cb 100644 --- a/packages/utils/src/GamedataLoader.ts +++ b/packages/utils/src/GamedataLoader.ts @@ -1,4 +1,4 @@ -import { ConfigJsonError, fetchConfigJson, isMissingResource } from './JsonParser'; +import { ConfigJsonError, fetchConfigJson, isMissingResource, resolveJsonMode } from './JsonParser'; import { NitroLogger } from './NitroLogger'; export const DEFAULT_TIERS = [ 'core', 'custom', 'seasonal' ] as const; @@ -45,10 +45,20 @@ const tryFetchManifest = async (url: string): Promise => } }; -// Try .json5 first, then .json — both treated as optional. Anything other -// than 404 on either bubbles up. +// Pick the manifest extension from the active JSON mode instead of always +// probing both — that just doubles the failed requests on startup. +// json5 -> only .json5 +// legacy -> only .json +// auto -> try .json5 first, fall back to .json +// All treated as optional (a clean 404 -> null); anything else bubbles up. const tryFetchManifestPair = async (baseUrl: string, name: string): Promise => { + const mode = resolveJsonMode(); + + if(mode === 'json5') return tryFetchManifest(joinUrl(baseUrl, `${ name }.json5`)); + + if(mode === 'legacy') return tryFetchManifest(joinUrl(baseUrl, `${ name }.json`)); + const json5 = await tryFetchManifest(joinUrl(baseUrl, `${ name }.json5`)); if(json5 !== null) return json5; diff --git a/packages/utils/src/JsonParser.ts b/packages/utils/src/JsonParser.ts index 46f3631..af9f857 100644 --- a/packages/utils/src/JsonParser.ts +++ b/packages/utils/src/JsonParser.ts @@ -27,7 +27,7 @@ export class ConfigJsonError extends Error export const isMissingResource = (err: unknown): boolean => err instanceof ConfigJsonError && err.phase === 'fetch' && err.httpStatus === 404; -const resolveJsonMode = (): 'legacy' | 'json5' | 'auto' => +export const resolveJsonMode = (): 'legacy' | 'json5' | 'auto' => { try {