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