@wild-framework/cli 0.1.1 → 0.2.0
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.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +109 -5
- package/dist/cli.js.map +1 -1
- package/dist/client/codegen.d.ts +32 -0
- package/dist/client/codegen.d.ts.map +1 -0
- package/dist/client/codegen.js +94 -0
- package/dist/client/codegen.js.map +1 -0
- package/dist/client/command.d.ts +29 -0
- package/dist/client/command.d.ts.map +1 -0
- package/dist/client/command.js +95 -0
- package/dist/client/command.js.map +1 -0
- package/dist/client/contract.d.ts +86 -0
- package/dist/client/contract.d.ts.map +1 -0
- package/dist/client/contract.js +12 -0
- package/dist/client/contract.js.map +1 -0
- package/dist/client/core.d.ts +80 -0
- package/dist/client/core.d.ts.map +1 -0
- package/dist/client/core.js +52 -0
- package/dist/client/core.js.map +1 -0
- package/dist/client/fs-writer.d.ts +13 -0
- package/dist/client/fs-writer.d.ts.map +1 -0
- package/dist/client/fs-writer.js +24 -0
- package/dist/client/fs-writer.js.map +1 -0
- package/dist/client/inspector.d.ts +19 -0
- package/dist/client/inspector.d.ts.map +1 -0
- package/dist/client/inspector.js +71 -0
- package/dist/client/inspector.js.map +1 -0
- package/dist/client/spec.d.ts +13 -0
- package/dist/client/spec.d.ts.map +1 -0
- package/dist/client/spec.js +235 -0
- package/dist/client/spec.js.map +1 -0
- package/dist/client/targets/index.d.ts +9 -0
- package/dist/client/targets/index.d.ts.map +1 -0
- package/dist/client/targets/index.js +11 -0
- package/dist/client/targets/index.js.map +1 -0
- package/dist/client/targets/react.d.ts +20 -0
- package/dist/client/targets/react.d.ts.map +1 -0
- package/dist/client/targets/react.js +519 -0
- package/dist/client/targets/react.js.map +1 -0
- package/dist/commands/ci.d.ts +5 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +254 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/db.d.ts +13 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +104 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/docker.d.ts +9 -0
- package/dist/commands/docker.d.ts.map +1 -0
- package/dist/commands/docker.js +175 -0
- package/dist/commands/docker.js.map +1 -0
- package/dist/commands/graph.d.ts +9 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +36 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/make.d.ts +1 -1
- package/dist/commands/make.d.ts.map +1 -1
- package/dist/commands/make.js +51 -0
- package/dist/commands/make.js.map +1 -1
- package/dist/commands/new.d.ts +24 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +374 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/resource.d.ts +33 -0
- package/dist/commands/resource.d.ts.map +1 -0
- package/dist/commands/resource.js +291 -0
- package/dist/commands/resource.js.map +1 -0
- package/dist/frontend/codegen.d.ts +27 -0
- package/dist/frontend/codegen.d.ts.map +1 -0
- package/dist/frontend/codegen.js +97 -0
- package/dist/frontend/codegen.js.map +1 -0
- package/dist/frontend/command.d.ts +22 -0
- package/dist/frontend/command.d.ts.map +1 -0
- package/dist/frontend/command.js +57 -0
- package/dist/frontend/command.js.map +1 -0
- package/dist/frontend/react.d.ts +14 -0
- package/dist/frontend/react.d.ts.map +1 -0
- package/dist/frontend/react.js +156 -0
- package/dist/frontend/react.js.map +1 -0
- package/dist/frontend/scaffold.d.ts +20 -0
- package/dist/frontend/scaffold.d.ts.map +1 -0
- package/dist/frontend/scaffold.js +157 -0
- package/dist/frontend/scaffold.js.map +1 -0
- package/dist/frontend/spec.d.ts +33 -0
- package/dist/frontend/spec.d.ts.map +1 -0
- package/dist/frontend/spec.js +74 -0
- package/dist/frontend/spec.js.map +1 -0
- package/dist/templates/resource-slice.d.ts +87 -0
- package/dist/templates/resource-slice.d.ts.map +1 -0
- package/dist/templates/resource-slice.js +513 -0
- package/dist/templates/resource-slice.js.map +1 -0
- package/package.json +8 -2
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAwBjC,8DAA8D;AAC9D,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,uCAAuC;AACvC,SAAS,eAAe,CAAC,GAAW;IAChC,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAiC,CAAC;IACvG,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,iFAAiF;AACjF,SAAS,iBAAiB,CAAC,GAAW,EAAE,GAAiC;IACrE,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACL,eAAe;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,oDAAoD;AACpD,SAAS,UAAU,CAAC,GAAW;IAC3B,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACzC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,aAAa;IACjB,CAAC;IACD,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,qBAAqB;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,gEAAgE;AAChE,SAAS,UAAU,CAAC,GAAkB;IAClC,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC;IAE9B,MAAM,UAAU,GACZ,EAAE,KAAK,MAAM;QACT,CAAC,CAAC,uDAAuD;QACzD,CAAC,CAAC,EAAE,KAAK,MAAM;YACb,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,YAAY,CAAC;IAEzB,MAAM,QAAQ,GACV,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAE9F,OAAO;;YAEC,GAAG,CAAC,WAAW;;;;;oBAKP,GAAG,CAAC,QAAQ;EAC9B,UAAU;;;;;EAKV,QAAQ;;;;;;;;SAQD,GAAG,CAAC,IAAI;OACV,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAC1E,CAAC;AACF,CAAC;AAED,8BAA8B;AAC9B,SAAS,YAAY;IACjB,OAAO;;;;;;;;;;;;CAYV,CAAC;AACF,CAAC;AAED,kEAAkE;AAClE,SAAS,aAAa,CAAC,GAAkB,EAAE,OAAe;IACtD,OAAO;IACP,OAAO;;;WAGA,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI;;;;wDAIyB,GAAG,CAAC,IAAI;;;;CAI/D,CAAC;AACF,CAAC;AAOD;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,QAAgC,OAAO,CAAC,GAAG;IACjF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,GAAG,GAAkB;QACvB,cAAc,EAAE,oBAAoB,CAAC,GAAG,CAAC;QACzC,WAAW,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;QACxC,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,eAAe;QACnD,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,oBAAoB;QACxD,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC;QACrB,QAAQ,EACJ,oBAAoB,CAAC,GAAG,CAAC,KAAK,MAAM;YAChC,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,MAAM;gBACpC,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,mBAAmB;QAC/B,WAAW,EAAE,GAAG;KACnB,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC;IAClC,KAAK,CAAC,eAAe,GAAG,CAAC,cAAc,WAAW,GAAG,CAAC,WAAW,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACxF,KAAK,CAAC,YAAY,GAAG,CAAC,YAAY,eAAe,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;IAEvE,MAAM,KAAK,GAA4B;QACnC,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC;KACpC,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,KAAK,CAAC,WAAW,IAAI,mBAAmB,CAAC,CAAC;YAC1C,SAAS;QACb,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACrC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAC1B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,WAAW,OAAO,mBAAmB,CAAC,CAAC;QAC7C,KAAK,CAAC,6BAA6B,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,gCAAgC,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC"}
|
|
@@ -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"}
|
package/dist/commands/make.d.ts
CHANGED
|
@@ -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
|