Simple build tool matches and processes files by extension instead of regexp.
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
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.
directory path. put
=> out
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]/**
]
Matcher[]
. Passed to recursive-readdir.
boolean
. Remove config.out
before process.
boolean
. Whether log or not.
Hook function.
chin watch
use as chokidar options. If watch.ignored
is void, ignored
fallbacked.
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 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)][]
parsed outpath without base
for assignable.
const { format } = require('path')
const outpath = format(Object.assign(util.out, { ext: '.other' }))
util.msg('any message')
"finish"
is emitted after write.
process.env.CHIN_PUT
process.env.CHIN_OUT