読者です 読者をやめる 読者になる 読者になる

15 min/d

ぼうずやのにっき

path template engine の bouzuya/bath 2.0.1 をつくった

bouzuya/bath の 2.0.0 および 2.0.1 をつくった。

bath は path template engine 。 URL の pathname を組み立てるためのテンプレートエンジンだ。

path template engine という分類があるのかは知らない。ただ path をつくるためだけのテンプレートエンジンがあっても良いと思い、つくった。ちなみに「テンプレートエンジン」という言葉を、テンプレートとデータを与えると結果を返すもの、くらいの認識で使っている。

特徴としては次のとおりだ。

  • 低機能
  • 双方向の変換 (template -> path -> params / template -> params -> path)
  • 必要分のみを import 可能
  • RFC 6570 level 1 に似たテンプレート構文

bath の利用イメージは次のようなもの。 README から抜粋した。

import assert from 'assert';
import bathFn from 'bath';

const { params, path } = bath('/users/{id}');

assert.deepEqual(params('/users/123'), { id: '123' });
assert.deepEqual(path({ id: '123' }), '/users/123');
import assert from 'assert';
import { params, path } from 'bath';

const template = '/users/{id}';
assert.deepEqual(params(template)('/users/123'), { id: '123' });
assert.deepEqual(path(template)({ id: '123' }), '/users/123');
import assert from 'assert';
import { params } from 'bath/params'; // import `params()` only
import { path } from 'bath/path';     // import `path()` only

const template = '/users/{id}';
assert.deepEqual(params(template)('/users/123'), { id: '123' });
assert.deepEqual(path(template)({ id: '123' }), '/users/123');

いわゆる router の実装に使える……といいな。

競合は pillarjs/path-to-regexp 。あちらは express の router に使われているし、勝負にはならない。違いとして、こちらは RegExp という実装を露出させないようにしている。また低機能なだけ使いかたを理解しやすい……と良いのだけど……。

1.x は path-to-regexp の wrapper だったが、2.x は独自の構文を持つことにした。 RFC 6570 の level 1 に似たものを選んだ。