bpms_site/.svn/pristine/1c/1cd264b1fd69d538fc709dd8ec359c2e7c83e8fc.svn-base
2025-11-02 16:38:49 +03:30

102 lines
4.9 KiB
Plaintext

import path from "path";
import * as Log from "./output/log";
import { Worker as JestWorker } from "next/dist/compiled/jest-worker";
import { verifyAndLint } from "../lib/verifyAndLint";
import createSpinner from "./spinner";
import { eventTypeCheckCompleted } from "../telemetry/events";
import isError from "../lib/is-error";
/**
* typescript will be loaded in "next/lib/verifyTypeScriptSetup" and
* then passed to "next/lib/typescript/runTypeCheck" as a parameter.
*
* Since it is impossible to pass a function from main thread to a worker,
* instead of running "next/lib/typescript/runTypeCheck" in a worker,
* we will run entire "next/lib/verifyTypeScriptSetup" in a worker instead.
*/ function verifyTypeScriptSetup(dir, distDir, intentDirs, typeCheckPreflight, tsconfigPath, disableStaticImages, cacheDir, enableWorkerThreads, hasAppDir, hasPagesDir) {
const typeCheckWorker = new JestWorker(require.resolve("../lib/verifyTypeScriptSetup"), {
numWorkers: 1,
enableWorkerThreads,
maxRetries: 0
});
typeCheckWorker.getStdout().pipe(process.stdout);
typeCheckWorker.getStderr().pipe(process.stderr);
return typeCheckWorker.verifyTypeScriptSetup({
dir,
distDir,
intentDirs,
typeCheckPreflight,
tsconfigPath,
disableStaticImages,
cacheDir,
hasAppDir,
hasPagesDir
}).then((result)=>{
typeCheckWorker.end();
return result;
});
}
export async function startTypeChecking({ cacheDir, config, dir, ignoreESLint, nextBuildSpan, pagesDir, runLint, shouldLint, telemetry, appDir }) {
const ignoreTypeScriptErrors = Boolean(config.typescript.ignoreBuildErrors);
const eslintCacheDir = path.join(cacheDir, "eslint/");
if (ignoreTypeScriptErrors) {
Log.info("Skipping validation of types");
}
if (runLint && ignoreESLint) {
// only print log when build require lint while ignoreESLint is enabled
Log.info("Skipping linting");
}
let typeCheckingAndLintingSpinnerPrefixText;
let typeCheckingAndLintingSpinner;
if (!ignoreTypeScriptErrors && shouldLint) {
typeCheckingAndLintingSpinnerPrefixText = "Linting and checking validity of types";
} else if (!ignoreTypeScriptErrors) {
typeCheckingAndLintingSpinnerPrefixText = "Checking validity of types";
} else if (shouldLint) {
typeCheckingAndLintingSpinnerPrefixText = "Linting";
}
// we will not create a spinner if both ignoreTypeScriptErrors and ignoreESLint are
// enabled, but we will still verifying project's tsconfig and dependencies.
if (typeCheckingAndLintingSpinnerPrefixText) {
typeCheckingAndLintingSpinner = createSpinner(typeCheckingAndLintingSpinnerPrefixText);
}
const typeCheckStart = process.hrtime();
try {
const [[verifyResult, typeCheckEnd]] = await Promise.all([
nextBuildSpan.traceChild("verify-typescript-setup").traceAsyncFn(()=>verifyTypeScriptSetup(dir, config.distDir, [
pagesDir,
appDir
].filter(Boolean), !ignoreTypeScriptErrors, config.typescript.tsconfigPath, config.images.disableStaticImages, cacheDir, config.experimental.workerThreads, !!appDir, !!pagesDir).then((resolved)=>{
const checkEnd = process.hrtime(typeCheckStart);
return [
resolved,
checkEnd
];
})),
shouldLint && nextBuildSpan.traceChild("verify-and-lint").traceAsyncFn(async ()=>{
var _config_eslint;
await verifyAndLint(dir, eslintCacheDir, (_config_eslint = config.eslint) == null ? void 0 : _config_eslint.dirs, config.experimental.workerThreads, telemetry);
})
]);
typeCheckingAndLintingSpinner == null ? void 0 : typeCheckingAndLintingSpinner.stopAndPersist();
if (!ignoreTypeScriptErrors && verifyResult) {
var _verifyResult_result, _verifyResult_result1, _verifyResult_result2;
telemetry.record(eventTypeCheckCompleted({
durationInSeconds: typeCheckEnd[0],
typescriptVersion: verifyResult.version,
inputFilesCount: (_verifyResult_result = verifyResult.result) == null ? void 0 : _verifyResult_result.inputFilesCount,
totalFilesCount: (_verifyResult_result1 = verifyResult.result) == null ? void 0 : _verifyResult_result1.totalFilesCount,
incremental: (_verifyResult_result2 = verifyResult.result) == null ? void 0 : _verifyResult_result2.incremental
}));
}
} catch (err) {
// prevent showing jest-worker internal error as it
// isn't helpful for users and clutters output
if (isError(err) && err.message === "Call retries were exceeded") {
await telemetry.flush();
process.exit(1);
}
throw err;
}
}
//# sourceMappingURL=type-check.js.map