Start – Functional tasks runner for Node.js

BuckZora 发布于3月前 阅读117次
0 条评论

start

Start – Functional tasks runner for Node.js

  • functional – in all senses
  • fast – parallelism and concurrency
  • shareable – presets as published packages
  • 4th line to align with logo on the right

TOC

Example

.
├── 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 \
  esm \
  @babel/core \
  @babel/register \
  @babel/preset-env \
  @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": {
    // default, `./tasks.ts` or `./tasks/index.ts`
    "file": "tasks"
    "require": [
      // https://github.com/standard-things/esm
      "esm",
      [
        "@babel/register",
        {
          "extensions": [
            ".ts",
            ".js"
          ]
        }
      ]
    ],
    "reporter": "@start/reporter-verbose"
  },
  "babel": {
    "presets": [
      [
        "@babel/preset-env",
        {
          "targets": {
            "node": "current"
          },
          // "Tomorrow's ECMAScript modules today"
          "modules": false
        }
      ],
      // 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}/**/*.ts`),
    read,
    babel(babelConfig),
    rename((file) => file.replace(/\.ts$/, '.js')),
    write(`packages/${packageName}/build/`)
  )

export const dts = (packageName: string) =>
  sequence(
    find(`packages/${packageName}/**/*.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

How to

Recipes

  • Node.js TypeScript library – makethen
  • Node.js TypeScript libraries monorepo – Start project builds itself from sources using sources, see tasks/index.ts
  • React / React Native (higher-order) components monorepo – hocs
  • React app – to be added

Packages

Core

FS

  • :mag: plugin-find – find files using glob patterns
  • :mag: plugin-find-git-staged – find Git staged files and filter them using glob patterns
  • :book: plugin-read – read files content
  • :capital_abcd: plugin-rename – rename files
  • :x: plugin-remove – remove files or directories
  • :dancers: plugin-copy – copy files to relative destination using streams and keeping folders structure
  • :pencil2: plugin-write – write files with source maps to relative destination keeping folders structure
  • :pencil2: plugin-overwrite – overwrite files
  • :eyes: plugin-watch – watch for new or changed files matched by glob patterns

Lib

Build and bundle

Tests

Lint, check and fix

CI and publish

Roadmap

Copyright

All the packages in this repository are released under the terms of the MIT License .

The font used in logo is supernova fat .

查看原文: Start – Functional tasks runner for Node.js

  • organicgoose
  • lazysnake
  • greenswan
需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。