@wild-framework/cli 0.1.1 → 0.2.2

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 (72) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +109 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/codegen.d.ts +32 -0
  5. package/dist/client/codegen.d.ts.map +1 -0
  6. package/dist/client/codegen.js +94 -0
  7. package/dist/client/codegen.js.map +1 -0
  8. package/dist/client/command.d.ts +29 -0
  9. package/dist/client/command.d.ts.map +1 -0
  10. package/dist/client/command.js +95 -0
  11. package/dist/client/command.js.map +1 -0
  12. package/dist/client/contract.d.ts +86 -0
  13. package/dist/client/contract.d.ts.map +1 -0
  14. package/dist/client/contract.js +12 -0
  15. package/dist/client/contract.js.map +1 -0
  16. package/dist/client/core.d.ts +80 -0
  17. package/dist/client/core.d.ts.map +1 -0
  18. package/dist/client/core.js +52 -0
  19. package/dist/client/core.js.map +1 -0
  20. package/dist/client/fs-writer.d.ts +13 -0
  21. package/dist/client/fs-writer.d.ts.map +1 -0
  22. package/dist/client/fs-writer.js +24 -0
  23. package/dist/client/fs-writer.js.map +1 -0
  24. package/dist/client/inspector.d.ts +19 -0
  25. package/dist/client/inspector.d.ts.map +1 -0
  26. package/dist/client/inspector.js +71 -0
  27. package/dist/client/inspector.js.map +1 -0
  28. package/dist/client/spec.d.ts +13 -0
  29. package/dist/client/spec.d.ts.map +1 -0
  30. package/dist/client/spec.js +235 -0
  31. package/dist/client/spec.js.map +1 -0
  32. package/dist/client/targets/index.d.ts +9 -0
  33. package/dist/client/targets/index.d.ts.map +1 -0
  34. package/dist/client/targets/index.js +11 -0
  35. package/dist/client/targets/index.js.map +1 -0
  36. package/dist/client/targets/react.d.ts +20 -0
  37. package/dist/client/targets/react.d.ts.map +1 -0
  38. package/dist/client/targets/react.js +519 -0
  39. package/dist/client/targets/react.js.map +1 -0
  40. package/dist/commands/ci.d.ts +5 -0
  41. package/dist/commands/ci.d.ts.map +1 -0
  42. package/dist/commands/ci.js +254 -0
  43. package/dist/commands/ci.js.map +1 -0
  44. package/dist/commands/db.d.ts +13 -0
  45. package/dist/commands/db.d.ts.map +1 -0
  46. package/dist/commands/db.js +104 -0
  47. package/dist/commands/db.js.map +1 -0
  48. package/dist/commands/docker.d.ts +9 -0
  49. package/dist/commands/docker.d.ts.map +1 -0
  50. package/dist/commands/docker.js +175 -0
  51. package/dist/commands/docker.js.map +1 -0
  52. package/dist/commands/graph.d.ts +9 -0
  53. package/dist/commands/graph.d.ts.map +1 -0
  54. package/dist/commands/graph.js +36 -0
  55. package/dist/commands/graph.js.map +1 -0
  56. package/dist/commands/make.d.ts +1 -1
  57. package/dist/commands/make.d.ts.map +1 -1
  58. package/dist/commands/make.js +51 -0
  59. package/dist/commands/make.js.map +1 -1
  60. package/dist/commands/new.d.ts +24 -0
  61. package/dist/commands/new.d.ts.map +1 -0
  62. package/dist/commands/new.js +374 -0
  63. package/dist/commands/new.js.map +1 -0
  64. package/dist/commands/resource.d.ts +33 -0
  65. package/dist/commands/resource.d.ts.map +1 -0
  66. package/dist/commands/resource.js +291 -0
  67. package/dist/commands/resource.js.map +1 -0
  68. package/dist/templates/resource-slice.d.ts +87 -0
  69. package/dist/templates/resource-slice.d.ts.map +1 -0
  70. package/dist/templates/resource-slice.js +513 -0
  71. package/dist/templates/resource-slice.js.map +1 -0
  72. package/package.json +9 -3
@@ -0,0 +1,254 @@
1
+ import { existsSync, readFileSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ function detectPackageManager(cwd) {
4
+ if (existsSync(join(cwd, "pnpm-lock.yaml")))
5
+ return "pnpm";
6
+ if (existsSync(join(cwd, "yarn.lock")))
7
+ return "yarn";
8
+ return "npm";
9
+ }
10
+ function installStep(pm) {
11
+ switch (pm) {
12
+ case "pnpm":
13
+ return [
14
+ " - uses: pnpm/action-setup@v4",
15
+ " with:",
16
+ ' version: 9',
17
+ " - uses: actions/setup-node@v4",
18
+ " with:",
19
+ " node-version: 20",
20
+ " cache: pnpm",
21
+ " - run: pnpm install --frozen-lockfile",
22
+ ].join("\n");
23
+ case "yarn":
24
+ return [
25
+ " - uses: actions/setup-node@v4",
26
+ " with:",
27
+ " node-version: 20",
28
+ " cache: yarn",
29
+ " - run: yarn install --frozen-lockfile",
30
+ ].join("\n");
31
+ default:
32
+ return [
33
+ " - uses: actions/setup-node@v4",
34
+ " with:",
35
+ " node-version: 20",
36
+ " cache: npm",
37
+ " - run: npm ci",
38
+ ].join("\n");
39
+ }
40
+ }
41
+ function runCmd(pm, script) {
42
+ return pm === "pnpm" ? `pnpm ${script}` : pm === "yarn" ? `yarn ${script}` : `npm run ${script}`;
43
+ }
44
+ /** The quality-gate job (lint + format + typecheck + test + build + audit). */
45
+ function qualityJob(o) {
46
+ const pm = o.packageManager;
47
+ const steps = [];
48
+ if (o.hasScript("lint"))
49
+ steps.push(` - run: ${runCmd(pm, "lint")}`);
50
+ if (o.hasScript("format") || o.hasScript("format:check")) {
51
+ const f = o.hasScript("format:check") ? "format:check" : "format";
52
+ steps.push(` - run: ${runCmd(pm, f)}`);
53
+ }
54
+ if (o.hasScript("typecheck"))
55
+ steps.push(` - run: ${runCmd(pm, "typecheck")}`);
56
+ else if (o.hasScript("build"))
57
+ steps.push(` - run: ${runCmd(pm, "build")}`);
58
+ if (o.hasScript("test"))
59
+ steps.push(` - run: ${runCmd(pm, "test")}`);
60
+ steps.push(` - run: ${pm === "pnpm" ? "pnpm audit --prod" : pm === "yarn" ? "yarn audit" : "npm audit --omit=dev"}`);
61
+ return ` quality:
62
+ runs-on: ubuntu-latest
63
+ steps:
64
+ - uses: actions/checkout@v4
65
+ ${installStep(pm)}
66
+ ${steps.join("\n")}
67
+ `;
68
+ }
69
+ /** Deploy job per hosting platform. */
70
+ function deployJob(o) {
71
+ switch (o.host) {
72
+ case "gcp":
73
+ return gcpDeploy(o);
74
+ case "aws":
75
+ return awsDeploy(o);
76
+ case "ftp":
77
+ return ftpDeploy(o);
78
+ case "ssh":
79
+ return sshDeploy(o);
80
+ }
81
+ }
82
+ function gcpDeploy(o) {
83
+ return ` deploy:
84
+ needs: [quality]
85
+ if: github.ref == 'refs/heads/${o.branch}'
86
+ runs-on: ubuntu-latest
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+ - id: auth
90
+ uses: google-github-actions/auth@v2
91
+ with:
92
+ credentials_json: \${{ secrets.GCP_SA_KEY }}
93
+ - name: Set up Cloud SDK
94
+ uses: google-github-actions/setup-gcloud@v2
95
+ - name: Build & push image
96
+ run: |
97
+ gcloud auth configure-docker
98
+ docker build -t gcr.io/\${{ secrets.GCP_PROJECT_ID }}/app:\${{ github.sha }} .
99
+ docker push gcr.io/\${{ secrets.GCP_PROJECT_ID }}/app:\${{ github.sha }}
100
+ - name: Deploy to Cloud Run
101
+ run: |
102
+ gcloud run deploy app \\
103
+ --image gcr.io/\${{ secrets.GCP_PROJECT_ID }}/app:\${{ github.sha }} \\
104
+ --region \${{ secrets.GCP_REGION }} \\
105
+ --platform managed \\
106
+ --allow-unauthenticated
107
+ `;
108
+ }
109
+ function awsDeploy(o) {
110
+ return ` deploy:
111
+ needs: [quality]
112
+ if: github.ref == 'refs/heads/${o.branch}'
113
+ runs-on: ubuntu-latest
114
+ steps:
115
+ - uses: actions/checkout@v4
116
+ - name: Configure AWS credentials
117
+ uses: aws-actions/configure-aws-credentials@v4
118
+ with:
119
+ aws-access-key-id: \${{ secrets.AWS_ACCESS_KEY_ID }}
120
+ aws-secret-access-key: \${{ secrets.AWS_SECRET_ACCESS_KEY }}
121
+ aws-region: \${{ secrets.AWS_REGION }}
122
+ - name: Login to Amazon ECR
123
+ uses: aws-actions/amazon-ecr-login@v2
124
+ - name: Build & push to ECR
125
+ env:
126
+ ECR_REPO: \${{ secrets.AWS_ECR_REPO }}
127
+ run: |
128
+ docker build -t \$ECR_REPO:\${{ github.sha }} .
129
+ docker push \$ECR_REPO:\${{ github.sha }}
130
+ `;
131
+ }
132
+ function ftpDeploy(o) {
133
+ return ` deploy:
134
+ needs: [quality]
135
+ if: github.ref == 'refs/heads/${o.branch}'
136
+ runs-on: ubuntu-latest
137
+ steps:
138
+ - uses: actions/checkout@v4
139
+ - name: Build
140
+ run: ${runCmd(o.packageManager, "build")}
141
+ - name: Deploy over FTP
142
+ uses: SamKirkland/FTP-Deploy-Action@v4.3.5
143
+ with:
144
+ server: \${{ secrets.FTP_HOST }}
145
+ username: \${{ secrets.FTP_USERNAME }}
146
+ password: \${{ secrets.FTP_PASSWORD }}
147
+ local-dir: ./dist/
148
+ server-dir: \${{ secrets.FTP_DIR }}
149
+ `;
150
+ }
151
+ function sshDeploy(o) {
152
+ return ` deploy:
153
+ needs: [quality]
154
+ if: github.ref == 'refs/heads/${o.branch}'
155
+ runs-on: ubuntu-latest
156
+ steps:
157
+ - uses: actions/checkout@v4
158
+ - name: Build
159
+ run: ${runCmd(o.packageManager, "build")}
160
+ - name: Deploy over SSH (rsync)
161
+ uses: burnett01/rsync-deployments@7.0.1
162
+ with:
163
+ switches: -avz --delete
164
+ path: ./dist/
165
+ remote_path: \${{ secrets.SSH_DEPLOY_PATH }}
166
+ remote_host: \${{ secrets.SSH_HOST }}
167
+ remote_user: \${{ secrets.SSH_USER }}
168
+ remote_key: \${{ secrets.SSH_PRIVATE_KEY }}
169
+ `;
170
+ }
171
+ /** The full workflow YAML. */
172
+ function workflow(o) {
173
+ return `name: CI
174
+
175
+ on:
176
+ push:
177
+ branches: [${o.branch}]
178
+ pull_request:
179
+
180
+ jobs:
181
+ ${qualityJob(o)}
182
+ ${deployJob(o)}
183
+ `;
184
+ }
185
+ /**
186
+ * Run `wild ci [--host gcp|aws|ftp|ssh] [--branch main]`.
187
+ */
188
+ export function runCi(args, print = console.log) {
189
+ const host = parseHost(args);
190
+ const branch = parseBranch(args);
191
+ const cwd = process.cwd();
192
+ const pkg = (() => {
193
+ try {
194
+ return JSON.parse(readFileSync(join(cwd, "package.json"), "utf8"));
195
+ }
196
+ catch {
197
+ return {};
198
+ }
199
+ })();
200
+ const options = {
201
+ platform: "github",
202
+ host,
203
+ branch,
204
+ packageManager: detectPackageManager(cwd),
205
+ hasScript: (name) => Boolean(pkg.scripts?.[name]),
206
+ };
207
+ const dir = join(cwd, ".github", "workflows");
208
+ const file = join(dir, "ci.yml");
209
+ print(`\nGenerating CI for: ${options.platform} · deploy=${options.host} · branch=${options.branch}`);
210
+ print(` package manager: ${options.packageManager}`);
211
+ print(` quality gates: lint ${pkg.scripts?.lint ? "✓" : "—"} · format ${pkg.scripts?.format || pkg.scripts?.["format:check"] ? "✓" : "—"} · build ${pkg.scripts?.build ? "✓" : "—"} · test ${pkg.scripts?.test ? "✓" : "—"} · audit ✓\n`);
212
+ if (existsSync(file)) {
213
+ print(` skip .github/workflows/ci.yml (already exists)`);
214
+ print("\nNothing to do — delete it first to regenerate.");
215
+ return 0;
216
+ }
217
+ mkdirSync(dir, { recursive: true });
218
+ writeFileSync(file, workflow(options), "utf8");
219
+ print(` create .github/workflows/ci.yml`);
220
+ print(`\nDone. Add these secrets in GitHub → Settings → Secrets and variables → Actions:`);
221
+ printSecrets(host, print);
222
+ return 0;
223
+ }
224
+ function parseHost(args) {
225
+ const idx = args.indexOf("--host");
226
+ const value = idx >= 0 ? args[idx + 1] : undefined;
227
+ switch (value) {
228
+ case "gcp":
229
+ return "gcp";
230
+ case "aws":
231
+ return "aws";
232
+ case "ftp":
233
+ return "ftp";
234
+ case "ssh":
235
+ return "ssh";
236
+ default:
237
+ return "gcp";
238
+ }
239
+ }
240
+ function parseBranch(args) {
241
+ const idx = args.indexOf("--branch");
242
+ return (idx >= 0 ? args[idx + 1] : undefined) ?? "main";
243
+ }
244
+ function printSecrets(host, print) {
245
+ const map = {
246
+ gcp: ["GCP_SA_KEY", "GCP_PROJECT_ID", "GCP_REGION"],
247
+ aws: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION", "AWS_ECR_REPO"],
248
+ ftp: ["FTP_HOST", "FTP_USERNAME", "FTP_PASSWORD", "FTP_DIR"],
249
+ ssh: ["SSH_HOST", "SSH_USER", "SSH_PRIVATE_KEY", "SSH_DEPLOY_PATH"],
250
+ };
251
+ for (const secret of map[host])
252
+ print(` - ${secret}`);
253
+ }
254
+ //# sourceMappingURL=ci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../src/commands/ci.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAsBjC,SAAS,oBAAoB,CAAC,GAAW;IACrC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,EAA+B;IAChD,QAAQ,EAAE,EAAE,CAAC;QACT,KAAK,MAAM;YACP,OAAO;gBACH,oCAAoC;gBACpC,eAAe;gBACf,sBAAsB;gBACtB,qCAAqC;gBACrC,eAAe;gBACf,4BAA4B;gBAC5B,uBAAuB;gBACvB,6CAA6C;aAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,KAAK,MAAM;YACP,OAAO;gBACH,qCAAqC;gBACrC,eAAe;gBACf,4BAA4B;gBAC5B,uBAAuB;gBACvB,6CAA6C;aAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB;YACI,OAAO;gBACH,qCAAqC;gBACrC,eAAe;gBACf,4BAA4B;gBAC5B,sBAAsB;gBACtB,qBAAqB;aACxB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,EAA+B,EAAE,MAAc;IAC3D,OAAO,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC;AACrG,CAAC;AAED,+EAA+E;AAC/E,SAAS,UAAU,CAAC,CAAY;IAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,cAAc,CAAC;IAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;SAC/E,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACjF,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CACN,gBAAgB,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAChH,CAAC;IAEF,OAAO;;;;EAIT,WAAW,CAAC,EAAE,CAAC;EACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;CACjB,CAAC;AACF,CAAC;AAED,uCAAuC;AACvC,SAAS,SAAS,CAAC,CAAY;IAC3B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACb,KAAK,KAAK;YACN,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,KAAK,KAAK;YACN,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,KAAK,KAAK;YACN,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,KAAK,KAAK;YACN,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,CAAY;IAC3B,OAAO;;oCAEyB,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;CAsB3C,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,CAAY;IAC3B,OAAO;;oCAEyB,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;CAkB3C,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,CAAY;IAC3B,OAAO;;oCAEyB,CAAC,CAAC,MAAM;;;;;eAK7B,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC;;;;;;;;;CAS/C,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,CAAY;IAC3B,OAAO;;oCAEyB,CAAC,CAAC,MAAM;;;;;eAK7B,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC;;;;;;;;;;CAU/C,CAAC;AACF,CAAC;AAED,8BAA8B;AAC9B,SAAS,QAAQ,CAAC,CAAY;IAC1B,OAAO;;;;iBAIM,CAAC,CAAC,MAAM;;;;EAIvB,UAAU,CAAC,CAAC,CAAC;EACb,SAAS,CAAC,CAAC,CAAC;CACb,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,IAAc,EAAE,QAAgC,OAAO,CAAC,GAAG;IAC7E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QACd,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAEhE,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,OAAO,GAAc;QACvB,QAAQ,EAAE,QAAQ;QAClB,IAAI;QACJ,MAAM;QACN,cAAc,EAAE,oBAAoB,CAAC,GAAG,CAAC;QACzC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;KACpD,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEjC,KAAK,CAAC,wBAAwB,OAAO,CAAC,QAAQ,aAAa,OAAO,CAAC,IAAI,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtG,KAAK,CAAC,sBAAsB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC;IAE3O,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC3D,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAC1D,OAAO,CAAC,CAAC;IACb,CAAC;IAED,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/C,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAE3C,KAAK,CAAC,mFAAmF,CAAC,CAAC;IAC3F,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1B,OAAO,CAAC,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB;YACI,OAAO,KAAK,CAAC;IACrB,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,IAAU,EAAE,KAA6B;IAC3D,MAAM,GAAG,GAA2B;QAChC,GAAG,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,CAAC;QACnD,GAAG,EAAE,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,YAAY,EAAE,cAAc,CAAC;QACjF,GAAG,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC;QAC5D,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;KACtE,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Run a database command: `migrate`, `rollback [steps]`, or `status`.
3
+ *
4
+ * Reuses the framework's own drivers (env-driven, same as the app):
5
+ * DATABASE_URL=postgres://… → Postgres
6
+ * DATABASE_URL=mysql://… → MySQL
7
+ * (unset) → SQLite (DB_FILE, default app.db)
8
+ *
9
+ * Migrations are read from `./migrations` (the convention used by
10
+ * `wild make:migration` and `wild resource`).
11
+ */
12
+ export declare function runDb(command: "migrate" | "rollback" | "status", args: string[]): Promise<number>;
13
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDvG"}
@@ -0,0 +1,104 @@
1
+ import { loadEnv } from "@wild-framework/config";
2
+ import { MigrationRunner, loadMigrations } from "@wild-framework/database";
3
+ /**
4
+ * Run a database command: `migrate`, `rollback [steps]`, or `status`.
5
+ *
6
+ * Reuses the framework's own drivers (env-driven, same as the app):
7
+ * DATABASE_URL=postgres://… → Postgres
8
+ * DATABASE_URL=mysql://… → MySQL
9
+ * (unset) → SQLite (DB_FILE, default app.db)
10
+ *
11
+ * Migrations are read from `./migrations` (the convention used by
12
+ * `wild make:migration` and `wild resource`).
13
+ */
14
+ export async function runDb(command, args) {
15
+ loadEnv();
16
+ const migrationsDir = "./migrations";
17
+ const migrations = safeLoadMigrations(migrationsDir);
18
+ const db = await resolveDatabase();
19
+ try {
20
+ const runner = new MigrationRunner(db.executor);
21
+ if (command === "status") {
22
+ const statuses = await runner.status(migrations);
23
+ if (statuses.length === 0) {
24
+ console.log("No migrations found in ./migrations.");
25
+ return 0;
26
+ }
27
+ for (const s of statuses) {
28
+ console.log(` ${s.applied ? "✓" : " "} ${s.name}${s.applied ? " (applied)" : " (pending)"}`);
29
+ }
30
+ const pending = statuses.filter((s) => !s.applied).length;
31
+ if (pending > 0) {
32
+ console.log(`\n${pending} pending migration(s) — run \`wild db:migrate\` to apply them.`);
33
+ }
34
+ else {
35
+ console.log("\nDatabase is up to date.");
36
+ }
37
+ return 0;
38
+ }
39
+ if (command === "migrate") {
40
+ const applied = await runner.migrate(migrations);
41
+ if (applied.length === 0) {
42
+ console.log("Database is up to date — no pending migrations.");
43
+ }
44
+ else {
45
+ console.log(`Applied ${applied.length} migration(s):`);
46
+ for (const name of applied)
47
+ console.log(` + ${name}`);
48
+ }
49
+ return 0;
50
+ }
51
+ // rollback
52
+ const steps = Number(args[0] ?? "1");
53
+ const reverted = await runner.rollback(migrations, Number.isFinite(steps) ? steps : 1);
54
+ if (reverted.length === 0) {
55
+ console.log("Nothing to roll back.");
56
+ }
57
+ else {
58
+ console.log(`Reverted ${reverted.length} migration(s):`);
59
+ for (const name of reverted)
60
+ console.log(` - ${name}`);
61
+ }
62
+ return 0;
63
+ }
64
+ finally {
65
+ await db.close();
66
+ }
67
+ }
68
+ /** Load migrations, returning [] (with a hint) when the dir is missing. */
69
+ function safeLoadMigrations(dir) {
70
+ try {
71
+ return loadMigrations(dir);
72
+ }
73
+ catch {
74
+ console.error(`wild: no migrations directory at ${dir}. Run "wild make:migration <name>" first.`);
75
+ return [];
76
+ }
77
+ }
78
+ /**
79
+ * Build the right driver from the environment, mirroring `@wild-framework/database-auto`.
80
+ *
81
+ * The heavy driver packages are imported lazily so `wild make:provider`
82
+ * (and friends) stay fast — only `wild db:*` pays the load cost.
83
+ */
84
+ async function resolveDatabase() {
85
+ const url = process.env.DATABASE_URL;
86
+ if (url?.startsWith("postgres://") || url?.startsWith("postgresql://")) {
87
+ const { PostgresDriver } = await import("@wild-framework/database-postgres");
88
+ const driver = new PostgresDriver({ connectionString: url });
89
+ await driver.connect();
90
+ return { executor: driver, close: () => driver.close() };
91
+ }
92
+ if (url?.startsWith("mysql://")) {
93
+ const { MysqlDriver } = await import("@wild-framework/database-mysql");
94
+ const driver = new MysqlDriver({ uri: url });
95
+ await driver.connect();
96
+ return { executor: driver, close: () => driver.close() };
97
+ }
98
+ // Default: SQLite
99
+ const { DrizzleDriver } = await import("@wild-framework/database-drizzle");
100
+ const driver = new DrizzleDriver({ filename: process.env.DB_FILE ?? "app.db" });
101
+ await driver.connect();
102
+ return { executor: driver, close: () => driver.close() };
103
+ }
104
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface DockerOptions {
2
+ /** Also emit docker-compose.yml. */
3
+ compose?: boolean;
4
+ }
5
+ /**
6
+ * Run `wild docker [--compose]`.
7
+ */
8
+ export declare function runDocker(args: string[], print?: (line: string) => void): number;
9
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/commands/docker.ts"],"names":[],"mappings":"AAmJA,MAAM,WAAW,aAAa;IAC1B,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,GAAG,MAAM,CAqD7F"}
@@ -0,0 +1,175 @@
1
+ import { existsSync, readFileSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ /** Detect the project's package manager from its lockfile. */
4
+ function detectPackageManager(cwd) {
5
+ if (existsSync(join(cwd, "pnpm-lock.yaml")))
6
+ return "pnpm";
7
+ if (existsSync(join(cwd, "yarn.lock")))
8
+ return "yarn";
9
+ return "npm";
10
+ }
11
+ /** Read package.json (best-effort). */
12
+ function readPackageJson(cwd) {
13
+ try {
14
+ return JSON.parse(readFileSync(join(cwd, "package.json"), "utf8"));
15
+ }
16
+ catch {
17
+ return {};
18
+ }
19
+ }
20
+ /** Detect the Node version from package.json engines, .nvmrc, else a default. */
21
+ function detectNodeVersion(cwd, pkg) {
22
+ const fromEngines = pkg.engines?.node?.replace(/[^0-9.]/g, "");
23
+ if (fromEngines)
24
+ return fromEngines;
25
+ try {
26
+ const nvmrc = readFileSync(join(cwd, ".nvmrc"), "utf8").trim();
27
+ if (nvmrc)
28
+ return nvmrc.replace(/^v/, "");
29
+ }
30
+ catch {
31
+ /* no .nvmrc */
32
+ }
33
+ return "20";
34
+ }
35
+ /** Detect the port from .env, else default 3000. */
36
+ function detectPort(cwd) {
37
+ try {
38
+ const env = readFileSync(join(cwd, ".env"), "utf8");
39
+ const match = env.match(/^PORT=(\d+)$/m);
40
+ if (match)
41
+ return match[1];
42
+ }
43
+ catch {
44
+ /* no .env */
45
+ }
46
+ try {
47
+ const example = readFileSync(join(cwd, ".env.example"), "utf8");
48
+ const match = example.match(/^PORT=(\d+)$/m);
49
+ if (match)
50
+ return match[1];
51
+ }
52
+ catch {
53
+ /* no .env.example */
54
+ }
55
+ return "3000";
56
+ }
57
+ /** Render a multi-stage Dockerfile for the detected context. */
58
+ function dockerfile(ctx) {
59
+ const pm = ctx.packageManager;
60
+ const installCmd = pm === "pnpm"
61
+ ? "RUN corepack enable && pnpm install --frozen-lockfile"
62
+ : pm === "yarn"
63
+ ? "RUN corepack enable && yarn install --frozen-lockfile"
64
+ : "RUN npm ci";
65
+ const runBuild = pm === "pnpm" ? "RUN pnpm build" : pm === "yarn" ? "RUN yarn build" : "RUN npm run build";
66
+ return `# syntax=docker/dockerfile:1
67
+ # Generated by \`wild docker\` — multi-stage build for a Node.js API.
68
+ FROM node:${ctx.nodeVersion}-alpine AS base
69
+ WORKDIR /app
70
+
71
+ # --- deps -------------------------------------------------------------
72
+ FROM base AS deps
73
+ COPY package.json ${ctx.lockfile} ./
74
+ ${installCmd}
75
+
76
+ # --- build ------------------------------------------------------------
77
+ FROM deps AS build
78
+ COPY . .
79
+ ${runBuild}
80
+
81
+ # --- runtime ----------------------------------------------------------
82
+ FROM base AS runtime
83
+ ENV NODE_ENV=production
84
+ COPY --from=deps /app/node_modules ./node_modules
85
+ COPY --from=build /app/dist ./dist
86
+ COPY --from=build /app/package.json ./
87
+ EXPOSE ${ctx.port}
88
+ CMD [${ctx.startCommand.split(" ").map((p) => JSON.stringify(p)).join(", ")}]
89
+ `;
90
+ }
91
+ /** Render a .dockerignore. */
92
+ function dockerignore() {
93
+ return `node_modules
94
+ dist
95
+ .env
96
+ .env.*
97
+ !.env.example
98
+ .git
99
+ coverage
100
+ *.log
101
+ *.db
102
+ *.db-*
103
+ Dockerfile
104
+ .dockerignore
105
+ `;
106
+ }
107
+ /** Render a docker-compose.yml with the service + healthcheck. */
108
+ function dockerCompose(ctx, appName) {
109
+ return `services:
110
+ ${appName}:
111
+ build: .
112
+ ports:
113
+ - "${ctx.port}:${ctx.port}"
114
+ environment:
115
+ NODE_ENV: production
116
+ healthcheck:
117
+ test: ["CMD", "wget", "-qO-", "http://localhost:${ctx.port}/health"]
118
+ interval: 10s
119
+ timeout: 5s
120
+ retries: 5
121
+ `;
122
+ }
123
+ /**
124
+ * Run `wild docker [--compose]`.
125
+ */
126
+ export function runDocker(args, print = console.log) {
127
+ const compose = args.includes("--compose");
128
+ const cwd = process.cwd();
129
+ const pkg = readPackageJson(cwd);
130
+ const ctx = {
131
+ packageManager: detectPackageManager(cwd),
132
+ nodeVersion: detectNodeVersion(cwd, pkg),
133
+ buildCommand: pkg.scripts?.build ?? "npm run build",
134
+ startCommand: pkg.scripts?.start ?? "node dist/index.js",
135
+ port: detectPort(cwd),
136
+ lockfile: detectPackageManager(cwd) === "pnpm"
137
+ ? "pnpm-lock.yaml"
138
+ : detectPackageManager(cwd) === "yarn"
139
+ ? "yarn.lock"
140
+ : "package-lock.json",
141
+ packageJson: pkg,
142
+ };
143
+ const appName = pkg.name ?? "app";
144
+ print(`\nDetected: ${ctx.packageManager} · Node ${ctx.nodeVersion} · port ${ctx.port}`);
145
+ print(` build: ${ctx.buildCommand} · start: ${ctx.startCommand}\n`);
146
+ const files = [
147
+ ["Dockerfile", dockerfile(ctx)],
148
+ [".dockerignore", dockerignore()],
149
+ ];
150
+ if (compose) {
151
+ files.push(["docker-compose.yml", dockerCompose(ctx, appName)]);
152
+ }
153
+ let written = 0;
154
+ for (const [name, content] of files) {
155
+ const path = join(cwd, name);
156
+ if (existsSync(path)) {
157
+ print(` skip ${name} (already exists)`);
158
+ continue;
159
+ }
160
+ mkdirSync(join(path, ".."), { recursive: true });
161
+ writeFileSync(path, content, "utf8");
162
+ print(` create ${name}`);
163
+ written++;
164
+ }
165
+ if (written === 0) {
166
+ print("\nNothing to do — all files already exist.");
167
+ }
168
+ else {
169
+ print(`\nDone. ${written} file(s) created.`);
170
+ print("Build it: docker build -t " + appName + " .");
171
+ print("Run it: docker run --rm -p " + ctx.port + ":" + ctx.port + " " + appName);
172
+ }
173
+ return 0;
174
+ }
175
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/commands/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Run `wild graph [--url <base>]` — fetch and print the Project Graph.
3
+ *
4
+ * The graph is served by `GraphProvider` (from `@wild-framework/graph`) at
5
+ * `GET /graph.json` on a running app. This command is the CLI bridge for
6
+ * visual builders and AI agents — same endpoint, machine-readable JSON.
7
+ */
8
+ export declare function runGraph(args: string[]): Promise<number>;
9
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B9D"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Run `wild graph [--url <base>]` — fetch and print the Project Graph.
3
+ *
4
+ * The graph is served by `GraphProvider` (from `@wild-framework/graph`) at
5
+ * `GET /graph.json` on a running app. This command is the CLI bridge for
6
+ * visual builders and AI agents — same endpoint, machine-readable JSON.
7
+ */
8
+ export async function runGraph(args) {
9
+ let base = "http://localhost:3000";
10
+ for (let i = 0; i < args.length; i++) {
11
+ if (args[i] === "--url" && args[i + 1]) {
12
+ base = args[i + 1];
13
+ i++;
14
+ }
15
+ }
16
+ const url = base.endsWith("/graph.json")
17
+ ? base
18
+ : `${base.replace(/\/+$/, "")}/graph.json`;
19
+ try {
20
+ const response = await fetch(url);
21
+ if (!response.ok) {
22
+ console.error(`wild: GET ${url} → ${response.status} ${response.statusText}`);
23
+ console.error('Is the app running with GraphProvider registered? (register it after feature providers)');
24
+ return 1;
25
+ }
26
+ const graph = await response.json();
27
+ console.log(JSON.stringify(graph, null, 2));
28
+ return 0;
29
+ }
30
+ catch (error) {
31
+ console.error(`wild: could not reach ${url}: ${error instanceof Error ? error.message : String(error)}`);
32
+ console.error('Start the app (pnpm dev) and register GraphProvider first.');
33
+ return 1;
34
+ }
35
+ }
36
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IACzC,IAAI,IAAI,GAAG,uBAAuB,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;YACpB,CAAC,EAAE,CAAC;QACR,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QACpC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC;IAE/C,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC9E,OAAO,CAAC,KAAK,CAAC,yFAAyF,CAAC,CAAC;YACzG,OAAO,CAAC,CAAC;QACb,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,CAAC;IACb,CAAC;AACL,CAAC"}
@@ -46,6 +46,6 @@ export declare function writeFiles(files: TargetFile[]): number;
46
46
  *
47
47
  * @returns true on success, false on error (error already printed)
48
48
  */
49
- export declare function makeCommand(piece: PieceName, args: Array<string | undefined>): boolean;
49
+ export declare function makeCommand(piece: PieceName | "migration", args: Array<string | undefined>): boolean;
50
50
  export { basename };
51
51
  //# sourceMappingURL=make.d.ts.map