mirror of https://github.com/Squidex/squidex.git
8 changed files with 586 additions and 653 deletions
@ -1,41 +0,0 @@ |
|||
const { Runner, run } = require('tslint/lib/runner'); |
|||
|
|||
const options = JSON.parse(process.argv[2]) || {}; |
|||
|
|||
function logToParent(message) { |
|||
process.stdout.write(message); |
|||
} |
|||
|
|||
function runLinter(runnerOptions, write) { |
|||
const logTsLint = message => { |
|||
write('tslint:' + message) |
|||
}; |
|||
|
|||
if (run) { |
|||
const logger = { log: logTsLint, error: logTsLint }; |
|||
|
|||
return run(runnerOptions, logger); |
|||
} else if (Runner) { |
|||
return new Promise(resolve => { |
|||
new Runner(runnerOptions, { write: logTsLint }).run(resolve); |
|||
}); |
|||
} else { |
|||
write('tsinfo:Unable to launch tslint. No suitable runner found.'); |
|||
} |
|||
} |
|||
|
|||
logToParent('tsinfo:Linting started in separate process...'); |
|||
|
|||
const runnerOptions = Object.assign({ |
|||
exclude: [], |
|||
format: 'json' |
|||
}, options); |
|||
|
|||
runLinter(runnerOptions, logToParent) |
|||
.then(() => { |
|||
logToParent('tsinfo:Linting complete.'); |
|||
|
|||
process.exit(); |
|||
}).catch(error => { |
|||
logToParent(`tserror:Error starting linter: ${error}\n${error.stack}`); |
|||
}); |
|||
@ -1,157 +0,0 @@ |
|||
const path = require('path'); |
|||
const chalk = require('chalk'); |
|||
const { fork } = require('child_process'); |
|||
|
|||
function apply(options, compiler) { |
|||
let linterProcess; |
|||
let linterPromise; |
|||
let linterIteration = 0; |
|||
|
|||
function compileHook() { |
|||
if (linterProcess && linterProcess.kill) { |
|||
// Exits any outstanding child process if one exists
|
|||
linterProcess.kill(); |
|||
} |
|||
|
|||
let { files = [] } = options; |
|||
|
|||
if (!files.length) { |
|||
process.stdout.write(chalk.yellow.bold('\n[tslint-plugin] No `files` option specified.\n')); |
|||
return; |
|||
} |
|||
|
|||
options.files = Array.isArray(files) ? files : [files]; |
|||
|
|||
// Spawn a child process to run the linter
|
|||
linterProcess = fork(path.resolve(__dirname, 'linter.js'), [JSON.stringify(options)], { |
|||
silent: true |
|||
}); |
|||
|
|||
// Use the iteration to cancel previous promises.
|
|||
linterIteration++; |
|||
|
|||
linterPromise = new Promise(resolve => { |
|||
const linterOutBuffer = []; |
|||
|
|||
linterProcess.stdout.on('data', (message) => { |
|||
if (message) { |
|||
const msg = message.toString(); |
|||
|
|||
for (let line of msg.split('\n')) { |
|||
const indexOfSeparator = line.indexOf(':'); |
|||
|
|||
if (indexOfSeparator > 0) { |
|||
const type = line.substring(0, indexOfSeparator); |
|||
const body = line.substring(indexOfSeparator + 1); |
|||
|
|||
switch (type) { |
|||
case 'tslint': { |
|||
const json = JSON.parse(body); |
|||
|
|||
for (let item of json) { |
|||
linterOutBuffer.push(item); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
case 'tsinfo': { |
|||
process.stdout.write(chalk.cyan(`[tslint-plugin] ${body}\n`)); |
|||
break; |
|||
} |
|||
case 'tserror': { |
|||
process.stderr.write(chalk.red(`[tslint-plugin] ${body}\n`)); |
|||
break; |
|||
} |
|||
default: { |
|||
process.stderr.write(msg); |
|||
} |
|||
} |
|||
} else { |
|||
process.stdout.write(line); |
|||
} |
|||
} |
|||
} |
|||
}); |
|||
|
|||
linterProcess.once('exit', () => { |
|||
resolve({ iteration: linterIteration, out: linterOutBuffer }); |
|||
|
|||
// Clean up the linterProcess when finished
|
|||
delete linterProcess; |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
function createError(message) { |
|||
const error = new Error(message); |
|||
delete error.stackTrace; |
|||
return error; |
|||
} |
|||
|
|||
function emitHook(compilation, callback) { |
|||
if (linterPromise && options.waitForLinting) { |
|||
linterPromise.then(result => { |
|||
for (let r of result.out) { |
|||
const msg = `${r.name}:${r.startPosition.line + 1}:${r.startPosition.character + 1} [tslint] ${r.ruleName}: ${r.failure}`; |
|||
|
|||
if (r.ruleSeverity === 'ERROR' || options.warningsAsError) { |
|||
compilation.errors.push(createError(msg)); |
|||
} else { |
|||
compilation.warnings.push(createError(msg)); |
|||
} |
|||
} |
|||
|
|||
callback(); |
|||
}); |
|||
} else { |
|||
callback(); |
|||
} |
|||
} |
|||
|
|||
function doneHook() { |
|||
const currentIteration = linterIteration; |
|||
|
|||
if (linterPromise && !options.waitForLinting) { |
|||
let isResolved = false; |
|||
|
|||
linterPromise.then(result => { |
|||
isResolved = true; |
|||
|
|||
// If the iterations are not the same another process has already been started and we cancel these results.
|
|||
if (result.iteration === currentIteration) { |
|||
for (let r of result.out) { |
|||
const msg = `${r.name}:${r.startPosition.line + 1}:${r.startPosition.character + 1} [tslint] ${r.ruleName}: ${r.failure}`; |
|||
|
|||
if (r.ruleSeverity === 'ERROR' || options.warningsAsError) { |
|||
process.stderr.write(chalk.red(msg + '\n')); |
|||
} else { |
|||
process.stdout.write(chalk.yellow(msg + '\n')); |
|||
} |
|||
} |
|||
} |
|||
}); |
|||
|
|||
if (!isResolved) { |
|||
process.stdout.write(chalk.cyan(`[tslint-plugin] Waiting for results...\n`)); |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (compiler.hooks) { |
|||
// Webpack 4
|
|||
compiler.hooks.compile.tap('TSLintWebpackPlugin', compileHook); |
|||
compiler.hooks.emit.tapAsync('TSLintWebpackPlugin', emitHook); |
|||
compiler.hooks.done.tap('TSLintWebpackPlugin', doneHook); |
|||
} else { |
|||
// Backwards compatibility
|
|||
compiler.plugin('compile', compileHook); |
|||
compiler.plugin('emit', emitHook); |
|||
compiler.plugin('done', doneHook); |
|||
} |
|||
} |
|||
|
|||
module.exports = function TSLintWebpackPlugin(options = {}) { |
|||
return { |
|||
apply: apply.bind(this, options) |
|||
}; |
|||
}; |
|||
File diff suppressed because it is too large
Loading…
Reference in new issue