swallowkit 1.0.0-beta.6 → 1.0.0-beta.8
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 +12 -6
- package/README.md +68 -6
- package/dist/cli/commands/dev-seeds.d.ts +35 -0
- package/dist/cli/commands/dev-seeds.d.ts.map +1 -0
- package/dist/cli/commands/dev-seeds.js +292 -0
- package/dist/cli/commands/dev-seeds.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +8 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +295 -83
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +3 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +5 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +723 -285
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/scaffold.d.ts +3 -0
- package/dist/cli/commands/scaffold.d.ts.map +1 -1
- package/dist/cli/commands/scaffold.js +181 -17
- package/dist/cli/commands/scaffold.js.map +1 -1
- package/dist/cli/index.js +4 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/config.d.ts +2 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +28 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/scaffold/functions-generator.d.ts +5 -0
- package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
- package/dist/core/scaffold/functions-generator.js +431 -0
- package/dist/core/scaffold/functions-generator.js.map +1 -1
- package/dist/core/scaffold/model-parser.d.ts +1 -1
- package/dist/core/scaffold/model-parser.js +1 -1
- package/dist/core/scaffold/nextjs-generator.js +1 -1
- package/dist/core/scaffold/openapi-generator.d.ts +3 -0
- package/dist/core/scaffold/openapi-generator.d.ts.map +1 -0
- package/dist/core/scaffold/openapi-generator.js +190 -0
- package/dist/core/scaffold/openapi-generator.js.map +1 -0
- package/dist/database/base-model.d.ts +3 -3
- package/dist/database/base-model.js +3 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/package-manager.d.ts +2 -1
- package/dist/utils/package-manager.d.ts.map +1 -1
- package/dist/utils/package-manager.js +10 -6
- package/dist/utils/package-manager.js.map +1 -1
- package/package.json +2 -1
- package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +445 -0
- package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +194 -0
- package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +524 -0
- package/src/__tests__/config.test.ts +122 -0
- package/src/__tests__/dev-seeds.test.ts +112 -0
- package/src/__tests__/dev.test.ts +42 -0
- package/src/__tests__/fixtures.ts +83 -0
- package/src/__tests__/functions-generator.test.ts +101 -0
- package/src/__tests__/init.test.ts +59 -0
- package/src/__tests__/nextjs-generator.test.ts +97 -0
- package/src/__tests__/openapi-generator.test.ts +43 -0
- package/src/__tests__/package-manager.test.ts +189 -0
- package/src/__tests__/scaffold.test.ts +39 -0
- package/src/__tests__/string-utils.test.ts +75 -0
- package/src/__tests__/ui-generator.test.ts +144 -0
- package/src/cli/commands/create-model.ts +141 -0
- package/src/cli/commands/dev-seeds.ts +358 -0
- package/src/cli/commands/dev.ts +805 -0
- package/src/cli/commands/index.ts +9 -0
- package/src/cli/commands/init.ts +3363 -0
- package/src/cli/commands/provision.ts +193 -0
- package/src/cli/commands/scaffold.ts +786 -0
- package/src/cli/index.ts +74 -0
- package/src/core/config.ts +244 -0
- package/src/core/scaffold/functions-generator.ts +674 -0
- package/src/core/scaffold/model-parser.ts +627 -0
- package/src/core/scaffold/nextjs-generator.ts +217 -0
- package/src/core/scaffold/openapi-generator.ts +212 -0
- package/src/core/scaffold/ui-generator.ts +945 -0
- package/src/database/base-model.ts +184 -0
- package/src/database/client.ts +140 -0
- package/src/database/repository.ts +104 -0
- package/src/database/runtime-check.ts +25 -0
- package/src/index.ts +27 -0
- package/src/types/index.ts +45 -0
- package/src/utils/package-manager.ts +229 -0
package/README.ja.md
CHANGED
|
@@ -18,9 +18,11 @@ Zod スキーマから自動的に CRUD 操作を生成する Scaffold 機能を
|
|
|
18
18
|
|
|
19
19
|
## ✨ 主な特徴
|
|
20
20
|
|
|
21
|
-
- **🔄 Zod スキーマ共有** - フロントエンド、BFF、Azure Functions、Cosmos DB
|
|
21
|
+
- **🔄 Zod スキーマ共有** - フロントエンド、BFF、Azure Functions、Cosmos DB をまたいで Zod を唯一のソースとして維持
|
|
22
22
|
- **⚡ CRUD コード生成** - `swallowkit scaffold` で Azure Functions + Next.js コードを自動生成
|
|
23
|
-
-
|
|
23
|
+
- **🌐 Functions バックエンド多言語対応** - `init` 時に Azure Functions の言語として TypeScript、C#、Python を選択可能
|
|
24
|
+
- **🧬 OpenAPI スキーマブリッジ** - C#/Python バックエンドでは `scaffold` が Zod から OpenAPI を出力し、各言語向けスキーマ資産を生成
|
|
25
|
+
- **🛡️ 契約安全性** - 共有 Zod または OpenAPI 由来のモデルにより、フロント/BFF とバックエンドの契約を整合
|
|
24
26
|
- **🎯 BFF パターン** - Next.js API Routes が BFF レイヤーとして機能、自動検証・リソース名推論
|
|
25
27
|
- **☁️ Azure 最適化** - Static Web Apps + Functions + Cosmos DB で最小コスト構成
|
|
26
28
|
- **🚀 簡単デプロイ** - Bicep IaC + CI/CD ワークフローを自動生成
|
|
@@ -47,16 +49,17 @@ pnpm dlx swallowkit init my-app
|
|
|
47
49
|
cd my-app
|
|
48
50
|
```
|
|
49
51
|
|
|
50
|
-
対話プロンプトで CI/CD プロバイダー、Cosmos DB モード、ネットワーク設定を選択します。フラグで直接指定するとプロンプトをスキップできます:
|
|
52
|
+
対話プロンプトで CI/CD プロバイダー、Azure Functions のバックエンド言語、Cosmos DB モード、ネットワーク設定を選択します。フラグで直接指定するとプロンプトをスキップできます:
|
|
51
53
|
|
|
52
54
|
```bash
|
|
53
55
|
# 非対話モード(VS Code 拡張機能や自動化に便利)
|
|
54
|
-
npx swallowkit init my-app --cicd github --cosmos-db-mode serverless --vnet outbound
|
|
56
|
+
npx swallowkit init my-app --cicd github --backend-language python --cosmos-db-mode serverless --vnet outbound
|
|
55
57
|
```
|
|
56
58
|
|
|
57
59
|
| フラグ | 値 | 説明 |
|
|
58
60
|
|------|-----|------|
|
|
59
61
|
| `--cicd <provider>` | `github`, `azure`, `skip` | CI/CD プロバイダー |
|
|
62
|
+
| `--backend-language <language>` | `typescript`, `csharp`, `python` | Azure Functions のバックエンド言語 |
|
|
60
63
|
| `--cosmos-db-mode <mode>` | `freetier`, `serverless` | Cosmos DB 課金モード |
|
|
61
64
|
| `--vnet <option>` | `outbound`, `none` | ネットワークセキュリティ |
|
|
62
65
|
|
|
@@ -122,6 +125,8 @@ pnpm dlx swallowkit scaffold shared/models/todo.ts
|
|
|
122
125
|
- ✅ Next.js BFF API Routes (自動検証・リソース名推論)
|
|
123
126
|
- ✅ React コンポーネント (型安全なフォーム)
|
|
124
127
|
|
|
128
|
+
`init` で `csharp` または `python` を選んだ場合、`swallowkit scaffold` はあわせて `functions/openapi/` に OpenAPI ドキュメントを出力し、`functions/generated/` に各言語向けスキーマ資産を生成します。
|
|
129
|
+
|
|
125
130
|
### 4. 開発サーバー起動
|
|
126
131
|
|
|
127
132
|
```bash
|
|
@@ -190,8 +195,9 @@ await api.delete('/api/todos/123');
|
|
|
190
195
|
|
|
191
196
|
**重要なパターン:**
|
|
192
197
|
- **BFF (Backend For Frontend)**: Next.js API Routes が Azure Functions へのプロキシ
|
|
193
|
-
- **共有スキーマ**: Zod
|
|
194
|
-
-
|
|
198
|
+
- **共有スキーマ**: `shared/models/` の Zod スキーマを唯一のソースとして扱う
|
|
199
|
+
- **C#/Python 向け OpenAPI ブリッジ**: TypeScript 以外の Functions は `functions/generated/` の生成資産を利用
|
|
200
|
+
- **契約安全性**: 共有 Zod または生成モデルで BFF とバックエンドの整合を保つ
|
|
195
201
|
- **マネージド ID**: サービス間の安全な接続(接続文字列不要)
|
|
196
202
|
|
|
197
203
|
## 📦 前提条件
|
package/README.md
CHANGED
|
@@ -20,9 +20,11 @@ Featuring Scaffold functionality to automatically generate CRUD operations from
|
|
|
20
20
|
|
|
21
21
|
## ✨ Key Features
|
|
22
22
|
|
|
23
|
-
- **🔄 Zod Schema Sharing** -
|
|
23
|
+
- **🔄 Zod Schema Sharing** - Keep Zod as the source of truth across frontend, BFF, Azure Functions, and Cosmos DB
|
|
24
24
|
- **⚡ CRUD Code Generation** - Auto-generate Azure Functions + Next.js code with `swallowkit scaffold`
|
|
25
|
-
-
|
|
25
|
+
- **🌐 Multi-language Functions Backends** - Choose TypeScript, C#, or Python for Azure Functions during `init`
|
|
26
|
+
- **🧬 OpenAPI Schema Bridge** - For C#/Python backends, `scaffold` exports OpenAPI from Zod and generates backend schema assets
|
|
27
|
+
- **🛡️ Contract Safety** - Keep frontend/BFF contracts aligned with backend implementations through shared Zod or generated OpenAPI-derived models
|
|
26
28
|
- **🎯 BFF Pattern** - Next.js API Routes as BFF layer with auto-validation and resource inference
|
|
27
29
|
- **☁️ Azure Optimized** - Minimal-cost architecture with Static Web Apps + Functions + Cosmos DB
|
|
28
30
|
- **🚀 Easy Deployment** - Auto-generated Bicep IaC + CI/CD workflows
|
|
@@ -48,16 +50,17 @@ pnpm dlx swallowkit init my-app
|
|
|
48
50
|
cd my-app
|
|
49
51
|
```
|
|
50
52
|
|
|
51
|
-
The interactive prompts ask for CI/CD provider, Cosmos DB mode, and network settings. You can also specify them as flags to skip prompts entirely:
|
|
53
|
+
The interactive prompts ask for CI/CD provider, Azure Functions backend language, Cosmos DB mode, and network settings. You can also specify them as flags to skip prompts entirely:
|
|
52
54
|
|
|
53
55
|
```bash
|
|
54
56
|
# Non-interactive mode (useful for VS Code extensions or automation)
|
|
55
|
-
npx swallowkit init my-app --cicd github --cosmos-db-mode serverless --vnet outbound
|
|
57
|
+
npx swallowkit init my-app --cicd github --backend-language python --cosmos-db-mode serverless --vnet outbound
|
|
56
58
|
```
|
|
57
59
|
|
|
58
60
|
| Flag | Values | Description |
|
|
59
61
|
|------|--------|-------------|
|
|
60
62
|
| `--cicd <provider>` | `github`, `azure`, `skip` | CI/CD provider |
|
|
63
|
+
| `--backend-language <language>` | `typescript`, `csharp`, `python` | Azure Functions backend language |
|
|
61
64
|
| `--cosmos-db-mode <mode>` | `freetier`, `serverless` | Cosmos DB pricing mode |
|
|
62
65
|
| `--vnet <option>` | `outbound`, `none` | Network security |
|
|
63
66
|
|
|
@@ -123,6 +126,8 @@ This auto-generates:
|
|
|
123
126
|
- ✅ Next.js BFF API Routes (auto-validation + resource inference)
|
|
124
127
|
- ✅ React Components (type-safe forms)
|
|
125
128
|
|
|
129
|
+
If you selected `csharp` or `python` at `init` time, `swallowkit scaffold` also writes an OpenAPI document under `functions/openapi/` and generates backend schema assets under `functions/generated/`.
|
|
130
|
+
|
|
126
131
|
### 4. Start Development Server
|
|
127
132
|
|
|
128
133
|
```bash
|
|
@@ -134,6 +139,62 @@ pnpm dlx swallowkit dev
|
|
|
134
139
|
- Next.js: http://localhost:3000
|
|
135
140
|
- Azure Functions: http://localhost:7071
|
|
136
141
|
|
|
142
|
+
If you want to replace Cosmos DB Emulator data before startup, generate an environment template and then launch `dev` with that environment:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
npx swallowkit create-dev-seeds local
|
|
146
|
+
# edit dev-seeds/local/*.json
|
|
147
|
+
npx swallowkit dev --seed-env local
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
This workflow is designed for local debugging against the Cosmos DB Emulator:
|
|
151
|
+
|
|
152
|
+
- `create-dev-seeds <environment>` generates one JSON template per schema under `dev-seeds/<environment>/`
|
|
153
|
+
- each file name maps to a schema/container, for example `shared/models/todo.ts` -> `dev-seeds/local/todo.json` -> `Todos`
|
|
154
|
+
- when you start `dev --seed-env <environment>`, SwallowKit replaces the existing data for each matching container with the JSON documents from that environment
|
|
155
|
+
- containers without a matching JSON file are left untouched
|
|
156
|
+
- if `--seed-env` is omitted, or `dev-seeds/<environment>/` does not exist, current emulator data is preserved
|
|
157
|
+
|
|
158
|
+
Example file layout:
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
dev-seeds/
|
|
162
|
+
local/
|
|
163
|
+
todo.json
|
|
164
|
+
category.json
|
|
165
|
+
staging-debug/
|
|
166
|
+
todo.json
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Each `{schema}.json` file can contain either a single JSON object or an array of JSON objects. Every document must include an `id`:
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
[
|
|
173
|
+
{
|
|
174
|
+
"id": "seed-todo-001",
|
|
175
|
+
"name": "Seed todo one",
|
|
176
|
+
"createdAt": "2026-03-21T00:00:00.000Z",
|
|
177
|
+
"updatedAt": "2026-03-21T00:00:00.000Z"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"id": "seed-todo-002",
|
|
181
|
+
"name": "Seed todo two",
|
|
182
|
+
"createdAt": "2026-03-21T00:00:01.000Z",
|
|
183
|
+
"updatedAt": "2026-03-21T00:00:01.000Z"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Recommended workflow:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
npx swallowkit create-model todo
|
|
192
|
+
npx swallowkit scaffold shared/models/todo.ts
|
|
193
|
+
npx swallowkit create-dev-seeds local
|
|
194
|
+
# edit dev-seeds/local/todo.json
|
|
195
|
+
npx swallowkit dev --seed-env local
|
|
196
|
+
```
|
|
197
|
+
|
|
137
198
|
### 5. Use from Frontend
|
|
138
199
|
|
|
139
200
|
```typescript
|
|
@@ -191,8 +252,9 @@ await api.delete('/api/todos/123');
|
|
|
191
252
|
|
|
192
253
|
**Key Patterns:**
|
|
193
254
|
- **BFF (Backend For Frontend)**: Next.js API Routes proxy to Azure Functions
|
|
194
|
-
- **Shared Schemas**: Zod schemas
|
|
195
|
-
- **
|
|
255
|
+
- **Shared Schemas**: Zod schemas stay in `shared/models/` as the source of truth
|
|
256
|
+
- **OpenAPI Bridge for C#/Python**: Non-TypeScript Functions consume generated assets under `functions/generated/`
|
|
257
|
+
- **Contract Safety**: BFF and backend stay aligned through shared Zod or generated backend models
|
|
196
258
|
- **Managed Identity**: Secure service connections (no connection strings)
|
|
197
259
|
|
|
198
260
|
## 📦 Prerequisites
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { CosmosClient } from "@azure/cosmos";
|
|
3
|
+
import { ModelInfo } from "../../core/scaffold/model-parser";
|
|
4
|
+
export type SeedDocument = Record<string, unknown>;
|
|
5
|
+
interface GenerateDevSeedTemplatesOptions {
|
|
6
|
+
environment: string;
|
|
7
|
+
modelsDir?: string;
|
|
8
|
+
seedsDir?: string;
|
|
9
|
+
force?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface ApplyDevSeedEnvironmentOptions {
|
|
12
|
+
client: CosmosClient;
|
|
13
|
+
databaseName: string;
|
|
14
|
+
environment: string;
|
|
15
|
+
models: ModelInfo[];
|
|
16
|
+
seedsDir?: string;
|
|
17
|
+
}
|
|
18
|
+
interface LoadedSeedFile {
|
|
19
|
+
model: ModelInfo;
|
|
20
|
+
containerName: string;
|
|
21
|
+
documents: SeedDocument[];
|
|
22
|
+
filePath: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function getContainerNameForModel(model: Pick<ModelInfo, "name">): string;
|
|
25
|
+
export declare function getSeedEnvironmentDir(environment: string, seedsDir?: string): string;
|
|
26
|
+
export declare function normalizeSeedIdentifier(value: string): string;
|
|
27
|
+
export declare function parseSeedDocuments(content: string, filePath: string): SeedDocument[];
|
|
28
|
+
export declare function loadProjectModels(modelsDir?: string): Promise<ModelInfo[]>;
|
|
29
|
+
export declare function buildSeedTemplateDocument(model: ModelInfo, allModels?: ModelInfo[], seenModels?: Set<string>): SeedDocument;
|
|
30
|
+
export declare function loadDevSeedFiles(environment: string, models: ModelInfo[], seedsDir?: string): Promise<LoadedSeedFile[]>;
|
|
31
|
+
export declare function applyDevSeedEnvironment({ client, databaseName, environment, models, seedsDir, }: ApplyDevSeedEnvironmentOptions): Promise<boolean>;
|
|
32
|
+
export declare function generateDevSeedTemplates({ environment, modelsDir, seedsDir, force, }: GenerateDevSeedTemplatesOptions): Promise<void>;
|
|
33
|
+
export declare const devSeedsCommand: Command;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=dev-seeds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-seeds.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev-seeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAA8B,MAAM,eAAe,CAAC;AAIzE,OAAO,EAAa,SAAS,EAA6B,MAAM,kCAAkC,CAAC;AAEnG,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,UAAU,+BAA+B;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,8BAA8B;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM,CAE/E;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAoB,GAAG,MAAM,CAEjG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAkBpF;AAED,wBAAsB,iBAAiB,CAAC,SAAS,GAAE,MAAwB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAEjG;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,EAChB,SAAS,GAAE,SAAS,EAAY,EAChC,UAAU,GAAE,GAAG,CAAC,MAAM,CAAa,GAClC,YAAY,CAGd;AAED,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,EAAE,EACnB,QAAQ,GAAE,MAAoB,GAC7B,OAAO,CAAC,cAAc,EAAE,CAAC,CAgC3B;AAED,wBAAsB,uBAAuB,CAAC,EAC5C,MAAM,EACN,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAsB,GACvB,EAAE,8BAA8B,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BnD;AAED,wBAAsB,wBAAwB,CAAC,EAC7C,WAAW,EACX,SAA2B,EAC3B,QAAsB,EACtB,KAAa,GACd,EAAE,+BAA+B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCjD;AAED,eAAO,MAAM,eAAe,SAcxB,CAAC"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.devSeedsCommand = void 0;
|
|
37
|
+
exports.getContainerNameForModel = getContainerNameForModel;
|
|
38
|
+
exports.getSeedEnvironmentDir = getSeedEnvironmentDir;
|
|
39
|
+
exports.normalizeSeedIdentifier = normalizeSeedIdentifier;
|
|
40
|
+
exports.parseSeedDocuments = parseSeedDocuments;
|
|
41
|
+
exports.loadProjectModels = loadProjectModels;
|
|
42
|
+
exports.buildSeedTemplateDocument = buildSeedTemplateDocument;
|
|
43
|
+
exports.loadDevSeedFiles = loadDevSeedFiles;
|
|
44
|
+
exports.applyDevSeedEnvironment = applyDevSeedEnvironment;
|
|
45
|
+
exports.generateDevSeedTemplates = generateDevSeedTemplates;
|
|
46
|
+
const commander_1 = require("commander");
|
|
47
|
+
const cosmos_1 = require("@azure/cosmos");
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const config_1 = require("../../core/config");
|
|
51
|
+
const model_parser_1 = require("../../core/scaffold/model-parser");
|
|
52
|
+
function getContainerNameForModel(model) {
|
|
53
|
+
return `${model.name}s`;
|
|
54
|
+
}
|
|
55
|
+
function getSeedEnvironmentDir(environment, seedsDir = "dev-seeds") {
|
|
56
|
+
return path.join(process.cwd(), seedsDir, environment);
|
|
57
|
+
}
|
|
58
|
+
function normalizeSeedIdentifier(value) {
|
|
59
|
+
return value.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
60
|
+
}
|
|
61
|
+
function parseSeedDocuments(content, filePath) {
|
|
62
|
+
const parsed = JSON.parse(content);
|
|
63
|
+
if (Array.isArray(parsed)) {
|
|
64
|
+
return parsed.map((item, index) => {
|
|
65
|
+
if (!isSeedDocument(item)) {
|
|
66
|
+
throw new Error(`${filePath} must contain only JSON objects. Invalid item at index ${index}.`);
|
|
67
|
+
}
|
|
68
|
+
return item;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (isSeedDocument(parsed)) {
|
|
72
|
+
return [parsed];
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`${filePath} must contain a JSON object or an array of JSON objects.`);
|
|
75
|
+
}
|
|
76
|
+
async function loadProjectModels(modelsDir = "shared/models") {
|
|
77
|
+
return (0, model_parser_1.getAllModels)(modelsDir);
|
|
78
|
+
}
|
|
79
|
+
function buildSeedTemplateDocument(model, allModels = [model], seenModels = new Set()) {
|
|
80
|
+
const modelLookup = new Map(allModels.map((candidate) => [candidate.name, candidate]));
|
|
81
|
+
return buildSeedTemplateDocumentInternal(model, modelLookup, seenModels);
|
|
82
|
+
}
|
|
83
|
+
async function loadDevSeedFiles(environment, models, seedsDir = "dev-seeds") {
|
|
84
|
+
const environmentDir = getSeedEnvironmentDir(environment, seedsDir);
|
|
85
|
+
if (!fs.existsSync(environmentDir)) {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
const modelAliases = buildModelAliasMap(models);
|
|
89
|
+
const seedFiles = fs.readdirSync(environmentDir).filter((entry) => entry.endsWith(".json"));
|
|
90
|
+
const loaded = [];
|
|
91
|
+
for (const fileName of seedFiles) {
|
|
92
|
+
const filePath = path.join(environmentDir, fileName);
|
|
93
|
+
const fileStem = path.basename(fileName, ".json");
|
|
94
|
+
const model = modelAliases.get(normalizeSeedIdentifier(fileStem));
|
|
95
|
+
if (!model) {
|
|
96
|
+
console.warn(`⚠️ Skipping seed file without matching schema: ${filePath}`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const documents = parseSeedDocuments(fs.readFileSync(filePath, "utf-8"), filePath);
|
|
100
|
+
validateSeedDocuments(documents, filePath);
|
|
101
|
+
loaded.push({
|
|
102
|
+
model,
|
|
103
|
+
containerName: getContainerNameForModel(model),
|
|
104
|
+
documents,
|
|
105
|
+
filePath,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return loaded;
|
|
109
|
+
}
|
|
110
|
+
async function applyDevSeedEnvironment({ client, databaseName, environment, models, seedsDir = "dev-seeds", }) {
|
|
111
|
+
const environmentDir = getSeedEnvironmentDir(environment, seedsDir);
|
|
112
|
+
if (!fs.existsSync(environmentDir)) {
|
|
113
|
+
console.log(`ℹ️ Seed environment "${environment}" not found at ${environmentDir}. Keeping existing Cosmos DB data.`);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const seedFiles = await loadDevSeedFiles(environment, models, seedsDir);
|
|
117
|
+
if (seedFiles.length === 0) {
|
|
118
|
+
console.log(`ℹ️ No seed files found for environment "${environment}". Keeping existing Cosmos DB data.`);
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const database = client.database(databaseName);
|
|
122
|
+
console.log(`🧪 Applying Cosmos DB seed data for environment "${environment}"...`);
|
|
123
|
+
for (const seedFile of seedFiles) {
|
|
124
|
+
await recreateContainer(database, seedFile.containerName);
|
|
125
|
+
const container = database.container(seedFile.containerName);
|
|
126
|
+
for (const document of seedFile.documents) {
|
|
127
|
+
await container.items.create(document);
|
|
128
|
+
}
|
|
129
|
+
console.log(`✅ Seeded "${seedFile.containerName}" with ${seedFile.documents.length} item(s) from ${path.basename(seedFile.filePath)}`);
|
|
130
|
+
}
|
|
131
|
+
console.log("✅ Cosmos DB seed replacement complete\n");
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
async function generateDevSeedTemplates({ environment, modelsDir = "shared/models", seedsDir = "dev-seeds", force = false, }) {
|
|
135
|
+
(0, config_1.ensureSwallowKitProject)("create-dev-seeds");
|
|
136
|
+
console.log(`🧪 Generating dev seed templates for environment "${environment}"...\n`);
|
|
137
|
+
const models = await loadProjectModels(modelsDir);
|
|
138
|
+
if (models.length === 0) {
|
|
139
|
+
console.log("⚠️ No schemas found under shared/models. Nothing was generated.");
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const environmentDir = getSeedEnvironmentDir(environment, seedsDir);
|
|
143
|
+
fs.mkdirSync(environmentDir, { recursive: true });
|
|
144
|
+
const writtenFiles = [];
|
|
145
|
+
const skippedFiles = [];
|
|
146
|
+
for (const model of models) {
|
|
147
|
+
const filePath = path.join(environmentDir, `${(0, model_parser_1.toKebabCase)(model.name)}.json`);
|
|
148
|
+
if (!force && fs.existsSync(filePath)) {
|
|
149
|
+
skippedFiles.push(filePath);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const content = JSON.stringify([buildSeedTemplateDocument(model, models)], null, 2) + "\n";
|
|
153
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
154
|
+
writtenFiles.push(filePath);
|
|
155
|
+
console.log(`✅ Created: ${filePath}`);
|
|
156
|
+
}
|
|
157
|
+
if (skippedFiles.length > 0) {
|
|
158
|
+
console.log("");
|
|
159
|
+
console.log(`⏭️ Skipped ${skippedFiles.length} existing file(s). Use --force to overwrite them.`);
|
|
160
|
+
}
|
|
161
|
+
console.log("");
|
|
162
|
+
console.log("📝 Next steps:");
|
|
163
|
+
console.log(` 1. Edit JSON files under ${environmentDir}`);
|
|
164
|
+
console.log(` 2. Run 'swallowkit dev --seed-env ${environment}' to replace emulator data before startup`);
|
|
165
|
+
}
|
|
166
|
+
exports.devSeedsCommand = new commander_1.Command()
|
|
167
|
+
.name("create-dev-seeds")
|
|
168
|
+
.description("Generate dev seed JSON templates under dev-seeds/<environment> from shared/models schemas")
|
|
169
|
+
.argument("<environment>", "Seed environment name")
|
|
170
|
+
.option("--models-dir <dir>", "Models directory", "shared/models")
|
|
171
|
+
.option("--seeds-dir <dir>", "Dev seeds directory", "dev-seeds")
|
|
172
|
+
.option("--force", "Overwrite existing seed JSON files", false)
|
|
173
|
+
.action(async (environment, options) => {
|
|
174
|
+
await generateDevSeedTemplates({
|
|
175
|
+
environment,
|
|
176
|
+
modelsDir: options.modelsDir,
|
|
177
|
+
seedsDir: options.seedsDir,
|
|
178
|
+
force: options.force,
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
function buildSeedTemplateDocumentInternal(model, modelLookup, seenModels) {
|
|
182
|
+
const nextSeen = new Set(seenModels);
|
|
183
|
+
nextSeen.add(model.name);
|
|
184
|
+
const document = {};
|
|
185
|
+
for (const field of model.fields) {
|
|
186
|
+
document[field.name] = buildTemplateValueForField(model, field, modelLookup, nextSeen);
|
|
187
|
+
}
|
|
188
|
+
return document;
|
|
189
|
+
}
|
|
190
|
+
function buildTemplateValueForField(model, field, modelLookup, seenModels) {
|
|
191
|
+
if (field.isNestedSchema && field.nestedModelName) {
|
|
192
|
+
const nestedModel = modelLookup.get(field.nestedModelName);
|
|
193
|
+
if (nestedModel) {
|
|
194
|
+
if (seenModels.has(nestedModel.name)) {
|
|
195
|
+
const fallback = { id: `${(0, model_parser_1.toKebabCase)(nestedModel.name)}-001` };
|
|
196
|
+
return field.isArray ? [fallback] : fallback;
|
|
197
|
+
}
|
|
198
|
+
const nestedDocument = buildSeedTemplateDocumentInternal(nestedModel, modelLookup, seenModels);
|
|
199
|
+
return field.isArray ? [nestedDocument] : nestedDocument;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (field.isArray) {
|
|
203
|
+
return [buildScalarTemplateValue(model, field)];
|
|
204
|
+
}
|
|
205
|
+
return buildScalarTemplateValue(model, field);
|
|
206
|
+
}
|
|
207
|
+
function buildScalarTemplateValue(model, field) {
|
|
208
|
+
if (field.name === "id") {
|
|
209
|
+
return `${(0, model_parser_1.toKebabCase)(model.name)}-001`;
|
|
210
|
+
}
|
|
211
|
+
if (field.enumValues && field.enumValues.length > 0) {
|
|
212
|
+
return field.enumValues[0];
|
|
213
|
+
}
|
|
214
|
+
if (field.type === "number") {
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
if (field.type === "boolean") {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
if (field.type === "date" || field.name.endsWith("At")) {
|
|
221
|
+
return "2026-01-01T00:00:00.000Z";
|
|
222
|
+
}
|
|
223
|
+
if (field.type === "object") {
|
|
224
|
+
return {};
|
|
225
|
+
}
|
|
226
|
+
return `${(0, model_parser_1.toKebabCase)(model.name)}-${(0, model_parser_1.toKebabCase)(field.name)}-sample`;
|
|
227
|
+
}
|
|
228
|
+
function buildModelAliasMap(models) {
|
|
229
|
+
const aliases = new Map();
|
|
230
|
+
for (const model of models) {
|
|
231
|
+
const candidates = [
|
|
232
|
+
model.name,
|
|
233
|
+
model.schemaName,
|
|
234
|
+
(0, model_parser_1.toKebabCase)(model.name),
|
|
235
|
+
path.basename(model.filePath, path.extname(model.filePath)),
|
|
236
|
+
];
|
|
237
|
+
for (const candidate of candidates) {
|
|
238
|
+
const normalized = normalizeSeedIdentifier(candidate);
|
|
239
|
+
if (!aliases.has(normalized)) {
|
|
240
|
+
aliases.set(normalized, model);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return aliases;
|
|
245
|
+
}
|
|
246
|
+
function isSeedDocument(value) {
|
|
247
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
248
|
+
}
|
|
249
|
+
function validateSeedDocuments(documents, filePath) {
|
|
250
|
+
const ids = new Set();
|
|
251
|
+
documents.forEach((document, index) => {
|
|
252
|
+
if (typeof document.id !== "string" || document.id.trim().length === 0) {
|
|
253
|
+
throw new Error(`${filePath} item at index ${index} must contain a non-empty string id.`);
|
|
254
|
+
}
|
|
255
|
+
if (ids.has(document.id)) {
|
|
256
|
+
throw new Error(`${filePath} contains duplicate id "${document.id}".`);
|
|
257
|
+
}
|
|
258
|
+
ids.add(document.id);
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
async function recreateContainer(database, containerName) {
|
|
262
|
+
try {
|
|
263
|
+
await database.container(containerName).delete();
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
if (error?.code !== 404) {
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
await database.containers.createIfNotExists({
|
|
272
|
+
id: containerName,
|
|
273
|
+
partitionKey: {
|
|
274
|
+
paths: ["/id"],
|
|
275
|
+
kind: cosmos_1.PartitionKeyKind.Hash,
|
|
276
|
+
version: 2,
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
282
|
+
console.log(`⚠️ Failed to recreate "${containerName}" with full partition key definition: ${message}`);
|
|
283
|
+
console.log("🔄 Retrying with simple partition key...");
|
|
284
|
+
await database.containers.createIfNotExists({
|
|
285
|
+
id: containerName,
|
|
286
|
+
partitionKey: {
|
|
287
|
+
paths: ["/id"],
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=dev-seeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-seeds.js","sourceRoot":"","sources":["../../../src/cli/commands/dev-seeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
export declare function buildFunctionsStartArgs(functionsPort: string): string[];
|
|
3
|
+
export declare function buildNextDevArgs(pm: string, port: string): string[];
|
|
4
|
+
export declare function getPythonVirtualEnvPaths(functionsDir: string): {
|
|
5
|
+
venvDir: string;
|
|
6
|
+
binDir: string;
|
|
7
|
+
pythonExecutable: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function buildPythonFunctionsEnv(baseEnv: NodeJS.ProcessEnv, functionsDir: string): NodeJS.ProcessEnv;
|
|
2
10
|
export declare const devCommand: Command;
|
|
3
11
|
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -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;AAsBpC,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,SAoBnB,CAAC"}
|