microsoft/TypeScript · error · Error
Expected ${inputFile} to be a file
Error message
Expected ${inputFile} to be a file What it means
While copying a localization directory, produceLKG.mjs stats every entry returned by readdir and throws if an entry isn't a plain file, guarding against symlinks, subdirectories, or special files leaking into the LKG.
Source
Thrown at scripts/produceLKG.mjs:39
await copyTypesMap();
await copyScriptOutputs();
await copyDeclarationOutputs();
await writeGitAttributes();
}
async function copyLibFiles() {
await copyFilesWithGlob("lib?(.*).d.ts");
}
async function copyLocalizedDiagnostics() {
for (const d of localizationDirectories) {
const inputDir = path.join(source, d);
if (!fs.statSync(inputDir).isDirectory()) throw new Error(`Expected ${inputDir} to be a directory`);
const outputDir = path.join(dest, d);
await fs.promises.mkdir(outputDir, { recursive: true });
for (const f of await fs.promises.readdir(inputDir)) {
const inputFile = path.join(inputDir, f);
if (!fs.statSync(inputFile).isFile()) throw new Error(`Expected ${inputFile} to be a file`);
const outputFile = path.join(outputDir, f);
await fs.promises.copyFile(inputFile, outputFile);
}
}
}
async function copyTypesMap() {
await copyFromBuiltLocal("typesMap.json"); // Cannot accommodate copyright header
}
async function copyScriptOutputs() {
await copyFromBuiltLocal("tsc.js");
await copyFromBuiltLocal("_tsc.js");
await copyFromBuiltLocal("tsserver.js");
await copyFromBuiltLocal("_tsserver.js");
await copyFromBuiltLocal("tsserverlibrary.js");
await copyFromBuiltLocal("typescript.js");
await copyFromBuiltLocal("typingsInstaller.js");
View on GitHub (pinned to b465fdbfe1)
Solutions
- Inspect the inputFile path in the error and remove/flatten the offending entry.
- Re-run the localization build into a clean directory.
- Ensure no post-processing step creates nested dirs or symlinks under localization output.
Defensive patterns
Strategy: validation
Validate before calling
import fs from "fs";
for (const f of await fs.promises.readdir(inputDir)) {
const p = path.join(inputDir, f);
if (!fs.statSync(p).isFile()) throw new Error(`Expected ${p} to be a file`);
} Prevention
- Ensure localization tooling emits only regular files (no symlinks/subdirs).
- Audit post-processing steps that might write nested entries.
When it happens
Trigger: An entry inside a localization source directory is a subdirectory, symlink, or other non-regular file.
Common situations: A build tool wrote a subdirectory or symlink into a localization output dir; leftover artifacts from a different toolchain.
Related errors
- Cannot replace the LKG unless all built targets are present
- Expected ${inputDir} to be a directory
- LKG cannot be created when --bundle=false
- Diagnostic code ${code} appears more than once.
- tsserverlibrary requires CommonJS; use typescript.js instead
AI-assisted analysis of microsoft/TypeScript@b465fdbfe1 (2026-08-12).
Data as JSON: /api/errors/6758fa8cef06f9ea.
Report an issue: GitHub.