🤠
zodライブラリを使ったuseCludeフックをnpmで公開してみました
zodライブラリを使ったuseCludeフックをnpmで公開してみましたので、紹介です。
レポジトリはこちらになります。
npmライブラリはこちらになります。
Githubのレポジトリのexample系のディレクトリにサンプル置いています。
typescriptなnextjsのサンプルも置いています。
シンプルな使い方としては以下になります。
まずはプロジェクトディレクトリを作成します。
$ cd ~/wrksp
$ mkdir -p a
$ cd a
$ yarn init -y
$ yarn add @nap5/use-clude zod
$ mkdir -p data
$ touch data/bebop.json
$ touch index.js
ファイルdata/bebop.jsonにテストデータを用意します。
[
{
"id": "p9z7aek9fi",
"name": "Landon Glover",
"age": 38,
"blogs": []
},
{
"id": "pga7t8prpl",
"name": "Jack Jackson",
"age": 38,
"blogs": [
{
"id": "1",
"title": "AAA"
},
{
"id": "2",
"title": "BBB"
},
{
"id": "3",
"title": "CCC"
}
]
},
{
"id": "tcz4kesu6p",
"name": "Grace Dennis",
"age": 44,
"blogs": [
{
"id": "4",
"title": "DDD"
}
]
}
]
package.jsonでモジュールハンドリングします。
{
"type": "module",
"dependencies": {
"@nap5/use-clude": "^1.0.0",
"zod": "^3.19.1"
}
}
index.jsに実行内容を記載します。
import { z } from "zod";
import { useClude } from "@nap5/use-clude";
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const data = require("./data/bebop.json");
const userShape = {
id: z.string(),
name: z.string(),
age: z.number(),
blogs: z
.object({
id: z.string(),
title: z.string(),
})
.array(),
};
const { exclude, include } = useClude(userShape);
console.log(
JSON.stringify(
data.map((item) => include("blogs").parse(item)),
null,
2
)
);
console.log(
JSON.stringify(
data.map((item) => exclude("name", "age").parse(item)),
null,
2
)
);
以下が実行結果になります。
includeに指定したプロパティが包含され、excludeに指定したプロパティが除外されて結果が出力されています。
$ time node index.js
[
{
"blogs": []
},
{
"blogs": [
{
"id": "1",
"title": "AAA"
},
{
"id": "2",
"title": "BBB"
},
{
"id": "3",
"title": "CCC"
}
]
},
{
"blogs": [
{
"id": "4",
"title": "DDD"
}
]
}
]
[
{
"id": "p9z7aek9fi",
"blogs": []
},
{
"id": "pga7t8prpl",
"blogs": [
{
"id": "1",
"title": "AAA"
},
{
"id": "2",
"title": "BBB"
},
{
"id": "3",
"title": "CCC"
}
]
},
{
"id": "tcz4kesu6p",
"blogs": [
{
"id": "4",
"title": "DDD"
}
]
}
]
real 0m0.040s
user 0m0.042s
sys 0m0.014s
このライブラリをパブリッシュする際に以下のエラーを確認できました。
が、エラー解決はできなかったものの、バンドルされたファイルは出力してくれたので、まぁよいかという感じで流れに身を任せてパブリッシュしました。
tscofing.jsonとかでリラックスできるオプションがあるか探しましたが、なかなか難しかったです。
$ cd ~/wrksp/use-clude
$ rm -rf dist && tsc -p .
src/index.ts:5:17 - error TS2589: Type instantiation is excessively deep and possibly infinite.
5 type Record = z.infer<typeof record>;
~~~~~~~~~~~~~~~~~~~~~~
Found 1 error.
簡単ですが、以上です。
Discussion
これでいいかもです。
demo code.
定義側
使用側
簡単ですが、以上です。