@asterflow/cli 0.1.0 → 2.0.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.
- package/dist/cjs/index.cjs +311 -220
- package/dist/mjs/index.js +323 -232
- package/dist/types/generators/packageJson.d.ts +1 -1
- package/dist/types/helpers/npmVersion.d.ts +12 -0
- package/dist/types/registry/plugins.d.ts +0 -1
- package/package.json +2 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,30 +1,115 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
3
|
+
var Ce = Object.create;
|
|
4
|
+
var K = Object.defineProperty;
|
|
5
|
+
var De = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var Oe = Object.getOwnPropertyNames;
|
|
7
|
+
var Fe = Object.getPrototypeOf, Me = Object.prototype.hasOwnProperty;
|
|
8
|
+
var _e = (e, t, r, s) => {
|
|
9
9
|
if (t && typeof t == "object" || typeof t == "function")
|
|
10
|
-
for (let l of
|
|
11
|
-
!
|
|
10
|
+
for (let l of Oe(t))
|
|
11
|
+
!Me.call(e, l) && l !== r && K(e, l, { get: () => t[l], enumerable: !(s = De(t, l)) || s.enumerable });
|
|
12
12
|
return e;
|
|
13
13
|
};
|
|
14
|
-
var $ = (e, t, r) => (r = e != null ?
|
|
15
|
-
t || !e || !e.__esModule ?
|
|
14
|
+
var $ = (e, t, r) => (r = e != null ? Ce(Fe(e)) : {}, _e(
|
|
15
|
+
t || !e || !e.__esModule ? K(r, "default", { value: e, enumerable: !0 }) : r,
|
|
16
16
|
e
|
|
17
17
|
));
|
|
18
18
|
// packages/cli/src/index.ts
|
|
19
|
-
var
|
|
19
|
+
var Ne = $(require("yargs"), 1), Se = require("yargs/helpers");
|
|
20
20
|
// packages/cli/src/commands/add.ts
|
|
21
|
-
var
|
|
21
|
+
var ie = require("child_process"), se = require("fs"), C = require("fs/promises"), D = require("path"), oe = require("util");
|
|
22
|
+
// packages/cli/package.json
|
|
23
|
+
var G = {
|
|
24
|
+
name: "@asterflow/cli",
|
|
25
|
+
version: "2.0.2",
|
|
26
|
+
description: "CLI for scaffolding AsterFlow projects, adding plugins, and generating the static fs-routing manifest.",
|
|
27
|
+
keywords: [
|
|
28
|
+
"asterflow",
|
|
29
|
+
"cli",
|
|
30
|
+
"scaffolding",
|
|
31
|
+
"generator"
|
|
32
|
+
],
|
|
33
|
+
main: "dist/cjs/index.cjs",
|
|
34
|
+
module: "dist/mjs/index.js",
|
|
35
|
+
types: "dist/types/index.d.ts",
|
|
36
|
+
typings: "dist/types/index.d.ts",
|
|
37
|
+
type: "module",
|
|
38
|
+
license: "MIT",
|
|
39
|
+
author: "Ashu11-A",
|
|
40
|
+
repository: {
|
|
41
|
+
type: "git",
|
|
42
|
+
url: "git+https://github.com/AsterFlow/AsterFlow.git"
|
|
43
|
+
},
|
|
44
|
+
bugs: {
|
|
45
|
+
url: "https://github.com/AsterFlow/AsterFlow/issues"
|
|
46
|
+
},
|
|
47
|
+
homepage: "https://github.com/AsterFlow/AsterFlow",
|
|
48
|
+
bin: {
|
|
49
|
+
asterflow: "dist/cjs/index.cjs"
|
|
50
|
+
},
|
|
51
|
+
exports: {
|
|
52
|
+
".": {
|
|
53
|
+
types: "./dist/types/index.d.ts",
|
|
54
|
+
import: "./dist/mjs/index.js",
|
|
55
|
+
require: "./dist/cjs/index.cjs"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
engines: {
|
|
59
|
+
node: ">=20"
|
|
60
|
+
},
|
|
61
|
+
scripts: {
|
|
62
|
+
dev: "bun run src/index.ts"
|
|
63
|
+
},
|
|
64
|
+
dependencies: {
|
|
65
|
+
"@asterflow/fs": "workspace:../../plugins/fs",
|
|
66
|
+
"@clack/prompts": "^0.9.1",
|
|
67
|
+
chalk: "^4.1.2",
|
|
68
|
+
"ci-info": "^4.1.0",
|
|
69
|
+
"validate-npm-package-name": "^6.0.0",
|
|
70
|
+
yargs: "^18.0.0"
|
|
71
|
+
},
|
|
72
|
+
devDependencies: {
|
|
73
|
+
"@types/validate-npm-package-name": "^4.0.2",
|
|
74
|
+
"@types/yargs": "^17.0.33"
|
|
75
|
+
},
|
|
76
|
+
peerDependencies: {
|
|
77
|
+
typescript: "^5.8.3"
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
// packages/cli/src/helpers/npmVersion.ts
|
|
81
|
+
var Ge = "https://registry.npmjs.org", Ue = 5e3, [Q, X] = G.version.split(".").map(Number);
|
|
82
|
+
async function Ve(e) {
|
|
83
|
+
let t = new AbortController(), r = setTimeout(() => t.abort(), Ue);
|
|
84
|
+
try {
|
|
85
|
+
let s = await fetch(`${Ge}/${encodeURIComponent(e)}`, {
|
|
86
|
+
signal: t.signal,
|
|
87
|
+
headers: { Accept: "application/vnd.npm.install-v1+json" }
|
|
88
|
+
});
|
|
89
|
+
if (!s.ok) return [];
|
|
90
|
+
let l = await s.json();
|
|
91
|
+
return Object.keys(l.versions ?? {});
|
|
92
|
+
} catch {
|
|
93
|
+
return [];
|
|
94
|
+
} finally {
|
|
95
|
+
clearTimeout(r);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function I(e) {
|
|
99
|
+
let t = await Ve(e), r = -1;
|
|
100
|
+
for (let l of t) {
|
|
101
|
+
let y = /^(\d+)\.(\d+)\.(\d+)$/.exec(l);
|
|
102
|
+
if (!y) continue;
|
|
103
|
+
let [, d, c, p] = y;
|
|
104
|
+
Number(d) !== Q || Number(c) !== X || (r = Math.max(r, Number(p)));
|
|
105
|
+
}
|
|
106
|
+
return `^${r >= 0 ? `${Q}.${X}.${r}` : G.version}`;
|
|
107
|
+
}
|
|
22
108
|
// packages/cli/src/registry/plugins.ts
|
|
23
|
-
var
|
|
109
|
+
var w = {
|
|
24
110
|
fs: {
|
|
25
111
|
id: "fs",
|
|
26
112
|
packageName: "@asterflow/fs",
|
|
27
|
-
version: "^1.0.7",
|
|
28
113
|
description: "File system-based routing - routes are discovered from a routes/ directory.",
|
|
29
114
|
importName: "fsRoutingPlugin",
|
|
30
115
|
useSnippet: ".use(fsRoutingPlugin, { routes })",
|
|
@@ -33,41 +118,40 @@ var b = {
|
|
|
33
118
|
multipart: {
|
|
34
119
|
id: "multipart",
|
|
35
120
|
packageName: "@asterflow/multipart",
|
|
36
|
-
version: "^1.0.0",
|
|
37
121
|
description: "multipart/form-data parsing (file uploads), with per-route type-safe field criteria.",
|
|
38
122
|
importName: "multipartPlugin",
|
|
39
123
|
useSnippet: ".use(multipartPlugin, { limits: { fileSize: 10 * 1024 * 1024 } })",
|
|
40
124
|
usageNote: "Build upload routes with Method.create(Method.POST).multipart({...}).handler(...) - see src/routes/upload.ts for a working example."
|
|
41
125
|
}
|
|
42
|
-
},
|
|
126
|
+
}, it = Object.keys(w);
|
|
43
127
|
// packages/cli/src/utils/log.ts
|
|
44
|
-
var
|
|
45
|
-
info: (e) => console.log(
|
|
46
|
-
success: (e) => console.log(
|
|
47
|
-
warn: (e) => console.log(
|
|
48
|
-
error: (e) => console.error(
|
|
49
|
-
step: (e) => console.log(
|
|
128
|
+
var A = $(require("chalk"), 1), m = {
|
|
129
|
+
info: (e) => console.log(A.default.cyan(e)),
|
|
130
|
+
success: (e) => console.log(A.default.green(e)),
|
|
131
|
+
warn: (e) => console.log(A.default.yellow(e)),
|
|
132
|
+
error: (e) => console.error(A.default.red(e)),
|
|
133
|
+
step: (e) => console.log(A.default.gray(` ${e}`))
|
|
50
134
|
};
|
|
51
135
|
// packages/cli/src/utils/packageManager.ts
|
|
52
|
-
var
|
|
136
|
+
var Z = require("fs"), ee = require("path"), Be = {
|
|
53
137
|
"bun.lock": "bun",
|
|
54
138
|
"bun.lockb": "bun",
|
|
55
139
|
"pnpm-lock.yaml": "pnpm",
|
|
56
140
|
"yarn.lock": "yarn",
|
|
57
141
|
"package-lock.json": "npm"
|
|
58
142
|
};
|
|
59
|
-
function
|
|
60
|
-
for (let [t, r] of Object.entries(
|
|
61
|
-
if ((0,
|
|
143
|
+
function U(e) {
|
|
144
|
+
for (let [t, r] of Object.entries(Be))
|
|
145
|
+
if ((0, Z.existsSync)((0, ee.join)(e, t))) return r;
|
|
62
146
|
return "bun";
|
|
63
147
|
}
|
|
64
|
-
function
|
|
65
|
-
return e ??
|
|
148
|
+
function te(e, t) {
|
|
149
|
+
return e ?? U(t);
|
|
66
150
|
}
|
|
67
|
-
function
|
|
151
|
+
function re(e) {
|
|
68
152
|
return e === "yarn" ? "yarn" : `${e} install`;
|
|
69
153
|
}
|
|
70
|
-
function
|
|
154
|
+
function ne(e, t) {
|
|
71
155
|
let r = t.join(" ");
|
|
72
156
|
switch (e) {
|
|
73
157
|
case "bun":
|
|
@@ -81,126 +165,133 @@ function Z(e, t) {
|
|
|
81
165
|
}
|
|
82
166
|
}
|
|
83
167
|
// packages/cli/src/commands/add.ts
|
|
84
|
-
var
|
|
85
|
-
async function
|
|
86
|
-
let r = (0,
|
|
168
|
+
var We = (0, oe.promisify)(ie.exec);
|
|
169
|
+
async function ae({ names: e, directory: t }) {
|
|
170
|
+
let r = (0, D.resolve)(t ?? "."), s = (0, D.join)(r, "package.json"), l = e.split(",").map((o) => o.trim()).filter(Boolean);
|
|
87
171
|
if (l.length === 0) {
|
|
88
|
-
|
|
172
|
+
m.error("No plugin names given. Usage: asterflow add fs,multipart"), process.exitCode = 1;
|
|
89
173
|
return;
|
|
90
174
|
}
|
|
91
|
-
let
|
|
92
|
-
if (
|
|
93
|
-
|
|
175
|
+
let y = l.filter((o) => !w[o]);
|
|
176
|
+
if (y.length > 0) {
|
|
177
|
+
m.error(`Unknown plugin${y.length > 1 ? "s" : ""}: ${y.join(", ")}`), m.step(`Available plugins: ${Object.keys(w).join(", ")}`), process.exitCode = 1;
|
|
94
178
|
return;
|
|
95
179
|
}
|
|
96
|
-
if (!(0,
|
|
97
|
-
|
|
180
|
+
if (!(0, se.existsSync)(s)) {
|
|
181
|
+
m.error(`No package.json found at ${s}. Run this from an AsterFlow project (or \`asterflow init\` first).`), process.exitCode = 1;
|
|
98
182
|
return;
|
|
99
183
|
}
|
|
100
|
-
let
|
|
101
|
-
|
|
102
|
-
let
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
184
|
+
let d = l.map((o) => w[o]), c = await (0, C.readFile)(s, "utf-8"), p = JSON.parse(c);
|
|
185
|
+
p.dependencies ??= {};
|
|
186
|
+
let x = d.filter((o) => p.dependencies[o.packageName]), h = d.filter((o) => !p.dependencies[o.packageName]), v = await Promise.all(h.map((o) => I(o.packageName)));
|
|
187
|
+
if (h.forEach((o, u) => {
|
|
188
|
+
p.dependencies[o.packageName] = v[u];
|
|
189
|
+
}), p.dependencies = Object.fromEntries(Object.entries(p.dependencies).sort(([o], [u]) => o.localeCompare(u))), h.length > 0) {
|
|
190
|
+
await (0, C.writeFile)(s, `${JSON.stringify(p, null, 2)}
|
|
191
|
+
`), m.success(`Added to package.json: ${h.map((f) => f.packageName).join(", ")}`);
|
|
192
|
+
let o = U(r), u = ne(o, h.map((f) => f.packageName));
|
|
193
|
+
m.info(`Installing (${u})...`);
|
|
109
194
|
try {
|
|
110
|
-
await
|
|
111
|
-
} catch (
|
|
112
|
-
|
|
195
|
+
await We(u, { cwd: r }), m.success("Dependencies installed.");
|
|
196
|
+
} catch (f) {
|
|
197
|
+
m.error(`Install failed - run manually: ${u}`), m.step(f instanceof Error ? f.message : String(f));
|
|
113
198
|
}
|
|
114
199
|
}
|
|
115
|
-
|
|
116
|
-
for (let
|
|
117
|
-
|
|
200
|
+
x.length > 0 && m.warn(`Already present, skipped: ${x.map((o) => o.packageName).join(", ")}`), m.info("Wire it up:");
|
|
201
|
+
for (let o of d)
|
|
202
|
+
m.step(`import { ${o.importName} } from '${o.packageName}'`), m.step(`app${o.useSnippet}`), m.step(o.usageNote);
|
|
118
203
|
}
|
|
119
204
|
// packages/cli/src/commands/generate.ts
|
|
120
|
-
var
|
|
121
|
-
var
|
|
122
|
-
async function
|
|
123
|
-
let
|
|
205
|
+
var pe = require("@asterflow/fs"), ce = require("fs"), E = require("path");
|
|
206
|
+
var Ye = "src/routes", le = "src/routes.gen.ts";
|
|
207
|
+
async function de({ directory: e, out: t, watch: r }) {
|
|
208
|
+
let s = (0, E.resolve)(e ?? Ye), l = (0, E.resolve)(t ?? le), y = async () => {
|
|
124
209
|
try {
|
|
125
|
-
await (0,
|
|
126
|
-
} catch (
|
|
127
|
-
|
|
210
|
+
await (0, pe.generateRouteManifest)({ routesDir: s, outFile: l }), m.success(`Generated ${(0, E.join)(t ?? le)}`);
|
|
211
|
+
} catch (c) {
|
|
212
|
+
m.error(c instanceof Error ? c.message : String(c)), r || (process.exitCode = 1);
|
|
128
213
|
}
|
|
129
214
|
};
|
|
130
|
-
if (await
|
|
131
|
-
|
|
132
|
-
let
|
|
133
|
-
(0,
|
|
134
|
-
clearTimeout(
|
|
215
|
+
if (await y(), !r) return;
|
|
216
|
+
m.info(`Watching ${s} for changes...`);
|
|
217
|
+
let d;
|
|
218
|
+
(0, ce.watch)(s, { recursive: !0 }, () => {
|
|
219
|
+
clearTimeout(d), d = setTimeout(y, 100);
|
|
135
220
|
});
|
|
136
221
|
}
|
|
137
222
|
// packages/cli/src/commands/init.ts
|
|
138
|
-
var i = $(require("@clack/prompts"), 1),
|
|
223
|
+
var i = $(require("@clack/prompts"), 1), q = $(require("ci-info"), 1), Ie = require("child_process"), k = require("fs/promises"), g = require("path"), Ae = require("util");
|
|
139
224
|
// packages/cli/src/generators/appEntry.ts
|
|
140
|
-
function
|
|
141
|
-
let
|
|
225
|
+
function me({ adapter: e, plugins: t, stub: r }) {
|
|
226
|
+
let s = t.some((c) => c.id === "fs"), l = [
|
|
142
227
|
"import { AsterFlow } from 'asterflow'",
|
|
143
228
|
"import { adapters } from '@asterflow/adapter'",
|
|
144
229
|
...e.imports,
|
|
145
|
-
...t.map((
|
|
146
|
-
...
|
|
147
|
-
],
|
|
148
|
-
...t.map((
|
|
149
|
-
...!
|
|
230
|
+
...t.map((c) => `import { ${c.importName} } from '${c.packageName}'`),
|
|
231
|
+
...s ? ["import routes from './routes.gen'"] : []
|
|
232
|
+
], y = [
|
|
233
|
+
...t.map((c) => c.useSnippet.replace(/^\./, "")),
|
|
234
|
+
...!s && r ? [`method('get', {
|
|
150
235
|
path: '/',
|
|
151
236
|
handler({ response }) {
|
|
152
237
|
return response.success({ message: 'Hello from AsterFlow!' })
|
|
153
238
|
}
|
|
154
239
|
})`] : [],
|
|
155
240
|
`listen${e.listenCall}`
|
|
156
|
-
],
|
|
241
|
+
], d = e.preamble ? `${e.preamble}
|
|
157
242
|
` : "";
|
|
158
243
|
return `${l.join(`
|
|
159
244
|
`)}
|
|
160
|
-
${
|
|
161
|
-
.${
|
|
245
|
+
${d}export default new AsterFlow({ driver: ${e.driverExpression} })
|
|
246
|
+
.${y.join(`
|
|
162
247
|
.`)}
|
|
163
248
|
`;
|
|
164
249
|
}
|
|
165
250
|
// packages/cli/src/generators/packageJson.ts
|
|
166
|
-
function
|
|
167
|
-
let
|
|
168
|
-
asterflow
|
|
169
|
-
"@asterflow/adapter"
|
|
251
|
+
async function ue({ name: e, adapter: t, plugins: r }) {
|
|
252
|
+
let s = r.some((u) => u.id === "fs"), [l, y, d, c] = await Promise.all([
|
|
253
|
+
I("asterflow"),
|
|
254
|
+
I("@asterflow/adapter"),
|
|
255
|
+
s ? I("@asterflow/cli") : Promise.resolve(null),
|
|
256
|
+
Promise.all(r.map((u) => I(u.packageName)))
|
|
257
|
+
]), p = {
|
|
258
|
+
asterflow: l,
|
|
259
|
+
"@asterflow/adapter": y,
|
|
170
260
|
zod: "^3.25.67"
|
|
171
261
|
};
|
|
172
|
-
t.dependency && (
|
|
173
|
-
|
|
174
|
-
|
|
262
|
+
t.dependency && (p[t.dependency] = "latest"), r.forEach((u, f) => {
|
|
263
|
+
p[u.packageName] = c[f];
|
|
264
|
+
});
|
|
265
|
+
let x = Object.fromEntries(Object.entries(p).sort(([u], [f]) => u.localeCompare(f))), h = s ? {
|
|
175
266
|
predev: "asterflow generate",
|
|
176
267
|
dev: "bun run src/index.ts",
|
|
177
268
|
prebuild: "asterflow generate"
|
|
178
|
-
} : { dev: "bun run src/index.ts" },
|
|
269
|
+
} : { dev: "bun run src/index.ts" }, v = {
|
|
179
270
|
typescript: "^5.8.3",
|
|
180
271
|
"@types/bun": "latest"
|
|
181
272
|
};
|
|
182
|
-
return
|
|
273
|
+
return s && d && (v["@asterflow/cli"] = d), `${JSON.stringify({
|
|
183
274
|
name: e,
|
|
184
275
|
version: "0.1.0",
|
|
185
276
|
type: "module",
|
|
186
277
|
private: !0,
|
|
187
|
-
scripts:
|
|
188
|
-
dependencies:
|
|
189
|
-
devDependencies:
|
|
278
|
+
scripts: h,
|
|
279
|
+
dependencies: x,
|
|
280
|
+
devDependencies: v
|
|
190
281
|
}, null, 2)}
|
|
191
282
|
`;
|
|
192
283
|
}
|
|
193
284
|
// packages/cli/src/helpers/copyTemplate.ts
|
|
194
|
-
var
|
|
195
|
-
async function
|
|
196
|
-
return (0,
|
|
285
|
+
var O = require("fs/promises"), V = require("path"), Je = (0, V.join)(__dirname, "..", "..", "templates");
|
|
286
|
+
async function B(e) {
|
|
287
|
+
return (0, O.readFile)((0, V.join)(Je, e), "utf-8");
|
|
197
288
|
}
|
|
198
|
-
async function
|
|
199
|
-
let r = await
|
|
200
|
-
await (0,
|
|
289
|
+
async function W(e, t) {
|
|
290
|
+
let r = await B(e);
|
|
291
|
+
await (0, O.writeFile)(t, r);
|
|
201
292
|
}
|
|
202
293
|
// packages/cli/src/registry/templates.ts
|
|
203
|
-
var
|
|
294
|
+
var ge = {
|
|
204
295
|
hello: {
|
|
205
296
|
id: "hello",
|
|
206
297
|
path: "/",
|
|
@@ -214,55 +305,55 @@ var ce = {
|
|
|
214
305
|
plugin: "multipart",
|
|
215
306
|
summary: "File upload handled by @asterflow/multipart."
|
|
216
307
|
}
|
|
217
|
-
},
|
|
218
|
-
function
|
|
308
|
+
}, R = Object.keys(ge);
|
|
309
|
+
function F(e) {
|
|
219
310
|
let t = new Set(e);
|
|
220
|
-
return
|
|
311
|
+
return R.map((r) => ge[r]).filter((r) => !r.plugin || t.has(r.plugin));
|
|
221
312
|
}
|
|
222
|
-
function
|
|
313
|
+
function fe(e) {
|
|
223
314
|
let t = e.path.replace(/^\/+|\/+$/g, "");
|
|
224
315
|
return t.length === 0 ? "index.ts" : `${t}/index.ts`;
|
|
225
316
|
}
|
|
226
317
|
// packages/cli/src/generators/routes.ts
|
|
227
|
-
async function
|
|
318
|
+
async function ye({ pluginIds: e, templateIds: t }) {
|
|
228
319
|
if (!e.includes("fs")) return [];
|
|
229
|
-
let r =
|
|
230
|
-
return Promise.all(r.map(async (
|
|
231
|
-
fileName:
|
|
232
|
-
content: await
|
|
320
|
+
let r = F(e).filter((s) => t.includes(s.id));
|
|
321
|
+
return Promise.all(r.map(async (s) => ({
|
|
322
|
+
fileName: fe(s),
|
|
323
|
+
content: await B(s.source)
|
|
233
324
|
})));
|
|
234
325
|
}
|
|
235
326
|
// packages/cli/src/helpers/git.ts
|
|
236
|
-
var P = require("child_process"),
|
|
237
|
-
function
|
|
327
|
+
var P = require("child_process"), he = require("fs"), be = require("path");
|
|
328
|
+
function qe(e) {
|
|
238
329
|
try {
|
|
239
330
|
return (0, P.execSync)("git rev-parse --is-inside-work-tree", { cwd: e, stdio: "ignore" }), !0;
|
|
240
331
|
} catch {
|
|
241
332
|
return !1;
|
|
242
333
|
}
|
|
243
334
|
}
|
|
244
|
-
function
|
|
335
|
+
function ze(e) {
|
|
245
336
|
try {
|
|
246
337
|
return (0, P.execSync)("git config init.defaultBranch", { cwd: e, stdio: "ignore" }), !0;
|
|
247
338
|
} catch {
|
|
248
339
|
return !1;
|
|
249
340
|
}
|
|
250
341
|
}
|
|
251
|
-
function
|
|
342
|
+
function we(e) {
|
|
252
343
|
let t = !1;
|
|
253
344
|
try {
|
|
254
|
-
return (0, P.execSync)("git --version", { stdio: "ignore" }),
|
|
345
|
+
return (0, P.execSync)("git --version", { stdio: "ignore" }), qe(e) ? !1 : ((0, P.execSync)("git init", { cwd: e, stdio: "ignore" }), t = !0, ze(e) || (0, P.execSync)("git checkout -b main", { cwd: e, stdio: "ignore" }), (0, P.execSync)("git add -A", { cwd: e, stdio: "ignore" }), (0, P.execSync)('git commit -m "Initial commit from create-asterflow-app"', { cwd: e, stdio: "ignore" }), !0);
|
|
255
346
|
} catch {
|
|
256
347
|
if (t)
|
|
257
348
|
try {
|
|
258
|
-
(0,
|
|
349
|
+
(0, he.rmSync)((0, be.join)(e, ".git"), { recursive: !0, force: !0 });
|
|
259
350
|
} catch {
|
|
260
351
|
}
|
|
261
352
|
return !1;
|
|
262
353
|
}
|
|
263
354
|
}
|
|
264
355
|
// packages/cli/src/helpers/isFolderEmpty.ts
|
|
265
|
-
var
|
|
356
|
+
var M = require("fs"), ke = require("path"), Y = $(require("chalk"), 1), He = new Set([
|
|
266
357
|
".DS_Store",
|
|
267
358
|
".git",
|
|
268
359
|
".gitattributes",
|
|
@@ -277,36 +368,36 @@ var F = require("fs"), ye = require("path"), W = $(require("chalk"), 1), Ue = n
|
|
|
277
368
|
"LICENSE",
|
|
278
369
|
"Thumbs.db"
|
|
279
370
|
]);
|
|
280
|
-
function
|
|
281
|
-
let r = (0,
|
|
371
|
+
function xe(e, t) {
|
|
372
|
+
let r = (0, M.readdirSync)(e).filter((s) => !He.has(s) && !s.endsWith(".iml"));
|
|
282
373
|
if (r.length === 0) return !0;
|
|
283
|
-
console.log(`The directory ${
|
|
284
|
-
for (let
|
|
285
|
-
let l = (0,
|
|
286
|
-
console.log(` ${
|
|
374
|
+
console.log(`The directory ${Y.default.green(t)} contains files that could conflict:`), console.log();
|
|
375
|
+
for (let s of r) {
|
|
376
|
+
let l = (0, M.lstatSync)((0, ke.join)(e, s)).isDirectory();
|
|
377
|
+
console.log(` ${Y.default.cyan(s)}${l ? "/" : ""}`);
|
|
287
378
|
}
|
|
288
379
|
return console.log(), console.log("Either try using a new directory name, or remove the files listed above."), console.log(), !1;
|
|
289
380
|
}
|
|
290
381
|
// packages/cli/src/helpers/isWriteable.ts
|
|
291
|
-
var
|
|
292
|
-
async function
|
|
382
|
+
var ve = require("fs"), je = require("fs/promises");
|
|
383
|
+
async function Pe(e) {
|
|
293
384
|
try {
|
|
294
|
-
return await (0,
|
|
385
|
+
return await (0, je.access)(e, ve.constants.W_OK), !0;
|
|
295
386
|
} catch {
|
|
296
387
|
return !1;
|
|
297
388
|
}
|
|
298
389
|
}
|
|
299
390
|
// packages/cli/src/helpers/validateProjectName.ts
|
|
300
|
-
var
|
|
301
|
-
function
|
|
302
|
-
let t = (0,
|
|
391
|
+
var $e = $(require("validate-npm-package-name"), 1);
|
|
392
|
+
function J(e) {
|
|
393
|
+
let t = (0, $e.default)(e);
|
|
303
394
|
return t.validForNewPackages ? { valid: !0 } : {
|
|
304
395
|
valid: !1,
|
|
305
396
|
problems: [...t.errors ?? [], ...t.warnings ?? []]
|
|
306
397
|
};
|
|
307
398
|
}
|
|
308
399
|
// packages/cli/src/registry/adapters.ts
|
|
309
|
-
var
|
|
400
|
+
var N = {
|
|
310
401
|
bun: {
|
|
311
402
|
id: "bun",
|
|
312
403
|
label: "Bun (native Bun.serve)",
|
|
@@ -319,7 +410,7 @@ var S = {
|
|
|
319
410
|
console.error(err)
|
|
320
411
|
process.exit(1)
|
|
321
412
|
}
|
|
322
|
-
console.log('Server listening on http:
|
|
413
|
+
console.log('Server listening on http://localhost:3333')
|
|
323
414
|
})`
|
|
324
415
|
},
|
|
325
416
|
node: {
|
|
@@ -334,7 +425,7 @@ var S = {
|
|
|
334
425
|
console.error(err)
|
|
335
426
|
process.exit(1)
|
|
336
427
|
}
|
|
337
|
-
console.log('Server listening on http:
|
|
428
|
+
console.log('Server listening on http://localhost:3333')
|
|
338
429
|
})`
|
|
339
430
|
},
|
|
340
431
|
express: {
|
|
@@ -345,7 +436,7 @@ var S = {
|
|
|
345
436
|
driverExpression: "adapters.express",
|
|
346
437
|
preamble: "const server = express()",
|
|
347
438
|
listenCall: `(server, 3333, () => {
|
|
348
|
-
console.log('Server listening on http:
|
|
439
|
+
console.log('Server listening on http://localhost:3333')
|
|
349
440
|
})`
|
|
350
441
|
},
|
|
351
442
|
fastify: {
|
|
@@ -360,194 +451,194 @@ var S = {
|
|
|
360
451
|
console.error(err)
|
|
361
452
|
process.exit(1)
|
|
362
453
|
}
|
|
363
|
-
console.log('Server listening on http:
|
|
454
|
+
console.log('Server listening on http://localhost:3333')
|
|
364
455
|
})`
|
|
365
456
|
}
|
|
366
|
-
},
|
|
457
|
+
}, S = Object.keys(N);
|
|
367
458
|
// packages/cli/src/commands/init.ts
|
|
368
|
-
var
|
|
459
|
+
var Ke = (0, Ae.promisify)(Ie.exec), j = {
|
|
369
460
|
adapter: "bun",
|
|
370
461
|
plugins: ["fs", "multipart"],
|
|
371
462
|
install: !0,
|
|
372
463
|
git: !0
|
|
373
464
|
};
|
|
374
|
-
async function
|
|
465
|
+
async function Ee(e) {
|
|
375
466
|
i.intro("Create a new AsterFlow project");
|
|
376
|
-
let t = (0,
|
|
377
|
-
if (!await
|
|
467
|
+
let t = (0, g.resolve)(e.directory ?? "."), r = (0, g.basename)(t) === "." ? "my-asterflow-app" : (0, g.basename)(t);
|
|
468
|
+
if (!await Pe((0, g.dirname)(t))) {
|
|
378
469
|
i.cancel(`The path ${t} is not writable. Check folder permissions and try again.`), process.exitCode = 1;
|
|
379
470
|
return;
|
|
380
471
|
}
|
|
381
|
-
if (await (0, k.mkdir)(t, { recursive: !0 }), !
|
|
472
|
+
if (await (0, k.mkdir)(t, { recursive: !0 }), !xe(t, (0, g.basename)(t))) {
|
|
382
473
|
process.exitCode = 1;
|
|
383
474
|
return;
|
|
384
475
|
}
|
|
385
|
-
let
|
|
476
|
+
let s = process.argv.some((n) => n.startsWith("--")), l = q.default.isCI || !!e.yes || s, y = s && !e.yes && !q.default.isCI;
|
|
386
477
|
if (e.name) {
|
|
387
|
-
let n =
|
|
478
|
+
let n = J(e.name);
|
|
388
479
|
if (!n.valid) {
|
|
389
480
|
i.cancel(`Invalid project name "${e.name}":
|
|
390
|
-
${n.problems.map((
|
|
481
|
+
${n.problems.map((a) => ` - ${a}`).join(`
|
|
391
482
|
`)}`), process.exitCode = 1;
|
|
392
483
|
return;
|
|
393
484
|
}
|
|
394
485
|
}
|
|
395
|
-
let
|
|
396
|
-
if (
|
|
486
|
+
let d = e.name;
|
|
487
|
+
if (d === void 0)
|
|
397
488
|
if (l)
|
|
398
|
-
|
|
489
|
+
d = r;
|
|
399
490
|
else {
|
|
400
491
|
let n = await i.text({
|
|
401
492
|
message: "Project name",
|
|
402
493
|
placeholder: r,
|
|
403
494
|
defaultValue: r,
|
|
404
|
-
validate: (
|
|
405
|
-
let
|
|
406
|
-
return
|
|
495
|
+
validate: (a) => {
|
|
496
|
+
let b = J(a || r);
|
|
497
|
+
return b.valid ? void 0 : `Invalid project name: ${b.problems[0]}`;
|
|
407
498
|
}
|
|
408
499
|
});
|
|
409
500
|
if (i.isCancel(n)) return i.cancel("Cancelled.");
|
|
410
|
-
|
|
501
|
+
d = n;
|
|
411
502
|
}
|
|
412
|
-
if (e.adapter && !
|
|
413
|
-
i.cancel(`Unknown adapter "${e.adapter}". Available: ${
|
|
503
|
+
if (e.adapter && !N[e.adapter]) {
|
|
504
|
+
i.cancel(`Unknown adapter "${e.adapter}". Available: ${S.join(", ")}`), process.exitCode = 1;
|
|
414
505
|
return;
|
|
415
506
|
}
|
|
416
|
-
let
|
|
417
|
-
if (!
|
|
507
|
+
let c = e.adapter;
|
|
508
|
+
if (!c)
|
|
418
509
|
if (l)
|
|
419
|
-
|
|
510
|
+
c = j.adapter;
|
|
420
511
|
else {
|
|
421
512
|
let n = await i.select({
|
|
422
513
|
message: "Which adapter do you want to use?",
|
|
423
|
-
options: Object.values(
|
|
424
|
-
initialValue:
|
|
514
|
+
options: Object.values(N).map((a) => ({ value: a.id, label: a.label })),
|
|
515
|
+
initialValue: j.adapter
|
|
425
516
|
});
|
|
426
517
|
if (i.isCancel(n)) return i.cancel("Cancelled.");
|
|
427
|
-
|
|
518
|
+
c = n;
|
|
428
519
|
}
|
|
429
|
-
let
|
|
520
|
+
let p;
|
|
430
521
|
if (e.plugins !== void 0) {
|
|
431
|
-
|
|
432
|
-
let n =
|
|
522
|
+
p = e.plugins.split(",").map((a) => a.trim()).filter(Boolean);
|
|
523
|
+
let n = p.filter((a) => !w[a]);
|
|
433
524
|
if (n.length > 0) {
|
|
434
|
-
i.cancel(`Unknown plugin${n.length > 1 ? "s" : ""}: ${n.join(", ")}. Available: ${Object.keys(
|
|
525
|
+
i.cancel(`Unknown plugin${n.length > 1 ? "s" : ""}: ${n.join(", ")}. Available: ${Object.keys(w).join(", ")}`), process.exitCode = 1;
|
|
435
526
|
return;
|
|
436
527
|
}
|
|
437
528
|
} else if (l)
|
|
438
|
-
|
|
529
|
+
p = j.plugins;
|
|
439
530
|
else {
|
|
440
531
|
let n = await i.multiselect({
|
|
441
532
|
message: "Which plugins do you want to install? (space to select, enter to confirm)",
|
|
442
|
-
options: Object.values(
|
|
443
|
-
initialValues:
|
|
533
|
+
options: Object.values(w).map((a) => ({ value: a.id, label: a.packageName, hint: a.description })),
|
|
534
|
+
initialValues: j.plugins,
|
|
444
535
|
required: !1
|
|
445
536
|
});
|
|
446
537
|
if (i.isCancel(n)) return i.cancel("Cancelled.");
|
|
447
|
-
|
|
538
|
+
p = n;
|
|
448
539
|
}
|
|
449
|
-
|
|
450
|
-
let
|
|
540
|
+
p.length === 0 && (p = j.plugins);
|
|
541
|
+
let x = F(p), h;
|
|
451
542
|
if (e.routes !== void 0) {
|
|
452
|
-
let n = e.routes.split(",").map((
|
|
453
|
-
|
|
454
|
-
let
|
|
455
|
-
if (
|
|
456
|
-
i.cancel(`Unknown route template${
|
|
543
|
+
let n = e.routes.split(",").map((b) => b.trim()).filter(Boolean);
|
|
544
|
+
h = n.includes("none") ? [] : n;
|
|
545
|
+
let a = h.filter((b) => !x.some((Te) => Te.id === b));
|
|
546
|
+
if (a.length > 0) {
|
|
547
|
+
i.cancel(`Unknown route template${a.length > 1 ? "s" : ""}: ${a.join(", ")}. Available: ${x.map((b) => b.id).join(", ")}`), process.exitCode = 1;
|
|
457
548
|
return;
|
|
458
549
|
}
|
|
459
550
|
} else if (l)
|
|
460
|
-
|
|
551
|
+
h = x.map((n) => n.id);
|
|
461
552
|
else {
|
|
462
553
|
let n = await i.multiselect({
|
|
463
554
|
message: "Which example routes do you want to scaffold? (space to select, enter to confirm)",
|
|
464
|
-
options:
|
|
465
|
-
initialValues:
|
|
555
|
+
options: x.map((a) => ({ value: a.id, label: a.path, hint: a.summary })),
|
|
556
|
+
initialValues: x.map((a) => a.id),
|
|
466
557
|
required: !1
|
|
467
558
|
});
|
|
468
559
|
if (i.isCancel(n)) return i.cancel("Cancelled.");
|
|
469
|
-
|
|
560
|
+
h = n;
|
|
470
561
|
}
|
|
471
|
-
let
|
|
472
|
-
if (
|
|
562
|
+
let v = e.install;
|
|
563
|
+
if (v === void 0)
|
|
473
564
|
if (l)
|
|
474
|
-
|
|
565
|
+
v = j.install;
|
|
475
566
|
else {
|
|
476
|
-
let n = await i.confirm({ message: "Install dependencies now?", initialValue:
|
|
567
|
+
let n = await i.confirm({ message: "Install dependencies now?", initialValue: j.install });
|
|
477
568
|
if (i.isCancel(n)) return i.cancel("Cancelled.");
|
|
478
|
-
|
|
569
|
+
v = n;
|
|
479
570
|
}
|
|
480
|
-
let
|
|
481
|
-
if (
|
|
571
|
+
let o = e.git;
|
|
572
|
+
if (o === void 0)
|
|
482
573
|
if (l)
|
|
483
|
-
|
|
574
|
+
o = j.git;
|
|
484
575
|
else {
|
|
485
|
-
let n = await i.confirm({ message: "Initialize a git repository?", initialValue:
|
|
576
|
+
let n = await i.confirm({ message: "Initialize a git repository?", initialValue: j.git });
|
|
486
577
|
if (i.isCancel(n)) return i.cancel("Cancelled.");
|
|
487
|
-
|
|
578
|
+
o = n;
|
|
488
579
|
}
|
|
489
|
-
|
|
580
|
+
y && Qe({
|
|
490
581
|
adapter: e.adapter === void 0,
|
|
491
582
|
plugins: e.plugins === void 0,
|
|
492
583
|
routes: e.routes === void 0,
|
|
493
584
|
install: e.install === void 0,
|
|
494
585
|
git: e.git === void 0
|
|
495
|
-
}, { adapterId:
|
|
496
|
-
let
|
|
586
|
+
}, { adapterId: c, pluginIds: p, templateIds: h, install: v, git: o });
|
|
587
|
+
let u = N[c], f = p.map((n) => w[n]), z = i.spinner();
|
|
497
588
|
z.start("Scaffolding project");
|
|
498
|
-
let
|
|
499
|
-
await (0, k.mkdir)(
|
|
589
|
+
let _ = (0, g.join)(t, "src");
|
|
590
|
+
await (0, k.mkdir)(_, { recursive: !0 }), await (0, k.writeFile)((0, g.join)(t, "package.json"), await ue({ name: d, adapter: u, plugins: f })), await W("tsconfig.json", (0, g.join)(t, "tsconfig.json")), await (0, k.writeFile)((0, g.join)(_, "index.ts"), me({ adapter: u, plugins: f, stub: h.length > 0 })), await W("gitignore", (0, g.join)(t, ".gitignore")), f.some((n) => n.id === "fs") && await (0, k.appendFile)((0, g.join)(t, ".gitignore"), `src/routes.gen.ts
|
|
500
591
|
`);
|
|
501
|
-
let
|
|
502
|
-
if (
|
|
503
|
-
let n = (0,
|
|
592
|
+
let H = await ye({ pluginIds: p, templateIds: h });
|
|
593
|
+
if (H.length > 0) {
|
|
594
|
+
let n = (0, g.join)(_, "routes");
|
|
504
595
|
await (0, k.mkdir)(n, { recursive: !0 });
|
|
505
|
-
for (let
|
|
506
|
-
let
|
|
507
|
-
await (0, k.mkdir)((0,
|
|
596
|
+
for (let a of H) {
|
|
597
|
+
let b = (0, g.join)(n, a.fileName);
|
|
598
|
+
await (0, k.mkdir)((0, g.dirname)(b), { recursive: !0 }), await (0, k.writeFile)(b, a.content);
|
|
508
599
|
}
|
|
509
600
|
}
|
|
510
601
|
z.stop("Project scaffolded");
|
|
511
|
-
let
|
|
512
|
-
if (
|
|
513
|
-
let n =
|
|
514
|
-
|
|
602
|
+
let L = te(e.packageManager, t);
|
|
603
|
+
if (v) {
|
|
604
|
+
let n = re(L), a = i.spinner();
|
|
605
|
+
a.start(`Installing dependencies (${n})`);
|
|
515
606
|
try {
|
|
516
|
-
await
|
|
517
|
-
} catch (
|
|
518
|
-
|
|
607
|
+
await Ke(n, { cwd: t }), a.stop("Dependencies installed");
|
|
608
|
+
} catch (b) {
|
|
609
|
+
a.stop("Failed to install dependencies"), i.log.error(b instanceof Error ? b.message : String(b));
|
|
519
610
|
}
|
|
520
611
|
}
|
|
521
|
-
|
|
522
|
-
for (let n of
|
|
612
|
+
o && we(t) && i.log.success("Initialized a git repository.");
|
|
613
|
+
for (let n of f)
|
|
523
614
|
i.log.info(`${n.packageName}: ${n.usageNote}`);
|
|
524
|
-
|
|
615
|
+
Xe({ name: d, targetDir: t, packageManager: L, useYarn: L === "yarn" });
|
|
525
616
|
}
|
|
526
|
-
function
|
|
617
|
+
function Qe(e, t) {
|
|
527
618
|
let r = [];
|
|
528
|
-
e.adapter && r.push(` --adapter <id> ${t.adapterId} (available: ${
|
|
619
|
+
e.adapter && r.push(` --adapter <id> ${t.adapterId} (available: ${S.join(", ")})`), e.plugins && r.push(` --plugins <ids> ${t.pluginIds.length > 0 ? t.pluginIds.join(",") : "none"} (available: ${Object.keys(w).join(", ")})`), e.routes && r.push(` --routes <ids> ${t.templateIds.length > 0 ? t.templateIds.join(",") : "none"} (available: ${R.join(", ")})`), e.install && r.push(` --no-install skip installing dependencies (default: ${t.install ? "installs" : "skips"})`), e.git && r.push(` --no-git skip git init (default: ${t.git ? "inits" : "skips"})`), r.length !== 0 && i.note(r.join(`
|
|
529
620
|
`), "Using defaults for unprovided options");
|
|
530
621
|
}
|
|
531
|
-
function
|
|
532
|
-
let l = `${r} ${
|
|
622
|
+
function Xe({ name: e, targetDir: t, packageManager: r, useYarn: s }) {
|
|
623
|
+
let l = `${r} ${s ? "" : "run "}dev`;
|
|
533
624
|
i.note(`cd ${t}
|
|
534
625
|
${l}`, "Next steps"), i.outro(`Success! Created ${e} at ${t}`);
|
|
535
626
|
}
|
|
536
627
|
// packages/cli/src/commands/list.ts
|
|
537
|
-
var
|
|
538
|
-
function
|
|
539
|
-
console.log(
|
|
628
|
+
var T = $(require("chalk"), 1);
|
|
629
|
+
function Re() {
|
|
630
|
+
console.log(T.default.bold(`
|
|
540
631
|
Available AsterFlow plugins:
|
|
541
632
|
`));
|
|
542
|
-
for (let e of Object.values(
|
|
543
|
-
console.log(` ${
|
|
633
|
+
for (let e of Object.values(w))
|
|
634
|
+
console.log(` ${T.default.cyan(e.id.padEnd(12))} ${T.default.gray(e.packageName)}`), console.log(` ${" ".repeat(12)} ${e.description}
|
|
544
635
|
`);
|
|
545
|
-
console.log(
|
|
636
|
+
console.log(T.default.gray(`Install with: asterflow add <name>[,<name>...]
|
|
546
637
|
`));
|
|
547
638
|
}
|
|
548
639
|
// packages/cli/src/index.ts
|
|
549
640
|
(async () => {
|
|
550
|
-
await (0,
|
|
641
|
+
await (0, Ne.default)((0, Se.hideBin)(process.argv)).scriptName("asterflow").command(
|
|
551
642
|
"init [directory]",
|
|
552
643
|
"Scaffold a new AsterFlow project",
|
|
553
644
|
(e) => e.positional("directory", {
|
|
@@ -558,13 +649,13 @@ Available AsterFlow plugins:
|
|
|
558
649
|
describe: "Project name (defaults to the directory name)"
|
|
559
650
|
}).option("adapter", {
|
|
560
651
|
type: "string",
|
|
561
|
-
describe: `Adapter to use (${
|
|
652
|
+
describe: `Adapter to use (${S.join(", ")})`
|
|
562
653
|
}).option("plugins", {
|
|
563
654
|
type: "string",
|
|
564
655
|
describe: "Comma-separated plugin ids, e.g. fs,multipart"
|
|
565
656
|
}).option("routes", {
|
|
566
657
|
type: "string",
|
|
567
|
-
describe: `Comma-separated route template ids to scaffold, or "none" (${
|
|
658
|
+
describe: `Comma-separated route template ids to scaffold, or "none" (${R.join(", ")})`
|
|
568
659
|
}).option("install", {
|
|
569
660
|
type: "boolean",
|
|
570
661
|
describe: "Install dependencies (default: yes)"
|
|
@@ -580,7 +671,7 @@ Available AsterFlow plugins:
|
|
|
580
671
|
}),
|
|
581
672
|
async (e) => {
|
|
582
673
|
let t = e.useNpm ? "npm" : e.usePnpm ? "pnpm" : e.useYarn ? "yarn" : e.useBun ? "bun" : void 0;
|
|
583
|
-
await
|
|
674
|
+
await Ee({
|
|
584
675
|
directory: e.directory,
|
|
585
676
|
name: e.name,
|
|
586
677
|
adapter: e.adapter,
|
|
@@ -605,14 +696,14 @@ Available AsterFlow plugins:
|
|
|
605
696
|
describe: "Project directory (defaults to the current directory)"
|
|
606
697
|
}),
|
|
607
698
|
async (e) => {
|
|
608
|
-
await
|
|
699
|
+
await ae({ names: e.names, directory: e.directory });
|
|
609
700
|
}
|
|
610
701
|
).command(
|
|
611
702
|
"list",
|
|
612
703
|
"List available plugins",
|
|
613
704
|
() => {
|
|
614
705
|
},
|
|
615
|
-
() =>
|
|
706
|
+
() => Re()
|
|
616
707
|
).command(
|
|
617
708
|
"generate [directory]",
|
|
618
709
|
"Generate the static route manifest consumed by @asterflow/fs (fs-routing)",
|
|
@@ -629,7 +720,7 @@ Available AsterFlow plugins:
|
|
|
629
720
|
describe: "Regenerate whenever a file under the routes directory changes"
|
|
630
721
|
}),
|
|
631
722
|
async (e) => {
|
|
632
|
-
await
|
|
723
|
+
await de({ directory: e.directory, out: e.out, watch: e.watch });
|
|
633
724
|
}
|
|
634
725
|
).demandCommand(1, "Specify a command: init, add, list or generate").strict().help().alias("help", "h").parse();
|
|
635
726
|
})().catch((e) => {
|