swallowkit 1.0.0-beta.8 → 1.0.0

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 (272) hide show
  1. package/README.ja.md +87 -181
  2. package/README.md +87 -238
  3. package/dist/__tests__/fixtures.d.ts +12 -0
  4. package/dist/__tests__/fixtures.d.ts.map +1 -1
  5. package/dist/__tests__/fixtures.js +101 -0
  6. package/dist/__tests__/fixtures.js.map +1 -1
  7. package/dist/cli/commands/add-auth.d.ts +15 -0
  8. package/dist/cli/commands/add-auth.d.ts.map +1 -0
  9. package/dist/cli/commands/add-auth.js +790 -0
  10. package/dist/cli/commands/add-auth.js.map +1 -0
  11. package/dist/cli/commands/add-connector.d.ts +20 -0
  12. package/dist/cli/commands/add-connector.d.ts.map +1 -0
  13. package/dist/cli/commands/add-connector.js +164 -0
  14. package/dist/cli/commands/add-connector.js.map +1 -0
  15. package/dist/cli/commands/cosmos-worktree-isolation.d.ts +25 -0
  16. package/dist/cli/commands/cosmos-worktree-isolation.d.ts.map +1 -0
  17. package/dist/cli/commands/cosmos-worktree-isolation.js +124 -0
  18. package/dist/cli/commands/cosmos-worktree-isolation.js.map +1 -0
  19. package/dist/cli/commands/create-model.d.ts +1 -4
  20. package/dist/cli/commands/create-model.d.ts.map +1 -1
  21. package/dist/cli/commands/create-model.js +20 -82
  22. package/dist/cli/commands/create-model.js.map +1 -1
  23. package/dist/cli/commands/dev-seeds.d.ts +27 -0
  24. package/dist/cli/commands/dev-seeds.d.ts.map +1 -1
  25. package/dist/cli/commands/dev-seeds.js +188 -6
  26. package/dist/cli/commands/dev-seeds.js.map +1 -1
  27. package/dist/cli/commands/dev.d.ts +30 -0
  28. package/dist/cli/commands/dev.d.ts.map +1 -1
  29. package/dist/cli/commands/dev.js +495 -129
  30. package/dist/cli/commands/dev.js.map +1 -1
  31. package/dist/cli/commands/init.d.ts +70 -0
  32. package/dist/cli/commands/init.d.ts.map +1 -1
  33. package/dist/cli/commands/init.js +797 -768
  34. package/dist/cli/commands/init.js.map +1 -1
  35. package/dist/cli/commands/scaffold.d.ts +24 -3
  36. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  37. package/dist/cli/commands/scaffold.js +408 -189
  38. package/dist/cli/commands/scaffold.js.map +1 -1
  39. package/dist/cli/index.d.ts +5 -1
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +335 -58
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/core/config.d.ts +13 -3
  44. package/dist/core/config.d.ts.map +1 -1
  45. package/dist/core/config.js +151 -8
  46. package/dist/core/config.js.map +1 -1
  47. package/dist/core/mock/connector-mock-server.d.ts +101 -0
  48. package/dist/core/mock/connector-mock-server.d.ts.map +1 -0
  49. package/dist/core/mock/connector-mock-server.js +480 -0
  50. package/dist/core/mock/connector-mock-server.js.map +1 -0
  51. package/dist/core/mock/zod-mock-generator.d.ts +14 -0
  52. package/dist/core/mock/zod-mock-generator.d.ts.map +1 -0
  53. package/dist/core/mock/zod-mock-generator.js +163 -0
  54. package/dist/core/mock/zod-mock-generator.js.map +1 -0
  55. package/dist/core/operations/auth-operations.d.ts +61 -0
  56. package/dist/core/operations/auth-operations.d.ts.map +1 -0
  57. package/dist/core/operations/auth-operations.js +272 -0
  58. package/dist/core/operations/auth-operations.js.map +1 -0
  59. package/dist/core/operations/create-model.d.ts +15 -0
  60. package/dist/core/operations/create-model.d.ts.map +1 -0
  61. package/dist/core/operations/create-model.js +185 -0
  62. package/dist/core/operations/create-model.js.map +1 -0
  63. package/dist/core/operations/file-session.d.ts +56 -0
  64. package/dist/core/operations/file-session.d.ts.map +1 -0
  65. package/dist/core/operations/file-session.js +203 -0
  66. package/dist/core/operations/file-session.js.map +1 -0
  67. package/dist/core/operations/provision-operations.d.ts +52 -0
  68. package/dist/core/operations/provision-operations.d.ts.map +1 -0
  69. package/dist/core/operations/provision-operations.js +211 -0
  70. package/dist/core/operations/provision-operations.js.map +1 -0
  71. package/dist/core/operations/runtime.d.ts +37 -0
  72. package/dist/core/operations/runtime.d.ts.map +1 -0
  73. package/dist/core/operations/runtime.js +248 -0
  74. package/dist/core/operations/runtime.js.map +1 -0
  75. package/dist/core/operations/scaffold-apply.d.ts +21 -0
  76. package/dist/core/operations/scaffold-apply.d.ts.map +1 -0
  77. package/dist/core/operations/scaffold-apply.js +57 -0
  78. package/dist/core/operations/scaffold-apply.js.map +1 -0
  79. package/dist/core/operations/scaffold-machine.d.ts +16 -0
  80. package/dist/core/operations/scaffold-machine.d.ts.map +1 -0
  81. package/dist/core/operations/scaffold-machine.js +51 -0
  82. package/dist/core/operations/scaffold-machine.js.map +1 -0
  83. package/dist/core/operations/scaffold-plan.d.ts +43 -0
  84. package/dist/core/operations/scaffold-plan.d.ts.map +1 -0
  85. package/dist/core/operations/scaffold-plan.js +187 -0
  86. package/dist/core/operations/scaffold-plan.js.map +1 -0
  87. package/dist/core/project/agent-instructions.d.ts +29 -0
  88. package/dist/core/project/agent-instructions.d.ts.map +1 -0
  89. package/dist/core/project/agent-instructions.js +160 -0
  90. package/dist/core/project/agent-instructions.js.map +1 -0
  91. package/dist/core/project/artifacts.d.ts +58 -0
  92. package/dist/core/project/artifacts.d.ts.map +1 -0
  93. package/dist/core/project/artifacts.js +179 -0
  94. package/dist/core/project/artifacts.js.map +1 -0
  95. package/dist/core/project/boundaries.d.ts +50 -0
  96. package/dist/core/project/boundaries.d.ts.map +1 -0
  97. package/dist/core/project/boundaries.js +117 -0
  98. package/dist/core/project/boundaries.js.map +1 -0
  99. package/dist/core/project/capabilities.d.ts +58 -0
  100. package/dist/core/project/capabilities.d.ts.map +1 -0
  101. package/dist/core/project/capabilities.js +135 -0
  102. package/dist/core/project/capabilities.js.map +1 -0
  103. package/dist/core/project/drift.d.ts +29 -0
  104. package/dist/core/project/drift.d.ts.map +1 -0
  105. package/dist/core/project/drift.js +188 -0
  106. package/dist/core/project/drift.js.map +1 -0
  107. package/dist/core/project/infra.d.ts +49 -0
  108. package/dist/core/project/infra.d.ts.map +1 -0
  109. package/dist/core/project/infra.js +167 -0
  110. package/dist/core/project/infra.js.map +1 -0
  111. package/dist/core/project/manifest.d.ts +92 -0
  112. package/dist/core/project/manifest.d.ts.map +1 -0
  113. package/dist/core/project/manifest.js +321 -0
  114. package/dist/core/project/manifest.js.map +1 -0
  115. package/dist/core/project/state.d.ts +15 -0
  116. package/dist/core/project/state.d.ts.map +1 -0
  117. package/dist/core/project/state.js +106 -0
  118. package/dist/core/project/state.js.map +1 -0
  119. package/dist/core/project/validation.d.ts +20 -0
  120. package/dist/core/project/validation.d.ts.map +1 -0
  121. package/dist/core/project/validation.js +274 -0
  122. package/dist/core/project/validation.js.map +1 -0
  123. package/dist/core/project/workflows.d.ts +43 -0
  124. package/dist/core/project/workflows.d.ts.map +1 -0
  125. package/dist/core/project/workflows.js +299 -0
  126. package/dist/core/project/workflows.js.map +1 -0
  127. package/dist/core/scaffold/auth-generator.d.ts +63 -0
  128. package/dist/core/scaffold/auth-generator.d.ts.map +1 -0
  129. package/dist/core/scaffold/auth-generator.js +1774 -0
  130. package/dist/core/scaffold/auth-generator.js.map +1 -0
  131. package/dist/core/scaffold/connector-functions-generator.d.ts +41 -0
  132. package/dist/core/scaffold/connector-functions-generator.d.ts.map +1 -0
  133. package/dist/core/scaffold/connector-functions-generator.js +1029 -0
  134. package/dist/core/scaffold/connector-functions-generator.js.map +1 -0
  135. package/dist/core/scaffold/functions-generator.d.ts +4 -3
  136. package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
  137. package/dist/core/scaffold/functions-generator.js +405 -134
  138. package/dist/core/scaffold/functions-generator.js.map +1 -1
  139. package/dist/core/scaffold/model-parser.d.ts +20 -0
  140. package/dist/core/scaffold/model-parser.d.ts.map +1 -1
  141. package/dist/core/scaffold/model-parser.js +229 -78
  142. package/dist/core/scaffold/model-parser.js.map +1 -1
  143. package/dist/core/scaffold/native-schema-generator.d.ts +19 -0
  144. package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -0
  145. package/dist/core/scaffold/native-schema-generator.js +753 -0
  146. package/dist/core/scaffold/native-schema-generator.js.map +1 -0
  147. package/dist/core/scaffold/nextjs-generator.d.ts +8 -0
  148. package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
  149. package/dist/core/scaffold/nextjs-generator.js +152 -8
  150. package/dist/core/scaffold/nextjs-generator.js.map +1 -1
  151. package/dist/core/scaffold/ui-generator.d.ts +17 -4
  152. package/dist/core/scaffold/ui-generator.d.ts.map +1 -1
  153. package/dist/core/scaffold/ui-generator.js +174 -34
  154. package/dist/core/scaffold/ui-generator.js.map +1 -1
  155. package/dist/core/verify/index.d.ts +69 -0
  156. package/dist/core/verify/index.d.ts.map +1 -0
  157. package/dist/core/verify/index.js +412 -0
  158. package/dist/core/verify/index.js.map +1 -0
  159. package/dist/machine/contracts.d.ts +24 -0
  160. package/dist/machine/contracts.d.ts.map +1 -0
  161. package/dist/machine/contracts.js +3 -0
  162. package/dist/machine/contracts.js.map +1 -0
  163. package/dist/machine/errors.d.ts +14 -0
  164. package/dist/machine/errors.d.ts.map +1 -0
  165. package/dist/machine/errors.js +42 -0
  166. package/dist/machine/errors.js.map +1 -0
  167. package/dist/machine/index.d.ts +3 -0
  168. package/dist/machine/index.d.ts.map +1 -0
  169. package/dist/machine/index.js +566 -0
  170. package/dist/machine/index.js.map +1 -0
  171. package/dist/mcp/index.d.ts +25 -0
  172. package/dist/mcp/index.d.ts.map +1 -0
  173. package/dist/mcp/index.js +425 -0
  174. package/dist/mcp/index.js.map +1 -0
  175. package/dist/types/index.d.ts +105 -0
  176. package/dist/types/index.d.ts.map +1 -1
  177. package/dist/utils/package-manager.d.ts +7 -11
  178. package/dist/utils/package-manager.d.ts.map +1 -1
  179. package/dist/utils/package-manager.js +42 -17
  180. package/dist/utils/package-manager.js.map +1 -1
  181. package/dist/utils/python-uv.d.ts +21 -0
  182. package/dist/utils/python-uv.d.ts.map +1 -0
  183. package/dist/utils/python-uv.js +111 -0
  184. package/dist/utils/python-uv.js.map +1 -0
  185. package/dist/version.d.ts +2 -0
  186. package/dist/version.d.ts.map +1 -0
  187. package/dist/version.js +49 -0
  188. package/dist/version.js.map +1 -0
  189. package/package.json +15 -17
  190. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +716 -22
  191. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +19 -7
  192. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +20 -12
  193. package/src/__tests__/agent-instructions.test.ts +237 -0
  194. package/src/__tests__/agent-loop-phase34.test.ts +513 -0
  195. package/src/__tests__/auth.test.ts +770 -0
  196. package/src/__tests__/bff-swa-auth.test.ts +275 -0
  197. package/src/__tests__/config.test.ts +176 -3
  198. package/src/__tests__/connector-functions-generator.test.ts +288 -0
  199. package/src/__tests__/connector-mock-server.test.ts +459 -0
  200. package/src/__tests__/connector-model-bff.test.ts +162 -0
  201. package/src/__tests__/cosmos-worktree-isolation.test.ts +149 -0
  202. package/src/__tests__/dev-seeds.test.ts +124 -0
  203. package/src/__tests__/dev.test.ts +254 -0
  204. package/src/__tests__/file-session.test.ts +98 -0
  205. package/src/__tests__/fixtures.ts +101 -0
  206. package/src/__tests__/functions-generator.test.ts +137 -1
  207. package/src/__tests__/init.test.ts +386 -1
  208. package/src/__tests__/jest-globals.d.ts +8 -0
  209. package/src/__tests__/machine.test.ts +371 -0
  210. package/src/__tests__/mcp.test.ts +253 -0
  211. package/src/__tests__/model-parser.test.ts +142 -0
  212. package/src/__tests__/multi-auth.test.ts +160 -0
  213. package/src/__tests__/nextjs-generator.test.ts +8 -0
  214. package/src/__tests__/package-manager.test.ts +59 -4
  215. package/src/__tests__/plan-apply.test.ts +499 -0
  216. package/src/__tests__/python-uv.test.ts +48 -0
  217. package/src/__tests__/scaffold.test.ts +287 -24
  218. package/src/__tests__/tsconfig.json +15 -0
  219. package/src/__tests__/ui-generator.test.ts +104 -0
  220. package/src/__tests__/zod-mock-generator.test.ts +132 -0
  221. package/src/cli/commands/add-auth.ts +853 -0
  222. package/src/cli/commands/add-connector.ts +159 -0
  223. package/src/cli/commands/cosmos-worktree-isolation.ts +130 -0
  224. package/src/cli/commands/create-model.ts +21 -100
  225. package/src/cli/commands/dev-seeds.ts +278 -7
  226. package/src/cli/commands/dev.ts +607 -160
  227. package/src/cli/commands/init.ts +880 -808
  228. package/src/cli/commands/scaffold.ts +531 -236
  229. package/src/cli/index.ts +338 -60
  230. package/src/core/config.ts +145 -9
  231. package/src/core/mock/connector-mock-server.ts +555 -0
  232. package/src/core/mock/zod-mock-generator.ts +205 -0
  233. package/src/core/operations/auth-operations.ts +360 -0
  234. package/src/core/operations/create-model.ts +191 -0
  235. package/src/core/operations/file-session.ts +222 -0
  236. package/src/core/operations/provision-operations.ts +297 -0
  237. package/src/core/operations/runtime.ts +258 -0
  238. package/src/core/operations/scaffold-apply.ts +106 -0
  239. package/src/core/operations/scaffold-machine.ts +77 -0
  240. package/src/core/operations/scaffold-plan.ts +215 -0
  241. package/src/core/project/agent-instructions.ts +167 -0
  242. package/src/core/project/agent-templates/AGENTS.md +504 -0
  243. package/src/core/project/agent-templates/CLAUDE.md +31 -0
  244. package/src/core/project/agent-templates/azure-functions.instructions.md +22 -0
  245. package/src/core/project/agent-templates/bff-routes.instructions.md +18 -0
  246. package/src/core/project/agent-templates/copilot-instructions.md +27 -0
  247. package/src/core/project/agent-templates/shared-models.instructions.md +72 -0
  248. package/src/core/project/artifacts.ts +205 -0
  249. package/src/core/project/boundaries.ts +170 -0
  250. package/src/core/project/capabilities.ts +193 -0
  251. package/src/core/project/drift.ts +202 -0
  252. package/src/core/project/infra.ts +196 -0
  253. package/src/core/project/manifest.ts +402 -0
  254. package/src/core/project/state.ts +77 -0
  255. package/src/core/project/validation.ts +295 -0
  256. package/src/core/project/workflows.ts +295 -0
  257. package/src/core/scaffold/auth-generator.ts +1824 -0
  258. package/src/core/scaffold/connector-functions-generator.ts +1133 -0
  259. package/src/core/scaffold/functions-generator.ts +432 -134
  260. package/src/core/scaffold/model-parser.ts +244 -90
  261. package/src/core/scaffold/native-schema-generator.ts +904 -0
  262. package/src/core/scaffold/nextjs-generator.ts +174 -9
  263. package/src/core/scaffold/ui-generator.ts +191 -36
  264. package/src/core/verify/index.ts +468 -0
  265. package/src/machine/contracts.ts +33 -0
  266. package/src/machine/errors.ts +45 -0
  267. package/src/machine/index.ts +690 -0
  268. package/src/mcp/index.ts +423 -0
  269. package/src/types/index.ts +137 -0
  270. package/src/utils/package-manager.ts +41 -19
  271. package/src/utils/python-uv.ts +96 -0
  272. package/src/version.ts +13 -0
@@ -4,13 +4,13 @@
4
4
  * callFunction ヘルパー方式
5
5
  */
6
6
 
7
- import { ModelInfo, toCamelCase, toKebabCase } from "./model-parser";
7
+ import { ModelInfo, toCamelCase } from "./model-parser";
8
8
 
9
9
  /**
10
10
  * BFF callFunction ヘルパー (lib/api/call-function.ts) のコードを生成
11
11
  */
12
12
  export function generateBFFCallFunction(): string {
13
- return `import { NextRequest, NextResponse } from 'next/server';
13
+ return `import { NextResponse } from 'next/server';
14
14
  import { z } from 'zod/v4';
15
15
 
16
16
  /**
@@ -32,13 +32,24 @@ function getFunctionsBaseUrl(): string {
32
32
  return process.env.BACKEND_FUNCTIONS_BASE_URL || process.env.FUNCTIONS_BASE_URL || 'http://localhost:7071';
33
33
  }
34
34
 
35
- interface CallFunctionConfig<TInput = any, TOutput = any> {
35
+ function isLocalFunctionsUrl(url: string): boolean {
36
+ return url.startsWith('http://localhost:') || url.startsWith('http://127.0.0.1:');
37
+ }
38
+
39
+ function getFunctionsKeyHeaders(functionsBaseUrl: string): Record<string, string> {
40
+ const key = process.env.BACKEND_FUNCTIONS_KEY;
41
+ if (key) return { 'x-functions-key': key };
42
+ if (isLocalFunctionsUrl(functionsBaseUrl)) return {};
43
+ throw new Error('BACKEND_FUNCTIONS_KEY is required for non-local Functions calls');
44
+ }
45
+
46
+ interface CallFunctionConfig<TInput = unknown, TOutput = unknown> {
36
47
  /** HTTP メソッド */
37
48
  method: 'GET' | 'POST' | 'PUT' | 'DELETE';
38
49
  /** Azure Functions のパス (例: '/api/todo', '/api/todo/123') */
39
50
  path: string;
40
51
  /** リクエストボディ (POST/PUT 用) */
41
- body?: any;
52
+ body?: unknown;
42
53
  /** 入力バリデーション用 Zod スキーマ (省略時はバリデーションなし) */
43
54
  inputSchema?: z.ZodSchema<TInput>;
44
55
  /** 出力バリデーション用 Zod スキーマ (省略時はそのまま返す) */
@@ -47,7 +58,7 @@ interface CallFunctionConfig<TInput = any, TOutput = any> {
47
58
  successStatus?: number;
48
59
  }
49
60
 
50
- export async function callFunction<TInput = any, TOutput = any>(
61
+ export async function callFunction<TInput = unknown, TOutput = unknown>(
51
62
  config: CallFunctionConfig<TInput, TOutput>
52
63
  ): Promise<NextResponse> {
53
64
  const { method, path, body, inputSchema, responseSchema, successStatus = 200 } = config;
@@ -70,11 +81,12 @@ export async function callFunction<TInput = any, TOutput = any>(
70
81
  // Azure Functions を呼び出し
71
82
  const functionsBaseUrl = getFunctionsBaseUrl();
72
83
  const url = functionsBaseUrl + path;
84
+ const keyHeaders = getFunctionsKeyHeaders(functionsBaseUrl);
73
85
  console.log(\`[BFF] \${method} \${url}\`);
74
86
 
75
87
  const response = await fetch(url, {
76
88
  method,
77
- headers: { 'Content-Type': 'application/json' },
89
+ headers: { 'Content-Type': 'application/json', ...keyHeaders },
78
90
  body: validatedBody !== undefined ? JSON.stringify(validatedBody) : undefined,
79
91
  });
80
92
 
@@ -109,10 +121,10 @@ export async function callFunction<TInput = any, TOutput = any>(
109
121
  }
110
122
 
111
123
  return NextResponse.json(data, { status: successStatus });
112
- } catch (error: any) {
124
+ } catch (error) {
113
125
  console.error(\`[BFF] Error:\`, error);
114
126
  return NextResponse.json(
115
- { error: error.message || 'Internal server error' },
127
+ { error: error instanceof Error ? error.message : 'Internal server error' },
116
128
  { status: 500 }
117
129
  );
118
130
  }
@@ -129,7 +141,6 @@ export function generateCompactBFFRoutes(model: ModelInfo, sharedPackageName: st
129
141
  } {
130
142
  const modelName = model.name;
131
143
  const modelCamel = toCamelCase(modelName);
132
- const modelKebab = toKebabCase(modelName);
133
144
  const schemaName = model.schemaName;
134
145
 
135
146
  const listRoute = `import { NextRequest } from 'next/server';
@@ -215,3 +226,157 @@ export async function DELETE(
215
226
  detailRoute,
216
227
  };
217
228
  }
229
+
230
+ /**
231
+ * コネクタ用 BFF ルートファイルを生成(操作制限に対応)
232
+ * 指定された operations のみハンドラーを生成する
233
+ */
234
+ export function generateConnectorBFFRoutes(
235
+ model: ModelInfo,
236
+ sharedPackageName: string,
237
+ operations: readonly string[]
238
+ ): {
239
+ listRoute: string;
240
+ detailRoute: string;
241
+ } {
242
+ const modelName = model.name;
243
+ const modelCamel = toCamelCase(modelName);
244
+ const schemaName = model.schemaName;
245
+ const ops = new Set(operations);
246
+
247
+ const hasGetAll = ops.has("getAll");
248
+ const hasCreate = ops.has("create");
249
+ const hasGetById = ops.has("getById");
250
+ const hasUpdate = ops.has("update");
251
+ const hasDelete = ops.has("delete");
252
+
253
+ // --- List route ---
254
+ let listImports = `import { callFunction } from '@/lib/api/call-function';
255
+ import { ${schemaName} } from '${sharedPackageName}';
256
+ import { z } from 'zod/v4';`;
257
+
258
+ if (hasCreate) {
259
+ listImports = `import { NextRequest } from 'next/server';
260
+ ${listImports}
261
+
262
+ const InputSchema = ${schemaName}.omit({ id: true, createdAt: true, updatedAt: true });`;
263
+ }
264
+
265
+ let listHandlers = "";
266
+ if (hasGetAll) {
267
+ listHandlers += `
268
+ // GET /api/${modelCamel} - 一覧取得
269
+ export async function GET() {
270
+ return callFunction({
271
+ method: 'GET',
272
+ path: '/api/${modelCamel}',
273
+ responseSchema: z.array(${schemaName}),
274
+ });
275
+ }
276
+ `;
277
+ }
278
+
279
+ if (hasCreate) {
280
+ listHandlers += `
281
+ // POST /api/${modelCamel} - 新規作成
282
+ export async function POST(request: NextRequest) {
283
+ const body = await request.json();
284
+ return callFunction({
285
+ method: 'POST',
286
+ path: '/api/${modelCamel}',
287
+ body,
288
+ inputSchema: InputSchema,
289
+ responseSchema: ${schemaName},
290
+ successStatus: 201,
291
+ });
292
+ }
293
+ `;
294
+ }
295
+
296
+ const listRoute = `${listImports}
297
+ ${listHandlers}`;
298
+
299
+ // --- Detail route ---
300
+ const needDetailImport = hasGetById || hasUpdate || hasDelete;
301
+ let detailImports = "";
302
+ let detailHandlers = "";
303
+
304
+ if (needDetailImport) {
305
+ const needNextRequest = hasUpdate;
306
+ detailImports = needNextRequest
307
+ ? `import { NextRequest } from 'next/server';
308
+ import { callFunction } from '@/lib/api/call-function';
309
+ import { ${schemaName} } from '${sharedPackageName}';`
310
+ : `import { NextRequest } from 'next/server';
311
+ import { callFunction } from '@/lib/api/call-function';
312
+ import { ${schemaName} } from '${sharedPackageName}';`;
313
+
314
+ if (hasUpdate) {
315
+ detailImports += `\n\nconst InputSchema = ${schemaName}.omit({ id: true, createdAt: true, updatedAt: true });`;
316
+ }
317
+
318
+ if (hasGetById) {
319
+ detailHandlers += `
320
+ // GET /api/${modelCamel}/{id} - 詳細取得
321
+ export async function GET(
322
+ _request: NextRequest,
323
+ { params }: { params: Promise<{ id: string }> }
324
+ ) {
325
+ const { id } = await params;
326
+ return callFunction({
327
+ method: 'GET',
328
+ path: \`/api/${modelCamel}/\${id}\`,
329
+ responseSchema: ${schemaName},
330
+ });
331
+ }
332
+ `;
333
+ }
334
+
335
+ if (hasUpdate) {
336
+ detailHandlers += `
337
+ // PUT /api/${modelCamel}/{id} - 更新
338
+ export async function PUT(
339
+ request: NextRequest,
340
+ { params }: { params: Promise<{ id: string }> }
341
+ ) {
342
+ const { id } = await params;
343
+ const body = await request.json();
344
+ return callFunction({
345
+ method: 'PUT',
346
+ path: \`/api/${modelCamel}/\${id}\`,
347
+ body,
348
+ inputSchema: InputSchema,
349
+ responseSchema: ${schemaName},
350
+ });
351
+ }
352
+ `;
353
+ }
354
+
355
+ if (hasDelete) {
356
+ detailHandlers += `
357
+ // DELETE /api/${modelCamel}/{id} - 削除
358
+ export async function DELETE(
359
+ _request: NextRequest,
360
+ { params }: { params: Promise<{ id: string }> }
361
+ ) {
362
+ const { id } = await params;
363
+ return callFunction({
364
+ method: 'DELETE',
365
+ path: \`/api/${modelCamel}/\${id}\`,
366
+ });
367
+ }
368
+ `;
369
+ }
370
+ }
371
+
372
+ const detailRoute = needDetailImport
373
+ ? `${detailImports}
374
+ ${detailHandlers}`
375
+ : `// No detail operations defined for this connector model
376
+ `;
377
+
378
+ return {
379
+ listRoute,
380
+ detailRoute,
381
+ };
382
+ }