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

  1. Inspect the inputFile path in the error and remove/flatten the offending entry.
  2. Re-run the localization build into a clean directory.
  3. 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

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


AI-assisted analysis of microsoft/TypeScript@b465fdbfe1 (2026-08-12). Data as JSON: /api/errors/6758fa8cef06f9ea. Report an issue: GitHub.