You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.5 KiB
162 lines
4.5 KiB
1 month ago
|
/**
|
||
|
* @author Toru Nagashima
|
||
|
* @copyright 2016 Toru Nagashima. All rights reserved.
|
||
|
* See LICENSE file in root directory for full license.
|
||
|
*/
|
||
|
'use strict'
|
||
|
|
||
|
// ------------------------------------------------------------------------------
|
||
|
// Requirements
|
||
|
// ------------------------------------------------------------------------------
|
||
|
|
||
|
const cp = require('child_process')
|
||
|
const fs = require('fs')
|
||
|
const path = require('path')
|
||
|
const BufferStream = require('./buffer-stream')
|
||
|
|
||
|
// ------------------------------------------------------------------------------
|
||
|
// Helpers
|
||
|
// ------------------------------------------------------------------------------
|
||
|
|
||
|
const FILE_NAME = 'test.txt'
|
||
|
const NPM_RUN_ALL = path.resolve(__dirname, '../../bin/npm-run-all/index.js')
|
||
|
const RUN_P = path.resolve(__dirname, '../../bin/run-p/index.js')
|
||
|
const RUN_S = path.resolve(__dirname, '../../bin/run-s/index.js')
|
||
|
|
||
|
/**
|
||
|
* Spawns the given script with the given arguments.
|
||
|
*
|
||
|
* @param {string} filePath - The file path to be executed.
|
||
|
* @param {string[]} args - The arguments to execute.
|
||
|
* @param {Writable} [stdout] - The writable stream to receive stdout.
|
||
|
* @param {Writable} [stderr] - The writable stream to receive stderr.
|
||
|
* @returns {Promise<void>} The promise which becomes fulfilled if the child
|
||
|
* process finished.
|
||
|
*/
|
||
|
function spawn (filePath, args, stdout, stderr) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const child = cp.spawn(
|
||
|
process.execPath,
|
||
|
[filePath].concat(args),
|
||
|
{ stdio: 'pipe' }
|
||
|
)
|
||
|
const out = new BufferStream()
|
||
|
const error = new BufferStream()
|
||
|
|
||
|
if (stdout != null) {
|
||
|
child.stdout.pipe(stdout)
|
||
|
}
|
||
|
if (stderr != null) {
|
||
|
child.stderr.pipe(stderr)
|
||
|
} else {
|
||
|
child.stderr.pipe(error)
|
||
|
}
|
||
|
child.stdout.pipe(out)
|
||
|
child.on('close', (exitCode) => {
|
||
|
if (exitCode) {
|
||
|
reject(new Error(error.value || 'Exited with non-zero code.'))
|
||
|
} else {
|
||
|
resolve()
|
||
|
}
|
||
|
})
|
||
|
child.on('error', reject)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// ------------------------------------------------------------------------------
|
||
|
// Public Interface
|
||
|
// ------------------------------------------------------------------------------
|
||
|
|
||
|
/**
|
||
|
* Gets the result text from `test.txt`.
|
||
|
*
|
||
|
* @returns {string|null} The result text.
|
||
|
*/
|
||
|
module.exports.result = function result () {
|
||
|
try {
|
||
|
return fs.readFileSync(FILE_NAME, { encoding: 'utf8' })
|
||
|
} catch (err) {
|
||
|
if (err.code === 'ENOENT') {
|
||
|
return null
|
||
|
}
|
||
|
throw err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Appends text to `test.txt`.
|
||
|
*
|
||
|
* @param {string} content - A text to append.
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
module.exports.appendResult = function appendResult (content) {
|
||
|
fs.appendFileSync(FILE_NAME, content)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes `test.txt`.
|
||
|
*
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
module.exports.removeResult = function removeResult () {
|
||
|
try {
|
||
|
fs.unlinkSync(FILE_NAME)
|
||
|
} catch (err) {
|
||
|
if (err.code === 'ENOENT') {
|
||
|
return
|
||
|
}
|
||
|
throw err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delay.
|
||
|
*
|
||
|
* @param {number} timeoutInMillis - The time to delay.
|
||
|
* @returns {Promise<void>} The promise which fulfilled after the given time.
|
||
|
*/
|
||
|
module.exports.delay = function delay (timeoutInMillis) {
|
||
|
return new Promise(resolve => {
|
||
|
setTimeout(resolve, timeoutInMillis)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Executes `npm-run-all` with the given arguments.
|
||
|
*
|
||
|
* @param {string[]} args - The arguments to execute.
|
||
|
* @param {Writable} [stdout] - The writable stream to receive stdout.
|
||
|
* @param {Writable} [stderr] - The writable stream to receive stderr.
|
||
|
* @returns {Promise<void>} The promise which becomes fulfilled if the child
|
||
|
* process finished.
|
||
|
*/
|
||
|
module.exports.runAll = function runAll (args, stdout, stderr) {
|
||
|
return spawn(NPM_RUN_ALL, args, stdout, stderr)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Executes `run-p` with the given arguments.
|
||
|
*
|
||
|
* @param {string[]} args - The arguments to execute.
|
||
|
* @param {Writable} [stdout] - The writable stream to receive stdout.
|
||
|
* @param {Writable} [stderr] - The writable stream to receive stderr.
|
||
|
* @returns {Promise<void>} The promise which becomes fulfilled if the child
|
||
|
* process finished.
|
||
|
*/
|
||
|
module.exports.runPar = function runPar (args, stdout, stderr) {
|
||
|
return spawn(RUN_P, args, stdout, stderr)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Executes `run-s` with the given arguments.
|
||
|
*
|
||
|
* @param {string[]} args - The arguments to execute.
|
||
|
* @param {Writable} [stdout] - The writable stream to receive stdout.
|
||
|
* @param {Writable} [stderr] - The writable stream to receive stderr.
|
||
|
* @returns {Promise<void>} The promise which becomes fulfilled if the child
|
||
|
* process finished.
|
||
|
*/
|
||
|
module.exports.runSeq = function runSeq (args, stdout, stderr) {
|
||
|
return spawn(RUN_S, args, stdout, stderr)
|
||
|
}
|