102 lines
4.9 KiB
Plaintext
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 |