Open5
bunでワークスペース

shared/
➜ tree
.
├── package.json
├── src
│ ├── constants
│ ├── index.ts
│ ├── rpc.ts
│ ├── schemas
│ │ ├── post.ts
│ │ └── thread.ts
│ ├── types
│ └── utils
└── tsconfig.json
6 directories, 6 files
bunx tsc --init
する
package.json
{
"name": "@b3s/shared",
"version": "1.0.0",
"main": "src/index.ts",
"types": "src/index.ts",
"dependencies": {
"zod": "^4.1.5"
}
}
main
とtypes
にdistは含めない
モノレポのパッケージとして使っているので.ts
を指定
frontend/
とbackend/
に移動して、bun add "@b3s/shared@workspace:*"
でパッケージをインストール

ルートのpackage.json
に下記を追加して、ワークスペース化し、モノレポとして使う
package.json
"workspaces": [
"packages/*"
],

shared
に含めるもの
スキーマの型、汎用util、共用のconstance、共用のtypesなど

next.config.ts
に追加
next.config.ts
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
transpilePackages: ["@b3s/shared"],
experimental: {
externalDir: true
}
};
export default nextConfig;
// added by create cloudflare to enable calling `getCloudflareContext()` in `next dev`
import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
initOpenNextCloudflareForDev();
フロントでshared( : モノレポのパッケージとして)をインストールするときに必要なやつ
普通はパッケージをbuildしてdist/
配下に.js
を出力し、それをmainに扱うけど、今回のモノレポの場合、.ts
をmainの出力としており、Next側(Nextに限った話ではないけど、)は.js
じゃないと読み込めないので、インポート前にswc
でsharedパッケージをビルドするってやつ

shared/
に含めるべきはzod
依存のシンプルなスキーマで、zod-openapi
を使うべきではない
バックエンド側で@b3s/shared
のシンプルなスキーマをインポートし、それにopenapi
のexampleやdescriptionなどを付け加える設計が良いらしい