object-formatter
TRANSCRIPT
object-formatter
@airtoxin
object-formatterオブジェクトの整形がスキーマに基づいて行えるライブラリ。
この中のこれのここの値を取ってきてこっちのあそこのオブジェクトの値として保持して…みたいなのをネストしたオブジェクトとかに対してもundefined
accessを気にせず簡単に出来るようにしたかった。
バベルしたかった。
インストール
npm i --save object-formatter
使い方var ObjectFormat = require('object-formatter'); var of = new ObjectFormat();
of.format(schema, object);
スキーマ定義変換後のオブジェクトの形式を指定する。
keyはそのまま変換後のオブジェクトのフィールドキーとなる。
valueは変換後の値をaccessorで定義。
var schema = { raw: 'raw value', foo: '@a', bar: '@b.c.d="ipsum"', baz: { raw: 111, a: '@c.cb', b: '@c.c.c', c: [ '@d', { hoge: '@aa', fuga: '@bb="b default"' } ], d: [ '@d', '@cc="c default"' ] } };
accessorそのフィールドに入るべき値を指定する為の文字列/配列
Simple accessorとCollection accessorの2種類が存在。Simple accessorは単純なパス指定をしているだけ。Collection accessorはコレクションに対して簡易map処理を行う。
raw value
accessor以外の値がvalueに存在した場合、その値は処理されずにそのまま変換後のオブジェクトに代入される。
var object = { a: 1 }; var schema = { hoge: 'a', fuga: 100 };
of.format(schema, object); // -> // { // hoge: 'a', // fuga: 100 // }
Simple accessor
@から始まる文字列はSimple accessor
として認識され、@以降の文字列がvalueに入るべき値へのパスを示している。
var object = { a: 1, b: { c: 111 } }; var schema = { hoge: '@a', fuga: '@b.c' };
of.format(schema, object); // -> // { // hoge: 1, // fuga: 111 // }
Defaultaccessorが示すパスの値が存在しなかった場合のデフォ値を指定することができる。
accessorのパス指定の後に=を続け、その後デフォ値としたい物を指定する。
内部的にevalしているので何とかしたい。
var object = {}; var schema = { hoge: '@a=1', fuga: '@a.b.c="not found"' };
of.format(schema, object); // -> // { // hoge: 1, // fuga: 'not found' // }
Collection accessor変換前のオブジェクトがコレクションを持っている時に、その中の値を処理したい場合に使用する。簡易map処理。
配列の0番目にコレクションまでのパス、1番目にスキーマを書くと、コレクション内全てのオブジェクトに対してそのスキーマでフォーマットしたオブジェクトの配列が得られる。
var object = { c: [{a:1}, {a:2}, {b:3}] }; var schema = { hoge: ['@c', {fuga: '@a'}] };
of.format(schema, object); // -> // { // hoge: [ // { fuga: 1 }, // { fuga: 2 }, // { fuga: undefined } // ] // }
使用感自前のBandit APIで、APIの返却するJSONの型を保証したかった。
型の保証だけだとJSON Schemaはでか過ぎて大分つらい→簡単に指定出来るようになった。
オブジェクトのインターフェース保証が安全に行える所がだいぶ気に入っている。
DSLドメイン固有言語。特定の操作に特化した言語。特化した操作は行い易いが、DSL自体の学習コストがかかったり、DSLでの操作を見てもやっていることが自明でなくなる。
あまり好きではなかったが、今回object-formatterのスキーマ定義はDSLになっている。→他のスキーマ定義言語があまりいい感じに使えなかったので用意した。もっといい感じのが有るならそれに乗っかりたい。
DL数
みんなつかってくれ!
おわり