swallowkit 1.0.0-beta.4 → 1.0.0-beta.40

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 (204) hide show
  1. package/LICENSE +21 -21
  2. package/README.ja.md +153 -215
  3. package/README.md +153 -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 +426 -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 +45 -0
  33. package/dist/cli/commands/init.d.ts.map +1 -1
  34. package/dist/cli/commands/init.js +2851 -1754
  35. package/dist/cli/commands/init.js.map +1 -1
  36. package/dist/cli/commands/scaffold.d.ts +4 -0
  37. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  38. package/dist/cli/commands/scaffold.js +439 -130
  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 +200 -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 +94 -5
  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 +209 -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 -220
  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 +328 -135
  91. package/dist/core/scaffold/model-parser.js.map +1 -1
  92. package/dist/core/scaffold/native-schema-generator.d.ts +13 -0
  93. package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -0
  94. package/dist/core/scaffold/native-schema-generator.js +696 -0
  95. package/dist/core/scaffold/native-schema-generator.js.map +1 -0
  96. package/dist/core/scaffold/nextjs-generator.d.ts +8 -0
  97. package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
  98. package/dist/core/scaffold/nextjs-generator.js +314 -182
  99. package/dist/core/scaffold/nextjs-generator.js.map +1 -1
  100. package/dist/core/scaffold/openapi-generator.d.ts +3 -0
  101. package/dist/core/scaffold/openapi-generator.d.ts.map +1 -0
  102. package/dist/core/scaffold/openapi-generator.js +190 -0
  103. package/dist/core/scaffold/openapi-generator.js.map +1 -0
  104. package/dist/core/scaffold/ui-generator.d.ts +10 -4
  105. package/dist/core/scaffold/ui-generator.d.ts.map +1 -1
  106. package/dist/core/scaffold/ui-generator.js +768 -663
  107. package/dist/core/scaffold/ui-generator.js.map +1 -1
  108. package/dist/database/base-model.d.ts +3 -3
  109. package/dist/database/base-model.js +3 -3
  110. package/dist/index.d.ts +2 -2
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +2 -1
  113. package/dist/index.js.map +1 -1
  114. package/dist/machine/contracts.d.ts +16 -0
  115. package/dist/machine/contracts.d.ts.map +1 -0
  116. package/dist/machine/contracts.js +3 -0
  117. package/dist/machine/contracts.js.map +1 -0
  118. package/dist/machine/errors.d.ts +11 -0
  119. package/dist/machine/errors.d.ts.map +1 -0
  120. package/dist/machine/errors.js +34 -0
  121. package/dist/machine/errors.js.map +1 -0
  122. package/dist/machine/index.d.ts +3 -0
  123. package/dist/machine/index.d.ts.map +1 -0
  124. package/dist/machine/index.js +156 -0
  125. package/dist/machine/index.js.map +1 -0
  126. package/dist/mcp/index.d.ts +25 -0
  127. package/dist/mcp/index.d.ts.map +1 -0
  128. package/dist/mcp/index.js +186 -0
  129. package/dist/mcp/index.js.map +1 -0
  130. package/dist/types/index.d.ts +65 -0
  131. package/dist/types/index.d.ts.map +1 -1
  132. package/dist/utils/package-manager.d.ts +110 -0
  133. package/dist/utils/package-manager.d.ts.map +1 -0
  134. package/dist/utils/package-manager.js +224 -0
  135. package/dist/utils/package-manager.js.map +1 -0
  136. package/dist/utils/python-uv.d.ts +21 -0
  137. package/dist/utils/python-uv.d.ts.map +1 -0
  138. package/dist/utils/python-uv.js +111 -0
  139. package/dist/utils/python-uv.js.map +1 -0
  140. package/package.json +84 -73
  141. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +1139 -0
  142. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +194 -0
  143. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +532 -0
  144. package/src/__tests__/auth.test.ts +654 -0
  145. package/src/__tests__/config.test.ts +274 -0
  146. package/src/__tests__/connector-functions-generator.test.ts +288 -0
  147. package/src/__tests__/connector-mock-server.test.ts +439 -0
  148. package/src/__tests__/connector-model-bff.test.ts +162 -0
  149. package/src/__tests__/dev-seeds.test.ts +173 -0
  150. package/src/__tests__/dev.test.ts +252 -0
  151. package/src/__tests__/fixtures.ts +144 -0
  152. package/src/__tests__/functions-generator.test.ts +237 -0
  153. package/src/__tests__/init.test.ts +197 -0
  154. package/src/__tests__/jest-globals.d.ts +8 -0
  155. package/src/__tests__/machine.test.ts +356 -0
  156. package/src/__tests__/mcp.test.ts +124 -0
  157. package/src/__tests__/model-parser.test.ts +52 -0
  158. package/src/__tests__/nextjs-generator.test.ts +97 -0
  159. package/src/__tests__/openapi-generator.test.ts +43 -0
  160. package/src/__tests__/package-manager.test.ts +201 -0
  161. package/src/__tests__/python-uv.test.ts +48 -0
  162. package/src/__tests__/scaffold.test.ts +191 -0
  163. package/src/__tests__/string-utils.test.ts +75 -0
  164. package/src/__tests__/tsconfig.json +15 -0
  165. package/src/__tests__/ui-generator.test.ts +144 -0
  166. package/src/__tests__/zod-mock-generator.test.ts +132 -0
  167. package/src/cli/commands/add-auth.ts +482 -0
  168. package/src/cli/commands/add-connector.ts +158 -0
  169. package/src/cli/commands/create-model.ts +62 -0
  170. package/src/cli/commands/dev-seeds.ts +614 -0
  171. package/src/cli/commands/dev.ts +1134 -0
  172. package/src/cli/commands/index.ts +9 -0
  173. package/src/cli/commands/init.ts +3600 -0
  174. package/src/cli/commands/provision.ts +193 -0
  175. package/src/cli/commands/scaffold.ts +991 -0
  176. package/src/cli/index.ts +196 -0
  177. package/src/core/config.ts +312 -0
  178. package/src/core/mock/connector-mock-server.ts +555 -0
  179. package/src/core/mock/zod-mock-generator.ts +205 -0
  180. package/src/core/operations/create-model.ts +174 -0
  181. package/src/core/operations/runtime.ts +235 -0
  182. package/src/core/operations/scaffold-machine.ts +91 -0
  183. package/src/core/project/manifest.ts +402 -0
  184. package/src/core/project/validation.ts +229 -0
  185. package/src/core/scaffold/auth-generator.ts +1284 -0
  186. package/src/core/scaffold/connector-functions-generator.ts +1128 -0
  187. package/src/core/scaffold/functions-generator.ts +970 -0
  188. package/src/core/scaffold/model-parser.ts +841 -0
  189. package/src/core/scaffold/native-schema-generator.ts +822 -0
  190. package/src/core/scaffold/nextjs-generator.ts +370 -0
  191. package/src/core/scaffold/openapi-generator.ts +212 -0
  192. package/src/core/scaffold/ui-generator.ts +1061 -0
  193. package/src/database/base-model.ts +184 -0
  194. package/src/database/client.ts +140 -0
  195. package/src/database/repository.ts +104 -0
  196. package/src/database/runtime-check.ts +25 -0
  197. package/src/index.ts +27 -0
  198. package/src/machine/contracts.ts +17 -0
  199. package/src/machine/errors.ts +34 -0
  200. package/src/machine/index.ts +173 -0
  201. package/src/mcp/index.ts +191 -0
  202. package/src/types/index.ts +134 -0
  203. package/src/utils/package-manager.ts +238 -0
  204. package/src/utils/python-uv.ts +96 -0
@@ -0,0 +1,158 @@
1
+ /**
2
+ * SwallowKit Add-Connector コマンド
3
+ * swallowkit.config.js にコネクタ設定を追加する
4
+ */
5
+
6
+ import * as fs from "fs";
7
+ import * as path from "path";
8
+ import { ensureSwallowKitProject } from "../../core/config";
9
+ import { ApiConnectorConfig, ConnectorDefinition } from "../../types";
10
+ import { syncProjectManifest } from "../../core/project/manifest";
11
+
12
+ interface AddConnectorOptions {
13
+ name: string;
14
+ type: "rdb" | "api";
15
+ provider?: "mysql" | "postgres" | "sqlserver";
16
+ }
17
+
18
+ /**
19
+ * add-connector コマンド
20
+ */
21
+ export async function addConnectorCommand(options: AddConnectorOptions) {
22
+ ensureSwallowKitProject("add-connector");
23
+
24
+ console.log(`🔌 SwallowKit Add-Connector: Adding '${options.name}' connector...\n`);
25
+
26
+ const configPath = findConfigFile();
27
+ if (!configPath) {
28
+ console.error("❌ swallowkit.config.js not found. Run 'swallowkit init' first.");
29
+ process.exit(1);
30
+ }
31
+
32
+ // Build connector definition
33
+ const connectorDef = buildConnectorDefinition(options);
34
+
35
+ // Update config file
36
+ updateConfigWithConnector(configPath, options.name, connectorDef);
37
+ await syncProjectManifest();
38
+
39
+ console.log(`\n✅ Connector '${options.name}' added successfully!`);
40
+ console.log("\n📝 Next steps:");
41
+ console.log(` 1. Review the connector settings in ${configPath}`);
42
+ console.log(` 2. Set the required environment variables in functions/local.settings.json`);
43
+ console.log(` 3. Create models with: npx swallowkit create-model <name> --connector=${options.name}`);
44
+ }
45
+
46
+ function findConfigFile(): string | null {
47
+ const candidates = ["swallowkit.config.js", "swallowkit.config.json", ".swallowkitrc.json"];
48
+ for (const candidate of candidates) {
49
+ const fullPath = path.resolve(process.cwd(), candidate);
50
+ if (fs.existsSync(fullPath)) {
51
+ return fullPath;
52
+ }
53
+ }
54
+ return null;
55
+ }
56
+
57
+ function buildConnectorDefinition(options: AddConnectorOptions): ConnectorDefinition {
58
+ const name = options.name.toUpperCase().replace(/[^A-Z0-9]/g, "_");
59
+
60
+ if (options.type === "rdb") {
61
+ return {
62
+ type: "rdb",
63
+ provider: options.provider || "mysql",
64
+ connectionEnvVar: `${name}_CONNECTION_STRING`,
65
+ };
66
+ }
67
+
68
+ return {
69
+ type: "api",
70
+ baseUrlEnvVar: `${name}_API_BASE_URL`,
71
+ auth: {
72
+ type: "apiKey",
73
+ envVar: `${name}_API_KEY`,
74
+ placement: "query",
75
+ paramName: "apiKey",
76
+ },
77
+ };
78
+ }
79
+
80
+ /**
81
+ * swallowkit.config.js にコネクタ設定を追加
82
+ */
83
+ export function updateConfigWithConnector(
84
+ configPath: string,
85
+ connectorName: string,
86
+ connectorDef: ConnectorDefinition
87
+ ): void {
88
+ const content = fs.readFileSync(configPath, "utf-8");
89
+
90
+ if (configPath.endsWith(".json")) {
91
+ // JSON config
92
+ const config = JSON.parse(content);
93
+ if (!config.connectors) {
94
+ config.connectors = {};
95
+ }
96
+ config.connectors[connectorName] = connectorDef;
97
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
98
+ console.log(`✅ Updated: ${configPath}`);
99
+ return;
100
+ }
101
+
102
+ // JS config — append connectors section
103
+ if (content.includes("connectors:") || content.includes("connectors :")) {
104
+ console.log(`⚠️ 'connectors' section already exists in ${configPath}. Please add the connector manually:`);
105
+ console.log(formatConnectorSnippet(connectorName, connectorDef));
106
+ return;
107
+ }
108
+
109
+ // Find the last property before the closing of module.exports
110
+ const closingBraceIdx = content.lastIndexOf("}");
111
+ if (closingBraceIdx === -1) {
112
+ console.error("❌ Could not parse config file structure. Please add the connector manually:");
113
+ console.log(formatConnectorSnippet(connectorName, connectorDef));
114
+ return;
115
+ }
116
+
117
+ // Check if we need a comma before inserting
118
+ const beforeClosing = content.substring(0, closingBraceIdx).trimEnd();
119
+ const needsComma = !beforeClosing.endsWith(",") && !beforeClosing.endsWith("{");
120
+
121
+ const connectorBlock = generateConnectorJSBlock(connectorName, connectorDef);
122
+ const insertion = `${needsComma ? "," : ""}\n // コネクタ定義\n connectors: {\n${connectorBlock}\n },\n`;
123
+
124
+ const newContent = content.substring(0, closingBraceIdx) + insertion + content.substring(closingBraceIdx);
125
+ fs.writeFileSync(configPath, newContent, "utf-8");
126
+ console.log(`✅ Updated: ${configPath}`);
127
+ }
128
+
129
+ function generateConnectorJSBlock(name: string, def: ConnectorDefinition): string {
130
+ if (def.type === "rdb") {
131
+ return ` ${name}: {
132
+ type: 'rdb',
133
+ provider: '${def.provider}',
134
+ connectionEnvVar: '${def.connectionEnvVar}',
135
+ },`;
136
+ }
137
+
138
+ const apiDef: ApiConnectorConfig = def;
139
+ let authBlock = "";
140
+ if (apiDef.auth) {
141
+ authBlock = `
142
+ auth: {
143
+ type: '${apiDef.auth.type}',
144
+ envVar: '${apiDef.auth.envVar}',
145
+ placement: '${apiDef.auth.placement || "query"}',
146
+ paramName: '${apiDef.auth.paramName || "apiKey"}',
147
+ },`;
148
+ }
149
+
150
+ return ` ${name}: {
151
+ type: 'api',
152
+ baseUrlEnvVar: '${apiDef.baseUrlEnvVar}',${authBlock}
153
+ },`;
154
+ }
155
+
156
+ function formatConnectorSnippet(name: string, def: ConnectorDefinition): string {
157
+ return `\n ${name}: ${JSON.stringify(def, null, 4)}\n`;
158
+ }
@@ -0,0 +1,62 @@
1
+ import * as readline from "readline";
2
+ import { createModelOperation } from "../../core/operations/create-model";
3
+ import { detectFromProject, getCommands } from "../../utils/package-manager";
4
+
5
+ interface CreateModelOptions {
6
+ names: string[]; // モデル名のリスト(例: ["todo", "user", "post"])
7
+ modelsDir?: string; // モデルディレクトリ(デフォルト: "shared/models")
8
+ connector?: string; // コネクタ名(例: "mysql", "backlog")
9
+ }
10
+
11
+ /**
12
+ * ユーザーに確認を求める
13
+ */
14
+ function askConfirmation(question: string): Promise<boolean> {
15
+ const rl = readline.createInterface({
16
+ input: process.stdin,
17
+ output: process.stdout,
18
+ });
19
+
20
+ return new Promise((resolve) => {
21
+ rl.question(question, (answer) => {
22
+ rl.close();
23
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
24
+ });
25
+ });
26
+ }
27
+
28
+ /**
29
+ * create-model コマンド
30
+ */
31
+ export async function createModelCommand(options: CreateModelOptions) {
32
+ console.log("🏗️ SwallowKit Create-Model: Generating model templates...\n");
33
+
34
+ const result = await createModelOperation({
35
+ names: options.names,
36
+ modelsDir: options.modelsDir,
37
+ connector: options.connector,
38
+ overwriteMode: "prompt",
39
+ confirmOverwrite: async (filePath) => askConfirmation(`⚠️ File ${filePath} already exists. Overwrite? (y/N): `),
40
+ });
41
+
42
+ // サマリー表示
43
+ console.log("\n📋 Summary:");
44
+ if (result.connectorType && options.connector) {
45
+ console.log(` 🔌 Connector: ${options.connector} (${result.connectorType})`);
46
+ }
47
+ if (result.createdFiles.length > 0) {
48
+ console.log(` ✅ Created ${result.createdFiles.length} model(s): ${result.createdFiles.join(", ")}`);
49
+ }
50
+ if (result.skippedFiles.length > 0) {
51
+ console.log(` ⏭️ Skipped ${result.skippedFiles.length} model(s): ${result.skippedFiles.join(", ")}`);
52
+ }
53
+ if (result.updatedIndex) {
54
+ console.log(" 📦 Updated shared/index.ts");
55
+ }
56
+
57
+ if (result.createdFiles.length > 0) {
58
+ console.log("\n📝 Next steps:");
59
+ console.log(" 1. Customize the generated model fields in shared/models/");
60
+ console.log(` 2. Run '${getCommands(detectFromProject()).dlx} swallowkit scaffold <model>' to generate CRUD code`);
61
+ }
62
+ }