目次
- npm i -D gulp後のnode_modules
- ansi-regex
- ansi-styles
- archy
- arr-diff
- arr-flatten
- array-differ
- array-slice
- array-uniq
- array-unique
- balanced-match
- beeper
- brace-expansion
- braces
- chalk
- clone
- clone-stats
- color-convert
- color-name
- concat-map
- core-util-is
- dateformat
- defaults
- deprecated
- detect-file
- duplexer2
- end-of-stream2
- escape-string-regexp
- expand-brackets
- expand-range
- expand-tilde
- extend
- extglob
- fancy-log
- filename-regex
- fill-range
- find-index
- findup-sync
- fined
- first-chunk-stream
- flagged-respawn
- for-in
- fs-exists-sync
- gaze
- glob
- glob-base
- glob-parent
- globule
- glogg
- graceful-fs
- ini
- just-debounce
- kind-of
- mkdirp
- lodash
- normalize-path
- ordered-read-streams
- path-is-absolute
- randomatic
- readdirp
- semver
- timestamp
npm i -D gulp後のnode_modules
gulpをインストールしてnpm i -D gulpを実行するとnode_modulesにnpmパッケージがいろいろインストールされる。
通常はconst gulp = require('gulp');でgulpだけ読み込んで使用されることが多いが、これ以外の使い方も覚えておくと便利だ。
ansi-regex
ANSIエスケープコードの正規表現マッチパターン用パッケージ
const ansiRegex = require('ansi-regex'); console.log(ansiRegex().test('\u001B[4mcake\u001B[0m')); // => true console.log(ansiRegex().test('cake')); // => false console.log('\u001B[4mcake\u001B[0m'.match(ansiRegex())); // => [ '\u001b[4m', '\u001b[0m' ]
ansi-styles
console.logなどのテキストに色を付けることができる
ただし、npm i -D gulpでインストールしたものはstyle.bgColor.ansiなどは使用不可
const style = require('ansi-styles'); console.log(`${style.green.open}Hello world!${style.green.close}`); // => 緑色でHello world! console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close); // => errorで表示されない
archy
階層をパイプテキストで表示する
var archy = require('archy'); var s = archy({ label : 'foo', nodes : [ 'bar', { label : 'baz', nodes : [ { label : 'hoge', nodes : [ { label : 'fuga', nodes : [ 'a', 'b' ] } ] } ] } ] }); console.log(s);
foo ├── bar └─┬ baz └─┬ hoge └─┬ fuga ├── a └── b
arr-diff
2つの配列を比較して一致していない値を配列で返す
const diff = require('arr-diff'); const a = ['a', 'b', 'c', 'd']; const b = ['b', 'c']; console.log(diff(a, b)) // => [ 'a', 'd' ]
arr-flatten
配列をフラット化
const flatten = require('arr-flatten'); console.log(flatten(['a', ['b', ['c']]])); // => [ 'a', 'b', 'c' ]
array-differ
第1引数の配列を使用するただし、第2引数の配列は除外する
const arrayDiffer = require('array-differ'); console.log(arrayDiffer([2, 3, 4], [3, 50])); // => [ 2, 4 ]
array-slice
配列をスライス
const slice = require('array-slice'); const arr = ['a', 'b', 'c', 'd', 'e']; console.log(slice(arr, 2, 4)); // => [ 'c', 'd' ]
array-uniq
配列の重複している値を除外する
const arrayUniq = require('array-uniq'); console.log(arrayUniq([1, 1, 2, 3, 3])); // => [ 1, 2, 3 ]
array-unique
配列の重複している値を除外して配列に代入
const unique = require('array-unique'); const arr = [1, 1, 2, 3, 3]; console.log(unique(arr)); // => [ 1, 2, 3 ] console.log(arr); // => [ 1, 2, 3 ]
balanced-match
第1引数と第2引数に指定した条件の内側と外側を下記のようなオブジェクトで返す
const balanced = require('balanced-match'); console.log(balanced('{', '}', 'foo{bar}baz')); // => { start: 3, end: 7, pre: 'foo', body: 'bar', post: 'baz' }
beeper
ビープ音を鳴らす
const beeper = require('beeper'); beeper();
brace-expansion
波括弧で囲んだ内容で配列を返す
const expand = require('brace-expansion'); console.log(expand('foo-{a,b,c}')); // => [ 'foo-a', 'foo-b', 'foo-c' ]
braces
brace-expansionと同じ
chalk
const chalk = require('chalk'); console.log(chalk.blue('Hello') + 'World' + chalk.red('!')); console.log(chalk.blue.bgRed.bold('Hello world!'));
clone
ディープコピーを行う
let clone = require('clone'); let a, b; a = { foo: { bar: 'baz' } }; b = clone(a); a.foo.bar = 'foo'; console.log(a); console.log(b);
clone-stats
クラスメソッドを失うことなくノードのインスタンスを安全に複製する
const copy = require('clone-stats')(stat);
color-convert
色を変換rgb, hsl, hsv, hwb, cmyk, ansi, ansi16, hexに対応
const convert = require('color-convert'); console.log(convert.rgb.hex(255, 0, 0)); // => FF0000
color-name
カラーネームをrgb値(配列)に変換
https://drafts.csswg.org/css-color/#named-colors
const colors = require('color-name'); console.log(colors.red); // => [ 255, 0, 0 ]
concat-map
JavaScriptのmapメソッドと同じ
const concatMap = require('concat-map'); const a = [1, 2, 3]; const b = concatMap(a, x => x * 2); console.log(b); // => [ 2, 4, 6 ] const c = a.map(x => x * 2); console.log(c); // => [ 2, 4, 6 ]
core-util-is
isObjectなどが使用できるようになるが配列がtrueになるなど使い勝手が良くない
const t = require('core-util-is'); console.log(t.isObject({})); // => true console.log(t.isObject([])); // => true console.log(t.isObject(1)); // => false
dateformat
日時フォーマットを使用する
const dateFormat = require('dateformat'); const now = new Date(); console.log(dateFormat(now, "yyyy年m年d日 h時M分s秒")); // => 2017年9年18日 12時34分56秒
defaults
引数のデフォルト値を指定できる
const defaults = require('defaults'); const handle = function(options, fn) { options = defaults(options, { timeout: 100 }); setTimeout(function() { fn(options); }, options.timeout); }
deprecated
非推奨の場合の値を指定する
const deprecated = require('deprecated'); const oldfn = function(a,b) { return a + b; }; const somefn = deprecated.method('dont use this anymore', console.log, oldfn); const someobj = {}; deprecated.field('dont use this anymore', console.log, someobj, 'a', 123); console.log(someobj.a); // => 123
detect-file
ファイルの有無を調べる
const detect = require('detect-file'); const file1 = detect('package.json'); console.log(file1); // => /Users/iwbjp/package.json const file2 = detect('foo.json'); console.log(file2); // => null
duplexer2
書き込み可能なストリームと読み取り可能なストリームを取得し、それらを読み取り可能な書き込み可能なストリームとして表示します
const duplexer2 = require('duplexer2'); const grep = foo.exec('grep Stream'); duplexer2(grep.stdin, grep.stdout);
end-of-stream2
ストリームとコールバックをeosに渡す
const eos = require('end-of-stream'); eos(readableStream, function(err) { if (err) return console.log('error'); console.log('stream has ended', this === readableStream); });
escape-string-regexp
正規表現をバックスラッシュでエスケープ
const escapeStringRegexp = require('escape-string-regexp'); const str = escapeStringRegexp('^ foo ?'); console.log(str); // => \^ foo \?
expand-brackets
POSIXの拡張正規表現を使用する
const brackets = require('expand-brackets'); console.log(brackets('[![:lower:]]')); // => [^a-z]
expand-range
rangeを使用できるようにする
const range = require('expand-range'); console.log(range('1..3')); // => [ '1', '2', '3' ] console.log(range('1..10..3')); // => [ '1', '4', '7', '10' ]
expand-tilde
チルダ記号をcdで使用するときのように拡張
const expandTilde = require('expand-tilde'); console.log(expandTilde('~')); // => '/Users/iwbjp' console.log(expandTilde('~+')); // => '/Users/iwbjp/foo'
extend
jQueryのextendメソッドと同じ
extglob
glob拡張追加
const extglob = require('extglob'); console.log(extglob('!(xyz)*.js')); // => (?!xyz)[^/]*?*\.js
fancy-log
タイムスタンプ付きログ
const log = require('fancy-log'); log('foo'); // => [01:54:10] foo
filename-regex
正規表現による名前抽出
const regex = require('filename-regex'); console.log('a/b/c.js'.match(regex())[0]); // => c.js console.log('a/b/c/.git'.match(regex())[0]); // => .git
fill-range
toRegexは使用不可
const fill = require('fill-range'); console.log(fill('1', '3')); // => [ '1', '2', '3' ] console.log(fill('1', '10', {toRegex: true})); // => [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '10' ]
find-index
JavaScriptのfindIndexと同じ基本必要ない
const findIndex = require('find-index'); console.log([1, 2, 3].findIndex(x => x === 2)); // => 1
findup-sync
ファイルの有無を確認
const findup = require('findup-sync'); const result = findup('{a,b}*.txt'); console.log(result); // => /Users/iwbjp/abc.txt
fined
ファイルが存在していたらパスを宣言する
const fined = require('fined'); console.log(fined({path: '.', name: 'foo.txt' })); // => { path: '/Users/iwbjp/foo.txt', extension: '' }
first-chunk-stream
streamの最初の行を調べる
const fs = require('fs'); const concatStream = require('concat-stream'); const firstChunkStream = require('first-chunk-stream'); // foo.txt => 'foo bar' fs.createReadStream('foo.txt') .pipe(firstChunkStream({chunkLength: 5}, function (chunk, enc, cb) { this.push(chunk); cb(); })) .pipe(concatStream(function (data) { if (data.length < 5) { throw new Error('data.length < 5'); } console.log(data.length); // => 7 console.log(data); // => <Buffer 66 6f 6f 20 62 61 72> }));
flagged-respawn
レスポンスフラグを調べる
const flaggedRespawn = require('flagged-respawn'); // get a list of all possible v8 flags const v8flags = require('v8flags'); flaggedRespawn(v8flags, process.argv, function (ready, child) { if (ready) { console.log('Running!'); } else { console.log('Special flags found, respawning.'); } if (process.pid !== child.pid) { console.log('Respawned to PID:', child.pid); } });
for-in
const forIn = require('for-in'); const obj = {a: 'foo', b: 'bar', c: 'baz'}; const values = []; const keys = []; forIn(obj, function (value, key, o) { keys.push(key); values.push(value); }); console.log(keys); //=> ['a', 'b', 'c']; console.log(values); //=> ['foo', 'bar', 'baz'];
for-own
for-inとほぼ同じfalseを返すことによって早期終了
fs-exists-sync
ファイルの有無を調べる
var exists = require('fs-exists-sync'); console.log(exists('gulpfile.js')); // => true console.log(exists('foo.txt')); //=> false
gaze
watchのようなもの
var gaze = require('gaze'); // Watch all .js files/dirs in process.cwd() gaze('./**/*.txt', function(err, watcher) { // Files have all started watching // Get all watched files var watched = this.watched(); // On file changed this.on('changed', function(filepath) { console.log(filepath + ' was changed'); }); // On file added this.on('added', function(filepath) { console.log(filepath + ' was added'); }); // On file deleted this.on('deleted', function(filepath) { console.log(filepath + ' was deleted'); }); // On changed/added/deleted this.on('all', function(event, filepath) { console.log(filepath + ' was ' + event); }); });
glob
パターンにマッチするすべてのパス名を検出
const glob = require('glob'); glob("./*.txt", (er, files) => { console.log(files); }); // => [ './foo.txt', './foo2.txt' ]
glob-base
拡張版globのようなもの
const globBase = require('glob-base'); console.log(globBase('./*.txt')); // => { base: '.', isGlob: true, glob: '*.txt' }
glob-parent
親パス取得版globのようなもの
const globParent = require('glob-parent'); console.log(globParent('./src/img/*.jpg')); // => ./src/img
globule
パターンにマッチするすべてのパス名を検出
const globule = require('globule'); const filepaths = globule.find('./src/**/*.html'); console.log(filepaths); // => [ './src/index.html' ]
glogg
Global logging utility
const getLogger = require('glogg'); const logger = getLogger('my-namespace'); logger.debug('debug'); logger.info('info'); logger.warn('warn'); logger.error('error');
graceful-fs
拡張版fs
ini
iniファイルをparseおよびserializeする
const fs = require('fs'); const ini = require('ini'); const config = ini.parse(fs.readFileSync('./config.ini', 'utf-8')); config.scope = 'local'; config.database.database = 'use_another_database'; config.paths.default.tmpdir = '/tmp'; delete config.paths.default.datadir; config.paths.default.array.push('fourth value'); fs.writeFileSync('./config_fix.ini', ini.stringify(config, { section: 'section' }));
just-debounce
setTimeoutと同じ
const db = require('just-debounce'); const debounced = db((v)=> {console.log(v)}, 1000); const debounced2 = db((v)=> {console.log(v)}, 2000); debounced('wi'); debounced2('fi');
kind-of
型を返す
const kindOf = require('kind-of'); console.log(kindOf({})); // => object console.log(kindOf([])); // => array
mkdirp
mkdir -pが使えるようにする
const mkdirp = require('mkdirp'); mkdirp('./tmp/foo/bar/baz');
lodash
lodashが使えるようにする
const _ = require('lodash'); console.log(_.shuffle([1, 2, 3, 4]));
normalize-path
バックスラッシュをスラッシュに変換
const normalize = require('normalize-path'); normalize('\\foo\\bar\\baz\\'); // => '/foo/bar/baz'
ordered-read-streams
streamの順序を指定
const through = require('through2'); const Ordered = require('ordered-read-streams'); const s1 = through.obj(function (data, enc, next) { const self = this; setTimeout(function () { self.push(data); next(); }, 200) }); const s2 = through.obj(function (data, enc, next) { const self = this; setTimeout(function () { self.push(data); next(); }, 30) }); const s3 = through.obj(function (data, enc, next) { const self = this; setTimeout(function () { self.push(data); next(); }, 100) }); const streams = new Ordered([s1, s2, s3]); streams.on('data', function (data) { console.log(data); // => stream 1 // => stream 2 // => stream 3 }) s1.write('stream 1'); s1.end(); s2.write('stream 2'); s2.end(); s3.write('stream 3'); s3.end();
path-is-absolute
絶対パスか調べる
const fs = require('fs'); const path = require('path'); const pathIsAbsolute = require('path-is-absolute'); fs.readdirSync('./src/coffee/').forEach((pFile) => { if (path.extname(pFile) === '.coffee') { console.log(pathIsAbsolute(pFile)); // => false } }); console.log(pathIsAbsolute('/home/foo/bar')); // => true
randomatic
ランダムの文字列を作成
const randomatic = require('randomatic'); console.log(randomatic('0', 10)); // => 5615578986 console.log(randomatic('a', 10)); // => lxlaeytnxk console.log(randomatic('A', 10)); // => SXWFZWENKY console.log(randomatic('0aA', 10)); // => Xzq8ZBSQqC
readdirp
readdirの拡張
const readdirp = require('readdirp'); readdirp({ root: './src/coffee', fileFilter: '*.coffee' }) .on('data', x => console.log(x.name));
semver
バージョン番号の正規化など
const semver = require('semver'); console.log(typeof semver.valid('1.2.3')); // => '1.2.3' console.log(semver.valid('a.b.c')); // => null console.log(semver.clean(' =v1.2.3 ')); // => '1.2.3'
timestamp
const timestamp = require('time-stamp'); console.log(timestamp()); // => 2017:09:18 console.log(timestamp('YYYY/MM/DD HH:mm:ss')); // => 2017/09/18 22:57:38
ほかにもたくさんがあるが多すぎるので割愛。
古い環境でなければgulpとJavaScriptとfsだけでも多くのことが実現可能だ。