fix: move openapi-types to dependencies - #321
Open
shinagawa-web wants to merge 2 commits into
Open
shinagawa-web wants to merge 2 commits into
shinagawa-web wants to merge 2 commits into
Conversation
Collaborator
Author
|
@claude PRのレビューをしてください |
|
Claude finished @shinagawa-web's task in 2m 15s —— View job PR レビュー:
|
| PR 説明での主張 | 実コードでの確認 |
|---|---|
openapi-types が devDependencies にしかない |
変更前 package.json:33 で確認 |
src/core/openapi/openapi.ts の公開型で OpenAPIV3_1 を使用 |
openapi.ts:1 で import、OpenApiSpecSchema などの型定義および toOpenApiDoc (openapi.ts:159-162) が OpenAPIV3_1.Document / PathItemObject を直接参照 |
spec.ts の公開型で OpenAPIV3_1 を使用 |
spec.ts:7 で import、DefineOpenApiEndpoint(ServerObject)/ OperationObject(OpenAPIV3_1.OperationObject) / ToOpenApiResponse(ResponseObject) が直接参照 |
これらが src/core/index.ts → src/index.ts 経由で外部公開されている |
src/core/index.ts:9 の export * from "./openapi"、src/index.ts:1 の export * from "./core" を確認 |
つまり公開 .d.ts 内で import { OpenAPIV3_1 } from "openapi-types" を辿る必要があるのに、その openapi-types が消費者側の node_modules に自動で入る保証がなかった、という問題把握は正確です。
判断(dependencies vs peerDependencies)の妥当性
openapi-typesは型定義のみのパッケージで、ランタイム値の共有インスタンスが問題になりません。したがってzod/express/mswのような peerDependencies にする動機(同一インスタンス共有・重複回避)は該当しません。- 一方で「型解決に常に必要」なので、動的 import で回避されている
zod-openapi(optionalDependencies)や@valibot/to-json-schema(peerDependencies)とは扱いを分ける必要があり、@standard-schema/spec/json-schemaと同列でdependenciesに置くのが自然です。 - 既存
package.jsonの他エントリと分類が整合しており、方針として一貫しています。
気づいた細かい点(いずれもこの PR のスコープ外・ブロッカーではありません)
- リリース時のバージョン戦略: 消費者側のインストール挙動が変わる(未指定でも自動で入る)ため、公開時は最低でも patch/minor バンプが望ましいです。破壊的変更ではないので minor で十分。
- 将来的な選択肢:
openapi-typesの型を薄くラップして再 export し、公開 API からopenapi-typesを直接参照しない構造にすれば、依存を完全に内部化できます(現状で困っていなければ後回しでOK)。 - バージョンレンジ
^12.1.3:openapi-typesはメジャーで破壊的変更を入れる運用なので caret で問題なし。将来 v13 が出た際は明示的な追従が必要ですが、これは既存慣行通り。 openapi-valibot.test.ts/openapi-zod.test.tsもopenapi-typesを import していますが、これはテストコードなのでdependenciesとして解決されて問題ありません(devDependencies に戻す必要なし)。
見落とし(sanity check)
- 公開 API 側から
openapi-typesを参照している他のエントリポイント(./core以外の./express,./fastify,./fetch,./msw,./jsonサブパス)についても念のため確認しましたが、これらは./coreを経由するため同じ修正で解決されます。追加対応は不要です。 - monorepo ルート側の
package.jsonにopenapi-typesの記載はなく、pkgs/typed-api-specに閉じた修正になっているのも意図通りです。
問題把握・判断・実装が三位一体で通っており、意図した最小変更として綺麗にまとまっています。マージ可能と考えます。
| Branch: fix/openapi-types-runtime-dependency
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
openapi-typesがpkgs/typed-api-specのdevDependenciesにしか入っておらず、実際には公開APIの型シグネチャの一部として必要になっていた問題を修正します。問題
src/core/openapi/openapi.ts・spec.tsはtoOpenApiDocやOpenApiSpecSchemaなどの公開関数・型のシグネチャでopenapi-typesのOpenAPIV3_1を直接使っています。これらはsrc/core/index.ts経由で@notainc/typed-api-spec/coreから、さらにsrc/index.tsのexport * from "./core"経由でパッケージ root からも公開されています。つまり
@notainc/typed-api-spec(root)や@notainc/typed-api-spec/coreを使う消費者のTypeScriptは、これらの型を解決する際に.d.ts内のimport { OpenAPIV3_1 } from "openapi-types"を辿る必要があります。しかしopenapi-typesはdevDependenciesにしかなく、dependencies/peerDependenciesに無いため、消費者のnode_modulesに自動でインストールされる保証がありません。型は使えると宣言しているのに、その型を構成するパッケージ自体が存在しない可能性がある、という状態でした。対応
openapi-typesをdevDependenciesからdependenciesに移動しました。openapi-typesはランタイムコードを持たない型定義のみのパッケージで、zod/valibot/express/fastify/mswのように「消費者が実行時の同一インスタンスを共有する必要がある」というpeerDependenciesにする理由が当てはまりません。パッケージが動作・型解決するために常に必要な@standard-schema/specやjson-schemaなどと同じ扱いとしてdependenciesに置くのが妥当と判断しました。影響
利用者側の対応は不要です(消費者が明示的に
openapi-typesをインストールしていなくても、@notainc/typed-api-specのインストール時に自動で入るようになる、という改善のみ)。