133 lines
6.8 KiB
JavaScript
133 lines
6.8 KiB
JavaScript
"use strict";
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.tapStartToRunWorkers = void 0;
|
|
const node_abort_controller_1 = require("node-abort-controller");
|
|
const files_change_1 = require("../files-change");
|
|
const infrastructure_logger_1 = require("../infrastructure-logger");
|
|
const plugin_hooks_1 = require("../plugin-hooks");
|
|
const plugin_pools_1 = require("../plugin-pools");
|
|
const intercept_done_to_get_dev_server_tap_1 = require("./intercept-done-to-get-dev-server-tap");
|
|
const tap_after_compile_to_get_issues_1 = require("./tap-after-compile-to-get-issues");
|
|
const tap_done_to_async_get_issues_1 = require("./tap-done-to-async-get-issues");
|
|
function tapStartToRunWorkers(compiler, getIssuesWorker, getDependenciesWorker, config, state) {
|
|
const hooks = (0, plugin_hooks_1.getPluginHooks)(compiler);
|
|
const { log, debug } = (0, infrastructure_logger_1.getInfrastructureLogger)(compiler);
|
|
compiler.hooks.run.tap('ForkTsCheckerWebpackPlugin', () => {
|
|
if (!state.initialized) {
|
|
debug('Initializing plugin for single run (not async).');
|
|
state.initialized = true;
|
|
state.watching = false;
|
|
(0, tap_after_compile_to_get_issues_1.tapAfterCompileToGetIssues)(compiler, config, state);
|
|
}
|
|
});
|
|
compiler.hooks.watchRun.tap('ForkTsCheckerWebpackPlugin', () => __awaiter(this, void 0, void 0, function* () {
|
|
if (!state.initialized) {
|
|
state.initialized = true;
|
|
state.watching = true;
|
|
if (config.async) {
|
|
debug('Initializing plugin for watch run (async).');
|
|
(0, tap_done_to_async_get_issues_1.tapDoneToAsyncGetIssues)(compiler, config, state);
|
|
(0, intercept_done_to_get_dev_server_tap_1.interceptDoneToGetDevServerTap)(compiler, config, state);
|
|
}
|
|
else {
|
|
debug('Initializing plugin for watch run (not async).');
|
|
(0, tap_after_compile_to_get_issues_1.tapAfterCompileToGetIssues)(compiler, config, state);
|
|
}
|
|
}
|
|
}));
|
|
compiler.hooks.compilation.tap('ForkTsCheckerWebpackPlugin', (compilation) => __awaiter(this, void 0, void 0, function* () {
|
|
if (compilation.compiler !== compiler) {
|
|
// run only for the compiler that the plugin was registered for
|
|
return;
|
|
}
|
|
// get current iteration number
|
|
const iteration = ++state.iteration;
|
|
// abort previous iteration
|
|
if (state.abortController) {
|
|
debug(`Aborting iteration ${iteration - 1}.`);
|
|
state.abortController.abort();
|
|
}
|
|
// create new abort controller for the new iteration
|
|
const abortController = new node_abort_controller_1.AbortController();
|
|
state.abortController = abortController;
|
|
let filesChange = {};
|
|
if (state.watching) {
|
|
filesChange = (0, files_change_1.consumeFilesChange)(compiler);
|
|
log([
|
|
'Calling reporter service for incremental check.',
|
|
` Changed files: ${JSON.stringify(filesChange.changedFiles)}`,
|
|
` Deleted files: ${JSON.stringify(filesChange.deletedFiles)}`,
|
|
].join('\n'));
|
|
}
|
|
else {
|
|
log('Calling reporter service for single check.');
|
|
}
|
|
filesChange = yield hooks.start.promise(filesChange, compilation);
|
|
let aggregatedFilesChange = filesChange;
|
|
if (state.aggregatedFilesChange) {
|
|
aggregatedFilesChange = (0, files_change_1.aggregateFilesChanges)([aggregatedFilesChange, filesChange]);
|
|
debug([
|
|
`Aggregating with previous files change, iteration ${iteration}.`,
|
|
` Changed files: ${JSON.stringify(aggregatedFilesChange.changedFiles)}`,
|
|
` Deleted files: ${JSON.stringify(aggregatedFilesChange.deletedFiles)}`,
|
|
].join('\n'));
|
|
}
|
|
state.aggregatedFilesChange = aggregatedFilesChange;
|
|
// submit one at a time for a single compiler
|
|
state.issuesPromise = (state.issuesPromise || Promise.resolve())
|
|
// resolve to undefined on error
|
|
.catch(() => undefined)
|
|
.then(() => {
|
|
// early return
|
|
if (abortController.signal.aborted) {
|
|
return undefined;
|
|
}
|
|
debug(`Submitting the getIssuesWorker to the pool, iteration ${iteration}.`);
|
|
return plugin_pools_1.issuesPool.submit(() => __awaiter(this, void 0, void 0, function* () {
|
|
try {
|
|
debug(`Running the getIssuesWorker, iteration ${iteration}.`);
|
|
const issues = yield getIssuesWorker(aggregatedFilesChange, state.watching);
|
|
if (state.aggregatedFilesChange === aggregatedFilesChange) {
|
|
state.aggregatedFilesChange = undefined;
|
|
}
|
|
if (state.abortController === abortController) {
|
|
state.abortController = undefined;
|
|
}
|
|
return issues;
|
|
}
|
|
catch (error) {
|
|
hooks.error.call(error, compilation);
|
|
return undefined;
|
|
}
|
|
finally {
|
|
debug(`The getIssuesWorker finished its job, iteration ${iteration}.`);
|
|
}
|
|
}), abortController.signal);
|
|
});
|
|
debug(`Submitting the getDependenciesWorker to the pool, iteration ${iteration}.`);
|
|
state.dependenciesPromise = plugin_pools_1.dependenciesPool.submit(() => __awaiter(this, void 0, void 0, function* () {
|
|
try {
|
|
debug(`Running the getDependenciesWorker, iteration ${iteration}.`);
|
|
return yield getDependenciesWorker(filesChange);
|
|
}
|
|
catch (error) {
|
|
hooks.error.call(error, compilation);
|
|
return undefined;
|
|
}
|
|
finally {
|
|
debug(`The getDependenciesWorker finished its job, iteration ${iteration}.`);
|
|
}
|
|
})); // don't pass abortController.signal because getDependencies() is blocking
|
|
}));
|
|
}
|
|
exports.tapStartToRunWorkers = tapStartToRunWorkers;
|