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.
Files changed (88) hide show
  1. package/README.ja.md +12 -6
  2. package/README.md +68 -6
  3. package/dist/cli/commands/dev-seeds.d.ts +35 -0
  4. package/dist/cli/commands/dev-seeds.d.ts.map +1 -0
  5. package/dist/cli/commands/dev-seeds.js +292 -0
  6. package/dist/cli/commands/dev-seeds.js.map +1 -0
  7. package/dist/cli/commands/dev.d.ts +8 -0
  8. package/dist/cli/commands/dev.d.ts.map +1 -1
  9. package/dist/cli/commands/dev.js +295 -83
  10. package/dist/cli/commands/dev.js.map +1 -1
  11. package/dist/cli/commands/index.d.ts +1 -0
  12. package/dist/cli/commands/index.d.ts.map +1 -1
  13. package/dist/cli/commands/index.js +3 -1
  14. package/dist/cli/commands/index.js.map +1 -1
  15. package/dist/cli/commands/init.d.ts +5 -0
  16. package/dist/cli/commands/init.d.ts.map +1 -1
  17. package/dist/cli/commands/init.js +723 -285
  18. package/dist/cli/commands/init.js.map +1 -1
  19. package/dist/cli/commands/scaffold.d.ts +3 -0
  20. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  21. package/dist/cli/commands/scaffold.js +181 -17
  22. package/dist/cli/commands/scaffold.js.map +1 -1
  23. package/dist/cli/index.js +4 -1
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/core/config.d.ts +2 -1
  26. package/dist/core/config.d.ts.map +1 -1
  27. package/dist/core/config.js +28 -0
  28. package/dist/core/config.js.map +1 -1
  29. package/dist/core/scaffold/functions-generator.d.ts +5 -0
  30. package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
  31. package/dist/core/scaffold/functions-generator.js +431 -0
  32. package/dist/core/scaffold/functions-generator.js.map +1 -1
  33. package/dist/core/scaffold/model-parser.d.ts +1 -1
  34. package/dist/core/scaffold/model-parser.js +1 -1
  35. package/dist/core/scaffold/nextjs-generator.js +1 -1
  36. package/dist/core/scaffold/openapi-generator.d.ts +3 -0
  37. package/dist/core/scaffold/openapi-generator.d.ts.map +1 -0
  38. package/dist/core/scaffold/openapi-generator.js +190 -0
  39. package/dist/core/scaffold/openapi-generator.js.map +1 -0
  40. package/dist/database/base-model.d.ts +3 -3
  41. package/dist/database/base-model.js +3 -3
  42. package/dist/index.d.ts +2 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/types/index.d.ts +4 -0
  47. package/dist/types/index.d.ts.map +1 -1
  48. package/dist/utils/package-manager.d.ts +2 -1
  49. package/dist/utils/package-manager.d.ts.map +1 -1
  50. package/dist/utils/package-manager.js +10 -6
  51. package/dist/utils/package-manager.js.map +1 -1
  52. package/package.json +2 -1
  53. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +445 -0
  54. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +194 -0
  55. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +524 -0
  56. package/src/__tests__/config.test.ts +122 -0
  57. package/src/__tests__/dev-seeds.test.ts +112 -0
  58. package/src/__tests__/dev.test.ts +42 -0
  59. package/src/__tests__/fixtures.ts +83 -0
  60. package/src/__tests__/functions-generator.test.ts +101 -0
  61. package/src/__tests__/init.test.ts +59 -0
  62. package/src/__tests__/nextjs-generator.test.ts +97 -0
  63. package/src/__tests__/openapi-generator.test.ts +43 -0
  64. package/src/__tests__/package-manager.test.ts +189 -0
  65. package/src/__tests__/scaffold.test.ts +39 -0
  66. package/src/__tests__/string-utils.test.ts +75 -0
  67. package/src/__tests__/ui-generator.test.ts +144 -0
  68. package/src/cli/commands/create-model.ts +141 -0
  69. package/src/cli/commands/dev-seeds.ts +358 -0
  70. package/src/cli/commands/dev.ts +805 -0
  71. package/src/cli/commands/index.ts +9 -0
  72. package/src/cli/commands/init.ts +3363 -0
  73. package/src/cli/commands/provision.ts +193 -0
  74. package/src/cli/commands/scaffold.ts +786 -0
  75. package/src/cli/index.ts +74 -0
  76. package/src/core/config.ts +244 -0
  77. package/src/core/scaffold/functions-generator.ts +674 -0
  78. package/src/core/scaffold/model-parser.ts +627 -0
  79. package/src/core/scaffold/nextjs-generator.ts +217 -0
  80. package/src/core/scaffold/openapi-generator.ts +212 -0
  81. package/src/core/scaffold/ui-generator.ts +945 -0
  82. package/src/database/base-model.ts +184 -0
  83. package/src/database/client.ts +140 -0
  84. package/src/database/repository.ts +104 -0
  85. package/src/database/runtime-check.ts +25 -0
  86. package/src/index.ts +27 -0
  87. package/src/types/index.ts +45 -0
  88. 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
- - **🛡️ 完全な型安全性** - クライアントからデータベースまでエンドツーエンド TypeScript
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 スキーマをフロントエンド・BFF・Functions・DB で共有
194
- - **型安全性**: Zod から TypeScript 型を自動推論
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** - Same schema across frontend, BFF, Azure Functions, and Cosmos DB
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
- - **🛡️ Full Type Safety** - End-to-end TypeScript from client to database
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 used across frontend, BFF, Functions, and DB
195
- - **Type Safety**: TypeScript types auto-inferred from Zod
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,4DAEC;AAED,sDAEC;AAED,0DAEC;AAED,gDAkBC;AAED,8CAEC;AAED,8DAOC;AAED,4CAoCC;AAED,0DAqCC;AAED,4DA4CC;AArMD,yCAAoC;AACpC,0CAAyE;AACzE,uCAAyB;AACzB,2CAA6B;AAC7B,8CAA4D;AAC5D,mEAAmG;AA0BnG,SAAgB,wBAAwB,CAAC,KAA8B;IACrE,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC;AAC1B,CAAC;AAED,SAAgB,qBAAqB,CAAC,WAAmB,EAAE,WAAmB,WAAW;IACvF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,uBAAuB,CAAC,KAAa;IACnD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAe,EAAE,QAAgB;IAClE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,0DAA0D,KAAK,GAAG,CAAC,CAAC;YACjG,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,0DAA0D,CAAC,CAAC;AACzF,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,YAAoB,eAAe;IACzE,OAAO,IAAA,2BAAY,EAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,yBAAyB,CACvC,KAAgB,EAChB,YAAyB,CAAC,KAAK,CAAC,EAChC,aAA0B,IAAI,GAAG,EAAE;IAEnC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,iCAAiC,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAC3E,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,MAAmB,EACnB,WAAmB,WAAW;IAE9B,MAAM,cAAc,GAAG,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAElE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;YAC5E,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;QACnF,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK;YACL,aAAa,EAAE,wBAAwB,CAAC,KAAK,CAAC;YAC9C,SAAS;YACT,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,EAC5C,MAAM,EACN,YAAY,EACZ,WAAW,EACX,MAAM,EACN,QAAQ,GAAG,WAAW,GACS;IAC/B,MAAM,cAAc,GAAG,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,yBAAyB,WAAW,kBAAkB,cAAc,oCAAoC,CAAC,CAAC;QACtH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,4CAA4C,WAAW,qCAAqC,CAAC,CAAC;QAC1G,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,oDAAoD,WAAW,MAAM,CAAC,CAAC;IAEnF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAE7D,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,CAAC,GAAG,CACT,aAAa,QAAQ,CAAC,aAAa,UAAU,QAAQ,CAAC,SAAS,CAAC,MAAM,iBAAiB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAC1H,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAAC,EAC7C,WAAW,EACX,SAAS,GAAG,eAAe,EAC3B,QAAQ,GAAG,WAAW,EACtB,KAAK,GAAG,KAAK,GACmB;IAChC,IAAA,gCAAuB,EAAC,kBAAkB,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,qDAAqD,WAAW,QAAQ,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpE,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QAC3F,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC,MAAM,mDAAmD,CAAC,CAAC;IACrG,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,8BAA8B,cAAc,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,2CAA2C,CAAC,CAAC;AAC7G,CAAC;AAEY,QAAA,eAAe,GAAG,IAAI,mBAAO,EAAE;KACzC,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,2FAA2F,CAAC;KACxG,QAAQ,CAAC,eAAe,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,CAAC;KACjE,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,WAAW,CAAC;KAC/D,MAAM,CAAC,SAAS,EAAE,oCAAoC,EAAE,KAAK,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAAmE,EAAE,EAAE;IACzG,MAAM,wBAAwB,CAAC;QAC7B,WAAW;QACX,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,SAAS,iCAAiC,CACxC,KAAgB,EAChB,WAAmC,EACnC,UAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAgB,EAChB,KAAgB,EAChB,WAAmC,EACnC,UAAuB;IAEvB,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC3D,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,GAAG,IAAA,0BAAW,EAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC/C,CAAC;YAED,MAAM,cAAc,GAAG,iCAAiC,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAC/F,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAgB,EAAE,KAAgB;IAClE,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,GAAG,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,GAAG,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AACxE,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAmB;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG;YACjB,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,UAAU;YAChB,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SAC5D,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAyB,EAAE,QAAgB;IACxE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QACpC,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,kBAAkB,KAAK,sCAAsC,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,2BAA2B,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;QACzE,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAkB,EAAE,aAAqB;IACxE,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAC1C,EAAE,EAAE,aAAa;YACjB,YAAY,EAAE;gBACZ,KAAK,EAAE,CAAC,KAAK,CAAC;gBACd,IAAI,EAAE,yBAAgB,CAAC,IAAI;gBAC3B,OAAO,EAAE,CAAC;aACX;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,2BAA2B,aAAa,yCAAyC,OAAO,EAAE,CAAC,CAAC;QACxG,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAC1C,EAAE,EAAE,aAAa;YACjB,YAAY,EAAE;gBACZ,KAAK,EAAE,CAAC,KAAK,CAAC;aACf;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -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;AAiEpC,eAAO,MAAM,UAAU,SAmBnB,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"}