Skip to content

chinjs/chin

Repository files navigation

chin

npm npm Build Status Coverage Status

Simple build tool matches and processes files by extension instead of regexp.

Usage

const imagemin = require('chin-plugin-imagemin')

const img2min = imagemin()

module.exports = {
  put: 'assets',
  out: 'public',
  processors: {
    png: img2min,
    jpg: img2min
  }
}
yarn add -D chin chin-plugin-imagemin
yarn chin -c
package.json
chin.config.js
assets
├─ sitemap.xml
├─ robots.txt
└─ images
   ├─ foo.png
   └─ bar.jpg
public
├─ sitemap.xml // copied
├─ robots.txt  // copied
└─ images
   ├─ foo.png  // optimized
   └─ bar.jpg  // optimized

Config

It's called chin.config.js or .chin/index.js in the root directory of your project typically. You can export config as an array.

put/out

directory path. put => out

processors

plugins can be found here.

const processors = { [ext]: plugin() }

. is unnecessary at [ext]. Unmatch files is not ignored but copied.

processors can be an array:

const processors = [ path, { [ext]: plugin() } ][]

Files are matched by processors.find(), so the index express priority and not be fallbacked.

example:

const processors = [
  ['dir1/file.ext', { ext }],  // [put]/dir1/file.ext => [out]/dir1/file.ext
  ['dir1/dir2', { ext }],      // [put]/dir1/dir2/**  => [out]/dir1/dir2/**
  ['dir1/', { ext }],          // [put]/dir1/**       => [out]/dir1/**
  ['*', { ext }]               // [put]/**            => [out]/**
]

ignored

Matcher[]. Passed to recursive-readdir.

clean

boolean. Remove config.out before process.

quiet

boolean. Whether log or not.

before/after

Hook function.

watch

chin watch use as chokidar options. If watch.ignored is void, ignored fallbacked.

CLI

  Usage: chin [options] [command]

  Options:

    -c, --config [path]     [default: chin.config.js || .chin/index.js]
    -i, --put <path>        [default: assets]
    -o, --out <path>        [default: public]
    -r, --require <name..>  splited by ","
    --clean                 remove "out" before
    -q, --quiet
    -v, --version           output the version number
    -h, --help              output usage information

  Commands:

    watch [options]

  Example:

    chin -c -r babel-register,dotenv/config

Plugin

Plugin can also be written by yourself easily.

type Plugin = (opts: any) => {
  isStream: boolean,
  options: ReadFileOpts | CreateReadStreamOpts,
  processor: processor | streamProcessor,
  [custom]: any
}

isStream switches the following read-file function.

So the type of both processor and options is determined by isStream.

In processor, the outpath can be edited like [outpath, result] or [outpath, result][].

const processor = (data, util) =>
  processed |
  [outpath, processed] |
  [outpath, processed][]

const streamProcessor = (pipe, util) =>
  pipe(stream) |
  [outpath, pipe(stream)] |
  [outpath, pipe(stream)][]

util

out

parsed outpath without base for assignable.

const { format } = require('path')
const outpath = format(Object.assign(util.out, { ext: '.other' }))

msg

util.msg('any message')

on

"finish" is emitted after write.

env

  • process.env.CHIN_PUT
  • process.env.CHIN_OUT

License

MIT (http://opensource.org/licenses/MIT)