clean-scripts
A CLI tool to make scripts in package.json clean.
install
yarn global add clean-scripts
usage
create config file(named clean-scripts.config.js
or something else) like:
module.exports = {
build: "tsc",
lint: "tslint index.ts"
}
run clean-scripts build
, or clean-scripts lint
or clean-scripts build --config clean-scripts.config.js
features
string script
module.exports = {
build: "tsc"
}
array script
- executed one by one with order
- used when later script depends on previous script's success
module.exports = {
build: [
"rimraf dist",
"tsc"
]
}
Set
or Object
script
- executed collaterally without order
- used when the scripts are irrelated
- they are all started at first time, when they are all done, it's a success, otherwise exit current process
module.exports = {
build: {
js: `tsc`,
css: `cleancss -o index.bundle.css index.css`
}
}
nested script
module.exports = {
build: [
"rimraf dist",
{
js: `tsc`,
css: [
`lessc index.less > index.css`,
`cleancss -o index.bundle.css index.css`
]
}
]
}
custom function script
the type of the function should be (context: { [key: string]: any }, parameters: string[]) => Promise<void>
module.exports = {
build: () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, 1000)
}),
test: async () => {
}
}
The context
can be used to transfer data between different scripts.
module.exports = {
build: [
context => {
context.foo = 'abc'
return Promise.resolve()
},
context => {
console.log(context.foo)
return Promise.resolve()
}
]
}
The parameters
can be passed from CLI parameters
module.exports = {
build: (context, parameters) => {
console.log(parameters)
return Promise.resolve()
}
}
child script
module.exports = {
build: [
`rimraf dist/`,
`tsc -p src/`
],
lint: {
ts: `tslint "src/**/*.ts"`,
js: `standard "**/*.config.js"`
}
}
- run
clean-scripts build[0]
to run rimraf dist/
- run
clean-scripts lint.ts
to run tslint "src/**/*.ts"
start service
const { Service } = require('clean-scripts')
module.exports = {
build: [
new Service('http-server -p 8000'),
new Service('http-server', 'server2')
]
}
All services will be killed(send SIGINT
actually) after all scripts end, or any script errors.
start program
const { Program } = require('clean-scripts')
module.exports = {
build: [
new Program('http-server -p 8000', 10000)
]
}
All programs will be killed(send SIGINT
actually) after all scripts end, or any script errors.
tasks
const { Tasks } = require('clean-scripts')
module.exports = {
build: new Tasks([
{
name: 'build a',
script: 'yarn workspace a run build'
},
{
name: 'test a',
script: 'yarn workspace a run test',
dependencies: [
'build a'
]
},
{
name: 'build b',
script: 'yarn workspace b run build',
dependencies: [
'build a'
]
},
{
name: 'test b',
script: 'yarn workspace b run test',
dependencies: [
'build b'
]
}
])
}
the 4 tasks will be execuated in following order:
build a
build b
and test a
test b
as soon as build b
completed
This can be very useful and effective for complex or dynamic tasks.
short-hand methods
const { sleep, readableStreamEnd, execAsync, executeScriptAsync, checkGitStatus } = require('clean-scripts')
module.exports = {
build: [
() => sleep(5000),
async () => {
const readable = getReadableStreamSomehow()
readable.on('data', chunk => {
console.log(`Received ${chunk.length} bytes of data.`)
})
await readableStreamEnd(readable)
},
async () => {
const { stdout } = await execAsync('git status -s')
if (stdout) {
console.log(stdout)
throw new Error(`generated files doesn't match.`)
}
},
async () => {
await executeScriptAsync([
`rimraf dist/`,
`tsc -p src/`
])
},
() => checkGitStatus()
]
}