bouzuya.hatenablog.com

ぼうずやのにっき

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 に似たものを選んだ。

JavaScript の Error は適切に使われているだろうか

だらだらしていたら遅くなった。

bouzuya/bathpath 側をつくっていた。だいたいできた。ここからが長いんだけど……。

不正な入力に対して Error を投げるべきか迷う。型検査もないので、かなり変な値を受け取る可能性があるのだけど、それらを毎回検査するのはあまり良い習慣でもなさそうだ。またそれらの違反を Error で表現するより、多少のことなら | null を返してごまかすほうが JavaScript 界隈の空気にあっているんじゃないかとか思ってしまう。

bouzuya/bath 2.x をつくっている

今日は bouzuya/bath の 2.x をつくっていた。

path-to-regexp の機能から不要なものを削って自前で実装する。実行イメージは次のような感じ。

import * as assert from 'assert';
import { params } from 'bath/params';

const p1 = params('/users/{id}');
assert.deepEqual(p1('/users/123'), { id: '123' });
assert.deepEqual(p2('/users/abc'), { id: 'abc' });

const p2 = params('/users/{id}', { id: /^\d+$/ });
assert.deepEqual(p2('/users/123'), { id: '123' });
assert.deepEqual(p2('/users/abc'), null);

2.x で考えている path-to-regexp との違いは次のとおりだ。

  • regexp を強調しない
  • path と template + params の相互変換への配慮
  • template + path -> params な params と template + params -> path な path を必要な側だけ import できる
  • template を RFC 6570 の level 1 に近づけている

同じで言うと、 router における path との match に使う点だろうか。ぼくのほうは逆に path を構築する用途にも使うつもりだけど。

2017-02 ふりかえり

2017-02 をふりかえる。

期間別の目標

2017 の目標

  • 自分の使うものはできるだけ自分でつくる。
  • なるべくはやく見えるもの・かたちあるものにする。
  • 納得のいくものをつくる。
  • こつこつとやる。
  • 斑鳩ノーマルをノーコンティニュークリアする。
  • 型システム入門を読む。

2017-02 の目標

週別のふりかえり

つくったもの

blog などは除外している。

その他

2017-01 は病気で出遅れて、 2017-02 は嫌なことがあってめげて甘いものをたくさんとったり……。日課や習慣をすこし変えている。朝に牛乳やオレンジジュースを飲んだり、早寝を心がけるなど。

『型システム入門』はどこかのタイミングで読むのをやめてしまった。何度目だ……。また再開する。漫画は『ジョジョの奇妙な冒険』をひさしぶりに読んだ、 4 部まで。『イノベーションのジレンマ』を読んだ。また書くけどイマイチだった。

ゲームは斑鳩を進めている。最高が 11 ミス。先月が 5 コンティニュー (15 〜 18 ミス) なので、すこしは伸びている。途中サボって伸びなかったので、きちんと毎日することにした。

アナログゲームは『ザ・ゲーム』を買った。ボードゲーム同好会 #8 で遊んだものだ。家族からはあまり受けが良くない。協力ゲーではあるものの、責任を感じるからだろう。わがままだ。

Netflix で『ファイト・クラブ』・『スタンド・バイ・ミー』・『言の葉の庭』・『攻殻機動隊 S.A.C 2nd GIG 』を観ている。もう解約しようかな。

bouzuya.net が https になった。NPM にお金を払うようになった。 PureScript で rally-cli をつくった。上達している感じはない。もっといろいろつくるようにしたい。

あっという間に過ぎてしまった。

2017-03 の目標

  • 『型システム入門』を読む
  • 斑鳩を続ける
  • bath 2.0.0 をつくる
  • PureScript でなにかつくる

bouzuya/bath 0.2.0 をつくった

bouzuya/bath を 0.2.0 にした。

機会があったので使おうとしたら使えなかった。型定義ファイルの配置がおかしかった。それを修正し、あわせて依存している npm package のバージョンを上げた。

bath の 1.0.0 はいまの path-to-regexp の wrapper でもいいかなと思っている。2.0.0 は独自の format で書き直したい。余計な機能をできるだけ削って。

2017-W08 ふりかえり

2017-W08 をふりかえる。

2017-02 の目標

2017-W08 の目標

SSR は ParentComponent の型合わせでめげてしまった。

今週の記事

つくったもの

2017-02-20/2017-02-26

purescript-examples は halogen の途中で投げた分を……。

その他

斑鳩。最高記録を 11 MISS に更新。 C5 は上達している感じがない。ただ、こつこつやるほうが効果が出ているように思うので、睡眠時間が厳しいときもなるべく欠かさないようにしている。来週もそうしよう。

いろいろあって気持ちが落ち込んでいる。紛らわすためなのか、散財したり、甘いものを食べたりしている。甘いものはともかく、ものをつくる感じではなくなっている。楽しめないのは良くない。あまり先のことを考えて何かするのではなく、なんとなくでもいいので、気楽にものをつくってみようかな。

2017-W09 の目標

妻とヨドバシ

眠い。早く寝ないと……。

今日は妻とヨドバシに行ったり、卓球しに行ったり……。疲れた。

妻が大阪駅のそばのヨドバシに行ったことがないと言うので、「ヨドバシはじめてとか、嘘でしょ……」ってなった。ぼくも人混みが嫌いなのであまり行かないけど、はじめてはさすがにないな。楽しそう (?) だったのでなにより。

卓球。随分と前から行きたいと言っていたのだけど、優先順位の低さから先送りされ続けていた。適度な運動になって良かった。楽しかった。そして妻は弱いと分かった。彼女が嫌でなければ、また行きたいな。