SpiderMonkey + JSLint + Vim

二年前に SpiderMonkey 使って perl で簡単な Syntax チェック用の Script を書いてみた 改訂版 と言う記事を書いたのですが、部下に JS を教える為に環境構築していたら、Perl Module の JavaScriptJavaScript::JSLint のテストが通らずイラっとしたので、jslint: The JavaScript Verifier で配布されている fulljslint.js を流用してコマンドを作って Vim から使えるようにしたのでメモを残します。

fulljslint.js の設置

適当にダウンロードしておく。

% mkdir -p ~/bin/js
% curl http://www.jslint.com/fulljslint.js > ~/bin/js/fulljslint.js

fulljslint.js のラッパーを作成

~/bin/js/ 配下に jslint.js という名前で下記を保存。
JSLINT.errors に null 要素が含まれる事があったので、その対応を追加しました。

load(environment.HOME + '/bin/js/fulljslint.js');
(function (file, source) {
  if (!file || !source) {
    print('Usage: jslint.js [File Name] [Source]');
    quit(1);
  }

  if (JSLINT(source, {passfail: false})) {
    print('All good.');
    quit();
  }

  JSLINT.errors.forEach(function (error) {
    var message;
    if (error === null) {
      return;
    }
    [
      file,
      error.line + 1,
      error.character + 1,
      error.reason
    ].forEach(function (elem) {
      if (message) {
        message += ':' + elem;
      } else {
        message = elem;
      }
    });
    print(message);
  });
})(arguments[0], arguments[1]);

JSLINT を使用する為に、ファイル名やソースをコマンドラインパラメータから取得している。

ソース取得用の Shell Script を作成

~/bin/ 配下に jslint.sh という名前で下記を保存。

#!/bin/sh

if [ ! -f $1 -o  ! -r $1 ]; then
  echo "Usage: $0 [JavaScript Source File]";
  exit 1
fi

js ~/bin/js/jslint.js $1 "`cat $1`"
exit 0

SpiderMonkey のファイル操作の方法が解れば、このスクリプトは不要なんだけどなぁ

試してみる

function Person () {}

Person.prototype.say = function () {
  print('jslint is cool.');
}

var cooldaemon = new Person;
cooldaemon.say();           
> ~/bin/jslint.sh /path/to/test.js
/path/to/test.js:5:2: Missing semicolon.
/path/to/test.js:7:28: Missing '()' invoking a constructor.

Vim から使う

set makeprg=~/bin/jslint.sh\ %