swallowkit 1.0.0-beta.2 → 1.0.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +21 -21
  2. package/README.ja.md +312 -215
  3. package/README.md +369 -216
  4. package/dist/__tests__/fixtures.d.ts +22 -0
  5. package/dist/__tests__/fixtures.d.ts.map +1 -0
  6. package/dist/__tests__/fixtures.js +146 -0
  7. package/dist/__tests__/fixtures.js.map +1 -0
  8. package/dist/cli/commands/add-auth.d.ts +10 -0
  9. package/dist/cli/commands/add-auth.d.ts.map +1 -0
  10. package/dist/cli/commands/add-auth.js +444 -0
  11. package/dist/cli/commands/add-auth.js.map +1 -0
  12. package/dist/cli/commands/add-connector.d.ts +20 -0
  13. package/dist/cli/commands/add-connector.d.ts.map +1 -0
  14. package/dist/cli/commands/add-connector.js +163 -0
  15. package/dist/cli/commands/add-connector.js.map +1 -0
  16. package/dist/cli/commands/create-model.d.ts +1 -4
  17. package/dist/cli/commands/create-model.d.ts.map +1 -1
  18. package/dist/cli/commands/create-model.js +21 -82
  19. package/dist/cli/commands/create-model.js.map +1 -1
  20. package/dist/cli/commands/dev-seeds.d.ts +35 -0
  21. package/dist/cli/commands/dev-seeds.d.ts.map +1 -0
  22. package/dist/cli/commands/dev-seeds.js +292 -0
  23. package/dist/cli/commands/dev-seeds.js.map +1 -0
  24. package/dist/cli/commands/dev.d.ts +19 -0
  25. package/dist/cli/commands/dev.d.ts.map +1 -1
  26. package/dist/cli/commands/dev.js +476 -117
  27. package/dist/cli/commands/dev.js.map +1 -1
  28. package/dist/cli/commands/index.d.ts +1 -0
  29. package/dist/cli/commands/index.d.ts.map +1 -1
  30. package/dist/cli/commands/index.js +3 -1
  31. package/dist/cli/commands/index.js.map +1 -1
  32. package/dist/cli/commands/init.d.ts +13 -0
  33. package/dist/cli/commands/init.d.ts.map +1 -1
  34. package/dist/cli/commands/init.js +2627 -1708
  35. package/dist/cli/commands/init.js.map +1 -1
  36. package/dist/cli/commands/scaffold.d.ts +3 -0
  37. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  38. package/dist/cli/commands/scaffold.js +617 -129
  39. package/dist/cli/commands/scaffold.js.map +1 -1
  40. package/dist/cli/index.d.ts +5 -1
  41. package/dist/cli/index.d.ts.map +1 -1
  42. package/dist/cli/index.js +164 -42
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/core/config.d.ts +8 -2
  45. package/dist/core/config.d.ts.map +1 -1
  46. package/dist/core/config.js +90 -4
  47. package/dist/core/config.js.map +1 -1
  48. package/dist/core/mock/connector-mock-server.d.ts +101 -0
  49. package/dist/core/mock/connector-mock-server.d.ts.map +1 -0
  50. package/dist/core/mock/connector-mock-server.js +480 -0
  51. package/dist/core/mock/connector-mock-server.js.map +1 -0
  52. package/dist/core/mock/zod-mock-generator.d.ts +14 -0
  53. package/dist/core/mock/zod-mock-generator.d.ts.map +1 -0
  54. package/dist/core/mock/zod-mock-generator.js +163 -0
  55. package/dist/core/mock/zod-mock-generator.js.map +1 -0
  56. package/dist/core/operations/create-model.d.ts +15 -0
  57. package/dist/core/operations/create-model.d.ts.map +1 -0
  58. package/dist/core/operations/create-model.js +171 -0
  59. package/dist/core/operations/create-model.js.map +1 -0
  60. package/dist/core/operations/runtime.d.ts +32 -0
  61. package/dist/core/operations/runtime.d.ts.map +1 -0
  62. package/dist/core/operations/runtime.js +225 -0
  63. package/dist/core/operations/runtime.js.map +1 -0
  64. package/dist/core/operations/scaffold-machine.d.ts +16 -0
  65. package/dist/core/operations/scaffold-machine.d.ts.map +1 -0
  66. package/dist/core/operations/scaffold-machine.js +63 -0
  67. package/dist/core/operations/scaffold-machine.js.map +1 -0
  68. package/dist/core/project/manifest.d.ts +92 -0
  69. package/dist/core/project/manifest.d.ts.map +1 -0
  70. package/dist/core/project/manifest.js +321 -0
  71. package/dist/core/project/manifest.js.map +1 -0
  72. package/dist/core/project/validation.d.ts +20 -0
  73. package/dist/core/project/validation.d.ts.map +1 -0
  74. package/dist/core/project/validation.js +204 -0
  75. package/dist/core/project/validation.js.map +1 -0
  76. package/dist/core/scaffold/auth-generator.d.ts +38 -0
  77. package/dist/core/scaffold/auth-generator.d.ts.map +1 -0
  78. package/dist/core/scaffold/auth-generator.js +1244 -0
  79. package/dist/core/scaffold/auth-generator.js.map +1 -0
  80. package/dist/core/scaffold/connector-functions-generator.d.ts +41 -0
  81. package/dist/core/scaffold/connector-functions-generator.d.ts.map +1 -0
  82. package/dist/core/scaffold/connector-functions-generator.js +1027 -0
  83. package/dist/core/scaffold/connector-functions-generator.js.map +1 -0
  84. package/dist/core/scaffold/functions-generator.d.ts +7 -1
  85. package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
  86. package/dist/core/scaffold/functions-generator.js +920 -213
  87. package/dist/core/scaffold/functions-generator.js.map +1 -1
  88. package/dist/core/scaffold/model-parser.d.ts +20 -1
  89. package/dist/core/scaffold/model-parser.d.ts.map +1 -1
  90. package/dist/core/scaffold/model-parser.js +329 -135
  91. package/dist/core/scaffold/model-parser.js.map +1 -1
  92. package/dist/core/scaffold/nextjs-generator.d.ts +8 -0
  93. package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
  94. package/dist/core/scaffold/nextjs-generator.js +314 -182
  95. package/dist/core/scaffold/nextjs-generator.js.map +1 -1
  96. package/dist/core/scaffold/openapi-generator.d.ts +3 -0
  97. package/dist/core/scaffold/openapi-generator.d.ts.map +1 -0
  98. package/dist/core/scaffold/openapi-generator.js +190 -0
  99. package/dist/core/scaffold/openapi-generator.js.map +1 -0
  100. package/dist/core/scaffold/ui-generator.d.ts +10 -4
  101. package/dist/core/scaffold/ui-generator.d.ts.map +1 -1
  102. package/dist/core/scaffold/ui-generator.js +768 -663
  103. package/dist/core/scaffold/ui-generator.js.map +1 -1
  104. package/dist/database/base-model.d.ts +3 -3
  105. package/dist/database/base-model.js +3 -3
  106. package/dist/index.d.ts +2 -2
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +2 -1
  109. package/dist/index.js.map +1 -1
  110. package/dist/machine/contracts.d.ts +16 -0
  111. package/dist/machine/contracts.d.ts.map +1 -0
  112. package/dist/machine/contracts.js +3 -0
  113. package/dist/machine/contracts.js.map +1 -0
  114. package/dist/machine/errors.d.ts +11 -0
  115. package/dist/machine/errors.d.ts.map +1 -0
  116. package/dist/machine/errors.js +34 -0
  117. package/dist/machine/errors.js.map +1 -0
  118. package/dist/machine/index.d.ts +3 -0
  119. package/dist/machine/index.d.ts.map +1 -0
  120. package/dist/machine/index.js +156 -0
  121. package/dist/machine/index.js.map +1 -0
  122. package/dist/mcp/index.d.ts +25 -0
  123. package/dist/mcp/index.d.ts.map +1 -0
  124. package/dist/mcp/index.js +184 -0
  125. package/dist/mcp/index.js.map +1 -0
  126. package/dist/types/index.d.ts +65 -0
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/utils/package-manager.d.ts +109 -0
  129. package/dist/utils/package-manager.d.ts.map +1 -0
  130. package/dist/utils/package-manager.js +215 -0
  131. package/dist/utils/package-manager.js.map +1 -0
  132. package/package.json +85 -73
  133. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +1139 -0
  134. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +194 -0
  135. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +532 -0
  136. package/src/__tests__/auth.test.ts +654 -0
  137. package/src/__tests__/config.test.ts +263 -0
  138. package/src/__tests__/connector-functions-generator.test.ts +288 -0
  139. package/src/__tests__/connector-mock-server.test.ts +439 -0
  140. package/src/__tests__/connector-model-bff.test.ts +162 -0
  141. package/src/__tests__/dev-seeds.test.ts +112 -0
  142. package/src/__tests__/dev.test.ts +154 -0
  143. package/src/__tests__/fixtures.ts +144 -0
  144. package/src/__tests__/functions-generator.test.ts +237 -0
  145. package/src/__tests__/init.test.ts +80 -0
  146. package/src/__tests__/machine.test.ts +212 -0
  147. package/src/__tests__/mcp.test.ts +56 -0
  148. package/src/__tests__/model-parser.test.ts +72 -0
  149. package/src/__tests__/nextjs-generator.test.ts +97 -0
  150. package/src/__tests__/openapi-generator.test.ts +43 -0
  151. package/src/__tests__/package-manager.test.ts +189 -0
  152. package/src/__tests__/scaffold.test.ts +39 -0
  153. package/src/__tests__/string-utils.test.ts +75 -0
  154. package/src/__tests__/ui-generator.test.ts +144 -0
  155. package/src/__tests__/zod-mock-generator.test.ts +132 -0
  156. package/src/cli/commands/add-auth.ts +500 -0
  157. package/src/cli/commands/add-connector.ts +158 -0
  158. package/src/cli/commands/create-model.ts +62 -0
  159. package/src/cli/commands/dev-seeds.ts +358 -0
  160. package/src/cli/commands/dev.ts +962 -0
  161. package/src/cli/commands/index.ts +9 -0
  162. package/src/cli/commands/init.ts +3371 -0
  163. package/src/cli/commands/provision.ts +193 -0
  164. package/src/cli/commands/scaffold.ts +1211 -0
  165. package/src/cli/index.ts +193 -0
  166. package/src/core/config.ts +308 -0
  167. package/src/core/mock/connector-mock-server.ts +555 -0
  168. package/src/core/mock/zod-mock-generator.ts +205 -0
  169. package/src/core/operations/create-model.ts +174 -0
  170. package/src/core/operations/runtime.ts +235 -0
  171. package/src/core/operations/scaffold-machine.ts +91 -0
  172. package/src/core/project/manifest.ts +402 -0
  173. package/src/core/project/validation.ts +221 -0
  174. package/src/core/scaffold/auth-generator.ts +1284 -0
  175. package/src/core/scaffold/connector-functions-generator.ts +1128 -0
  176. package/src/core/scaffold/functions-generator.ts +970 -0
  177. package/src/core/scaffold/model-parser.ts +841 -0
  178. package/src/core/scaffold/nextjs-generator.ts +370 -0
  179. package/src/core/scaffold/openapi-generator.ts +212 -0
  180. package/src/core/scaffold/ui-generator.ts +1061 -0
  181. package/src/database/base-model.ts +184 -0
  182. package/src/database/client.ts +140 -0
  183. package/src/database/repository.ts +104 -0
  184. package/src/database/runtime-check.ts +25 -0
  185. package/src/index.ts +27 -0
  186. package/src/machine/contracts.ts +17 -0
  187. package/src/machine/errors.ts +34 -0
  188. package/src/machine/index.ts +173 -0
  189. package/src/mcp/index.ts +185 -0
  190. package/src/types/index.ts +134 -0
  191. package/src/utils/package-manager.ts +229 -0
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Takumasa Hirabayashi
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Takumasa Hirabayashi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.ja.md CHANGED
@@ -1,215 +1,312 @@
1
- # SwallowKit
2
-
3
- [![npm version](https://img.shields.io/npm/v/swallowkit.svg)](https://www.npmjs.com/package/swallowkit)
4
- [![npm downloads](https://img.shields.io/npm/dm/swallowkit.svg)](https://www.npmjs.com/package/swallowkit)
5
- [![license](https://img.shields.io/npm/l/swallowkit.svg)](./LICENSE)
6
-
7
- [English](./README.md) | 日本語
8
-
9
- **Azure 上の Next.js アプリケーション向けの型安全なスキーマ駆動開発ツールキット**
10
-
11
- SwallowKit は、Zod スキーマを通じてエンドツーエンドの型安全性を維持しながら、外部の Azure Functions バックエンドを持つフルスタック Next.js アプリケーションを Static Web Apps で構築するための統合キットです。
12
-
13
- Next.js の API ルートを BFF(Backend For Frontend)としての使用のみに制限し、ビジネスロジックは独立した Azure Functions にオフロードすることでクライアント・サーバー間の明確な分離を提供します。
14
-
15
- Zod スキーマから自動的に CRUD 操作を生成する Scaffold 機能を備え、一貫した型定義で Next.js (Azure Static Web Apps)、Azure Functions、Cosmos DB を組み合わせた構成で、CRUD コードの自動生成から本番デプロイ・CI/CD までをサポートします。
16
-
17
- > **注意**: このプロジェクトは活発に開発中です。将来のバージョンでAPIが変更される可能性があります。
18
-
19
- ## ✨ 主な特徴
20
-
21
- - **🔄 Zod スキーマ共有** - フロントエンド、BFF、Azure Functions、Cosmos DB で同じスキーマを使用
22
- - **⚡ CRUD コード生成** - `swallowkit scaffold` で Azure Functions + Next.js コードを自動生成
23
- - **🛡️ 完全な型安全性** - クライアントからデータベースまでエンドツーエンド TypeScript
24
- - **🎯 BFF パターン** - Next.js API Routes BFF レイヤーとして機能、自動検証・リソース名推論
25
- - **☁️ Azure 最適化** - Static Web Apps + Functions + Cosmos DB で最小コスト構成
26
- - **🚀 簡単デプロイ** - Bicep IaC + CI/CD ワークフローを自動生成
27
-
28
-
29
- ## 📚 ドキュメント
30
-
31
- - **[CLI リファレンス](./docs/cli-reference.ja.md)** - 全コマンドの詳細
32
- - **[Scaffold ガイド](./docs/scaffold-guide.ja.md)** - CRUD コード生成
33
- - **[Zod スキーマ共有ガイド](./docs/zod-schema-sharing-guide.ja.md)** - スキーマ設計
34
- - **[デプロイガイド](./docs/deployment-guide.ja.md)** - Azure へのデプロイ
35
-
36
- ## 🚀 クイックスタート
37
-
38
- ### 1. プロジェクト作成
39
-
40
- ```bash
41
- npx swallowkit init my-app
42
- cd my-app
43
- ```
44
-
45
- ### 2. モデルの作成
46
-
47
- 複数のモデルをまとめて作成できます:
48
-
49
- ```bash
50
- npx swallowkit create-model category todo
51
- ```
52
-
53
- これにより `shared/models/category.ts` `shared/models/todo.ts` が生成されます。必要なフィールドを追加してカスタマイズ:
54
-
55
- ```typescript
56
- // shared/models/category.ts
57
- import { z } from 'zod';
58
-
59
- export const category = z.object({
60
- id: z.string(),
61
- name: z.string().min(1).max(50),
62
- createdAt: z.string().optional(),
63
- updatedAt: z.string().optional(),
64
- });
65
-
66
- export type Category = z.infer<typeof category>;
67
- ```
68
-
69
- 親子関係を表現するには、ID 参照ではなく**ネスト型**で記述します:
70
-
71
- ```typescript
72
- // shared/models/todo.ts
73
- import { z } from 'zod';
74
- import { category } from './category';
75
-
76
- export const todo = z.object({
77
- id: z.string(),
78
- text: z.string().min(1).max(200),
79
- completed: z.boolean().default(false),
80
- category: category.optional(), // ネストオブジェクト(categoryId ではない)
81
- createdAt: z.string().optional(),
82
- updatedAt: z.string().optional(),
83
- });
84
-
85
- export type Todo = z.infer<typeof todo>;
86
- ```
87
-
88
- > **Tip**: ネスト型を使うことで型安全性が保たれ、関連データがドキュメント内にまとまって保存されます。これは Cosmos DB のドキュメントモデルに自然な形です。
89
-
90
- ### 3. CRUD コード生成
91
-
92
- ```bash
93
- npx swallowkit scaffold shared/models/todo.ts
94
- ```
95
-
96
- これで以下が自動生成されます:
97
- - ✅ Azure Functions (CRUD エンドポイント + Cosmos DB バインディング)
98
- - Next.js BFF API Routes (自動検証・リソース名推論)
99
- - ✅ React コンポーネント (型安全なフォーム)
100
-
101
- ### 4. 開発サーバー起動
102
-
103
- ```bash
104
- npx swallowkit dev
105
- ```
106
-
107
- - Next.js: http://localhost:3000
108
- - Azure Functions: http://localhost:7071
109
-
110
- ### 5. フロントエンドから使用
111
-
112
- ```typescript
113
- import { api } from '@/lib/api/backend';
114
- import type { Todo } from '@/shared/models/todo';
115
-
116
- // 全件取得 - BFFエンドポイントを呼び出し
117
- const todos = await api.get<Todo[]>('/api/todos');
118
-
119
- // 作成 - バックエンドで検証
120
- const created = await api.post<Todo>('/api/todos', {
121
- text: '牛乳を買う',
122
- completed: false
123
- });
124
-
125
- // 更新 - バックエンドで検証
126
- const updated = await api.put<Todo>('/api/todos/123', { completed: true });
127
-
128
- // 削除
129
- await api.delete('/api/todos/123');
130
- ```
131
-
132
- ## 🏗️ アーキテクチャ
133
-
134
- ```
135
- ┌─────────────────────────────────────────────────────────────┐
136
- │ Frontend (React) │
137
- │ - Client Components │
138
- │ - Server Components (SSR) │
139
- └──────────────────────────┬───────────────────────────────────┘
140
- api.post('/api/todos', data)
141
-
142
- ┌─────────────────────────────────────────────────────────────┐
143
- │ BFF Layer (Next.js API Routes) │
144
- │ - Auto Schema Validation (Zod) │
145
- - Error Handling │
146
- └──────────────────────────┬───────────────────────────────────┘
147
- │ HTTP Request
148
-
149
- ┌─────────────────────────────────────────────────────────────┐
150
- │ Azure Functions (Backend) │
151
- │ - HTTP Triggers (CRUD) │
152
- │ - Zod Validation (Re-check) │
153
- │ - Business Logic │
154
- │ - Cosmos DB Bindings │
155
- └──────────────────────────┬───────────────────────────────────┘
156
-
157
-
158
- ┌─────────────────────────────────────────────────────────────┐
159
- Azure Cosmos DB │
160
- - NoSQL Database │
161
- │ - Zod Schema Validation │
162
- └─────────────────────────────────────────────────────────────┘
163
- ```
164
-
165
- **重要なパターン:**
166
- - **BFF (Backend For Frontend)**: Next.js API Routes が Azure Functions へのプロキシ
167
- - **共有スキーマ**: Zod スキーマをフロントエンド・BFF・Functions・DB で共有
168
- - **型安全性**: Zod から TypeScript 型を自動推論
169
- - **マネージド ID**: サービス間の安全な接続(接続文字列不要)
170
-
171
- ## 📦 前提条件
172
-
173
- - Node.js 22.x
174
- - Azure Cosmos DB Emulator (ローカル開発用)
175
- - [公式ドキュメント (vNext 推奨)](https://learn.microsoft.com/ja-jp/azure/cosmos-db/emulator-linux)
176
- - Windows: [ダウンロード](https://aka.ms/cosmosdb-emulator)
177
- - Docker: `docker run -p 8081:8081 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator`
178
-
179
- ## 🚀 Azure へのデプロイ
180
-
181
- Next.js アプリを standalone モードで Azure Static Web Apps にデプロイし、バックエンド操作のために独立した Azure Functions に接続します。
182
-
183
- **1. リソースをプロビジョニング (Bicep IaC)**
184
-
185
- ```bash
186
- npx swallowkit provision --resource-group my-app-rg --location japaneast
187
- ```
188
-
189
- プロビジョニング完了後、CI/CD に必要なシークレット値がターミナルに表示されます。コピーしておいてください。
190
-
191
- **2. コードをプッシュ**
192
-
193
- ```bash
194
- git push origin main
195
- ```
196
-
197
- **3. 自動実行された CI/CD をキャンセル** — シークレット未登録のため失敗します。
198
-
199
- **4. 表示された値をシークレットに登録** — GitHub (Settings → Secrets) または Azure DevOps (Pipelines → Library) に登録します。
200
-
201
- **5. CI/CD ワークフローを手動で再実行します。**
202
-
203
- 詳細は **[デプロイガイド](./docs/deployment-guide.ja.md)** を参照してください。
204
-
205
- ## ライセンス
206
-
207
- MIT
208
-
209
- ## 🔗 関連リンク
210
-
211
- - [Azure Static Web Apps](https://learn.microsoft.com/ja-jp/azure/static-web-apps/)
212
- - [Azure Functions](https://learn.microsoft.com/ja-jp/azure/azure-functions/)
213
- - [Azure Cosmos DB](https://learn.microsoft.com/ja-jp/azure/cosmos-db/)
214
- - [Next.js](https://nextjs.org/)
215
- - [Zod](https://zod.dev/)
1
+ # SwallowKit
2
+
3
+ [![npm version](https://img.shields.io/npm/v/swallowkit.svg)](https://www.npmjs.com/package/swallowkit)
4
+ [![npm downloads](https://img.shields.io/npm/dm/swallowkit.svg)](https://www.npmjs.com/package/swallowkit)
5
+ [![VS Code Marketplace](https://img.shields.io/visual-studio-marketplace/v/himanago.swallowkit-vscode?label=VS%20Code%20Extension)](https://marketplace.visualstudio.com/items?itemName=himanago.swallowkit-vscode)
6
+ [![license](https://img.shields.io/npm/l/swallowkit.svg)](./LICENSE)
7
+
8
+ [English](./README.md) | 日本語
9
+
10
+ **Azure 上の Next.js アプリケーション向けの型安全なスキーマ駆動開発ツールキット**
11
+
12
+ SwallowKit は、Zod スキーマを通じてエンドツーエンドの型安全性を維持しながら、外部の Azure Functions バックエンドを持つフルスタック Next.js アプリケーションを Static Web Apps で構築するための統合キットです。
13
+
14
+ Next.js の API ルートを BFF(Backend For Frontend)としての使用のみに制限し、ビジネスロジックは独立した Azure Functions にオフロードすることでクライアント・サーバー間の明確な分離を提供します。
15
+
16
+ Zod スキーマから自動的に CRUD 操作を生成する Scaffold 機能を備え、一貫した型定義で Next.js (Azure Static Web Apps)、Azure Functions、Cosmos DB を組み合わせた構成で、CRUD コードの自動生成から本番デプロイ・CI/CD までをサポートします。
17
+
18
+ > **注意**: このプロジェクトは活発に開発中です。将来のバージョンでAPIが変更される可能性があります。
19
+
20
+ ## ✨ 主な特徴
21
+
22
+ - **🔄 Zod スキーマ共有** - フロントエンド、BFF、Azure Functions、Cosmos DB をまたいで Zod を唯一のソースとして維持
23
+ - **⚡ CRUD コード生成** - `swallowkit scaffold` で Azure Functions + Next.js コードを自動生成
24
+ - **🌐 Functions バックエンド多言語対応** - `init` 時に Azure Functions の言語として TypeScript、C#、Python を選択可能
25
+ - **🧬 OpenAPI スキーマブリッジ** - C#/Python バックエンドでは `scaffold` Zod から OpenAPI を出力し、各言語向けスキーマ資産を生成
26
+ - **🛡️ 契約安全性** - 共有 Zod または OpenAPI 由来のモデルにより、フロント/BFF とバックエンドの契約を整合
27
+ - **🎯 BFF パターン** - Next.js API Routes が BFF レイヤーとして機能、自動検証・リソース名推論
28
+ - **☁️ Azure 最適化** - Static Web Apps + Functions + Cosmos DB で最小コスト構成
29
+ - **🚀 簡単デプロイ** - Bicep IaC + CI/CD ワークフローを自動生成
30
+ - **🤖 AI フレンドリー** - 自動生成される指示ファイル(`AGENTS.md`、`CLAUDE.md`、`.github/copilot-instructions.md`)とレイヤー別ルールにより、GitHub Copilot・Claude Code・OpenAI Codex がプロジェクト規約に従ってコードを生成
31
+ - **🧠 MCP + Machine Interface** - `swallowkit machine ...` で inspection / validation / generation を決定的な JSON として公開し、`swallowkit-mcp` で同じ機能を MCP stdio として提供
32
+ - **🔌 外部データコネクタ** - MySQL・PostgreSQL・REST API などの外部データソースを Cosmos DB と並行して統合。同じ Zod 駆動の scaffold ワークフローで完全な型安全性を維持
33
+ - **🔐 認証・認可** - カスタム JWT 認証(外部 RDB ユーザーストア)とモデル単位のロールベースアクセス制御を組み込みサポート。将来の Static Web Apps 認証統合も計画中
34
+ - **🧩 [VS Code 拡張機能](https://marketplace.visualstudio.com/items?itemName=himanago.swallowkit-vscode)** - init/scaffold/dev の GUI ウィザード、モデルファイル右クリックでスキャフォールド、開発サーバーステータスバー、TypeScript スニペット
35
+
36
+
37
+ ## 📚 ドキュメント
38
+
39
+ **[SwallowKit ドキュメント](https://himanago.github.io/swallowkit/ja/)** で完全なドキュメントをご覧ください([English](https://himanago.github.io/swallowkit/en/) もあります)。
40
+
41
+ - **[CLI リファレンス](https://himanago.github.io/swallowkit/ja/cli-reference)** - 全コマンドの詳細
42
+ - **[Scaffold ガイド](https://himanago.github.io/swallowkit/ja/scaffold-guide)** - CRUD コード生成
43
+ - **[Connector ガイド](https://himanago.github.io/swallowkit/ja/connector-guide)** - 外部データソース統合
44
+ - **[認証ガイド](https://himanago.github.io/swallowkit/ja/auth-guide)** - 認証とロールベースアクセス制御
45
+ - **[Zod スキーマ共有ガイド](https://himanago.github.io/swallowkit/ja/zod-schema-sharing-guide)** - スキーマ設計
46
+ - **[デプロイガイド](https://himanago.github.io/swallowkit/ja/deployment-guide)** - Azure へのデプロイ
47
+
48
+ ## 🚀 クイックスタート
49
+
50
+ ### 1. プロジェクト作成
51
+
52
+ ```bash
53
+ npx swallowkit init my-app
54
+ # or
55
+ pnpm dlx swallowkit init my-app
56
+ cd my-app
57
+ ```
58
+
59
+ 対話プロンプトで CI/CD プロバイダー、Azure Functions のバックエンド言語、Cosmos DB モード、ネットワーク設定を選択します。フラグで直接指定するとプロンプトをスキップできます:
60
+
61
+ ```bash
62
+ # 非対話モード(VS Code 拡張機能や自動化に便利)
63
+ npx swallowkit init my-app --cicd github --backend-language python --cosmos-db-mode serverless --vnet outbound
64
+ ```
65
+
66
+ | フラグ | | 説明 |
67
+ |------|-----|------|
68
+ | `--cicd <provider>` | `github`, `azure`, `skip` | CI/CD プロバイダー |
69
+ | `--backend-language <language>` | `typescript`, `csharp`, `python` | Azure Functions のバックエンド言語 |
70
+ | `--cosmos-db-mode <mode>` | `freetier`, `serverless` | Cosmos DB 課金モード |
71
+ | `--vnet <option>` | `outbound`, `none` | ネットワークセキュリティ |
72
+
73
+ フラグを省略すると、その項目は対話プロンプトで質問されます。
74
+
75
+ ### 2. モデルの作成
76
+
77
+ 複数のモデルをまとめて作成できます:
78
+
79
+ ```bash
80
+ npx swallowkit create-model category todo
81
+ # or
82
+ pnpm dlx swallowkit create-model category todo
83
+ ```
84
+
85
+ これにより `shared/models/category.ts` `shared/models/todo.ts` が生成されます。必要なフィールドを追加してカスタマイズ:
86
+
87
+ ```typescript
88
+ // shared/models/category.ts
89
+ import { z } from 'zod';
90
+
91
+ export const category = z.object({
92
+ id: z.string(),
93
+ name: z.string().min(1).max(50),
94
+ createdAt: z.string().optional(),
95
+ updatedAt: z.string().optional(),
96
+ });
97
+
98
+ export type Category = z.infer<typeof category>;
99
+ ```
100
+
101
+ 親子関係を表現するには、ID 参照ではなく**ネスト型**で記述します:
102
+
103
+ ```typescript
104
+ // shared/models/todo.ts
105
+ import { z } from 'zod';
106
+ import { category } from './category';
107
+
108
+ export const todo = z.object({
109
+ id: z.string(),
110
+ text: z.string().min(1).max(200),
111
+ completed: z.boolean().default(false),
112
+ category: category.optional(), // ネストオブジェクト(categoryId ではない)
113
+ createdAt: z.string().optional(),
114
+ updatedAt: z.string().optional(),
115
+ });
116
+
117
+ export type Todo = z.infer<typeof todo>;
118
+ ```
119
+
120
+ > **Tip**: ネスト型を使うことで型安全性が保たれ、関連データがドキュメント内にまとまって保存されます。これは Cosmos DB のドキュメントモデルに自然な形です。
121
+
122
+ ### 3. CRUD コード生成
123
+
124
+ ```bash
125
+ npx swallowkit scaffold shared/models/todo.ts
126
+ # or
127
+ pnpm dlx swallowkit scaffold shared/models/todo.ts
128
+ ```
129
+
130
+ これで以下が自動生成されます:
131
+ - ✅ Azure Functions (CRUD エンドポイント + Cosmos DB バインディング)
132
+ - Next.js BFF API Routes (自動検証・リソース名推論)
133
+ - ✅ React コンポーネント (型安全なフォーム)
134
+
135
+ `init` で `csharp` または `python` を選んだ場合、`swallowkit scaffold` はあわせて `functions/openapi/` に OpenAPI ドキュメントを出力し、`functions/generated/` に各言語向けスキーマ資産を生成します。
136
+
137
+ ### 4. 開発サーバー起動
138
+
139
+ ```bash
140
+ npx swallowkit dev
141
+ # or
142
+ pnpm dlx swallowkit dev
143
+ ```
144
+
145
+ - Next.js: http://localhost:3000
146
+ - Azure Functions: http://localhost:7071
147
+
148
+ ### 5. フロントエンドから使用
149
+
150
+ ```typescript
151
+ import { api } from '@/lib/api/backend';
152
+ import type { Todo } from '@/shared/models/todo';
153
+
154
+ // 全件取得 - BFFエンドポイントを呼び出し
155
+ const todos = await api.get<Todo[]>('/api/todos');
156
+
157
+ // 作成 - バックエンドで検証
158
+ const created = await api.post<Todo>('/api/todos', {
159
+ text: '牛乳を買う',
160
+ completed: false
161
+ });
162
+
163
+ // 更新 - バックエンドで検証
164
+ const updated = await api.put<Todo>('/api/todos/123', { completed: true });
165
+
166
+ // 削除
167
+ await api.delete('/api/todos/123');
168
+ ```
169
+
170
+ ### 6. 外部データソースの統合(オプション)
171
+
172
+ SwallowKit は **コネクタ** により、Cosmos DB と併用して外部 RDB データベースや REST API を統合できます。同じ Zod 駆動のワークフローをそのまま使えます:
173
+
174
+ ```bash
175
+ # コネクタを登録
176
+ npx swallowkit add-connector mysql --type rdb --provider mysql --connection-env MYSQL_CONNECTION_STRING
177
+
178
+ # コネクタ対応モデルを作成
179
+ npx swallowkit create-model user --connector mysql
180
+ # shared/models/user.ts を編集(スキーマ + connectorConfig をカスタマイズ)
181
+
182
+ # scaffold がコネクタ固有の Functions コードを生成
183
+ npx swallowkit scaffold shared/models/user.ts
184
+
185
+ # 実際の MySQL がなくてもモックデータでローカル開発
186
+ npx swallowkit dev --mock-connectors
187
+ ```
188
+
189
+ フロントエンドと BFF レイヤーはデータソースの違いを意識しません — `callFunction()` は Cosmos DB モデルでもコネクタモデルでも同一です。詳しくは **[Connector ガイド](https://himanago.github.io/swallowkit/ja/connector-guide)** を参照してください。
190
+
191
+ ## 🤖 AI / MCP 統合
192
+
193
+ SwallowKit は、コーディングエージェントや MCP adapter 向けに machine-readable な CLI を提供します。AI が filesystem を推測して直接変更するのではなく、SwallowKit の正式な generator / inspector / validator を経由して操作できるようにするためです。
194
+
195
+ ```bash
196
+ # framework が理解している project metadata を取得
197
+ npx swallowkit machine inspect project
198
+
199
+ # SwallowKit 規約と生成物の整合性を検証
200
+ npx swallowkit machine validate project
201
+
202
+ # 正式な machine interface 経由で生成
203
+ npx swallowkit machine generate model todo --overwrite never
204
+ npx swallowkit machine generate scaffold todo --api-only
205
+ ```
206
+
207
+ `swallowkit machine` はすべて:
208
+
209
+ - 非対話
210
+ - deterministic
211
+ - stdout JSON のみ
212
+ - 成功 / 失敗ともに構造化出力
213
+
214
+ MCP client からは、同梱の stdio server を利用できます:
215
+
216
+ ```bash
217
+ npx swallowkit-mcp
218
+ ```
219
+
220
+ MCP server は explicit な Tool だけを公開する薄い adapter で、実処理は machine CLI に委譲します。
221
+
222
+ ## 🏗️ アーキテクチャ
223
+
224
+ ```
225
+ ┌─────────────────────────────────────────────────────────────┐
226
+ │ Frontend (React) │
227
+ │ - Client Components │
228
+ │ - Server Components (SSR) │
229
+ └──────────────────────────┬───────────────────────────────────┘
230
+ │ api.post('/api/todos', data)
231
+
232
+ ┌─────────────────────────────────────────────────────────────┐
233
+ │ BFF Layer (Next.js API Routes) │
234
+ │ - Auto Schema Validation (Zod) │
235
+ │ - Error Handling │
236
+ └──────────────────────────┬───────────────────────────────────┘
237
+ │ HTTP Request
238
+
239
+ ┌─────────────────────────────────────────────────────────────┐
240
+ │ Azure Functions (Backend) │
241
+ │ - HTTP Triggers (CRUD) │
242
+ │ - Zod Validation (Re-check) │
243
+ │ - Business Logic │
244
+ │ - Data Source Bindings │
245
+ └──────────┬───────────────┼───────────────┬──────────────────┘
246
+ │ │ │
247
+ ▼ ▼ ▼
248
+ ┌────────────────┐ ┌──────────────┐ ┌──────────────────┐
249
+ │ Azure Cosmos │ │ 外部 RDB │ │ 外部 SaaS API │
250
+ │ DB (既定) │ │ (MySQL, │ │ (REST) │
251
+ │ │ │ PostgreSQL) │ │ │
252
+ └────────────────┘ └──────────────┘ └──────────────────┘
253
+ ```
254
+
255
+ **重要なパターン:**
256
+ - **BFF (Backend For Frontend)**: Next.js API Routes が Azure Functions へのプロキシ
257
+ - **共有スキーマ**: `shared/models/` の Zod スキーマを唯一のソースとして扱う
258
+ - **C#/Python 向け OpenAPI ブリッジ**: TypeScript 以外の Functions は `functions/generated/` の生成資産を利用
259
+ - **外部コネクタ**: MySQL・PostgreSQL・REST API — scaffold 生成の Functions で同じ BFF パターンを維持
260
+ - **契約安全性**: 共有 Zod または生成モデルで BFF とバックエンドの整合を保つ
261
+ - **マネージド ID**: サービス間の安全な接続(接続文字列不要)
262
+
263
+ ## 📦 前提条件
264
+
265
+ - Node.js 22.x
266
+ - **pnpm**(推奨): `corepack enable` を実行するか、`npm install -g pnpm` でインストール
267
+ - npm でも動作します — SwallowKit はパッケージマネージャーを自動検出します(pnpm がインストール済みなら常に pnpm を優先)
268
+ - Azure Cosmos DB Emulator (ローカル開発用)
269
+ - [公式ドキュメント (vNext 推奨)](https://learn.microsoft.com/ja-jp/azure/cosmos-db/emulator-linux)
270
+ - Windows: [ダウンロード](https://aka.ms/cosmosdb-emulator)
271
+ - Docker: `docker run -p 8081:8081 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator`
272
+
273
+ ## 🚀 Azure へのデプロイ
274
+
275
+ Next.js アプリを standalone モードで Azure Static Web Apps にデプロイし、バックエンド操作のために独立した Azure Functions に接続します。
276
+
277
+ **1. リソースをプロビジョニング (Bicep IaC)**
278
+
279
+ ```bash
280
+ npx swallowkit provision --resource-group my-app-rg
281
+ # or
282
+ pnpm dlx swallowkit provision --resource-group my-app-rg
283
+ ```
284
+
285
+ このコマンドでは、プライマリリージョンと Static Web App リージョンを対話式に選択します。プロビジョニング完了後は、CI/CD 設定に必要な値がターミナルに表示されます。コピーしておいてください。
286
+
287
+ **2. コードをプッシュ**
288
+
289
+ ```bash
290
+ git push origin main
291
+ ```
292
+
293
+ **3. 自動実行された CI/CD をキャンセル** — シークレット未登録のため失敗します。
294
+
295
+ **4. 表示された secrets / variables を登録** — GitHub (Settings → Secrets) または Azure DevOps (Pipelines → Library) に登録します。
296
+
297
+ **5. CI/CD ワークフローを手動で再実行します。**
298
+
299
+ 詳細は **[デプロイガイド](https://himanago.github.io/swallowkit/ja/deployment-guide)** を参照してください。
300
+
301
+ ## ライセンス
302
+
303
+ MIT
304
+
305
+ ## 🔗 関連リンク
306
+
307
+ - [SwallowKit VS Code 拡張機能](https://marketplace.visualstudio.com/items?itemName=himanago.swallowkit-vscode)
308
+ - [Azure Static Web Apps](https://learn.microsoft.com/ja-jp/azure/static-web-apps/)
309
+ - [Azure Functions](https://learn.microsoft.com/ja-jp/azure/azure-functions/)
310
+ - [Azure Cosmos DB](https://learn.microsoft.com/ja-jp/azure/cosmos-db/)
311
+ - [Next.js](https://nextjs.org/)
312
+ - [Zod](https://zod.dev/)