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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +21 -21
  2. package/README.ja.md +312 -215
  3. package/README.md +369 -216
  4. package/dist/__tests__/fixtures.d.ts +22 -0
  5. package/dist/__tests__/fixtures.d.ts.map +1 -0
  6. package/dist/__tests__/fixtures.js +146 -0
  7. package/dist/__tests__/fixtures.js.map +1 -0
  8. package/dist/cli/commands/add-auth.d.ts +10 -0
  9. package/dist/cli/commands/add-auth.d.ts.map +1 -0
  10. package/dist/cli/commands/add-auth.js +444 -0
  11. package/dist/cli/commands/add-auth.js.map +1 -0
  12. package/dist/cli/commands/add-connector.d.ts +20 -0
  13. package/dist/cli/commands/add-connector.d.ts.map +1 -0
  14. package/dist/cli/commands/add-connector.js +163 -0
  15. package/dist/cli/commands/add-connector.js.map +1 -0
  16. package/dist/cli/commands/create-model.d.ts +1 -4
  17. package/dist/cli/commands/create-model.d.ts.map +1 -1
  18. package/dist/cli/commands/create-model.js +21 -82
  19. package/dist/cli/commands/create-model.js.map +1 -1
  20. package/dist/cli/commands/dev-seeds.d.ts +35 -0
  21. package/dist/cli/commands/dev-seeds.d.ts.map +1 -0
  22. package/dist/cli/commands/dev-seeds.js +292 -0
  23. package/dist/cli/commands/dev-seeds.js.map +1 -0
  24. package/dist/cli/commands/dev.d.ts +19 -0
  25. package/dist/cli/commands/dev.d.ts.map +1 -1
  26. package/dist/cli/commands/dev.js +476 -117
  27. package/dist/cli/commands/dev.js.map +1 -1
  28. package/dist/cli/commands/index.d.ts +1 -0
  29. package/dist/cli/commands/index.d.ts.map +1 -1
  30. package/dist/cli/commands/index.js +3 -1
  31. package/dist/cli/commands/index.js.map +1 -1
  32. package/dist/cli/commands/init.d.ts +13 -0
  33. package/dist/cli/commands/init.d.ts.map +1 -1
  34. package/dist/cli/commands/init.js +2627 -1708
  35. package/dist/cli/commands/init.js.map +1 -1
  36. package/dist/cli/commands/scaffold.d.ts +3 -0
  37. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  38. package/dist/cli/commands/scaffold.js +617 -129
  39. package/dist/cli/commands/scaffold.js.map +1 -1
  40. package/dist/cli/index.d.ts +5 -1
  41. package/dist/cli/index.d.ts.map +1 -1
  42. package/dist/cli/index.js +164 -42
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/core/config.d.ts +8 -2
  45. package/dist/core/config.d.ts.map +1 -1
  46. package/dist/core/config.js +90 -4
  47. package/dist/core/config.js.map +1 -1
  48. package/dist/core/mock/connector-mock-server.d.ts +101 -0
  49. package/dist/core/mock/connector-mock-server.d.ts.map +1 -0
  50. package/dist/core/mock/connector-mock-server.js +480 -0
  51. package/dist/core/mock/connector-mock-server.js.map +1 -0
  52. package/dist/core/mock/zod-mock-generator.d.ts +14 -0
  53. package/dist/core/mock/zod-mock-generator.d.ts.map +1 -0
  54. package/dist/core/mock/zod-mock-generator.js +163 -0
  55. package/dist/core/mock/zod-mock-generator.js.map +1 -0
  56. package/dist/core/operations/create-model.d.ts +15 -0
  57. package/dist/core/operations/create-model.d.ts.map +1 -0
  58. package/dist/core/operations/create-model.js +171 -0
  59. package/dist/core/operations/create-model.js.map +1 -0
  60. package/dist/core/operations/runtime.d.ts +32 -0
  61. package/dist/core/operations/runtime.d.ts.map +1 -0
  62. package/dist/core/operations/runtime.js +225 -0
  63. package/dist/core/operations/runtime.js.map +1 -0
  64. package/dist/core/operations/scaffold-machine.d.ts +16 -0
  65. package/dist/core/operations/scaffold-machine.d.ts.map +1 -0
  66. package/dist/core/operations/scaffold-machine.js +63 -0
  67. package/dist/core/operations/scaffold-machine.js.map +1 -0
  68. package/dist/core/project/manifest.d.ts +92 -0
  69. package/dist/core/project/manifest.d.ts.map +1 -0
  70. package/dist/core/project/manifest.js +321 -0
  71. package/dist/core/project/manifest.js.map +1 -0
  72. package/dist/core/project/validation.d.ts +20 -0
  73. package/dist/core/project/validation.d.ts.map +1 -0
  74. package/dist/core/project/validation.js +204 -0
  75. package/dist/core/project/validation.js.map +1 -0
  76. package/dist/core/scaffold/auth-generator.d.ts +38 -0
  77. package/dist/core/scaffold/auth-generator.d.ts.map +1 -0
  78. package/dist/core/scaffold/auth-generator.js +1244 -0
  79. package/dist/core/scaffold/auth-generator.js.map +1 -0
  80. package/dist/core/scaffold/connector-functions-generator.d.ts +41 -0
  81. package/dist/core/scaffold/connector-functions-generator.d.ts.map +1 -0
  82. package/dist/core/scaffold/connector-functions-generator.js +1027 -0
  83. package/dist/core/scaffold/connector-functions-generator.js.map +1 -0
  84. package/dist/core/scaffold/functions-generator.d.ts +7 -1
  85. package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
  86. package/dist/core/scaffold/functions-generator.js +920 -213
  87. package/dist/core/scaffold/functions-generator.js.map +1 -1
  88. package/dist/core/scaffold/model-parser.d.ts +20 -1
  89. package/dist/core/scaffold/model-parser.d.ts.map +1 -1
  90. package/dist/core/scaffold/model-parser.js +329 -135
  91. package/dist/core/scaffold/model-parser.js.map +1 -1
  92. package/dist/core/scaffold/nextjs-generator.d.ts +8 -0
  93. package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
  94. package/dist/core/scaffold/nextjs-generator.js +314 -182
  95. package/dist/core/scaffold/nextjs-generator.js.map +1 -1
  96. package/dist/core/scaffold/openapi-generator.d.ts +3 -0
  97. package/dist/core/scaffold/openapi-generator.d.ts.map +1 -0
  98. package/dist/core/scaffold/openapi-generator.js +190 -0
  99. package/dist/core/scaffold/openapi-generator.js.map +1 -0
  100. package/dist/core/scaffold/ui-generator.d.ts +10 -4
  101. package/dist/core/scaffold/ui-generator.d.ts.map +1 -1
  102. package/dist/core/scaffold/ui-generator.js +768 -663
  103. package/dist/core/scaffold/ui-generator.js.map +1 -1
  104. package/dist/database/base-model.d.ts +3 -3
  105. package/dist/database/base-model.js +3 -3
  106. package/dist/index.d.ts +2 -2
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +2 -1
  109. package/dist/index.js.map +1 -1
  110. package/dist/machine/contracts.d.ts +16 -0
  111. package/dist/machine/contracts.d.ts.map +1 -0
  112. package/dist/machine/contracts.js +3 -0
  113. package/dist/machine/contracts.js.map +1 -0
  114. package/dist/machine/errors.d.ts +11 -0
  115. package/dist/machine/errors.d.ts.map +1 -0
  116. package/dist/machine/errors.js +34 -0
  117. package/dist/machine/errors.js.map +1 -0
  118. package/dist/machine/index.d.ts +3 -0
  119. package/dist/machine/index.d.ts.map +1 -0
  120. package/dist/machine/index.js +156 -0
  121. package/dist/machine/index.js.map +1 -0
  122. package/dist/mcp/index.d.ts +25 -0
  123. package/dist/mcp/index.d.ts.map +1 -0
  124. package/dist/mcp/index.js +184 -0
  125. package/dist/mcp/index.js.map +1 -0
  126. package/dist/types/index.d.ts +65 -0
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/utils/package-manager.d.ts +109 -0
  129. package/dist/utils/package-manager.d.ts.map +1 -0
  130. package/dist/utils/package-manager.js +215 -0
  131. package/dist/utils/package-manager.js.map +1 -0
  132. package/package.json +85 -73
  133. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +1139 -0
  134. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +194 -0
  135. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +532 -0
  136. package/src/__tests__/auth.test.ts +654 -0
  137. package/src/__tests__/config.test.ts +263 -0
  138. package/src/__tests__/connector-functions-generator.test.ts +288 -0
  139. package/src/__tests__/connector-mock-server.test.ts +439 -0
  140. package/src/__tests__/connector-model-bff.test.ts +162 -0
  141. package/src/__tests__/dev-seeds.test.ts +112 -0
  142. package/src/__tests__/dev.test.ts +154 -0
  143. package/src/__tests__/fixtures.ts +144 -0
  144. package/src/__tests__/functions-generator.test.ts +237 -0
  145. package/src/__tests__/init.test.ts +80 -0
  146. package/src/__tests__/machine.test.ts +212 -0
  147. package/src/__tests__/mcp.test.ts +56 -0
  148. package/src/__tests__/model-parser.test.ts +72 -0
  149. package/src/__tests__/nextjs-generator.test.ts +97 -0
  150. package/src/__tests__/openapi-generator.test.ts +43 -0
  151. package/src/__tests__/package-manager.test.ts +189 -0
  152. package/src/__tests__/scaffold.test.ts +39 -0
  153. package/src/__tests__/string-utils.test.ts +75 -0
  154. package/src/__tests__/ui-generator.test.ts +144 -0
  155. package/src/__tests__/zod-mock-generator.test.ts +132 -0
  156. package/src/cli/commands/add-auth.ts +500 -0
  157. package/src/cli/commands/add-connector.ts +158 -0
  158. package/src/cli/commands/create-model.ts +62 -0
  159. package/src/cli/commands/dev-seeds.ts +358 -0
  160. package/src/cli/commands/dev.ts +962 -0
  161. package/src/cli/commands/index.ts +9 -0
  162. package/src/cli/commands/init.ts +3371 -0
  163. package/src/cli/commands/provision.ts +193 -0
  164. package/src/cli/commands/scaffold.ts +1211 -0
  165. package/src/cli/index.ts +193 -0
  166. package/src/core/config.ts +308 -0
  167. package/src/core/mock/connector-mock-server.ts +555 -0
  168. package/src/core/mock/zod-mock-generator.ts +205 -0
  169. package/src/core/operations/create-model.ts +174 -0
  170. package/src/core/operations/runtime.ts +235 -0
  171. package/src/core/operations/scaffold-machine.ts +91 -0
  172. package/src/core/project/manifest.ts +402 -0
  173. package/src/core/project/validation.ts +221 -0
  174. package/src/core/scaffold/auth-generator.ts +1284 -0
  175. package/src/core/scaffold/connector-functions-generator.ts +1128 -0
  176. package/src/core/scaffold/functions-generator.ts +970 -0
  177. package/src/core/scaffold/model-parser.ts +841 -0
  178. package/src/core/scaffold/nextjs-generator.ts +370 -0
  179. package/src/core/scaffold/openapi-generator.ts +212 -0
  180. package/src/core/scaffold/ui-generator.ts +1061 -0
  181. package/src/database/base-model.ts +184 -0
  182. package/src/database/client.ts +140 -0
  183. package/src/database/repository.ts +104 -0
  184. package/src/database/runtime-check.ts +25 -0
  185. package/src/index.ts +27 -0
  186. package/src/machine/contracts.ts +17 -0
  187. package/src/machine/errors.ts +34 -0
  188. package/src/machine/index.ts +173 -0
  189. package/src/mcp/index.ts +185 -0
  190. package/src/types/index.ts +134 -0
  191. package/src/utils/package-manager.ts +229 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * コネクタモデル用モックサーバー
3
+ * - コネクタモデルへのリクエスト → Zodベースのインメモリ CRUD で応答
4
+ * - その他のリクエスト → 実Azure Functions へプロキシ
5
+ */
6
+ import { ModelInfo } from "../scaffold/model-parser";
7
+ export interface ConnectorMockServerOptions {
8
+ /** モックサーバーのリッスンポート */
9
+ port: number;
10
+ /** Azure Functions の転送先ホスト:ポート(例: "localhost:7071") */
11
+ functionsTarget: string;
12
+ /** コネクタモデル一覧 */
13
+ connectorModels: ModelInfo[];
14
+ /** 全モデル一覧(dev-seeds 読み込み用) */
15
+ allModels?: ModelInfo[];
16
+ /** dev-seeds 環境名(指定時はシードデータを初期データとして読み込む) */
17
+ seedEnv?: string;
18
+ /** dev-seeds ディレクトリ */
19
+ seedsDir?: string;
20
+ /** 各モデルの初期生成レコード数(デフォルト: 5) */
21
+ mockCount?: number;
22
+ /** ホスト名 */
23
+ host?: string;
24
+ /** Auth config — auth functions use RDB connector, mocked the same way */
25
+ authConfig?: {
26
+ /** JWT secret for mock token generation/verification */
27
+ jwtSecret: string;
28
+ /** Token expiry (e.g., '24h') */
29
+ tokenExpiry?: string;
30
+ /** Custom JWT config from swallowkit.config.js */
31
+ customJwt?: {
32
+ /** RDB table name that holds user records (e.g., "users") */
33
+ userTable: string;
34
+ loginIdColumn: string;
35
+ passwordHashColumn: string;
36
+ rolesColumn: string;
37
+ };
38
+ /** Default auth policy: 'authenticated' = all models need auth, 'anonymous' = only models with authPolicy */
39
+ defaultPolicy?: "authenticated" | "anonymous";
40
+ };
41
+ }
42
+ type MockDocument = Record<string, unknown>;
43
+ /**
44
+ * コネクタモデル用モックサーバー
45
+ */
46
+ export declare class ConnectorMockServer {
47
+ private server;
48
+ private stores;
49
+ private routeMap;
50
+ private options;
51
+ constructor(options: ConnectorMockServerOptions);
52
+ /**
53
+ * モックデータを初期化し、サーバーを起動
54
+ */
55
+ start(): Promise<void>;
56
+ /**
57
+ * サーバーを停止
58
+ */
59
+ stop(): Promise<void>;
60
+ /**
61
+ * 特定モデルの現在のストアデータを取得(テスト用)
62
+ */
63
+ getStore(modelName: string): MockDocument[];
64
+ private initializeStores;
65
+ private handleRequest;
66
+ /**
67
+ * URL パス解析: /api/backlogIssue/123 → { route: "backlogIssue", id: "123" }
68
+ */
69
+ private parseRoute;
70
+ private handleMockCrud;
71
+ /**
72
+ * コネクタモデル以外のリクエストをAzure Functionsへプロキシ
73
+ */
74
+ private proxyToFunctions;
75
+ private handleAuthRequest;
76
+ private handleLogin;
77
+ private handleMe;
78
+ /**
79
+ * authConfig.customJwt.userTable に対応するモデルのストアを返す。
80
+ * ユーザーテーブルが見つからない場合は null を返す。
81
+ */
82
+ private resolveUserStore;
83
+ /**
84
+ * JWT を検証し、ペイロード(roles 含む)を返す。
85
+ * 認証不要な場合は null を返す。401/403 の場合はレスポンスを送信して 'error' を返す。
86
+ */
87
+ private checkAuth;
88
+ /**
89
+ * モデルの authPolicy から read/write に必要なロールを解決
90
+ */
91
+ private resolveRequiredRoles;
92
+ private readBody;
93
+ private sendJson;
94
+ /**
95
+ * リクエストボディを完全に読み捨ててからレスポンスを送信
96
+ * POST/PUT の 405 等で未読ボディがある場合に Linux で RST を防ぐ
97
+ */
98
+ private drainAndRespond;
99
+ }
100
+ export {};
101
+ //# sourceMappingURL=connector-mock-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-mock-server.d.ts","sourceRoot":"","sources":["../../../src/core/mock/connector-mock-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,SAAS,EAAe,MAAM,0BAA0B,CAAC;AAIlE,MAAM,WAAW,0BAA0B;IACzC,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB;IAChB,eAAe,EAAE,SAAS,EAAE,CAAC;IAC7B,8BAA8B;IAC9B,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,UAAU,CAAC,EAAE;QACX,wDAAwD;QACxD,SAAS,EAAE,MAAM,CAAC;QAClB,iCAAiC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kDAAkD;QAClD,SAAS,CAAC,EAAE;YACV,6DAA6D;YAC7D,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,CAAC;YACtB,kBAAkB,EAAE,MAAM,CAAC;YAC3B,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;QACF,6GAA6G;QAC7G,aAAa,CAAC,EAAE,eAAe,GAAG,WAAW,CAAC;KAC/C,CAAC;CACH;AAED,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,OAAO,CAA6B;gBAEhC,OAAO,EAAE,0BAA0B;IAU/C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAcrB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;YAO7B,gBAAgB;IA+B9B,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,cAAc;IAiFtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,WAAW;IA6EnB,OAAO,CAAC,QAAQ;IA0BhB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;OAGG;IACH,OAAO,CAAC,SAAS;IA6CjB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,QAAQ;IAahB;;;OAGG;IACH,OAAO,CAAC,eAAe;CAexB"}
@@ -0,0 +1,480 @@
1
+ "use strict";
2
+ /**
3
+ * コネクタモデル用モックサーバー
4
+ * - コネクタモデルへのリクエスト → Zodベースのインメモリ CRUD で応答
5
+ * - その他のリクエスト → 実Azure Functions へプロキシ
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.ConnectorMockServer = void 0;
45
+ const http = __importStar(require("http"));
46
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
47
+ const model_parser_1 = require("../scaffold/model-parser");
48
+ const zod_mock_generator_1 = require("./zod-mock-generator");
49
+ const dev_seeds_1 = require("../../cli/commands/dev-seeds");
50
+ /**
51
+ * コネクタモデル用モックサーバー
52
+ */
53
+ class ConnectorMockServer {
54
+ constructor(options) {
55
+ this.server = null;
56
+ this.stores = new Map();
57
+ this.routeMap = new Map(); // route → model
58
+ this.options = options;
59
+ // ルートマップを構築: モデル名(camelCase) → ModelInfo
60
+ for (const model of options.connectorModels) {
61
+ const route = (0, model_parser_1.toCamelCase)(model.name);
62
+ this.routeMap.set(route, model);
63
+ }
64
+ }
65
+ /**
66
+ * モックデータを初期化し、サーバーを起動
67
+ */
68
+ async start() {
69
+ await this.initializeStores();
70
+ return new Promise((resolve, reject) => {
71
+ this.server = http.createServer((req, res) => {
72
+ this.handleRequest(req, res);
73
+ });
74
+ this.server.on("error", reject);
75
+ this.server.listen(this.options.port, this.options.host || "localhost", () => {
76
+ resolve();
77
+ });
78
+ });
79
+ }
80
+ /**
81
+ * サーバーを停止
82
+ */
83
+ stop() {
84
+ return new Promise((resolve) => {
85
+ if (this.server) {
86
+ // Force close keep-alive connections (Node.js 18.2+)
87
+ if (typeof this.server.closeAllConnections === "function") {
88
+ this.server.closeAllConnections();
89
+ }
90
+ this.server.close(() => resolve());
91
+ }
92
+ else {
93
+ resolve();
94
+ }
95
+ });
96
+ }
97
+ /**
98
+ * 特定モデルの現在のストアデータを取得(テスト用)
99
+ */
100
+ getStore(modelName) {
101
+ const route = (0, model_parser_1.toCamelCase)(modelName);
102
+ return this.stores.get(route) || [];
103
+ }
104
+ // ─── Internal ─────────────────────────────────────────────
105
+ async initializeStores() {
106
+ const allModels = this.options.allModels || this.options.connectorModels;
107
+ const mockCount = this.options.mockCount ?? 5;
108
+ // まず Zod ベースのモックデータで初期化
109
+ for (const model of this.options.connectorModels) {
110
+ const route = (0, model_parser_1.toCamelCase)(model.name);
111
+ this.stores.set(route, (0, zod_mock_generator_1.generateMockDocuments)(model, mockCount, allModels));
112
+ }
113
+ // dev-seeds があれば上書き
114
+ if (this.options.seedEnv) {
115
+ try {
116
+ const seedFiles = await (0, dev_seeds_1.loadDevSeedFiles)(this.options.seedEnv, this.options.connectorModels, this.options.seedsDir);
117
+ for (const seedFile of seedFiles) {
118
+ const route = (0, model_parser_1.toCamelCase)(seedFile.model.name);
119
+ if (this.stores.has(route)) {
120
+ this.stores.set(route, seedFile.documents);
121
+ console.log(` 📂 Loaded ${seedFile.documents.length} seed doc(s) for ${seedFile.model.name}`);
122
+ }
123
+ }
124
+ }
125
+ catch (err) {
126
+ console.warn(`⚠️ Failed to load dev-seeds for connectors: ${err.message}`);
127
+ }
128
+ }
129
+ }
130
+ handleRequest(req, res) {
131
+ const { route, id } = this.parseRoute(req.url || "");
132
+ // Auth endpoints (when authConfig is set)
133
+ if (this.options.authConfig && route === "auth") {
134
+ this.handleAuthRequest(req, res, id);
135
+ return;
136
+ }
137
+ // コネクタモデルのルートか判定
138
+ if (route && this.routeMap.has(route)) {
139
+ this.handleMockCrud(req, res, route, id);
140
+ }
141
+ else {
142
+ this.proxyToFunctions(req, res);
143
+ }
144
+ }
145
+ /**
146
+ * URL パス解析: /api/backlogIssue/123 → { route: "backlogIssue", id: "123" }
147
+ */
148
+ parseRoute(url) {
149
+ const parsed = new URL(url, "http://localhost");
150
+ const segments = parsed.pathname.split("/").filter(Boolean);
151
+ // /api/<route> or /api/<route>/<id>
152
+ if (segments.length >= 2 && segments[0] === "api") {
153
+ return {
154
+ route: segments[1],
155
+ id: segments.length >= 3 ? segments[2] : null,
156
+ };
157
+ }
158
+ return { route: null, id: null };
159
+ }
160
+ handleMockCrud(req, res, route, id) {
161
+ const method = (req.method || "GET").toUpperCase();
162
+ const store = this.stores.get(route) || [];
163
+ const model = this.routeMap.get(route);
164
+ const ops = model.connectorConfig?.operations || [];
165
+ const isWrite = method === "POST" || method === "PUT" || method === "DELETE";
166
+ const requiredRoles = this.resolveRequiredRoles(model, isWrite);
167
+ const authResult = this.checkAuth(req, res, model, requiredRoles);
168
+ if (authResult === "error")
169
+ return; // 401/403 already sent
170
+ switch (method) {
171
+ case "GET":
172
+ req.resume();
173
+ if (id) {
174
+ if (!ops.includes("getById")) {
175
+ return this.sendJson(res, 405, { error: "getById not supported" });
176
+ }
177
+ const item = store.find((doc) => doc.id === id);
178
+ return item
179
+ ? this.sendJson(res, 200, item)
180
+ : this.sendJson(res, 404, { error: "Item not found" });
181
+ }
182
+ if (!ops.includes("getAll")) {
183
+ return this.sendJson(res, 405, { error: "getAll not supported" });
184
+ }
185
+ return this.sendJson(res, 200, store);
186
+ case "POST":
187
+ if (!ops.includes("create")) {
188
+ return this.drainAndRespond(req, res, 405, { error: "create not supported" });
189
+ }
190
+ this.readBody(req, (body) => {
191
+ if (!body.id) {
192
+ body.id = `${route}-${Date.now()}`;
193
+ }
194
+ body.createdAt = body.createdAt || new Date().toISOString();
195
+ body.updatedAt = body.updatedAt || new Date().toISOString();
196
+ store.push(body);
197
+ this.sendJson(res, 201, body);
198
+ });
199
+ return;
200
+ case "PUT":
201
+ if (!ops.includes("update")) {
202
+ return this.drainAndRespond(req, res, 405, { error: "update not supported" });
203
+ }
204
+ if (!id)
205
+ return this.drainAndRespond(req, res, 400, { error: "id required" });
206
+ this.readBody(req, (body) => {
207
+ const idx = store.findIndex((doc) => doc.id === id);
208
+ if (idx === -1)
209
+ return this.sendJson(res, 404, { error: "Item not found" });
210
+ body.updatedAt = new Date().toISOString();
211
+ store[idx] = { ...store[idx], ...body, id };
212
+ this.sendJson(res, 200, store[idx]);
213
+ });
214
+ return;
215
+ case "DELETE":
216
+ {
217
+ req.resume();
218
+ if (!ops.includes("delete")) {
219
+ return this.sendJson(res, 405, { error: "delete not supported" });
220
+ }
221
+ if (!id)
222
+ return this.sendJson(res, 400, { error: "id required" });
223
+ const deleteIdx = store.findIndex((doc) => doc.id === id);
224
+ if (deleteIdx === -1)
225
+ return this.sendJson(res, 404, { error: "Item not found" });
226
+ store.splice(deleteIdx, 1);
227
+ return this.sendJson(res, 204, null);
228
+ }
229
+ default:
230
+ req.resume();
231
+ return this.sendJson(res, 405, { error: `Method ${method} not allowed` });
232
+ }
233
+ }
234
+ /**
235
+ * コネクタモデル以外のリクエストをAzure Functionsへプロキシ
236
+ */
237
+ proxyToFunctions(req, res) {
238
+ const [targetHost, targetPort] = this.options.functionsTarget.split(":");
239
+ const proxyOpts = {
240
+ hostname: targetHost,
241
+ port: parseInt(targetPort, 10),
242
+ path: req.url,
243
+ method: req.method,
244
+ headers: { ...req.headers, host: this.options.functionsTarget },
245
+ };
246
+ const proxyReq = http.request(proxyOpts, (proxyRes) => {
247
+ res.writeHead(proxyRes.statusCode || 502, proxyRes.headers);
248
+ proxyRes.pipe(res, { end: true });
249
+ });
250
+ proxyReq.on("error", (err) => {
251
+ // Functions がまだ起動していない場合
252
+ this.sendJson(res, 502, {
253
+ error: "Azure Functions not available",
254
+ detail: err.message,
255
+ });
256
+ });
257
+ req.pipe(proxyReq, { end: true });
258
+ }
259
+ // ─── Auth Routes (RDB user queries + JWT generation) ───
260
+ handleAuthRequest(req, res, endpoint) {
261
+ const method = (req.method || "GET").toUpperCase();
262
+ // Handle CORS preflight
263
+ if (method === "OPTIONS") {
264
+ req.resume();
265
+ res.writeHead(200, {
266
+ "Access-Control-Allow-Origin": "*",
267
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
268
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
269
+ });
270
+ res.end();
271
+ return;
272
+ }
273
+ if (endpoint === "login" && method === "POST") {
274
+ this.handleLogin(req, res);
275
+ }
276
+ else if (endpoint === "me" && method === "GET") {
277
+ this.handleMe(req, res);
278
+ }
279
+ else if (endpoint === "logout" && method === "POST") {
280
+ req.resume();
281
+ this.sendJson(res, 200, { message: "Logged out" });
282
+ }
283
+ else {
284
+ req.resume();
285
+ this.sendJson(res, 404, { error: "Auth endpoint not found" });
286
+ }
287
+ }
288
+ handleLogin(req, res) {
289
+ this.readBody(req, (body) => {
290
+ const loginId = body.loginId;
291
+ const password = body.password;
292
+ if (!loginId || !password) {
293
+ return this.sendJson(res, 400, { error: "loginId and password are required" });
294
+ }
295
+ const users = this.resolveUserStore();
296
+ if (!users) {
297
+ return this.sendJson(res, 500, {
298
+ error: "No user model found — ensure a connector model with the configured userTable exists",
299
+ });
300
+ }
301
+ const loginField = this.options.authConfig?.customJwt?.loginIdColumn || "loginId";
302
+ const passwordField = this.options.authConfig?.customJwt?.passwordHashColumn || "password";
303
+ const rolesField = this.options.authConfig?.customJwt?.rolesColumn || "roles";
304
+ const user = users.find((u) => (u[loginField] || u.loginId) === loginId);
305
+ if (!user) {
306
+ return this.sendJson(res, 401, { error: "Invalid credentials" });
307
+ }
308
+ // Plaintext password comparison (mock mode only)
309
+ const storedPassword = (user[passwordField] || user.password);
310
+ if (storedPassword !== password) {
311
+ return this.sendJson(res, 401, { error: "Invalid credentials" });
312
+ }
313
+ // Parse roles
314
+ let roles = [];
315
+ const rolesValue = user[rolesField] || user.roles;
316
+ if (Array.isArray(rolesValue)) {
317
+ roles = rolesValue;
318
+ }
319
+ else if (typeof rolesValue === "string") {
320
+ try {
321
+ roles = JSON.parse(rolesValue);
322
+ }
323
+ catch {
324
+ roles = rolesValue.split(",").map((r) => r.trim());
325
+ }
326
+ }
327
+ const authUser = {
328
+ id: String(user.id),
329
+ loginId: String(user[loginField] || user.loginId),
330
+ name: String(user.name || user[loginField] || user.loginId),
331
+ email: String(user.email || ""),
332
+ roles,
333
+ };
334
+ // Generate JWT
335
+ const secret = this.options.authConfig.jwtSecret;
336
+ const expiry = (this.options.authConfig.tokenExpiry || "24h");
337
+ const token = jsonwebtoken_1.default.sign({
338
+ sub: authUser.id,
339
+ loginId: authUser.loginId,
340
+ name: authUser.name,
341
+ email: authUser.email,
342
+ roles: authUser.roles,
343
+ }, secret, { expiresIn: expiry });
344
+ const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();
345
+ this.sendJson(res, 200, { user: authUser, token, expiresAt });
346
+ });
347
+ }
348
+ handleMe(req, res) {
349
+ req.resume();
350
+ const authHeader = req.headers["authorization"];
351
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
352
+ return this.sendJson(res, 401, { error: "Missing or invalid Authorization header" });
353
+ }
354
+ const token = authHeader.slice(7);
355
+ try {
356
+ const secret = this.options.authConfig.jwtSecret;
357
+ const payload = jsonwebtoken_1.default.verify(token, secret);
358
+ this.sendJson(res, 200, {
359
+ sub: payload.sub,
360
+ loginId: payload.loginId,
361
+ name: payload.name,
362
+ email: payload.email,
363
+ roles: payload.roles,
364
+ });
365
+ }
366
+ catch {
367
+ this.sendJson(res, 401, { error: "Invalid or expired token" });
368
+ }
369
+ }
370
+ // ─── Utilities ────────────────────────────────────────────
371
+ /**
372
+ * authConfig.customJwt.userTable に対応するモデルのストアを返す。
373
+ * ユーザーテーブルが見つからない場合は null を返す。
374
+ */
375
+ resolveUserStore() {
376
+ const userTable = this.options.authConfig?.customJwt?.userTable;
377
+ if (!userTable)
378
+ return null;
379
+ for (const model of this.options.connectorModels) {
380
+ const cfg = model.connectorConfig;
381
+ if (cfg && "table" in cfg && cfg.table === userTable) {
382
+ return this.stores.get((0, model_parser_1.toCamelCase)(model.name)) || null;
383
+ }
384
+ }
385
+ return null;
386
+ }
387
+ /**
388
+ * JWT を検証し、ペイロード(roles 含む)を返す。
389
+ * 認証不要な場合は null を返す。401/403 の場合はレスポンスを送信して 'error' を返す。
390
+ */
391
+ checkAuth(req, res, model, requiredRoles) {
392
+ const authCfg = this.options.authConfig;
393
+ if (!authCfg)
394
+ return null; // auth 未設定 → 全スルー
395
+ const policy = model.authPolicy;
396
+ const defaultPolicy = authCfg.defaultPolicy || "anonymous";
397
+ // モデルに authPolicy がなく defaultPolicy が anonymous → 認証不要
398
+ if (!policy && defaultPolicy === "anonymous")
399
+ return null;
400
+ // JWT 検証
401
+ const authHeader = req.headers["authorization"];
402
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
403
+ this.sendJson(res, 401, { error: "Missing or invalid Authorization header" });
404
+ return "error";
405
+ }
406
+ const token = authHeader.slice(7);
407
+ try {
408
+ const payload = jsonwebtoken_1.default.verify(token, authCfg.jwtSecret);
409
+ // ロールチェック
410
+ if (requiredRoles && requiredRoles.length > 0) {
411
+ const userRoles = Array.isArray(payload.roles) ? payload.roles : [];
412
+ const hasRole = requiredRoles.some((r) => userRoles.includes(r));
413
+ if (!hasRole) {
414
+ this.sendJson(res, 403, {
415
+ error: `Requires one of roles: ${requiredRoles.join(", ")}`,
416
+ });
417
+ return "error";
418
+ }
419
+ }
420
+ return payload;
421
+ }
422
+ catch {
423
+ this.sendJson(res, 401, { error: "Invalid or expired token" });
424
+ return "error";
425
+ }
426
+ }
427
+ /**
428
+ * モデルの authPolicy から read/write に必要なロールを解決
429
+ */
430
+ resolveRequiredRoles(model, isWrite) {
431
+ const policy = model.authPolicy;
432
+ if (!policy)
433
+ return undefined; // defaultPolicy: authenticated → 認証のみ、ロールチェック不要
434
+ if (isWrite) {
435
+ return policy.write || policy.roles;
436
+ }
437
+ return policy.read || policy.roles;
438
+ }
439
+ readBody(req, callback) {
440
+ let data = "";
441
+ req.on("data", (chunk) => (data += chunk));
442
+ req.on("end", () => {
443
+ try {
444
+ callback(JSON.parse(data));
445
+ }
446
+ catch {
447
+ callback({});
448
+ }
449
+ });
450
+ }
451
+ sendJson(res, status, body) {
452
+ res.writeHead(status, {
453
+ "Content-Type": "application/json",
454
+ "Access-Control-Allow-Origin": "*",
455
+ "Connection": "close",
456
+ });
457
+ if (body !== null && body !== undefined) {
458
+ res.end(JSON.stringify(body));
459
+ }
460
+ else {
461
+ res.end();
462
+ }
463
+ }
464
+ /**
465
+ * リクエストボディを完全に読み捨ててからレスポンスを送信
466
+ * POST/PUT の 405 等で未読ボディがある場合に Linux で RST を防ぐ
467
+ */
468
+ drainAndRespond(req, res, status, body) {
469
+ if (req.readableEnded) {
470
+ this.sendJson(res, status, body);
471
+ return;
472
+ }
473
+ req.resume();
474
+ req.on("end", () => {
475
+ this.sendJson(res, status, body);
476
+ });
477
+ }
478
+ }
479
+ exports.ConnectorMockServer = ConnectorMockServer;
480
+ //# sourceMappingURL=connector-mock-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-mock-server.js","sourceRoot":"","sources":["../../../src/core/mock/connector-mock-server.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAC7B,gEAAgD;AAChD,2DAAkE;AAClE,6DAA6D;AAC7D,4DAAgE;AAwChE;;GAEG;AACH,MAAa,mBAAmB;IAM9B,YAAY,OAAmC;QALvC,WAAM,GAAuB,IAAI,CAAC;QAClC,WAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;QAC3C,aAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC,CAAC,gBAAgB;QAI/D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,yCAAyC;QACzC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC3C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,GAAG,EAAE;gBAC3E,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,qDAAqD;gBACrD,IAAI,OAAQ,IAAI,CAAC,MAAc,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;oBAClE,IAAI,CAAC,MAAc,CAAC,mBAAmB,EAAE,CAAC;gBAC7C,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAiB;QACxB,MAAM,KAAK,GAAG,IAAA,0BAAW,EAAC,SAAS,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,6DAA6D;IAErD,KAAK,CAAC,gBAAgB;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;QAE9C,wBAAwB;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAA,0CAAqB,EAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAA,4BAAgB,EACtC,IAAI,CAAC,OAAO,CAAC,OAAO,EACpB,IAAI,CAAC,OAAO,CAAC,eAAe,EAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CACtB,CAAC;gBACF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,KAAK,GAAG,IAAA,0BAAW,EAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,SAA2B,CAAC,CAAC;wBAC7D,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,SAAS,CAAC,MAAM,oBAAoB,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjG,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,gDAAiD,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,GAAyB,EAAE,GAAwB;QACvE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAErD,0CAA0C;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAChD,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,GAAW;QAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5D,oCAAoC;QACpC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YAClD,OAAO;gBACL,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAClB,EAAE,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;aAC9C,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAEO,cAAc,CACpB,GAAyB,EACzB,GAAwB,EACxB,KAAa,EACb,EAAiB;QAEjB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,EAAE,UAAU,IAAI,EAAE,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,CAAC;QAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAClE,IAAI,UAAU,KAAK,OAAO;YAAE,OAAO,CAAC,uBAAuB;QAE3D,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,IAAI,EAAE,EAAE,CAAC;oBACP,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;oBACrE,CAAC;oBACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;oBAChD,OAAO,IAAI;wBACT,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;wBAC/B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;gBACpE,CAAC;gBACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAExC,KAAK,MAAM;gBACT,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;gBAChF,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;wBACb,IAAI,CAAC,EAAE,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;oBACrC,CAAC;oBACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBAC5D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;gBACH,OAAO;YAET,KAAK,KAAK;gBACR,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;gBAChF,CAAC;gBACD,IAAI,CAAC,EAAE;oBAAE,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC9E,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;oBACpD,IAAI,GAAG,KAAK,CAAC,CAAC;wBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;oBAC5E,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBAC1C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC;oBAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC;gBACH,OAAO;YAET,KAAK,QAAQ;gBACX,CAAC;oBACC,GAAG,CAAC,MAAM,EAAE,CAAC;oBACb,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;oBACpE,CAAC;oBACD,IAAI,CAAC,EAAE;wBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;oBAClE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1D,IAAI,SAAS,KAAK,CAAC,CAAC;wBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;oBAClF,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;oBAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACvC,CAAC;YAEH;gBACE,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,MAAM,cAAc,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,GAAyB,EAAE,GAAwB;QAC1E,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEzE,MAAM,SAAS,GAAwB;YACrC,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;YAC9B,IAAI,EAAE,GAAG,CAAC,GAAG;YACb,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;SAChE,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;YACpD,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3B,yBAAyB;YACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;gBACtB,KAAK,EAAE,+BAA+B;gBACtC,MAAM,EAAE,GAAG,CAAC,OAAO;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,0DAA0D;IAElD,iBAAiB,CACvB,GAAyB,EACzB,GAAwB,EACxB,QAAuB;QAEvB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAEnD,wBAAwB;QACxB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,6BAA6B,EAAE,GAAG;gBAClC,8BAA8B,EAAE,oBAAoB;gBACpD,8BAA8B,EAAE,6BAA6B;aAC9D,CAAC,CAAC;YACH,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9C,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,QAAQ,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtD,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,GAAyB,EAAE,GAAwB;QACrE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;YAEzC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACjF,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;oBAC7B,KAAK,EAAE,qFAAqF;iBAC7F,CAAC,CAAC;YACL,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,IAAI,SAAS,CAAC;YAClF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,kBAAkB,IAAI,UAAU,CAAC;YAC3F,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,IAAI,OAAO,CAAC;YAE9E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,OAAO,CAChD,CAAC;YAEF,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,iDAAiD;YACjD,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAW,CAAC;YACxE,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,cAAc;YACd,IAAI,KAAK,GAAa,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;YAClD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,KAAK,GAAG,UAAsB,CAAC;YACjC,CAAC;iBAAM,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC1C,IAAI,CAAC;oBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,GAAI,UAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG;gBACf,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;gBACjD,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;gBAC3D,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/B,KAAK;aACN,CAAC;YAEF,eAAe;YACf,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAW,CAAC,SAAS,CAAC;YAClD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAW,CAAC,WAAW,IAAI,KAAK,CAA6B,CAAC;YAE3F,MAAM,KAAK,GAAG,sBAAG,CAAC,IAAI,CACpB;gBACE,GAAG,EAAE,QAAQ,CAAC,EAAE;gBAChB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;aACtB,EACD,MAAM,EACN,EAAE,SAAS,EAAE,MAAM,EAAE,CACtB,CAAC;YAEF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAE3E,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,GAAyB,EAAE,GAAwB;QAClE,GAAG,CAAC,MAAM,EAAE,CAAC;QAEb,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAW,CAAC,SAAS,CAAC;YAClD,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAA4B,CAAC;YACrE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;gBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,6DAA6D;IAE7D;;;OAGG;IACK,gBAAgB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;QAChE,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACjD,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC;YAClC,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,SAAS,CACf,GAAyB,EACzB,GAAwB,EACxB,KAAgB,EAChB,aAAmC;QAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB;QAE7C,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;QAChC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,WAAW,CAAC;QAE3D,uDAAuD;QACvD,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAE1D,SAAS;QACT,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;YAC9E,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAA4B,CAAC;YAEhF,UAAU;YACV,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,KAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;wBACtB,KAAK,EAAE,0BAA0B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBAC5D,CAAC,CAAC;oBACH,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC/D,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,KAAgB,EAChB,OAAgB;QAEhB,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC,CAAC,gDAAgD;QAE/E,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC;IACrC,CAAC;IAEO,QAAQ,CAAC,GAAyB,EAAE,QAAsC;QAChF,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;QAC3C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,EAAE,CAAC,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,GAAwB,EAAE,MAAc,EAAE,IAAa;QACtE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;YACpB,cAAc,EAAE,kBAAkB;YAClC,6BAA6B,EAAE,GAAG;YAClC,YAAY,EAAE,OAAO;SACtB,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,eAAe,CACrB,GAAyB,EACzB,GAAwB,EACxB,MAAc,EACd,IAAa;QAEb,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AArfD,kDAqfC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Zod スキーマ(ModelInfo)からモックデータを自動生成する
3
+ * フィールド名・型のヒューリスティクスで現実的な値を生成
4
+ */
5
+ import { ModelInfo } from "../scaffold/model-parser";
6
+ /**
7
+ * 単一のモックドキュメントを生成
8
+ */
9
+ export declare function generateMockDocument(model: ModelInfo, index: number, allModels?: ModelInfo[], seenModels?: Set<string>): Record<string, unknown>;
10
+ /**
11
+ * 複数のモックドキュメントを生成
12
+ */
13
+ export declare function generateMockDocuments(model: ModelInfo, count?: number, allModels?: ModelInfo[]): Record<string, unknown>[];
14
+ //# sourceMappingURL=zod-mock-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-mock-generator.d.ts","sourceRoot":"","sources":["../../../src/core/mock/zod-mock-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAuC,MAAM,0BAA0B,CAAC;AAE1F;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,SAAS,EAAY,EAChC,UAAU,GAAE,GAAG,CAAC,MAAM,CAAa,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAChB,KAAK,GAAE,MAAU,EACjB,SAAS,GAAE,SAAS,EAAY,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAM3B"}