:red_circle: Functional task runner for Node.js
:warning: Project has been transferred to NexTools metarepo
.
├── packages/
│ ├── foo/
│ │ ├── src/
│ │ │ └── index.ts
│ │ ├── test/
│ │ │ └── index.ts
│ │ └── package.json
│ └── bar/
│ ├── src/
│ │ └── index.ts
│ ├── test/
│ │ └── index.ts
│ └── package.json
├── package.json
└── tasks.ts
$ yarn add --dev --ignore-workspace-root-check \
@babel/core \
@babel/register \
@babel/preset-env \
@babel/preset-typescript \
@start/cli \
@start/reporter-verbose \
@start/plugin-sequence \
@start/plugin-parallel \
@start/plugin-xargs \
@start/plugin-find \
@start/plugin-find-git-staged \
@start/plugin-remove \
@start/plugin-read \
@start/plugin-rename \
@start/plugin-write \
@start/plugin-lib-babel \
@start/plugin-lib-typescript-generate \
@start/plugin-lib-eslint \
@start/plugin-lib-istanbul \
@start/plugin-lib-tape \
@start/plugin-lib-codecov
// package.json
{
"private": true,
"description": "Start example",
"workspaces": [
"packages/*"
],
"devDependencies": {},
"start": {
// tasks file, default to `./tasks`
"file": "./tasks"
"require": [
[
"@babel/register",
{
"extensions": [
".ts",
".js"
]
}
]
],
"reporter": "@start/reporter-verbose"
},
"babel": {
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
],
// Babel 7
"@babel/preset-typescript"
]
}
}
// tasks.ts
// write tasks file once, publish it and then reuse or even extend
// in all projects using `start.preset` option in `package.json`,
// something like `my-start-preset` package with everything included
import sequence from '@start/plugin-sequence'
import parallel from '@start/plugin-parallel'
import xargs from '@start/plugin-xargs'
import find from '@start/plugin-find'
import findGitStaged from '@start/plugin-find-git-staged'
import remove from '@start/plugin-remove'
import read from '@start/plugin-read'
import rename from '@start/plugin-rename'
import write from '@start/plugin-write'
import babel from '@start/plugin-lib-babel'
import typescriptGenerate from '@start/plugin-lib-typescript-generate'
import eslint from '@start/plugin-lib-eslint'
import {
istanbulInstrument,
istanbulReport,
istanbulThresholds
} from '@start/plugin-lib-istanbul'
import tape from '@start/plugin-lib-tape'
import codecov from '@start/plugin-lib-codecov'
const babelConfig = {
babelrc: false,
presets: [
[
'@babel/preset-env',
{
targets: {
node: 6
},
modules: false
}
],
'@babel/preset-typescript'
]
}
// each named export is a "task"
export const build = (packageName: string) =>
sequence(
find(`packages/${packageName}/src/**/*.ts`),
read,
babel(babelConfig),
rename((file) => file.replace(/\.ts$/, '.js')),
write(`packages/${packageName}/build/`)
)
export const dts = (packageName: string) =>
sequence(
find(`packages/${packageName}/src/index.ts`),
typescriptGenerate(`packages/${packageName}/build/`)
)
export const pack = (packageName: string) =>
sequence(
find(`packages/${packageName}/build/`),
remove,
// child-processes
parallel(['build', 'dts'])(packageName)
)
// child processes
export const packs = xargs('pack')
export const dev = (packageName: string) =>
watch(`packages/${packageName}/**/*.ts`)(
build(packageName)
)
export const lint = () =>
sequence(
findGitStaged(['packages/*/{src,test}/**/*.ts']),
read,
eslint()
)
export const lintAll = () =>
sequence(
find(['packages/*/{src,test}/**/*.ts']),
read,
eslint()
)
export const test = () =>
sequence(
find('coverage/'),
remove,
find('packages/*/src/**/*.ts'),
istanbulInstrument({ esModules: true, extensions: ['.ts'] }),
find('packages/*/test/**/*.ts'),
tape(),
istanbulReport(['lcovonly', 'html', 'text-summary']),
istanbulThresholds({ functions: 100 })
)
export const ci = () =>
sequence(
// nested task
lintAll(),
// nested task
test(),
find('coverage/lcov.info'),
read,
codecov
)
$ yarn start
# or
$ npx start
One of the following task names is required:
* build
* dts
* pack
* packs
* dev
* lint
* lintAll
* test
* ci
$ yarn start build foo
$ yarn start dts foo
$ yarn start pack foo
$ yarn start packs foo bar
$ yarn start dev bar
$ yarn start lint
$ yarn start lintAll
$ yarn start test
$ yarn start ci
tasks/index.ts
process.env
.d.ts
files using TypeScript
.js.flow
files using Flow
assert()
Coming soon.
All the packages in this repository are released under the terms of the MIT License.
The font used in logo is supernova fat.