swallowkit 1.0.0-beta.12 → 1.0.0-beta.13
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.
- package/README.ja.md +33 -9
- package/README.md +33 -9
- package/dist/__tests__/fixtures.d.ts +8 -0
- package/dist/__tests__/fixtures.d.ts.map +1 -1
- package/dist/__tests__/fixtures.js +60 -0
- package/dist/__tests__/fixtures.js.map +1 -1
- package/dist/cli/commands/add-connector.d.ts +20 -0
- package/dist/cli/commands/add-connector.d.ts.map +1 -0
- package/dist/cli/commands/add-connector.js +161 -0
- package/dist/cli/commands/add-connector.js.map +1 -0
- package/dist/cli/commands/create-model.d.ts +1 -0
- package/dist/cli/commands/create-model.d.ts.map +1 -1
- package/dist/cli/commands/create-model.js +65 -1
- package/dist/cli/commands/create-model.js.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +49 -3
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/scaffold.d.ts.map +1 -1
- package/dist/cli/commands/scaffold.js +97 -6
- package/dist/cli/commands/scaffold.js.map +1 -1
- package/dist/cli/index.js +15 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/config.d.ts +3 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +37 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/mock/connector-mock-server.d.ts +67 -0
- package/dist/core/mock/connector-mock-server.d.ts.map +1 -0
- package/dist/core/mock/connector-mock-server.js +285 -0
- package/dist/core/mock/connector-mock-server.js.map +1 -0
- package/dist/core/mock/zod-mock-generator.d.ts +14 -0
- package/dist/core/mock/zod-mock-generator.d.ts.map +1 -0
- package/dist/core/mock/zod-mock-generator.js +163 -0
- package/dist/core/mock/zod-mock-generator.js.map +1 -0
- package/dist/core/scaffold/connector-functions-generator.d.ts +41 -0
- package/dist/core/scaffold/connector-functions-generator.d.ts.map +1 -0
- package/dist/core/scaffold/connector-functions-generator.js +1009 -0
- package/dist/core/scaffold/connector-functions-generator.js.map +1 -0
- package/dist/core/scaffold/model-parser.d.ts +6 -0
- package/dist/core/scaffold/model-parser.d.ts.map +1 -1
- package/dist/core/scaffold/model-parser.js +94 -0
- package/dist/core/scaffold/model-parser.js.map +1 -1
- package/dist/core/scaffold/nextjs-generator.d.ts +8 -0
- package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
- package/dist/core/scaffold/nextjs-generator.js +133 -0
- package/dist/core/scaffold/nextjs-generator.js.map +1 -1
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/config.test.ts +141 -0
- package/src/__tests__/connector-functions-generator.test.ts +288 -0
- package/src/__tests__/connector-mock-server.test.ts +252 -0
- package/src/__tests__/connector-model-bff.test.ts +162 -0
- package/src/__tests__/fixtures.ts +60 -0
- package/src/__tests__/zod-mock-generator.test.ts +132 -0
- package/src/cli/commands/add-connector.ts +157 -0
- package/src/cli/commands/create-model.ts +72 -2
- package/src/cli/commands/dev.ts +55 -4
- package/src/cli/commands/scaffold.ts +176 -10
- package/src/cli/index.ts +16 -0
- package/src/core/config.ts +42 -1
- package/src/core/mock/connector-mock-server.ts +307 -0
- package/src/core/mock/zod-mock-generator.ts +205 -0
- package/src/core/scaffold/connector-functions-generator.ts +1106 -0
- package/src/core/scaffold/model-parser.ts +103 -0
- package/src/core/scaffold/nextjs-generator.ts +154 -0
- package/src/types/index.ts +47 -0
package/README.ja.md
CHANGED
|
@@ -28,6 +28,7 @@ Zod スキーマから自動的に CRUD 操作を生成する Scaffold 機能を
|
|
|
28
28
|
- **☁️ Azure 最適化** - Static Web Apps + Functions + Cosmos DB で最小コスト構成
|
|
29
29
|
- **🚀 簡単デプロイ** - Bicep IaC + CI/CD ワークフローを自動生成
|
|
30
30
|
- **🤖 AI フレンドリー** - 自動生成される指示ファイル(`AGENTS.md`、`CLAUDE.md`、`.github/copilot-instructions.md`)とレイヤー別ルールにより、GitHub Copilot・Claude Code・OpenAI Codex がプロジェクト規約に従ってコードを生成
|
|
31
|
+
- **🔌 外部データコネクタ** - MySQL・PostgreSQL・REST API などの外部データソースを Cosmos DB と並行して統合。同じ Zod 駆動の scaffold ワークフローで完全な型安全性を維持
|
|
31
32
|
- **🧩 [VS Code 拡張機能](https://marketplace.visualstudio.com/items?itemName=himanago.swallowkit-vscode)** - init/scaffold/dev の GUI ウィザード、モデルファイル右クリックでスキャフォールド、開発サーバーステータスバー、TypeScript スニペット
|
|
32
33
|
|
|
33
34
|
|
|
@@ -37,6 +38,7 @@ Zod スキーマから自動的に CRUD 操作を生成する Scaffold 機能を
|
|
|
37
38
|
|
|
38
39
|
- **[CLI リファレンス](https://himanago.github.io/swallowkit/ja/cli-reference)** - 全コマンドの詳細
|
|
39
40
|
- **[Scaffold ガイド](https://himanago.github.io/swallowkit/ja/scaffold-guide)** - CRUD コード生成
|
|
41
|
+
- **[Connector ガイド](https://himanago.github.io/swallowkit/ja/connector-guide)** - 外部データソース統合
|
|
40
42
|
- **[Zod スキーマ共有ガイド](https://himanago.github.io/swallowkit/ja/zod-schema-sharing-guide)** - スキーマ設計
|
|
41
43
|
- **[デプロイガイド](https://himanago.github.io/swallowkit/ja/deployment-guide)** - Azure へのデプロイ
|
|
42
44
|
|
|
@@ -162,6 +164,27 @@ const updated = await api.put<Todo>('/api/todos/123', { completed: true });
|
|
|
162
164
|
await api.delete('/api/todos/123');
|
|
163
165
|
```
|
|
164
166
|
|
|
167
|
+
### 6. 外部データソースの統合(オプション)
|
|
168
|
+
|
|
169
|
+
SwallowKit は **コネクタ** により、Cosmos DB と併用して外部 RDB データベースや REST API を統合できます。同じ Zod 駆動のワークフローをそのまま使えます:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# コネクタを登録
|
|
173
|
+
npx swallowkit add-connector mysql --type rdb --provider mysql --connection-env MYSQL_CONNECTION_STRING
|
|
174
|
+
|
|
175
|
+
# コネクタ対応モデルを作成
|
|
176
|
+
npx swallowkit create-model user --connector mysql
|
|
177
|
+
# shared/models/user.ts を編集(スキーマ + connectorConfig をカスタマイズ)
|
|
178
|
+
|
|
179
|
+
# scaffold がコネクタ固有の Functions コードを生成
|
|
180
|
+
npx swallowkit scaffold shared/models/user.ts
|
|
181
|
+
|
|
182
|
+
# 実際の MySQL がなくてもモックデータでローカル開発
|
|
183
|
+
npx swallowkit dev --mock-connectors
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
フロントエンドと BFF レイヤーはデータソースの違いを意識しません — `callFunction()` は Cosmos DB モデルでもコネクタモデルでも同一です。詳しくは **[Connector ガイド](https://himanago.github.io/swallowkit/ja/connector-guide)** を参照してください。
|
|
187
|
+
|
|
165
188
|
## 🏗️ アーキテクチャ
|
|
166
189
|
|
|
167
190
|
```
|
|
@@ -184,21 +207,22 @@ await api.delete('/api/todos/123');
|
|
|
184
207
|
│ - HTTP Triggers (CRUD) │
|
|
185
208
|
│ - Zod Validation (Re-check) │
|
|
186
209
|
│ - Business Logic │
|
|
187
|
-
│ -
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
│ Azure Cosmos
|
|
193
|
-
│
|
|
194
|
-
│
|
|
195
|
-
|
|
210
|
+
│ - Data Source Bindings │
|
|
211
|
+
└──────────┬───────────────┼───────────────┬──────────────────┘
|
|
212
|
+
│ │ │
|
|
213
|
+
▼ ▼ ▼
|
|
214
|
+
┌────────────────┐ ┌──────────────┐ ┌──────────────────┐
|
|
215
|
+
│ Azure Cosmos │ │ 外部 RDB │ │ 外部 SaaS API │
|
|
216
|
+
│ DB (既定) │ │ (MySQL, │ │ (REST) │
|
|
217
|
+
│ │ │ PostgreSQL) │ │ │
|
|
218
|
+
└────────────────┘ └──────────────┘ └──────────────────┘
|
|
196
219
|
```
|
|
197
220
|
|
|
198
221
|
**重要なパターン:**
|
|
199
222
|
- **BFF (Backend For Frontend)**: Next.js API Routes が Azure Functions へのプロキシ
|
|
200
223
|
- **共有スキーマ**: `shared/models/` の Zod スキーマを唯一のソースとして扱う
|
|
201
224
|
- **C#/Python 向け OpenAPI ブリッジ**: TypeScript 以外の Functions は `functions/generated/` の生成資産を利用
|
|
225
|
+
- **外部コネクタ**: MySQL・PostgreSQL・REST API — scaffold 生成の Functions で同じ BFF パターンを維持
|
|
202
226
|
- **契約安全性**: 共有 Zod または生成モデルで BFF とバックエンドの整合を保つ
|
|
203
227
|
- **マネージド ID**: サービス間の安全な接続(接続文字列不要)
|
|
204
228
|
|
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ Featuring Scaffold functionality to automatically generate CRUD operations from
|
|
|
30
30
|
- **☁️ Azure Optimized** - Minimal-cost architecture with Static Web Apps + Functions + Cosmos DB
|
|
31
31
|
- **🚀 Easy Deployment** - Auto-generated Bicep IaC + CI/CD workflows
|
|
32
32
|
- **🤖 AI-Friendly** - Auto-generated instruction files (`AGENTS.md`, `CLAUDE.md`, `.github/copilot-instructions.md`) and layer-specific rules help GitHub Copilot, Claude Code, and OpenAI Codex follow project conventions
|
|
33
|
+
- **🔌 External Data Connectors** - Integrate MySQL, PostgreSQL, REST APIs, and other external data sources alongside Cosmos DB — same Zod-driven scaffold workflow with full type safety
|
|
33
34
|
- **🧩 [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=himanago.swallowkit-vscode)** - GUI wizard for init/scaffold/dev, right-click model scaffolding, dev server status bar, and TypeScript snippets
|
|
34
35
|
|
|
35
36
|
## 📚 Documentation
|
|
@@ -38,6 +39,7 @@ Visit the **[SwallowKit Documentation](https://himanago.github.io/swallowkit/)**
|
|
|
38
39
|
|
|
39
40
|
- **[CLI Reference](https://himanago.github.io/swallowkit/en/cli-reference)** - All commands in detail
|
|
40
41
|
- **[Scaffold Guide](https://himanago.github.io/swallowkit/en/scaffold-guide)** - CRUD code generation
|
|
42
|
+
- **[Connector Guide](https://himanago.github.io/swallowkit/en/connector-guide)** - External data source integration
|
|
41
43
|
- **[Zod Schema Sharing Guide](https://himanago.github.io/swallowkit/en/zod-schema-sharing-guide)** - Schema design
|
|
42
44
|
- **[Deployment Guide](https://himanago.github.io/swallowkit/en/deployment-guide)** - Deploy to Azure
|
|
43
45
|
|
|
@@ -219,6 +221,27 @@ const updated = await api.put<Todo>('/api/todos/123', { completed: true });
|
|
|
219
221
|
await api.delete('/api/todos/123');
|
|
220
222
|
```
|
|
221
223
|
|
|
224
|
+
### 6. Connect External Data Sources (Optional)
|
|
225
|
+
|
|
226
|
+
SwallowKit supports **connectors** for integrating external RDB databases and REST APIs alongside Cosmos DB, using the same Zod-driven workflow:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Register a connector
|
|
230
|
+
npx swallowkit add-connector mysql --type rdb --provider mysql --connection-env MYSQL_CONNECTION_STRING
|
|
231
|
+
|
|
232
|
+
# Create a connector-aware model
|
|
233
|
+
npx swallowkit create-model user --connector mysql
|
|
234
|
+
# edit shared/models/user.ts (customize schema + connectorConfig)
|
|
235
|
+
|
|
236
|
+
# Scaffold generates connector-specific Functions code
|
|
237
|
+
npx swallowkit scaffold shared/models/user.ts
|
|
238
|
+
|
|
239
|
+
# Develop locally with mock data (no real MySQL needed)
|
|
240
|
+
npx swallowkit dev --mock-connectors
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
The frontend and BFF layer are completely transparent to data source differences — `callFunction()` works identically for Cosmos DB and connector models. See the **[Connector Guide](https://himanago.github.io/swallowkit/en/connector-guide)** for details.
|
|
244
|
+
|
|
222
245
|
## 🏗️ Architecture
|
|
223
246
|
|
|
224
247
|
```
|
|
@@ -241,21 +264,22 @@ await api.delete('/api/todos/123');
|
|
|
241
264
|
│ - HTTP Triggers (CRUD) │
|
|
242
265
|
│ - Zod Validation (Re-check) │
|
|
243
266
|
│ - Business Logic │
|
|
244
|
-
│ -
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
│ Azure Cosmos
|
|
250
|
-
│
|
|
251
|
-
│
|
|
252
|
-
|
|
267
|
+
│ - Data Source Bindings │
|
|
268
|
+
└──────────┬───────────────┼───────────────┬──────────────────┘
|
|
269
|
+
│ │ │
|
|
270
|
+
▼ ▼ ▼
|
|
271
|
+
┌────────────────┐ ┌──────────────┐ ┌──────────────────┐
|
|
272
|
+
│ Azure Cosmos │ │ External │ │ External SaaS │
|
|
273
|
+
│ DB (Default) │ │ RDB (MySQL │ │ APIs (REST) │
|
|
274
|
+
│ │ │ PostgreSQL) │ │ │
|
|
275
|
+
└────────────────┘ └──────────────┘ └──────────────────┘
|
|
253
276
|
```
|
|
254
277
|
|
|
255
278
|
**Key Patterns:**
|
|
256
279
|
- **BFF (Backend For Frontend)**: Next.js API Routes proxy to Azure Functions
|
|
257
280
|
- **Shared Schemas**: Zod schemas stay in `shared/models/` as the source of truth
|
|
258
281
|
- **OpenAPI Bridge for C#/Python**: Non-TypeScript Functions consume generated assets under `functions/generated/`
|
|
282
|
+
- **External Connectors**: MySQL, PostgreSQL, REST APIs — scaffold-generated Functions with the same BFF pattern
|
|
259
283
|
- **Contract Safety**: BFF and backend stay aligned through shared Zod or generated backend models
|
|
260
284
|
- **Managed Identity**: Secure service connections (no connection strings)
|
|
261
285
|
|
|
@@ -3,6 +3,14 @@ import { ModelInfo } from "../core/scaffold/model-parser";
|
|
|
3
3
|
* テスト用の基本的な ModelInfo フィクスチャ
|
|
4
4
|
*/
|
|
5
5
|
export declare function createBasicModelInfo(overrides?: Partial<ModelInfo>): ModelInfo;
|
|
6
|
+
/**
|
|
7
|
+
* RDB コネクタ (read-only) 付きの ModelInfo フィクスチャ
|
|
8
|
+
*/
|
|
9
|
+
export declare function createRdbConnectorModelInfo(overrides?: Partial<ModelInfo>): ModelInfo;
|
|
10
|
+
/**
|
|
11
|
+
* API コネクタ (read-write) 付きの ModelInfo フィクスチャ
|
|
12
|
+
*/
|
|
13
|
+
export declare function createApiConnectorModelInfo(overrides?: Partial<ModelInfo>): ModelInfo;
|
|
6
14
|
/**
|
|
7
15
|
* 外部キーを含む ModelInfo フィクスチャ
|
|
8
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/__tests__/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAoB9E;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,SAAS,CAqBzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,SAAS,CA0BnD"}
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/__tests__/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAoB9E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAuBrF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CA2BrF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,SAAS,CAqBzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,SAAS,CA0BnD"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createBasicModelInfo = createBasicModelInfo;
|
|
4
|
+
exports.createRdbConnectorModelInfo = createRdbConnectorModelInfo;
|
|
5
|
+
exports.createApiConnectorModelInfo = createApiConnectorModelInfo;
|
|
4
6
|
exports.createModelInfoWithForeignKey = createModelInfoWithForeignKey;
|
|
5
7
|
exports.createModelInfoWithEnum = createModelInfoWithEnum;
|
|
6
8
|
/**
|
|
@@ -27,6 +29,64 @@ function createBasicModelInfo(overrides) {
|
|
|
27
29
|
...overrides,
|
|
28
30
|
};
|
|
29
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* RDB コネクタ (read-only) 付きの ModelInfo フィクスチャ
|
|
34
|
+
*/
|
|
35
|
+
function createRdbConnectorModelInfo(overrides) {
|
|
36
|
+
return createBasicModelInfo({
|
|
37
|
+
name: "User",
|
|
38
|
+
displayName: "User",
|
|
39
|
+
schemaName: "userSchema",
|
|
40
|
+
filePath: "/models/user.ts",
|
|
41
|
+
fields: [
|
|
42
|
+
{ name: "id", type: "string", isOptional: false, isArray: false },
|
|
43
|
+
{ name: "employeeCode", type: "string", isOptional: false, isArray: false },
|
|
44
|
+
{ name: "name", type: "string", isOptional: false, isArray: false },
|
|
45
|
+
{ name: "email", type: "string", isOptional: false, isArray: false },
|
|
46
|
+
{ name: "department", type: "string", isOptional: true, isArray: false },
|
|
47
|
+
{ name: "createdAt", type: "string", isOptional: true, isArray: false },
|
|
48
|
+
{ name: "updatedAt", type: "string", isOptional: true, isArray: false },
|
|
49
|
+
],
|
|
50
|
+
connectorConfig: {
|
|
51
|
+
connector: "mysql",
|
|
52
|
+
operations: ["getAll", "getById"],
|
|
53
|
+
table: "users",
|
|
54
|
+
idColumn: "id",
|
|
55
|
+
},
|
|
56
|
+
...overrides,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* API コネクタ (read-write) 付きの ModelInfo フィクスチャ
|
|
61
|
+
*/
|
|
62
|
+
function createApiConnectorModelInfo(overrides) {
|
|
63
|
+
return createBasicModelInfo({
|
|
64
|
+
name: "BacklogIssue",
|
|
65
|
+
displayName: "BacklogIssue",
|
|
66
|
+
schemaName: "backlogIssueSchema",
|
|
67
|
+
filePath: "/models/backlog-issue.ts",
|
|
68
|
+
fields: [
|
|
69
|
+
{ name: "id", type: "string", isOptional: false, isArray: false },
|
|
70
|
+
{ name: "projectId", type: "string", isOptional: false, isArray: false },
|
|
71
|
+
{ name: "issueKey", type: "string", isOptional: false, isArray: false },
|
|
72
|
+
{ name: "summary", type: "string", isOptional: false, isArray: false },
|
|
73
|
+
{ name: "description", type: "string", isOptional: true, isArray: false },
|
|
74
|
+
{ name: "createdAt", type: "string", isOptional: true, isArray: false },
|
|
75
|
+
{ name: "updatedAt", type: "string", isOptional: true, isArray: false },
|
|
76
|
+
],
|
|
77
|
+
connectorConfig: {
|
|
78
|
+
connector: "backlog",
|
|
79
|
+
operations: ["getAll", "getById", "create", "update"],
|
|
80
|
+
endpoints: {
|
|
81
|
+
getAll: "GET /issues",
|
|
82
|
+
getById: "GET /issues/{id}",
|
|
83
|
+
create: "POST /issues",
|
|
84
|
+
update: "PATCH /issues/{id}",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
...overrides,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
30
90
|
/**
|
|
31
91
|
* 外部キーを含む ModelInfo フィクスチャ
|
|
32
92
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/__tests__/fixtures.ts"],"names":[],"mappings":";;AAKA,oDAoBC;AAKD,sEAqBC;AAKD,0DA0BC;
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/__tests__/fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SwallowKit Add-Connector コマンド
|
|
3
|
+
* swallowkit.config.js にコネクタ設定を追加する
|
|
4
|
+
*/
|
|
5
|
+
import { ConnectorDefinition } from "../../types";
|
|
6
|
+
interface AddConnectorOptions {
|
|
7
|
+
name: string;
|
|
8
|
+
type: "rdb" | "api";
|
|
9
|
+
provider?: "mysql" | "postgres" | "sqlserver";
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* add-connector コマンド
|
|
13
|
+
*/
|
|
14
|
+
export declare function addConnectorCommand(options: AddConnectorOptions): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* swallowkit.config.js にコネクタ設定を追加
|
|
17
|
+
*/
|
|
18
|
+
export declare function updateConfigWithConnector(configPath: string, connectorName: string, connectorDef: ConnectorDefinition, options: AddConnectorOptions): void;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=add-connector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-connector.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add-connector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,iBAsBrE;AAoCD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,mBAAmB,GAC3B,IAAI,CAwCN"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SwallowKit Add-Connector コマンド
|
|
4
|
+
* swallowkit.config.js にコネクタ設定を追加する
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.addConnectorCommand = addConnectorCommand;
|
|
41
|
+
exports.updateConfigWithConnector = updateConfigWithConnector;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const config_1 = require("../../core/config");
|
|
45
|
+
/**
|
|
46
|
+
* add-connector コマンド
|
|
47
|
+
*/
|
|
48
|
+
async function addConnectorCommand(options) {
|
|
49
|
+
(0, config_1.ensureSwallowKitProject)("add-connector");
|
|
50
|
+
console.log(`🔌 SwallowKit Add-Connector: Adding '${options.name}' connector...\n`);
|
|
51
|
+
const configPath = findConfigFile();
|
|
52
|
+
if (!configPath) {
|
|
53
|
+
console.error("❌ swallowkit.config.js not found. Run 'swallowkit init' first.");
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
// Build connector definition
|
|
57
|
+
const connectorDef = buildConnectorDefinition(options);
|
|
58
|
+
// Update config file
|
|
59
|
+
updateConfigWithConnector(configPath, options.name, connectorDef, options);
|
|
60
|
+
console.log(`\n✅ Connector '${options.name}' added successfully!`);
|
|
61
|
+
console.log("\n📝 Next steps:");
|
|
62
|
+
console.log(` 1. Review the connector settings in ${configPath}`);
|
|
63
|
+
console.log(` 2. Set the required environment variables in functions/local.settings.json`);
|
|
64
|
+
console.log(` 3. Create models with: npx swallowkit create-model <name> --connector=${options.name}`);
|
|
65
|
+
}
|
|
66
|
+
function findConfigFile() {
|
|
67
|
+
const candidates = ["swallowkit.config.js", "swallowkit.config.json", ".swallowkitrc.json"];
|
|
68
|
+
for (const candidate of candidates) {
|
|
69
|
+
const fullPath = path.resolve(process.cwd(), candidate);
|
|
70
|
+
if (fs.existsSync(fullPath)) {
|
|
71
|
+
return fullPath;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function buildConnectorDefinition(options) {
|
|
77
|
+
const name = options.name.toUpperCase().replace(/[^A-Z0-9]/g, "_");
|
|
78
|
+
if (options.type === "rdb") {
|
|
79
|
+
return {
|
|
80
|
+
type: "rdb",
|
|
81
|
+
provider: options.provider || "mysql",
|
|
82
|
+
connectionEnvVar: `${name}_CONNECTION_STRING`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
type: "api",
|
|
87
|
+
baseUrlEnvVar: `${name}_API_BASE_URL`,
|
|
88
|
+
auth: {
|
|
89
|
+
type: "apiKey",
|
|
90
|
+
envVar: `${name}_API_KEY`,
|
|
91
|
+
placement: "query",
|
|
92
|
+
paramName: "apiKey",
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* swallowkit.config.js にコネクタ設定を追加
|
|
98
|
+
*/
|
|
99
|
+
function updateConfigWithConnector(configPath, connectorName, connectorDef, options) {
|
|
100
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
101
|
+
if (configPath.endsWith(".json")) {
|
|
102
|
+
// JSON config
|
|
103
|
+
const config = JSON.parse(content);
|
|
104
|
+
if (!config.connectors) {
|
|
105
|
+
config.connectors = {};
|
|
106
|
+
}
|
|
107
|
+
config.connectors[connectorName] = connectorDef;
|
|
108
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
109
|
+
console.log(`✅ Updated: ${configPath}`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// JS config — append connectors section
|
|
113
|
+
if (content.includes("connectors:") || content.includes("connectors :")) {
|
|
114
|
+
console.log(`⚠️ 'connectors' section already exists in ${configPath}. Please add the connector manually:`);
|
|
115
|
+
console.log(formatConnectorSnippet(connectorName, connectorDef, options));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Find the last property before the closing of module.exports
|
|
119
|
+
const closingBraceIdx = content.lastIndexOf("}");
|
|
120
|
+
if (closingBraceIdx === -1) {
|
|
121
|
+
console.error("❌ Could not parse config file structure. Please add the connector manually:");
|
|
122
|
+
console.log(formatConnectorSnippet(connectorName, connectorDef, options));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Check if we need a comma before inserting
|
|
126
|
+
const beforeClosing = content.substring(0, closingBraceIdx).trimEnd();
|
|
127
|
+
const needsComma = !beforeClosing.endsWith(",") && !beforeClosing.endsWith("{");
|
|
128
|
+
const connectorBlock = generateConnectorJSBlock(connectorName, connectorDef, options);
|
|
129
|
+
const insertion = `${needsComma ? "," : ""}\n // コネクタ定義\n connectors: {\n${connectorBlock}\n },\n`;
|
|
130
|
+
const newContent = content.substring(0, closingBraceIdx) + insertion + content.substring(closingBraceIdx);
|
|
131
|
+
fs.writeFileSync(configPath, newContent, "utf-8");
|
|
132
|
+
console.log(`✅ Updated: ${configPath}`);
|
|
133
|
+
}
|
|
134
|
+
function generateConnectorJSBlock(name, def, options) {
|
|
135
|
+
if (def.type === "rdb") {
|
|
136
|
+
return ` ${name}: {
|
|
137
|
+
type: 'rdb',
|
|
138
|
+
provider: '${def.provider}',
|
|
139
|
+
connectionEnvVar: '${def.connectionEnvVar}',
|
|
140
|
+
},`;
|
|
141
|
+
}
|
|
142
|
+
const apiDef = def;
|
|
143
|
+
let authBlock = "";
|
|
144
|
+
if (apiDef.auth) {
|
|
145
|
+
authBlock = `
|
|
146
|
+
auth: {
|
|
147
|
+
type: '${apiDef.auth.type}',
|
|
148
|
+
envVar: '${apiDef.auth.envVar}',
|
|
149
|
+
placement: '${apiDef.auth.placement || "query"}',
|
|
150
|
+
paramName: '${apiDef.auth.paramName || "apiKey"}',
|
|
151
|
+
},`;
|
|
152
|
+
}
|
|
153
|
+
return ` ${name}: {
|
|
154
|
+
type: 'api',
|
|
155
|
+
baseUrlEnvVar: '${apiDef.baseUrlEnvVar}',${authBlock}
|
|
156
|
+
},`;
|
|
157
|
+
}
|
|
158
|
+
function formatConnectorSnippet(name, def, options) {
|
|
159
|
+
return `\n ${name}: ${JSON.stringify(def, null, 4)}\n`;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=add-connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-connector.js","sourceRoot":"","sources":["../../../src/cli/commands/add-connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-model.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create-model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"create-model.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create-model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8FD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,iBA4EnE"}
|
|
@@ -65,6 +65,54 @@ export type ${pascalName} = z.infer<typeof ${pascalName}>;
|
|
|
65
65
|
export const displayName = '${pascalName}';
|
|
66
66
|
`;
|
|
67
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* コネクタ付きモデルテンプレートを生成
|
|
70
|
+
*/
|
|
71
|
+
function generateConnectorModelTemplate(modelName, connectorName, connectorType) {
|
|
72
|
+
const pascalName = (0, model_parser_1.toPascalCase)(modelName);
|
|
73
|
+
const kebabName = modelName.toLowerCase().replace(/[^a-z0-9]+/g, '-');
|
|
74
|
+
const pluralName = kebabName + 's';
|
|
75
|
+
const schema = `import { z } from 'zod/v4';
|
|
76
|
+
|
|
77
|
+
// ${pascalName} model (Zod official pattern: same name for value and type)
|
|
78
|
+
export const ${pascalName} = z.object({
|
|
79
|
+
id: z.string(),
|
|
80
|
+
name: z.string().min(1),
|
|
81
|
+
createdAt: z.string().optional(),
|
|
82
|
+
updatedAt: z.string().optional(),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export type ${pascalName} = z.infer<typeof ${pascalName}>;
|
|
86
|
+
|
|
87
|
+
// Display name for UI
|
|
88
|
+
export const displayName = '${pascalName}';
|
|
89
|
+
`;
|
|
90
|
+
if (connectorType === 'rdb') {
|
|
91
|
+
return schema + `
|
|
92
|
+
// SwallowKit Connector Metadata
|
|
93
|
+
export const connectorConfig = {
|
|
94
|
+
connector: '${connectorName}',
|
|
95
|
+
operations: ['getAll', 'getById'] as const,
|
|
96
|
+
table: '${pluralName}',
|
|
97
|
+
idColumn: 'id',
|
|
98
|
+
};
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
// API connector
|
|
102
|
+
return schema + `
|
|
103
|
+
// SwallowKit Connector Metadata
|
|
104
|
+
export const connectorConfig = {
|
|
105
|
+
connector: '${connectorName}',
|
|
106
|
+
operations: ['getAll', 'getById', 'create', 'update'] as const,
|
|
107
|
+
endpoints: {
|
|
108
|
+
getAll: 'GET /${pluralName}',
|
|
109
|
+
getById: 'GET /${pluralName}/{id}',
|
|
110
|
+
create: 'POST /${pluralName}',
|
|
111
|
+
update: 'PATCH /${pluralName}/{id}',
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
68
116
|
/**
|
|
69
117
|
* ユーザーに確認を求める
|
|
70
118
|
*/
|
|
@@ -87,6 +135,20 @@ async function createModelCommand(options) {
|
|
|
87
135
|
// SwallowKit プロジェクトディレクトリかどうかを検証
|
|
88
136
|
(0, config_1.ensureSwallowKitProject)("create-model");
|
|
89
137
|
console.log("🏗️ SwallowKit Create-Model: Generating model templates...\n");
|
|
138
|
+
// コネクタ指定時はコネクタの存在を検証
|
|
139
|
+
let connectorType;
|
|
140
|
+
if (options.connector) {
|
|
141
|
+
const config = (0, config_1.loadConfig)();
|
|
142
|
+
const connectorDef = config.connectors?.[options.connector];
|
|
143
|
+
if (!connectorDef) {
|
|
144
|
+
console.error(`❌ Connector '${options.connector}' not found in swallowkit.config.js.`);
|
|
145
|
+
console.error(` Available connectors: ${Object.keys(config.connectors || {}).join(', ') || '(none)'}`);
|
|
146
|
+
console.error(` Run 'swallowkit add-connector ${options.connector} --type=<rdb|api>' first.`);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
connectorType = connectorDef.type;
|
|
150
|
+
console.log(`🔌 Using connector: ${options.connector} (${connectorType})\n`);
|
|
151
|
+
}
|
|
90
152
|
const modelsDir = options.modelsDir || "shared/models";
|
|
91
153
|
// shared/models ディレクトリが存在しなければ作成
|
|
92
154
|
if (!fs.existsSync(modelsDir)) {
|
|
@@ -109,7 +171,9 @@ async function createModelCommand(options) {
|
|
|
109
171
|
}
|
|
110
172
|
}
|
|
111
173
|
// モデルファイルを生成
|
|
112
|
-
const content =
|
|
174
|
+
const content = options.connector && connectorType
|
|
175
|
+
? generateConnectorModelTemplate(name, options.connector, connectorType)
|
|
176
|
+
: generateModelTemplate(name);
|
|
113
177
|
fs.writeFileSync(filePath, content);
|
|
114
178
|
console.log(`✅ Created: ${filePath}`);
|
|
115
179
|
created.push(kebabName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-model.js","sourceRoot":"","sources":["../../../src/cli/commands/create-model.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"create-model.js","sourceRoot":"","sources":["../../../src/cli/commands/create-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGnE;AAED,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAUA;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAW3G;AAiQD,eAAO,MAAM,UAAU,SAqBnB,CAAC"}
|