npm i -D gulpでインストールした全node_modulesの使い方

npm i -D gulpでインストールした全node_modulesの使い方

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

テキスト色、背景色を付ける
npm 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だけでも多くのことが実現可能だ。