Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

path-binder

path-binder

フラットデータにパスを書くだけ。
あとは path-binder が構造化する。

フラットデータをネストされた JSON に変換する TypeScript ライブラリ

こんなデータが、こうなる

フラットデータ
user.nameuser.ageuser.role
Taro25admin
Jiro30editor
JSON 出力
{
  "user": [
    { "name": "Taro", "age": 25, "role": "admin" },
    { "name": "Jiro", "age": 30, "role": "editor" }
  ]
}

各列に JSON パスを書き、データを入れる。generate() を呼ぶ。それだけです。

3ステップではじめる

1. インストール

npm install path-binder

2. データを用意する

スプレッドシートの各列を { path, value } ペアに変換します。

import { generate } from 'path-binder'

const input = {
  Sheet1: [
    [{ path: 'user.name', value: 'Taro' }, { path: 'user.age', value: 25 }],
    [{ path: 'user.name', value: 'Jiro' }, { path: 'user.age', value: 30 }],
  ],
}

3. 変換する

const { result } = generate(input)
// → {
//   user: [
//     { name: 'Taro', age: 25 },
//     { name: 'Jiro', age: 30 }
//   ]
// }

なぜ path-binder?

toB SaaS 開発で、CSV やスプレッドシートなどのフラットデータを構造化 JSON に変換する必要に迫られたことはありませんか?

path-binder なら、各カラムに JSON パスのラベルを付けるだけ。 複雑な変換ロジックは不要です。一度パスを定義すれば、データのレイアウトがどう変わっても、マッピングは壊れません。

「Excel の関数で処理した方が楽では?」

一度きりの変換ならそうかもしれません。しかし、変化し続けるビジネス要件に合わせて複雑な数式チェーンをメンテナンスし続けるコストは膨大です。path-binder のアプローチ — データモデルに直接マッピングするシンプルなラベル付け — はそのコストを完全に排除します。サポートチームと一緒に導入すれば、運用コストの削減効果は明らかです。

特徴

0

ゼロ依存関係

外部依存なし。node_modules を汚さず、軽量で高速に動作します。

{}

型安全

スキーマ定義に基づく厳密な型推論。TypeScript の恩恵を最大限に活かせます。

スキーマ対応

キャスト・フィルタを宣言的に定義。不要な列は自動除外されます。

📊

マルチシート

複数シートのデータを参照キー($)で自動結合。リレーショナルな構造も1回の呼び出しで。

さらに高度な使い方

スキーマによる型変換と、$ 参照キーによるマルチシート結合を組み合わせた例です。

import { generate, defineSchema, asNumber, asString, arrayOf } from 'path-binder'

const input = {
  sheetA: [
    [{ path: 'user.id', value: 1 }, { path: 'user.name', value: 'Taro' }],
    [{ path: 'user.id', value: 2 }, { path: 'user.name', value: 'Jiro' }],
  ],
  sheetB: [
    [{ path: 'user.$id', value: 1 }, { path: 'user.info[].type', value: 'google' }],
  ],
}

const schema = defineSchema({
  user: {
    id: asNumber(),
    name: asString(),
    info: arrayOf({ type: asString() }),
  },
})

const { result } = generate(input, { schema })
// → {
//   user: [
//     { id: 1, name: 'Taro', info: [{ type: 'google' }] },
//     { id: 2, name: 'Jiro' },
//   ]
// }

次のステップ: パス構文でネストや配列の表現方法を学ぶ → スキーマで型キャストとフィルタリングを設定する → プレイグラウンドで試す