swallowkit 1.0.0-beta.3 → 1.0.0-beta.31

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 (201) hide show
  1. package/LICENSE +21 -21
  2. package/README.ja.md +353 -215
  3. package/README.md +406 -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 +57 -0
  21. package/dist/cli/commands/dev-seeds.d.ts.map +1 -0
  22. package/dist/cli/commands/dev-seeds.js +470 -0
  23. package/dist/cli/commands/dev-seeds.js.map +1 -0
  24. package/dist/cli/commands/dev.d.ts +33 -0
  25. package/dist/cli/commands/dev.d.ts.map +1 -1
  26. package/dist/cli/commands/dev.js +628 -146
  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 +15 -0
  33. package/dist/cli/commands/init.d.ts.map +1 -1
  34. package/dist/cli/commands/init.js +2696 -1706
  35. package/dist/cli/commands/init.js.map +1 -1
  36. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  37. package/dist/cli/commands/scaffold.js +448 -129
  38. package/dist/cli/commands/scaffold.js.map +1 -1
  39. package/dist/cli/index.d.ts +5 -1
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +200 -42
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/core/config.d.ts +8 -2
  44. package/dist/core/config.d.ts.map +1 -1
  45. package/dist/core/config.js +94 -5
  46. package/dist/core/config.js.map +1 -1
  47. package/dist/core/mock/connector-mock-server.d.ts +101 -0
  48. package/dist/core/mock/connector-mock-server.d.ts.map +1 -0
  49. package/dist/core/mock/connector-mock-server.js +480 -0
  50. package/dist/core/mock/connector-mock-server.js.map +1 -0
  51. package/dist/core/mock/zod-mock-generator.d.ts +14 -0
  52. package/dist/core/mock/zod-mock-generator.d.ts.map +1 -0
  53. package/dist/core/mock/zod-mock-generator.js +163 -0
  54. package/dist/core/mock/zod-mock-generator.js.map +1 -0
  55. package/dist/core/operations/create-model.d.ts +15 -0
  56. package/dist/core/operations/create-model.d.ts.map +1 -0
  57. package/dist/core/operations/create-model.js +171 -0
  58. package/dist/core/operations/create-model.js.map +1 -0
  59. package/dist/core/operations/runtime.d.ts +32 -0
  60. package/dist/core/operations/runtime.d.ts.map +1 -0
  61. package/dist/core/operations/runtime.js +225 -0
  62. package/dist/core/operations/runtime.js.map +1 -0
  63. package/dist/core/operations/scaffold-machine.d.ts +16 -0
  64. package/dist/core/operations/scaffold-machine.d.ts.map +1 -0
  65. package/dist/core/operations/scaffold-machine.js +63 -0
  66. package/dist/core/operations/scaffold-machine.js.map +1 -0
  67. package/dist/core/project/manifest.d.ts +92 -0
  68. package/dist/core/project/manifest.d.ts.map +1 -0
  69. package/dist/core/project/manifest.js +321 -0
  70. package/dist/core/project/manifest.js.map +1 -0
  71. package/dist/core/project/validation.d.ts +20 -0
  72. package/dist/core/project/validation.d.ts.map +1 -0
  73. package/dist/core/project/validation.js +209 -0
  74. package/dist/core/project/validation.js.map +1 -0
  75. package/dist/core/scaffold/auth-generator.d.ts +38 -0
  76. package/dist/core/scaffold/auth-generator.d.ts.map +1 -0
  77. package/dist/core/scaffold/auth-generator.js +1244 -0
  78. package/dist/core/scaffold/auth-generator.js.map +1 -0
  79. package/dist/core/scaffold/connector-functions-generator.d.ts +41 -0
  80. package/dist/core/scaffold/connector-functions-generator.d.ts.map +1 -0
  81. package/dist/core/scaffold/connector-functions-generator.js +1027 -0
  82. package/dist/core/scaffold/connector-functions-generator.js.map +1 -0
  83. package/dist/core/scaffold/functions-generator.d.ts +7 -1
  84. package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
  85. package/dist/core/scaffold/functions-generator.js +920 -213
  86. package/dist/core/scaffold/functions-generator.js.map +1 -1
  87. package/dist/core/scaffold/model-parser.d.ts +20 -1
  88. package/dist/core/scaffold/model-parser.d.ts.map +1 -1
  89. package/dist/core/scaffold/model-parser.js +328 -135
  90. package/dist/core/scaffold/model-parser.js.map +1 -1
  91. package/dist/core/scaffold/native-schema-generator.d.ts +13 -0
  92. package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -0
  93. package/dist/core/scaffold/native-schema-generator.js +677 -0
  94. package/dist/core/scaffold/native-schema-generator.js.map +1 -0
  95. package/dist/core/scaffold/nextjs-generator.d.ts +8 -0
  96. package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
  97. package/dist/core/scaffold/nextjs-generator.js +314 -182
  98. package/dist/core/scaffold/nextjs-generator.js.map +1 -1
  99. package/dist/core/scaffold/openapi-generator.d.ts +3 -0
  100. package/dist/core/scaffold/openapi-generator.d.ts.map +1 -0
  101. package/dist/core/scaffold/openapi-generator.js +190 -0
  102. package/dist/core/scaffold/openapi-generator.js.map +1 -0
  103. package/dist/core/scaffold/ui-generator.d.ts +10 -4
  104. package/dist/core/scaffold/ui-generator.d.ts.map +1 -1
  105. package/dist/core/scaffold/ui-generator.js +768 -663
  106. package/dist/core/scaffold/ui-generator.js.map +1 -1
  107. package/dist/database/base-model.d.ts +3 -3
  108. package/dist/database/base-model.js +3 -3
  109. package/dist/index.d.ts +2 -2
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +2 -1
  112. package/dist/index.js.map +1 -1
  113. package/dist/machine/contracts.d.ts +16 -0
  114. package/dist/machine/contracts.d.ts.map +1 -0
  115. package/dist/machine/contracts.js +3 -0
  116. package/dist/machine/contracts.js.map +1 -0
  117. package/dist/machine/errors.d.ts +11 -0
  118. package/dist/machine/errors.d.ts.map +1 -0
  119. package/dist/machine/errors.js +34 -0
  120. package/dist/machine/errors.js.map +1 -0
  121. package/dist/machine/index.d.ts +3 -0
  122. package/dist/machine/index.d.ts.map +1 -0
  123. package/dist/machine/index.js +156 -0
  124. package/dist/machine/index.js.map +1 -0
  125. package/dist/mcp/index.d.ts +25 -0
  126. package/dist/mcp/index.d.ts.map +1 -0
  127. package/dist/mcp/index.js +184 -0
  128. package/dist/mcp/index.js.map +1 -0
  129. package/dist/types/index.d.ts +65 -0
  130. package/dist/types/index.d.ts.map +1 -1
  131. package/dist/utils/package-manager.d.ts +109 -0
  132. package/dist/utils/package-manager.d.ts.map +1 -0
  133. package/dist/utils/package-manager.js +215 -0
  134. package/dist/utils/package-manager.js.map +1 -0
  135. package/dist/utils/python-uv.d.ts +21 -0
  136. package/dist/utils/python-uv.d.ts.map +1 -0
  137. package/dist/utils/python-uv.js +111 -0
  138. package/dist/utils/python-uv.js.map +1 -0
  139. package/package.json +85 -73
  140. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +1139 -0
  141. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +194 -0
  142. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +532 -0
  143. package/src/__tests__/auth.test.ts +654 -0
  144. package/src/__tests__/config.test.ts +274 -0
  145. package/src/__tests__/connector-functions-generator.test.ts +288 -0
  146. package/src/__tests__/connector-mock-server.test.ts +439 -0
  147. package/src/__tests__/connector-model-bff.test.ts +162 -0
  148. package/src/__tests__/dev-seeds.test.ts +173 -0
  149. package/src/__tests__/dev.test.ts +252 -0
  150. package/src/__tests__/fixtures.ts +144 -0
  151. package/src/__tests__/functions-generator.test.ts +237 -0
  152. package/src/__tests__/init.test.ts +115 -0
  153. package/src/__tests__/machine.test.ts +251 -0
  154. package/src/__tests__/mcp.test.ts +117 -0
  155. package/src/__tests__/model-parser.test.ts +52 -0
  156. package/src/__tests__/nextjs-generator.test.ts +97 -0
  157. package/src/__tests__/openapi-generator.test.ts +43 -0
  158. package/src/__tests__/package-manager.test.ts +189 -0
  159. package/src/__tests__/python-uv.test.ts +48 -0
  160. package/src/__tests__/scaffold.test.ts +67 -0
  161. package/src/__tests__/string-utils.test.ts +75 -0
  162. package/src/__tests__/ui-generator.test.ts +144 -0
  163. package/src/__tests__/zod-mock-generator.test.ts +132 -0
  164. package/src/cli/commands/add-auth.ts +500 -0
  165. package/src/cli/commands/add-connector.ts +158 -0
  166. package/src/cli/commands/create-model.ts +62 -0
  167. package/src/cli/commands/dev-seeds.ts +614 -0
  168. package/src/cli/commands/dev.ts +1134 -0
  169. package/src/cli/commands/index.ts +9 -0
  170. package/src/cli/commands/init.ts +3480 -0
  171. package/src/cli/commands/provision.ts +193 -0
  172. package/src/cli/commands/scaffold.ts +1001 -0
  173. package/src/cli/index.ts +196 -0
  174. package/src/core/config.ts +312 -0
  175. package/src/core/mock/connector-mock-server.ts +555 -0
  176. package/src/core/mock/zod-mock-generator.ts +205 -0
  177. package/src/core/operations/create-model.ts +174 -0
  178. package/src/core/operations/runtime.ts +235 -0
  179. package/src/core/operations/scaffold-machine.ts +91 -0
  180. package/src/core/project/manifest.ts +402 -0
  181. package/src/core/project/validation.ts +229 -0
  182. package/src/core/scaffold/auth-generator.ts +1284 -0
  183. package/src/core/scaffold/connector-functions-generator.ts +1128 -0
  184. package/src/core/scaffold/functions-generator.ts +970 -0
  185. package/src/core/scaffold/model-parser.ts +841 -0
  186. package/src/core/scaffold/native-schema-generator.ts +798 -0
  187. package/src/core/scaffold/nextjs-generator.ts +370 -0
  188. package/src/core/scaffold/openapi-generator.ts +212 -0
  189. package/src/core/scaffold/ui-generator.ts +1061 -0
  190. package/src/database/base-model.ts +184 -0
  191. package/src/database/client.ts +140 -0
  192. package/src/database/repository.ts +104 -0
  193. package/src/database/runtime-check.ts +25 -0
  194. package/src/index.ts +27 -0
  195. package/src/machine/contracts.ts +17 -0
  196. package/src/machine/errors.ts +34 -0
  197. package/src/machine/index.ts +173 -0
  198. package/src/mcp/index.ts +185 -0
  199. package/src/types/index.ts +134 -0
  200. package/src/utils/package-manager.ts +229 -0
  201. package/src/utils/python-uv.ts +96 -0
@@ -0,0 +1,22 @@
1
+ import { ModelInfo } from "../core/scaffold/model-parser";
2
+ /**
3
+ * テスト用の基本的な ModelInfo フィクスチャ
4
+ */
5
+ export declare function createBasicModelInfo(overrides?: Partial<ModelInfo>): ModelInfo;
6
+ /**
7
+ * RDB コネクタ (read-only) 付きの ModelInfo フィクスチャ
8
+ */
9
+ export declare function createRdbConnectorModelInfo(overrides?: Partial<ModelInfo>): ModelInfo;
10
+ /**
11
+ * API コネクタ (read-write) 付きの ModelInfo フィクスチャ
12
+ */
13
+ export declare function createApiConnectorModelInfo(overrides?: Partial<ModelInfo>): ModelInfo;
14
+ /**
15
+ * 外部キーを含む ModelInfo フィクスチャ
16
+ */
17
+ export declare function createModelInfoWithForeignKey(): ModelInfo;
18
+ /**
19
+ * enum フィールドを含む ModelInfo フィクスチャ
20
+ */
21
+ export declare function createModelInfoWithEnum(): ModelInfo;
22
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/__tests__/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAqB9E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAuBrF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CA2BrF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,SAAS,CAqBzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,SAAS,CA0BnD"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBasicModelInfo = createBasicModelInfo;
4
+ exports.createRdbConnectorModelInfo = createRdbConnectorModelInfo;
5
+ exports.createApiConnectorModelInfo = createApiConnectorModelInfo;
6
+ exports.createModelInfoWithForeignKey = createModelInfoWithForeignKey;
7
+ exports.createModelInfoWithEnum = createModelInfoWithEnum;
8
+ /**
9
+ * テスト用の基本的な ModelInfo フィクスチャ
10
+ */
11
+ function createBasicModelInfo(overrides) {
12
+ return {
13
+ name: "Todo",
14
+ displayName: "Todo",
15
+ schemaName: "todoSchema",
16
+ filePath: "/models/todo.ts",
17
+ fields: [
18
+ { name: "id", type: "string", isOptional: false, isArray: false },
19
+ { name: "title", type: "string", isOptional: false, isArray: false },
20
+ { name: "description", type: "string", isOptional: true, isArray: false },
21
+ { name: "completed", type: "boolean", isOptional: false, isArray: false },
22
+ { name: "createdAt", type: "string", isOptional: false, isArray: false },
23
+ { name: "updatedAt", type: "string", isOptional: false, isArray: false },
24
+ ],
25
+ hasId: true,
26
+ hasCreatedAt: true,
27
+ hasUpdatedAt: true,
28
+ nestedSchemaRefs: [],
29
+ partitionKey: '/id',
30
+ ...overrides,
31
+ };
32
+ }
33
+ /**
34
+ * RDB コネクタ (read-only) 付きの ModelInfo フィクスチャ
35
+ */
36
+ function createRdbConnectorModelInfo(overrides) {
37
+ return createBasicModelInfo({
38
+ name: "User",
39
+ displayName: "User",
40
+ schemaName: "userSchema",
41
+ filePath: "/models/user.ts",
42
+ fields: [
43
+ { name: "id", type: "string", isOptional: false, isArray: false },
44
+ { name: "employeeCode", type: "string", isOptional: false, isArray: false },
45
+ { name: "name", type: "string", isOptional: false, isArray: false },
46
+ { name: "email", type: "string", isOptional: false, isArray: false },
47
+ { name: "department", type: "string", isOptional: true, isArray: false },
48
+ { name: "createdAt", type: "string", isOptional: true, isArray: false },
49
+ { name: "updatedAt", type: "string", isOptional: true, isArray: false },
50
+ ],
51
+ connectorConfig: {
52
+ connector: "mysql",
53
+ operations: ["getAll", "getById"],
54
+ table: "users",
55
+ idColumn: "id",
56
+ },
57
+ ...overrides,
58
+ });
59
+ }
60
+ /**
61
+ * API コネクタ (read-write) 付きの ModelInfo フィクスチャ
62
+ */
63
+ function createApiConnectorModelInfo(overrides) {
64
+ return createBasicModelInfo({
65
+ name: "BacklogIssue",
66
+ displayName: "BacklogIssue",
67
+ schemaName: "backlogIssueSchema",
68
+ filePath: "/models/backlog-issue.ts",
69
+ fields: [
70
+ { name: "id", type: "string", isOptional: false, isArray: false },
71
+ { name: "projectId", type: "string", isOptional: false, isArray: false },
72
+ { name: "issueKey", type: "string", isOptional: false, isArray: false },
73
+ { name: "summary", type: "string", isOptional: false, isArray: false },
74
+ { name: "description", type: "string", isOptional: true, isArray: false },
75
+ { name: "createdAt", type: "string", isOptional: true, isArray: false },
76
+ { name: "updatedAt", type: "string", isOptional: true, isArray: false },
77
+ ],
78
+ connectorConfig: {
79
+ connector: "backlog",
80
+ operations: ["getAll", "getById", "create", "update"],
81
+ endpoints: {
82
+ getAll: "GET /issues",
83
+ getById: "GET /issues/{id}",
84
+ create: "POST /issues",
85
+ update: "PATCH /issues/{id}",
86
+ },
87
+ },
88
+ ...overrides,
89
+ });
90
+ }
91
+ /**
92
+ * 外部キーを含む ModelInfo フィクスチャ
93
+ */
94
+ function createModelInfoWithForeignKey() {
95
+ return createBasicModelInfo({
96
+ name: "Task",
97
+ displayName: "Task",
98
+ schemaName: "taskSchema",
99
+ filePath: "/models/task.ts",
100
+ fields: [
101
+ { name: "id", type: "string", isOptional: false, isArray: false },
102
+ { name: "title", type: "string", isOptional: false, isArray: false },
103
+ {
104
+ name: "categoryId",
105
+ type: "string",
106
+ isOptional: false,
107
+ isArray: false,
108
+ isForeignKey: true,
109
+ referencedModel: "Category",
110
+ },
111
+ { name: "createdAt", type: "string", isOptional: false, isArray: false },
112
+ { name: "updatedAt", type: "string", isOptional: false, isArray: false },
113
+ ],
114
+ });
115
+ }
116
+ /**
117
+ * enum フィールドを含む ModelInfo フィクスチャ
118
+ */
119
+ function createModelInfoWithEnum() {
120
+ return createBasicModelInfo({
121
+ name: "Issue",
122
+ displayName: "Issue",
123
+ schemaName: "issueSchema",
124
+ filePath: "/models/issue.ts",
125
+ fields: [
126
+ { name: "id", type: "string", isOptional: false, isArray: false },
127
+ { name: "title", type: "string", isOptional: false, isArray: false },
128
+ {
129
+ name: "status",
130
+ type: "string",
131
+ isOptional: false,
132
+ isArray: false,
133
+ enumValues: ["open", "in_progress", "closed"],
134
+ },
135
+ {
136
+ name: "priority",
137
+ type: "number",
138
+ isOptional: true,
139
+ isArray: false,
140
+ },
141
+ { name: "createdAt", type: "string", isOptional: false, isArray: false },
142
+ { name: "updatedAt", type: "string", isOptional: false, isArray: false },
143
+ ],
144
+ });
145
+ }
146
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/__tests__/fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SwallowKit Add-Auth コマンド
3
+ * 認証認可基盤ファイルを生成する
4
+ */
5
+ interface AddAuthOptions {
6
+ provider?: string;
7
+ }
8
+ export declare function addAuthCommand(options: AddAuthOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=add-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add-auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,iBAoH3D"}
@@ -0,0 +1,444 @@
1
+ "use strict";
2
+ /**
3
+ * SwallowKit Add-Auth コマンド
4
+ * 認証認可基盤ファイルを生成する
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.addAuthCommand = addAuthCommand;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const config_1 = require("../../core/config");
44
+ const auth_generator_1 = require("../../core/scaffold/auth-generator");
45
+ const manifest_1 = require("../../core/project/manifest");
46
+ async function addAuthCommand(options) {
47
+ (0, config_1.ensureSwallowKitProject)("add-auth");
48
+ console.log(" SwallowKit Add-Auth: Setting up authentication...\n");
49
+ const provider = (options.provider || "custom-jwt");
50
+ if (!["custom-jwt", "swa", "swa-custom", "none"].includes(provider)) {
51
+ console.error(` Unknown provider: ${provider}. Use: custom-jwt | swa | swa-custom | none`);
52
+ process.exit(1);
53
+ }
54
+ const backendLanguage = (0, config_1.getBackendLanguage)();
55
+ const config = (0, config_1.getFullConfig)();
56
+ const cwd = process.cwd();
57
+ // Read project name from package.json
58
+ const pkgPath = path.join(cwd, "package.json");
59
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
60
+ const projectName = pkg.name || "app";
61
+ // Read shared package name
62
+ const sharedPkgPath = path.join(cwd, "shared", "package.json");
63
+ let sharedPackageName = `@${projectName}/shared`;
64
+ if (fs.existsSync(sharedPkgPath)) {
65
+ const sharedPkg = JSON.parse(fs.readFileSync(sharedPkgPath, "utf-8"));
66
+ sharedPackageName = sharedPkg.name || sharedPackageName;
67
+ }
68
+ // Default custom-jwt config
69
+ const customJwtConfig = config.auth?.customJwt || {
70
+ userConnector: "mysql",
71
+ userTable: "users",
72
+ loginIdColumn: "login_id",
73
+ passwordHashColumn: "password_hash",
74
+ rolesColumn: "roles",
75
+ jwtSecretEnv: "JWT_SECRET",
76
+ tokenExpiry: "24h",
77
+ };
78
+ // 1. Generate shared/models/auth.ts
79
+ console.log(" Generating auth models...");
80
+ const modelsDir = path.join(cwd, "shared", "models");
81
+ fs.mkdirSync(modelsDir, { recursive: true });
82
+ const authModelPath = path.join(modelsDir, "auth.ts");
83
+ fs.writeFileSync(authModelPath, (0, auth_generator_1.generateAuthModels)(), "utf-8");
84
+ console.log(` Created: shared/models/auth.ts`);
85
+ // Ensure shared package has build infrastructure (tsconfig, build script)
86
+ ensureSharedBuildInfrastructure(cwd);
87
+ // Update shared/index.ts to re-export auth
88
+ updateSharedIndex(cwd);
89
+ // Resolve RDB provider for dependency installation
90
+ const connDef = (0, config_1.getConnectorDefinition)(customJwtConfig.userConnector);
91
+ const rdbProvider = connDef?.provider ?? "mysql";
92
+ // 2. Generate Functions auth code
93
+ console.log("\n Generating auth functions...");
94
+ generateFunctionsAuth(cwd, backendLanguage, sharedPackageName, customJwtConfig);
95
+ // 3. Generate BFF auth routes
96
+ console.log("\n Generating BFF auth routes...");
97
+ generateBFFAuth(cwd, projectName, sharedPackageName);
98
+ // 4. Generate proxy
99
+ console.log("\n Generating proxy...");
100
+ const proxyPath = path.join(cwd, "proxy.ts");
101
+ fs.writeFileSync(proxyPath, (0, auth_generator_1.generateProxy)(projectName), "utf-8");
102
+ console.log(` Created: proxy.ts`);
103
+ // 5. Generate login page
104
+ console.log("\n Generating login page...");
105
+ const loginDir = path.join(cwd, "app", "login");
106
+ fs.mkdirSync(loginDir, { recursive: true });
107
+ fs.writeFileSync(path.join(loginDir, "page.tsx"), (0, auth_generator_1.generateLoginPage)(), "utf-8");
108
+ console.log(` Created: app/login/page.tsx`);
109
+ // 6. Generate auth context
110
+ console.log("\n Generating auth context...");
111
+ const authLibDir = path.join(cwd, "lib", "auth");
112
+ fs.mkdirSync(authLibDir, { recursive: true });
113
+ fs.writeFileSync(path.join(authLibDir, "auth-context.tsx"), (0, auth_generator_1.generateAuthContext)(), "utf-8");
114
+ console.log(`✅ Created: lib/auth/auth-context.tsx`);
115
+ // 7. Update callFunction with auth support
116
+ console.log("\n Updating callFunction with auth support...");
117
+ const callFnPath = path.join(cwd, "lib", "api", "call-function.ts");
118
+ const callFnDir = path.dirname(callFnPath);
119
+ fs.mkdirSync(callFnDir, { recursive: true });
120
+ fs.writeFileSync(callFnPath, (0, auth_generator_1.generateBFFCallFunctionWithAuth)(), "utf-8");
121
+ console.log(` Updated: lib/api/call-function.ts`);
122
+ // 8. Update swallowkit.config.js
123
+ console.log("\n Updating configuration...");
124
+ updateConfigWithAuth(cwd, provider, customJwtConfig);
125
+ // 9. Update environment files
126
+ console.log("\n Updating environment files...");
127
+ updateEnvironmentFiles(cwd);
128
+ // 10. Install dependencies
129
+ console.log("\n Installing auth dependencies...");
130
+ await installAuthDependencies(cwd, backendLanguage, rdbProvider);
131
+ await (0, manifest_1.syncProjectManifest)();
132
+ console.log("\n Authentication setup complete!");
133
+ console.log("\n Next steps:");
134
+ console.log(" 1. Review the generated files");
135
+ console.log(" 2. Set JWT_SECRET in functions/local.settings.json");
136
+ if (provider === "custom-jwt") {
137
+ console.log(" 3. Ensure your user database table matches the config");
138
+ console.log(" 4. Add authPolicy to your models for role-based access control:");
139
+ console.log(" export const authPolicy = { roles: ['admin'] };");
140
+ }
141
+ console.log(` 5. Run scaffold to regenerate functions with auth guards`);
142
+ }
143
+ /**
144
+ * Ensure the shared package has proper build infrastructure
145
+ * (tsconfig.json, build script, typescript devDependency).
146
+ * Required for `dev` command which runs `npm run --workspace=shared build`.
147
+ */
148
+ function ensureSharedBuildInfrastructure(cwd) {
149
+ const sharedDir = path.join(cwd, "shared");
150
+ const pkgPath = path.join(sharedDir, "package.json");
151
+ if (!fs.existsSync(pkgPath))
152
+ return;
153
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
154
+ let updated = false;
155
+ // Ensure scripts.build exists
156
+ if (!pkg.scripts?.build) {
157
+ if (!pkg.scripts)
158
+ pkg.scripts = {};
159
+ pkg.scripts.build = "tsc";
160
+ pkg.scripts.watch = "tsc --watch";
161
+ updated = true;
162
+ }
163
+ // Ensure main points to compiled output
164
+ if (!pkg.main || pkg.main === "index.ts") {
165
+ pkg.main = "dist/index.js";
166
+ pkg.types = "dist/index.d.ts";
167
+ updated = true;
168
+ }
169
+ // Ensure typescript devDependency
170
+ if (!pkg.devDependencies?.typescript) {
171
+ if (!pkg.devDependencies)
172
+ pkg.devDependencies = {};
173
+ pkg.devDependencies.typescript = "^5.0.0";
174
+ updated = true;
175
+ }
176
+ if (updated) {
177
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2), "utf-8");
178
+ console.log(` Updated: shared/package.json (added build infrastructure)`);
179
+ }
180
+ // Ensure tsconfig.json exists
181
+ const tsconfigPath = path.join(sharedDir, "tsconfig.json");
182
+ if (!fs.existsSync(tsconfigPath)) {
183
+ const tsconfig = {
184
+ compilerOptions: {
185
+ target: "ES2020",
186
+ module: "commonjs",
187
+ moduleResolution: "node",
188
+ lib: ["ES2020"],
189
+ outDir: "dist",
190
+ rootDir: ".",
191
+ declaration: true,
192
+ declarationMap: true,
193
+ sourceMap: true,
194
+ strict: true,
195
+ esModuleInterop: true,
196
+ skipLibCheck: true,
197
+ forceConsistentCasingInFileNames: true,
198
+ },
199
+ include: ["index.ts", "models/**/*"],
200
+ exclude: ["node_modules", "dist"],
201
+ };
202
+ fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2), "utf-8");
203
+ console.log(` Created: shared/tsconfig.json`);
204
+ }
205
+ }
206
+ function updateSharedIndex(cwd) {
207
+ const indexPath = path.join(cwd, "shared", "index.ts");
208
+ if (fs.existsSync(indexPath)) {
209
+ let content = fs.readFileSync(indexPath, "utf-8");
210
+ if (!content.includes("./models/auth")) {
211
+ content += `\nexport { LoginRequest, AuthUser, LoginResponse } from './models/auth';\n`;
212
+ fs.writeFileSync(indexPath, content, "utf-8");
213
+ console.log(` Updated: shared/index.ts`);
214
+ }
215
+ }
216
+ else {
217
+ fs.writeFileSync(indexPath, `export { LoginRequest, AuthUser, LoginResponse } from './models/auth';\n`, "utf-8");
218
+ console.log(` Created: shared/index.ts`);
219
+ }
220
+ }
221
+ function generateFunctionsAuth(cwd, backendLanguage, sharedPackageName, config) {
222
+ const functionsDir = path.join(cwd, "functions");
223
+ // Resolve the RDB provider from the connector definition
224
+ const connDef = (0, config_1.getConnectorDefinition)(config.userConnector);
225
+ const provider = connDef?.provider ?? "mysql";
226
+ if (backendLanguage === "typescript") {
227
+ // Auth functions
228
+ const srcDir = path.join(functionsDir, "src");
229
+ fs.mkdirSync(srcDir, { recursive: true });
230
+ fs.writeFileSync(path.join(srcDir, "auth.ts"), (0, auth_generator_1.generateAuthFunctionsTS)(sharedPackageName, config, provider), "utf-8");
231
+ console.log(` Created: functions/src/auth.ts`);
232
+ // JWT helper
233
+ const authDir = path.join(srcDir, "auth");
234
+ fs.mkdirSync(authDir, { recursive: true });
235
+ fs.writeFileSync(path.join(authDir, "jwt-helper.ts"), (0, auth_generator_1.generateJwtHelperTS)(), "utf-8");
236
+ console.log(` Created: functions/src/auth/jwt-helper.ts`);
237
+ }
238
+ else if (backendLanguage === "csharp") {
239
+ const authDir = path.join(functionsDir, "Auth");
240
+ fs.mkdirSync(authDir, { recursive: true });
241
+ fs.writeFileSync(path.join(authDir, "AuthFunctions.cs"), (0, auth_generator_1.generateAuthFunctionsCSharp)(config, provider), "utf-8");
242
+ console.log(` Created: functions/Auth/AuthFunctions.cs`);
243
+ fs.writeFileSync(path.join(authDir, "JwtHelper.cs"), (0, auth_generator_1.generateJwtHelperCSharp)(), "utf-8");
244
+ console.log(` Created: functions/Auth/JwtHelper.cs`);
245
+ }
246
+ else if (backendLanguage === "python") {
247
+ const blueprintsDir = path.join(functionsDir, "blueprints");
248
+ fs.mkdirSync(blueprintsDir, { recursive: true });
249
+ fs.writeFileSync(path.join(blueprintsDir, "auth.py"), (0, auth_generator_1.generateAuthFunctionsPython)(config, provider), "utf-8");
250
+ console.log(` Created: functions/blueprints/auth.py`);
251
+ const authDir = path.join(functionsDir, "auth");
252
+ fs.mkdirSync(authDir, { recursive: true });
253
+ fs.writeFileSync(path.join(authDir, "jwt_helper.py"), (0, auth_generator_1.generateJwtHelperPython)(), "utf-8");
254
+ console.log(` Created: functions/auth/jwt_helper.py`);
255
+ // __init__.py
256
+ fs.writeFileSync(path.join(authDir, "__init__.py"), "", "utf-8");
257
+ // Register auth blueprint in function_app.py
258
+ const functionAppPath = path.join(functionsDir, "function_app.py");
259
+ if (fs.existsSync(functionAppPath)) {
260
+ const content = fs.readFileSync(functionAppPath, "utf-8");
261
+ const authImport = "from blueprints.auth import bp as auth_bp";
262
+ const authRegister = "app.register_blueprint(auth_bp)";
263
+ if (!content.includes(authImport)) {
264
+ const marker = "# SwallowKit scaffold registrations";
265
+ if (content.includes(marker)) {
266
+ const updated = content.replace(marker, `${authImport}\n${authRegister}\n${marker}`);
267
+ fs.writeFileSync(functionAppPath, updated, "utf-8");
268
+ console.log(` Updated: functions/function_app.py (registered auth blueprint)`);
269
+ }
270
+ }
271
+ }
272
+ }
273
+ }
274
+ function generateBFFAuth(cwd, projectName, sharedPackageName) {
275
+ const authApiDir = path.join(cwd, "app", "api", "auth");
276
+ // Login route
277
+ const loginDir = path.join(authApiDir, "login");
278
+ fs.mkdirSync(loginDir, { recursive: true });
279
+ fs.writeFileSync(path.join(loginDir, "route.ts"), (0, auth_generator_1.generateBFFAuthLoginRoute)(projectName, sharedPackageName), "utf-8");
280
+ console.log(` Created: app/api/auth/login/route.ts`);
281
+ // Logout route
282
+ const logoutDir = path.join(authApiDir, "logout");
283
+ fs.mkdirSync(logoutDir, { recursive: true });
284
+ fs.writeFileSync(path.join(logoutDir, "route.ts"), (0, auth_generator_1.generateBFFAuthLogoutRoute)(projectName), "utf-8");
285
+ console.log(` Created: app/api/auth/logout/route.ts`);
286
+ // Me route
287
+ const meDir = path.join(authApiDir, "me");
288
+ fs.mkdirSync(meDir, { recursive: true });
289
+ fs.writeFileSync(path.join(meDir, "route.ts"), (0, auth_generator_1.generateBFFAuthMeRoute)(), "utf-8");
290
+ console.log(` Created: app/api/auth/me/route.ts`);
291
+ }
292
+ function updateConfigWithAuth(cwd, provider, config) {
293
+ const configPath = path.join(cwd, "swallowkit.config.js");
294
+ if (!fs.existsSync(configPath)) {
295
+ console.warn(" swallowkit.config.js not found. Please add auth config manually.");
296
+ return;
297
+ }
298
+ const content = fs.readFileSync(configPath, "utf-8");
299
+ if (content.includes("auth:") || content.includes("auth :")) {
300
+ console.log(" 'auth' section already exists in swallowkit.config.js");
301
+ return;
302
+ }
303
+ // Find the last property before the closing of module.exports
304
+ const closingBraceIdx = content.lastIndexOf("}");
305
+ if (closingBraceIdx === -1) {
306
+ console.error(" Could not parse config file structure.");
307
+ return;
308
+ }
309
+ const beforeClosing = content.substring(0, closingBraceIdx).trimEnd();
310
+ const needsComma = !beforeClosing.endsWith(",") && !beforeClosing.endsWith("{");
311
+ const authBlock = `${needsComma ? "," : ""}
312
+ // 認証認可設定
313
+ auth: {
314
+ provider: '${provider}',
315
+ customJwt: {
316
+ userConnector: '${config.userConnector}',
317
+ userTable: '${config.userTable}',
318
+ loginIdColumn: '${config.loginIdColumn}',
319
+ passwordHashColumn: '${config.passwordHashColumn}',
320
+ rolesColumn: '${config.rolesColumn}',
321
+ jwtSecretEnv: '${config.jwtSecretEnv || "JWT_SECRET"}',
322
+ tokenExpiry: '${config.tokenExpiry || "24h"}',
323
+ },
324
+ authorization: {
325
+ defaultPolicy: 'authenticated',
326
+ },
327
+ },
328
+ `;
329
+ const newContent = content.substring(0, closingBraceIdx) + authBlock + content.substring(closingBraceIdx);
330
+ fs.writeFileSync(configPath, newContent, "utf-8");
331
+ console.log(` Updated: swallowkit.config.js`);
332
+ }
333
+ function updateEnvironmentFiles(cwd) {
334
+ // Update functions/local.settings.json
335
+ const localSettingsPath = path.join(cwd, "functions", "local.settings.json");
336
+ if (fs.existsSync(localSettingsPath)) {
337
+ const settings = JSON.parse(fs.readFileSync(localSettingsPath, "utf-8"));
338
+ if (!settings.Values)
339
+ settings.Values = {};
340
+ if (!settings.Values.JWT_SECRET) {
341
+ settings.Values.JWT_SECRET = "dev-jwt-secret-change-in-production-min-32-chars!!";
342
+ }
343
+ fs.writeFileSync(localSettingsPath, JSON.stringify(settings, null, 2), "utf-8");
344
+ console.log(` Updated: functions/local.settings.json`);
345
+ }
346
+ // Update .env.example
347
+ const envExamplePath = path.join(cwd, ".env.example");
348
+ if (fs.existsSync(envExamplePath)) {
349
+ let content = fs.readFileSync(envExamplePath, "utf-8");
350
+ if (!content.includes("JWT_SECRET")) {
351
+ content += "\n# Authentication\nJWT_SECRET=your-jwt-secret-key-at-least-32-chars\n";
352
+ fs.writeFileSync(envExamplePath, content, "utf-8");
353
+ console.log(` Updated: .env.example`);
354
+ }
355
+ }
356
+ }
357
+ async function installAuthDependencies(cwd, backendLanguage, provider = "mysql") {
358
+ if (backendLanguage === "typescript") {
359
+ const funcPkgPath = path.join(cwd, "functions", "package.json");
360
+ if (fs.existsSync(funcPkgPath)) {
361
+ const funcPkg = JSON.parse(fs.readFileSync(funcPkgPath, "utf-8"));
362
+ if (!funcPkg.dependencies)
363
+ funcPkg.dependencies = {};
364
+ funcPkg.dependencies["jsonwebtoken"] = "^9.0.0";
365
+ funcPkg.dependencies["bcryptjs"] = "^2.4.3";
366
+ // RDB driver based on provider
367
+ if (provider === "mysql")
368
+ funcPkg.dependencies["mysql2"] = "^3.11.0";
369
+ else if (provider === "postgres")
370
+ funcPkg.dependencies["pg"] = "^8.13.0";
371
+ else
372
+ funcPkg.dependencies["mssql"] = "^11.0.0";
373
+ if (!funcPkg.devDependencies)
374
+ funcPkg.devDependencies = {};
375
+ funcPkg.devDependencies["@types/jsonwebtoken"] = "^9.0.0";
376
+ funcPkg.devDependencies["@types/bcryptjs"] = "^2.4.0";
377
+ if (provider === "postgres")
378
+ funcPkg.devDependencies["@types/pg"] = "^8.11.0";
379
+ fs.writeFileSync(funcPkgPath, JSON.stringify(funcPkg, null, 2), "utf-8");
380
+ console.log(` Updated: functions/package.json with auth dependencies (${provider})`);
381
+ }
382
+ }
383
+ else if (backendLanguage === "csharp") {
384
+ // Add NuGet package references to .csproj
385
+ const functionsDir = path.join(cwd, "functions");
386
+ const csprojFiles = fs.readdirSync(functionsDir).filter((f) => f.endsWith(".csproj"));
387
+ if (csprojFiles.length > 0) {
388
+ const csprojPath = path.join(functionsDir, csprojFiles[0]);
389
+ let csprojContent = fs.readFileSync(csprojPath, "utf-8");
390
+ const nugetPackages = [
391
+ { name: "System.IdentityModel.Tokens.Jwt", version: "7.0.0" },
392
+ { name: "Microsoft.IdentityModel.Tokens", version: "7.0.0" },
393
+ { name: "BCrypt.Net-Next", version: "4.0.3" },
394
+ ];
395
+ // RDB driver based on provider
396
+ if (provider === "mysql")
397
+ nugetPackages.push({ name: "MySqlConnector", version: "2.3.0" });
398
+ else if (provider === "postgres")
399
+ nugetPackages.push({ name: "Npgsql", version: "8.0.0" });
400
+ else
401
+ nugetPackages.push({ name: "Microsoft.Data.SqlClient", version: "5.2.0" });
402
+ for (const pkg of nugetPackages) {
403
+ if (!csprojContent.includes(`"${pkg.name}"`)) {
404
+ const insertPoint = csprojContent.lastIndexOf("</ItemGroup>");
405
+ if (insertPoint >= 0) {
406
+ csprojContent =
407
+ csprojContent.slice(0, insertPoint) +
408
+ ` <PackageReference Include="${pkg.name}" Version="${pkg.version}" />\n ` +
409
+ csprojContent.slice(insertPoint);
410
+ }
411
+ }
412
+ }
413
+ fs.writeFileSync(csprojPath, csprojContent, "utf-8");
414
+ console.log(` Updated: ${csprojFiles[0]} with auth NuGet packages (${provider})`);
415
+ }
416
+ }
417
+ else if (backendLanguage === "python") {
418
+ // Add Python dependencies to requirements.txt
419
+ const requirementsPath = path.join(cwd, "functions", "requirements.txt");
420
+ const baseDeps = ["PyJWT>=2.8.0", "bcrypt>=4.1.0"];
421
+ // RDB driver based on provider
422
+ if (provider === "mysql")
423
+ baseDeps.push("mysql-connector-python>=8.3.0");
424
+ else if (provider === "postgres")
425
+ baseDeps.push("psycopg2-binary>=2.9.0");
426
+ else
427
+ baseDeps.push("pymssql>=2.2.0");
428
+ if (fs.existsSync(requirementsPath)) {
429
+ let content = fs.readFileSync(requirementsPath, "utf-8");
430
+ for (const dep of baseDeps) {
431
+ const pkgName = dep.split(">=")[0].split("==")[0];
432
+ if (!content.includes(pkgName)) {
433
+ content += `${dep}\n`;
434
+ }
435
+ }
436
+ fs.writeFileSync(requirementsPath, content, "utf-8");
437
+ }
438
+ else {
439
+ fs.writeFileSync(requirementsPath, baseDeps.join("\n") + "\n", "utf-8");
440
+ }
441
+ console.log(` Updated: functions/requirements.txt with auth dependencies`);
442
+ }
443
+ }
444
+ //# sourceMappingURL=add-auth.js.map