{"record":{"id":"2b0d33afb20427d3","repo":"vuejs/core","slug":"vue-compiler-sfc-globaltypefiles-requires-fs-acc","errorCode":null,"errorMessage":"[vue/compiler-sfc] globalTypeFiles requires fs access.","messagePattern":"\\[vue/compiler-sfc\\] globalTypeFiles requires fs access\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/compiler-sfc/src/script/resolveType.ts","lineNumber":879,"sourceCode":"    return qualifiedNameToPath(ref)\n  } else {\n    return 'default'\n  }\n}\n\nfunction qualifiedNameToPath(node: Identifier | TSQualifiedName): string[] {\n  if (node.type === 'Identifier') {\n    return [node.name]\n  } else {\n    return [...qualifiedNameToPath(node.left), node.right.name]\n  }\n}\n\nfunction resolveGlobalScope(ctx: TypeResolveContext): TypeScope[] | undefined {\n  if (ctx.options.globalTypeFiles) {\n    const fs = resolveFS(ctx)\n    if (!fs) {\n      throw new Error('[vue/compiler-sfc] globalTypeFiles requires fs access.')\n    }\n    return ctx.options.globalTypeFiles.map(file =>\n      fileToScope(ctx, normalizePath(file), true),\n    )\n  }\n}\n\nlet ts: typeof TS | undefined\nlet loadTS: (() => typeof TS) | undefined\n\n/**\n * @private\n */\nexport function registerTS(_loadTS: () => typeof TS): void {\n  loadTS = () => {\n    try {\n      return _loadTS()\n    } catch (err: any) {","sourceCodeStart":861,"sourceCodeEnd":897,"githubUrl":"https://github.com/vuejs/core/blob/a2b40db9a83b36ed9da3a16403cf8f040262d73f/packages/compiler-sfc/src/script/resolveType.ts#L861-L897","documentation":"Thrown by resolveGlobalScope in @vue/compiler-sfc's type-resolver when options.globalTypeFiles is set but no filesystem is available. Reading global .ts type files requires Node fs (or an injected fs), and resolveFS(ctx) returned undefined. The guard at resolveType.ts:879 fails fast rather than silently dropping global types.","triggerScenarios":"Calling compileScript with globalTypeFiles populated from an environment where neither ctx.fs nor options.fs nor ts.sys provides a filesystem (e.g. a pure browser or constrained runtime); forgetting to register TypeScript via registerTS before relying on globalTypeFiles.","commonSituations":"Using globalTypeFiles (a relatively new feature for shared global TS type context) in a browser build or a sandboxed bundler; downgrading TypeScript availability at runtime; misconfiguring a custom fs option.","solutions":["Provide an fs implementation via SFCScriptCompileOptions.fs (a custom or memfs-backed fs) before using globalTypeFiles.","Ensure TypeScript is registered with registerTS so that ts.sys can serve as the filesystem fallback (resolveFS uses ctx.options.fs || ts?.sys).","Remove globalTypeFiles from options when running in an environment without fs access; rely on per-file type imports instead."],"exampleFix":"// before\ncompileScript(sfc, { id, globalTypeFiles: ['./types/shims.d.ts'] })\n\n// after — supply an fs (here, Node's fs)\nimport * as nodeFs from 'fs'\ncompileScript(sfc, {\n  id,\n  globalTypeFiles: ['./types/shims.d.ts'],\n  fs: nodeFs,\n})","handlingStrategy":"validation","validationCode":"// Provide an fs whenever you set globalTypeFiles.\nimport * as nodeFs from 'fs'\nfunction safeCompileScript(sfc, opts) {\n  if (opts.globalTypeFiles && !opts.fs) {\n    opts = { ...opts, fs: nodeFs }\n  }\n  return compileScript(sfc, opts)\n}","typeGuard":"function hasFs(opts: unknown): boolean {\n  return !!opts && typeof (opts as any).fs === 'object' && typeof (opts as any).fs?.readFile === 'function'\n}","tryCatchPattern":null,"preventionTips":["Always pass an fs when using globalTypeFiles (Node fs, memfs, or a custom implementation).","registerTS() so ts.sys can serve as a filesystem fallback.","In browser/constrained runtimes, omit globalTypeFiles and use local type imports instead."],"tags":["vue","compiler-sfc","typescript","resolvetype","filesystem","configuration"],"backgroundTag":null,"analyzedSha":"a2b40db9a83b36ed9da3a16403cf8f040262d73f","analyzedAt":"2026-08-12T14:21:14.989Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}